Skip to main content
Collections return { items, nextCursor, totalItems }. totalItems counts the full filtered set. The default limit is 25; the maximum is 100. Continue until nextCursor is null, even when a page is smaller than expected. Treat cursors as opaque. Keep the same brand, resource, and filters when you continue. You may change limit. Ordering is specific to each collection; do not infer chronological order from the first row. Pagination is a live read, not a transaction-wide snapshot. For a repeatable export, avoid concurrent edits and reconcile by stable IDs. Collection responses with more records include a standard Link header:
Resolve the target against the response URL and send the same API-key header. It already contains your filters, page size, and next cursor. The header is omitted on the last page. You can use either this link or the JSON nextCursor; they identify the same continuation.

Reusable Node.js client

The tutorials use this small helper. Save it as amber-client.mjs in the same directory as the tutorial scripts. readJson(apiUrl("")) verifies access and returns the authorized brand identity. Use Node.js 22 or later; no packages are required. Set AMBER_API_KEY and AMBER_BRAND in your server environment before running a script. The brand value is a slug, not a brand UUID.
amber-client.mjs
Try it by saving and running this second file:
list-products.mjs
records() starts from the first page when no cursor is supplied. Passing null performs no request. includedRecords() emits the initial embedded page and follows its continuation URL without fetching that first page again. Filters stay on the URL across pages; do not change them mid-export. Malformed pages or a non-advancing cursor stop the export instead of silently restarting it. productGraph(id) returns a complete product packet after following every included collection cursor. Pass a comma-separated include list as its second argument to retrieve selected relationships. It collects one product in memory. The client retries the listed HTTP failures up to five attempts, with a timeout per request. It reports non-JSON gateway errors without trying to parse them as API data. Authentication, validation, and not-found responses fail immediately. HTTP redirects are never followed or retried. Transient network failures and timeouts, including interrupted successful response bodies, use the same retry budget. If Retry-After exceeds 60 seconds, the client throws with error.retryAfter so your job scheduler can resume later. HTTP errors also preserve error.details for parameter validation messages. API-key headers are sent only to the configured brand’s API paths. Use a separate request for signed storage URLs, as shown in Download documents.

Plan a recurring export

The current public API has no general updatedSince filter, deletion feed, snapshot token, or public change-subscription endpoint. Paginate each collection you need and reconcile by stable IDs. A child record can change independently of its Parent Product, so the parent’s updatedAt is not a graph-wide watermark. Write each run to staging and publish it only after every required collection finishes. A failed run or an empty filtered page does not prove a record was deleted. Even a completed run is a live read; reconcile missing IDs carefully when users edit data during the export. For large catalogs, read child collections brand-wide and join locally instead of calling include=all for every Parent Product.

Data conventions

Detailed source records preserve exact decimal values as strings, such as "12.5000". Use a decimal library when calculating money or quantities. Compact summary fields can use numbers; check the response schema. IDs are strings; most are UUIDs. Document IDs can also be opaque legacy:... identifiers. Countries use their country code. JSON specifications and custom fields preserve nested values. Timestamps are serialized as strings; nullable source timestamps remain null.

Errors

Errors contain error and errorCode. Validation errors may include additional field details. Match the code instead of parsing message text. Use only filters listed for that endpoint in the API Reference. Collections reject unknown filters with 400, including Parent Products, Quotes, Orders, and Suppliers. Correct misspelled parameters before retrying. Business resources support GET reads. Key-management operations require a separate administrator session.