curl --request GET \
--url https://api.tassyir.io/apps/2026-10/products \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tassyir.io/apps/2026-10/products', 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"
}
],
"nextCursor": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 400,
"detail": "<string>",
"code": "INVALID_CURSOR",
"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": 429,
"detail": "<string>",
"code": "BUSINESS_RATE_LIMITED",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 460,
"detail": "<string>",
"code": "STORE_SCOPE_FORBIDDEN",
"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>"
]
}List products
Every product, active or not, newest first. A collection membership change does not move updatedAt (listen to products/updated for collectionIds).
Needs the read_products scope (permission products:read).
curl --request GET \
--url https://api.tassyir.io/apps/2026-10/products \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tassyir.io/apps/2026-10/products', 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"
}
],
"nextCursor": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 400,
"detail": "<string>",
"code": "INVALID_CURSOR",
"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": 429,
"detail": "<string>",
"code": "BUSINESS_RATE_LIMITED",
"docs": "<string>",
"fix": "<string>",
"requestId": "<string>",
"errors": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 460,
"detail": "<string>",
"code": "STORE_SCOPE_FORBIDDEN",
"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).
Query Parameters
Only this store's rows. A store outside the installation's stores is 460 STORE_SCOPE_FORBIDDEN.
^\d{1,24}$Only the products of this collection (picked by hand or matching its conditions).
^\d{1,24}$Only active (true) or inactive (false) products.
true, false Only rows created at or after this time.
Only rows changed at or after this time.
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.
1000Page size, 1 to 100 (default 50). A value outside that range is 400, never clamped.
1 <= x <= 100The nextCursor of the previous page, unchanged, with the same filters. Opaque; bound to this list and its filters (400 INVALID_CURSOR otherwise).
512