application/problem+json). A single schema covers every failure mode —
auth, validation, concurrency, rate-limiting, server errors.
Problem shape
| Field | Type | Notes |
|---|---|---|
type | URI string | Stable identifier for the error category. Keyed on this, not on status or title. |
title | string | Human-readable summary. Safe to display. |
status | integer | HTTP status code, duplicated for convenience. |
detail | string | Human-readable specifics of this particular occurrence. |
instance | string | Request path. |
traceId | string | Correlation id. Include in support requests. |
errors[] | array | Validation-error only — per-field breakdown. |
type, not on status or title. We may add new
problem types over time; we will not change existing ones without a version
bump.
Status-code catalog
| Status | Meaning | Typical type URIs |
|---|---|---|
400 | Malformed request | …/problems/malformed-request |
401 | Missing or invalid token | …/problems/unauthorized |
403 | Authenticated but not authorized (partner scope, capability, DPA) | …/problems/forbidden, …/problems/capability-required, …/problems/dpa-not-accepted |
404 | Resource not found | …/problems/not-found |
409 | State conflict (If-Match mismatch, natural-key collision, milestone already set) | …/problems/version-mismatch, …/problems/resource-exists-different-body, …/problems/milestone-already-set |
422 | Validation failed or idempotency key reused with different body | …/problems/validation-error, …/problems/idempotency-key-reused |
429 | Rate limit exceeded | …/problems/rate-limited |
500 | Unexpected server error | …/problems/internal-error |
Handling examples
Validation errors (422)
Body includes an errors[] array with per-field detail:
detail is a summary.
Concurrency conflicts (409 with version mismatch)
When a PATCH carries an If-Match header that doesn’t match the current
entity version, NT24 returns 409 with the full current resource body
— you don’t need a separate GET to reconcile.
ETag.
Idempotency key reuse (422)
If you reuse an Idempotency-Key within the 24-hour window with a
different body, NT24 rejects with 422:
Rate limiting (429)
Retry-After:
Troubleshooting
403 but `/me` succeeds
403 but `/me` succeeds
Your token is valid, but the specific partner in the URL path isn’t in
your authorized partners list — OR a capability required for the
endpoint (e.g.
allowMarketplaceLedKyc) is false on your org. Check
GET /v1/me.409 on POST that was supposed to be idempotent
409 on POST that was supposed to be idempotent
The resource exists already with a different body than what you’re
sending. Either re-send the exact original body, or switch to
PATCH to
update fields explicitly. Safe retries require both the same
Idempotency-Key AND the same body.422 with no errors[] array
422 with no errors[] array
Non-validation 422 — most commonly idempotency-key reuse with different
body. Check
type.Intermittent 500 errors
Intermittent 500 errors
Capture
traceId from the response body and include it when reaching
our contact page.
We correlate logs by trace id.Next
Rate limits
Tier breakdowns and burst behavior.
Idempotency
Key format, TTL, replay semantics.