Developer Reference

OmniCommerce API Documentation

Server-rendered API reference generated from our OpenAPI contract. This page is crawlable and agent-readable without client-side docs generators.

Base URL

https://omnicommerce.sg

OpenAPI Source

Raw machine-readable schema used for this reference.

Coverage

64 operations across 12 API domains.

Redocly Reference

Interactive OpenAPI reference with schema navigation.

Quick Navigation

Protocol docs and discovery endpoints for developers and agents.

Endpoints

Jump directly to an endpoint in the reference below.

Agentic Checkout

6 endpoints
POST/api/v1/checkout-sessions
Bearer Auth

Create Agentic Checkout Session

Create a merchant-fulfilled checkout session, reserve inventory, and return rail-specific payment requirements. Requires an OAuth client token with `checkout:write`.

Parameters

Name
In
Type
Required
Description
Idempotency-Key
header
string
No
Optional idempotency key for create retries.

Request Body

application/json

Required: Yes

{ organizationId?: string; paymentRail?: acp_stripe | x402; items: { productId: string; quantity: integer }[]; buyer?: { name?: string; email?: string; phone?: string }, ... }

Responses

Status
Description
Content Types
201
Checkout session created with inventory reserved.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
409
Insufficient inventory
-
500
Internal Server Error
-
GET/api/v1/checkout-sessions/{sessionId}
Bearer Auth

Get Agentic Checkout Session

Fetch the current checkout session, cart items, totals, payment requirements, and linked order when completed.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for OAuth clients that can access multiple organizations.

Responses

Status
Description
Content Types
200
Checkout session found.
application/json
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
500
Internal Server Error
-
PUT/api/v1/checkout-sessions/{sessionId}
Bearer Auth

Replace Agentic Checkout Session Fields

UCP-compatible update method for cart/contact fields. The current implementation applies provided fields and leaves omitted fields unchanged. Requires `checkout:write`.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for OAuth clients that can access multiple organizations.

Request Body

application/json

Required: Yes

{ paymentRail?: acp_stripe | x402; items?: { productId: string; quantity: integer }[]; buyer?: { name?: string; email?: string; phone?: string }; shippingAddress?: { name?: string; line1?: string; line2?: string; city?: string, ... }, ... }

Responses

Status
Description
Content Types
200
Checkout session updated.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
409
Terminal session or insufficient inventory
-
500
Internal Server Error
-
PATCH/api/v1/checkout-sessions/{sessionId}
Bearer Auth

Update Agentic Checkout Session

Update cart/contact fields, recompute totals, and refresh inventory reservations before payment. Requires `checkout:write`.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for OAuth clients that can access multiple organizations.

Request Body

application/json

Required: Yes

{ paymentRail?: acp_stripe | x402; items?: { productId: string; quantity: integer }[]; buyer?: { name?: string; email?: string; phone?: string }; shippingAddress?: { name?: string; line1?: string; line2?: string; city?: string, ... }, ... }

Responses

Status
Description
Content Types
200
Checkout session updated.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
409
Terminal session or insufficient inventory
-
500
Internal Server Error
-
POST/api/v1/checkout-sessions/{sessionId}/cancel
Bearer Auth

Cancel Agentic Checkout Session

Cancel a ready-for-payment checkout session and release reserved inventory. This operation is exposed for UCP REST clients and requires `checkout:write`.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for OAuth clients that can access multiple organizations.

Responses

Status
Description
Content Types
200
Checkout session cancelled.
application/json
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
409
Terminal checkout session
-
500
Internal Server Error
-
POST/api/v1/checkout-sessions/{sessionId}/complete
Bearer Auth

Complete Agentic Checkout Session

Settle the selected rail and create a native `agentic` order. Settlement failures return 402 and leave the session in `ready_for_payment`.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for OAuth clients that can access multiple organizations.
Idempotency-Key
header
string
No
Optional idempotency key for completion retries.

Request Body

application/json

Required: Yes

{ idempotencyKey?: string; paymentProof: object }

Responses

Status
Description
Content Types
200
Checkout completed and native order created.
application/json
400
Bad Request
-
401
Unauthorized
-
402
Settlement failed; the checkout remains ready for payment.
application/json
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
409
Terminal or expired checkout session
-
500
Internal Server Error
-

Commerce

2 endpoints
GET/api
Public

API Root

Public API discovery root. Merchant payments are handled by organization-scoped checkout session endpoints.

Responses

Status
Description
Content Types
200
API root metadata.
application/json
429
Too many requests.
-
GET/api/v1
Public

API v1 Root

Public API v1 discovery root. Merchant payments are handled by organization-scoped checkout session endpoints.

Responses

Status
Description
Content Types
200
API v1 root metadata.
application/json
429
Too many requests.
-

Developer Platform

11 endpoints
POST/api/v1/evaluate
Bearer Auth

Evaluate SKU Readiness

Score a persisted product or inline SKU payload for agentic commerce readiness, engine eligibility, and recommended fixes.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
POST/api/v1/images/ghost-mannequin
Bearer Auth

Generate Ghost Mannequin Image

Remove the visible mannequin from a product photo and return the generated image URL. The source image must be an HTTP(S) URL; data URIs are rejected. Authenticate with an OmniCommerce API key that has the `catalog:enrich` scope.

Request Body

application/json

Required: Yes

{ imageUrl: string; productTitle?: string; categoryName?: string; categoryId?: string }

Responses

Status
Description
Content Types
200
Ghost mannequin image generated.
application/json
400
Bad Request - invalid JSON or imageUrl
-
401
Unauthorized
-
403
Forbidden - missing catalog:enrich scope
-
502
Image generation failed or the generated image could not be retrieved.
-
GET/api/v1/jobs/{jobId}
Bearer Auth

Get Developer Job Status

Fetch shared async status for developer-platform operations, including product workflow jobs, bulk CSV import jobs, Look generation jobs, import jobs, enrichment jobs, and sync jobs.

Parameters

Name
In
Type
Required
Description
jobId
path
string
Yes
-
organizationId
query
string
No
Required for session-authenticated requests; derived from API keys.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
POST/api/v1/jobs/{jobId}/cancel
Bearer Auth

Cancel Developer Job

Request cancellation for a running or pending developer job. Supports product workflow jobs returned by POST /api/v1/products, bulk CSV import jobs returned by POST /api/v1/products/bulk-import, and Look generation jobs returned by POST /api/v1/looks. Completed or failed jobs are returned with their current terminal status.

Parameters

Name
In
Type
Required
Description
jobId
path
string
Yes
-

Request Body

application/json

Required: No

{ organizationId?: string }

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
POST/api/v1/manage-product-category/recommend
Bearer Auth

Recommend Marketplace Product Categories

Suggest best-fit marketplace categories and category attribute values for a persisted product using semantic taxonomy search. Authenticate with an OmniCommerce API key as `Authorization: Bearer omni_sk_...`.

Request Body

application/json

Required: Yes

{ organizationId?: string; productId: string; targets: { marketplace: string; country?: string }[]; query?: string, ... }

Responses

Status
Description
Content Types
200
Semantic category recommendations with attribute metadata and suggested attribute values.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden
-
404
Product Not Found
-
422
Product has no searchable category text
-
500
Internal Server Error
-
GET/api/v1/marketplaces/connected
Bearer Auth

List Connected Marketplaces

List connected marketplace stores for the authenticated organization. Results are scoped to the API key organization unless `organizationId` is supplied for session-authenticated calls.

Parameters

Name
In
Type
Required
Description
organizationId
query
string
No
Optional for API-key requests; required for session-authenticated requests across multiple organizations.
marketplace
query
shopee | lazada | tiktok
No
Optional marketplace filter.
country
query
string
No
Optional country filter, for example singapore, malaysia, sg, or my.

Responses

Status
Description
Content Types
200
Connected marketplace stores for the organization.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden
-
500
Internal Server Error
-
POST/api/v1/monitor
Bearer Auth

Run AI Shelf Share Monitor

Queue AI Shelf Share replay/monitoring for a product, query, or organization catalog.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
POST/api/v1/products/{productId}/publish
Bearer Auth

Publish Product

Queue marketplace publish jobs for a product by productId. OmniCommerce publishes to the marketplaces already enabled on the product and uses the product's store selection or a single/default connected store.

Parameters

Name
In
Type
Required
Description
productId
path
string
Yes
OmniCommerce product ID to publish.

Request Body

application/json

Required: No

{ organizationId?: string; visibility?: live | draft }

Responses

Status
Description
Content Types
202
Publish jobs queued.
application/json
400
Bad Request - invalid payload, marketplace not enabled, or store selection required
-
401
Unauthorized
-
403
Forbidden
-
404
Product Not Found
-
500
Internal Server Error
-
POST/api/v1/sync
Bearer Auth

Sync Product Commercial Fields

Update price, sale price, or stock quantity in OmniCommerce and queue marketplace sync workers where applicable.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
GET/api/v1/webhooks
Bearer Auth

List Developer Webhooks

List configured developer webhook subscriptions for the authenticated organization.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
POST/api/v1/webhooks
Bearer Auth

Create Developer Webhook

Create a developer webhook subscription for product, order, look, and related commerce events.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-

Looks

3 endpoints
GET/api/v1/looks
Bearer Auth

List Looks

List AI-styled product Looks for the authenticated organization, newest first. Use query parameters for search, status filtering, and pagination.

Parameters

Name
In
Type
Required
Description
q
query
string
No
Search by look title, city, style, or generated prompt.
status
query
draft | published
No
Filter by look status.
limit
query
integer
No
Result limit per page. Defaults to 24; maximum is 50.
offset
query
integer
No
Zero-based pagination offset. Defaults to 0.

Responses

Status
Description
Content Types
200
Looks page for the authenticated organization.
application/json
401
Unauthorized - Invalid or missing Bearer token
-
403
Forbidden - Token not authorized for this organization
-
500
Internal Server Error
-
POST/api/v1/looks
Bearer Auth

Create Look

Create a Look from existing catalog products and queue AI image generation for a fast preview. The response is asynchronous: poll `GET /api/v1/jobs/{jobId}?organizationId={organizationId}` until the `look_...` job completes, then fetch the generated Look with `GET /api/v1/looks/{lookId}`.

Request Body

application/json

Required: Yes

{ organizationId?: string; title?: string; productIds: string[]; subject?: string, ... }

Responses

Status
Description
Content Types
202
Look record created and preview image generation queued.
application/json
400
Bad Request - invalid payload, duplicate product IDs, or products not owned by the organization
-
401
Unauthorized
-
403
Forbidden - missing catalog:write scope or organization access
-
500
Internal Server Error
-
GET/api/v1/looks/{lookId}
Bearer Auth

Get Look

Fetch a single Look by ID, including the generated hero image URL and the shoppable product cards used in the Look.

Parameters

Name
In
Type
Required
Description
lookId
path
string
Yes
Look UUID.

Responses

Status
Description
Content Types
200
Look detail.
application/json
401
Unauthorized - Invalid or missing Bearer token
-
403
Forbidden - Token not authorized for this organization
-
404
Look Not Found
-
500
Internal Server Error
-

Oauth

2 endpoints
POST/api/v1/oauth/revoke
Public

Revoke Access Token

Revoke an OAuth bearer access token using client_secret_post authentication.

Request Body

application/x-www-form-urlencoded

Required: Yes

{ token: string; token_type_hint?: access_token; client_id: string; client_secret: string }

application/json

Required: Yes

{ token: string; token_type_hint?: access_token; client_id: string; client_secret: string }

Responses

Status
Description
Content Types
200
Token revocation accepted. The response body is intentionally empty.
-
400
Bad Request - Missing or invalid parameters
application/json
401
Unauthorized - Invalid client credentials
application/json
500
Internal Server Error
-
POST/api/v1/oauth/token
Public

Get Access Token

Exchange client credentials for an access token using OAuth 2.0 client_credentials grant. Tokens are valid for 1 hour.

Request Body

application/x-www-form-urlencoded

Required: Yes

{ grant_type: client_credentials; client_id: string; client_secret: string }

application/json

Required: Yes

{ grant_type: client_credentials; client_id: string; client_secret: string }

Responses

Status
Description
Content Types
200
Token issued successfully
application/json
400
Bad Request - Missing or invalid parameters
application/json
401
Unauthorized - Invalid client credentials
application/json

Orders

3 endpoints
GET/api/v1/orders
Bearer Auth

List Orders

List orders for the authenticated organization using the same filters, sorting, and pagination semantics as the workspace Orders listing page. Requires `orders:read`.

Parameters

Name
In
Type
Required
Description
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.
q
query
string
No
Search order number, external order ID, buyer fields, and line-item product/SKU fields.
status
query
to_ship | shipped | completed | pending | return | canceled
No
Filter by normalized order status group.
marketplace
query
string
No
Comma-separated marketplace platforms (for example `shopee,lazada,tiktok`).
country
query
string
No
Comma-separated normalized country codes.
store
query
string
No
Comma-separated marketplace account IDs.
sortBy
query
string
No
Comma-separated sort tokens. Supports multi-sort up to six tokens. Aliases: `latest` -> `updated_desc`, `oldest` -> `updated_asc`.
dateFrom
query
string
No
Inclusive lower bound on order created date (`YYYY-MM-DD`).
dateTo
query
string
No
Inclusive upper bound on order created date (`YYYY-MM-DD`).
limit
query
integer
No
Result limit per page. Values above 50 are clamped silently. Defaults to 20.
offset
query
integer
No
Zero-based pagination offset. Use `pagination.nextOffset` from the previous response to page forward.

Responses

Status
Description
Content Types
200
Orders page returned.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `orders:read` scope
-
429
Rate limit exceeded
-
500
Internal Server Error
-
POST/api/v1/orders
Bearer Auth

Create Order

Create a native `agentic` order with line items. Supports `status`, `currency`, `totalAmount`, and per-line `price` / `unitPrice` / `paidPrice` / `costPrice`. When `productId` is provided, missing price/currency may resolve from the product catalog; explicit `costPrice` upserts `product_data.costPrice` and is snapshotted on the line. Omitted `costPrice` never clears existing product cost. Reuses the same upsert path as agentic checkout completion. Requires `orders:write`. Re-posting the same `externalOrderId` updates the existing order instead of creating a duplicate.

Request Body

application/json

Required: Yes

{ organizationId?: string; externalOrderId?: string; externalOrderNumber?: string; platform?: agentic, ... }

Responses

Status
Description
Content Types
200
Existing order updated for the same platform/externalOrderId pair.
application/json
201
Order created.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `orders:write` scope
-
429
Rate limit exceeded
-
500
Internal Server Error
-
PATCH/api/v1/orders/{orderId}
Bearer Auth

Update Order

Update a native **agentic** order. Supports external order identifiers, status, currency, totalAmount, shippingFee, discountAmount, metadata, and partial line items (including externalOrderItemId, price / unitPrice / paidPrice / costPrice / currency / status / quantity). Requires `orders:write`. Marketplace orders (Shopee, Lazada, TikTok, Shopify) are rejected with HTTP 409 — those fields are marketplace-owned. Emits `order.status.changed` when status changes and `order.updated` for other field changes.

Parameters

Name
In
Type
Required
Description
orderId
path
string
Yes
OmniCommerce order UUID returned from create or list.

Request Body

application/json

Required: Yes

{ organizationId?: string; externalOrderId?: string; externalOrderNumber?: string; status?: pending | to_ship | shipped | completed | return | canceled, ... }

Responses

Status
Description
Content Types
200
Order updated (or unchanged no-op).
application/json
400
Bad Request — invalid status or payload
-
401
Unauthorized
-
403
Forbidden or missing `orders:write` scope
-
404
Order not found for this organization
-
409
Updates are not supported for marketplace-owned orders, or an external identifier is already in use
-
429
Rate limit exceeded
-
500
Internal Server Error
-

Organizations

1 endpoints
POST/api/v1/organizations
Bearer Auth

Create Organization

Create a new organization for the signed-in user. This endpoint uses first-party session authentication because API keys are scoped to an existing organization.

Request Body

application/json

Required: Yes

{ name: string; keepCurrentActiveOrganization?: boolean }

Responses

Status
Description
Content Types
201
Organization created
application/json
400
Bad Request - Invalid organization name or JSON
-
401
Unauthorized - Sign in is required
-
500
Internal Server Error
-

Price Books

6 endpoints
GET/api/v1/price-books
Bearer Auth

List Price Book Rules

List marketplace price book rules for the authenticated organization. Rules apply markup percent to canonical list price at publish/catalog time by platform (and optional store/country). Requires `price_books:read`.

Parameters

Name
In
Type
Required
Description
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.
platform
query
shopee | lazada | tiktok | shopify | whatsapp
No
Filter by marketplace platform: `shopee`, `lazada`, `tiktok`, `shopify`, or `whatsapp`.
enabledOnly
query
boolean
No
When `true`, return only enabled rules.

Responses

Status
Description
Content Types
200
Price book rules returned.
application/json
400
Bad Request (invalid platform filter)
-
401
Unauthorized
-
403
Forbidden or missing `price_books:read` scope
-
429
Rate limit exceeded
-
500
Internal Server Error
-
POST/api/v1/price-books
Bearer Auth

Create Price Book Rule

Create a marketplace price book rule that marks up canonical list price for a platform (optional store/country). Does not change Omni product prices. Requires `price_books:write`.

Request Body

application/json

Required: Yes

{ organizationId?: string; platform: shopee | lazada | tiktok | shopify | whatsapp; storeId?: string | null; country?: string | null, ... }

Responses

Status
Description
Content Types
201
Price book rule created.
application/json
400
Bad Request (invalid payload, markup range, or duplicate platform/store/country scope)
-
401
Unauthorized
-
403
Forbidden or missing `price_books:write` scope
-
429
Rate limit exceeded
-
500
Internal Server Error
-
GET/api/v1/price-books/{ruleId}
Bearer Auth

Get Price Book Rule

Fetch one marketplace price book rule by ID. Requires `price_books:read`.

Parameters

Name
In
Type
Required
Description
ruleId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Responses

Status
Description
Content Types
200
Price book rule returned.
application/json
401
Unauthorized
-
403
Forbidden or missing `price_books:read` scope
-
404
Price book rule not found
-
500
Internal Server Error
-
PATCH/api/v1/price-books/{ruleId}
Bearer Auth

Update Price Book Rule

Update store, country, markup, rounding, currency, or enabled flag for a price book rule. Platform cannot be changed; create a new rule instead. Requires `price_books:write`.

Parameters

Name
In
Type
Required
Description
ruleId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Request Body

application/json

Required: Yes

{ organizationId?: string; storeId?: string | null; country?: string | null; marginValue?: number, ... }

Responses

Status
Description
Content Types
200
Price book rule updated.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `price_books:write` scope
-
404
Price book rule not found
-
500
Internal Server Error
-
DELETE/api/v1/price-books/{ruleId}
Bearer Auth

Delete Price Book Rule

Delete a marketplace price book rule by ID. Requires `price_books:write`.

Parameters

Name
In
Type
Required
Description
ruleId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Responses

Status
Description
Content Types
200
Price book rule deleted.
application/json
401
Unauthorized
-
403
Forbidden or missing `price_books:write` scope
-
404
Price book rule not found
-
500
Internal Server Error
-
POST/api/v1/price-books/preview
Bearer Auth

Preview Channel List Price

Compute channel list price from a canonical list price using matching enabled rules (or a forced ruleId). Requires `price_books:read`.

Request Body

application/json

Required: Yes

{ organizationId?: string; platform: shopee | lazada | tiktok | shopify | whatsapp; listPrice: number; storeId?: string | null, ... }

Responses

Status
Description
Content Types
200
Preview computed.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `price_books:read` scope
-
404
Price book rule not found (when ruleId is set)
-
500
Internal Server Error
-

Products

6 endpoints
GET/api/v1/products
Bearer Auth

List Products

List products for the authenticated organization with optional filters and pagination. Supports API key Bearer token authentication.

Parameters

Name
In
Type
Required
Description
status
query
draft | active | archived | deleted
No
Filter by product status.
marketplace
query
shopee | lazada | tiktok
No
Filter by enabled marketplace.
country
query
string
No
Filter by marketplace country (e.g., Singapore, Malaysia).
q
query
string
No
Search query for product name or SKU.
minPrice
query
number
No
Minimum price filter.
maxPrice
query
number
No
Maximum price filter.
sortBy
query
updatedAt | createdAt | name | price
No
Sort order for results.
limit
query
integer
No
Result limit per page. Values above the cap are clamped silently; the applied value is returned in `pagination.limit`. Defaults to 20.
offset
query
integer
No
Zero-based pagination offset. Use `pagination.nextOffset` from the previous response to page forward. Defaults to 0.

Responses

Status
Description
Content Types
200
Success
application/json
401
Unauthorized - Invalid or missing Bearer token
-
403
Forbidden - Token not authorized for this organization
-
500
Internal Server Error
-
POST/api/v1/products
Bearer Auth

Create and Enrich Product

Queue a single-product create/enrich workflow for the authenticated organization. The request mirrors bulk product import for one product: `product` contains developer-supplied fields, arbitrary extra fields are preserved for enrichment context, SKU is the unique upsert identifier, externally hosted HTTP(S) images are mirrored to managed R2 storage, and the API returns a job ID to poll with GET /api/v1/jobs/{jobId}. `targetMarketplaces` and `targetCountries` are optional; product creation and enrichment can run without marketplace publishing targets.

Request Body

application/json

Required: Yes

{ product: { id?: string; sku: string; title: string; name?: string, ... }; variants?: { sku?: string; price?: object; inventory?: object; variationAttributes?: object, ... }[]; variationSchema?: object; targetMarketplaces?: shopee | lazada | tiktok[], ... }

Responses

Status
Description
Content Types
202
Product create/enrich workflow accepted
application/json
400
Bad Request - Invalid product data
-
401
Unauthorized - Invalid or missing Bearer token
-
403
Forbidden - Token not authorized for this organization
-
500
Internal Server Error
-
GET/api/v1/products/{productId}
Bearer Auth

Get Product

Retrieve a single product by ID for the authenticated organization. Supports API key Bearer token authentication. The response includes generated Agentic Commerce Optimization (ACO) profile metadata, FAQs, localization content, intent queries, cultural notes, signals, sources, and claims when present.

Parameters

Name
In
Type
Required
Description
productId
path
string
Yes
-

Responses

Status
Description
Content Types
200
Success
application/json
401
Unauthorized - Invalid or missing Bearer token
-
403
Forbidden - Token not authorized for this organization
-
404
Product not found
-
500
Internal Server Error
-
PATCH/api/v1/products/{productId}
Bearer Auth

Update Product

Update an existing product by ID. Only provided fields will be updated. Supports API key Bearer token authentication.

Parameters

Name
In
Type
Required
Description
productId
path
string
Yes
-

Request Body

application/json

Required: Yes

{ name?: string; description?: string; sku?: string; brand?: string, ... }

Responses

Status
Description
Content Types
200
Product updated successfully
application/json
400
Bad Request - Invalid update data
-
401
Unauthorized - Invalid or missing Bearer token
-
403
Forbidden - Token not authorized for this organization
-
404
Product not found
-
500
Internal Server Error
-
DELETE/api/v1/products/{productId}
Bearer Auth

Delete Product

Soft-delete a product by ID. The product will be marked as deleted but not permanently removed. Call again on a deleted product to permanently delete it. Supports API key Bearer token authentication.

Parameters

Name
In
Type
Required
Description
productId
path
string
Yes
-

Responses

Status
Description
Content Types
200
Product deleted successfully
application/json
401
Unauthorized - Invalid or missing Bearer token
-
403
Forbidden - Token not authorized for this organization
-
404
Product not found
-
500
Internal Server Error
-
POST/api/v1/products/bulk-import
Bearer Auth

Bulk Import Products from CSV

Queue a bulk CSV product import for the authenticated organization. Upload a CSV file with multipart/form-data or send JSON with inline `csvText` or a stored `documentId`. The API creates import rows, queues enrichment and product writes through Inngest, and returns a `bulk_...` job ID to poll with GET /api/v1/jobs/{jobId}. Cancel in-flight imports with POST /api/v1/jobs/{jobId}/cancel.

Request Body

multipart/form-data

Required: Yes

{ file: string; organizationId?: string; fileName?: string; targetMarketplaces: string | string[], ... }

application/json

Required: Yes

{ organizationId?: string; csvText?: string; documentId?: string; fileName?: string, ... }

Responses

Status
Description
Content Types
202
Bulk import workflow accepted
application/json
400
Bad Request - Invalid CSV or payload
-
401
Unauthorized - Invalid or missing Bearer token
-
403
Forbidden - Token not authorized for this organization
-
413
Payload Too Large - CSV upload exceeds limit
-
500
Internal Server Error
-

Promotions

9 endpoints
GET/api/v1/promotions
Bearer Auth

List Promotions

List central promotions for the authenticated organization with filters and offset pagination matching the workspace Promotions listing. Requires `promotions:read`.

Parameters

Name
In
Type
Required
Description
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.
q
query
string
No
Search promotion name.
status
query
all | draft | scheduled | active | paused | ended | archived
No
Effective status filter: `all`, `draft`, `scheduled`, `active`, `paused`, `ended`, or `archived`.
marketplace
query
string
No
Comma-separated marketplaces, for example `shopee,lazada,tiktok,shopify`.
store
query
string
No
Comma-separated promotion store keys (`marketplace:country:storeId`).
sortBy
query
createdAt | name | startsAt | status
No
Sort field.
sortDir
query
asc | desc
No
Sort direction.
limit
query
integer
No
Page size. Default 20, max 50.
offset
query
integer
No
Zero-based pagination offset.

Responses

Status
Description
Content Types
200
Promotions page returned.
application/json
401
Unauthorized
-
403
Forbidden or missing `promotions:read` scope
-
429
Rate limit exceeded
-
500
Internal Server Error
-
POST/api/v1/promotions
Bearer Auth

Create Promotion

Create a central promotion targeting connected stores. Requires `promotions:write`. Fixed-amount discounts resolve currency from the selected store countries.

Request Body

application/json

Required: Yes

{ organizationId?: string; name: string; description?: string | null; discountType: percentage | fixed_amount, ... }

Responses

Status
Description
Content Types
201
Promotion created.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `promotions:write` scope
-
429
Rate limit exceeded
-
500
Internal Server Error
-
GET/api/v1/promotions/{promotionId}
Bearer Auth

Get Promotion

Fetch one promotion by ID, including effective status. Requires `promotions:read`.

Parameters

Name
In
Type
Required
Description
promotionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Responses

Status
Description
Content Types
200
Promotion returned.
application/json
401
Unauthorized
-
403
Forbidden or missing `promotions:read` scope
-
404
Promotion not found
-
500
Internal Server Error
-
PATCH/api/v1/promotions/{promotionId}
Bearer Auth

Update Promotion

Update promotion fields (name, discount, schedule, status, stores). Requires `promotions:write`.

Parameters

Name
In
Type
Required
Description
promotionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Request Body

application/json

Required: Yes

{ organizationId?: string; name?: string; description?: string | null; discountType?: percentage | fixed_amount, ... }

Responses

Status
Description
Content Types
200
Promotion updated.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `promotions:write` scope
-
404
Promotion not found
-
500
Internal Server Error
-
DELETE/api/v1/promotions/{promotionId}
Bearer Auth

Delete Promotion

Delete a promotion by ID. Requires `promotions:write`.

Parameters

Name
In
Type
Required
Description
promotionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Responses

Status
Description
Content Types
200
Promotion deleted.
application/json
401
Unauthorized
-
403
Forbidden or missing `promotions:write` scope
-
404
Promotion not found
-
500
Internal Server Error
-
GET/api/v1/promotions/{promotionId}/products
Bearer Auth

List Promotion Assignments

List products assigned to a promotion. Requires `promotions:read`.

Parameters

Name
In
Type
Required
Description
promotionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Responses

Status
Description
Content Types
200
Assignments returned.
application/json
401
Unauthorized
-
403
Forbidden or missing `promotions:read` scope
-
500
Internal Server Error
-
POST/api/v1/promotions/{promotionId}/products
Bearer Auth

Assign Products to Promotion

Assign one or more products to a promotion. Creates pending marketplace sync rows; call sync after assign. Requires `promotions:write`.

Parameters

Name
In
Type
Required
Description
promotionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Request Body

application/json

Required: Yes

{ organizationId?: string; productIds: string[]; variantSku?: string | null; priority?: integer }

Responses

Status
Description
Content Types
201
Products assigned.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `promotions:write` scope
-
500
Internal Server Error
-
DELETE/api/v1/promotions/{promotionId}/products
Bearer Auth

Unassign Products from Promotion

Remove product assignments and queue marketplace teardown. Requires `promotions:write`.

Parameters

Name
In
Type
Required
Description
promotionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Request Body

application/json

Required: Yes

{ organizationId?: string; productIds: string[]; variantSku?: string | null }

Responses

Status
Description
Content Types
200
Products unassigned.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `promotions:write` scope
-
500
Internal Server Error
-
POST/api/v1/promotions/{promotionId}/sync
Bearer Auth

Sync Promotion to Marketplaces

Queue marketplace push for assigned products (Shopee discount, Lazada voucher, TikTok activity, Shopify automatic discount). Requires `promotions:write`.

Parameters

Name
In
Type
Required
Description
promotionId
path
string
Yes
-
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Request Body

application/json

Required: Yes

{ organizationId?: string; marketplace?: shopee | lazada | tiktok | shopify; productIds?: string[] }

Responses

Status
Description
Content Types
202
Sync queued.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or missing `promotions:write` scope
-
500
Internal Server Error
-

Public Agent

8 endpoints
GET/api/v1/compare
Public

Compare Public Products

Compare 2 to 10 public products side-by-side across price, ACO readiness, marketplace coverage, and inventory.

Parameters

Name
In
Type
Required
Description
products
query
string
Yes
Comma-separated product IDs (2..10).
language
query
en | th | id | ms | vi | tl
No
Localization language. Defaults to en.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
GET/api/v1/directory
Public

List Public Merchants

Discover merchants with public products available through OmniCommerce's public agent APIs.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
GET/api/v1/feed/{domain}/llms.txt
Public

Get Merchant LLM Feed

Return a plain-text, LLM-optimized merchant feed keyed by website domain.

Parameters

Name
In
Type
Required
Description
domain
path
string
Yes
-
limit
query
integer
No
Maximum number of merchant products to include in the feed.

Responses

Status
Description
Content Types
200
Success
text/plain
404
Merchant feed not found
-
500
Internal Server Error
-
GET/api/v1/merchants/{merchantId}/manifest
Public

Get Public Merchant Manifest

Return machine-readable capability and endpoint metadata for a single public merchant.

Parameters

Name
In
Type
Required
Description
merchantId
path
string
Yes
-

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
GET/api/v1/merchants/{merchantId}/products
Public

List Public Merchant Products

Browse a single merchant's public product feed with optional marketplace and localization filters.

Parameters

Name
In
Type
Required
Description
merchantId
path
string
Yes
-
platform
query
shopee | lazada
No
Marketplace platform filter.
country
query
string
No
Marketplace country hint (example: sg).
language
query
en | th | id | ms | vi | tl
No
Localization language. Defaults to en.
limit
query
integer
No
Result limit (1..100). Defaults to 20.
offset
query
integer
No
Pagination offset (0..10000). Defaults to 0.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-
POST/api/v1/search
Public

Search Public Merchant Products

Search across all public merchants and products with optional merchant, pricing, stock, marketplace, and localization filters.

Parameters

Name
In
Type
Required
Description
q
query
string
No
Natural-language search query.
category
query
string
No
Optional category-name filter.
brand
query
string
No
Optional brand filter.
min_price
query
number
No
Minimum listed price.
max_price
query
number
No
Maximum listed price.
in_stock
query
boolean
No
Filter by stock availability.
merchant_ids
query
string
No
Comma-separated merchant IDs to scope the search.
sort
query
relevance | price_asc | price_desc
No
Sort order.
platform
query
shopee | lazada
No
Marketplace platform filter.
country
query
string
No
Marketplace country hint (example: sg).
language
query
en | th | id | ms | vi | tl
No
Localization language. Defaults to en.
include_intent
query
boolean
No
Include lightweight parsed query intent metadata.
limit
query
integer
No
Result limit (1..100). Defaults to 20.
offset
query
integer
No
Pagination offset (0..10000). Defaults to 0.

Responses

Status
Description
Content Types
200
Success
application/json
400
Bad Request
-
401
Unauthorized
-
402
Insufficient Credits
-
403
Forbidden
-
500
Internal Server Error
-

Ucp

7 endpoints
POST/ucp/v1/checkout-sessions
Bearer Auth

Create UCP Checkout Session

Create a UCP shopping checkout session against the authenticated organization. The facade translates UCP line items to native agentic checkout sessions, reserves inventory, and returns a UCP checkout resource. Requires `UCP-Agent` and OAuth `checkout:write`.

Parameters

Name
In
Type
Required
Description
UCP-Agent
header
string
Yes
UCP agent identity, for example `agent.example/1.0`.
Idempotency-Key
header
string
No
Optional idempotency key for safe retries.

Request Body

application/json

Required: Yes

{ line_items: { item: object; quantity: integer }[]; buyer?: object; fulfillment?: object; payment?: object, ... }

Responses

Status
Description
Content Types
201
UCP checkout session created.
application/json
400
Bad Request
application/json
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
409
Insufficient inventory
-
500
Internal Server Error
-
GET/ucp/v1/checkout-sessions/{sessionId}
Bearer Auth

Get UCP Checkout Session

Fetch the current UCP checkout resource for a native agentic checkout session. Requires `UCP-Agent` and bearer authentication.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
UCP-Agent
header
string
Yes
UCP agent identity, for example `agent.example/1.0`.
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Responses

Status
Description
Content Types
200
UCP checkout session found.
application/json
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
500
Internal Server Error
-
PUT/ucp/v1/checkout-sessions/{sessionId}
Bearer Auth

Replace UCP Checkout Session Fields

UCP-compatible update method. Current behavior matches PATCH: provided fields are applied and omitted fields remain unchanged. Requires `UCP-Agent` and OAuth `checkout:write`.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
UCP-Agent
header
string
Yes
UCP agent identity, for example `agent.example/1.0`.
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Request Body

application/json

Required: Yes

{ line_items?: { item: object; quantity: integer }[]; buyer?: object; fulfillment?: object; payment?: object, ... }

Responses

Status
Description
Content Types
200
UCP checkout session updated.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
409
Terminal session or insufficient inventory
-
500
Internal Server Error
-
PATCH/ucp/v1/checkout-sessions/{sessionId}
Bearer Auth

Update UCP Checkout Session

Update UCP cart, buyer, fulfillment, or payment rail fields. Provided fields are applied to the native checkout session and inventory reservations are refreshed when line items change. Requires `UCP-Agent` and OAuth `checkout:write`.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
UCP-Agent
header
string
Yes
UCP agent identity, for example `agent.example/1.0`.
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Request Body

application/json

Required: Yes

{ line_items?: { item: object; quantity: integer }[]; buyer?: object; fulfillment?: object; payment?: object, ... }

Responses

Status
Description
Content Types
200
UCP checkout session updated.
application/json
400
Bad Request
-
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
409
Terminal session or insufficient inventory
-
500
Internal Server Error
-
POST/ucp/v1/checkout-sessions/{sessionId}/cancel
Bearer Auth

Cancel UCP Checkout Session

Cancel a ready-for-payment UCP checkout session and release reserved inventory. Requires `UCP-Agent` and OAuth `checkout:write`.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
UCP-Agent
header
string
Yes
UCP agent identity, for example `agent.example/1.0`.
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Responses

Status
Description
Content Types
200
UCP checkout session cancelled.
application/json
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
409
Terminal checkout session
-
500
Internal Server Error
-
POST/ucp/v1/checkout-sessions/{sessionId}/complete
Bearer Auth

Complete UCP Checkout Session

Settle the selected rail and create a native `agentic` order. Settlement failures return HTTP 402 with the checkout still ready for payment. Requires `UCP-Agent` and OAuth `checkout:write`.

Parameters

Name
In
Type
Required
Description
sessionId
path
string
Yes
-
UCP-Agent
header
string
Yes
UCP agent identity, for example `agent.example/1.0`.
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.
Idempotency-Key
header
string
No
Optional idempotency key for safe retries.

Request Body

application/json

Required: Yes

{ idempotency_key?: string; paymentProof?: object; payment?: object }

Responses

Status
Description
Content Types
200
Checkout completed and native order created.
application/json
400
Bad Request
-
401
Unauthorized
-
402
Settlement failed; the checkout remains ready for payment.
application/json
403
Forbidden or checkout not enabled
-
404
Checkout session not found
-
409
Terminal or expired checkout session
-
500
Internal Server Error
-
GET/ucp/v1/orders/{orderId}
Bearer Auth

Get UCP Order

Fetch the native OmniCommerce order created by a completed UCP checkout session. Only `agentic` orders are exposed through this facade.

Parameters

Name
In
Type
Required
Description
orderId
path
string
Yes
-
UCP-Agent
header
string
Yes
UCP agent identity, for example `agent.example/1.0`.
organizationId
query
string
No
Optional organization scope for session-authenticated calls. OAuth client credentials resolve the organization from the token.

Responses

Status
Description
Content Types
200
UCP order found.
application/json
401
Unauthorized
-
403
Forbidden or checkout not enabled
-
404
Order not found
-
500
Internal Server Error
-