API reference · 2.0.0-draft.1

Zestt API

Integrate your ERP, point of sale or BI platform with Zestt. Orders, delivery notes, invoices, catalogs, purchasing and accounting data through a single REST API.

The Zestt API is organized around REST. It has predictable, resource-oriented URLs, accepts and returns JSON, uses standard HTTP methods and status codes, and reports every error with a stable, machine-readable code.

Suppliers integrate through the /supplier endpoints to receive orders and issue delivery notes and invoices. Restaurant chains and buyers use the remaining endpoints to read purchasing, expense and accounting data. The API key you use determines which endpoints are available to you.

Develop against the sandbox first. It contains a demo buyer, "שניצי קפה" (71148), and a demo supplier, "מאפייה אחת עשרה" (72223), already linked to each other. Use the Sandbox / Production switch at the top of the page to change the base URL and API key in every code sample.

Base URLs
Sandbox      https://sandbox-api.zester.co.il/v2
Production   https://api.zester.co.il/v2

Authentication

The Zestt API authenticates requests with API keys. Send your key as a Bearer token in the Authorization header of every request.

Account administrators create keys in Zestt under Settings → Developers: create an integration, select the scopes it needs, and generate a key. The key is displayed only once, so store it securely.

Sandbox keys start with zk_test_ and production keys with zk_live_. Call GET /me to confirm the account, plan and scopes associated with a key.

  • Scopes. Each endpoint lists the scope it requires. A new integration is read-only until write scopes are granted.
  • IP allowlists. Supplier integrations with write scopes must restrict requests to an IP allowlist.
  • Access tokens. To avoid sending the key with every request, exchange it for a 60-minute access token with POST /oauth/token.
GET /me
curl "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/me" \
  -H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…"
Response
{
  "account": {
    "id": "72223",
    "name": "מאפייה אחת עשרה",
    "type": "supplier"
  },
  "client": {
    "name": "Priority ERP",
    "environment": "sandbox",
    "key_prefix": "zk_test_XXXXXXXX"
  },
  "scopes": [
    "supplier.orders:read",
    "supplier.orders:write",
    "supplier.documents:write"
  ],
  "plan": "supplier",
  "features": ["webhooks", "ip_allowlist"],
  "api_version": "2"
}

Conventions

Naming
Fields and parameters use snake_case. IDs are strings.
Money
Decimal strings with two decimal places, such as "496.40". The currency is given by currency on the parent object.
Quantities
Decimal strings with up to three decimal places, accompanied by a unit.
Dates
YYYY-MM-DD for dates, and RFC 3339 with a UTC offset for timestamps.
Enums
Lowercase snake_case strings. New values may be added over time, so handle values you do not recognize.
Pagination
List endpoints return data, has_more and next_cursor. Pass next_cursor as cursor to fetch the next page. limit accepts up to 200.
Sync
Filter with updated_since to retrieve only resources that changed after a given timestamp.
Idempotency
Send an Idempotency-Key header with POST requests. A retry with the same key and body within 24 hours returns the original response instead of repeating the operation. Required when creating documents.
Request IDs
Every response includes an X-Request-Id header. Include it when you contact support.
Rate limits
Requests over the limit return 429 with Retry-After, RateLimit-Remaining and RateLimit-Reset headers.
Incremental sync
curl "https://sandbox-api.zester.co.il/v2https://api.zester.co.il/v2/supplier/orders?updated_since=2026-09-10T00:00:00Z&limit=200" \
  -H "Authorization: Bearer zk_test_XXXXXXXX_…zk_live_XXXXXXXX_…"
Response
{
  "data": [
    {
      "id": "2335619",
      "status": "pending_approval",
      "delivery_date": "2026-09-14",
      "currency": "ILS",
      "totals": { "before_vat": "496.40", "vat": "89.35", "with_vat": "585.75" },
      "lines": [
        { "sku": "300", "quantity": "2.500", "unit": "kg" }
      ],
      "updated_at": "2026-09-11T08:15:00+03:00"
    }
  ],
  "has_more": true,
  "next_cursor": "eyJpZCI6IjIzMzU2MTkifQ"
}

Errors

Zestt uses conventional HTTP status codes: 2xx indicates success, 4xx an error caused by the request, and 5xx an error on Zestt's side.

Error responses follow RFC 9457 (application/problem+json) and include a stable code. Handle errors by code. The title and detail fields are written for people and may change.

codeHTTPMeaning
unauthorized401The API key is missing or invalid.
key_expired401The API key has passed its expiry date.
key_revoked401The API key has been revoked.
client_suspended403The integration has been suspended.
ip_not_allowed403The request came from an IP address outside the integration's allowlist.
scope_missing403The API key lacks the scope this endpoint requires.
plan_required403The account's plan does not include this feature. See upgrade_url.
not_found404The resource does not exist or belongs to another account.
idempotency_conflict409The Idempotency-Key was already used with a different request body.
conflict409The request conflicts with the resource's current state.
precondition_failed412The resource changed after it was read (If-Match).
file_too_large413The file exceeds 25 MB.
validation_error422The request body or parameters are invalid. See errors.
rate_limited429Too many requests. Retry after the time given in Retry-After.
internal_error5xxAn error occurred on Zestt's side. Retry with exponential backoff.
422 Unprocessable Content
{
  "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_01J9KQ7X4M",
  "errors": [
    {
      "field": "lines[1].quantity",
      "code": "must_be_positive",
      "message": "Quantity must be greater than 0"
    },
    { "field": "delivery_date", "code": "in_the_past" }
  ]
}

Endpoints

Each group opens with the object it manages, followed by every endpoint with its parameters, request samples in cURL, Node.js, Python and C#, and example responses. Endpoints marked Soon are defined in the contract but not yet available. To work in your own tools, download the OpenAPI contract or the Postman collection.

Getting started

Supplier API

Buyer APISoon

Platform

Download the OpenAPI contract
curl -O https://docs.zestt.io/openapi.yaml
Import into Postman
1. Download https://docs.zestt.io/zestt-api.postman_collection.json
2. In Postman, choose Import and select the file.
3. Set the apiKey collection variable to your sandbox key (zk_test_).