Skip to main content

Errors

Error format​

REST errors use application/problem+json:

{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"code": "insufficient_scope",
"detail": "This token doesn't have members:read.",
"instance": "urn:uuid:99999999-9999-4999-8999-999999999991",
"request_id": "99999999-9999-4999-8999-999999999991",
"error": {
"code": "missing_permission",
"message": "This token doesn't have members:read.",
"fix": "Edit the token's permissions in Settings → API connections.",
"docs_url": "https://api.fieldtask.example/public/docs/"
}
}
  • Branch on code: it's the stable, machine-readable value listed below.
  • error is meant for people: a message, a suggested fix and a documentation link. error.code usually equals code; for a missing permission, code is insufficient_scope and error.code is missing_permission.
  • Errors never repeat the values you sent, and validation errors don't name the failing field.
  • Event feed errors that require you to start over also include "resync_required": true.

Every response, successful or not, has an X-Request-ID header, and errors repeat it as request_id.

MCP errors​

MCP tool calls that fail return a tool result with isError: true and the same error object (code, message, fix, docs_url, plus request_id, and retry_after in seconds when you should wait). Problems with the MCP connection itself, such as an expired sign-in, are reported by the MCP protocol instead, and the client asks you to sign in again.

Error codes​

Each endpoint's page lists the codes it can return. This is the complete list.

StatuscodeMeaningWhat to do
400invalid_cursorThe cursor is malformed, was changed, or belongs to a different query, connection or page size.Use `next_page_url` or the cursor exactly as returned, with the same query. To change the query, start again without a cursor.
400invalid_jsonThe body isn't one valid JSON value, repeats a property name, uses `NaN`/`Infinity` or nests deeper than 10 levels.Send a single JSON object encoded as UTF-8.
400invalid_operation_key`Idempotency-Key` isn't 16–128 printable ASCII characters.Use a UUID or another 16–128 character key without spaces at either end.
400invalid_queryThe query string has an unknown, repeated or invalid parameter.Send only the documented query parameters, each once.
401invalid_tokenThe bearer token is missing, malformed, expired, revoked or issued for a different resource (for example an MCP sign-in).Send a current REST API token or REST OAuth access token as `Authorization: Bearer …`.
403api_access_not_enabledFieldTask hasn't enabled API access for this organization, or has disabled it.An owner or admin requests access in **Settings → API connections**.
403insufficient_scopeThe connection lacks a permission this request needs. `error.code` is `missing_permission`.Add the permission named in `error.message` to the connection.
403operation_forbiddenThe connection's access changed while the request was processed, or the result would include data the connection can no longer read.Check the connection's permissions, then retry. Retry creates with the same key and body.
404resource_not_foundThe record doesn't exist or isn't visible to this connection, the feature isn't available in this environment, or the URL is wrong.Check the ID, the API origin and the path (no trailing slash).
405method_not_allowedThis path doesn't accept the HTTP method, or the create isn't enabled in this environment. The `Allow` header lists the methods that are.Use a method listed in `Allow`.
409access_context_changedThe connection's permissions, enrollment or resource selection changed since this cursor was issued. `resync_required` is `true`.Get a new cursor with `after=now`, then rebuild the affected local data from the list endpoints.
409external_reference_conflictAnother record created through this client application already uses this `external_reference`. Nothing was updated.Find the existing record with `?external_reference=…`. Use a new reference only for a genuinely new record.
409idempotency_key_reusedThis key was already used with a different body.Resend the original body with this key, or use a new key for a different record.
409idempotency_window_expiredThis key was used more than seven days ago. It can't be replayed or reused. This doesn't mean the original request failed.Reconcile using your saved record ID before creating anything new.
409operation_in_progressA request with the same key is still being processed.Wait for `Retry-After` seconds, then retry with the same key and body.
410history_expiredThe cursor points to changes older than the feed keeps. `resync_required` is `true`.Get a new cursor with `after=now`, then rebuild your local data from the list endpoints.
410operation_result_expiredThe operation result is older than seven days and is no longer kept. This doesn't mean the create failed.Reconcile using the record ID you saved from the original response.
410resource_goneThe record created by this operation no longer exists.Don't create it again automatically. Check in FieldTask whether it was removed on purpose.
413payload_too_largeThe body is larger than 256 KiB.Send a smaller body.
415unsupported_media_type`Content-Type` isn't `application/json`, or the body is compressed.Send an uncompressed body with `Content-Type: application/json`.
422report_too_largeThe selected date range contains too many entries to page through.Use a shorter date range. A smaller `page_size` doesn't help.
422validation_failedA field is missing, unknown or invalid, a referenced record isn't eligible, or the input needs a feature that isn't enabled.Check the request against the field descriptions. The response doesn't name the field.
429daily_quota_exceededThe organization or connection has used its daily allowance for this kind of request. Allowances reset at 00:00 UTC.Wait for `Retry-After` seconds, or check remaining allowance in **Settings → API connections**.
429rate_limit_exceededToo many requests in the current minute, or too many concurrent requests, for the organization or connection.Wait for `Retry-After` seconds, then retry.
503sync_unavailableThe change feed couldn't be read right now.Retry with backoff using the same cursor.
503temporarily_unavailableThe service couldn't complete the request.Retry with exponential backoff. Retry creates with the same key and body.

The OAuth token endpoint returns standard OAuth errors (invalid_client, invalid_target and so on) instead of this format.

Retrying​

StatusRetry?
400, 401, 403, 404, 405, 413, 415, 422No. Fix the request, credential or permissions first.
409 operation_in_progress, 429Yes, after Retry-After seconds.
503, timeouts, connection errorsYes, with exponential backoff.

Always retry a create with the same idempotency key and body.

Contacting support​

Include the time, the HTTP method and path, the status and code, and the X-Request-ID. Never include tokens, client secrets or invitation links.