Errors

The API says what went wrong in two ways. A request it can't take at all gets an HTTP error with a JSON body whose detail says why. A call it takes always answers with a receipt, and a receipt that isn't applied carries diagnostics.

Errors before a call runs

HTTP detail What to do
400 catalogue cursor is invalid The catalogue changed or the cursor is older than 15 minutes. Start again from the first page.
400 request body is not valid JSON Send a JSON object.
401 a bearer credential is required, API key not recognised, API key revoked, API key expired, API key no longer carries any authority Send a working key (Authentication). The answer also has a WWW-Authenticate: Bearer header.
403 this key is not for this profile The key belongs to another business. Use that business's address, or a key made here.
404 not found No such catalogue entry for this key, or no change this key made with that operationId.
413 request body is too large Keep the body under 64 KB.
415 request body must be application/json Send Content-Type: application/json, in UTF-8.
429 too many requests, too many changes in progress Wait the seconds the Retry-After header gives, then send it again (Limits).
503 external access is not available GrowLocal can't check the limits right now, so it lets nothing through. Wait and try again.
503 operation schemas are not available GET /catalog/{entryRef} couldn't load the schemas. Try again later.

Receipts that aren't applied

A call that runs answers with a receipt (Make a call and read the receipt). One that is rejected, conflict or uncertain lists what happened in diagnostics:

{
  "status": "rejected",
  "operationId": "change-quote-request-1",
  "diagnostics": [
    {
      "code": "DATA.FIELD_UNKNOWN",
      "stage": "validation",
      "severity": "error",
      "path": "/values/f_nope",
      "message": "column is not declared by this table",
      "repairBy": "caller"
    }
  ]
}

code is stable, so your software can act on it; message is for people. path points into what you sent. repairBy says who can fix it: caller is you; another value, such as profile-administrator, means someone in the business must change something first.

A rejected receipt answers 400, or 403 when it's a matter of access (a diagnostic whose stage is authority).

Codes you're likely to see

Code Status What it means
ACCESS.OPERATION_UNPUBLISHED rejected (403) The target names an operation the API doesn't offer. Copy it from GET /catalog.
ACCESS.KEY_SCOPE_DENIED rejected (403) This key wasn't made with access to that operation.
ACCESS.OPERATION_ID_TOO_LONG rejected (400) operationId is longer than 80 characters.
CONTRACT.INPUT_INVALID rejected (400) input doesn't match the operation's input; message names the field, for example /query/pageSize 500 is greater than the maximum of 200.
DATA.RESOURCE_NOT_FOUND rejected (400) No such table (or Data feature) here for this key. Get resourceRef and target from the catalogue and List data tables.
DATA.FIELD_UNKNOWN rejected (400) The table has no field with that id.
DATA.FIELD_MANAGED rejected (400) That field is written only by GrowLocal's own step for it (a status, for example), never by a change.
DATA.CURSOR_INVALID rejected (400) The row cursor isn't one, or belongs to another query (Pagination).
DATA.REVISION_CONFLICT conflict (409) The row changed since you read it. Read it again and use its new revision.
DATA.OPERATION_REPLAY_MISMATCH conflict (409) This operationId was already used with a different body. Use a new one.