Open the register with a cash float
- Credentials, one of
- Station token
- OAuth access token
- Scopes
orders: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.
Starts a till shift with floatMinor (cents) in the drawer. One shift is open at a time: opening another is 422 validation_error ("The register is already open."). Sales are not tagged with a register: the shift is the window of time since it opened, and every counter sale in it belongs to it.
Cash handling is accountable: the shift records who opened it, and the call joins the Activity log.
Without PINs it is the signed-in person.
Access: OAuth scope orders:write; write-gated by the subscription. Any role that can sell, as in the console's Sell page.
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.
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
floatMinor*integerThe cash float in the drawer, in cents.
0 <= valuecashierTicket?stringNeeded when the store uses till PINs.
Created
application/json- response
data*One till shift. Opened with the cash float in the drawer, closed by counting it. What the drawer should hold is the float plus every cash payment taken while it was open.
curl -X POST 'https://api.shopeazy.co/v1/merchant/stores/<storeId>/registers' \ -H 'Authorization: Bearer <access_token>' \ -H 'Idempotency-Key: <unique_key>' \ -H 'Content-Type: application/json' \ -d '{ "floatMinor": 1}'{ "data": { "id": "string", "status": "open", "openedAt": 0, "openedBy": "string", "openedById": "string", "floatMinor": 0, "closedAt": 0, "closedBy": "string", "closedById": "string", "countedMinor": 0, "expectedCashMinor": 0, "takings": { "sales": 0, "totalMinor": 0, "refundedMinor": 0, "byMethod": [ { "method": "string", "amountMinor": 0 } ], "byPerson": [ { "id": "string", "name": "string", "sales": 0, "amountMinor": 0 } ] }, "note": "string", "createdAt": 0, "updatedAt": 0 }}The till shift that is open now GET
`{ register }`: the open shift with its float, or `null` when none is open. A client reads it to know whether to open one, and to get the `id` it closes. One shift is open at a time per store. Access: OAuth scope `orders:read`; not write-gated.
Close the register by counting the drawer POST
Freezes the shift's takings by payment method (net of refunds) and what the drawer should hold (the float plus every cash payment taken while it was open), beside `countedMinor`. The difference is over or short. A shift that is gone or already closed is 422 `validation_error`. The call joins the Activity log, with the expected and counted cash. Till PINs: as `openRegister`, a call without a valid `cashierTicket` is 403 `cashier_required` when the store uses PINs. Access: OAuth scope `orders:write`; write-gated by the subscription.