Canal variants API

The variants API from Canal — 2 operation(s) for variants.

Operations 6

GET /variants/ #
POST /variants/ #
GET /variants/{id}/ #
PUT /variants/{id}/ #
PATCH /variants/{id}/ #
DELETE /variants/{id}/ #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/canal-variants-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

canal-variants-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Rokt Catalog csv Variants API
  version: 1.0.1
  description: Integrate with Rokt Catalog
servers:
- url: https://api.shopcanal.com/platform
  description: Rokt Catalog Storefront Public API
tags:
- name: variants
paths:
  /variants/:
    get:
      operationId: variants_list
      description: '

        **[Supplier Only]** Retrieve a paginated list of **all** product variants associated with **all** products owned by your Supplier account.


        This endpoint provides a flat list of variant details, independent of their parent products. Use this if you need to query or manage variants across your entire catalog.


        Results are returned using cursor-based pagination (`PlatformPagination`). Available ordering fields include `created_at`, `updated_at`, `price`, and `compare_at_price`. The default order is `-created_at`.


        '
      parameters:
      - name: ordering
        required: false
        in: query
        description: Which field to use when ordering the results.
        schema:
          type: string
      - name: cursor
        required: false
        in: query
        description: The pagination cursor value.
        schema:
          type: string
      tags:
      - variants
      security:
      - platformAppId: []
        platformAppToken: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedVariantList'
          description: ''
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
    post:
      operationId: variants_create
      description: '

        **[Supplier Only]** Add a new variant to an existing product within your Rokt Catalog Supplier account.


        The request body must conform to the `CreateVariantSerializer` structure, requiring the `product_id` (UUID) of the parent product and the full details of the new variant (including `price`, `sku`, `inventory_quantity`, `option1`, etc.).


        Upon successful creation, the new variant is added to the specified product. By default, it will be assigned the next available `position` (typically appearing last in the variant list, unless explicitly reordered later using the `/products/{product_id}/reorder_variants/` endpoint).


        **Synchronization:** This addition is automatically propagated **asynchronously** to connected Storefronts that are selling the parent product.


        A successful creation returns `201 Created` with the full details of the **parent product** (`ProductSerializer`), now including the newly added variant and its assigned Catalog ID (UUID).


        '
      tags:
      - variants
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateVariant'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CreateVariant'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CreateVariant'
        required: true
      security:
      - platformAppId: []
        platformAppToken: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
          description: ''
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
  /variants/{id}/:
    get:
      operationId: variants_retrieve
      description: '

        **[Supplier Only]** Retrieve the full details for a specific product variant, identified by its Rokt Catalog `ID` (UUID) provided in the URL path.


        This endpoint returns data only for variants that belong to products owned by your Supplier account.


        The response (`VariantSerializer`) includes all attributes of the variant, such as price, SKU, inventory, options, weight, timestamps, and its parent product ID.


        If the provided variant `ID` is invalid or belongs to a product owned by another shop, a `404 Not Found` error is returned.


        '
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - variants
      security:
      - platformAppId: []
        platformAppToken: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Variant'
          description: ''
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
    put:
      operationId: variants_update
      description: '

        **[Supplier Only]** Update attributes of a specific product variant, identified by its Rokt Catalog `ID` (UUID) in the URL path.


        Provide the fields you wish to change in the request body using the `VariantSerializer` structure (partial updates are allowed). Common updatable fields include `price`, `compare_at_price`, `sku`, `inventory_quantity`, `option1`, `option2`, `option3`, `weight`, `weight_unit`, etc.


        **Synchronization:** Changes to critical attributes like price and inventory are automatically propagated to connected Storefronts that are selling this variant. This synchronization occurs **asynchronously**.


        **Pricing Update:** When updating `price` or `compare_at_price`, the system also updates the associated variant listing''s default price, considering the shop''s feature flags for sale price syncing.


        A successful update returns `200 OK` with the full details of the **parent product** (`ProductSerializer`), reflecting the changes made to the specific variant.


        '
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - variants
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Variant'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Variant'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/Variant'
        required: true
      security:
      - platformAppId: []
        platformAppToken: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
          description: ''
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
    patch:
      operationId: variants_partial_update
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - variants
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedVariant'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedVariant'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedVariant'
      security:
      - platformAppId: []
        platformAppToken: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Variant'
          description: ''
    delete:
      operationId: variants_destroy
      description: '

        **[Supplier Only]** Permanently remove a specific product variant, identified by its Rokt Catalog `ID` (UUID) in the URL path, from its parent product.


        **Warning:** This action is **irreversible**.


        **Constraint:** You **cannot** delete the last remaining variant of a product using this endpoint. If you need to remove the product entirely, use the `/products/{product_id}/` delete endpoint instead.


        **Synchronization:** Deleting a variant automatically triggers an **asynchronous** update (emitting a `PRODUCT_UPDATE` webhook) to propagate this change to connected Storefronts, effectively removing the variant from their listings.


        **Position Update:** The `position` attribute of the remaining variants on the parent product will be automatically recalculated and updated to maintain a contiguous sequence.


        A successful deletion returns `200 OK` with the full details of the **parent product** (`ProductSerializer`), reflecting the variant''s removal and the updated positions of the remaining variants.


        '
      parameters:
      - in: path
        name: id
        schema:
          type: string
        required: true
      tags:
      - variants
      security:
      - platformAppId: []
        platformAppToken: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
          description: ''
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
components:
  schemas:
    Shop:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        email:
          type:
          - string
          - 'null'
          readOnly: true
        phone:
          type:
          - string
          - 'null'
          maxLength: 128
        name:
          type: string
          maxLength: 129
        description:
          type:
          - string
          - 'null'
          maxLength: 6144
        myshopify_domain:
          type: string
          maxLength: 128
        province:
          type:
          - string
          - 'null'
          maxLength: 122
        country:
          type: string
          maxLength: 64
        domain:
          type:
          - string
          - 'null'
          maxLength: 128
        display_domain:
          type:
          - string
          - 'null'
          readOnly: true
        privacy_policy_url:
          type:
          - string
          - 'null'
          format: uri
          maxLength: 500
        terms_of_service_url:
          type:
          - string
          - 'null'
          format: uri
          maxLength: 500
      required:
      - country
      - display_domain
      - email
      - id
      - myshopify_domain
      - name
    Status2eaEnum:
      enum:
      - active
      - draft
      - archived
      - unlisted
      type: string
      description: '* `active` - active

        * `draft` - draft

        * `archived` - archived

        * `unlisted` - unlisted'
    Image:
      type: object
      properties:
        id:
          type: string
        position:
          type: integer
        src:
          type: string
          format: uri
        display_src:
          type:
          - string
          - 'null'
          format: uri
        width:
          type: integer
        height:
          type: integer
        canal_variant_ids:
          type: array
          items:
            type: string
          readOnly: true
        variant_ids:
          type: array
          items:
            type: string
        origin_supplier_image_id:
          type:
          - string
          - 'null'
          format: uuid
      required:
      - canal_variant_ids
      - src
    Product:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        shop:
          allOf:
          - $ref: '#/components/schemas/Shop'
          readOnly: true
        variants:
          type: array
          items:
            $ref: '#/components/schemas/Variant'
          readOnly: true
        body_html:
          type:
          - string
          - 'null'
          maxLength: 60000
        handle:
          type:
          - string
          - 'null'
          maxLength: 258
        image_src:
          type:
          - string
          - 'null'
          maxLength: 1043
        images:
          type: array
          items:
            $ref: '#/components/schemas/Image'
        options: {}
        product_type:
          type:
          - string
          - 'null'
          maxLength: 1044
        updated_at:
          type: string
          format: date-time
          readOnly: true
        published_at:
          type:
          - string
          - 'null'
          format: date-time
        status:
          $ref: '#/components/schemas/Status2eaEnum'
        title:
          type: string
          maxLength: 1029
        vendor:
          type:
          - string
          - 'null'
          maxLength: 227
        tags:
          type:
          - string
          - 'null'
          maxLength: 63750
        permalink:
          type:
          - string
          - 'null'
          format: uri
          maxLength: 2000
        number_of_reviews:
          type:
          - integer
          - 'null'
          maximum: 2147483647
          minimum: -2147483648
        star_rating:
          type:
          - number
          - 'null'
          format: double
      required:
      - id
      - shop
      - title
      - updated_at
      - variants
    Error:
      type: object
      properties:
        message:
          type: string
        detail: {}
    InventoryPolicyEnum:
      enum:
      - continue
      - deny
      type: string
      description: '* `continue` - continue

        * `deny` - deny'
    Variant:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        shop:
          allOf:
          - $ref: '#/components/schemas/Shop'
          readOnly: true
        inventory_policy:
          type:
          - string
          - 'null'
          maxLength: 123
        inventory_quantity:
          type:
          - integer
          - 'null'
          maximum: 2147483647
          minimum: -2147483648
        inventory_item_cost:
          type: number
          format: double
        option1:
          type:
          - string
          - 'null'
          maxLength: 255
        option2:
          type:
          - string
          - 'null'
          maxLength: 256
        option3:
          type:
          - string
          - 'null'
          maxLength: 257
        position:
          type: integer
          readOnly: true
        price:
          type: string
          format: decimal
          pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
          description: The price of the variant to be sold at.
        compare_at_price:
          type:
          - string
          - 'null'
          maxLength: 128
        origin_supplier_currency:
          type:
          - string
          - 'null'
          readOnly: true
        title:
          type: string
        sku:
          type:
          - string
          - 'null'
          readOnly: true
        upc:
          type:
          - string
          - 'null'
          maxLength: 253
        grams:
          type:
          - number
          - 'null'
          format: double
        weight:
          type:
          - number
          - 'null'
          format: double
        weight_unit:
          type:
          - string
          - 'null'
          maxLength: 3
        pause_selling:
          type: boolean
        origin_supplier_id:
          type:
          - string
          - 'null'
          readOnly: true
        origin_supplier_name:
          type:
          - string
          - 'null'
          readOnly: true
        available_for_ordering:
          type: boolean
          readOnly: true
        supplier_sku:
          type:
          - string
          - 'null'
          readOnly: true
        is_exclusive_offer:
          type: boolean
          description: An exclusive offer is a variant that is discounted lower than the variant's actual price on the supplier's website.
          readOnly: true
        sup_price:
          type:
          - string
          - 'null'
          description: The connected supplier variant's price, sourced from the supplier directly.
          readOnly: true
        sup_compare_at_price:
          type:
          - string
          - 'null'
          description: The connected supplier variant's compare-at price, sourced from the supplier directly.
          readOnly: true
      required:
      - available_for_ordering
      - id
      - is_exclusive_offer
      - origin_supplier_currency
      - origin_supplier_id
      - origin_supplier_name
      - position
      - price
      - shop
      - sku
      - sup_compare_at_price
      - sup_price
      - supplier_sku
      - title
    CreateVariant:
      type: object
      properties:
        title:
          type: string
        price:
          type: string
          format: decimal
          pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
          description: The price of the variant to be sold at.
        compare_at_price:
          type:
          - string
          - 'null'
          format: decimal
          pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
          description: The original price of the product from before the sale price. Should be greater than "price". If you elect to not allow sale price passthrough, Connected Storefronts will sell items at this price.
        inventory_policy:
          $ref: '#/components/schemas/InventoryPolicyEnum'
        inventory_quantity:
          type: integer
        option1:
          type: string
        option2:
          type: string
        option3:
          type: string
        sku:
          type: string
        position:
          type: integer
        image_src:
          type: string
        weight:
          type: number
          format: double
        weight_unit:
          type: string
        product_id:
          type: string
          format: uuid
      required:
      - inventory_policy
      - inventory_quantity
      - option1
      - price
      - product_id
    PatchedVariant:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        shop:
          allOf:
          - $ref: '#/components/schemas/Shop'
          readOnly: true
        inventory_policy:
          type:
          - string
          - 'null'
          maxLength: 123
        inventory_quantity:
          type:
          - integer
          - 'null'
          maximum: 2147483647
          minimum: -2147483648
        inventory_item_cost:
          type: number
          format: double
        option1:
          type:
          - string
          - 'null'
          maxLength: 255
        option2:
          type:
          - string
          - 'null'
          maxLength: 256
        option3:
          type:
          - string
          - 'null'
          maxLength: 257
        position:
          type: integer
          readOnly: true
        price:
          type: string
          format: decimal
          pattern: ^-?\d{0,10}(?:\.\d{0,2})?$
          description: The price of the variant to be sold at.
        compare_at_price:
          type:
          - string
          - 'null'
          maxLength: 128
        origin_supplier_currency:
          type:
          - string
          - 'null'
          readOnly: true
        title:
          type: string
        sku:
          type:
          - string
          - 'null'
          readOnly: true
        upc:
          type:
          - string
          - 'null'
          maxLength: 253
        grams:
          type:
          - number
          - 'null'
          format: double
        weight:
          type:
          - number
          - 'null'
          format: double
        weight_unit:
          type:
          - string
          - 'null'
          maxLength: 3
        pause_selling:
          type: boolean
        origin_supplier_id:
          type:
          - string
          - 'null'
          readOnly: true
        origin_supplier_name:
          type:
          - string
          - 'null'
          readOnly: true
        available_for_ordering:
          type: boolean
          readOnly: true
        supplier_sku:
          type:
          - string
          - 'null'
          readOnly: true
        is_exclusive_offer:
          type: boolean
          description: An exclusive offer is a variant that is discounted lower than the variant's actual price on the supplier's website.
          readOnly: true
        sup_price:
          type:
          - string
          - 'null'
          description: The connected supplier variant's price, sourced from the supplier directly.
          readOnly: true
        sup_compare_at_price:
          type:
          - string
          - 'null'
          description: The connected supplier variant's compare-at price, sourced from the supplier directly.
          readOnly: true
    PaginatedVariantList:
      type: object
      required:
      - results
      properties:
        next:
          type:
          - string
          - 'null'
          format: uri
          example: http://api.example.org/accounts/?cursor=cD00ODY%3D"
        previous:
          type:
          - string
          - 'null'
          format: uri
          example: http://api.example.org/accounts/?cursor=cj0xJnA9NDg3
        results:
          type: array
          items:
            $ref: '#/components/schemas/Variant'
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
    platformAppId:
      type: apiKey
      in: header
      name: X-CANAL-APP-ID
    platformAppToken:
      type: apiKey
      in: header
      name: X-CANAL-APP-TOKEN