curl --request PATCH \
--url https://api.tassyir.io/apps/2026-10/products/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"price": "<string>",
"image": "<string>",
"description": "<string>",
"slug": "<string>",
"compareAtPrice": "<string>",
"sku": "<string>",
"barcode": "<string>",
"images": [
"<string>"
],
"weightKg": 5000,
"dimensionsCm": {
"width": 5000,
"height": 5000,
"length": 5000
},
"active": true,
"visible": true,
"allowOutOfStockOrders": true,
"brandId": "<string>",
"options": [
{
"name": "<string>",
"values": [
"<string>"
]
}
],
"variants": [
{
"options": [
{
"name": "<string>",
"value": "<string>"
}
],
"id": "<string>",
"name": "<string>",
"sku": "<string>",
"barcode": "<string>",
"price": "<string>",
"compareAtPrice": "<string>",
"image": "<string>",
"hidden": true
}
]
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
price: '<string>',
image: '<string>',
description: '<string>',
slug: '<string>',
compareAtPrice: '<string>',
sku: '<string>',
barcode: '<string>',
images: ['<string>'],
weightKg: 5000,
dimensionsCm: {width: 5000, height: 5000, length: 5000},
active: true,
visible: true,
allowOutOfStockOrders: true,
brandId: '<string>',
options: [{name: '<string>', values: ['<string>']}],
variants: [
{
options: [{name: '<string>', value: '<string>'}],
id: '<string>',
name: '<string>',
sku: '<string>',
barcode: '<string>',
price: '<string>',
compareAtPrice: '<string>',
image: '<string>',
hidden: true
}
]
})
};
fetch('https://api.tassyir.io/apps/2026-10/products/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"id": "<string>",
"storeId": "<string>",
"name": "<string>",
"slug": "<string>",
"description": "<string>",
"type": "<string>",
"active": true,
"visible": true,
"currency": "<string>",
"price": "<string>",
"compareAtPrice": "<string>",
"sku": "<string>",
"barcode": "<string>",
"image": "<string>",
"images": [
"<string>"
],
"weightKg": 123,
"dimensionsCm": {
"width": 123,
"height": 123,
"length": 123
},
"tracksInventory": true,
"allowOutOfStockOrders": true,
"collectionIds": [
"<string>"
],
"brandId": "<string>",
"options": [
{
"name": "<string>",
"values": [
"<string>"
]
}
],
"variants": [
{
"id": "<string>",
"name": "<string>",
"sku": "<string>",
"barcode": "<string>",
"price": "<string>",
"compareAtPrice": "<string>",
"image": "<string>",
"isDefault": true,
"hidden": true,
"options": [
{
"name": "<string>",
"value": "<string>"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
}{
"type": "<string>",
"title": "<string>",
"status": 400,
"detail": "<string>",
"code": "BAD_REQUEST",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 401,
"detail": "<string>",
"code": "APP_TOKEN_INVALID",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 403,
"detail": "<string>",
"code": "PERMISSION_DENIED",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 404,
"detail": "<string>",
"code": "NOT_FOUND",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 409,
"detail": "<string>",
"code": "IDEMPOTENCY_KEY_IN_USE",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 413,
"detail": "<string>",
"code": "PAYLOAD_TOO_LARGE",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 415,
"detail": "<string>",
"code": "UNSUPPORTED_MEDIA_TYPE",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 422,
"detail": "<string>",
"code": "IDEMPOTENCY_KEY_REUSED",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 429,
"detail": "<string>",
"code": "BUSINESS_RATE_LIMITED",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 500,
"detail": "<string>",
"code": "INTERNAL_ERROR",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 503,
"detail": "<string>",
"code": "API_BUSY",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}Update a product
options and variants are replace-all, together: every id sent must be one of this product’s variants; a variant left out is removed.
Needs the write_products scope (permission products:update).
curl --request PATCH \
--url https://api.tassyir.io/apps/2026-10/products/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"price": "<string>",
"image": "<string>",
"description": "<string>",
"slug": "<string>",
"compareAtPrice": "<string>",
"sku": "<string>",
"barcode": "<string>",
"images": [
"<string>"
],
"weightKg": 5000,
"dimensionsCm": {
"width": 5000,
"height": 5000,
"length": 5000
},
"active": true,
"visible": true,
"allowOutOfStockOrders": true,
"brandId": "<string>",
"options": [
{
"name": "<string>",
"values": [
"<string>"
]
}
],
"variants": [
{
"options": [
{
"name": "<string>",
"value": "<string>"
}
],
"id": "<string>",
"name": "<string>",
"sku": "<string>",
"barcode": "<string>",
"price": "<string>",
"compareAtPrice": "<string>",
"image": "<string>",
"hidden": true
}
]
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
price: '<string>',
image: '<string>',
description: '<string>',
slug: '<string>',
compareAtPrice: '<string>',
sku: '<string>',
barcode: '<string>',
images: ['<string>'],
weightKg: 5000,
dimensionsCm: {width: 5000, height: 5000, length: 5000},
active: true,
visible: true,
allowOutOfStockOrders: true,
brandId: '<string>',
options: [{name: '<string>', values: ['<string>']}],
variants: [
{
options: [{name: '<string>', value: '<string>'}],
id: '<string>',
name: '<string>',
sku: '<string>',
barcode: '<string>',
price: '<string>',
compareAtPrice: '<string>',
image: '<string>',
hidden: true
}
]
})
};
fetch('https://api.tassyir.io/apps/2026-10/products/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"id": "<string>",
"storeId": "<string>",
"name": "<string>",
"slug": "<string>",
"description": "<string>",
"type": "<string>",
"active": true,
"visible": true,
"currency": "<string>",
"price": "<string>",
"compareAtPrice": "<string>",
"sku": "<string>",
"barcode": "<string>",
"image": "<string>",
"images": [
"<string>"
],
"weightKg": 123,
"dimensionsCm": {
"width": 123,
"height": 123,
"length": 123
},
"tracksInventory": true,
"allowOutOfStockOrders": true,
"collectionIds": [
"<string>"
],
"brandId": "<string>",
"options": [
{
"name": "<string>",
"values": [
"<string>"
]
}
],
"variants": [
{
"id": "<string>",
"name": "<string>",
"sku": "<string>",
"barcode": "<string>",
"price": "<string>",
"compareAtPrice": "<string>",
"image": "<string>",
"isDefault": true,
"hidden": true,
"options": [
{
"name": "<string>",
"value": "<string>"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
}{
"type": "<string>",
"title": "<string>",
"status": 400,
"detail": "<string>",
"code": "BAD_REQUEST",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 401,
"detail": "<string>",
"code": "APP_TOKEN_INVALID",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 403,
"detail": "<string>",
"code": "PERMISSION_DENIED",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 404,
"detail": "<string>",
"code": "NOT_FOUND",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 409,
"detail": "<string>",
"code": "IDEMPOTENCY_KEY_IN_USE",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 413,
"detail": "<string>",
"code": "PAYLOAD_TOO_LARGE",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 415,
"detail": "<string>",
"code": "UNSUPPORTED_MEDIA_TYPE",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 422,
"detail": "<string>",
"code": "IDEMPOTENCY_KEY_REUSED",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 429,
"detail": "<string>",
"code": "BUSINESS_RATE_LIMITED",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 500,
"detail": "<string>",
"code": "INTERNAL_ERROR",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 503,
"detail": "<string>",
"code": "API_BUSY",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}Authorizations
An app access token from POST /apps/oauth/token, valid 1 hour. An offline token acts as the app; an online token acts as the app on behalf of one dashboard user (the intersection of both permission sets).
Headers
Makes a write safe to retry: the same key with the same method, path, query and body within 24 hours answers the stored result (Idempotent-Replayed: true) without running the write again. Only a successful answer is stored, so a retry after a failure runs. A key reused for a different request is 422 IDEMPOTENCY_KEY_REUSED; one whose first request still runs is 409 IDEMPOTENCY_KEY_IN_USE.
1 - 255^[\x21-\x7E]+$Path Parameters
A resource id. One this installation cannot read, or a malformed one, is 404 NOT_FOUND.
1Query Parameters
Return only these top-level fields, separated by commas; the id is always kept. The response schema describes the whole resource. An unknown name is 400 INVALID_FIELDS. Fields: id, storeId, name, slug, description, type, active, visible, currency, price, compareAtPrice, sku, barcode, image, images, weightKg, dimensionsCm, tracksInventory, allowOutOfStockOrders, collectionIds, brandId, options, variants, createdAt, updatedAt.
1000Body
1 - 255A decimal amount as a string, e.g. "2500.00" (at most two decimals).
^(0|[1-9]\d{0,8})(\.\d{1,2})?$1 - 20482000001 - 120A decimal amount as a string, e.g. "2500.00" (at most two decimals).
^(0|[1-9]\d{0,8})(\.\d{1,2})?$100100501 - 20480 <= x <= 10000Show child attributes
Show child attributes
An id (a string of digits).
^\d{1,24}$3Show child attributes
Show child attributes
200Show child attributes
Show child attributes
Response
The product as it is now.
A product (API 2026-10).
Show child attributes
Show child attributes