Contents
Commerce API
Read orders, returns, availability and locations from Nucleo Orders, and send in orders — for your ERP, BI, B2B and customer service tools.
The API for the systems that work next to Nucleo Orders: your ERP, your data warehouse, your customer service desk, your own apps — and for the ones that sell outside the sales channel (an ERP, a B2B portal, a smaller marketplace) and send their orders to Nucleo. One API key per integration: the key belongs to one company and only does what its permissions (scopes) allow.
Warehouses that fulfil orders use the Fulfillment API instead.
Conventions
- JSON in UTF-8,
snake_casefield names, dates in ISO 8601 UTC (2026-10-13T08:30:00Z). - Amounts are decimal strings with their currency:
{"amount": "180.00", "currency": "EUR"}. - Lists are paginated with an opaque cursor:
limit(1–200, default 50), answer{data, next_cursor}. Follownext_cursoruntil it isnull. Lists are sorted by last update, oldest first: keep theupdated_atof the last item you read and pass it asupdated_sincenext time to read only what changed. - Every response carries
X-Request-Id. Errors always have the same shape:{"error": {"code", "message", "request_id", "details"}}. - Order numbers are the merchant's (
#1042). In paths you can omit the#or encode it as%23, or use the orderid. - Reads never change anything. The only write is
POST /orders, which creates an order and needs theorders:writescope; it accepts anIdempotency-Key. - Optional signed webhooks tell you when an order or a return changes, so you read it right away instead of waiting for your next sync.
Authentication
apiKeyHTTP bearerThe connection's API key (
nck_…):Authorization: Bearer <api_key>.webhookSignatureAPI key · header · X-Nucleo-SignatureWebhooks Nucleo sends to your webhook URL.
X-Nucleo-Signature: t=<unix time>,v1=<signature>, where the signature is the lowercase hex HMAC-SHA256 of<t>.<raw body>keyed with the connection's webhook secret (whsec_…). Verify it on the exact bytes you received, in constant time, and reject atmore than 5 minutes away from your clock. The event type is also inX-Nucleo-Event.
- Base URL
- https://api-commerce.nucleoplatform.com/api/commerce/v1Production
- Who calls it
- Your servers
- Endpoints
- 9 + 5 webhook
- OpenAPI 3.1 specification
- commerce.yaml
Connection
Check that your API key works and see which company it belongs to and what it can read.
Getting a key. In Nucleo, go to Commerce › Orders › Channels and logistics, click New connection and
choose Integration (Commerce API) under Integrations. The endpoint, the API key (nck_…) and the
webhook secret (whsec_…) are shown once: keep them in your secret store. A new connection is a draft and answers
403 connection_not_active: in its Status, choose Active and save. Rotate credentials in the
connection's More actions replaces the key and the webhook secret; the old ones stop working at once. A new key can use every
read scope below; orders:write is never given by default: ask Nucleo support to enable it on your key.
| Scope | Opens |
|---|---|
orders:read | Orders, with shipments, refunds and timeline |
returns:read | Returns, with outcome and refunds |
inventory:read | Availability per item and location |
locations:read | Warehouses and stores |
orders:write | Create orders (POST /orders) — only on request |
/pingCheck your API key
The company and connection your key belongs to, the scopes it has (orders:write only when enabled)
and the webhooks it receives.
Needs no scope.
Responses
200The key works.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
api_versionstringrequiredcompanyobjectrequiredChild attributes
idintegernamestring | null
connectionobjectrequiredChild attributes
idstringnamestringstatusstring
scopesarray of stringrequiredOne oforders:readreturns:readinventory:readlocations:readorders:writewebhooksobjectrequiredChild attributes
enabledbooleanrequiredA webhook URL is set and the key has a webhook secret. A key created before webhooks existed has no secret: rotate its credentials to get one.
eventsarray of stringrequiredThe events this key receives (empty when webhooks are off).
One oforder.createdorder.status_changedshipment.shippedreturn.createdreturn.status_changed
server_timestring (date-time)required
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X GET https://api-commerce.nucleoplatform.com/api/commerce/v1/ping \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Accept: application/json'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/ping", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
Accept: "application/json",
},
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/ping', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
'Accept' => 'application/json',
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"api_version": "v1",
"company": {
"id": 1042,
"name": "Acme Apparel"
},
"connection": {
"id": "6a1f2c3d-4e5b-4c6d-8e7f-9a0b1c2d3e4f",
"name": "Acme ERP",
"status": "active"
},
"scopes": [
"orders:read",
"returns:read",
"inventory:read",
"locations:read"
],
"webhooks": {
"enabled": true,
"events": [
"order.created",
"order.status_changed",
"shipment.shipped",
"return.created",
"return.status_changed"
]
},
"server_time": "2026-10-13T08:30:00Z"
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}Orders
Orders as the customer and your back office see them, with their lines, shipments, refunds made on the sales channel and the returns opened on them.
| Status | Meaning |
|---|---|
received | Arrived from the sales channel or through this API, not yet sent to fulfilment. |
on_hold | Stopped by the merchant or by a rule (for example a payment check). |
in_fulfillment | Assigned to a warehouse or store, which is preparing it. |
shipped | Every parcel has left. |
delivered | The carrier delivered it. |
cancellation_requested | Cancelled after the warehouse took it over: waiting for the warehouse to stop it. |
cancelled | Cancelled. |
Fields that stay inside Nucleo — internal notes, carrier costs, routing decisions, holds' details, customer tags and payment transactions — are not part of the API.
Sending orders. With orders:write your system creates orders with POST /orders. They go through
the same steps as the sales channel's: Nucleo's routing rules choose the location, the warehouse
receives them, and order.created is sent to every key that listens. Send orders ready to ship: they
are treated as paid.
/ordersList orders
Orders sorted by last update, oldest first. Scope orders:read.
To keep a copy in sync, read every page once, then call again with updated_since set to the
updated_at of the last order you stored. A change to a return does not update its order: sync returns
with GET /returns.
Query parameters
statusstringOnly orders in this status.
One ofreceivedon_holdin_fulfillmentshippeddeliveredcancellation_requestedcancelledExample:receivedupdated_sincestring (date-time)Only items updated at or after this time (ISO 8601). Encode
+as%2Bif you send an offset.Example:2026-10-13T08:00:00ZcursorstringThe
next_cursorof the previous page. Keepstatusandupdated_sincethe same; a differentstatusanswers400 invalid_cursor.limitintegerItems per page.
min 1max 200default 50Example:50
Responses
200A page of orders.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
dataarray of OrderrequiredAttributes of each item
idstring (uuid)requirednumberstringrequiredExample:#1042statusstringrequiredOne ofreceivedon_holdin_fulfillmentshippeddeliveredcancellation_requestedcancelledchannelstring | nullWhere the order comes from, for example
shopify;nucleo_apifor orders created withPOST /orders.placed_atstring (date-time) | nullupdated_atstring (date-time) | nullpayment_statusstring | nullOne ofpendingauthorizedpaidcapturedpartially_refundedrefundedvoidedexpirednullon_holdbooleancustomerobjectChild attributes
namestring | nullemailstring | nullphonestring | null
shipping_addressAddressChild attributes
first_namestring | nulllast_namestring | nullcompanystring | nulladdress1string | nulladdress2string | nullcitystring | nullpostal_codestring | nullprovince_codestring | nullcountry_codestring | nullISO 3166-1 alpha-2.
phonestring | null
billing_addressAddress | nullAddress
first_namestring | nulllast_namestring | nullcompanystring | nulladdress1string | nulladdress2string | nullcitystring | nullpostal_codestring | nullprovince_codestring | nullcountry_codestring | nullISO 3166-1 alpha-2.
phonestring | null
shippingobjectThe shipping method the customer chose.
Child attributes
method_codestring | nullmethod_namestring | null
currencystringtotalsobjectcurrent_totalis the total after edits and cancellations;refundedwhat was refunded on the sales channel.Child attributes
subtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
discountsMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
taxMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
totalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
current_totalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
refundedMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of OrderLinerequiredAttributes of each item
line_idstringskustring | nullbarcodestring | nulltitlestring | nullquantityintegerquantity_cancelledintegerquantity_shippedintegerunit_priceMoneyTax included.
Child attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
totalMoneyTax included.
Child attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
tax_ratestringPercentage as a decimal string, for example
22.00.
shipmentsarray of ShipmentAttributes of each item
idstringstatusstringOne oflabel_createdconfirmedshippeddeliveredvoidedlocation_codestring | nullThe location that shipped it.
carrierobjectChild attributes
codestring | nullnamestring | nullservicestring | null
tracking_urlstring | nulltracking_numbersarray of stringshipped_atstring (date-time) | nulldelivered_atstring (date-time) | nulllinesarray of objectAttributes of each item
line_idstring | nullquantityinteger
refundsarray of RefundAttributes of each item
idstringreturn_idstring | nullThe return it belongs to, if any.
refunded_atstring (date-time) | nulltotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of objectAttributes of each item
line_idstring | nullskustring | nullbarcodestring | nullquantityintegersubtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
returnsarray of objectThe returns opened on the order; read each one with
GET /returns/{return}.Attributes of each item
idstringnumberstring | nullstatusstringOne ofrequestedawaiting_receiptin_transitreceivedcompliantnot_compliantclosedcancelled
cancellationobject | nullPresent when the order is cancelled or its cancellation is requested.
object
reasonstring | nullcancelled_atstring (date-time) | null
next_cursorstring | nullrequired
400The request is not valid:
validation_failed(withdetailsper parameter or field),invalid_cursor,invalid_json(the body is not a JSON object) orunknown_item(withdetailsper line, for examplelines.0). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X GET 'https://api-commerce.nucleoplatform.com/api/commerce/v1/orders?status=received&updated_since=2026-10-13T08%3A00%3A00Z&limit=50' \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Accept: application/json'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/orders?status=received&updated_since=2026-10-13T08%3A00%3A00Z&limit=50", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
Accept: "application/json",
},
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/orders?status=received&updated_since=2026-10-13T08%3A00%3A00Z&limit=50', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
'Accept' => 'application/json',
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"data": [
{
"id": "9b2f4c1e-5d7a-4e8b-9c3d-2a1f0e6b7c8d",
"number": "#1042",
"status": "received",
"channel": "string",
"placed_at": "2026-10-01T09:30:00Z",
"updated_at": "2026-10-01T09:30:00Z",
"payment_status": "pending",
"on_hold": true,
"customer": {
"name": "string",
"email": "string",
"phone": "string"
},
"shipping_address": {
"first_name": "string",
"last_name": "string",
"company": "string",
"address1": "string",
"address2": "string",
"city": "string",
"postal_code": "string",
"province_code": "string",
"country_code": "string",
"phone": "string"
},
"billing_address": {
"first_name": "string",
"last_name": "string",
"company": "string",
"address1": "string",
"address2": "string",
"city": "string",
"postal_code": "string",
"province_code": "string",
"country_code": "string",
"phone": "string"
},
"shipping": {
"method_code": "string",
"method_name": "string"
},
"currency": "string",
"totals": {
"subtotal": {
"amount": "180.00",
"currency": "EUR"
},
"discounts": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"tax": {
"amount": "180.00",
"currency": "EUR"
},
"total": {
"amount": "180.00",
"currency": "EUR"
},
"current_total": {
"amount": "180.00",
"currency": "EUR"
},
"refunded": {
"amount": "180.00",
"currency": "EUR"
}
},
"lines": [
{
"line_id": "string",
"sku": "string",
"barcode": "string",
"title": "string",
"quantity": 1,
"quantity_cancelled": 1,
"quantity_shipped": 1,
"unit_price": {
"amount": "180.00",
"currency": "EUR"
},
"total": {
"amount": "180.00",
"currency": "EUR"
},
"tax_rate": "string"
}
],
"shipments": [
{
"id": "string",
"status": "label_created",
"location_code": "string",
"carrier": {
"code": "string",
"name": "string",
"service": "string"
},
"tracking_url": "string",
"tracking_numbers": [
"string"
],
"shipped_at": "2026-10-01T09:30:00Z",
"delivered_at": "2026-10-01T09:30:00Z",
"lines": [
{}
]
}
],
"refunds": [
{
"id": "string",
"return_id": "string",
"refunded_at": "2026-10-01T09:30:00Z",
"total": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"lines": [
{}
]
}
],
"returns": [
{
"id": "string",
"number": "string",
"status": "requested"
}
],
"cancellation": {
"reason": "string",
"cancelled_at": "2026-10-01T09:30:00Z"
}
}
],
"next_cursor": "string"
}{
"error": {
"code": "validation_failed",
"message": "The request is not valid.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c",
"details": {
"status": [
"Must be one of: received, on_hold, in_fulfillment, shipped, delivered, cancellation_requested, cancelled."
]
}
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}/ordersCreate an order
Sends an order from your system to Nucleo. Scope orders:write.
- No duplicates.
channel_order_refis your own id of the order. Sending the samechannel_order_refagain with the same key creates nothing: the answer is200with the order created the first time, unchanged. The body is still validated, but its content is not applied. Use it to recover an answer you lost. References are per key: another key can use the same one. - Number. Nucleo shows the order as
API-followed by yournumber(B2B-871becomesAPI-B2B-871), so it never clashes with the sales channel's numbers; read it withGET /orders/API-B2B-871.numbermay use letters, digits,.,-and_, at most 40 characters. Without it,channel_order_refis used and must follow the same rule (400 validation_failedonnumberotherwise). A number another order already has answers409 number_taken— for example two keys sending the samechannel_order_refwithout anumber. - Items. Every line needs the
skuor thebarcodeof an item Nucleo knows, with a barcode; with both, they must be the same item. Unknown or mismatched items reject the whole order with400 unknown_item, one message per line indetails(lines.0,lines.1, …). - Amounts are in EUR, tax included;
currencycan only beEUR. Every line needs itstax_rate, andshipping.tax_rateis required withshipping.price. Nucleo computessubtotal(sum ofunit_price × quantity),tax(the tax of the lines and of the shipping),total(subtotalplusshipping.price);discountsis0: send prices already discounted. - Dates.
placed_atcan carry any offset; Nucleo stores and returns it in UTC. - What happens next. The order is treated as paid. Nucleo's routing rules choose the location.
If no rule covers the order, or no location of its rule has all the items in stock, it stays
on_holduntil the merchant adds or fixes the rule and routes it again.notesreaches the merchant and the warehouse with the order.order.createdis sent to every key that receives webhooks, yours included, always withstatus: received; the status it reaches next comes withorder.status_changed.
Orders created here cannot be changed or cancelled through the API yet: ask the merchant.
Headers
Idempotency-KeystringAny unique string you generate (1–255 printable ASCII characters, no spaces), for example a UUID. For 48 hours, the same key with the same body returns the stored answer without doing the work again (header
Idempotent-Replayed: true; the replayed body is the original one). The same key with a different body answers409 idempotency_key_reused; while the first request is still running,409 idempotency_key_in_progress. A key left in progress for more than 2 minutes (an interrupted call) is free again. Keys are per connection. The body is compared byte by byte: resend exactly the same bytes. Server errors (5xx) and429are not stored: retry them with the same key. Other errors (4xx) are stored too: after fixing the request, send it with a new key. Without a key,channel_order_refstill prevents duplicates.max length 255
Request bodyapplication/json
channel_order_refstringrequiredYour id of the order (printable ASCII, no spaces). Unique per key; sending it again returns the existing order.
max length 120pattern ^[!-~]+$numberstringShown in Nucleo and to the warehouse as
API-plus this value. Defaultchannel_order_ref, which must then follow the same pattern.max length 40pattern ^[A-Za-z0-9][A-Za-z0-9._-]*$placed_atstring (date-time)When the customer placed it, with any offset; stored in UTC. Default now.
currencystringOnly
EUR. DefaultEUR.One ofEURcustomerobjectrequiredChild attributes
namestringDefault the shipping address's first and last name.
max length 255emailstring (email)requiredmax length 255phonestringDefault the shipping address's phone.
max length 40
shipping_addressAddressInputrequiredChild attributes
first_namestringmax length 120last_namestringmax length 120companystringmax length 120address1stringrequiredmax length 255address2stringmax length 255citystringrequiredmax length 120postal_codestringmax length 20province_codestringmax length 10country_codestringrequiredISO 3166-1 alpha-2 (
IT; lowercase is accepted).min length 2max length 2phonestringmax length 40
billing_addressAddressInputChild attributes
first_namestringmax length 120last_namestringmax length 120companystringmax length 120address1stringrequiredmax length 255address2stringmax length 255citystringrequiredmax length 120postal_codestringmax length 20province_codestringmax length 10country_codestringrequiredISO 3166-1 alpha-2 (
IT; lowercase is accepted).min length 2max length 2phonestringmax length 40
shippingobjectChild attributes
method_codestringThe shipping method, as configured in the merchant's carrier rules.
max length 120method_namestringmax length 255pricestring | numberShipping price in EUR, tax included. Default
0.min 0max 100000tax_ratenumberTax percentage of the shipping, for example
22. Required withprice.min 0max 100
notesstringA note for the merchant and the warehouse; it is not returned by the API.
max length 2000linesarray of objectrequiredmin items 1max items 250Attributes of each item
skustringmax length 255barcodestringmax length 255titlestringDefault the item's title in Nucleo.
max length 255quantityintegerrequiredmin 1max 100000unit_pricestring | numberrequiredPrice of one piece in EUR, tax included, after discounts.
min 0max 1000000tax_ratenumberrequiredTax percentage, for example
22.min 0max 100
Responses
200An order with this
channel_order_refalready exists for your key; it is returned unchanged.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
idstring (uuid)requirednumberstringrequiredExample:#1042statusstringrequiredOne ofreceivedon_holdin_fulfillmentshippeddeliveredcancellation_requestedcancelledchannelstring | nullWhere the order comes from, for example
shopify;nucleo_apifor orders created withPOST /orders.placed_atstring (date-time) | nullupdated_atstring (date-time) | nullpayment_statusstring | nullOne ofpendingauthorizedpaidcapturedpartially_refundedrefundedvoidedexpirednullon_holdbooleancustomerobjectChild attributes
namestring | nullemailstring | nullphonestring | null
shipping_addressAddressChild attributes
first_namestring | nulllast_namestring | nullcompanystring | nulladdress1string | nulladdress2string | nullcitystring | nullpostal_codestring | nullprovince_codestring | nullcountry_codestring | nullISO 3166-1 alpha-2.
phonestring | null
billing_addressAddress | nullAddress
first_namestring | nulllast_namestring | nullcompanystring | nulladdress1string | nulladdress2string | nullcitystring | nullpostal_codestring | nullprovince_codestring | nullcountry_codestring | nullISO 3166-1 alpha-2.
phonestring | null
shippingobjectThe shipping method the customer chose.
Child attributes
method_codestring | nullmethod_namestring | null
currencystringtotalsobjectcurrent_totalis the total after edits and cancellations;refundedwhat was refunded on the sales channel.Child attributes
subtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
discountsMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
taxMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
totalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
current_totalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
refundedMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of OrderLinerequiredAttributes of each item
line_idstringskustring | nullbarcodestring | nulltitlestring | nullquantityintegerquantity_cancelledintegerquantity_shippedintegerunit_priceMoneyTax included.
Child attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
totalMoneyTax included.
Child attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
tax_ratestringPercentage as a decimal string, for example
22.00.
shipmentsarray of ShipmentAttributes of each item
idstringstatusstringOne oflabel_createdconfirmedshippeddeliveredvoidedlocation_codestring | nullThe location that shipped it.
carrierobjectChild attributes
codestring | nullnamestring | nullservicestring | null
tracking_urlstring | nulltracking_numbersarray of stringshipped_atstring (date-time) | nulldelivered_atstring (date-time) | nulllinesarray of objectAttributes of each item
line_idstring | nullquantityinteger
refundsarray of RefundAttributes of each item
idstringreturn_idstring | nullThe return it belongs to, if any.
refunded_atstring (date-time) | nulltotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of objectAttributes of each item
line_idstring | nullskustring | nullbarcodestring | nullquantityintegersubtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
returnsarray of objectThe returns opened on the order; read each one with
GET /returns/{return}.Attributes of each item
idstringnumberstring | nullstatusstringOne ofrequestedawaiting_receiptin_transitreceivedcompliantnot_compliantclosedcancelled
cancellationobject | nullPresent when the order is cancelled or its cancellation is requested.
object
reasonstring | nullcancelled_atstring (date-time) | null
201The order was created.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
idstring (uuid)requirednumberstringrequiredExample:#1042statusstringrequiredOne ofreceivedon_holdin_fulfillmentshippeddeliveredcancellation_requestedcancelledchannelstring | nullWhere the order comes from, for example
shopify;nucleo_apifor orders created withPOST /orders.placed_atstring (date-time) | nullupdated_atstring (date-time) | nullpayment_statusstring | nullOne ofpendingauthorizedpaidcapturedpartially_refundedrefundedvoidedexpirednullon_holdbooleancustomerobjectChild attributes
namestring | nullemailstring | nullphonestring | null
shipping_addressAddressChild attributes
first_namestring | nulllast_namestring | nullcompanystring | nulladdress1string | nulladdress2string | nullcitystring | nullpostal_codestring | nullprovince_codestring | nullcountry_codestring | nullISO 3166-1 alpha-2.
phonestring | null
billing_addressAddress | nullAddress
first_namestring | nulllast_namestring | nullcompanystring | nulladdress1string | nulladdress2string | nullcitystring | nullpostal_codestring | nullprovince_codestring | nullcountry_codestring | nullISO 3166-1 alpha-2.
phonestring | null
shippingobjectThe shipping method the customer chose.
Child attributes
method_codestring | nullmethod_namestring | null
currencystringtotalsobjectcurrent_totalis the total after edits and cancellations;refundedwhat was refunded on the sales channel.Child attributes
subtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
discountsMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
taxMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
totalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
current_totalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
refundedMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of OrderLinerequiredAttributes of each item
line_idstringskustring | nullbarcodestring | nulltitlestring | nullquantityintegerquantity_cancelledintegerquantity_shippedintegerunit_priceMoneyTax included.
Child attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
totalMoneyTax included.
Child attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
tax_ratestringPercentage as a decimal string, for example
22.00.
shipmentsarray of ShipmentAttributes of each item
idstringstatusstringOne oflabel_createdconfirmedshippeddeliveredvoidedlocation_codestring | nullThe location that shipped it.
carrierobjectChild attributes
codestring | nullnamestring | nullservicestring | null
tracking_urlstring | nulltracking_numbersarray of stringshipped_atstring (date-time) | nulldelivered_atstring (date-time) | nulllinesarray of objectAttributes of each item
line_idstring | nullquantityinteger
refundsarray of RefundAttributes of each item
idstringreturn_idstring | nullThe return it belongs to, if any.
refunded_atstring (date-time) | nulltotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of objectAttributes of each item
line_idstring | nullskustring | nullbarcodestring | nullquantityintegersubtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
returnsarray of objectThe returns opened on the order; read each one with
GET /returns/{return}.Attributes of each item
idstringnumberstring | nullstatusstringOne ofrequestedawaiting_receiptin_transitreceivedcompliantnot_compliantclosedcancelled
cancellationobject | nullPresent when the order is cancelled or its cancellation is requested.
object
reasonstring | nullcancelled_atstring (date-time) | null
400The request is not valid:
validation_failed(withdetailsper parameter or field),invalid_cursor,invalid_json(the body is not a JSON object) orunknown_item(withdetailsper line, for examplelines.0). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
409
number_taken(another order has thisnumber),idempotency_key_reusedoridempotency_key_in_progress(withRetry-After). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
413The body is larger than 5 MB (
payload_too_large). Nothing was read.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X POST https://api-commerce.nucleoplatform.com/api/commerce/v1/orders \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"channel_order_ref": "SO-2026-00871",
"number": "B2B-871",
"placed_at": "2026-10-13T10:12:00+02:00",
"customer": {
"name": "Anna Rossi",
"email": "buyer@example.com"
},
"shipping_address": {
"first_name": "Anna",
"last_name": "Rossi",
"company": "Rossi Boutique",
"address1": "Via Emilia 120",
"city": "Modena",
"postal_code": "41121",
"province_code": "MO",
"country_code": "IT",
"phone": "+39 059 000000"
},
"shipping": {
"method_code": "standard",
"method_name": "Standard",
"price": "5.00",
"tax_rate": 22
},
"lines": [
{
"sku": "TEE-BLK-M",
"quantity": 2,
"unit_price": "29.90",
"tax_rate": 22
},
{
"barcode": "8000000000017",
"quantity": 1,
"unit_price": "59.00",
"tax_rate": 22
}
]
}'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/orders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"channel_order_ref": "SO-2026-00871",
"number": "B2B-871",
"placed_at": "2026-10-13T10:12:00+02:00",
"customer": {
"name": "Anna Rossi",
"email": "buyer@example.com"
},
"shipping_address": {
"first_name": "Anna",
"last_name": "Rossi",
"company": "Rossi Boutique",
"address1": "Via Emilia 120",
"city": "Modena",
"postal_code": "41121",
"province_code": "MO",
"country_code": "IT",
"phone": "+39 059 000000"
},
"shipping": {
"method_code": "standard",
"method_name": "Standard",
"price": "5.00",
"tax_rate": 22
},
"lines": [
{
"sku": "TEE-BLK-M",
"quantity": 2,
"unit_price": "29.90",
"tax_rate": 22
},
{
"barcode": "8000000000017",
"quantity": 1,
"unit_price": "59.00",
"tax_rate": 22
}
]
}),
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('POST', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/orders', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
],
'json' => [
'channel_order_ref' => 'SO-2026-00871',
'number' => 'B2B-871',
'placed_at' => '2026-10-13T10:12:00+02:00',
'customer' => [
'name' => 'Anna Rossi',
'email' => 'buyer@example.com',
],
'shipping_address' => [
'first_name' => 'Anna',
'last_name' => 'Rossi',
'company' => 'Rossi Boutique',
'address1' => 'Via Emilia 120',
'city' => 'Modena',
'postal_code' => '41121',
'province_code' => 'MO',
'country_code' => 'IT',
'phone' => '+39 059 000000',
],
'shipping' => [
'method_code' => 'standard',
'method_name' => 'Standard',
'price' => '5.00',
'tax_rate' => 22,
],
'lines' => [
[
'sku' => 'TEE-BLK-M',
'quantity' => 2,
'unit_price' => '29.90',
'tax_rate' => 22,
],
[
'barcode' => '8000000000017',
'quantity' => 1,
'unit_price' => '59.00',
'tax_rate' => 22,
],
],
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"id": "9b2f4c1e-5d7a-4e8b-9c3d-2a1f0e6b7c8d",
"number": "#1042",
"status": "received",
"channel": "string",
"placed_at": "2026-10-01T09:30:00Z",
"updated_at": "2026-10-01T09:30:00Z",
"payment_status": "pending",
"on_hold": true,
"customer": {
"name": "string",
"email": "string",
"phone": "string"
},
"shipping_address": {
"first_name": "string",
"last_name": "string",
"company": "string",
"address1": "string",
"address2": "string",
"city": "string",
"postal_code": "string",
"province_code": "string",
"country_code": "string",
"phone": "string"
},
"billing_address": {
"first_name": "string",
"last_name": "string",
"company": "string",
"address1": "string",
"address2": "string",
"city": "string",
"postal_code": "string",
"province_code": "string",
"country_code": "string",
"phone": "string"
},
"shipping": {
"method_code": "string",
"method_name": "string"
},
"currency": "string",
"totals": {
"subtotal": {
"amount": "180.00",
"currency": "EUR"
},
"discounts": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"tax": {
"amount": "180.00",
"currency": "EUR"
},
"total": {
"amount": "180.00",
"currency": "EUR"
},
"current_total": {
"amount": "180.00",
"currency": "EUR"
},
"refunded": {
"amount": "180.00",
"currency": "EUR"
}
},
"lines": [
{
"line_id": "string",
"sku": "string",
"barcode": "string",
"title": "string",
"quantity": 1,
"quantity_cancelled": 1,
"quantity_shipped": 1,
"unit_price": {
"amount": "180.00",
"currency": "EUR"
},
"total": {
"amount": "180.00",
"currency": "EUR"
},
"tax_rate": "string"
}
],
"shipments": [
{
"id": "string",
"status": "label_created",
"location_code": "string",
"carrier": {
"code": "string",
"name": "string",
"service": "string"
},
"tracking_url": "string",
"tracking_numbers": [
"string"
],
"shipped_at": "2026-10-01T09:30:00Z",
"delivered_at": "2026-10-01T09:30:00Z",
"lines": [
{
"line_id": "string",
"quantity": 1
}
]
}
],
"refunds": [
{
"id": "string",
"return_id": "string",
"refunded_at": "2026-10-01T09:30:00Z",
"total": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"lines": [
{
"line_id": "string",
"sku": "string",
"barcode": "string",
"quantity": 1,
"subtotal": {
"amount": "180.00",
"currency": "EUR"
}
}
]
}
],
"returns": [
{
"id": "string",
"number": "string",
"status": "requested"
}
],
"cancellation": {
"reason": "string",
"cancelled_at": "2026-10-01T09:30:00Z"
}
}{
"id": "9b2f4c1e-5d7a-4e8b-9c3d-2a1f0e6b7c8d",
"number": "#1042",
"status": "received",
"channel": "string",
"placed_at": "2026-10-01T09:30:00Z",
"updated_at": "2026-10-01T09:30:00Z",
"payment_status": "pending",
"on_hold": true,
"customer": {
"name": "string",
"email": "string",
"phone": "string"
},
"shipping_address": {
"first_name": "string",
"last_name": "string",
"company": "string",
"address1": "string",
"address2": "string",
"city": "string",
"postal_code": "string",
"province_code": "string",
"country_code": "string",
"phone": "string"
},
"billing_address": {
"first_name": "string",
"last_name": "string",
"company": "string",
"address1": "string",
"address2": "string",
"city": "string",
"postal_code": "string",
"province_code": "string",
"country_code": "string",
"phone": "string"
},
"shipping": {
"method_code": "string",
"method_name": "string"
},
"currency": "string",
"totals": {
"subtotal": {
"amount": "180.00",
"currency": "EUR"
},
"discounts": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"tax": {
"amount": "180.00",
"currency": "EUR"
},
"total": {
"amount": "180.00",
"currency": "EUR"
},
"current_total": {
"amount": "180.00",
"currency": "EUR"
},
"refunded": {
"amount": "180.00",
"currency": "EUR"
}
},
"lines": [
{
"line_id": "string",
"sku": "string",
"barcode": "string",
"title": "string",
"quantity": 1,
"quantity_cancelled": 1,
"quantity_shipped": 1,
"unit_price": {
"amount": "180.00",
"currency": "EUR"
},
"total": {
"amount": "180.00",
"currency": "EUR"
},
"tax_rate": "string"
}
],
"shipments": [
{
"id": "string",
"status": "label_created",
"location_code": "string",
"carrier": {
"code": "string",
"name": "string",
"service": "string"
},
"tracking_url": "string",
"tracking_numbers": [
"string"
],
"shipped_at": "2026-10-01T09:30:00Z",
"delivered_at": "2026-10-01T09:30:00Z",
"lines": [
{
"line_id": "string",
"quantity": 1
}
]
}
],
"refunds": [
{
"id": "string",
"return_id": "string",
"refunded_at": "2026-10-01T09:30:00Z",
"total": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"lines": [
{
"line_id": "string",
"sku": "string",
"barcode": "string",
"quantity": 1,
"subtotal": {
"amount": "180.00",
"currency": "EUR"
}
}
]
}
],
"returns": [
{
"id": "string",
"number": "string",
"status": "requested"
}
],
"cancellation": {
"reason": "string",
"cancelled_at": "2026-10-01T09:30:00Z"
}
}{
"error": {
"code": "validation_failed",
"message": "The request is not valid.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c",
"details": {
"status": [
"Must be one of: received, on_hold, in_fulfillment, shipped, delivered, cancellation_requested, cancelled."
]
}
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "number_taken",
"message": "Another order is already numbered API-B2B-871: send a different number.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "string",
"message": "string",
"request_id": "string",
"details": {}
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}/orders/{order}Get an order
One order, by number or id. Scope orders:read.
Path parameters
orderstringrequiredThe order number (
1042,%231042) or the orderid.Example:1042
Responses
200The order.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
idstring (uuid)requirednumberstringrequiredExample:#1042statusstringrequiredOne ofreceivedon_holdin_fulfillmentshippeddeliveredcancellation_requestedcancelledchannelstring | nullWhere the order comes from, for example
shopify;nucleo_apifor orders created withPOST /orders.placed_atstring (date-time) | nullupdated_atstring (date-time) | nullpayment_statusstring | nullOne ofpendingauthorizedpaidcapturedpartially_refundedrefundedvoidedexpirednullon_holdbooleancustomerobjectChild attributes
namestring | nullemailstring | nullphonestring | null
shipping_addressAddressChild attributes
first_namestring | nulllast_namestring | nullcompanystring | nulladdress1string | nulladdress2string | nullcitystring | nullpostal_codestring | nullprovince_codestring | nullcountry_codestring | nullISO 3166-1 alpha-2.
phonestring | null
billing_addressAddress | nullAddress
first_namestring | nulllast_namestring | nullcompanystring | nulladdress1string | nulladdress2string | nullcitystring | nullpostal_codestring | nullprovince_codestring | nullcountry_codestring | nullISO 3166-1 alpha-2.
phonestring | null
shippingobjectThe shipping method the customer chose.
Child attributes
method_codestring | nullmethod_namestring | null
currencystringtotalsobjectcurrent_totalis the total after edits and cancellations;refundedwhat was refunded on the sales channel.Child attributes
subtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
discountsMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
taxMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
totalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
current_totalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
refundedMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of OrderLinerequiredAttributes of each item
line_idstringskustring | nullbarcodestring | nulltitlestring | nullquantityintegerquantity_cancelledintegerquantity_shippedintegerunit_priceMoneyTax included.
Child attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
totalMoneyTax included.
Child attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
tax_ratestringPercentage as a decimal string, for example
22.00.
shipmentsarray of ShipmentAttributes of each item
idstringstatusstringOne oflabel_createdconfirmedshippeddeliveredvoidedlocation_codestring | nullThe location that shipped it.
carrierobjectChild attributes
codestring | nullnamestring | nullservicestring | null
tracking_urlstring | nulltracking_numbersarray of stringshipped_atstring (date-time) | nulldelivered_atstring (date-time) | nulllinesarray of objectAttributes of each item
line_idstring | nullquantityinteger
refundsarray of RefundAttributes of each item
idstringreturn_idstring | nullThe return it belongs to, if any.
refunded_atstring (date-time) | nulltotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of objectAttributes of each item
line_idstring | nullskustring | nullbarcodestring | nullquantityintegersubtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
returnsarray of objectThe returns opened on the order; read each one with
GET /returns/{return}.Attributes of each item
idstringnumberstring | nullstatusstringOne ofrequestedawaiting_receiptin_transitreceivedcompliantnot_compliantclosedcancelled
cancellationobject | nullPresent when the order is cancelled or its cancellation is requested.
object
reasonstring | nullcancelled_atstring (date-time) | null
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
404
order_not_foundorreturn_not_found.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X GET https://api-commerce.nucleoplatform.com/api/commerce/v1/orders/1042 \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Accept: application/json'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/orders/1042", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
Accept: "application/json",
},
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/orders/1042', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
'Accept' => 'application/json',
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"id": "9b2f4c1e-5d7a-4e8b-9c3d-2a1f0e6b7c8d",
"number": "#1042",
"status": "received",
"channel": "string",
"placed_at": "2026-10-01T09:30:00Z",
"updated_at": "2026-10-01T09:30:00Z",
"payment_status": "pending",
"on_hold": true,
"customer": {
"name": "string",
"email": "string",
"phone": "string"
},
"shipping_address": {
"first_name": "string",
"last_name": "string",
"company": "string",
"address1": "string",
"address2": "string",
"city": "string",
"postal_code": "string",
"province_code": "string",
"country_code": "string",
"phone": "string"
},
"billing_address": {
"first_name": "string",
"last_name": "string",
"company": "string",
"address1": "string",
"address2": "string",
"city": "string",
"postal_code": "string",
"province_code": "string",
"country_code": "string",
"phone": "string"
},
"shipping": {
"method_code": "string",
"method_name": "string"
},
"currency": "string",
"totals": {
"subtotal": {
"amount": "180.00",
"currency": "EUR"
},
"discounts": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"tax": {
"amount": "180.00",
"currency": "EUR"
},
"total": {
"amount": "180.00",
"currency": "EUR"
},
"current_total": {
"amount": "180.00",
"currency": "EUR"
},
"refunded": {
"amount": "180.00",
"currency": "EUR"
}
},
"lines": [
{
"line_id": "string",
"sku": "string",
"barcode": "string",
"title": "string",
"quantity": 1,
"quantity_cancelled": 1,
"quantity_shipped": 1,
"unit_price": {
"amount": "180.00",
"currency": "EUR"
},
"total": {
"amount": "180.00",
"currency": "EUR"
},
"tax_rate": "string"
}
],
"shipments": [
{
"id": "string",
"status": "label_created",
"location_code": "string",
"carrier": {
"code": "string",
"name": "string",
"service": "string"
},
"tracking_url": "string",
"tracking_numbers": [
"string"
],
"shipped_at": "2026-10-01T09:30:00Z",
"delivered_at": "2026-10-01T09:30:00Z",
"lines": [
{
"line_id": "string",
"quantity": 1
}
]
}
],
"refunds": [
{
"id": "string",
"return_id": "string",
"refunded_at": "2026-10-01T09:30:00Z",
"total": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"lines": [
{
"line_id": "string",
"sku": "string",
"barcode": "string",
"quantity": 1,
"subtotal": {
"amount": "180.00",
"currency": "EUR"
}
}
]
}
],
"returns": [
{
"id": "string",
"number": "string",
"status": "requested"
}
],
"cancellation": {
"reason": "string",
"cancelled_at": "2026-10-01T09:30:00Z"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "order_not_found",
"message": "Order 1042 not found.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}/orders/{order}/timelineGet an order's timeline
What happened to the order, oldest first: status changes, holds, address and line changes,
shipments, returns and refunds. Internal events (routing, notes, customer care) are not listed.
Scope orders:read.
Path parameters
orderstringrequiredThe order number (
1042,%231042) or the orderid.Example:1042
Responses
200The order's public events.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
dataarray of TimelineEventrequiredAttributes of each item
typestringOne oforder.receivedorder.status_changedorder.hold_placedorder.hold_releasedorder.address_changedorder.shipping_method_changedorder.lines_changedorder.lines_cancelledorder.item_replacedorder.reship_createdorder.refunded_on_channelshipment.confirmedshipment.shippedshipment.tracking_updatedshipment.voidedreturn.requestedreturn.status_changedstore.ready_for_pickupstore.collectedfrom_statusstring | nullFor status changes, the public status before (an order status, or a return status for
return.status_changed).to_statusstring | nulloccurred_atstring (date-time) | null
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
404
order_not_foundorreturn_not_found.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X GET https://api-commerce.nucleoplatform.com/api/commerce/v1/orders/1042/timeline \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Accept: application/json'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/orders/1042/timeline", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
Accept: "application/json",
},
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/orders/1042/timeline', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
'Accept' => 'application/json',
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"data": [
{
"type": "order.received",
"from_status": null,
"to_status": null,
"occurred_at": "2026-10-12T09:14:00Z"
},
{
"type": "order.status_changed",
"from_status": "received",
"to_status": "in_fulfillment",
"occurred_at": "2026-10-12T09:15:02Z"
},
{
"type": "shipment.shipped",
"from_status": null,
"to_status": null,
"occurred_at": "2026-10-12T16:40:11Z"
}
]
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "order_not_found",
"message": "Order 1042 not found.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}Returns
Returns come from the sales channel, where the customer opens them. Nucleo follows them to the warehouse and records what arrived and in which condition.
| Status | Meaning |
|---|---|
requested | Opened on the sales channel. |
awaiting_receipt | The warehouse knows it is coming. |
in_transit | The parcel is travelling back. |
received | Arrived at the warehouse, being checked. |
compliant | Every item arrived, in sellable condition. |
not_compliant | Something is missing or not sellable: the merchant's customer service is alerted. |
closed | Done. |
cancelled | Cancelled. |
/returnsList returns
Returns sorted by last update, oldest first. Scope returns:read.
Query parameters
statusstringOnly returns in this status.
One ofrequestedawaiting_receiptin_transitreceivedcompliantnot_compliantclosedcancelledExample:requestedupdated_sincestring (date-time)Only items updated at or after this time (ISO 8601). Encode
+as%2Bif you send an offset.Example:2026-10-13T08:00:00ZcursorstringThe
next_cursorof the previous page. Keepstatusandupdated_sincethe same; a differentstatusanswers400 invalid_cursor.limitintegerItems per page.
min 1max 200default 50Example:50
Responses
200A page of returns.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
dataarray of ReturnrequiredAttributes of each item
idstringrequirednumberstring | nullorder_idstring | nullorder_numberstring | nullstatusstringrequiredOne ofrequestedawaiting_receiptin_transitreceivedcompliantnot_compliantclosedcancelledreason_codestring | nullreason_textstring | nullcustomer_notestring | nullcurrencystringtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
created_atstring (date-time) | nullupdated_atstring (date-time) | nullreceived_atstring (date-time) | nullclosed_atstring (date-time) | nullcancelled_atstring (date-time) | nulllinesarray of objectrequiredAttributes of each item
skustring | nullbarcodestring | nulltitlestring | nullquantity_requestedintegerquantity_receivedintegerreason_codestring | nulloutcomestring | nullThe condition the warehouse found —
sellable,damaged, ormixedwhen the pieces differ;nulluntil checked.
refundsarray of RefundAttributes of each item
idstringreturn_idstring | nullThe return it belongs to, if any.
refunded_atstring (date-time) | nulltotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of objectAttributes of each item
line_idstring | nullskustring | nullbarcodestring | nullquantityintegersubtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
next_cursorstring | nullrequired
400The request is not valid:
validation_failed(withdetailsper parameter or field),invalid_cursor,invalid_json(the body is not a JSON object) orunknown_item(withdetailsper line, for examplelines.0). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X GET 'https://api-commerce.nucleoplatform.com/api/commerce/v1/returns?status=requested&updated_since=2026-10-13T08%3A00%3A00Z&limit=50' \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Accept: application/json'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/returns?status=requested&updated_since=2026-10-13T08%3A00%3A00Z&limit=50", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
Accept: "application/json",
},
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/returns?status=requested&updated_since=2026-10-13T08%3A00%3A00Z&limit=50', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
'Accept' => 'application/json',
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"data": [
{
"id": "string",
"number": "string",
"order_id": "string",
"order_number": "string",
"status": "requested",
"reason_code": "string",
"reason_text": "string",
"customer_note": "string",
"currency": "string",
"total": {
"amount": "180.00",
"currency": "EUR"
},
"created_at": "2026-10-01T09:30:00Z",
"updated_at": "2026-10-01T09:30:00Z",
"received_at": "2026-10-01T09:30:00Z",
"closed_at": "2026-10-01T09:30:00Z",
"cancelled_at": "2026-10-01T09:30:00Z",
"lines": [
{
"sku": "string",
"barcode": "string",
"title": "string",
"quantity_requested": 1,
"quantity_received": 1,
"reason_code": "string",
"outcome": "string"
}
],
"refunds": [
{
"id": "string",
"return_id": "string",
"refunded_at": "2026-10-01T09:30:00Z",
"total": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"lines": [
{}
]
}
]
}
],
"next_cursor": "string"
}{
"error": {
"code": "validation_failed",
"message": "The request is not valid.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c",
"details": {
"status": [
"Must be one of: received, on_hold, in_fulfillment, shipped, delivered, cancellation_requested, cancelled."
]
}
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}/returns/{return}Get a return
One return, by number or id. Scope returns:read.
Path parameters
returnstringrequiredThe return's number (as shown in Nucleo) or its
id.Example:R-1042-1
Responses
200The return.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
idstringrequirednumberstring | nullorder_idstring | nullorder_numberstring | nullstatusstringrequiredOne ofrequestedawaiting_receiptin_transitreceivedcompliantnot_compliantclosedcancelledreason_codestring | nullreason_textstring | nullcustomer_notestring | nullcurrencystringtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
created_atstring (date-time) | nullupdated_atstring (date-time) | nullreceived_atstring (date-time) | nullclosed_atstring (date-time) | nullcancelled_atstring (date-time) | nulllinesarray of objectrequiredAttributes of each item
skustring | nullbarcodestring | nulltitlestring | nullquantity_requestedintegerquantity_receivedintegerreason_codestring | nulloutcomestring | nullThe condition the warehouse found —
sellable,damaged, ormixedwhen the pieces differ;nulluntil checked.
refundsarray of RefundAttributes of each item
idstringreturn_idstring | nullThe return it belongs to, if any.
refunded_atstring (date-time) | nulltotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
shippingMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
linesarray of objectAttributes of each item
line_idstring | nullskustring | nullbarcodestring | nullquantityintegersubtotalMoneyChild attributes
amountstringrequiredDecimal string with two decimals.
Example:180.00currencystringrequiredISO 4217 code.
Example:EUR
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
404
order_not_foundorreturn_not_found.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X GET https://api-commerce.nucleoplatform.com/api/commerce/v1/returns/R-1042-1 \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Accept: application/json'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/returns/R-1042-1", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
Accept: "application/json",
},
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/returns/R-1042-1', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
'Accept' => 'application/json',
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"id": "string",
"number": "string",
"order_id": "string",
"order_number": "string",
"status": "requested",
"reason_code": "string",
"reason_text": "string",
"customer_note": "string",
"currency": "string",
"total": {
"amount": "180.00",
"currency": "EUR"
},
"created_at": "2026-10-01T09:30:00Z",
"updated_at": "2026-10-01T09:30:00Z",
"received_at": "2026-10-01T09:30:00Z",
"closed_at": "2026-10-01T09:30:00Z",
"cancelled_at": "2026-10-01T09:30:00Z",
"lines": [
{
"sku": "string",
"barcode": "string",
"title": "string",
"quantity_requested": 1,
"quantity_received": 1,
"reason_code": "string",
"outcome": "string"
}
],
"refunds": [
{
"id": "string",
"return_id": "string",
"refunded_at": "2026-10-01T09:30:00Z",
"total": {
"amount": "180.00",
"currency": "EUR"
},
"shipping": {
"amount": "180.00",
"currency": "EUR"
},
"lines": [
{
"line_id": "string",
"sku": "string",
"barcode": "string",
"quantity": 1,
"subtotal": {
"amount": "180.00",
"currency": "EUR"
}
}
]
}
]
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "order_not_found",
"message": "Order 1042 not found.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}Inventory
What you can sell now, per item and location: stock on hand, minus what is reserved for open orders and
the safety stock, never below zero. With channel, the sales channel's allocation rules apply too: only
the locations it sells from, minus the pieces held for other channels, within its caps. Pre-order
quantities are not included.
/inventoryGet availability
Availability for up to 100 items per call, by SKU or barcode (or both). Only locations with stock or
reservations for the item are listed; an SKU or barcode Nucleo does not know is left out of the answer.
With channel, that sales channel's allocation rules apply. Scope inventory:read.
Query parameters
skustringComma-separated SKUs.
Example:TEE-BLK-M,TEE-BLK-LbarcodestringComma-separated barcodes (EAN/UPC).
Example:8056377587370channelstringA sales channel type (for example
shopify) or the id of a sales channel connection.
Responses
200Availability per item.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
channelstring | nullrequireddataarray of objectrequiredAttributes of each item
skustring | nullbarcodestringavailableintegerSum of
availableover the listed locations.incomingintegerPieces on inbound shipments expected in the next 365 days, not yet received.
locationsarray of objectAttributes of each item
location_codestring | nullon_handintegerreservedintegerHeld for open orders.
availableinteger
400The request is not valid:
validation_failed(withdetailsper parameter or field),invalid_cursor,invalid_json(the body is not a JSON object) orunknown_item(withdetailsper line, for examplelines.0). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X GET 'https://api-commerce.nucleoplatform.com/api/commerce/v1/inventory?sku=TEE-BLK-M%2CTEE-BLK-L&barcode=8056377587370' \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Accept: application/json'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/inventory?sku=TEE-BLK-M%2CTEE-BLK-L&barcode=8056377587370", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
Accept: "application/json",
},
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/inventory?sku=TEE-BLK-M%2CTEE-BLK-L&barcode=8056377587370', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
'Accept' => 'application/json',
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"channel": null,
"data": [
{
"sku": "TEE-BLK-M",
"barcode": "8056377587370",
"available": 5,
"incoming": 0,
"locations": [
{
"location_code": "WH1",
"on_hand": 6,
"reserved": 1,
"available": 5
}
]
}
]
}{
"error": {
"code": "validation_failed",
"message": "The request is not valid.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c",
"details": {
"status": [
"Must be one of: received, on_hold, in_fulfillment, shipped, delivered, cancellation_requested, cancelled."
]
}
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}Locations
Warehouses and stores of the company, with the codes used in shipments and availability.
/locationsList locations
Every warehouse and store of the company, by code. Scope locations:read.
Responses
200The locations.application/json
HeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
dataarray of LocationrequiredAttributes of each item
codestringnamestringkindstringOne ofwarehousestoremarketplacefulfills_onlinebooleanWhether it ships online orders.
401
unauthorized: the key is missing or wrong, or the call comes from an IP outside the connection's allowlist.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
403The key is right but cannot do this:
insufficient_scope(the key lacks the scope of the call),connection_pausedorconnection_not_active(the connection is paused or not turned on yet). application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
429
rate_limited: wait for the seconds inRetry-After.application/jsonHeadersX-Request-IdThe id of this call. Quote it if you contact support; errors repeat it asrequest_id.Retry-AfterSeconds to wait before the next call.
errorobjectrequiredChild attributes
codestringrequiredMachine-readable code. Branch on this, never on
message.messagestringrequiredrequest_idstringrequireddetailsobjectFor
validation_failed, the messages per parameter.
curl -X GET https://api-commerce.nucleoplatform.com/api/commerce/v1/locations \
-H "Authorization: Bearer $NUCLEO_ACCESS_TOKEN" \
-H 'Accept: application/json'const res = await fetch("https://api-commerce.nucleoplatform.com/api/commerce/v1/locations", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.NUCLEO_ACCESS_TOKEN}`,
Accept: "application/json",
},
});
const data = await res.json();
console.log(res.status, data);<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api-commerce.nucleoplatform.com/api/commerce/v1/locations', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('NUCLEO_ACCESS_TOKEN'),
'Accept' => 'application/json',
],
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo $response->getBody();{
"data": [
{
"code": "MI01",
"name": "Milan flagship",
"kind": "store",
"fulfills_online": true
},
{
"code": "WH1",
"name": "Main warehouse",
"kind": "warehouse",
"fulfills_online": true
}
]
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the orders:read scope.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests: retry after the number of seconds in Retry-After.",
"request_id": "1f7e3c2a-9b8d-4e6f-a5c4-3b2a1d0e9f8c"
}
}Webhooks
Nucleo can call your server when something changes. In the connection's Settings, write your
Webhook URL (https only, on a public address) and save. Your key receives the events of its scopes:
| Event | Scope | When |
|---|---|---|
order.created | orders:read | A new order arrives from the sales channel or through POST /orders, or the merchant creates a replacement order. |
order.status_changed | orders:read | The order's public status changes (internal steps that keep the same public status send nothing). |
shipment.shipped | orders:read | A shipment leaves: one event per shipment, also when an order ships in several parcels. |
return.created | returns:read | A return is opened, or the warehouse receives one nobody announced. |
return.status_changed | returns:read | The return's public status changes. |
Webhooks are hints, not data: read the order or the return with the API to get its current state.
Events can arrive out of order and, after a retry, more than once: skip an id you already handled.
Keep your periodic sync with updated_since as a safety net. GET /ping tells whether webhooks are on
and which events your key receives.
order.createdA new order arrived
Sent when an order arrives from the sales channel or through POST /orders (also to the key that
created it), or when the merchant creates a replacement order (for example to resend lost goods).
Needs orders:read.
Request Nucleo sendsapplication/json
idstring (uuid)requiredUnique per event and the same on every retry. Skip an
idyou already handled.typestringrequiredOne oforder.createdorder.status_changedshipment.shippedreturn.createdreturn.status_changedcreated_atstring (date-time)requiredWhen the change happened in Nucleo.
dataobjectrequiredOrders and shipments:
order_id,order_number;order.createdandorder.status_changedaddstatus(an order status),order.status_changedalsoprevious_status;shipment.shippedaddsshipment_id. Returns:return_id,return_number,order_id,order_numberandstatus(a return status);return.status_changedalsoprevious_status.
Expected response
200Answer with any
2xxwithin 10 seconds; the body is ignored. Any other answer, a redirect or a timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32 minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt carries the sameid(also inX-Nucleo-Webhook-Id) and its number inX-Nucleo-Attempt. While the connection is paused or still a draft no webhook is sent, and the events of that time are not sent later: catch up withupdated_since.
{
"id": "5b7e1c2d-3a4f-4b6c-8d9e-0f1a2b3c4d5e",
"type": "order.created",
"created_at": "2026-10-13T08:29:51Z",
"data": {
"order_id": "3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"order_number": "#1042",
"status": "received"
}
}HTTP 200 — Answer with any `2xx` within 10 seconds; the body is ignored. Any other answer, a redirect or a
timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32
minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt
carries the same `id` (also in `X-Nucleo-Webhook-Id`) and its number in `X-Nucleo-Attempt`.
While the connection is paused or still a draft no webhook is sent, and the events of that time are
not sent later: catch up with `updated_since`.
order.status_changedAn order changed status
Sent when the order's public status changes, with the new status and the previous_status. Needs
orders:read.
Request Nucleo sendsapplication/json
idstring (uuid)requiredUnique per event and the same on every retry. Skip an
idyou already handled.typestringrequiredOne oforder.createdorder.status_changedshipment.shippedreturn.createdreturn.status_changedcreated_atstring (date-time)requiredWhen the change happened in Nucleo.
dataobjectrequiredOrders and shipments:
order_id,order_number;order.createdandorder.status_changedaddstatus(an order status),order.status_changedalsoprevious_status;shipment.shippedaddsshipment_id. Returns:return_id,return_number,order_id,order_numberandstatus(a return status);return.status_changedalsoprevious_status.
Expected response
200Answer with any
2xxwithin 10 seconds; the body is ignored. Any other answer, a redirect or a timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32 minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt carries the sameid(also inX-Nucleo-Webhook-Id) and its number inX-Nucleo-Attempt. While the connection is paused or still a draft no webhook is sent, and the events of that time are not sent later: catch up withupdated_since.
{
"id": "8c9d0e1f-2a3b-4c4d-9e5f-6a7b8c9d0e1f",
"type": "order.status_changed",
"created_at": "2026-10-13T16:02:14Z",
"data": {
"order_id": "3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"order_number": "#1042",
"status": "shipped",
"previous_status": "in_fulfillment"
}
}HTTP 200 — Answer with any `2xx` within 10 seconds; the body is ignored. Any other answer, a redirect or a
timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32
minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt
carries the same `id` (also in `X-Nucleo-Webhook-Id`) and its number in `X-Nucleo-Attempt`.
While the connection is paused or still a draft no webhook is sent, and the events of that time are
not sent later: catch up with `updated_since`.
shipment.shippedA shipment left
Sent for each shipment that leaves, also when the order ships in several parcels from different
locations. shipment_id is the id of one of the order's shipments, with carrier and tracking.
An order the customer collects in a store sends no shipment.shipped: it goes straight to delivered.
Needs orders:read.
Request Nucleo sendsapplication/json
idstring (uuid)requiredUnique per event and the same on every retry. Skip an
idyou already handled.typestringrequiredOne oforder.createdorder.status_changedshipment.shippedreturn.createdreturn.status_changedcreated_atstring (date-time)requiredWhen the change happened in Nucleo.
dataobjectrequiredOrders and shipments:
order_id,order_number;order.createdandorder.status_changedaddstatus(an order status),order.status_changedalsoprevious_status;shipment.shippedaddsshipment_id. Returns:return_id,return_number,order_id,order_numberandstatus(a return status);return.status_changedalsoprevious_status.
Expected response
200Answer with any
2xxwithin 10 seconds; the body is ignored. Any other answer, a redirect or a timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32 minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt carries the sameid(also inX-Nucleo-Webhook-Id) and its number inX-Nucleo-Attempt. While the connection is paused or still a draft no webhook is sent, and the events of that time are not sent later: catch up withupdated_since.
{
"id": "1d2e3f4a-5b6c-4d7e-8f9a-0b1c2d3e4f5a",
"type": "shipment.shipped",
"created_at": "2026-10-13T16:02:15Z",
"data": {
"order_id": "3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"order_number": "#1042",
"shipment_id": "7c6b5a4f-3e2d-4c1b-9a0f-8e7d6c5b4a3f"
}
}HTTP 200 — Answer with any `2xx` within 10 seconds; the body is ignored. Any other answer, a redirect or a
timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32
minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt
carries the same `id` (also in `X-Nucleo-Webhook-Id`) and its number in `X-Nucleo-Attempt`.
While the connection is paused or still a draft no webhook is sent, and the events of that time are
not sent later: catch up with `updated_since`.
return.createdA return was opened
Sent when a return is opened on the sales channel, or when the warehouse receives a return nobody
announced. Needs returns:read.
Request Nucleo sendsapplication/json
idstring (uuid)requiredUnique per event and the same on every retry. Skip an
idyou already handled.typestringrequiredOne oforder.createdorder.status_changedshipment.shippedreturn.createdreturn.status_changedcreated_atstring (date-time)requiredWhen the change happened in Nucleo.
dataobjectrequiredOrders and shipments:
order_id,order_number;order.createdandorder.status_changedaddstatus(an order status),order.status_changedalsoprevious_status;shipment.shippedaddsshipment_id. Returns:return_id,return_number,order_id,order_numberandstatus(a return status);return.status_changedalsoprevious_status.
Expected response
200Answer with any
2xxwithin 10 seconds; the body is ignored. Any other answer, a redirect or a timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32 minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt carries the sameid(also inX-Nucleo-Webhook-Id) and its number inX-Nucleo-Attempt. While the connection is paused or still a draft no webhook is sent, and the events of that time are not sent later: catch up withupdated_since.
{
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"type": "return.created",
"created_at": "2026-10-18T16:20:03Z",
"data": {
"return_id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
"return_number": "R1042-1",
"order_id": "3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"order_number": "#1042",
"status": "requested"
}
}HTTP 200 — Answer with any `2xx` within 10 seconds; the body is ignored. Any other answer, a redirect or a
timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32
minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt
carries the same `id` (also in `X-Nucleo-Webhook-Id`) and its number in `X-Nucleo-Attempt`.
While the connection is paused or still a draft no webhook is sent, and the events of that time are
not sent later: catch up with `updated_since`.
return.status_changedA return changed status
Sent when the return's public status changes, with the new status and the previous_status. Needs
returns:read.
Request Nucleo sendsapplication/json
idstring (uuid)requiredUnique per event and the same on every retry. Skip an
idyou already handled.typestringrequiredOne oforder.createdorder.status_changedshipment.shippedreturn.createdreturn.status_changedcreated_atstring (date-time)requiredWhen the change happened in Nucleo.
dataobjectrequiredOrders and shipments:
order_id,order_number;order.createdandorder.status_changedaddstatus(an order status),order.status_changedalsoprevious_status;shipment.shippedaddsshipment_id. Returns:return_id,return_number,order_id,order_numberandstatus(a return status);return.status_changedalsoprevious_status.
Expected response
200Answer with any
2xxwithin 10 seconds; the body is ignored. Any other answer, a redirect or a timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32 minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt carries the sameid(also inX-Nucleo-Webhook-Id) and its number inX-Nucleo-Attempt. While the connection is paused or still a draft no webhook is sent, and the events of that time are not sent later: catch up withupdated_since.
{
"id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"type": "return.status_changed",
"created_at": "2026-10-21T09:41:27Z",
"data": {
"return_id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
"return_number": "R1042-1",
"order_id": "3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b",
"order_number": "#1042",
"status": "compliant",
"previous_status": "received"
}
}HTTP 200 — Answer with any `2xx` within 10 seconds; the body is ignored. Any other answer, a redirect or a
timeout is retried with exponential backoff (after about 30 seconds, then 1, 2, 4, 8, 16 and 32
minutes): 8 attempts in about an hour, then Nucleo gives up and alerts the merchant. Every attempt
carries the same `id` (also in `X-Nucleo-Webhook-Id`) and its number in `X-Nucleo-Attempt`.
While the connection is paused or still a draft no webhook is sent, and the events of that time are
not sent later: catch up with `updated_since`.