Error codes

Every Open Brand Exchange API answers errors as application/problem+json with a machine-readableobx_error and type = https://openbrandexchange.com/errors/<obx_error>, the pages below. Software must handle codes it does not know by their HTTP status.

obx_errorHTTPMeaning
invalid_request400malformed request (JSON, NDJSON, multipart, query)
validation_failed422body is well-formed but invalid; see errors[]
unauthorized401no credentials
invalid_token401expired or unknown token
access_revoked401client revoked, retailer blocked or ingest token revoked
insufficient_scope403token lacks the scope
forbidden403not allowed (role, brand restriction, feature disabled by the brand)
not_found404does not exist or is not visible to the caller
method_not_allowed405method not supported on an existing path (SHOULD; a node MAY answer 404 not_found instead)
conflict409state conflict (not pending, still has children, concurrent job)
precondition_failed412If-Match did not match
payload_too_large413body above the node's limit
unsupported_media_type415content type not accepted
rate_limited429slow down; see Retry-After
limit_exceeded400too many items (GTINs, selection, sync zip, batch)
cursor_invalid400cursor malformed or from another node
cursor_expired410restart /changes without a cursor
export_expired410export or download job files were deleted
original_not_allowed403originals are not available to this caller
invalid_gtin422GTIN has a wrong length or check digit
gtin_conflict409GTIN already belongs to another variant in this node
position_conflict409another asset of this product and colour has this position
checksum_mismatch422uploaded bytes do not match the declared sha256
blob_missing422referenced sha256 has not been uploaded
upload_incomplete409multipart upload has missing parts
unknown_parent422referenced brand or product does not exist
files_missing422an import references an image that was not provided
import_invalid422import file unreadable (not a CSV/zip, no header, unsafe zip entry)
mass_unpublish_refused409mirror import would unpublish more than half of the brand's products
unsafe_url422URL resolves to a private/loopback/link-local address or is not https
csrf_failed403admin API: missing or wrong X-CSRF-Token
invalid_credentials401admin API: wrong e-mail or password
account_blocked403admin API: account or retailer blocked
setup_required409/503node has not completed first-run setup
setup_completed409first-run setup was already done
invite_invalid400invite or reset token unknown, used or expired
not_implemented501optional capability not offered
internal_error500unexpected server error
service_unavailable503temporarily unavailable; retry later

Source: the error table of protocol.md. The OpenAPI descriptions are in theAPI reference.