Catalog
Your product catalog, product availability and price lists. Create, update and remove products, set availability, and manage prices and the buyers assigned to each price list.
- PUT/supplier/products/{sku}
- DEL/supplier/products/{sku}
- POST/supplier/products/batch
- POST/supplier/products/{sku}/availability
- GET/supplier/price-lists
- PUT/supplier/price-lists/{price_list_id}/prices
- POST/supplier/price-lists/{price_list_id}/buyers
- DEL/supplier/price-lists/{price_list_id}/buyers/{buyer_id}
The Price list object
Attributes
{
"id": "pl_1",
"name": "מחירון מסעדות",
"currency": "ILS",
"buyer_ids": [
"71148",
"71202"
],
"updated_at": "2026-09-13T17:02:45+03:00"
}
PUT
/supplier/products/{sku}Path parameters
Request body application/json
Responses
200The updated product. Returned when a product with this sku already exists.
201The created product. Returned when no product with this sku existed.
422The request body or query parameters failed validation. See errors[] for each invalid field.
curl -X PUT "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/412" \
-H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…" \
-H "Content-Type: application/json" \
-d '{
"name": "לחמניית חיטה מלאה",
"unit": "carton",
"package_quantity": "24",
"category": "לחמניות",
"barcode": "7290000000412",
"vat_exempt": false,
"image_file_id": "file_01J9KR6F3S",
"external_ref": "ITM-412"
}'const res = await fetch("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/412", {
method: "PUT",
headers: {
Authorization: "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "לחמניית חיטה מלאה",
"unit": "carton",
"package_quantity": "24",
"category": "לחמניות",
"barcode": "7290000000412",
"vat_exempt": false,
"image_file_id": "file_01J9KR6F3S",
"external_ref": "ITM-412"
}),
});
const data = await res.json();import requests
res = requests.put(
"https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/412",
headers={
"Authorization": "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
json={
"name": "לחמניית חיטה מלאה",
"unit": "carton",
"package_quantity": "24",
"category": "לחמניות",
"barcode": "7290000000412",
"vat_exempt": False,
"image_file_id": "file_01J9KR6F3S",
"external_ref": "ITM-412"
},
)
data = res.json()using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…");
var body = new StringContent("""
{
"name": "לחמניית חיטה מלאה",
"unit": "carton",
"package_quantity": "24",
"category": "לחמניות",
"barcode": "7290000000412",
"vat_exempt": false,
"image_file_id": "file_01J9KR6F3S",
"external_ref": "ITM-412"
}
""", Encoding.UTF8, "application/json");
var res = await http.PutAsync("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/412", body);
var data = await res.Content.ReadAsStringAsync();
{
"sku": "412",
"name": "לחמניית חיטה מלאה",
"unit": "carton",
"package_quantity": "24",
"category": "לחמניות",
"barcode": "7290000000412",
"vat_exempt": false,
"available": true,
"available_until": null,
"image_file_id": "file_01J9KR6F3S",
"external_ref": "ITM-412",
"created_at": "2026-03-02T10:15:00+03:00",
"updated_at": "2026-09-13T16:40:12+03:00",
"deleted_at": null
}{
"sku": "412",
"name": "לחמניית חיטה מלאה",
"unit": "carton",
"package_quantity": "24",
"category": "לחמניות",
"barcode": "7290000000412",
"vat_exempt": false,
"available": true,
"available_until": null,
"image_file_id": "file_01J9KR6F3S",
"external_ref": "ITM-412",
"created_at": "2026-09-13T16:40:12+03:00",
"updated_at": "2026-09-13T16:40:12+03:00",
"deleted_at": null
}{
"type": "https://developers.zester.co.il/errors/validation_error",
"title": "Validation failed",
"status": 422,
"code": "validation_error",
"detail": "2 fields are invalid",
"request_id": "req_01J9KR4A7T",
"errors": [
{
"field": "unit",
"code": "required",
"message": "unit is required, for example carton, unit or kg"
},
{
"field": "package_quantity",
"code": "invalid_format",
"message": "Quantity must be a decimal string with up to 3 fraction digits, for example \"24\""
}
]
}
DELETE
/supplier/products/{sku}Path parameters
Responses
204The product was removed from the catalog. This is a soft delete.
404The resource does not exist or belongs to another account.
curl -X DELETE "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/604" \
-H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…"const res = await fetch("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/604", {
method: "DELETE",
headers: {
Authorization: "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
});
const data = await res.json();import requests
res = requests.delete(
"https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/604",
headers={
"Authorization": "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
)
data = res.json()using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…");
var res = await http.DeleteAsync("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/604");
var data = await res.Content.ReadAsStringAsync();
No response body{
"type": "https://developers.zester.co.il/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "No product with SKU 604 exists in the catalog of supplier 72223.",
"request_id": "req_01J9KR4B2V"
}
POST
/supplier/products/batchRequest body application/json
Up to 500 items
Show 10 child attributesHide child attributes
Responses
200A result for each item.
Show 5 child attributesHide child attributes
422Every item failed. The body reports the result and errors for each item.
curl -X POST "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/batch" \
-H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"sku": "518",
"name": "קרואסון חמאה",
"unit": "carton",
"package_quantity": "40",
"category": "מאפים",
"barcode": "7290000000518",
"vat_exempt": false,
"external_ref": "ITM-518"
},
{
"sku": "604",
"name": "לחם שיפון פרוס",
"unit": "unit",
"package_quantity": "1",
"category": "לחמים",
"barcode": "7290000000604",
"vat_exempt": false,
"image_file_id": "file_01J9KR8W3N",
"external_ref": "ITM-604"
}
]
}'const res = await fetch("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/batch", {
method: "POST",
headers: {
Authorization: "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
"Content-Type": "application/json",
},
body: JSON.stringify({
"items": [
{
"sku": "518",
"name": "קרואסון חמאה",
"unit": "carton",
"package_quantity": "40",
"category": "מאפים",
"barcode": "7290000000518",
"vat_exempt": false,
"external_ref": "ITM-518"
},
{
"sku": "604",
"name": "לחם שיפון פרוס",
"unit": "unit",
"package_quantity": "1",
"category": "לחמים",
"barcode": "7290000000604",
"vat_exempt": false,
"image_file_id": "file_01J9KR8W3N",
"external_ref": "ITM-604"
}
]
}),
});
const data = await res.json();import requests
res = requests.post(
"https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/batch",
headers={
"Authorization": "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
json={
"items": [
{
"sku": "518",
"name": "קרואסון חמאה",
"unit": "carton",
"package_quantity": "40",
"category": "מאפים",
"barcode": "7290000000518",
"vat_exempt": False,
"external_ref": "ITM-518"
},
{
"sku": "604",
"name": "לחם שיפון פרוס",
"unit": "unit",
"package_quantity": "1",
"category": "לחמים",
"barcode": "7290000000604",
"vat_exempt": False,
"image_file_id": "file_01J9KR8W3N",
"external_ref": "ITM-604"
}
]
},
)
data = res.json()using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…");
var body = new StringContent("""
{
"items": [
{
"sku": "518",
"name": "קרואסון חמאה",
"unit": "carton",
"package_quantity": "40",
"category": "מאפים",
"barcode": "7290000000518",
"vat_exempt": false,
"external_ref": "ITM-518"
},
{
"sku": "604",
"name": "לחם שיפון פרוס",
"unit": "unit",
"package_quantity": "1",
"category": "לחמים",
"barcode": "7290000000604",
"vat_exempt": false,
"image_file_id": "file_01J9KR8W3N",
"external_ref": "ITM-604"
}
]
}
""", Encoding.UTF8, "application/json");
var res = await http.PostAsync("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/batch", body);
var data = await res.Content.ReadAsStringAsync();
{
"summary": {
"total": 2,
"succeeded": 1,
"failed": 1,
"skipped": 0
},
"items": [
{
"index": 0,
"key": "518",
"status": "updated",
"id": "518"
},
{
"index": 1,
"key": "604",
"status": "failed",
"errors": [
{
"field": "image_file_id",
"code": "not_found",
"message": "File file_01J9KR8W3N does not exist or was deleted because it was not referenced within 24 hours"
}
]
}
]
}{
"summary": {
"total": 2,
"succeeded": 0,
"failed": 2,
"skipped": 0
},
"items": [
{
"index": 0,
"key": "518",
"status": "failed",
"errors": [
{
"field": "barcode",
"code": "already_exists",
"message": "Barcode 7290000000518 is already assigned to another product in this catalog"
}
]
},
{
"index": 1,
"key": "604",
"status": "failed",
"errors": [
{
"field": "image_file_id",
"code": "not_found",
"message": "File file_01J9KR8W3N does not exist or was deleted because it was not referenced within 24 hours"
}
]
}
]
}
POST
/supplier/products/{sku}/availabilityPath parameters
Request body application/json
Responses
200The product with its updated availability.
404The resource does not exist or belongs to another account.
curl -X POST "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/518/availability" \
-H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…" \
-H "Content-Type: application/json" \
-d '{
"available": false,
"until": "2026-09-20",
"reason": "מחסור זמני בחמאה"
}'const res = await fetch("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/518/availability", {
method: "POST",
headers: {
Authorization: "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
"Content-Type": "application/json",
},
body: JSON.stringify({
"available": false,
"until": "2026-09-20",
"reason": "מחסור זמני בחמאה"
}),
});
const data = await res.json();import requests
res = requests.post(
"https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/518/availability",
headers={
"Authorization": "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
json={
"available": False,
"until": "2026-09-20",
"reason": "מחסור זמני בחמאה"
},
)
data = res.json()using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…");
var body = new StringContent("""
{
"available": false,
"until": "2026-09-20",
"reason": "מחסור זמני בחמאה"
}
""", Encoding.UTF8, "application/json");
var res = await http.PostAsync("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/products/518/availability", body);
var data = await res.Content.ReadAsStringAsync();
{
"sku": "518",
"name": "קרואסון חמאה",
"unit": "carton",
"package_quantity": "40",
"category": "מאפים",
"barcode": "7290000000518",
"vat_exempt": false,
"available": false,
"available_until": "2026-09-20",
"external_ref": "ITM-518",
"created_at": "2026-03-02T10:15:00+03:00",
"updated_at": "2026-09-13T11:05:47+03:00",
"deleted_at": null
}{
"type": "https://developers.zester.co.il/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "No product with SKU 518 exists in the catalog of supplier 72223.",
"request_id": "req_01J9KR4C9W"
}
GET
/supplier/price-listsQuery parameters
Opaque cursor returned as next_cursor in a previous response. Pass it to fetch the next page.
Responses
200A page of price lists, each with the buyers assigned to it.
curl "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists?limit=50" \
-H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…"const res = await fetch("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists?limit=50", {
method: "GET",
headers: {
Authorization: "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
});
const data = await res.json();import requests
res = requests.get(
"https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists?limit=50",
headers={
"Authorization": "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
)
data = res.json()using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…");
var res = await http.GetAsync("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists?limit=50");
var data = await res.Content.ReadAsStringAsync();
{
"data": [
{
"id": "pl_1",
"name": "מחירון מסעדות",
"currency": "ILS",
"buyer_ids": [
"71148",
"71202"
],
"updated_at": "2026-09-13T17:02:45+03:00"
},
{
"id": "pl_2",
"name": "מחירון אירועים",
"currency": "ILS",
"buyer_ids": [],
"updated_at": "2026-08-27T12:30:00+03:00"
}
],
"next_cursor": null,
"has_more": false
}
PUT
/supplier/price-lists/{price_list_id}/pricesPath parameters
Request body application/json
Up to 500 items
Show 4 child attributesHide child attributes
Responses
200A result for each item.
Show 5 child attributesHide child attributes
404The resource does not exist or belongs to another account.
curl -X PUT "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/prices" \
-H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"sku": "412",
"price": "33.90",
"min_quantity": "20",
"valid_from": "2026-10-01"
},
{
"sku": "518",
"price": "0.00",
"valid_from": "2026-10-01"
}
]
}'const res = await fetch("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/prices", {
method: "PUT",
headers: {
Authorization: "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
"Content-Type": "application/json",
},
body: JSON.stringify({
"items": [
{
"sku": "412",
"price": "33.90",
"min_quantity": "20",
"valid_from": "2026-10-01"
},
{
"sku": "518",
"price": "0.00",
"valid_from": "2026-10-01"
}
]
}),
});
const data = await res.json();import requests
res = requests.put(
"https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/prices",
headers={
"Authorization": "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
json={
"items": [
{
"sku": "412",
"price": "33.90",
"min_quantity": "20",
"valid_from": "2026-10-01"
},
{
"sku": "518",
"price": "0.00",
"valid_from": "2026-10-01"
}
]
},
)
data = res.json()using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…");
var body = new StringContent("""
{
"items": [
{
"sku": "412",
"price": "33.90",
"min_quantity": "20",
"valid_from": "2026-10-01"
},
{
"sku": "518",
"price": "0.00",
"valid_from": "2026-10-01"
}
]
}
""", Encoding.UTF8, "application/json");
var res = await http.PutAsync("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/prices", body);
var data = await res.Content.ReadAsStringAsync();
{
"summary": {
"total": 2,
"succeeded": 1,
"failed": 1,
"skipped": 0
},
"items": [
{
"index": 0,
"key": "412",
"status": "created"
},
{
"index": 1,
"key": "518",
"status": "failed",
"errors": [
{
"field": "price",
"code": "must_be_positive",
"message": "Price must be greater than 0.00"
}
]
}
]
}{
"type": "https://developers.zester.co.il/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "Price list pl_1 does not exist or belongs to another supplier.",
"request_id": "req_01J9KR4D3X"
}
POST
/supplier/price-lists/{price_list_id}/buyersPath parameters
Request body application/json
Responses
204The price list was assigned to the buyer.
404The resource does not exist or belongs to another account.
curl -X POST "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/buyers" \
-H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…" \
-H "Content-Type: application/json" \
-d '{
"buyer_id": "71202",
"valid_from": "2026-10-01"
}'const res = await fetch("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/buyers", {
method: "POST",
headers: {
Authorization: "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
"Content-Type": "application/json",
},
body: JSON.stringify({
"buyer_id": "71202",
"valid_from": "2026-10-01"
}),
});
const data = await res.json();import requests
res = requests.post(
"https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/buyers",
headers={
"Authorization": "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
json={
"buyer_id": "71202",
"valid_from": "2026-10-01"
},
)
data = res.json()using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…");
var body = new StringContent("""
{
"buyer_id": "71202",
"valid_from": "2026-10-01"
}
""", Encoding.UTF8, "application/json");
var res = await http.PostAsync("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/buyers", body);
var data = await res.Content.ReadAsStringAsync();
No response body{
"type": "https://developers.zester.co.il/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "Buyer 71202 is not linked to supplier 72223. Invite the buyer first with POST /v2/supplier/buyer-invitations.",
"request_id": "req_01J9KR4E6Y"
}
DELETE
/supplier/price-lists/{price_list_id}/buyers/{buyer_id}Path parameters
Responses
204The price list was removed from the buyer.
404The resource does not exist or belongs to another account.
curl -X DELETE "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/buyers/71202" \
-H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…"const res = await fetch("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/buyers/71202", {
method: "DELETE",
headers: {
Authorization: "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
});
const data = await res.json();import requests
res = requests.delete(
"https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/buyers/71202",
headers={
"Authorization": "Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…",
},
)
data = res.json()using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…");
var res = await http.DeleteAsync("https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/price-lists/pl_1/buyers/71202");
var data = await res.Content.ReadAsStringAsync();
No response body{
"type": "https://developers.zester.co.il/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "Price list pl_1 is not assigned to buyer 71202.",
"request_id": "req_01J9KR4F8Z"
}