Ankorstore Catalog Integrations API

## 👋 Getting Started The catalogue integration process relies on the concept of operations. An operation is a batch of records representing the products to create, update or delete. The completion state of an operation depends on the execution result for every record it contains. It means an operation might fail without necessarily stopping or marking the whole operation as failed (this particular state is defined as “Partially failed”). - Operations can be of type `import`, `update` or `delete`. - Only one open operation (not yet started) is allowed at a time. - Only one operation can be performed (`started`) at a time. - Any subsequent operation will be queued with status `pending` until previous one has finished processing. - If no previous operation is being processed, operation will start processing right away. ### Operation Statuses The `status` attribute represents the current state of the operation, below is a table that describes each state: | Status | Description | |--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `created` | The operation was created and not yet started. At this stage, the operation is considered open and products can still be added to the batch. | | `skipped` | The operation is empty and was skipped (No action required). When an operation is skipped, an empty report is generated and the callback URL is called to notify operation is completed. | | `started` | The operation started and is processing. | | `pending` | Operation is waiting for its turn on the processing queue. The operation could not be started because another one was being processed. | | `succeeded` | All products were successfully processed. | | `failed` | All products failed to be processed. | | `partially_failed` | Not all products were successfully processed. | ## 💡 Operation workflow The complete workflow for an operation occurs in 3 stages: operation creation, operation processing and reporting. The following diagram illustrates these stages and how they are chained. %%{init: {"flowchart": {"curve":"basis", "htmlLabels":false, "diagramPadding":24 } } }%% graph LR created("Operation Created") start("Start Processing") started("Processing\nStarted") succeeded(Succeeded):::success skipped("Processing Skipped"):::success pending("Operation pending") failed(Failed):::failure partial(Partially Failed):::warning report("Report\nGenerated") notified(Callback Sent) subgraph creating[Creating Operation] created -- Add Products --> created end created -- Start Operation --> Start{?} Start -->|"Another Operation execution in progress"| pending Start --->|"No other Operation in progress"| start --> E{?} E -->|"Batch.size > 0"| processing E --->|"Batch is empty"| skipped subgraph processing[Processing Operation] direction LR started --> succeeded started --> partial started --> failed end succeeded --> operationCompletedActions partial --> operationCompletedActions failed --> operationCompletedActions subgraph reporting[Reporting] report -- Notify --> notified end subgraph triggerNext[Trigger next pending Operation] end subgraph operationCompletedActions[Post-Complete Operation Actions] reporting triggerNext end pending -- Wait for previous Operation to finish execution --> start skipped -- Generate empty report --> operationCompletedActions classDef default stroke:#4b475f,stroke-width:1px,fill:#ffffff,color:#4b475f classDef success stroke:#1aae9f,stroke-width:1px,fill:#cfeeeb,color:#293845 classDef failure stroke:#d3455b,stroke-width:1px,fill:#f6d8dd,color:#293845 classDef warning stroke:#f7c325,stroke-width:1px,fill:#fdf2d1,color:#293845 linkStyle default stroke:#788896,stroke-width:1px,fill:transparent ### Creating an Operation The full flow of creating a complete operation consists in two steps: #### 1. Create a new operation Send a `POST` request to `/api/v1/catalog/integrations/operations` Example request: ```json { "data": { "type": "catalog-integration-operation", "attributes": { "source": "shopify", "callbackUrl": "https://callback.url/called/after/processing", "operationType": "import" } } } ``` - At this point the new operation has been created and waiting to receive products data - Operation ID will be returned in the response payload #### 2. Add product data to operation Send a `POST` request to `/api/v1/catalog/integrations/operations/{operationId}/products` Products can be added only to operations with status `created`. If operation has been started already (having any of `started`, `pending`, `skipped`, `succeeded`, `partially_failed`, `failed`, `cancelled` status), the request will fail with a `403 Forbidden` status code. Example request: ```json { "products": [ { "id": "B006GWO5WK", "type": "catalog-integration-product", "attributes": { "external_id": "B006GWO5WK", "name": "Example product" // ... } } ] } ``` You can perform as many requests as needed to append product data during this stage. ### Operation Processing In order to start processing the operation, you have to send a `PATCH` request to `/api/v1/catalog/integrations/operations/{operationId}` with the expected operation status (i.e. “started”). If there is any other operation being executed at that time, the operation will be enqueued to be processed with the status `pending` and will be started as soon as it gets a free slot in the queue. Otherwise, the operation will be started right away. Example request: ```json { "data": { "id": "90567710-de47-49e4-8536-aab80c1a469c", "type": "catalog-integration-operation", "attributes": { "status": "started" } } } ``` ### Execution Report When an operation completes, an execution report is generated. It provides the execution results (success or failure) for every product of the operation. You can access this report by reading from the following endpoint. ```http GET /api/v1/catalog/integrations/operations/{operationId}/results ``` ## 💡 Event Callbacks Callbacks enable you to get notified when events occur in the operation process. For example, you can configure a callback to notify you when the operation is completed. The notification is sent via an HTTP request to the URL you specify in the operation settings. Callbacks can be used to trigger automated actions in your integration. ### Supported events You can find here below the complete list of all the topics `{{resource}}.{{event}}` you can monitor: | Topic | Trigger | |-------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| | `catalog-integration-operation.completed` | An operation reaches a completed state such as **Success**, **Failed**, or **Partially Failed** | | `catalog-integration-operation.cancelled` | An operation was cancelled. This event is triggered when an operation processing is **Skipped** (i.e. the operation batch is empty and no action is required). | ### Event schema A callback event is represented as a JSON object and has the following properties: - `event` — the name of the event that occurred (e.g. “completed”) - `topic` — the event category represented as a unique identifier of the event type. The topic is defined as a concatenation of the resource and event names `{$.data.type}.{$.event}`, e.g. “catalog-integration-operation.completed”. You might use this topic as a partition key to distribute the callback events you receive to separate queues or pools of workers to process the callbacks asynchronously. - `occurredAt` — the date and time when the event occurred - `data` — the JSON:API resource describing the state of the entity which triggered the callback A callback event is delivered as a `POST` request to your endpoint. The following payload represents the notification request that is triggered when an operation successfully completes: ```json { "event": "completed", "topic": "catalog-integration-operation.completed", "occurredAt": "2024-03-21T13:42:54+00:00", "data": { "id": "90567710-de47-49e4-8536-aab80c1a469c", "type": "catalog-integration-operation", "attributes": { // ... "status": "succeeded", "createdAt": "2024-03-21T13:13:03+00:00", "startedAt": "2024-03-21T13:19:32+00:00", "completedAt": "2024-03-21T13:42:54+00:00" // ... } } } ``` ### Handling callbacks The endpoint listening for callbacks has **3 seconds** to respond with a `2xx` (usually `200`) response code, acknowledging a successful delivery. If the request times out or gets a response with a status code other than `2xx`, it is considered failed. #### Handling webhook failures If a callback fails (whatever the reason) no further calls to the related endpoint are made. ### Testing callback A number of websites, such as https://webhook.site and https://requestbin.com, provide free URLs that can be used to test callbacks. Simply create a URL on one of these sites, then configure your webhook to use it. These sites allow you to see the details of the request sent to them by the callback service. In addition, the Ngrok service (https://ngrok.com) allows you to tunnel callback requests to a non-publicly accessible server, enabling you to test your callback-handling code before making it public. ### Operations and Drafts behaviour | Type | Behaviour | |----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `import` | When executing an import operation existing drafts will be cleaned and new ones will be created if any of the products attached to the operation has any validation issue. | | `update` | Will not have any impact on existing drafts. | | `delete` | Will not have any impact on existing drafts. |

OpenAPI Specification

ankorstore-catalog-integrations-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  version: 1.2.2-oas3.1
  title: Ankorstore Stock Tracking and Logistics Applications Catalog Integrations API
  summary: API specification for the Ankorstore Stock Tracking and Logistics system
  description: Ankorstore Stock Tracking and Logistics (ASTRAL) API specification
  contact:
    name: Ankorstore
    url: https://www.ankorstore.com
    email: api@ankorstore.com
  license:
    url: https://creativecommons.org/publicdomain/zero/1.0/
    name: CC0 1.0 Universal
servers:
- url: http://www.ankorlocal.com:8000
  description: Local Development Server
- url: https://www.preprod.ankorstore.com
  description: Staging Environment
- url: https://www.ankorstore.com
  description: Prod Environment
tags:
- name: Catalog Integrations
  description: "## \U0001F44B Getting Started\n\nThe catalogue integration process relies on the concept of operations. An operation is a batch of records\nrepresenting the products to create, update or delete. The completion state of an operation depends\non the execution result for every record it contains. It means an operation might fail without necessarily\nstopping or marking the whole operation as failed (this particular state is defined as “Partially failed”).\n\n- Operations can be of type `import`, `update` or `delete`.\n- Only one open operation (not yet started) is allowed at a time.\n- Only one operation can be performed (`started`) at a time.\n  - Any subsequent operation will be queued with status `pending` until previous one has finished processing.\n  - If no previous operation is being processed, operation will start processing right away.\n\n### Operation Statuses\n\nThe `status` attribute represents the current state of the operation, below is a table that describes each state:\n\n| Status             | Description                                                                                                                                                                              |\n|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `created`          | The operation was created and not yet started. At this stage, the operation is considered open and products can still be added to the batch.                                             |\n| `skipped`          | The operation is empty and was skipped (No action required). When an operation is skipped, an empty report is generated and the callback URL is called to notify operation is completed. |\n| `started`          | The operation started and is processing.                                                                                                                                                 |\n| `pending`          | Operation is waiting for its turn on the processing queue. The operation could not be started because another one was being processed.                                                                                                                               |\n| `succeeded`        | All products were successfully processed.                                                                                                                                                |\n| `failed`           | All products failed to be processed.                                                                                                                                                     |\n| `partially_failed` | Not all products were successfully processed.                                                                                                                                            |\n\n## \U0001F4A1 Operation workflow\n\nThe complete workflow for an operation occurs in 3 stages: operation creation, operation processing and reporting.\nThe following diagram illustrates these stages and how they are chained.\n\n<pre class=\"mermaid\">\n%%{init: {\"flowchart\": {\"curve\":\"basis\", \"htmlLabels\":false, \"diagramPadding\":24 } } }%%\ngraph LR\n\ncreated(\"Operation Created\")\nstart(\"Start Processing\")\nstarted(\"Processing\\nStarted\")\nsucceeded(Succeeded):::success\nskipped(\"Processing Skipped\"):::success\npending(\"Operation pending\")\nfailed(Failed):::failure\npartial(Partially Failed):::warning\nreport(\"Report\\nGenerated\")\nnotified(Callback Sent)\n\nsubgraph creating[Creating Operation]\ncreated -- Add Products --> created\nend\n\ncreated -- Start Operation --> Start{?}\nStart -->|\"Another Operation execution in progress\"| pending\nStart --->|\"No other Operation in progress\"| start --> E{?}\nE -->|\"Batch.size > 0\"| processing\nE --->|\"Batch is empty\"| skipped\n\nsubgraph processing[Processing Operation]\ndirection LR\nstarted --> succeeded\nstarted --> partial\nstarted --> failed\nend\n\nsucceeded --> operationCompletedActions\npartial --> operationCompletedActions\nfailed --> operationCompletedActions\n\nsubgraph reporting[Reporting]\nreport -- Notify --> notified\nend\n\nsubgraph triggerNext[Trigger next pending Operation]\nend\n\nsubgraph operationCompletedActions[Post-Complete Operation Actions]\nreporting\ntriggerNext\nend\n\npending -- Wait for previous Operation to finish execution --> start\n\nskipped -- Generate empty report --> operationCompletedActions\n\nclassDef default stroke:#4b475f,stroke-width:1px,fill:#ffffff,color:#4b475f\nclassDef success stroke:#1aae9f,stroke-width:1px,fill:#cfeeeb,color:#293845\nclassDef failure stroke:#d3455b,stroke-width:1px,fill:#f6d8dd,color:#293845\nclassDef warning stroke:#f7c325,stroke-width:1px,fill:#fdf2d1,color:#293845\nlinkStyle default stroke:#788896,stroke-width:1px,fill:transparent\n</pre>\n\n### Creating an Operation\n\nThe full flow of creating a complete operation consists in two steps:\n\n#### 1. Create a new operation\n\nSend a `POST` request to `/api/v1/catalog/integrations/operations`\n\nExample request:\n```json\n{\n    \"data\": {\n        \"type\": \"catalog-integration-operation\",\n        \"attributes\": {\n            \"source\": \"shopify\",\n            \"callbackUrl\": \"https://callback.url/called/after/processing\",\n            \"operationType\": \"import\"\n        }\n    }\n}\n```\n\n- At this point the new operation has been created and waiting to receive products data\n- Operation ID will be returned in the response payload\n\n#### 2. Add product data to operation\n\nSend a `POST` request to `/api/v1/catalog/integrations/operations/{operationId}/products`\n\nProducts can be added only to operations with status `created`.\n\nIf operation has been started already (having any of `started`, `pending`, `skipped`, `succeeded`, `partially_failed`, `failed`, `cancelled` status),\nthe request will fail with a `403 Forbidden` status code.\n\nExample request:\n```json\n{\n    \"products\": [\n        {\n            \"id\": \"B006GWO5WK\",\n            \"type\": \"catalog-integration-product\",\n            \"attributes\": {\n                \"external_id\": \"B006GWO5WK\",\n                \"name\": \"Example product\"\n                // ...\n            }\n        }\n    ]\n}\n```\n\nYou can perform as many requests as needed to append product data during this stage.\n\n### Operation Processing\n\nIn order to start processing the operation, you have to send a `PATCH` request\nto `/api/v1/catalog/integrations/operations/{operationId}` with the expected operation status (i.e. “started”).\n\nIf there is any other operation being executed at that time, the operation will be enqueued to be processed\nwith the status `pending` and will be started as soon as it gets a free slot in the queue. Otherwise, the\noperation will be started right away.\n\nExample request:\n```json\n{\n    \"data\": {\n        \"id\": \"90567710-de47-49e4-8536-aab80c1a469c\",\n        \"type\": \"catalog-integration-operation\",\n        \"attributes\": {\n            \"status\": \"started\"\n        }\n    }\n}\n```\n\n### Execution Report\n\nWhen an operation completes, an execution report is generated.\nIt provides the execution results (success or failure) for every product of the operation.\n\nYou can access this report by reading from the following endpoint.\n\n```http\nGET /api/v1/catalog/integrations/operations/{operationId}/results\n```\n\n## \U0001F4A1 Event Callbacks\n\nCallbacks enable you to get notified when events occur in the operation process. For example, you can\nconfigure a callback to notify you when the operation is completed. The notification is sent via\nan HTTP request to the URL you specify in the operation settings.\n\nCallbacks can be used to trigger automated actions in your integration.\n\n### Supported events\n\nYou can find here below the complete list of all the topics `{{resource}}.{{event}}` you can monitor:\n\n| Topic                                     | Trigger                                                                                                                                                        |\n|-------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `catalog-integration-operation.completed` | An operation reaches a completed state such as **Success**, **Failed**, or **Partially Failed**                                                                |\n| `catalog-integration-operation.cancelled` | An operation was cancelled. This event is triggered when an operation processing is **Skipped** (i.e. the operation batch is empty and no action is required). |\n\n### Event schema\n\nA callback event is represented as a JSON object and has the following properties:\n\n- `event` — the name of the event that occurred (e.g. “completed”)\n- `topic` — the event category represented as a unique identifier of the event type.\n  The topic is defined as a concatenation of the resource and event names `{$.data.type}.{$.event}`,\n  e.g. “catalog-integration-operation.completed”. You might use this topic as a partition key to distribute\n  the callback events you receive to separate queues or pools of workers to process the callbacks asynchronously.\n- `occurredAt` — the date and time when the event occurred\n- `data` — the JSON:API resource describing the state of the entity which triggered the callback\n\nA callback event is delivered as a `POST` request to your endpoint. The following payload represents the notification\nrequest that is triggered when an operation successfully completes:\n\n```json\n{\n    \"event\": \"completed\",\n    \"topic\": \"catalog-integration-operation.completed\",\n    \"occurredAt\": \"2024-03-21T13:42:54+00:00\",\n    \"data\": {\n        \"id\": \"90567710-de47-49e4-8536-aab80c1a469c\",\n        \"type\": \"catalog-integration-operation\",\n        \"attributes\": {\n            // ...\n            \"status\": \"succeeded\",\n            \"createdAt\": \"2024-03-21T13:13:03+00:00\",\n            \"startedAt\": \"2024-03-21T13:19:32+00:00\",\n            \"completedAt\": \"2024-03-21T13:42:54+00:00\"\n            // ...\n        }\n    }\n}\n```\n\n### Handling callbacks\n\nThe endpoint listening for callbacks has **3 seconds** to respond with a `2xx` (usually `200`)\nresponse code, acknowledging a successful delivery. If the request times out or gets a response\nwith a status code other than `2xx`, it is considered failed.\n\n<div class=\"warning\">\n\n#### Handling webhook failures\n\nIf a callback fails (whatever the reason) no further calls to the related endpoint are made.\n</div>\n\n### Testing callback\n\nA number of websites, such as https://webhook.site and https://requestbin.com, provide free URLs that\ncan be used to test callbacks. Simply create a URL on one of these sites, then configure your webhook\nto use it. These sites allow you to see the details of the request sent to them by the callback service.\n\nIn addition, the Ngrok service (https://ngrok.com) allows you to tunnel callback requests to a non-publicly\naccessible server, enabling you to test your callback-handling code before making it public.\n\n### Operations and Drafts behaviour\n\n| Type     | Behaviour                                                                                                                                                                  |\n|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `import` | When executing an import operation existing drafts will be cleaned and new ones will be created if any of the products attached to the operation has any validation issue. |\n| `update` | Will not have any impact on existing drafts.                                                                                                                               |\n| `delete` | Will not have any impact on existing drafts.                                                                                                                               |\n"
paths:
  /api/v1/catalog/integrations/operations:
    post:
      summary: Create a new operation
      description: "Create new Operation to process over related Catalog Integration\n> ID of the operation will be returned on the response payload.\n  This ID should be used to add products data through `POST /catalog/integrations/operations/{ID}`\n"
      operationId: post-catalog-integration-operations
      tags:
      - Catalog Integrations
      parameters:
      - name: Accept
        in: header
        description: application/vnd.api+json
        schema:
          type: string
          default: application/vnd.api+json
      requestBody:
        content:
          application/vnd.api+json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The type of resource to create
                      enum:
                      - catalog-integration-operation
                    attributes:
                      type: object
                      description: The operation attributes
                      required:
                      - source
                      - operationType
                      - callbackUrl
                      optional:
                      - updateFields
                      properties:
                        source:
                          title: OperationSource
                          description: Source of the operation
                          type: string
                          enum: &id001
                          - shopify
                          - woocommerce
                          - prestashop
                          - other
                        callbackUrl:
                          type: string
                          description: 'The url of the endpoint that will be called when an operation completes. When an operation reaches a completed state such as **Success**, **Failed**, or **Partially Failed** the API platform will trigger a request to your endpoint.

                            '
                        operationType:
                          title: OperationType
                          description: Operation type
                          type: string
                          enum:
                          - import
                          - update
                          - delete
                        updateFields:
                          type: array
                          description: 'Optional list of fields that will be taken into account when updating the products provided. This list will be

                            only taken into account for operations of type `update`.

                            - For sources `shopify`, `woocommerce` and `prestashop`: If list is not provided or empty, all `stock`

                            and `prices` related fields will be updated

                            - For source `other`: If list is not provided or empty, all fields will be updated


                            Group fields:

                            - If `stock` is provided, both `stock_quantity` and `is_always_in_stock` properties will be updated

                            - If `prices` is provided, both `wholesale_price` and `retail_price` will be updated

                            '
                          items:
                            type: string
                            enum:
                            - stock
                            - prices
                            - description
                            - dimensions
                            - images
                            - name
                            - prices
                            - retail_price
                            - stock
                            - tags
                            - unit_multiplier
                            - vat_rate
                            - wholesale_price
            examples:
              import:
                value:
                  data:
                    type: catalog-integration-operation
                    attributes:
                      source: shopify
                      callbackUrl: https://callback.url/called/after/processing
                      operationType: import
              update:
                value:
                  data:
                    type: catalog-integration-operation
                    attributes:
                      source: shopify
                      callbackUrl: https://callback.url/called/after/processing
                      operationType: update
                      updateFields:
                      - stock
      responses:
        '201':
          description: The operation that was successfully created
          content:
            application/vnd.api+json:
              schema:
                type: object
                properties:
                  data:
                    title: Operation
                    description: An operation resource
                    type: object
                    required: &id004
                    - id
                    - type
                    properties: &id005
                      id:
                        type: string
                        format: uuid
                        description: A globally-unique identifier for the operation
                        readOnly: true
                      type:
                        type: string
                        description: Resource type.
                        enum:
                        - catalog-integration-operation
                        readOnly: true
                      attributes:
                        type: object
                        description: The operation attributes.
                        properties:
                          source:
                            title: OperationSource
                            description: Source of the operation
                            type: string
                            enum: *id001
                          status:
                            title: OperationStatus
                            type: string
                            enum:
                            - created
                            - started
                            - skipped
                            - succeeded
                            - partially_failed
                            - failed
                          operationType:
                            title: OperationType
                            description: Operation type
                            type: string
                            enum:
                            - import
                            - update
                            - delete
                          updateFields:
                            title: updateFields
                            description: List of fields or group of fields that will be updated on provided products
                            type: array
                            items:
                              type: string
                              enum:
                              - stock
                              - prices
                          createdAt:
                            type: string
                            format: date-time
                            description: Date and time when operation was created
                          startedAt:
                            type:
                            - 'null'
                            - string
                            format: date-time
                            description: Date and time when operation processing started
                          completedAt:
                            type:
                            - 'null'
                            - string
                            format: date-time
                            description: Date and time when operation was completed
                          callbackUrl:
                            type:
                            - 'null'
                            - string
                            format: uri
                            description: a URL where the user will be notified after the operation is complete
                          totalProductsCount:
                            type: integer
                            description: Total number of products in the batch
                          processedProductsCount:
                            type: integer
                            description: Number of products successfully processed
                          failedProductsCount:
                            type: integer
                            description: Number of products which processing failed
              examples:
                Operation Created:
                  value:
                    jsonapi:
                      version: '1.0'
                    links:
                      self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c
                    data:
                      id: 90567710-de47-49e4-8536-aab80c1a469c
                      type: catalog-integration-operation
                      attributes:
                        source: shopify
                        status: created
                        operationType: import
                        createdAt: '2024-01-01T14:15:22Z'
                        startedAt: null
                        completedAt: null
                        callbackUrl: https://callback.url/called/after/processing
                        totalProductsCount: 132
                        processedProductsCount: 0
                        failedProductsCount: 0
                      relationships:
                        results:
                          links:
                            related: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c/results
                            self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c/relationships/results
                      links:
                        self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c
                Operation Started:
                  value:
                    jsonapi:
                      version: '1.0'
                    links:
                      self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c
                    data:
                      id: 90567710-de47-49e4-8536-aab80c1a469c
                      type: catalog-integration-operation
                      attributes:
                        source: shopify
                        status: started
                        operationType: import
                        createdAt: '2024-01-01T14:15:22Z'
                        startedAt: '2024-01-01T15:27:22Z'
                        completedAt: null
                        callbackUrl: https://callback.url/called/after/processing
                        totalProductsCount: 132
                        processedProductsCount: 0
                        failedProductsCount: 0
                      relationships:
                        results:
                          links:
                            related: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c/results
                            self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c/relationships/results
                      links:
                        self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c
                Operation Succeeded:
                  value:
                    jsonapi:
                      version: '1.0'
                    links:
                      self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c
                    data:
                      id: 90567710-de47-49e4-8536-aab80c1a469c
                      type: catalog-integration-operation
                      attributes:
                        source: shopify
                        status: succeeded
                        operationType: import
                        createdAt: '2024-01-01T14:15:22Z'
                        startedAt: '2024-01-01T15:27:45Z'
                        completedAt: '2024-01-01T16:10:03Z'
                        callbackUrl: https://callback.url/called/after/processing
                        totalProductsCount: 132
                        processedProductsCount: 132
                        failedProductsCount: 0
                      relationships:
                        results:
                          links:
                            related: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c/results
                            self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c/relationships/results
                      links:
                        self: https://www.ankorstore.com/api/v1/catalog/integrations/operations/90567710-de47-49e4-8536-aab80c1a469c
        '401':
          description: Unauthorized
          content:
            application/vnd.api+json:
              schema:
                type: object
                additionalProperties: false
                properties: &id002
                  errors:
                    type: array
                    uniqueItems: true
                    items:
                      type: object
                      properties:
                        code:
                          description: An application-specific error code, expressed as a string value.
                          type: string
                        detail:
                          description: A human-readable explanation specific to this occurrence of the problem.
                          type: string
                        status:
                          description: The HTTP status code applicable to this problem, expressed as a string value.
                          type: string
                        title:
                          description: The HTTP status code description applicable to this problem
                          type: string
                        source:
                          type: object
                          description: Optional object pointing towards the problematic field
                          properties:
                            pointer:
                              type: string
                              description: The field key
                        meta:
                          description: Non-standard meta-information that can not be represented as an attribute or relationship.
                          type: object
                          additionalProperties: true
                      additionalProperties: false
                  jsonapi:
                    description: An object describing the server's implementation
                    type: object
                    properties:
                      version:
                        type: string
                      meta:
                        description: Non-standard meta-information that can not be represented as an attribute or relationship.
                        type: object
                        additionalProperties: true
                    additionalProperties: false
                required: &id003
                - errors
              example:
                jsonapi:
                  version: '1.0'
                errors:
                - detail: Unauthorized
                  status: '401'
        '406':
          description: Not Acceptable
          content:
            application/vnd.api+json:
              schema:
                type: object
                additionalProperties: false
                properties: *id002
                required: *id003
              example:
                jsonapi:
                  version: '1.0'
                errors:
                - detail: Not Acceptable
                  status: '406'
        '415':
          description: Unsupported Media Type
          content:
            application/vnd.api+json:
              schema:
                type: object
                additionalProperties: false
                properties: *id002
                required: *id003
              example:
                jsonapi:
                  version: '1.0'
                errors:
                - detail: Unsupported Media Type
                  status: '415'
        '500':
          description: '[Server Error](https://jsonapi.org/format/#errors)'
          content:
            application/vnd.api+json:
              schema:
                type: object
                additionalProperties: false
                properties: *id002
                required: *id003
              example:
                jsonapi:
                  version: '1.0'
                errors:
                - detail: Server Error
                  status: '500'
      callbacks:
        operationCallback:
          '{$request.body#/data/attributes/callbackUrl}':
            post:
              summary: A callback triggered when events occur in the operation process
              requestBody:
                content:
                  application/json:
                    schema:
                      title: CallbackEvent
                      type: object
                      required:
                      - event
                      - topic
                      - occurredAt
                      properties:
                        event:
                          type: string
                          description: The name of the event that occurred
                          example: completed
                        topic:
                          type: string
                          description: 'The event category represented as a unique identifier of the event type. The topic is defined as a concatenation of the resource and event names `{$.data.type}.{$.event}`. You might use this topic as a partition key to distribute the callback events you receive to separate queues or pools of workers to process the callbacks asynchronously.

                            '
                          example: catalog-integration-operation.completed
                        occurredAt:
                          type: string
                          description: The date and time when event occurred
                          format: date-time
                        data:
                          description: the JSON:API resource describing the state of the entity which triggered the callback
                          title: Operation
                          type: object
                          required: *id004
                          properties: *id005
              responses:
                '200':
                  description: Acknowledge a successful delivery of the callback
  /api/v1/catalog/integrations

# --- truncated at 32 KB (110 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/ankorstore/refs/heads/main/openapi/ankorstore-catalog-integrations-api-openapi.yml