Deze referentie is alleen in het Engels. Naar het Nederlandse REST API-overzicht

Diese Referenz gibt es nur auf Englisch. Zur deutschen REST-API-Übersicht

Cette référence existe uniquement en anglais. Aller à la présentation de l'API REST en français

Esta referencia solo está en inglés. Ir a la introducción de la API REST en español

Problems

Problems

Every error document /api/v2 returns, with its type URI, its extra members and a real example.

View as Markdown

Every problem carries

typeurl

The problem type. This is the only member a client switches on.

titlestring

Short, stable per type, English, never interpolated. Never parse it.

statusinteger

The HTTP status, repeated in the body.

detailstring

Human-readable explanation. May quote values from your request; never shows internal error output.

instancestring

The request path, with no query string.

request_idstring

The id also in the X-Request-Id header. Quote it when you report a problem to plnnrly support.

Which problem a status can be

The documents

Duplicate resource 409

https://developers.plnnrly.com/api/v2/problems/duplicate-resource

Duplicate resource

conflictobject

Machine-readable context for the uniqueness failure.

Show 2 child fields
conflict.fieldstring

The field whose value is already taken.

conflict.valuestring

The rejected value.

{
  "type": "https://developers.plnnrly.com/api/v2/problems/duplicate-resource",
  "title": "Duplicate resource",
  "status": 409,
  "detail": "Another project already uses the code \"ACM\".",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "conflict": {
    "field": "code",
    "value": "ACM"
  }
}

Endpoint not found 404

https://developers.plnnrly.com/api/v2/problems/endpoint-not-found

Endpoint not found

{
  "type": "https://developers.plnnrly.com/api/v2/problems/endpoint-not-found",
  "title": "Endpoint not found",
  "status": 404,
  "detail": "No API endpoint matches this request.",
  "instance": "/api/v2/nope",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Endpoint retired 410

https://developers.plnnrly.com/api/v2/problems/endpoint-retired

Endpoint retired

sunsetdate (YYYY-MM-DD)

The date this endpoint stopped working.

replaced_bystring or null

The route name that replaces it.

{
  "type": "https://developers.plnnrly.com/api/v2/problems/endpoint-retired",
  "title": "Endpoint retired",
  "status": 410,
  "detail": "This endpoint has been retired and no longer serves requests.",
  "instance": "/api/v2/projects/4711/statistics",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "sunset": "2027-09-01",
  "replaced_by": "api.v2.projects.show"
}

Forbidden by policy 403

https://developers.plnnrly.com/api/v2/problems/forbidden-by-policy

Forbidden by policy

{
  "type": "https://developers.plnnrly.com/api/v2/problems/forbidden-by-policy",
  "title": "Forbidden by policy",
  "status": 403,
  "detail": "You may not perform this operation on this record.",
  "instance": "/api/v2/projects/4711",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Idempotency key in flight 409

https://developers.plnnrly.com/api/v2/problems/idempotency-key-in-flight

Idempotency key in flight

{
  "type": "https://developers.plnnrly.com/api/v2/problems/idempotency-key-in-flight",
  "title": "Idempotency key in flight",
  "status": 409,
  "detail": "The original request for this Idempotency-Key is still being processed. Retry shortly.",
  "instance": "/api/v2/worklogs",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Idempotency key required 400

https://developers.plnnrly.com/api/v2/problems/idempotency-key-required

Idempotency key required

{
  "type": "https://developers.plnnrly.com/api/v2/problems/idempotency-key-required",
  "title": "Idempotency key required",
  "status": 400,
  "detail": "This endpoint requires an Idempotency-Key header.",
  "instance": "/api/v2/worklogs",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Idempotency key reused 409

https://developers.plnnrly.com/api/v2/problems/idempotency-key-reused

Idempotency key reused

{
  "type": "https://developers.plnnrly.com/api/v2/problems/idempotency-key-reused",
  "title": "Idempotency key reused",
  "status": 409,
  "detail": "This Idempotency-Key was already used with a different request body.",
  "instance": "/api/v2/worklogs",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Insufficient permission 403

https://developers.plnnrly.com/api/v2/problems/insufficient-permission

Insufficient permission

required_permissionstring

The permission the user is missing, e.g. projects::read.

{
  "type": "https://developers.plnnrly.com/api/v2/problems/insufficient-permission",
  "title": "Insufficient permission",
  "status": 403,
  "detail": "Your role does not carry the permission this endpoint requires.",
  "instance": "/api/v2/projects/4711",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "required_permission": "projects::read"
}

Insufficient token scope 403

https://developers.plnnrly.com/api/v2/problems/insufficient-token-scope

Insufficient token scope

required_abilityarray of string

The token abilities, any one of which would have permitted this request, e.g. ["api:read:project_drive", "api:read:customer_drive"]. A *-prefix route lists every ability of the required class.

{
  "type": "https://developers.plnnrly.com/api/v2/problems/insufficient-token-scope",
  "title": "Insufficient token scope",
  "status": 403,
  "detail": "This token does not carry an ability that covers this endpoint.",
  "instance": "/api/v2/drive-documents/91",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "required_ability": [
    "api:read:project_drive",
    "api:read:customer_drive"
  ]
}

Internal error 500

https://developers.plnnrly.com/api/v2/problems/internal-error

Internal error

{
  "type": "https://developers.plnnrly.com/api/v2/problems/internal-error",
  "title": "Internal error",
  "status": 500,
  "detail": "An unexpected error occurred. Quote the request_id when contacting support.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Invalid cursor 400

https://developers.plnnrly.com/api/v2/problems/invalid-cursor

Invalid cursor

{
  "type": "https://developers.plnnrly.com/api/v2/problems/invalid-cursor",
  "title": "Invalid cursor",
  "status": 400,
  "detail": "The cursor is not valid for this query. Restart the scan without a cursor.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Invalid query parameter 400

https://developers.plnnrly.com/api/v2/problems/invalid-query-parameter

Invalid query parameter

errorsarray of object

One entry per fault. Each carries exactly one of pointer or parameter.

Show 4 child fields
errors.codestring

Machine-readable fault code. Switch on this, never on detail.

unknown_parameter
unsupported_parameter
unknown_filter
unknown_operator
unknown_sort_key
unknown_include_path
depth_exceeded
count_exceeded
out_of_range
invalid_format
paired_filter_missing
mutually_exclusive
required
integer
numeric
string
boolean
array
min
max
between
size
distinct
date_format
decimal
email
url
uuid
regex
after
after_or_equal
before
exists
unique
required_with
prohibited
in

New values may be added.

errors.detailstring

Human-readable explanation; enumerates the allowed set for an allow-list failure.

errors.pointerstring or null

RFC 6901 pointer into the request body, e.g. /minutes.

errors.parameterstring or null

The query-parameter name, brackets included, e.g. filter[start_date][gte].

{
  "type": "https://developers.plnnrly.com/api/v2/problems/invalid-query-parameter",
  "title": "Invalid query parameter",
  "status": 400,
  "detail": "1 query parameter was not recognised or not permitted on this resource.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "errors": [
    {
      "parameter": "limit",
      "code": "unknown_parameter",
      "detail": "Unknown query parameter \"limit\". Allowed: filter[…], sort, include, q, trashed, per_page, cursor, page, with_total, view, meta, force, url_ttl_minutes."
    }
  ]
}

Malformed request 400

https://developers.plnnrly.com/api/v2/problems/malformed-request

Malformed request

{
  "type": "https://developers.plnnrly.com/api/v2/problems/malformed-request",
  "title": "Malformed request",
  "status": 400,
  "detail": "The request could not be read.",
  "instance": "/api/v2/worklogs",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Method not allowed 405

https://developers.plnnrly.com/api/v2/problems/method-not-allowed

Method not allowed

{
  "type": "https://developers.plnnrly.com/api/v2/problems/method-not-allowed",
  "title": "Method not allowed",
  "status": 405,
  "detail": "PUT is not supported. This API patches: use PATCH with only the fields you are changing.",
  "instance": "/api/v2/projects/4711",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Not acceptable 406

https://developers.plnnrly.com/api/v2/problems/not-acceptable

Not acceptable

{
  "type": "https://developers.plnnrly.com/api/v2/problems/not-acceptable",
  "title": "Not acceptable",
  "status": 406,
  "detail": "This API only produces application/json. Send an Accept header that allows it.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Precondition failed 412

https://developers.plnnrly.com/api/v2/problems/precondition-failed

Precondition failed

current_versioninteger or null

The record's current version, where it has one. Null otherwise.

{
  "type": "https://developers.plnnrly.com/api/v2/problems/precondition-failed",
  "title": "Precondition failed",
  "status": 412,
  "detail": "The record changed since the version named in If-Match. Re-read it and retry.",
  "instance": "/api/v2/work-items/812",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "current_version": 12
}

Rate limit exceeded 429

https://developers.plnnrly.com/api/v2/problems/rate-limit-exceeded

Rate limit exceeded

rate_limitobject

Which ceiling was exhausted, and for how long.

Show 2 child fields
rate_limit.limitinteger

Units permitted per minute in the exhausted bucket.

rate_limit.retry_afterinteger

Seconds until the bucket refills.

{
  "type": "https://developers.plnnrly.com/api/v2/problems/rate-limit-exceeded",
  "title": "Rate limit exceeded",
  "status": 429,
  "detail": "The rate limit for this caller has been exhausted. Retry after the interval in the Retry-After header.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "rate_limit": {
    "limit": 600,
    "retry_after": 42
  }
}

Resource not found 404

https://developers.plnnrly.com/api/v2/problems/resource-not-found

Resource not found

{
  "type": "https://developers.plnnrly.com/api/v2/problems/resource-not-found",
  "title": "Resource not found",
  "status": 404,
  "detail": "No Project was found with id 4711.",
  "instance": "/api/v2/projects/4711",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

State conflict 409

https://developers.plnnrly.com/api/v2/problems/state-conflict

State conflict

conflictobject

Machine-readable context. reason is always present; the other keys depend on it.

Show 1 child field
conflict.reasonstring

Why the record's current state forbids the operation.

illegal_transition
already_started
already_completed
not_started
has_logged_time
has_children
unconfigured
locked_by_review
locked_by_invoice
reason_reviewed
locked_by_legacy
locked_by_sync
too_many_tokens
too_many_pending_uploads
upload_not_received
upload_expired
upload_revoked
upload_already_registered
upload_registration_in_progress
upload_object_missing
upload_object_changed
upload_token_mismatch

New values may be added.

{
  "type": "https://developers.plnnrly.com/api/v2/problems/state-conflict",
  "title": "State conflict",
  "status": 409,
  "detail": "The target status is not reachable from this work item's current status.",
  "instance": "/api/v2/work-items/812/actions/transition",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "conflict": {
    "reason": "illegal_transition",
    "from_workflow_status_id": 3,
    "to_workflow_status_id": 9
  }
}

Tenant unavailable 503

https://developers.plnnrly.com/api/v2/problems/tenant-unavailable

Tenant unavailable

{
  "type": "https://developers.plnnrly.com/api/v2/problems/tenant-unavailable",
  "title": "Tenant unavailable",
  "status": 503,
  "detail": "This organisation is provisioning, suspended or archived, or the service is down for maintenance.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Token expired 401

https://developers.plnnrly.com/api/v2/problems/token-expired

Token expired

expired_attimestamp (YYYY-MM-DDThh:mm:ssZ)

When the token expired.

{
  "type": "https://developers.plnnrly.com/api/v2/problems/token-expired",
  "title": "Token expired",
  "status": 401,
  "detail": "This token has expired. Create a new one under API access in your user menu.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "expired_at": "2026-08-01T09:00:00Z"
}

Unauthenticated 401

https://developers.plnnrly.com/api/v2/problems/unauthenticated

Unauthenticated

{
  "type": "https://developers.plnnrly.com/api/v2/problems/unauthenticated",
  "title": "Unauthenticated",
  "status": 401,
  "detail": "No valid bearer token was supplied.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Unprocessable relationship 422

https://developers.plnnrly.com/api/v2/problems/unprocessable-relationship

Unprocessable relationship

errorsarray of object

One entry per fault. Each carries exactly one of pointer or parameter.

Show 4 child fields
errors.codestring

Machine-readable fault code. Switch on this, never on detail.

unknown_parameter
unsupported_parameter
unknown_filter
unknown_operator
unknown_sort_key
unknown_include_path
depth_exceeded
count_exceeded
out_of_range
invalid_format
paired_filter_missing
mutually_exclusive
required
integer
numeric
string
boolean
array
min
max
between
size
distinct
date_format
decimal
email
url
uuid
regex
after
after_or_equal
before
exists
unique
required_with
prohibited
in

New values may be added.

errors.detailstring

Human-readable explanation; enumerates the allowed set for an allow-list failure.

errors.pointerstring or null

RFC 6901 pointer into the request body, e.g. /minutes.

errors.parameterstring or null

The query-parameter name, brackets included, e.g. filter[start_date][gte].

{
  "type": "https://developers.plnnrly.com/api/v2/problems/unprocessable-relationship",
  "title": "Unprocessable relationship",
  "status": 422,
  "detail": "1 referenced record cannot be used here.",
  "instance": "/api/v2/work-items",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "errors": [
    {
      "pointer": "/sprint_id",
      "code": "exists",
      "detail": "Sprint 55 belongs to another project and cannot be used here."
    }
  ]
}

Unsupported media type 415

https://developers.plnnrly.com/api/v2/problems/unsupported-media-type

Unsupported media type

{
  "type": "https://developers.plnnrly.com/api/v2/problems/unsupported-media-type",
  "title": "Unsupported media type",
  "status": 415,
  "detail": "This API only accepts application/json request bodies.",
  "instance": "/api/v2/worklogs",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S"
}

Unsupported parameter 400

https://developers.plnnrly.com/api/v2/problems/unsupported-parameter

Unsupported parameter

errorsarray of object

One entry per fault. Each carries exactly one of pointer or parameter.

Show 4 child fields
errors.codestring

Machine-readable fault code. Switch on this, never on detail.

unknown_parameter
unsupported_parameter
unknown_filter
unknown_operator
unknown_sort_key
unknown_include_path
depth_exceeded
count_exceeded
out_of_range
invalid_format
paired_filter_missing
mutually_exclusive
required
integer
numeric
string
boolean
array
min
max
between
size
distinct
date_format
decimal
email
url
uuid
regex
after
after_or_equal
before
exists
unique
required_with
prohibited
in

New values may be added.

errors.detailstring

Human-readable explanation; enumerates the allowed set for an allow-list failure.

errors.pointerstring or null

RFC 6901 pointer into the request body, e.g. /minutes.

errors.parameterstring or null

The query-parameter name, brackets included, e.g. filter[start_date][gte].

{
  "type": "https://developers.plnnrly.com/api/v2/problems/unsupported-parameter",
  "title": "Unsupported parameter",
  "status": 400,
  "detail": "1 query parameter is not supported on this endpoint.",
  "instance": "/api/v2/projects",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "errors": [
    {
      "parameter": "fields",
      "code": "unsupported_parameter",
      "detail": "Sparse fieldsets are not supported by this API. Use view=summary or view=detail instead."
    }
  ]
}

Validation failed 422

https://developers.plnnrly.com/api/v2/problems/validation-failed

Validation failed

errorsarray of object

One entry per fault. Each carries exactly one of pointer or parameter.

Show 4 child fields
errors.codestring

Machine-readable fault code. Switch on this, never on detail.

unknown_parameter
unsupported_parameter
unknown_filter
unknown_operator
unknown_sort_key
unknown_include_path
depth_exceeded
count_exceeded
out_of_range
invalid_format
paired_filter_missing
mutually_exclusive
required
integer
numeric
string
boolean
array
min
max
between
size
distinct
date_format
decimal
email
url
uuid
regex
after
after_or_equal
before
exists
unique
required_with
prohibited
in

New values may be added.

errors.detailstring

Human-readable explanation; enumerates the allowed set for an allow-list failure.

errors.pointerstring or null

RFC 6901 pointer into the request body, e.g. /minutes.

errors.parameterstring or null

The query-parameter name, brackets included, e.g. filter[start_date][gte].

{
  "type": "https://developers.plnnrly.com/api/v2/problems/validation-failed",
  "title": "Validation failed",
  "status": 422,
  "detail": "3 fields failed validation.",
  "instance": "/api/v2/worklogs",
  "request_id": "01K4B7Q9YV3PZ2N8T1E6M0XR4S",
  "errors": [
    {
      "pointer": "/date",
      "code": "date_format",
      "detail": "The date does not match the format Y-m-d."
    },
    {
      "pointer": "/minutes",
      "code": "min",
      "detail": "The minutes must be at least 1."
    },
    {
      "pointer": "/description",
      "code": "required",
      "detail": "The description field is required."
    }
  ]
}