{ 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.
Follow the next-page link
Collection responses with more records include a standardLink header:
nextCursor;
they identify the same continuation.
Reusable Node.js client
The tutorials use this small helper. Save it asamber-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
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 generalupdatedSince 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 containerror 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.