Problems
Every error document /api/v2 returns, with its type URI, its extra members and a real example.
Which problem a status can be
400 Bad request.
idempotency-key-requiredinvalid-cursorinvalid-query-parametermalformed-requestunsupported-parameter
401 Unauthenticated.
404 Not found.
405 Method not allowed.
406 Not acceptable.
409Idempotency Conflict.
412 Precondition failed.
415 Unsupported media type.
422 Unprocessable content.
429 Too many requests.
500 Server error.
503 Service unavailable.
The documents
Duplicate resource 409
https://developers.plnnrly.com/api/v2/problems/duplicate-resource
Duplicate resource
{
"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
{
"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
{
"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
{
"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
One entry per fault. Each carries exactly one of pointer or parameter.
Show 4 child fields
Machine-readable fault code. Switch on this, never on detail.
unknown_parameterunsupported_parameterunknown_filterunknown_operatorunknown_sort_keyunknown_include_pathdepth_exceededcount_exceededout_of_rangeinvalid_formatpaired_filter_missingmutually_exclusiverequiredintegernumericstringbooleanarrayminmaxbetweensizedistinctdate_formatdecimalemailurluuidregexafterafter_or_equalbeforeexistsuniquerequired_withprohibitedin
New values may be added.
Human-readable explanation; enumerates the allowed set for an allow-list failure.
{
"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
{
"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
{
"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
Machine-readable context. reason is always present; the other keys depend on it.
Show 1 child field
Why the record's current state forbids the operation.
illegal_transitionalready_startedalready_completednot_startedhas_logged_timehas_childrenunconfiguredlocked_by_reviewlocked_by_invoicereason_reviewedlocked_by_legacylocked_by_synctoo_many_tokenstoo_many_pending_uploadsupload_not_receivedupload_expiredupload_revokedupload_already_registeredupload_registration_in_progressupload_object_missingupload_object_changedupload_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
}
}Token expired 401
https://developers.plnnrly.com/api/v2/problems/token-expired
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
One entry per fault. Each carries exactly one of pointer or parameter.
Show 4 child fields
Machine-readable fault code. Switch on this, never on detail.
unknown_parameterunsupported_parameterunknown_filterunknown_operatorunknown_sort_keyunknown_include_pathdepth_exceededcount_exceededout_of_rangeinvalid_formatpaired_filter_missingmutually_exclusiverequiredintegernumericstringbooleanarrayminmaxbetweensizedistinctdate_formatdecimalemailurluuidregexafterafter_or_equalbeforeexistsuniquerequired_withprohibitedin
New values may be added.
Human-readable explanation; enumerates the allowed set for an allow-list failure.
{
"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
One entry per fault. Each carries exactly one of pointer or parameter.
Show 4 child fields
Machine-readable fault code. Switch on this, never on detail.
unknown_parameterunsupported_parameterunknown_filterunknown_operatorunknown_sort_keyunknown_include_pathdepth_exceededcount_exceededout_of_rangeinvalid_formatpaired_filter_missingmutually_exclusiverequiredintegernumericstringbooleanarrayminmaxbetweensizedistinctdate_formatdecimalemailurluuidregexafterafter_or_equalbeforeexistsuniquerequired_withprohibitedin
New values may be added.
Human-readable explanation; enumerates the allowed set for an allow-list failure.
{
"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
One entry per fault. Each carries exactly one of pointer or parameter.
Show 4 child fields
Machine-readable fault code. Switch on this, never on detail.
unknown_parameterunsupported_parameterunknown_filterunknown_operatorunknown_sort_keyunknown_include_pathdepth_exceededcount_exceededout_of_rangeinvalid_formatpaired_filter_missingmutually_exclusiverequiredintegernumericstringbooleanarrayminmaxbetweensizedistinctdate_formatdecimalemailurluuidregexafterafter_or_equalbeforeexistsuniquerequired_withprohibitedin
New values may be added.
Human-readable explanation; enumerates the allowed set for an allow-list failure.
{
"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."
}
]
}Something wrong or missing on this page? Tell us