POST
/api/v1/catalog/productsCreate a product
Creates a product with basic fields only. Store plan product limits apply (422 quota_exceeded). Media, variants and inventory are managed by the merchant.
Required scope:
catalog:writeBearer tokenEnvironments
- SANDBOX
- Authorized local or test environment; no public hosted Sandbox is currently offered.
- PRODUCTION
https://getsas.xyz/api/v1/catalog/products
Request
Headers
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer <ACCESS_TOKEN> | Yes |
| Content-Type | application/json | Yes |
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Unique per logical write for 24 hours. Retrying the same key with the same route, target and body returns the stored result without writing again; a different request with the same key returns 409 idempotency_conflict. |
Code examples
curl --request POST 'https://getsas.xyz/api/v1/catalog/products' \
--header 'Authorization: Bearer <ACCESS_TOKEN>'
--header 'Idempotency-Key: <UNIQUE_KEY>'
--header 'Content-Type: application/json'
--data '{"name_ar":"منتج","name_en":"Product","price":25,"status":"draft"}'Response
201 Created product
{
"description": "Created product",
"headers": {
"RateLimit-Limit": {
"$ref": "#/components/headers/RateLimitLimit"
},
"RateLimit-Remaining": {
"$ref": "#/components/headers/RateLimitRemaining"
},
"RateLimit-Reset": {
"$ref": "#/components/headers/RateLimitReset"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProductWriteResponse"
}
}
}
}Errors
| 400 | Invalid request |
| 401 | Missing or invalid access token |
| 403 | The route, scope and reviewed contract do not match an operation this token can use (unsupported_capability) |
| 404 | The record does not exist in the installation store (records of other stores are indistinguishable), or the Marketplace API is unavailable |
| 409 | idempotency_conflict (the key was used for a different request), invalid_transition (for example the order is not confirmed or preparing) or conflict (duplicate code, SKU or slug) |
| 413 | The streamed write body exceeds 32,768 encoded bytes; it is rejected before JSON parsing |
| 415 | Write bodies must be sent as application/json (unsupported_media_type) |
| 422 | validation_failed or quota_exceeded; error.field names the rejected input when available |
| 429 | Fixed-window request limit exceeded for this installation and route key |
| 500 | Internal API failure |
| 503 | Rate-limit service unavailable; request is rejected closed |