Skip to content
Menu
All API groups

Catalog

Products, reindex, attributes.

8 endpoints.

POST/v1/products/batch

Upsert and delete products (max 1,000 per call, idempotent)

Needs a key or a dashboard session

Parameters

NameInTypeRequiredDescription
Idempotency-Keyheaderstring | nullnoUnique per logical write (8-255 chars). Retries with the same key are safe. · pattern ^[A-Za-z0-9_\-:.]{8,255}$

Request body application/json ProductBatchRequest

NameTypeRequiredDescription
upsertProductIn-Input[]no
deletestring[]noProduct ids to delete.
replace_allbooleannoFull sync: after this batch (with sync_id complete), delete products not sent.default false
sync_idstring | nullnoGroups batches of one full sync.max length 64
sync_completebooleannodefault false

Responses

GET/v1/products

List products

Needs a key or a dashboard session

Parameters

NameInTypeRequiredDescription
cursorquerystring | nullnomax length 200
limitqueryintegernodefault 50 · min 1 · max 200
qquerystring | nullnomax length 200

Responses

GET/v1/products/{product_id}

Get one product

Needs a key or a dashboard session

Parameters

NameInTypeRequiredDescription
product_idpathstringyes

Responses

DELETE/v1/products/{product_id}

Delete one product

Needs a key or a dashboard session

Parameters

NameInTypeRequiredDescription
product_idpathstringyes
Idempotency-Keyheaderstring | nullnoUnique per logical write (8-255 chars). Retries with the same key are safe. · pattern ^[A-Za-z0-9_\-:.]{8,255}$

Responses

POST/v1/reindex

Rebuild the search index from stored products (zero downtime)

Needs a key or a dashboard session

Parameters

NameInTypeRequiredDescription
Idempotency-Keyheaderstring | nullnoUnique per logical write (8-255 chars). Retries with the same key are safe. · pattern ^[A-Za-z0-9_\-:.]{8,255}$

Request body application/json ReindexRequest

NameTypeRequiredDescription
mode"full" | "settings_only"nodefault "full"
reasonstring | nullnomax length 200

Responses

GET/v1/attributes

Attributes found in the catalog

Needs a key or a dashboard session

Responses

GET/v1/attributes/mapping

Attribute normalization mapping

Needs a key or a dashboard session

Responses

PUT/v1/attributes/mapping

Replace the attribute mapping (triggers a reindex)

Needs a key or a dashboard session

Parameters

NameInTypeRequiredDescription
Idempotency-Keyheaderstring | nullnoUnique per logical write (8-255 chars). Retries with the same key are safe. · pattern ^[A-Za-z0-9_\-:.]{8,255}$

Request body application/json AttributeMappingUpdate

NameTypeRequiredDescription
itemsAttributeMappingItem[]yes

Responses

Data shapes on this page

ProductBatchRequest

Upsert and delete in one call. Max 1,000 items in total. Same body again = no change (idempotent).

NameTypeRequiredDescription
upsertProductIn-Input[]no
deletestring[]noProduct ids to delete.
replace_allbooleannoFull sync: after this batch (with sync_id complete), delete products not sent.default false
sync_idstring | nullnoGroups batches of one full sync.max length 64
sync_completebooleannodefault false

ProductIn-Input

One product, as sent to POST /v1/products:batch (upsert).

NameTypeRequiredDescription
idstringyesThe store's own product id.min length 1 · max length 128
nameobjectyes
descriptionobjectno
brandstring | nullnomax length 200
modelstring | nullnomax length 200
skustring | nullnomax length 200
gtinstring | nullnomax length 50
urlstring | nullnomax length 2048
image_urlstring | nullnomax length 2048
pricenumber | stringyesmin 0
sale_pricenumber | string | nullnomin 0
currencystringyesISO 4217, e.g. USD, SAR, AED.pattern ^[A-Z]{3}$
in_stockbooleannodefault true
stock_qtyinteger | nullnomin 0
categoriesCategoryRef[]no
attributesmap<string, string | integer | number | boolean | string[]>noRaw attributes as the store has them, e.g. {'Size': 'M', 'Color': 'Black'}.
tagsstring[]no
popularitynumber | nullnoBusiness signal, opt-in.min 0
marginnumber | nullnoBusiness signal, opt-in. Never shown.
visiblebooleannodefault true
updated_atstring (date-time) | nullno
extraobjectnoOpaque. Returned as is.

CategoryRef

One category the product belongs to, with its full path from the root.

NameTypeRequiredDescription
idstringyesmin length 1 · max length 128
pathobject[]yesRoot first. Each level is {lang: name}.

ProductBatchResult

NameTypeRequiredDescription
upsertedintegeryes
unchangedintegeryes
deletedintegeryes
errorsItemError[]no
visible_within_snumbernoUpserts are searchable within this time.default 5

ItemError

NameTypeRequiredDescription
idstring | nullno
indexintegeryes
codestringyes
messagestringyes

Page_ProductOut_

NameTypeRequiredDescription
dataProductOut[]yes
next_cursorstring | nullno
totalinteger | nullnoPresent when cheap to count.

ProductOut

NameTypeRequiredDescription
idstringyes
productProductIn-Outputyes
content_hashstringyes
created_atstring (date-time)yes
updated_atstring (date-time)yes
indexed_atstring (date-time) | nullno

ProductIn-Output

One product, as sent to POST /v1/products:batch (upsert).

NameTypeRequiredDescription
idstringyesThe store's own product id.min length 1 · max length 128
nameobjectyes
descriptionobjectno
brandstring | nullnomax length 200
modelstring | nullnomax length 200
skustring | nullnomax length 200
gtinstring | nullnomax length 50
urlstring | nullnomax length 2048
image_urlstring | nullnomax length 2048
pricestringyes
sale_pricestring | nullno
currencystringyesISO 4217, e.g. USD, SAR, AED.pattern ^[A-Z]{3}$
in_stockbooleannodefault true
stock_qtyinteger | nullnomin 0
categoriesCategoryRef[]no
attributesmap<string, string | integer | number | boolean | string[]>noRaw attributes as the store has them, e.g. {'Size': 'M', 'Color': 'Black'}.
tagsstring[]no
popularitynumber | nullnoBusiness signal, opt-in.min 0
marginnumber | nullnoBusiness signal, opt-in. Never shown.
visiblebooleannodefault true
updated_atstring (date-time) | nullno
extraobjectnoOpaque. Returned as is.

Deleted

NameTypeRequiredDescription
deletedbooleannodefault true
idstringyes

ReindexRequest

NameTypeRequiredDescription
mode"full" | "settings_only"nodefault "full"
reasonstring | nullnomax length 200

Accepted

NameTypeRequiredDescription
acceptedbooleannodefault true
jobJob | nullno

Job

A row of the shared `jobs` table. Poll GET /v1/jobs/{id} until status is terminal.

NameTypeRequiredDescription
idstringyes
kind"reindex" | "import" | "sync" | "translate_backfill" | "translate_writeback" | "export" | "data_export" | "data_delete" | "embed" | "synonym_mining"yes
status"queued" | "running" | "succeeded" | "failed" | "canceled"yes
progressnumbernodefault 0 · min 0 · max 1
created_atstring (date-time)yes
started_atstring (date-time) | nullno
finished_atstring (date-time) | nullno
resultobject | nullno
errorstring | nullno

AttributeInfo

NameTypeRequiredDescription
raw_namestringyes
canonical_namestring | nullno
productsintegeryesHow many products have it.
sample_valuesstring[]no
facetbooleannodefault false
unitstring | nullno

AttributeMapping

NameTypeRequiredDescription
itemsAttributeMappingItem[]yes
updated_atstring (date-time) | nullno

AttributeMappingItem

NameTypeRequiredDescription
raw_namestringyesmax length 200
canonical_namestringyesmax length 100
unitstring | nullnomax length 20
value_mapmap<string, string>noe.g. {"Med": "M", "Navy Blue": "Navy"}
facetbooleannodefault true

AttributeMappingUpdate

NameTypeRequiredDescription
itemsAttributeMappingItem[]yes