Skip to content

Reference

Problem types

Every error the API returns is a problem document with a stable code. This page lists them all.

The shape of an error

Errors use application/problem+json (RFC 9457). Match on code: it never changes within /v1. The type URI opens the page for that code, and requestId is what to quote when you report a problem.

application/problem+json
{
  "type": "https://api.tobie.team/problems/validation_failed",
  "title": "Validation failed",
  "status": 400,
  "detail": "1 field failed validation",
  "code": "validation_failed",
  "instance": "/v1/tasks",
  "requestId": "01JC0S7Z5F3X9QK2M4N6P8R0TV",
  "errors": [
    {
      "path": "body.title",
      "rule": "too_small",
      "message": "Must contain at least 1 character"
    }
  ]
}

errors[] appears only on validation failures and never echoes the values you sent. Server errors say Internal error and nothing more. See Errors for the full guide.

All problem types

Problem codes with their HTTP status, title and meaning
CodeStatusTitleMeaningRetry
bad_request400Bad RequestBad requestThe request could not be read: bad JSON, a wrong content type or a malformed value.No
validation_failed400Bad RequestValidation failedThe request was readable, but one or more fields broke a rule. errors[] names each one.No
idempotency_key_required400Bad RequestIdempotency key requiredThis write needs an Idempotency-Key header and the request did not send one.No
unauthorized401UnauthorizedUnauthorizedThe request needs a credential and was not authenticated.No
invalid_token401UnauthorizedInvalid tokenThe bearer credential is missing, unknown, expired or revoked, or was not issued for this API.No
oauth_token_required401UnauthorizedOAuth token requiredThe token is a sign-in session, not an OAuth access token issued to an app.No
grant_revoked401UnauthorizedGrant revokedThe person revoked this app’s access, or never finished granting it.No
wrong_environment401UnauthorizedWrong environmentA test key was sent to the live API, or a live key to a test environment.No
forbidden403ForbiddenForbiddenThe credential is valid, but it may not perform this operation.No
insufficient_scope403ForbiddenInsufficient scopeThe credential is valid but does not hold the scope this operation needs.No
client_not_allowed403ForbiddenClient not allowedThis OAuth app is not allowed to connect, or may not act for this kind of user.No
suspended403ForbiddenSuspendedAccess is suspended for this credential, its owner, the employer or the app.No
no_principal403ForbiddenNo principalThe token is valid, but no active Tobie user or admin stands behind it.No
csrf_failure403ForbiddenCSRF validation failedA browser request that uses a session cookie failed its cross-site check.No
dry_run_only403ForbiddenDry run onlyThis credential may preview this write with dryRun, but may not run it.No
approvals_require_human403ForbiddenApprovals require a humanApprovals are decided by a person at the keyboard, never by a key or an agent.No
not_found404Not FoundNot foundThe resource does not exist, or you may not see it. The API does not say which.No
conflict409ConflictConflictThe request conflicts with the current state of the resource.No
idempotency_in_progress409ConflictIdempotent request in progressA request with the same Idempotency-Key is still running.After a pause
approval_required409ConflictApproval requiredThis write can only run through an approved proposal.No
approval_stale409ConflictApproval staleThe approved plan no longer matches the resource, because it changed after the plan was made.No
approval_principal_invalid409ConflictApproval principal invalidThe credential that proposed this write is no longer valid, so the approval cannot run.No
version_conflict412Precondition FailedVersion conflictThe If-Match version does not match the current version of the resource.No
idempotency_payload_mismatch422Unprocessable ContentIdempotency payload mismatchThe Idempotency-Key was already used with a different request body.No
rate_limited429Too Many RequestsRate limitedThis credential used up its request budget for the current window.After a pause
internal_error500Internal Server ErrorInternal errorSomething failed on Tobie’s side. The response says nothing more, by design.After a pause
not_configured503Service UnavailableNot configuredSomething this request depends on is not set up or not reachable right now.After a pause
unavailable503Service UnavailableUnavailableThe API, or this part of it, is switched off or temporarily down.After a pause

Retrying safely

  • Retry only the codes marked After a pause. Every other code fails the same way until you change the request, the credential or the resource.
  • Honor Retry-After when it is present, and back off further on each attempt.
  • Retry a write with the same Idempotency-Key and the same body, so it cannot run twice.
  • Over MCP, a failed tool call carries the same code and a retryable flag that matches this table.