JSON
- Send request bodies as JSON objects with
Content-Type: application/json. - Field names are camelCase.
- Responses include every documented field. A field with no value is
null, and an empty list is[]. - Ignore response fields you don’t recognize. New fields can be added at any time.
Pagination
List operations are paged. ListActions, which returns the whole IAM action catalog, is the exception.
| Parameter | Meaning |
|---|---|
limit |
Items per page. 1 to 100, 20 by default, unless the operation’s reference says otherwise. Out of range returns 400 invalid_request. |
cursor |
The nextCursor from the previous page. Leave it out for the first page. |
The response holds the items in an array named for them, such as projects, and nextCursor,
which is null on the last page:
{ "projects": [], "nextCursor": "eyJ2IjoxLCJvcmciOi…" }- A page can hold fewer items than
limit, or none, and still have a next page. FollownextCursoruntil it’snull; don’t count items. - A cursor works only with the list and filters it came from. Anything else returns
400 invalid_cursor.
Trails pages differ: LookupEvents takes a limit up to 200
(50 by default), and GetQueryResults up to 1,000 (100 by
default).
Idempotency keys
A create can be retried safely with an Idempotency-Key header. The operations that accept one
list it in the API reference, for example CreateProject and
CreateProcessor.
curl -X POST https://orgs.ezghcloud.com/v1/organizations/$ORG_ID/projects \
-H "Authorization: Bearer $EZGH_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f0c9e1a-2b3d-4c5e-8f60-718293a4b5c6" \
-d '{ "name": "web" }'- The key is 1 to 200 printable ASCII characters, without spaces. A UUID works.
- Retrying with the same key and the same request returns the first response again, with the
header
Idempotent-Replayed: true. Nothing is created twice. - The same key with a different request returns
409 idempotency_conflict. - While the first request is still running, a retry returns
409 idempotency_in_progresswithRetry-After. - Only successful responses are kept. Retrying a request that failed runs it again.
- Keys are kept for at least 24 hours, per organization. Keys for creating an organization are kept per user.
Operations without the header run again on every retry. ProcessDocument is one: a retry processes the document, and bills for it, again.
Conditional writes
Resources that clients read, change and write back answer GET with a strong ETag header, and
every write to them returns the new one. These include users, bots, groups and custom policies
in IAM, and OCR processors.
Send the ETag you read in If-Match on the write. If the resource changed since you read it,
the write returns 412 precondition_failed and changes nothing: read it again and retry.
If-Match is optional; without it, the write applies to whatever is there. Weak tags
(W/"…") never match. The operations that take If-Match list it in the API reference.
Timestamps
- Responses give instants in UTC with milliseconds:
"2026-09-28T10:42:17.250Z". - Requests take RFC 3339 timestamps with
Zor an offset, to at most millisecond precision:"2026-09-28T12:42:17+02:00".
Numbers and money
- Money is a string of integer micros or cents, named in the field:
"amountDueMicros": "12500000"is $12.50. - Decimal quantities are strings, such as
"2537.25". - Counts and limits are JSON numbers.
Parse money and decimals as exact decimals, not floating-point numbers.