openapi: 3.2.0 info: title: Opal Stories API license: name: Opal API License url: https://www.workwithopal.com/api-license version: '1.0' description: 'Operations tagged Stories across 2 of this provider''s published API definitions: opal-v2-openapi.yml, opal-v3-openapi.yml. Each path carries the servers of the definition it was published in.' servers: - url: https://login.ouropal.com tags: - name: Stories paths: /budgets/stories/{story_id}: get: tags: - Stories operationId: ReadBudgetV0 summary: Get a budget associated with a Story. security: - oauth2: - offline_access - api_key: - Session-Token description: "NOTE: When the Story exists but has no budget,\n status 200 with an empty body will be returned instead of 404.\n" parameters: - name: story_id in: path description: ID of a story required: true schema: type: integer responses: '200': description: The requested budget. content: application/json: schema: type: object required: - data properties: data: title: budget type: object required: - id - type - attributes - relationships additionalProperties: false properties: id: type: string pattern: ^[0-9]+$ type: type: string enum: - budget attributes: type: object required: - value additionalProperties: false properties: value: type: number description: The value to assign to the budget. post_spend: type: - number - 'null' moment_spend: type: - number - 'null' story_allocation: type: - number - 'null' moment_allocation: type: - number - 'null' content_type: type: - string - 'null' relationships: type: object required: - opal - story additionalProperties: false properties: opal: type: object required: - data additionalProperties: false properties: data: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - opal story: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - story moment: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - moment post: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - content example: data: id: '1' type: budget attributes: id: 1 value: 30000 post_spend: null moment_spend: null story_allocation: null moment_allocation: null content_type: budget relationships: opal: data: id: '1' type: opal story: data: id: '3' type: story moment: data: null post: data: null '404': description: Story not found content: application/json: x-not-json-api: true schema: type: object required: - error properties: error: type: string post: tags: - Stories operationId: CreateBudgetV0 summary: Create a budget for a Story. security: - oauth2: - offline_access - api_key: - Session-Token description: '' parameters: - name: story_id in: path description: ID of a story required: true schema: type: integer requestBody: content: application/json: x-not-json-api: true schema: type: object required: - budget properties: budget: type: object required: - value properties: value: type: number responses: '200': description: The budget has been created content: application/json: schema: type: object required: - data properties: data: title: budget type: object required: - id - type - attributes - relationships additionalProperties: false properties: id: type: string pattern: ^[0-9]+$ type: type: string enum: - budget attributes: type: object required: - value additionalProperties: false properties: value: type: number description: The value to assign to the budget. post_spend: type: - number - 'null' moment_spend: type: - number - 'null' story_allocation: type: - number - 'null' moment_allocation: type: - number - 'null' content_type: type: - string - 'null' relationships: type: object required: - opal - story additionalProperties: false properties: opal: type: object required: - data additionalProperties: false properties: data: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - opal story: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - story moment: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - moment post: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - content example: data: id: '1' type: budget attributes: id: 1 value: 30000 post_spend: null moment_spend: null story_allocation: null moment_allocation: null content_type: budget relationships: opal: data: id: '1' type: opal story: data: id: '3' type: story moment: data: null post: data: null '404': description: Story not found content: application/json: x-not-json-api: true schema: type: object required: - error properties: error: type: string '422': description: The Story already has a budget. content: application/json: x-not-json-api: true schema: type: object required: - error properties: error: type: string servers: - url: https://login.ouropal.com /budgets/stories/{budget_id}: delete: tags: - Stories operationId: DeleteBudgetV0 summary: Delete the budget with the given Id. security: - oauth2: - offline_access - api_key: - Session-Token description: '' parameters: - name: budget_id in: path description: ID of a budget required: true schema: type: integer responses: '204': description: The budget was successfully deleted. servers: - url: https://login.ouropal.com /stories/v2/{story_id}: get: tags: - Stories operationId: ReadStoryV2 summary: Find a Story by ID security: - oauth2: - offline_access - api_key: - Session-Token parameters: - name: story_id in: path required: true description: The ID of the Story schema: type: string responses: '200': description: A Story content: application/json: schema: type: object required: - data properties: data: title: story type: object required: - id - type - attributes additionalProperties: false properties: id: type: string pattern: ^[0-9]+$ type: type: string enum: - story attributes: type: object required: - asset_references_count - color - created_at - description - is_shared - is_visible - legacy_is_private - members_count - moments_count - name - scheduled_end_at - scheduled_start_at - strategies_count - updated_at - uuid additionalProperties: false properties: scheduled_start_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). scheduled_end_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). name: type: string color: type: - string - 'null' description: A hex color value with the '#' prefix. asset_references_count: type: - integer - 'null' created_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true description: type: - string - 'null' is_shared: type: - boolean - 'null' is_visible: type: - boolean - 'null' legacy_is_private: type: - boolean - 'null' members_count: type: - integer - 'null' moments_count: type: - integer - 'null' description: Number of Moments created on this Story strategies_count: type: - integer - 'null' updated_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true uuid: type: - string - 'null' relationships: type: object additionalProperties: false properties: opal: type: object required: - data additionalProperties: false properties: data: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - opal brand: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand user: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - user brands: description: An array of Brand Ids stored on key 'shared_on_brand_ids' type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand primary_label: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label labels: type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label example: data: id: '3' type: story attributes: id: 3 asset_references_count: 10 color: 6f7d8a created_at: '2019-11-13T18:14:56.166-08:00' description: null is_shared: false is_visible: true legacy_is_private: false members_count: 2 moments_count: 2 name: Vernon Brown 3 scheduled_end_at: '2019-12-13T00:00:00.000-08:00' scheduled_start_at: '2019-11-12T00:00:00.000-08:00' strategies_count: 0 updated_at: '2019-11-13T18:40:50.112-08:00' uuid: dc68d20c-3dd9-48f0-a8c5-8dd7b170ba99 relationships: primary_label: data: id: '3' type: label opal: data: id: '1' type: opal brand: data: id: '1' type: brand user: data: id: '7' type: user brands: data: - id: '1' type: brand '404': description: Not found content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string title: type: string detail: type: string required: - status patch: tags: - Stories operationId: UpdateStoryV2 summary: Update the specified story security: - oauth2: - offline_access - api_key: - Session-Token parameters: - name: story_id in: path required: true description: The ID of the Story schema: type: string requestBody: content: application/json: x-not-json-api: true schema: type: object required: - data properties: data: type: object required: - id - type properties: id: type: string type: type: string enum: - story attributes: type: object properties: description: type: - string - 'null' description: A description of the Story. name: type: string description: The name of the Story. scheduled_start_at: type: string format: date-time description: 'An ISO8601 date-time. The date and time when the Story begins. ' scheduled_end_at: type: string format: date-time description: 'An ISO8601 date-time. The date and time when the Story ends. ' relationships: type: object properties: brand: type: object required: - data additionalProperties: false properties: data: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand labels: type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label responses: '200': description: The story has been updated content: application/json: schema: type: object required: - data properties: data: title: story type: object required: - id - type - attributes additionalProperties: false properties: id: type: string pattern: ^[0-9]+$ type: type: string enum: - story attributes: type: object required: - asset_references_count - color - created_at - description - is_shared - is_visible - legacy_is_private - members_count - moments_count - name - scheduled_end_at - scheduled_start_at - strategies_count - updated_at - uuid additionalProperties: false properties: scheduled_start_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). scheduled_end_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). name: type: string color: type: - string - 'null' description: A hex color value with the '#' prefix. asset_references_count: type: - integer - 'null' created_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true description: type: - string - 'null' is_shared: type: - boolean - 'null' is_visible: type: - boolean - 'null' legacy_is_private: type: - boolean - 'null' members_count: type: - integer - 'null' moments_count: type: - integer - 'null' description: Number of Moments created on this Story strategies_count: type: - integer - 'null' updated_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true uuid: type: - string - 'null' relationships: type: object additionalProperties: false properties: opal: type: object required: - data additionalProperties: false properties: data: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - opal brand: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand user: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - user brands: description: An array of Brand Ids stored on key 'shared_on_brand_ids' type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand primary_label: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label labels: type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label '400': description: Bad request content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string title: type: string detail: type: string required: - status '403': description: Forbidden content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string title: type: string detail: type: string required: - status '404': description: Not found content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string title: type: string detail: type: string required: - status servers: - url: https://login.ouropal.com /stories/v2: get: tags: - Stories operationId: ReadStoriesV2 summary: Get a collection of stories security: - oauth2: - offline_access - api_key: - Session-Token parameters: - name: filter in: query description: 'Filters for limiting the results. All timestamp filters (`created_at`, `updated_at`, `scheduled_start_at`, and `scheduled_end_at`) use the syntax `filter[field_name][gt]=2020-01-01T00:00:00-07:00`. Timestamps use iso8601 formatting, such as `YYYY-MM-DD` or `YYYY-MM-DDThh:mmTZD`. Timestamps of the form `YYYY-MM-DD` will be converted to `YYY-MM-DDT00:00:00` in the `America/Los_Angeles` timezone. For example, `filter[created_at]=2020-01-01` is equivalent to `filter[created_at][gteq]=2020-01-01`. `eq` will convert a date to a 24 hour range. Thus `filter[created_at][eq]=2020-01-01` is equivalent to `filter[created_at][gteq]=2020-01-01T00:00:00-08:00&filter[created_at][lteq]=2020-01-02T00:00:00-08:00`. ' required: false schema: type: object properties: brand_id: type: array description: 'The IDs of the workspaces to which results should be filtered. "Workspace ID" and "Brand ID" are synonymous. Comma separated list of IDs. If included, will only fetch resources associated with these brands. If not included, will return resources associated with all brands that the user belongs to. For example, `filter[brand_id]=1` will fetch all resources associated with brand 1, while `filter[brand_id]=1,2,3` will fetch any resources associated with brands 1, 2, or 3. ' items: type: integer created_at: allOf: - type: object properties: eq: type: string description: 'Equal to filter. If no other filter is specified, `eq` will be assumed. ' gt: type: string description: Greater than filter gteq: type: string description: Greater than or equal to filter lt: type: string description: Less than filter lteq: type: string description: Less than or equal to filter - format: date-time - description: 'Filter content by created_at time. Uses syntax `filter[created_at][gt]=2020-01-01T00:00:00-07:00` ' label_id: type: array description: 'Comma separated list of label IDs. If included, will only fetch stories associated with these labels. For example, `filter[label_id]=1` will fetch all stories associated with label 1, while `filter[label_id]=1,2,3` will fetch any story associated with labels 1, 2, or 3. ' items: type: integer label_ids: type: array deprecated: true description: Deprecated in favor of `filter[label_id]` items: type: integer scheduled_at: allOf: - type: object properties: eq: type: string description: 'Equal to filter. If no other filter is specified, `eq` will be assumed. ' gt: type: string description: Greater than filter gteq: type: string description: Greater than or equal to filter lt: type: string description: Less than filter lteq: type: string description: Less than or equal to filter - format: date-time - description: 'Filter content by the scheduled_start_at and scheduled_end_at time. Uses syntax `filter[scheduled_at][gt]=2020-01-01T00:00:00-07:00`. When gt or gteq is provided, will filter by scheduled_start_at. When lt or lteq is provided, will filter by scheduled_end_at. Does not support equality comparisons. ' scheduled_end_at: allOf: - type: object properties: eq: type: string description: 'Equal to filter. If no other filter is specified, `eq` will be assumed. ' gt: type: string description: Greater than filter gteq: type: string description: Greater than or equal to filter lt: type: string description: Less than filter lteq: type: string description: Less than or equal to filter - format: date-time - description: 'Filter by the story scheduled_end_at time. Uses syntax `filter[scheduled_end_at][gt]=2020-01-01T00:00:00-07:00`. If no operator is provided, will default to legacy behavior and will filter by lteq. ' scheduled_start_at: allOf: - type: object properties: eq: type: string description: 'Equal to filter. If no other filter is specified, `eq` will be assumed. ' gt: type: string description: Greater than filter gteq: type: string description: Greater than or equal to filter lt: type: string description: Less than filter lteq: type: string description: Less than or equal to filter - format: date-time - description: 'Filter by the story scheduled_start_at time. Uses syntax `filter[scheduled_start_at][gt]=2020-01-01T00:00:00-07:00`. If no operator is provided, will default to legacy behavior and will filter by gteq. ' updated_at: allOf: - type: object properties: eq: type: string description: 'Equal to filter. If no other filter is specified, `eq` will be assumed. ' gt: type: string description: Greater than filter gteq: type: string description: Greater than or equal to filter lt: type: string description: Less than filter lteq: type: string description: Less than or equal to filter - format: date-time - description: 'Filter by the story updated_at time. Uses syntax `filter[updated_at][gt]=2020-01-01T00:00:00-07:00`. ' style: deepObject explode: true - name: fields in: query description: An object keyed by resource type, i.e. \"story\" or a story relationship, where each value is a CSV of attributes to include in the response. required: false schema: type: object properties: story: type: string style: deepObject explode: true - name: sort in: query description: 'A comma separated value specifying how a collection in the response body should be sorted, where each value is an attribute of the story. When specifying multiple values, each value in the sequence determines the ordering precedence. Each story in the collection will appear in ascending order, unless any of the enumerated values are prefixed with a minus "-" sign, in which case each story will appear in descending order for the specified values. If no sort parameter is provided, stories will be default sorted by created_at, ascending. ' required: false schema: type: string enum: - created_at - -created_at - scheduled_at - -scheduled_at - updated_at - -updated_at - name: page description: Specify an offset and limit for pagination in: query required: false schema: type: object properties: limit: type: integer default: 50 offset: type: integer style: deepObject explode: true responses: '200': description: A collection of stories. content: application/json: schema: type: object required: - data properties: data: type: array items: title: story type: object required: - id - type - attributes additionalProperties: false properties: id: type: string pattern: ^[0-9]+$ type: type: string enum: - story attributes: type: object required: - asset_references_count - color - created_at - description - is_shared - is_visible - legacy_is_private - members_count - moments_count - name - scheduled_end_at - scheduled_start_at - strategies_count - updated_at - uuid additionalProperties: false properties: scheduled_start_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). scheduled_end_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). name: type: string color: type: - string - 'null' description: A hex color value with the '#' prefix. asset_references_count: type: - integer - 'null' created_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true description: type: - string - 'null' is_shared: type: - boolean - 'null' is_visible: type: - boolean - 'null' legacy_is_private: type: - boolean - 'null' members_count: type: - integer - 'null' moments_count: type: - integer - 'null' description: Number of Moments created on this Story strategies_count: type: - integer - 'null' updated_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true uuid: type: - string - 'null' relationships: type: object additionalProperties: false properties: opal: type: object required: - data additionalProperties: false properties: data: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - opal brand: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand user: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - user brands: description: An array of Brand Ids stored on key 'shared_on_brand_ids' type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand primary_label: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label labels: type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label example: data: - id: '3' type: story attributes: id: 3 asset_references_count: 10 color: 6f7d8a created_at: '2019-11-13T18:14:56.166-08:00' description: null is_shared: false is_visible: true legacy_is_private: false members_count: 2 moments_count: 2 name: Vernon Brown 3 scheduled_end_at: '2019-12-13T00:00:00.000-08:00' scheduled_start_at: '2019-11-12T00:00:00.000-08:00' strategies_count: 0 updated_at: '2019-11-13T18:40:50.112-08:00' uuid: dc68d20c-3dd9-48f0-a8c5-8dd7b170ba99 relationships: primary_label: data: id: '3' type: label opal: data: id: '1' type: opal brand: data: id: '1' type: brand user: data: id: '7' type: user brands: data: - id: '1' type: brand meta: total: 1 resource_type: story post: tags: - Stories operationId: CreateStoryV2 summary: Create a story security: - oauth2: - offline_access - api_key: - Session-Token description: Create a new Story requestBody: content: application/json: x-not-json-api: true schema: type: object required: - data properties: data: type: object required: - type - attributes - relationships properties: type: type: string enum: - story attributes: type: object required: - name - scheduled_start_at - scheduled_end_at properties: description: type: - string - 'null' description: A description of the Story. is_public: type: boolean description: 'Optional. If true, the story will be accessible to everyone in the workspace. If false, restricted to the story creator. When omitted, uses the workspace default setting. ' name: type: string description: The name of the Story. scheduled_start_at: type: string format: date-time description: 'An ISO8601 date-time. The date and time when the Story begins. ' scheduled_end_at: type: string format: date-time description: 'An ISO8601 date-time. The date and time when the Story ends. ' relationships: type: object required: - brand properties: brand: type: object required: - data additionalProperties: false properties: data: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand labels: type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label example: data: type: story attributes: description: The targeted marketing campaign for women's flip flops for Spring 2020 name: Spring campaign scheduled_start_at: '2020-03-01T08:00:00.000Z' scheduled_end_at: '2020-06-01T08:00:00.000Z' relationships: brand: data: id: '1' type: brand responses: '201': description: The story has been created content: application/json: schema: type: object required: - data properties: data: title: story type: object required: - id - type - attributes additionalProperties: false properties: id: type: string pattern: ^[0-9]+$ type: type: string enum: - story attributes: type: object required: - asset_references_count - color - created_at - description - is_shared - is_visible - legacy_is_private - members_count - moments_count - name - scheduled_end_at - scheduled_start_at - strategies_count - updated_at - uuid additionalProperties: false properties: scheduled_start_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). scheduled_end_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). name: type: string color: type: - string - 'null' description: A hex color value with the '#' prefix. asset_references_count: type: - integer - 'null' created_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true description: type: - string - 'null' is_shared: type: - boolean - 'null' is_visible: type: - boolean - 'null' legacy_is_private: type: - boolean - 'null' members_count: type: - integer - 'null' moments_count: type: - integer - 'null' description: Number of Moments created on this Story strategies_count: type: - integer - 'null' updated_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true uuid: type: - string - 'null' relationships: type: object additionalProperties: false properties: opal: type: object required: - data additionalProperties: false properties: data: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - opal brand: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand user: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - user brands: description: An array of Brand Ids stored on key 'shared_on_brand_ids' type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - brand primary_label: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label labels: type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label example: data: type: story id: '1' attributes: id: 1 asset_references_count: 0 created_at: '2020-05-18T19:31:07.113Z' color: null description: 'The targeted marketing campaign for women''s flip flops for Spring 2020 ' is_shared: false is_visible: true legacy_is_private: false members_count: 0 moments_count: 0 name: Spring campaign scheduled_start_at: '2020-03-01T08:00:00.000Z' scheduled_end_at: '2020-06-01T08:00:00.000Z' strategies_count: 0 updated_at: '2020-05-18T19:31:07.113Z' uuid: 03633636-6eca-4c7b-977a-b480522dafd6 relationships: opal: data: id: '1' type: opal brand: data: id: '1' type: brand user: data: id: '1' type: user brands: data: - id: '1' type: brand '400': description: Bad request content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string title: type: string detail: type: string required: - status '403': description: Forbidden content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string title: type: string detail: type: string required: - status '404': description: Not found content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string title: type: string detail: type: string required: - status servers: - url: https://login.ouropal.com /stories/v3/{story_id}: get: tags: - Stories operationId: GetStoryV3 summary: Get a story by ID description: 'Retrieves a single story by its UUID. ' security: - oauth2: - offline_access - api_key: [] parameters: - name: story_id in: path required: true description: The UUID of the story. schema: type: string format: uuid - name: expose in: query required: false description: 'Optionally include access metadata in the response. Request with the `expose` query parameter like: `expose[meta][access]`. ' style: deepObject explode: true schema: type: object properties: meta: allOf: - type: object properties: access: type: - string - 'null' description: 'Information about who has access to the given resource. This metadata is only available for single (non-batch) `GET` / `PATCH` / `POST` requests, and is not returned by default. Add `expose[meta][access]` to your query parameters to request it in the response body. ' - description: 'Information about who has access to the given story. This metadata is only available for single (non-batch) `GET` / `PATCH` requests, and is not returned by default. Add `expose[meta][access]` to your query parameters to request it in the response body. ' responses: '200': description: Story retrieved successfully content: application/json: schema: type: object required: - data properties: data: title: story type: object required: - id - type - attributes additionalProperties: false properties: id: type: string format: uuid type: type: string enum: - story meta: type: - object - 'null' description: 'Calculated story metadata included unconditionally in responses. ' additionalProperties: false properties: effective_privacy: type: string enum: - whole_workspace - some_but_not_all description: 'The effective privacy of a resource is calculated based on all direct and inherited access. If a resource or any of its parents that it inherits access from are accessible to the entire workspace, the effective privacy is `whole_workspace`. Otherwise, the effective privacy is `some_but_not_all`. ' attributes: type: object required: - color - created_at - description - is_shared - legacy_id - name - scheduled_end_at - scheduled_start_at - updated_at additionalProperties: false properties: color: type: - string - 'null' description: A hex color value with the '#' prefix. created_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true description: type: - string - 'null' is_shared: type: - boolean - 'null' legacy_id: type: string description: A legacy ID that can be used with `v2` API endpoints. name: type: string scheduled_start_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time scheduled_end_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time updated_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true relationships: type: object additionalProperties: false properties: workspace: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string format: uuid type: type: string enum: - workspace shared_workspaces: description: Additional workspaces that the story has been shared to. type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string format: uuid type: type: string enum: - workspace links: type: object additionalProperties: false properties: v2_request: type: string description: A link to the equivalent v2 API request for this story. meta: type: object additionalProperties: false properties: access: type: object description: 'Information about who has access to the given resource. This metadata is only available for single (non-batch) `GET` / `PATCH` / `POST` requests, and is not returned by default. Add `expose[meta][access]` to your query parameters to request it in the response body. ' additionalProperties: false required: - users - groups - resources properties: users: type: array description: 'A list of users that have access to this resource. These users have been given direct access; the list does not include all users who have access via a User Group or inherited resource. Each item in the list is a JSON:API Resource Identifier Object. All entries are `user`s. ' items: type: object additionalProperties: false required: - id - type properties: id: type: string format: uuid type: type: string enum: - user groups: type: array description: 'A list of groups that have access to this resource. These are all User Groups that have been created by an admin of the Opal ahead of time. Each item in the list is a JSON:API Resource Identifier Object. All entries are `user_group`s. Each user group''s name is surfaced as `meta.title` for convenience and each user group''s membership count (including all inherited membership) is surfaced as `meta.count`. ' items: type: object additionalProperties: false required: - id - type - meta properties: id: type: string format: uuid type: type: string enum: - user_group meta: type: object readOnly: true additionalProperties: false required: - title - count properties: title: type: string readOnly: true count: type: integer minimum: 0 readOnly: true resources: type: array description: 'A list of resources from which this resource _might_ inherit membership. The list always contains an entry for every other resource allowed to provide membership to the given resource. Look at the `meta.inherits_membership` property to determine if a given resource''s membership actually is being inherited. Each item in the list is a JSON:API Resource Identifier Object. Entries may have varying `types` but all resources can be retrieved separately from Opal API endpoints to get more information about them. Each resource''s name or title is surfaced as `meta.title` for convenience and each resource''s membership count (including all inherited membership) is surfaced as `meta.count`. ' items: type: object additionalProperties: false required: - id - type - meta properties: id: type: string format: uuid type: type: string meta: type: object additionalProperties: false required: - inherits_membership - title - count properties: inherits_membership: type: boolean title: type: string readOnly: true count: type: integer minimum: 0 readOnly: true '401': description: Unauthorized content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '403': description: Forbidden content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '404': description: Not found content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status patch: tags: - Stories operationId: UpdateStoryV3 summary: Update the specified Story security: - oauth2: - offline_access - api_key: [] parameters: - name: story_id in: path required: true description: The UUID of the story. schema: type: string format: uuid - name: expose in: query required: false description: 'Optionally include access metadata in the response. Request with the `expose` query parameter like: `expose[meta][access]`. ' style: deepObject explode: true schema: type: object properties: meta: allOf: - type: object properties: access: type: - string - 'null' description: 'Information about who has access to the given resource. This metadata is only available for single (non-batch) `GET` / `PATCH` / `POST` requests, and is not returned by default. Add `expose[meta][access]` to your query parameters to request it in the response body. ' - description: 'Information about who has access to the given story. This metadata is only available for single (non-batch) `GET` / `PATCH` requests, and is not returned by default. Add `expose[meta][access]` to your query parameters to request it in the response body. ' requestBody: content: application/json: schema: type: object required: - data properties: data: type: object required: - id - type properties: id: type: string type: type: string enum: - story attributes: type: object properties: name: type: string description: The name of the story. description: type: - string - 'null' description: A description of the story. scheduled_start_at: type: - string - 'null' format: date-time description: The scheduled start date for the story. scheduled_end_at: type: - string - 'null' format: date-time description: The scheduled end date for the story. relationships: type: object properties: workspace: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string format: uuid type: type: string enum: - workspace labels: type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string type: type: string enum: - label members: type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string format: uuid type: type: string enum: - user meta: type: object properties: access: type: object description: 'Information about who has access to the given resource. This metadata is only available for single (non-batch) `GET` / `PATCH` / `POST` requests, and is not returned by default. Add `expose[meta][access]` to your query parameters to request it in the response body. ' additionalProperties: false properties: users: type: array description: 'A list of users that have access to this resource. These users have been given direct access; the list does not include all users who have access via a User Group or inherited resource. Each item in the list is a JSON:API Resource Identifier Object. All entries are `user`s. ' items: type: object additionalProperties: false required: - id - type properties: id: type: string format: uuid type: type: string enum: - user groups: type: array description: 'A list of groups that have access to this resource. These are all User Groups that have been created by an admin of the Opal ahead of time. Each item in the list is a JSON:API Resource Identifier Object. All entries are `user_group`s. ' items: type: object additionalProperties: false required: - id - type properties: id: type: string format: uuid type: type: string enum: - user_group resources: type: array description: 'A list of resources from which this resource _might_ inherit membership. The list always contains an entry for every other resource allowed to provide membership to the given resource. Set the `meta.inherits_membership` property to determine if a given resource''s membership actually is being inherited. Each item in the list is a JSON:API Resource Identifier Object. Entries may have varying `types`. ' items: type: object additionalProperties: false required: - id - type - meta properties: id: type: string format: uuid type: type: string meta: type: object additionalProperties: false required: - inherits_membership properties: inherits_membership: type: boolean responses: '200': description: Story updated content: application/json: schema: type: object required: - data properties: data: title: story type: object required: - id - type - attributes additionalProperties: false properties: id: type: string format: uuid type: type: string enum: - story meta: type: - object - 'null' description: 'Calculated story metadata included unconditionally in responses. ' additionalProperties: false properties: effective_privacy: type: string enum: - whole_workspace - some_but_not_all description: 'The effective privacy of a resource is calculated based on all direct and inherited access. If a resource or any of its parents that it inherits access from are accessible to the entire workspace, the effective privacy is `whole_workspace`. Otherwise, the effective privacy is `some_but_not_all`. ' attributes: type: object required: - color - created_at - description - is_shared - legacy_id - name - scheduled_end_at - scheduled_start_at - updated_at additionalProperties: false properties: color: type: - string - 'null' description: A hex color value with the '#' prefix. created_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true description: type: - string - 'null' is_shared: type: - boolean - 'null' legacy_id: type: string description: A legacy ID that can be used with `v2` API endpoints. name: type: string scheduled_start_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time scheduled_end_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time updated_at: type: string description: An ISO8601 date-time. Formatted as an 'Internet Date/Time' (RFC 3339). format: date-time readOnly: true relationships: type: object additionalProperties: false properties: workspace: type: object required: - data additionalProperties: false properties: data: type: - object - 'null' required: - id - type additionalProperties: false properties: id: type: string format: uuid type: type: string enum: - workspace shared_workspaces: description: Additional workspaces that the story has been shared to. type: object required: - data additionalProperties: false properties: data: type: array items: type: object required: - id - type additionalProperties: false properties: id: type: string format: uuid type: type: string enum: - workspace links: type: object additionalProperties: false properties: v2_request: type: string description: A link to the equivalent v2 API request for this story. meta: type: object additionalProperties: false properties: access: type: object description: 'Information about who has access to the given resource. This metadata is only available for single (non-batch) `GET` / `PATCH` / `POST` requests, and is not returned by default. Add `expose[meta][access]` to your query parameters to request it in the response body. ' additionalProperties: false required: - users - groups - resources properties: users: type: array description: 'A list of users that have access to this resource. These users have been given direct access; the list does not include all users who have access via a User Group or inherited resource. Each item in the list is a JSON:API Resource Identifier Object. All entries are `user`s. ' items: type: object additionalProperties: false required: - id - type properties: id: type: string format: uuid type: type: string enum: - user groups: type: array description: 'A list of groups that have access to this resource. These are all User Groups that have been created by an admin of the Opal ahead of time. Each item in the list is a JSON:API Resource Identifier Object. All entries are `user_group`s. Each user group''s name is surfaced as `meta.title` for convenience and each user group''s membership count (including all inherited membership) is surfaced as `meta.count`. ' items: type: object additionalProperties: false required: - id - type - meta properties: id: type: string format: uuid type: type: string enum: - user_group meta: type: object readOnly: true additionalProperties: false required: - title - count properties: title: type: string readOnly: true count: type: integer minimum: 0 readOnly: true resources: type: array description: 'A list of resources from which this resource _might_ inherit membership. The list always contains an entry for every other resource allowed to provide membership to the given resource. Look at the `meta.inherits_membership` property to determine if a given resource''s membership actually is being inherited. Each item in the list is a JSON:API Resource Identifier Object. Entries may have varying `types` but all resources can be retrieved separately from Opal API endpoints to get more information about them. Each resource''s name or title is surfaced as `meta.title` for convenience and each resource''s membership count (including all inherited membership) is surfaced as `meta.count`. ' items: type: object additionalProperties: false required: - id - type - meta properties: id: type: string format: uuid type: type: string meta: type: object additionalProperties: false required: - inherits_membership - title - count properties: inherits_membership: type: boolean title: type: string readOnly: true count: type: integer minimum: 0 readOnly: true '401': description: Unauthorized content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '403': description: Forbidden content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '404': description: Not found content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '422': description: Unprocessable entity content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status servers: - url: https://login.ouropal.com /stories/v3/{story_id}/migrate_moments: post: tags: - Stories operationId: MigrateStoryMomentsV3 summary: Migrate moments from a story to plans and/or boards description: 'Migrates moments from the specified story to one or more destinations (plans and/or boards). This operation is performed asynchronously in the background. The user will receive an in-app notification when the migration is complete. At least one destination (plan_id or board_id) must be specified. ' security: - oauth2: - offline_access - api_key: [] parameters: - name: story_id in: path required: true description: The UUID of the story. schema: type: string format: uuid requestBody: content: application/json: schema: type: object required: - migration properties: migration: type: object description: Migration configuration parameters properties: plan_id: type: - string - 'null' description: UUID of the plan to migrate moments to. At least one of plan_id or board_id must be specified. example: 550e8400-e29b-41d4-a716-446655440000 board_id: type: - string - 'null' description: UUID of the board to migrate moments to. At least one of plan_id or board_id must be specified. example: 550e8400-e29b-41d4-a716-446655440001 plan_grouping_label_set_id: type: - string - 'null' description: UUID of the label set to use for grouping moments when migrating to a plan with labelset grouping type. example: 550e8400-e29b-41d4-a716-446655440002 board_grouping_label_set_id: type: - string - 'null' description: UUID of the label set to use for grouping moments when migrating to a board with labelset grouping type. example: 550e8400-e29b-41d4-a716-446655440002 date_filter_type: type: string default: all enum: - all - range description: 'Type of date filtering to apply: - all: Migrate all moments from the story - range: Migrate only moments within the specified date range ' start_date: type: - string - 'null' format: date description: 'Start date for filtering moments (required when date_filter_type is ''range''). Format: YYYY-MM-DD' example: '2024-01-01' end_date: type: - string - 'null' format: date description: 'End date for filtering moments (required when date_filter_type is ''range''). Format: YYYY-MM-DD' example: '2024-12-31' plan_grouping_type: type: - string - 'null' enum: - story - existing - labelset description: 'How to group moments when migrating to a plan: - story: Group all moments under the story name - existing: Group moments into an existing swimlane - labelset: Group moments by labels from the specified label set ' board_grouping_type: type: - string - 'null' enum: - story - existing - labelset description: 'How to group moments when migrating to a board: - story: Group all moments under the story name - existing: Group moments into an existing collection - labelset: Group moments by labels from the specified label set ' existing_swimlane_id: type: - string - 'null' description: UUID of the existing swimlane to group moments into (required when plan_grouping_type is 'existing'). example: 550e8400-e29b-41d4-a716-446655440003 existing_collection_id: type: - string - 'null' description: UUID of the existing collection to group moments into (required when board_grouping_type is 'existing'). example: 550e8400-e29b-41d4-a716-446655440004 responses: '202': description: Migration job has been queued successfully content: application/json: schema: type: object properties: message: type: string description: Confirmation message that the migration job has been queued example: Migration job has been queued story_id: type: string format: uuid description: The UUID of the story whose moments are being migrated example: 550e8400-e29b-41d4-a716-446655440005 options: type: object description: The migration options that were submitted properties: plan_id: type: - string - 'null' description: UUID of the plan to migrate moments to example: 550e8400-e29b-41d4-a716-446655440000 board_id: type: - string - 'null' description: UUID of the board to migrate moments to example: 550e8400-e29b-41d4-a716-446655440001 plan_grouping_label_set_id: type: - string - 'null' description: UUID of the label set used for plan grouping example: 550e8400-e29b-41d4-a716-446655440002 board_grouping_label_set_id: type: - string - 'null' description: UUID of the label set used for board grouping example: 550e8400-e29b-41d4-a716-446655440002 date_filter_type: type: string enum: - all - range description: Type of date filtering applied example: all start_date: type: - string - 'null' format: date description: Start date for filtering moments example: '2024-01-01' end_date: type: - string - 'null' format: date description: End date for filtering moments example: '2024-12-31' plan_grouping_type: type: - string - 'null' enum: - story - existing - labelset description: How moments are grouped when migrating to a plan example: story board_grouping_type: type: - string - 'null' enum: - story - existing - labelset description: How moments are grouped when migrating to a board example: story existing_swimlane_id: type: - string - 'null' description: UUID of the existing swimlane used for grouping example: 550e8400-e29b-41d4-a716-446655440003 existing_collection_id: type: - string - 'null' description: UUID of the existing collection used for grouping example: 550e8400-e29b-41d4-a716-446655440004 '400': description: Bad request content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '401': description: Unauthorized content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '403': description: Forbidden content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '404': description: Not found content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status '422': description: Unprocessable entity content: application/json: schema: type: object required: - errors properties: errors: type: array items: type: object properties: status: type: string description: The http status code of the error response. title: type: string description: A short, human-readable summary of the error. detail: type: string description: A human-readable explanation of the error. code: type: string description: 'An system-readable error code to provide additional specificity for the error. ' required: - status servers: - url: https://login.ouropal.com components: securitySchemes: oauth2: type: oauth2 description: This API uses OAuth 2.0 with the authorization code grant flow. You can find more detailed authentication instructions in the [Authentication Strategies](/api/documentation#section/Authentication-Strategies/OAuth-2.0) section. flows: authorizationCode: authorizationUrl: /oauth2/auth tokenUrl: /oauth2/token scopes: offline_access: Include this scope if you wish to receive a refresh token api_key: type: apiKey description: (Deprecated) This API also supports authentication via an API or session token set in the request headers. in: header name: Session-Token anonymous_oauth: type: oauth2 description: 'The OAuth 2.0 client credentials flow is used for secure server-server requests when Opal does not need to associate a request with a particular Opal user. These anonymous requests are instead authorized based on the OAuth scope. ' flows: clientCredentials: tokenUrl: /oauth/token scopes: write:onboarding: Include this scope if you wish to make API requests to onboard new Opals. presentation_share_cookie: type: apiKey description: 'A cookie set and read by the Monolith service that authorizes a non-opal user to view a presentation and the resources within it. Other services can rely on this cookie by asking Monolith to authenticate it. ' in: cookie name: share_token x-refined-from: - opal-v2-openapi.yml - opal-v3-openapi.yml x-tagGroups: - name: ⚠️ Unstable tags: - Plans - Blocks - Custom Fields - name: ℹ️ Proposed tags: - Moments - Smart Blocks - In Market - name: 🔮 Experimental tags: - Experimental