List products
const url = 'https://app.nexym.nl/api/connect/products?per_page=50&page=1';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://app.nexym.nl/api/connect/products?per_page=50&page=1' \ --header 'Authorization: Bearer <token>'A page of products for the key’s project, each with its variants. The variants
are loaded with a narrow column list — only id, product_id, reference,
sku and barcode are present, never the full variant record. Each product
also lists its related products, up-sells and cross-sells as SKUs
(related_skus, upsell_skus, crosssell_skus).
Requires products: read (or write).
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Records per page. Values above 200 are silently clamped to 200. The value is not otherwise validated, so send a sensible positive integer.
1-based page number.
Responses
Section titled “Responses”A page of products.
object
object
Index of the first record on this page, or null on an empty page.
One entry of the paginator’s rendered link list.
object
A universal article record.
object
The canonical article key, unique within the project.
The configurable, bundle or grouped parent this article belongs to.
Per-store content overrides, keyed by store slot and then by field name — the value used when a record is pushed to that store instead of the hub’s own column.
What was last pushed per store, so a re-run does not resend it.
Percentage, two decimals, serialised as a string.
Null means no connected system has said either way yet.
The connection this record was last imported from.
Free-form store for fields the universal schema does not define for everybody: a connector’s declared extension fields and a project’s own customer fields, each under its own name.
A variant as the products listing returns it. Only these columns are selected — the full variant record (barcodes, options, weight, labels, meta) is not exposed by this API.
object
Related products, in the source’s order. The hub product’s SKU when that product is in the hub, otherwise the SKU the source gave.
Up-sells, in the source’s order, as SKUs (see related_skus).
Cross-sells, in the source’s order, as SKUs (see related_skus).
Example
{ "current_page": 1, "first_page_url": "https://app.nexym.nl/api/connect/orders?page=1", "from": 1, "last_page": 7, "last_page_url": "https://app.nexym.nl/api/connect/orders?page=7", "links": [ { "url": "https://app.nexym.nl/api/connect/orders?page=2", "label": "2", "page": 2, "active": false } ], "next_page_url": "https://app.nexym.nl/api/connect/orders?page=2", "path": "https://app.nexym.nl/api/connect/orders", "per_page": 50, "prev_page_url": null, "to": 50, "total": 318, "data": [ { "id": 4821, "project_id": 3, "reference": "ACME-1234", "sku": "ACME-1234", "name": "Widget 40 mm, black", "type": "simple", "parent_reference": null, "attribute_set": "default", "description": "A 40 mm widget in powder-coated black.", "short_description": "40 mm widget, black", "url": "/widgets/acme-1234", "meta_title": "Widget 40 mm, black", "meta_description": "Buy the 40 mm black widget.", "labels": { "nl_main": { "name": "Widget 40 mm, zwart" } }, "pushed_store_labels": { "nl_main": { "name": "Widget 40 mm, zwart" } }, "brand": "ACME", "brand_name": "ACME Tools", "category_reference": "CAT-WIDGETS", "supplier_reference": "SUP-0042", "vat_rate": "21.00", "is_online": true, "status": "active", "source_connection_id": 7, "meta": { "service_code": "INSTALL-STD" }, "source_changed_at": "2026-09-18T09:12:41.000000Z", "created_at": "2026-08-01T11:03:27.000000Z", "updated_at": "2026-09-18T09:12:41.000000Z", "variants": [ { "id": 90412, "product_id": 4821, "reference": "ACME-1234-BLK", "sku": "ACME-1234-BLK", "barcode": "8712345678906" } ], "related_skus": [ "ACME-2000", "ACME-2001" ], "upsell_skus": [ "ACME-1234-PRO" ], "crosssell_skus": [] } ]}No key, a key that does not match, a revoked key, or an expired one. The body says which, and nothing else — an unusable key is never described further.
Every error this API returns carries a single human-readable message.
object
Examples
No bearer token, or one too short to hold a prefix
{ "message": "Missing or invalid API key."}Unknown key, or a failed hash check
{ "message": "Invalid API key."}The key was revoked in the dashboard
{ "message": "API key has been revoked."}The key's expiry has passed
{ "message": "API key has expired."}The key is valid but its abilities do not cover this resource at this right.
Every error this API returns carries a single human-readable message.
object
Examples
{ "message": "This API key lacks read access to orders."}{ "message": "This API key lacks write access to stock."}The per-minute rate limit was exceeded. The limit is 120 requests per minute by
default (CONNECT_API_RATE_PER_MIN), counted per API key — or per IP address for
a request that never authenticated.
Every error this API returns carries a single human-readable message.
object
Examples
{ "message": "Too many requests — slow down."}Headers
Section titled “Headers”Seconds until the limit resets.
Requests allowed per minute.
Requests left in the current window.