GET/v1/jobs
List jobs
Returns a page of the merchant's jobs, newest first, optionally of one type — the
imports a back office has run, say, to show which finished and which failed.
Parameters
-
typequery · JobTypeOnly jobs of this type.
-
cursorquery · stringOpaque cursor from a previous page's
next_cursor. Omit to start from the beginning.Pass it back exactly as received. It is base64 and its structure is not part of this contract — decoding it, or constructing one by hand, will break without notice.
-
limitquery · integer · int32Maximum items to return. The server may return fewer, so always drive the loop from
has_morerather than from the size of the page you got back.
Responses
-
200
A page of jobs.
JobPage · application/json
has_morebooleanRequired
Whether another page follows.
-
itemsarray of JobRequired
idstring · uuidRequired
typeJobTypeRequired
What a job is doing, named for what started it: a
catalog_importis created byPOST /v1/catalog-imports.report_exportandsettlement_runare reserved for work not built yet.catalog_importreport_exportsettlement_runcreated_atTimestampRequiredRead only
Server-assigned RFC 3339 timestamp, always UTC.
Server-assigned because device clocks drift and cannot be trusted for ordering — a till that has been powered off for a week may come back with a clock hours out. Where the device's own view of time matters it is carried separately in
client_created_at.finished_atstring · date-timeNullable
-
problemProblemNullable
Present when
statusisfailed.typestring · uriRequired
A stable URI identifying the problem kind. This is the field to branch on.
default about:blank
api_versionstringPresent on an
api-version-retiredorapi-version-unknownrefusal: theAPI-Versionthis server speaks (docs/decisions/0011).detailstringA human-readable explanation specific to this occurrence. Safe to show to a developer; never contains internal state, SQL, or stack traces.
instancestring · uri-referenceA URI reference identifying the specific occurrence.
-
invalid_paramsarray of InvalidParamPresent on
422responses. Lists every field that failed validation, rather than only the first, so a client can highlight an entire form in one pass.codestringStable machine-readable code for this failure, for clients that localise their own messages rather than showing
reason.pointerstringRequired
RFC 6901 JSON Pointer to the offending value within the request body. A pointer rather than a field name so that failures nested inside arrays — the third line item of an order — are addressable at all.
reasonstringRequired
Why this value was rejected, in human-readable form.
-
refusalsarray of Location refusalPresent on
409responses to a withdrawal refused by the state it depends on (deleting a location with tills still assigned, open orders, …). Lists every reason at once, each with how much stands in the way, so a client can say what to put right and link to it rather than walking a person through one refusal after another.kindstringRequired
A stable refusal kind —
devices,open_orders,drawer_sessions,bookingsorstock— that a client links to the screen that puts it right. Branch on this field, never on the surrounding prose.countintegerRequired
How many things stand in the way of the withdrawal, so a client can repeat the number rather than re-read prose.
≥ 1
statusintegerRequired
The HTTP status code, repeated here so the body is self-contained.
100–599
titlestringRequired
A short, human-readable summary of the problem kind.
trace_idstringThe OpenTelemetry trace id for this request. Quote it in a support ticket and the whole request can be pulled up.
-
progressobjectNullable
Best-effort progress. Advisory only —
total_unitsmay be revised upward as work is discovered, so never treatcompleted_units == total_unitsas completion.statusis the only authority on whether the job is done.completed_unitsinteger · int64Required
Units of work finished so far.
≥ 0
total_unitsinteger · int64Required
Units of work known about. Named
total_unitsrather thantotalbecause a baretotalbeside monetary fields reads as an amount, and in an API where every othertotalis money that ambiguity is worth spending a word on.≥ 0
resultobjectNullable
What the job produced, present when
statusissucceeded. For an export this carries a time-limited download URL.started_atstring · date-timeNullable
statusstring · enumRequired
pending— accepted and queued, not yet picked up by a worker.running— in progress;progressmay be populated.succeeded— finished;resultis populated.failed— finished unsuccessfully;problemexplains why. Terminal: the job will not be retried on its own, though the request may be re-submitted.canceled— stopped before it finished. Terminal.pendingrunningsucceededfailedcanceled
next_cursorstringNullable
Opaque cursor for the next page, or null on the last page. Pass it back verbatim as the
cursorquery parameter; its contents are not part of this contract.
-
400
The request could not be parsed. Malformed JSON, a bad query parameter, or a header that failed to decode, among them an
API-Versionlater than the server speaks or not a date (api-version-unknown, with the server's own inapi_version).Distinct from
422: a400never reached validation, soinvalid_paramsis absent. Retrying without changing the request will fail again, except that a request refused for itsAPI-Versiongoes once the server is updated. -
401
No credentials, or credentials that could not be verified — missing bearer token, malformed JWT, expired token, or a signature that failed against the issuer's JWKS.
Refresh the token and retry once. Repeated
401after a refresh means the device needs to re-enrol. -
403
Authenticated, but not permitted. The token is valid and its merchant was resolved, but the caller's role does not allow this operation, or the target belongs to a different merchant.
Cross-tenant access is reported as
403on a resource the caller may not see, and as404where even confirming existence would leak information. Retrying will not help. -
410
The request names an
API-Versionthis server no longer serves (docs/decisions/0011). Nothing in it was read.api_versionnames the version the server speaks: the client is behind, and sends the request again once it is updated. -
422
The request parsed but failed validation.
invalid_paramslists every failing field with a JSON Pointer, not just the first, so a client can mark up a whole form in one pass rather than making the user fix errors one round trip at a time.Also returned when an
Idempotency-Keyis replayed with a different body, and when device-computed order totals disagree with the server's recomputation. -
429
Rate limit exceeded. Honour
Retry-Afterrather than applying your own backoff.A fleet of tills coming back online together after an outage is the realistic cause, which is exactly when uncoordinated client-side retry turns a brief outage into a sustained one. The limit is per process, and per site for what records trade there — a request spends its site's budget, and a till's own smaller one inside it — and per
(client, merchant)for everything else; noRateLimitfield is sent, so this response and itsRetry-Afterare the whole of the contract. -
500
Something failed on our side.
trace_ididentifies the request in our tracing — quote it in a support ticket.The body never carries internal detail: no SQL, no stack traces, no upstream error strings. Safe to retry with the same
Idempotency-Key. -
503
Temporarily unable to serve the request — a dependency is down or the service is shedding load.
Retry with the same
Idempotency-KeyafterRetry-After. This is always safe: a request that did take effect before the failure will be recognised as a replay.