openapi: 3.0.1 info: title: Canto PIM bulk_products_catalogs webhooks API description: "\n[Canto APIs](https://api.canto.com) enable seamless synchronization between the PIM + DAM and external systems that rely on accurate, up-to-date product content. \nThe API outlined here provides programmatic access to Canto’s Product Hub (PIM). The Product Hub API allows authorized systems to create, retrieve, update, and manage rich product data for use across digital channels, e-commerce platforms, and other target or source systems. \n \nKey Capabilities
\nThe Canto Product Hub API enables full product data management:\n1. Product Record Management: Create, read, update, and delete product entries including structured metadata, taxonomy, categories, and references.\n2. Attribute & Schema Configuration: Access and manage custom product attributes and classification structures\n3. Webhooks: Trigger updates or publish product datasets to downstream systems and integration pipelines.\n \nAPI Design\n- The PIM API adheres to RESTful principles, supporting standard HTTP methods (GET, POST, PUT, PATCH, DELETE).\n- JSON is the default payload format for both requests and responses.\n\nHTTP Status Code Conventions
\nBelow are general HTTP codes applicable across most endpoints:
\n- 200, 201, 204 – Successful operations (retrieval, creation, update, deletion).\n- 400 – Bad request. Input payloads did not conform to the expected schema or required parameters were missing.\n- 401 / 403 – Authentication or authorization failed.\n- 404 – The route or resource was not found.\n- 409 – Conflict in resource state (e.g., duplicate product identifier).\n- 429 - Too many requests. See Rate Limits below.\n- 500 – An unexpected server error occurred.\n- 502 / 503 / 504 – Infrastructure issues such as load balancer, service unavailability, or timeouts.\n\nAPI Rate Limits
\nRate limits are how many API calls you can make in a given time frame. If your call exceeds the pre-defined rate limit, you will run into a “429” http error-code. After which, you will need to wait until you can make another API call.\n\nPIM API Rate Limit: 5 requests/second\n" version: v1.0.1 servers: - url: https://{tenantSubdomain}.{region}/api/v1/pim/ variables: tenantSubdomain: default: demo region: enum: - canto.com - canto.global - canto.de - au.canto.com - ca.canto.com default: canto.com security: - bearerAuth: [] tags: - name: webhooks description: "Webhooks are used to notify your application when certain events occur within the system.\nThey can be configured to send a POST request to a specified URL when a specific event happens.\nAvailable resources and the events they support:\n- product\n - created\n - updated\n - deleted\n- variant\n - created\n - updated\n - deleted\n- import\n - started\n - completed\n - failed\n\nYou can validate the payload using the +X-Webhook-Signature+ header. It's a SHA256 hash of the payload, signed with the secret key.\n" paths: /webhooks: get: tags: - webhooks summary: Get Webhooks description: ' List all registered webhooks ' operationId: get_api_v1_webhooks responses: '200': description: List of webhooks content: '*/*': schema: required: - webhooks type: object properties: webhooks: type: array description: Array of Webhooks items: type: string additionalProperties: false '401': description: User is not permitted to use the API or Authentication is invalid content: {} '500': description: Something went wrong content: {} post: tags: - webhooks summary: Create Webhook description: ' Register a new webhook ' operationId: post_api_v1_webhooks requestBody: content: application/json: schema: required: - event - resource - url type: object properties: url: type: string description: Webhook URL endpoint (including protocol e.g., https://) resource: type: string description: Resource type to monitor enum: - product - variant - import event: type: string description: Event to monitor (specific to resource) enum: - created - updated - deleted - started - completed - failed active: type: boolean description: Whether webhook is actively sending or disabled secret: type: string description: Your secret token for webhook authentication multipart/form-data: schema: required: - event - resource - url type: object properties: url: type: string description: Webhook URL endpoint (including protocol e.g., https://) resource: type: string description: Resource type to monitor enum: - product - variant - import event: type: string description: Event to monitor (specific to resource) enum: - created - updated - deleted - started - completed - failed active: type: boolean description: Whether webhook is actively sending or disabled secret: type: string description: Your secret token for webhook authentication required: true responses: '201': description: Successfully created Webhook content: '*/*': schema: required: - active - event - id - resource - secret - url type: object properties: id: type: number description: Webhook ID url: type: string description: Webhook URL endpoint (including protocol e.g., https://) resource: type: string description: Resource type to monitor enum: - product - variant - import event: type: string description: Event to monitor (specific to resource) enum: - created - updated - deleted - started - completed - failed active: type: boolean description: Whether webhook is actively sending or disabled secret: type: string description: Secret key that you provided or one we generated (store this securely, there's no way to retrieve it again) additionalProperties: false '400': description: The request parameters were invalid. References to `nil` means empty string or `null` value content: {} '401': description: User is not permitted to use the API or Authentication is invalid content: {} '422': description: There was an error creating your Webhook content: {} '500': description: Something went wrong content: {} /webhooks/{id}: get: tags: - webhooks summary: Get Webhook description: ' Get details of a specific webhook ' operationId: get_api_v1_webhooks_id parameters: - name: id in: path description: Webhook ID required: true schema: type: number responses: '200': description: Webhook details content: '*/*': schema: $ref: '#/components/schemas/webhook_properties' '401': description: User is not permitted to use the API or Authentication is invalid content: {} '404': description: Webhook ID not found content: {} '500': description: Something went wrong content: {} put: tags: - webhooks summary: Update Webhook description: ' Fully update a webhook ' operationId: put_api_v1_webhooks_id parameters: - name: id in: path description: Webhook ID required: true schema: type: number requestBody: content: application/json: schema: type: object properties: url: type: string description: Webhook URL endpoint (including protocol e.g., https://) resource: type: string description: Resource type to monitor enum: - product - variant - import event: type: string description: Event to monitor (specific to resource) enum: - created - updated - deleted - started - completed - failed active: type: boolean description: Whether webhook is actively sending or disabled secret: type: string description: Your secret token for webhook authentication multipart/form-data: schema: type: object properties: url: type: string description: Webhook URL endpoint (including protocol e.g., https://) resource: type: string description: Resource type to monitor enum: - product - variant - import event: type: string description: Event to monitor (specific to resource) enum: - created - updated - deleted - started - completed - failed active: type: boolean description: Whether webhook is actively sending or disabled secret: type: string description: Your secret token for webhook authentication responses: '200': description: Updated webhook content: '*/*': schema: $ref: '#/components/schemas/webhook_properties' '400': description: The request parameters were invalid. References to `nil` means empty string or `null` value content: {} '401': description: User is not permitted to use the API or Authentication is invalid content: {} '404': description: Webhook ID not found content: {} '422': description: There was an error creating your Webhook content: {} '500': description: Something went wrong content: {} delete: tags: - webhooks summary: Delete Webhook description: ' Remove a webhook ' operationId: delete_api_v1_webhooks_id parameters: - name: id in: path description: Webhook ID required: true schema: type: number responses: '204': description: Webhook successfully deleted content: {} '401': description: User is not permitted to use the API or Authentication is invalid content: {} '404': description: Webhook ID not found content: {} '422': description: There was an error deleting your Webhook content: {} '500': description: Something went wrong content: {} patch: tags: - webhooks summary: Update Webhook description: ' Partially update webhook details ' operationId: patch_api_v1_webhooks_id parameters: - name: id in: path description: Webhook ID required: true schema: type: number requestBody: content: application/json: schema: type: object properties: url: type: string description: Webhook URL endpoint (including protocol e.g., https://) resource: type: string description: Resource type to monitor enum: - product - variant - import event: type: string description: Event to monitor (specific to resource) enum: - created - updated - deleted - started - completed - failed active: type: boolean description: Whether webhook is actively sending or disabled secret: type: string description: Your secret token for webhook authentication multipart/form-data: schema: type: object properties: url: type: string description: Webhook URL endpoint (including protocol e.g., https://) resource: type: string description: Resource type to monitor enum: - product - variant - import event: type: string description: Event to monitor (specific to resource) enum: - created - updated - deleted - started - completed - failed active: type: boolean description: Whether webhook is actively sending or disabled secret: type: string description: Your secret token for webhook authentication responses: '200': description: Updated webhook content: '*/*': schema: $ref: '#/components/schemas/webhook_properties' '400': description: The request parameters were invalid. References to `nil` means empty string or `null` value content: {} '401': description: User is not permitted to use the API or Authentication is invalid content: {} '404': description: Webhook ID not found content: {} '422': description: There was an error creating your Webhook content: {} '500': description: Something went wrong content: {} components: schemas: webhook_properties: required: - active - event - id - resource - url type: object properties: id: type: number description: Webhook ID url: type: string description: Webhook URL endpoint (including protocol e.g., https://) resource: type: string description: Resource type to monitor enum: - product - variant - import event: type: string description: Event to monitor (specific to resource) enum: - created - updated - deleted - started - completed - failed active: type: boolean description: Whether webhook is actively sending or disabled additionalProperties: false securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: AccessToken x-original-swagger-version: '2.0'