Skip to content
MatrixRewards
API docs menu

Errors

When a call fails, the answer is a problem: a JSON body sent as application/problem+json, with a code.

Branch on code. The title and detail are for people to read.

If you contact support, quote the request_id. It is also sent as the Request-Id header on every answer, failed or not.

The shape of a problem

FieldTypeAlways thereWhat it is
typestringyesA page on the documentation site for this code: https://matrixrewards.co.uk/docs/errors/<code>.
titlestringyesA short summary of the code, for people. Branch on code, not on this.
statusintegeryesThe HTTP status of the answer, repeated in the body.
codestringyesWhat went wrong, as a word a program can branch on. One of invalid_request, invalid_cursor, unauthenticated, forbidden_scope, not_found, unsupported_version, rate_limited, internal, access_not_recorded, payload_too_large, idempotency_key_reused, idempotency_key_in_use, confirmation_required, confirmation_invalid, test_mode_key, credit_limit_reached, member_has_no_store, code_already_used, store_not_connected, upstream_failed, change_not_recorded, forbidden_for_assistant, webhook_limit_reached, settings_changed, retroactive_change, programme_write_limit, last_reward, offer_read_only, offer_ended, programme_not_set_up, assistant_limit, invalid_image, too_many_images, shopify_file_unavailable, previous_secret.
detailstringnoWhat happened, in a sentence for people.
instancestringnoThe path that was called.
paramstringnoThe field, header or query parameter at fault, when there is exactly one.
request_idstringyesThis request's id, also sent as the Request-Id header. Quote it if you contact support.
doc_urlstringyesThe same page as type: this code's page on the documentation site.
bucketone of read, writenoWith rate_limited: which allowance ran out, reads or writes.
required_scopeone of the Scope valuesnoWith forbidden_scope: the scope this call needs, which the key does not hold.
key_scopeslist of Scope valuesnoWith forbidden_scope: every scope this key holds.
supported_versionslist of stringnoWith unsupported_version: the versions this platform serves.
max_bytesintegernoWith payload_too_large: the largest body accepted, in bytes.
max_pointsintegernoWith invalid_request on delta_points: the largest change allowed, either way.
max_charsintegernoWith invalid_request on reason: the longest reason allowed.
max_endpointsintegernoWith webhook_limit_reached: how many enabled endpoints an account may have.
reasonstringnoWith confirmation_invalid: expired (preview again), wrong_request (the key, member, body or Idempotency-Key differ from the preview) or malformed (not a confirmation this API issued). With invalid_request on a webhook url: what is wrong with the address, as listed under WebhookEndpointRequest. One of malformed, expired, wrong_request, not_a_url, too_long, not_https, port_not_allowed, has_credentials, has_fragment, blocked_name, own_host, blocked_address, does_not_resolve.
directionone of credit, debitnoWith credit_limit_reached: credit for points added, debit for points taken away.
limit_pointsintegernoWith credit_limit_reached: the account's limit in this direction.
used_pointsintegernoWith credit_limit_reached: what the account has already moved in this direction in the window.
upstream_reasonstringnoWith upstream_failed: why Shopify's answer did not confirm the code was switched off.
problemstringnoWith invalid_request or retroactive_change from a programme change: the platform's own reason, like campaign_starts_in_past or retroactive_start. With assistant_limit, which limit: point_value_locked, currency_locked, expiry_locked, more_than_double, raised_from_zero, earning_more_than_double, everyday_rate_moved, changes_how_it_pays, changes_who_it_pays, changes_what_it_gives, minimum_more_than_halved, new_offer_kind, new_reward_too_generous or new_reward_kind.
current_effective_fromstring, or nullnoWith retroactive_change: when the expiry rule shoppers were told about took effect, or null when there is none.
current_period_monthsinteger, or nullnoWith retroactive_change: that rule's period in months, or null when there is none.
beforenumber or string or boolean, or nullnoWith assistant_limit: the figure at the assistant's starting point, in the unit of param (a rate, points, an amount, a percentage, a kind; true or false for whether referrals run).
askednumber or string or boolean, or nullnoWith assistant_limit: what the change asked for, in the same unit.
most_allowednumber or string or boolean, or nullnoWith assistant_limit, when the figure was raised: the most it may rise to. Null where no value of it would do.
least_allowednumber or string or boolean, or nullnoWith assistant_limit, when a cost or a smallest order was lowered, or the everyday rate lowered while an offer rose: the least it may fall to. Null where no value of it would do.
limitintegernoWith programme_write_limit: how many programme changes the account may make through the API in the window.
usedintegernoWith programme_write_limit: how many it has made in the window.

Every code

CodeStatusWhat it isSafe to send again?
invalid_request400The request could not be understoodFix it first
invalid_cursor400The cursor is not one this endpoint issuedFix it first
unauthenticated401No usable API key was presentedFix it first
forbidden_scope403This key does not carry the scope this call needsFix it first
not_found404No such resourceFix it first
unsupported_version404That API version is not served hereFix it first
rate_limited429Too many requests for this keyYes, after waiting
internal500Something went wrong at our endYes, unchanged
access_not_recorded503The access could not be recorded, so the data was not returnedYes, unchanged
payload_too_large413The request body is larger than this endpoint acceptsFix it first
idempotency_key_reused422This Idempotency-Key was already used for a different requestFix it first
idempotency_key_in_use409A request with this Idempotency-Key is still being processedYes, after waiting
confirmation_required428This key must preview the change and send back its confirmationFix it first
confirmation_invalid428The confirmation does not match this request, or has expiredFix it first
test_mode_key403A test key can preview a change but never make oneNo
credit_limit_reached409The daily limit for points changed through the API has been reachedNo
member_has_no_store409This member is not linked to a store the change could be booked toNo
code_already_used409The code has already been spent at checkoutNo
store_not_connected503The store this code belongs to is not connectedFix it first
upstream_failed502Shopify did not confirm the code was switched off, so nothing was changedYes, unchanged
change_not_recorded503The change could not be recorded, so it was not madeYes, unchanged
forbidden_for_assistant403A key for an assistant cannot manage webhooksNo
webhook_limit_reached409This account already has as many webhook endpoints as it mayFix it first
settings_changed409The programme changed after it was read, so nothing was changedFix it first
retroactive_change422The expiry change would reach back before shoppers were toldFix it first
programme_write_limit429The daily limit for programme changes through the API has been reachedNo
last_reward409The store's only reward cannot be removedFix it first
offer_read_only409This rule is not one the API changesNo
offer_ended409The campaign has ended, so it can only be removedNo
programme_not_set_up409This store has no programme set up yetFix it first
assistant_limit403An assistant's key cannot make a change this largeFix it first
invalid_image422The picture is not one a store can useFix it first
too_many_images409The store already keeps as many pictures as it mayFix it first
shopify_file_unavailable502Shopify did not send the pictureYes, unchanged
previous_secret403A key's previous secret cannot create a webhook endpointFix it first

Last updated: 25 September 2026