Book a delivery in
- Credentials, one of
- Station token
- OAuth access token
- Scopes
listings:write- Subscription
- Needs an active plan. Otherwise
403 subscription_locked. - Idempotency
- Send an
Idempotency-Keyheader. A retry with the same key does the work once.
What arrived from the supplier goes into stock, each line through the stock ledger with the reason receipt. received maps line id to the quantity that arrived; leave it out for everything still due. A delivery can arrive short (the order stays open as part received) but never books more than was ordered.
Access: OAuth scope listings:write; write-gated by the subscription.
AuthorizationBearer <token>It may call only the operations whose x-stations lists its kind, on its own store, and acts through the access of the owner or admin who paired it. Unpairing it, or that person leaving the business, ends it (401 station_revoked).
storeId*stringA store the person can reach. Any other id answers 404, never 403.
purchaseOrderId*stringA supplier order id, from GET /purchase-orders.
Idempotency-Key*stringRequired on every write. Minted on the device when the person taps, reused on every retry. A write without one, or with one that does not match the pattern, is refused with 422 validation_error. Scoped to the token's subject, remembered 24 hours. A replay returns the first 2xx response with Idempotent-Replay: true; a request still running answers 409 in_flight; the same key with a different method, path or body answers 409 idempotency_key_reused; non-2xx results are not remembered. If the key store cannot be read nothing is processed and the answer is 503 idempotency_unavailable: retry with the same key.
^[A-Za-z0-9_-]{8,128}$application/json- body
received?Line id to the quantity that arrived. Leave out for everything still due.
OK
application/json- response
data*curl -X POST 'https://api.shopeazy.co/v1/merchant/stores/<storeId>/purchase-orders/<purchaseOrderId>/receive' \ -H 'Authorization: Bearer <access_token>' \ -H 'Idempotency-Key: <unique_key>' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": { "id": "string", "number": "string", "supplierId": "string", "supplierName": "string", "status": "draft", "lines": [ { "id": "string", "materialId": "string", "itemId": "string", "variantId": "string", "name": "string", "quantity": 0, "received": 0, "unit": "each", "unitCost": null } ], "total": { "amount": 0, "currency": "ZAR" }, "expectedAt": 0, "sentAt": 0, "receivedAt": 0, "note": "string" }}Mark a supplier order sent or cancelled PUT
Setting the state it is already in changes nothing. Access: OAuth scope `listings:write`; write-gated by the subscription.
Sales, orders, visitors and the average order GET
Over the window, against the same length of time before it. Money is minor units. Only money that came in counts. Plan: every plan, as on the console Overview (these are its headline numbers). The other reports (`top-sellers`, `traffic`, `sales`) need Analytics Plus (included with Growth and Scale), else 403 `plan_limit`. Access: OAuth scope `store:read`; owner or admin; not write-gated.