APIAPI referenceCatalog Push API
Push Pages
Upsert pages/policies into the knowledge base (external_ref = external_id).
POST/v1/stores/{store_id}/catalog/pages:batchScope catalog:write
- Scope:
catalog:write(scopes and plan access) - Rate limit: 600 requests/min per API key (test keys: 60/min); catalog batches 120/min per store (rate limits)
Upsert pages/policies into the knowledge base (`external_ref = external_id`).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| store_idrequired | path | string | |
| Idempotency-Keyrequired | header | string | Replays return the original |
Request body (PagesBatch)
| Field | Type | Description |
|---|---|---|
| pagesrequired | CatalogPageInput[] | CatalogPageInput items (validated individually; invalid items are reported in rejected[])≥ 1 items · ≤ 500 items |
| pages[].content_html | string | |
| pages[].content_text | string | |
| pages[].doc_type | "policy" | "page" | "faq" | default "page" |
| pages[].external_idrequired | string | 1–128 characters |
| pages[].locale | string | 2–35 characters · pattern `^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$` |
| pages[].policy_type | string | ≤ 64 characters |
| pages[].titlerequired | string | 1–255 characters |
| pages[].urlrequired | string | format uri · ≤ 2048 characters |
Example request
curl -X POST "https://api.shopassist.coec.dk/v1/stores/sto_01j8000000e008000000000000/catalog/pages:batch" \
-H "Authorization: Bearer $SHOPASSIST_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"pages":[{"content_html":"string","content_text":"string","doc_type":"policy","external_id":"string","locale":"da-DK","policy_type":"string","title":"string","url":"https://shop.example/products/linen-shirt"}]}'Response 202 (BatchAccepted)
| Field | Type | Description |
|---|---|---|
| acceptedrequired | integer | ≥ 0 |
| rejectedrequired | ItemRejection[] | |
| rejected[].errorrequired | ItemError | `{ code; message }` of a rejected item. |
| rejected[].error.coderequired | "validation_error" | "currency_mismatch" | "duplicate_external_id" | "too_many_variants" | "url_not_allowed" | |
| rejected[].error.messagerequired | string | |
| rejected[].indexrequired | integer | ≥ 0 |
| sync_run_idrequired | string | pattern `^sync_[0-9a-hjkmnp-tv-z]{26}$` |
{
"accepted": 0,
"rejected": [
{
"error": {
"code": "validation_error",
"message": "string"
},
"index": 0
}
],
"sync_run_id": "sync_01j8000000e008000000000000"
}Errors
Every error uses the error envelope; the code field is stable.
400Bad Request401Unauthorized403Forbidden404Not Found409Conflict413Content Too Large422Unprocessable Content429Too Many Requests
Last updated on