Products API
The Carriyo Products API manages your product catalogue. Products are referenced by shipments, orders, returns, and inventory, so keeping the catalogue up to date keeps downstream data accurate.
Products
The Products resource represents items in your catalogue. Products are scoped to a merchant within your tenant and may be referenced by shipments, orders, returns, and inventory records.
Identifiers
Carriyo supports three ways to identify a product:
product_id: assigned by Carriyo when the product is created. Unique within a tenant. Use this when you have stored the Carriyo identifier alongside your own.product_ref: your reference for the product. We recommend keeping this unique within a merchant so it can be used as a reliable lookup key.sku: stock keeping unit. SKU is not enforced as unique, so lookups by SKU return an array of matching products.
Listing products
The GET /products endpoint is backed by Elasticsearch and supports:
- Free-text search across
sku,barcode,product_ref,description,hs_code,manufacturer_id, andmaterial_composition - Filters on
merchant,product_id,sku,barcode,product_ref, andstatus. Repeat any filter parameter to match multiple values. - Sorting by
sku,barcode,product_ref,description,hs_code, ormanufacturer_id, in ascending or descending direction - Pagination via
page(zero-indexed) andpage_size(max 250)
The response returns the matching page of products together with the total count, so you can drive paging UIs and report-style queries from the same endpoint.
Cross-border attributes
For shipments crossing customs borders, certain product attributes are typically required by carriers and customs:
hs_code: Harmonised System code for customs classification.origin_country: ISO 3166-1 alpha-2 country code.material_composition: for example "100% cotton"; relevant for textile classification.dangerous_goods: settrueif the product is classified as dangerous goods.battery: supplymaterial_typeandpacking_typeif the product contains batteries.manufacturer_id: manufacturer reference, required by some carriers in certain destinations.
Custom metadata
Use carriyo_metadata to attach arbitrary name/value pairs to a product when the standard fields don't capture the attribute you need. These values are preserved in the product record and can be referenced in automation rules and downstream integrations.
Bulk operations
For larger catalogues, two bulk operations are available:
- Bulk create/update (
POST /products/{merchant_id}/bulk/import): submit up to 500 products in a single request. Each item is processed independently and the response reports per-item outcomes. - Bulk delete (
DELETE /products/{merchant_id}/bulk): deletes all products for the merchant. Large catalogues may require multiple invocations; themore_items_availableflag in the response indicates whether to re-invoke.
11 operations · 0 objects
/productsList products
Returns a paginated list of products that match the supplied filter, sort, and search criteria.
The list endpoint is backed by Elasticsearch and supports free-text search across product
fields such as description, sku, barcode, product_ref, hs_code, manufacturer_id,
and material_composition.
Filters are applied as exact term matches. Most filters can be repeated to match any of the supplied values.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| search_string | string | No | Free-text search applied across `sku`, `barcode`, `product_ref`, `description`, `hs_code`, `manufacturer_id`, and `material_composition`. |
| merchant | string | No | Filter by merchant. Repeat the parameter to match multiple merchants. |
| product_id | string | No | Filter by Carriyo product ID. Repeat the parameter to match multiple values. |
| sku | string | No | Filter by SKU. Repeat the parameter to match multiple values. |
| barcode | string | No | Filter by barcode. Repeat the parameter to match multiple values. |
| product_ref | string | No | Filter by your reference (`product_ref`). Repeat the parameter to match multiple values. |
| status | string | No | Filter by product status. |
| sort_by | string | No | Field to sort the results by. |
| sort_direction | string | No | Sort direction. Defaults to `desc`. |
| page | integer | No | Page number, starting from 0. Defaults to 0. |
| page_size | integer | No | Number of results per page. Defaults to 10. Maximum 250. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
Need the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}Create product
Creates a new product for the specified merchant. Either sku or product_ref is required
to identify the product within your catalogue.
Returns the created product, including the Carriyo-assigned product_id.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Request body
application/jsonSchema: product-requestrequiredResponses
product-responseNeed the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}Search products by SKU
Returns all products belonging to the merchant that match the supplied sku. SKU is not
guaranteed to be unique within a merchant, so this endpoint returns an array.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| sku | string | Yes | The SKU to look up. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
Need the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}/{product_id}Get product by ID
Retrieves a single product by its Carriyo product_id.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
| product_id | string | Yes | The Carriyo-assigned product identifier. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
product-responseNeed the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}/{product_id}Update product
Replace the full product record. All fields are overwritten with the values in the request body; fields omitted from the body are cleared.
Use PATCH to update only a subset of fields.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
| product_id | string | Yes | The Carriyo-assigned product identifier. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Request body
application/jsonSchema: product-requestrequiredResponses
product-responseNeed the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}/{product_id}Patch product
Partially updates the product record. Only fields supplied in the request body are updated; omitted fields retain their current values.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
| product_id | string | Yes | The Carriyo-assigned product identifier. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Request body
application/jsonSchema: product-requestrequiredResponses
product-responseNeed the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}/{product_id}Delete product
Deletes the product. The returned record reflects the product's state at the time of deletion.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
| product_id | string | Yes | The Carriyo-assigned product identifier. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
product-responseNeed the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}/product-ref/{product_ref}Get product by product ref
Retrieves a single product by your product_ref.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
| product_ref | string | Yes | Your reference for the product (`product_ref`). |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
product-responseNeed the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}/product-ref/{product_ref}Delete product by product ref
Deletes the product identified by your product_ref.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
| product_ref | string | Yes | Your reference for the product (`product_ref`). |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
product-responseNeed the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}/bulk/importBulk create products
Create or update multiple products in a single request. Each item in the request array is
processed independently; the response array reports the outcome (accepted or rejected)
for each item, in the same order.
Limits
- Maximum 500 items per request.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| Content-Type | application/json | Yes | Media type of the request body. |
Request body
application/jsonrequiredResponses
Need the full machine-readable spec? Download the OpenAPI document →
/products/{merchant_id}/bulkBulk delete products
Deletes all products for the specified merchant.
Warning: This operation is destructive and cannot be undone. The response indicates how many records were deleted, attempted, and failed, and whether more items remain. Large catalogues may require multiple invocations to fully clear.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
| merchant_id | string | Yes | The merchant identifier the product belongs to. |
Headers
| Name | Value | Required | Description |
|---|---|---|---|
| Authorization | Bearer YOUR-ACCESS-TOKEN | Yes | OAuth 2.0 bearer token obtained from `POST /oauth/token`. |
| x-api-key | YOUR-API-KEY | Yes | Your tenant's API key, issued in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
| tenant-id | YOUR-TENANT-ID | Yes | Your Carriyo tenant ID, shown in the Carriyo Dashboard. Required on every request except `POST /oauth/token`. |
Responses
bulk-delete-responseNeed the full machine-readable spec? Download the OpenAPI document →