> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scrip.dev/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Start with the plan page, https://docs.scrip.dev/agents.md. It covers connecting, configuring, integrating, verifying, and operating a Scrip program.
> Events are asynchronous. `POST /v1/events` returns 202 when the event is accepted. Rules run afterward, so wait for the `event.completed` webhook or poll `GET /v1/events/{id}` before you read balances.
> Send the participant's `external_id` with an event. The first event for a new `external_id` enrolls the participant, so do not create participants first.
> The hosted MCP server is https://mcp.scrip.dev/mcp. It uses OAuth and is read-only. Make changes through the REST API or the dashboard.
> Add `.md` to any docs URL to get the page as Markdown. Request and response schemas are in https://docs.scrip.dev/openapi.json.

# Errors

> Every error code the Scrip API returns, with its status, cause, and fix

Every error response carries a stable `code` you can match on, a `type` that groups codes, and a `request_id` to quote when you contact support. The same value is in the `X-Request-ID` response header. The `doc_url` field links to the entry for that code on this page.

```json theme={null}
{
  "type": "unprocessable",
  "code": "insufficient_funds",
  "message": "The participant has 40.00 PTS available. The request needs 100.00 PTS.",
  "request_id": "req_6f1c2d7e-4b7a-4c0e-9c1a-2f3e4d5c6b7a",
  "doc_url": "https://docs.scrip.dev/errors#insufficient_funds"
}
```

Match on `code`, not on `message`. Messages can change. Some errors also carry `param` (the field at fault), `fields` (one entry per invalid field), or `details`. A `validation_error` lists every failing field in `fields` in one response.

## Retry rules

| Status | Retry |
| - | - |
| `400`, `401`, `403`, `404`, `405`, `410`, `413`, `415`, `422` | No. Change the request first. |
| `408` | Yes, with the same `idempotency_key`. |
| `409` | Read the resource. Retry only when the code is `retryable_conflict` or `idempotency_in_flight`. |
| `429` | Yes, after the `Retry-After` header. |
| `500`, `502`, `503` | Yes, with exponential backoff and the same `idempotency_key`. |

## Invalid request

The request is malformed or breaks a rule on its own. Fix the request and send it again. Type: `invalid_request`.

| Code | Status | Cause | Fix |
| - | - | - | - |
| <a id="amount_precision_exceeded" />`amount_precision_exceeded` | `400` | event\_data contains a number larger than 2^53, which cannot be evaluated exactly. | Send large values as strings, or scale the number down. |
| <a id="amount_required" />`amount_required` | `400` | This reward needs an amount and none was sent. | Add the amount to the redemption. |
| <a id="consent_required" />`consent_required` | `400` | The redeem form was sent without the required consent. | Accept the consent checkbox and send the form again. |
| <a id="fulfillment_face_value_required" />`fulfillment_face_value_required` | `400` | This reward needs a face value and none was sent. | Add the face value to the redemption. |
| <a id="fulfillment_quantity_unsupported" />`fulfillment_quantity_unsupported` | `400` | This reward cannot be redeemed with a quantity other than 1. | Send quantity as 1, or omit it. |
| <a id="header_body_mismatch" />`header_body_mismatch` | `400` | The Idempotency-Key header and the idempotency\_key body field carry different values. | Send the same key in both places, or send only the header. |
| <a id="invalid_config" />`invalid_config` | `400` | The fulfillment account config has a missing or malformed field. | Fix the field named in message and send the request again. |
| <a id="invalid_cursor" />`invalid_cursor` | `400` | The cursor is not one Scrip issued for this list with these filters. | Send the next\_cursor value from a previous response to the same endpoint with the same filters. |
| <a id="invalid_email" />`invalid_email` | `400` | email is not a valid email address. | Send a well formed email address. |
| <a id="invalid_expiration" />`invalid_expiration` | `400` | expires\_at is not a future RFC 3339 timestamp. | Send a future expires\_at, or omit it to use the default. |
| <a id="invalid_filter" />`invalid_filter` | `400` | The lot filter combines fields that cannot be used together or has an invalid value. | Send one supported filter shape, such as lot\_ids or a date range. |
| <a id="invalid_fixed_denomination" />`invalid_fixed_denomination` | `400` | The fixed denomination is not one the product offers. | Send one of the product's fixed denominations. |
| <a id="invalid_fraction" />`invalid_fraction` | `400` | fraction is not a number greater than 0 and at most 1. | Send fraction as a decimal string between 0 and 1. |
| <a id="invalid_issuance_policy" />`invalid_issuance_policy` | `400` | issuance\_policy is not a supported value or does not fit the asset. | Send a supported issuance\_policy for this asset. |
| <a id="invalid_issuer_connection" />`invalid_issuer_connection` | `400` | The pass issuer connection in the request is missing or malformed. | Send the id of an existing pass issuer connection. |
| <a id="invalid_json" />`invalid_json` | `400` | The request body is not a valid JSON object. | Send a single JSON object with Content-Type: application/json. |
| <a id="invalid_lot_lifecycle" />`invalid_lot_lifecycle` | `400` | expires\_at or matures\_at is not an RFC 3339 timestamp, or expires\_in or matures\_in is not a positive duration. | Send RFC 3339 timestamps in expires\_at and matures\_at and durations such as 90d in expires\_in and matures\_in, or omit the field. |
| <a id="invalid_lot_lifecycle_order" />`invalid_lot_lifecycle_order` | `400` | matures\_at is later than expires\_at. | Send a matures\_at that is on or before expires\_at. |
| <a id="invalid_media" />`invalid_media` | `400` | The pass media is not a supported image type or size. | Upload a PNG within the documented size limits. |
| <a id="invalid_oauth_state" />`invalid_oauth_state` | `400` | The OAuth state parameter is missing, expired or does not match this organization. | Start the connection flow again from the dashboard. |
| <a id="invalid_operation" />`invalid_operation` | `400` | The balance operation names a bucket or direction this endpoint does not support. | Use the operation listed for this endpoint in the API reference. |
| <a id="invalid_parameter" />`invalid_parameter` | `400` | A request parameter has a value this operation cannot use. | Check the parameter named in message against the API reference. |
| <a id="invalid_pass_template" />`invalid_pass_template` | `400` | The pass template config has a field that is missing or malformed; details lists each issue. | Fix the issues in details and save the template again. |
| <a id="invalid_platform" />`invalid_platform` | `400` | platform is not APPLE or GOOGLE. | Send platform as APPLE or GOOGLE. |
| <a id="invalid_policy" />`invalid_policy` | `400` | The reward source policy has a missing or malformed field. | Fix the field named in message and send the request again. |
| <a id="invalid_quantity" />`invalid_quantity` | `400` | quantity is not a positive whole number. | Send a quantity of 1 or more. |
| <a id="invalid_rate" />`invalid_rate` | `400` | The reward source rate is not a positive decimal. | Send a positive decimal rate. |
| <a id="invalid_reference_id" />`invalid_reference_id` | `400` | reference\_id is empty or longer than its limit. | Send a reference\_id of 1 to 255 characters. |
| <a id="invalid_reversal_params" />`invalid_reversal_params` | `400` | The reversal names both an amount and a quantity, or neither. | Send exactly one of amount or quantity. |
| <a id="invalid_shortfall_policy" />`invalid_shortfall_policy` | `400` | shortfall\_policy is not one of the supported values. | Send one of the shortfall\_policy values listed in the API reference. |
| <a id="invalid_status" />`invalid_status` | `400` | status is not a value this resource can move to. | Send one of the status values listed for the resource. |
| <a id="issuer_connection_required" />`issuer_connection_required` | `400` | This pass template needs a pass issuer connection and none was sent. | Add an issuer connection to the template. |
| <a id="max_transaction_amount_out_of_range" />`max_transaction_amount_out_of_range` | `400` | max\_transaction\_amount is not a positive number within the asset's precision. | Send a positive max\_transaction\_amount with at most the asset's decimal places. |
| <a id="missing_idempotency_key" />`missing_idempotency_key` | `400` | This operation needs an idempotency key and none was sent. | Add an Idempotency-Key header or idempotency\_key field. |
| <a id="missing_reference_id" />`missing_reference_id` | `400` | This operation needs a reference\_id and none was sent. | Add the reference\_id of the pending rewards to act on. |
| <a id="reserved_reference_id" />`reserved_reference_id` | `400` | reference\_id uses the reserved scrip: namespace. | Choose a reference\_id that does not start with scrip:. |
| <a id="unsupported_credential_owner" />`unsupported_credential_owner` | `400` | The credential owner is not supported for this platform. | Use a supported credential owner for the platform. |
| <a id="unsupported_provider" />`unsupported_provider` | `400` | provider is not a supported fulfillment provider. | Send one of the provider values listed in the API reference. |
| <a id="validation_error" />`validation_error` | `400` | One or more request fields are missing, malformed or not allowed; fields lists each one. | Fix every field listed in fields and send the request again. |
| <a id="method_not_allowed" />`method_not_allowed` | `405` | The route exists but does not accept this HTTP method. | Use one of the methods listed for the route in the API reference. |
| <a id="request_canceled" />`request_canceled` | `408` | The connection closed or the request deadline passed before this batch item was processed. | Send the item again; an unprocessed item was never recorded. |
| <a id="request_too_large" />`request_too_large` | `413` | The request body is larger than 1 MB. | Send a smaller body, or split a batch into several requests. |
| <a id="unsupported_media_type" />`unsupported_media_type` | `415` | The request body was sent with a Content-Type other than application/json. | Send exactly one Content-Type: application/json header. |

## Authentication

Scrip could not tell who is calling. Type: `authentication`.

| Code | Status | Cause | Fix |
| - | - | - | - |
| <a id="authentication_required" />`authentication_required` | `401` | The request carried no API key or session token. | Send Authorization: Bearer \<api\_key>. Create keys in the dashboard under Developers > API keys. |
| <a id="invalid_api_key" />`invalid_api_key` | `401` | The API key in the Authorization header is unknown, revoked or needs rotation. | Send a current key from the dashboard under Developers > API keys. |
| <a id="invalid_mcp_grant" />`invalid_mcp_grant` | `401` | The MCP grant is missing, revoked or ambiguous. | Reconnect the MCP client to Scrip and retry. |
| <a id="invalid_mcp_service_token" />`invalid_mcp_service_token` | `401` | The MCP service token is missing or does not match this deployment. | Configure the MCP runtime with the deployment's service token. |
| <a id="invalid_token" />`invalid_token` | `401` | The session token is malformed, expired or signed for another audience. | Sign in again and retry with a fresh token. |
| <a id="invalid_webhook_signature" />`invalid_webhook_signature` | `401` | The provider callback signature is missing or does not verify. | Check the signing secret registered for this callback. |
| <a id="jwt_not_configured" />`jwt_not_configured` | `401` | This deployment does not accept session tokens. | Authenticate with an API key instead. |
| <a id="user_profile_missing" />`user_profile_missing` | `401` | The session token is valid but no Scrip user matches it. | Sign in again; if the problem continues, contact support with the request\_id. |

## Permission

Scrip knows who is calling, and that caller cannot do this. Type: `permission`.

| Code | Status | Cause | Fix |
| - | - | - | - |
| <a id="actor_assertion_forbidden" />`actor_assertion_forbidden` | `403` | X-On-Behalf-Of is only accepted from a trusted API key. | Remove the header, or use a key that may assert an actor. |
| <a id="admin_key_required" />`admin_key_required` | `403` | This route accepts admin keys only. | Authenticate with an admin API key. |
| <a id="insufficient_permissions" />`insufficient_permissions` | `403` | Your role or key does not include the capability this endpoint needs. | Ask an organization admin for the capability, or use a key that has it. |
| <a id="invalid_origin" />`invalid_origin` | `403` | The request did not come from the Scrip-hosted page that owns this action. | Open the claim or redeem page and act from there. |
| <a id="mcp_capability_denied" />`mcp_capability_denied` | `403` | The MCP grant does not include the capability this tool needs. | Reconnect the MCP client with the required scope. |
| <a id="mcp_program_not_allowed" />`mcp_program_not_allowed` | `403` | The MCP grant does not cover the program in the request. | Use a program the grant allows, or reconnect with wider access. |
| <a id="mcp_scope_required" />`mcp_scope_required` | `403` | The MCP grant does not include the requested scope. | Reconnect the MCP client and approve the scope. |
| <a id="no_organization_membership" />`no_organization_membership` | `403` | Your user account is not a member of any organization. | Accept a pending invite, or create an organization in the dashboard. |
| <a id="not_organization_member" />`not_organization_member` | `403` | You are not a member of the organization in the request. | Use an organization you belong to. |
| <a id="org_key_required" />`org_key_required` | `403` | This route accepts organization keys only. | Authenticate with an organization API key. |
| <a id="organization_context_required" />`organization_context_required` | `403` | This route needs an organization and the credential is not tied to one. | Authenticate with an organization API key or a member session. |
| <a id="preview_token_mismatch" />`preview_token_mismatch` | `403` | The preview token belongs to a different actor. | Request a new preview with your own credentials. |
| <a id="role_hierarchy_violation" />`role_hierarchy_violation` | `403` | The action targets a member whose role is equal to or higher than yours. | Ask a member with a higher role to make this change. |
| <a id="user_context_required" />`user_context_required` | `403` | This route needs a signed-in user and the credential is an API key. | Authenticate with a session token. |
| <a id="user_suspended" />`user_suspended` | `403` | Your user account is suspended. | Ask an organization owner to reactivate your account. |
| <a id="verified_email_required" />`verified_email_required` | `403` | The signed-in identity has no verified email address. | Verify your email address and sign in again. |

## Not found

The resource does not exist, or no longer exists. Type: `not_found`.

| Code | Status | Cause | Fix |
| - | - | - | - |
| <a id="api_key_not_found" />`api_key_not_found` | `404` | No API key with that id exists in your organization. | Check the id, or list your API keys to find the right one. |
| <a id="asset_not_found" />`asset_not_found` | `404` | No asset with that id exists in your organization. | Check the id, or list your assets to find the right one. |
| <a id="attribute_not_found" />`attribute_not_found` | `404` | No attribute with that id exists in your organization. | Check the id, or list your attributes to find the right one. |
| <a id="automation_not_found" />`automation_not_found` | `404` | No automation with that id exists in your organization. | Check the id, or list your automations to find the right one. |
| <a id="budget_not_found" />`budget_not_found` | `404` | No budget with that id exists in your organization. | Check the id, or list your budgets to find the right one. |
| <a id="counter_not_found" />`counter_not_found` | `404` | No counter with that id exists in your organization. | Check the id, or list your counters to find the right one. |
| <a id="event_not_found" />`event_not_found` | `404` | No event with that id exists in your organization. | Check the id, or list your events to find the right one. |
| <a id="fulfillment_account_not_found" />`fulfillment_account_not_found` | `404` | No fulfillment account with that id exists in your organization. | Check the id, or list your fulfillment accounts to find the right one. |
| <a id="group_member_not_found" />`group_member_not_found` | `404` | No group member with that id exists in your organization. | Check the id, or list your group members to find the right one. |
| <a id="group_not_found" />`group_not_found` | `404` | No group with that id exists in your organization. | Check the id, or list your groups to find the right one. |
| <a id="invite_not_found" />`invite_not_found` | `404` | No invite with that id exists in your organization. | Check the id, or list your invites to find the right one. |
| <a id="journal_entry_not_found" />`journal_entry_not_found` | `404` | No journal entry with that id exists in your organization. | Check the id, or list your journal entrys to find the right one. |
| <a id="mcp_oauth_grant_not_found" />`mcp_oauth_grant_not_found` | `404` | No MCP OAuth grant with that id exists in your organization. | Check the id, or list your MCP OAuth grants to find the right one. |
| <a id="organization_not_found" />`organization_not_found` | `404` | No organization with that id exists in your organization. | Check the id, or list your organizations to find the right one. |
| <a id="participant_not_found" />`participant_not_found` | `404` | No participant with that id exists in your organization. | Check the id, or list your participants to find the right one. |
| <a id="pass_gift_card_not_found" />`pass_gift_card_not_found` | `404` | This pass has no gift card to redeem. | Check the pass in the dashboard before sharing its redeem link. |
| <a id="pass_issuer_connection_not_found" />`pass_issuer_connection_not_found` | `404` | No pass issuer connection with that id exists in your organization. | Check the id, or list your pass issuer connections to find the right one. |
| <a id="pass_media_not_found" />`pass_media_not_found` | `404` | No pass media item with that id exists in your organization. | Check the id, or list your pass media items to find the right one. |
| <a id="pass_not_found" />`pass_not_found` | `404` | No pass with that id exists in your organization. | Check the id, or list your passs to find the right one. |
| <a id="pass_notification_not_found" />`pass_notification_not_found` | `404` | No pass notification with that id exists in your organization. | Check the id, or list your pass notifications to find the right one. |
| <a id="pass_template_not_found" />`pass_template_not_found` | `404` | No pass template with that id exists in your organization. | Check the id, or list your pass templates to find the right one. |
| <a id="product_not_found" />`product_not_found` | `404` | No fulfillment product with that id exists in your organization. | Check the id, or list your fulfillment products to find the right one. |
| <a id="program_not_found" />`program_not_found` | `404` | No program with that id exists in your organization. | Check the id, or list your programs to find the right one. |
| <a id="redemption_not_found" />`redemption_not_found` | `404` | No redemption with that id exists in your organization. | Check the id, or list your redemptions to find the right one. |
| <a id="request_log_not_found" />`request_log_not_found` | `404` | No request log with that id exists in your organization. | Check the id, or list your request logs to find the right one. |
| <a id="reservation_not_found" />`reservation_not_found` | `404` | No reservation with that id exists in your organization. | Check the id, or list your reservations to find the right one. |
| <a id="reward_not_found" />`reward_not_found` | `404` | No reward with that id exists in your organization. | Check the id, or list your rewards to find the right one. |
| <a id="reward_source_not_found" />`reward_source_not_found` | `404` | No reward source with that id exists in your organization. | Check the id, or list your reward sources to find the right one. |
| <a id="reward_source_settings_not_found" />`reward_source_settings_not_found` | `404` | No reward source settings with that id exists in your organization. | Check the id, or list your reward source settingss to find the right one. |
| <a id="route_not_found" />`route_not_found` | `404` | No route matches this path. | Check the path against the API reference. |
| <a id="rule_configuration_revision_not_found" />`rule_configuration_revision_not_found` | `404` | No rule configuration revision with that id exists in your organization. | Check the id, or list your rule configuration revisions to find the right one. |
| <a id="rule_not_found" />`rule_not_found` | `404` | No rule with that id exists in your organization. | Check the id, or list your rules to find the right one. |
| <a id="rule_set_not_found" />`rule_set_not_found` | `404` | No rule set with that id exists in your organization. | Check the id, or list your rule sets to find the right one. |
| <a id="simulation_not_found" />`simulation_not_found` | `404` | No simulation with that id exists in your organization. | Check the id, or list your simulations to find the right one. |
| <a id="team_member_not_found" />`team_member_not_found` | `404` | No team member with that id exists in your organization. | Check the id, or list your team members to find the right one. |
| <a id="tier_level_not_found" />`tier_level_not_found` | `404` | No tier level with that id exists in your organization. | Check the id, or list your tier levels to find the right one. |
| <a id="tier_not_found" />`tier_not_found` | `404` | No tier with that id exists in your organization. | Check the id, or list your tiers to find the right one. |
| <a id="webhook_delivery_not_found" />`webhook_delivery_not_found` | `404` | No webhook delivery with that id exists in your organization. | Check the id, or list your webhook deliverys to find the right one. |
| <a id="webhook_endpoint_not_found" />`webhook_endpoint_not_found` | `404` | No webhook endpoint with that id exists in your organization. | Check the id, or list your webhook endpoints to find the right one. |
| <a id="claims_closed" />`claims_closed` | `410` | This pass is no longer accepting claims. | Ask the program owner for a new claim link. |
| <a id="invite_expired" />`invite_expired` | `410` | The invite has expired. | Ask an organization admin to send a new invite. |

## Conflict

The request is valid but conflicts with the current state of a resource. Read the resource, then decide whether to retry. Type: `conflict`.

| Code | Status | Cause | Fix |
| - | - | - | - |
| <a id="admin_api_key_name_already_exists" />`admin_api_key_name_already_exists` | `409` | Another admin API key already uses this name. | Choose a different name. |
| <a id="already_org_member" />`already_org_member` | `409` | The invited user is already a member of this organization. | No invite is needed; manage the member instead. |
| <a id="already_reversed" />`already_reversed` | `409` | This event or redemption was already fully reversed. | No further reversal is possible. |
| <a id="amount_exceeds_remaining" />`amount_exceeds_remaining` | `409` | amount is larger than the redemption's unreversed remainder. | Send at most the remaining amount shown in details. |
| <a id="api_key_name_already_exists" />`api_key_name_already_exists` | `409` | Another API key in your organization already uses this name. | Choose a different name. |
| <a id="asset_already_linked" />`asset_already_linked` | `409` | The asset is already linked to this program. | No action is needed; the link exists. |
| <a id="auto_managed_item" />`auto_managed_item` | `409` | The reward is managed by a reward source and cannot be edited directly. | Change the reward source instead. |
| <a id="automation_name_already_exists" />`automation_name_already_exists` | `409` | Another automation in this program already uses this name. | Choose a different name. |
| <a id="automation_status_conflict" />`automation_status_conflict` | `409` | The automation's status changed while this update was in flight. | Fetch the automation and send the update again. |
| <a id="catalog_reconcile_conflict" />`catalog_reconcile_conflict` | `409` | The provider catalog changed while the reward source was being saved. | Refresh the catalog and save again. |
| <a id="claim_link_not_ready" />`claim_link_not_ready` | `409` | The claim link is not ready yet. | Retry in a few seconds. |
| <a id="email_already_used" />`email_already_used` | `409` | This email address already redeemed the pass. | Use a different email address. |
| <a id="endpoint_not_active" />`endpoint_not_active` | `409` | The webhook endpoint is not active, or it is paused, so it cannot take this delivery. | Enable the endpoint, or wait for the pause to end, then try again. |
| <a id="event_not_retryable" />`event_not_retryable` | `409` | Only FAILED events can be retried; details carries the current status. | Wait for the event to finish, or retry only FAILED events. |
| <a id="event_not_reversible" />`event_not_reversible` | `409` | The event is not COMPLETED, so it has nothing to reverse. | Reverse the event once it completes. |
| <a id="fulfillment_account_exists" />`fulfillment_account_exists` | `409` | A fulfillment account for this provider already exists. | Update the existing fulfillment account instead. |
| <a id="fulfillment_delivered" />`fulfillment_delivered` | `409` | The gift card was already delivered, so the redemption cannot be reversed. | Use a forfeit or adjustment instead. |
| <a id="fulfillment_in_progress" />`fulfillment_in_progress` | `409` | The redemption's fulfillment order is still in progress. | Wait for the order to finish, then retry. |
| <a id="fulfillment_managed" />`fulfillment_managed` | `409` | The fulfillment account is managed by Scrip and cannot be changed here. | Manage it from the dashboard. |
| <a id="idempotency_conflict" />`idempotency_conflict` | `409` | This idempotency key was already used with a different request. | Send a new key for a new request, or repeat the original request exactly. |
| <a id="idempotency_in_flight" />`idempotency_in_flight` | `409` | A request with this idempotency key is still running. | Wait for the first request to finish, then send the same request again to get its response. |
| <a id="invalid_rule_configuration_preview" />`invalid_rule_configuration_preview` | `409` | The preview token does not belong to this program or has been superseded. | Preview the change again. |
| <a id="last_admin_cannot_be_removed" />`last_admin_cannot_be_removed` | `409` | The participant is the group's last admin. | Make another member a group admin first, or retry with force=true. |
| <a id="last_admin_status_change_forbidden" />`last_admin_status_change_forbidden` | `409` | The participant is the last admin of a group and cannot leave the ACTIVE state without force. | Make another member a group admin first, or retry with force=true. |
| <a id="last_owner_cannot_be_removed" />`last_owner_cannot_be_removed` | `409` | The user is the organization's last owner. | Make another member an owner first. |
| <a id="max_per_participant_exceeded" />`max_per_participant_exceeded` | `409` | The participant has reached the reward's per-participant limit. | Raise max\_per\_participant on the reward, or redeem a different one. |
| <a id="max_total_exceeded" />`max_total_exceeded` | `409` | The reward's total redemption limit has been reached. | Raise max\_total on the reward, or redeem a different one. |
| <a id="membership_reactivation_required" />`membership_reactivation_required` | `409` | The user has a suspended membership in this organization. | Reactivate the membership instead of inviting again. |
| <a id="not_resendable" />`not_resendable` | `409` | The webhook delivery is not in a state that can be resent. | Resend only failed or exhausted deliveries. |
| <a id="participant_inactive" />`participant_inactive` | `409` | The participant is SUSPENDED or CLOSED and cannot transact. | Reactivate the participant, then retry. |
| <a id="pass_data_mismatch" />`pass_data_mismatch` | `409` | The pass data in the request does not match the stored pass. | Fetch the pass and send the update against its current data. |
| <a id="pass_issuer_connection_exists" />`pass_issuer_connection_exists` | `409` | A pass issuer connection for this platform already exists. | Update the existing connection instead. |
| <a id="program_archived" />`program_archived` | `409` | The program is ARCHIVED and does not accept configuration changes. | Set the program status to ACTIVE, then retry. |
| <a id="program_inactive" />`program_inactive` | `409` | The program is SUSPENDED or ARCHIVED and does not process this request. | Set the program status to ACTIVE, then retry. |
| <a id="program_name_already_exists" />`program_name_already_exists` | `409` | Another program in your organization already uses this name. | Choose a different name. |
| <a id="provisional_lot_program_conflict" />`provisional_lot_program_conflict` | `409` | The pending rewards for reference\_id were issued by a different program. | Send the program\_id that issued the pending rewards. |
| <a id="quantity_exceeds_remaining" />`quantity_exceeds_remaining` | `409` | quantity is larger than the redemption's unreversed remainder. | Send at most the remaining quantity shown in details. |
| <a id="redemption_already_resolved" />`redemption_already_resolved` | `409` | The pending redemption was already captured or canceled. | Fetch the redemption to see its final state. |
| <a id="redemption_not_completed" />`redemption_not_completed` | `409` | The redemption is not COMPLETED, so it cannot be reversed. | Reverse the redemption once it completes. |
| <a id="reference_provenance_conflict" />`reference_provenance_conflict` | `409` | reference\_id matched value moved by HOLD, not pending rewards. | Settle only references created by a CREDIT into HELD. |
| <a id="reservation_amount_mismatch" />`reservation_amount_mismatch` | `409` | The reserved amount no longer matches the amount that was authorized. | Cancel the redemption and start it again. |
| <a id="reservation_balance_unavailable" />`reservation_balance_unavailable` | `409` | The participant's HELD balance no longer covers the reservation. | Cancel the redemption and start it again. |
| <a id="reservation_conflict" />`reservation_conflict` | `409` | The operation would reduce the HELD balance below the value reserved for pending redemptions. | Capture or cancel the pending redemptions first. |
| <a id="reservation_expired" />`reservation_expired` | `409` | The reservation expired before it was captured. | Start the redemption again. |
| <a id="reservation_provenance_conflict" />`reservation_provenance_conflict` | `409` | The reservation reference matched pending rewards instead of reserved value. | Use a reference\_id that was created by a redemption. |
| <a id="retryable_conflict" />`retryable_conflict` | `409` | The request lost a race with another operation on the same ledger rows; nothing was written. | Retry the request after the Retry-After delay. |
| <a id="reversal_exceeds_remaining" />`reversal_exceeds_remaining` | `409` | The reversal is larger than the unreversed remainder. | Reverse at most the remaining amount shown in details. |
| <a id="reward_name_already_exists" />`reward_name_already_exists` | `409` | Another reward in this program already uses this name. | Choose a different name. |
| <a id="reward_no_longer_available" />`reward_no_longer_available` | `409` | The reward's available\_until has passed. | Extend available\_until on the reward, or redeem a different one. |
| <a id="reward_not_active" />`reward_not_active` | `409` | The reward is not ACTIVE. | Activate the reward, or redeem a different one. |
| <a id="reward_not_yet_available" />`reward_not_yet_available` | `409` | The reward's available\_from is in the future. | Wait for available\_from, or change it on the reward. |
| <a id="reward_price_changed" />`reward_price_changed` | `409` | The reward's cost changed since the catalog was reviewed. | Refresh the catalog and review the cost before redeeming. |
| <a id="reward_source_exists" />`reward_source_exists` | `409` | A reward source for this product already exists in the program. | Update the existing reward source instead. |
| <a id="rule_configuration_dependency_drift" />`rule_configuration_dependency_drift` | `409` | A rule or rule set the preview depends on changed after the preview was taken. | Preview the change again. |
| <a id="rule_configuration_preview_already_applied" />`rule_configuration_preview_already_applied` | `409` | This preview was already applied. | Preview the next change instead. |
| <a id="rule_configuration_preview_expired" />`rule_configuration_preview_expired` | `409` | The preview token has expired. | Preview the change again and apply within the token's lifetime. |
| <a id="rule_configuration_version_conflict" />`rule_configuration_version_conflict` | `409` | expected\_rule\_configuration\_version is behind the live version in details.current\_version. | Fetch the live configuration and send the change against its version. |
| <a id="rule_order_conflict" />`rule_order_conflict` | `409` | Another rule in this rule set already holds this order. | Use position to place the rule, or retry the reorder. |
| <a id="rule_set_key_already_exists" />`rule_set_key_already_exists` | `409` | Another rule set in this program already uses this key. | Choose a different key. |
| <a id="rule_set_order_conflict" />`rule_set_order_conflict` | `409` | Another rule set in this program already holds this order. | Use position to place the rule set, or retry the reorder. |
| <a id="symbol_already_exists" />`symbol_already_exists` | `409` | Another asset in your organization already uses this symbol. | Choose a different symbol. |
| <a id="tier_archived" />`tier_archived` | `409` | The tier is ARCHIVED, so it cannot be assigned or edited. | Restore the tier by setting its status to ACTIVE, or use an active tier. |
| <a id="tier_key_already_exists" />`tier_key_already_exists` | `409` | Another tier or tier level in this program already uses this key or rank. | Choose a different key or rank. |
| <a id="tier_referenced_by_rules" />`tier_referenced_by_rules` | `409` | ACTIVE or SUSPENDED rules still reference this tier; details lists them. | Archive or edit those rules, then archive the tier. |
| <a id="tier_status_changed" />`tier_status_changed` | `409` | The tier status changed while this request was running. | Fetch the tier, then send the request again. |
| <a id="webhook_slot_occupied" />`webhook_slot_occupied` | `409` | The provider's webhook slot is already registered to another connection. | Disconnect the other connection, or reuse it. |

## Unprocessable

The request is well formed and breaks a business rule. Type: `unprocessable`.

| Code | Status | Cause | Fix |
| - | - | - | - |
| <a id="amount_exceeds_maximum" />`amount_exceeds_maximum` | `422` | amount is larger than the asset's max\_transaction\_amount. | Send a smaller amount, or raise max\_transaction\_amount on the asset. |
| <a id="archived_resource" />`archived_resource` | `422` | An archived program or rule cannot be reordered. | Reorder only active rules in an active program. |
| <a id="asset_archived" />`asset_archived` | `422` | The asset is ARCHIVED and cannot move value. | Use an active asset. |
| <a id="asset_not_linked" />`asset_not_linked` | `422` | The asset is not linked to this program. | Link the asset to the program, or use a linked asset. |
| <a id="asset_not_reservable" />`asset_not_reservable` | `422` | This asset cannot back pending redemptions. | Use an asset with lot tracking enabled. |
| <a id="claim_link_fulfillment_failed" />`claim_link_fulfillment_failed` | `422` | The fulfillment order for this claim link failed. | Fetch the redemption to see the failure, then retry or reverse it. |
| <a id="claim_link_not_applicable" />`claim_link_not_applicable` | `422` | This redemption does not produce a claim link. | Use the redemption's own delivery method. |
| <a id="claim_link_unsupported" />`claim_link_unsupported` | `422` | The fulfillment account does not support claim links. | Use a provider that offers claim links. |
| <a id="currency_not_supported" />`currency_not_supported` | `422` | The fulfillment account does not support this currency. | Choose a product in a supported currency. |
| <a id="face_value_not_orderable" />`face_value_not_orderable` | `422` | The product cannot be ordered at this face value. | Send a face value within the product's range or denominations. |
| <a id="fraction_rounds_to_zero" />`fraction_rounds_to_zero` | `422` | fraction of each original award rounds to zero at the asset's precision. | Send a larger fraction, or reverse an explicit amount. |
| <a id="fulfillment_cap_window_invalid" />`fulfillment_cap_window_invalid` | `422` | The fulfillment cap window is not a positive number of seconds. | Send a positive fulfillment\_participant\_window\_seconds. |
| <a id="fulfillment_cap_window_required" />`fulfillment_cap_window_required` | `422` | A per-participant fulfillment cap was set without fulfillment\_participant\_window\_seconds. | Add fulfillment\_participant\_window\_seconds alongside the cap. |
| <a id="fulfillment_cap_window_too_long" />`fulfillment_cap_window_too_long` | `422` | fulfillment\_participant\_window\_seconds is longer than 365 days. | Send at most 31536000 seconds. |
| <a id="fulfillment_capture_conflict" />`fulfillment_capture_conflict` | `422` | The fulfillment order's state does not allow capture. | Fetch the redemption to see the order state. |
| <a id="fulfillment_face_value_cap_exceeded" />`fulfillment_face_value_cap_exceeded` | `422` | The face value is above the program's per-order fulfillment cap. | Send a face value within the cap, or raise the cap on the program. |
| <a id="fulfillment_face_value_mismatch" />`fulfillment_face_value_mismatch` | `422` | The face value does not match the reward's configured value. | Send the reward's face value, or omit it. |
| <a id="fulfillment_not_supported" />`fulfillment_not_supported` | `422` | The reward's reward source does not support fulfillment. | Choose a reward backed by a fulfillment account. |
| <a id="fulfillment_participant_amount_cap_exceeded" />`fulfillment_participant_amount_cap_exceeded` | `422` | The participant has reached the program's fulfillment amount cap for the window. | Wait for the window to pass, or raise the cap on the program. |
| <a id="fulfillment_participant_count_cap_exceeded" />`fulfillment_participant_count_cap_exceeded` | `422` | The participant has reached the program's fulfillment count cap for the window. | Wait for the window to pass, or raise the cap on the program. |
| <a id="fulfillment_required" />`fulfillment_required` | `422` | The reward needs a fulfillment account and the program has none. | Connect a fulfillment account to the program. |
| <a id="fulfillment_window_too_long" />`fulfillment_window_too_long` | `422` | pending\_redemption\_ttl is longer than 365 days. | Send a pending\_redemption\_ttl of at most 365 days. |
| <a id="fulfillment_window_too_short" />`fulfillment_window_too_short` | `422` | pending\_redemption\_ttl is shorter than 60 seconds. | Send a pending\_redemption\_ttl of at least 60 seconds. |
| <a id="insufficient_funds" />`insufficient_funds` | `422` | The available balance is below the requested amount; details carries available and requested. | Request at most the available amount. |
| <a id="invalid_amount" />`invalid_amount` | `422` | amount is not a positive decimal string. | Send amount as a positive decimal string, such as "10.00". |
| <a id="invalid_country" />`invalid_country` | `422` | The country is not one the product can be delivered to. | Choose a country the product supports. |
| <a id="invalid_credentials" />`invalid_credentials` | `422` | The provider rejected the credentials for this fulfillment account. | Enter current credentials for the provider. |
| <a id="invalid_currency" />`invalid_currency` | `422` | The currency does not match the product's currency. | Send the product's currency. |
| <a id="invalid_currency_code" />`invalid_currency_code` | `422` | The currency is not a supported ISO 4217 code. | Send a supported three-letter currency code. |
| <a id="invalid_inventory_mode" />`invalid_inventory_mode` | `422` | The operation needs lot tracking, but the asset's inventory\_mode is SIMPLE. | Omit expires\_at, expires\_in, matures\_at and matures\_in, or use a LOT asset. |
| <a id="invalid_position" />`invalid_position` | `422` | position does not describe a reachable place in the list. | Send a position that references an existing item, or first or last. |
| <a id="invalid_rule_configuration_analysis_focus" />`invalid_rule_configuration_analysis_focus` | `422` | The focus names a rule or rule set that is not in the configuration. | Send a focus that references existing rules or rule sets. |
| <a id="invalid_rule_set" />`invalid_rule_set` | `422` | A rule set field is malformed; details names it. | Fix the field in details and send the request again. |
| <a id="invalid_scale" />`invalid_scale` | `422` | amount has more decimal places than the asset allows. | Round amount to the asset's precision. |
| <a id="issuer_connection_unavailable" />`issuer_connection_unavailable` | `422` | The pass issuer connection is not ready to issue passes. | Finish setting up the issuer connection in the dashboard. |
| <a id="member_email_not_business" />`member_email_not_business` | `422` | The provider requires a business email address for this member. | Use a business email address. |
| <a id="nothing_reversible" />`nothing_reversible` | `422` | The event made no balance changes, so there is nothing to reverse. | Reverse only events that credited or debited value. |
| <a id="participant_not_enrolled" />`participant_not_enrolled` | `422` | The participant is not enrolled in this program. | Enroll the participant, then retry. |
| <a id="pass_inactive" />`pass_inactive` | `422` | The pass is not ACTIVE. | Ask the program owner for an active pass. |
| <a id="platform_issuer_unavailable" />`platform_issuer_unavailable` | `422` | Scrip's shared issuer for this platform is not available. | Add your own issuer connection, or try again later. |
| <a id="platform_not_enabled" />`platform_not_enabled` | `422` | The pass has no identity on this wallet platform. | Install the pass on the platform first. |
| <a id="product_not_in_connection" />`product_not_in_connection` | `422` | The product is not available through this fulfillment account. | Choose a product the fulfillment account offers. |
| <a id="provider_connection_unavailable" />`provider_connection_unavailable` | `422` | The fulfillment account is not connected or has been disconnected. | Reconnect the fulfillment account in the dashboard. |
| <a id="provider_onboarding_failed" />`provider_onboarding_failed` | `422` | The provider rejected the fulfillment account onboarding. | Check the onboarding details and try again. |
| <a id="provider_sync_failed" />`provider_sync_failed` | `422` | The provider catalog could not be synced. | Retry the sync; if it keeps failing, reconnect the fulfillment account. |
| <a id="redeem_attempts_exhausted" />`redeem_attempts_exhausted` | `422` | This pass has used all of its redeem attempts. | Ask the program owner for a new pass. |
| <a id="redemption_target_inactive" />`redemption_target_inactive` | `422` | The redemption target participant is not ACTIVE. | Reactivate the target, or redeem to a different one. |
| <a id="redemption_target_is_source" />`redemption_target_is_source` | `422` | The redemption target is the same participant as the source. | Send a different target, or omit it. |
| <a id="retry_identity_unavailable" />`retry_identity_unavailable` | `422` | The FAILED event has no participant identity left to retry with. | Send the event again with a current participant. |
| <a id="reward_program_mismatch" />`reward_program_mismatch` | `422` | The reward belongs to a different program than the one in the request. | Send the program\_id that owns the reward. |
| <a id="reward_unavailable" />`reward_unavailable` | `422` | The reward on this pass is no longer available. | Ask the program owner for a current reward. |
| <a id="rule_configuration_analysis_complexity_exceeded" />`rule_configuration_analysis_complexity_exceeded` | `422` | The rule configuration is too large to analyze in one request. | Analyze a smaller focus, such as one rule set. |
| <a id="rule_configuration_analysis_limit_exceeded" />`rule_configuration_analysis_limit_exceeded` | `422` | The analysis asked for more samples or rules than the limit allows. | Lower the limits in options and run the analysis again. |
| <a id="rule_set_program_mismatch" />`rule_set_program_mismatch` | `422` | The rule set belongs to a different program than the rule. | Send a rule\_set\_id from the rule's program. |
| <a id="self_transfer_not_allowed" />`self_transfer_not_allowed` | `422` | The transfer names the same participant as source and recipient. | Send a different recipient. |
| <a id="template_archived" />`template_archived` | `422` | The pass template is ARCHIVED. | Use an active pass template. |
| <a id="template_has_no_message_field" />`template_has_no_message_field` | `422` | The pass template has no message field, so a notification cannot be shown. | Add a message field to the template. |
| <a id="unknown_participant" />`unknown_participant` | `422` | The event names a participant that does not exist: external\_id matches none and on\_unknown\_participant is REJECT, or participant\_id matches none. | Create the participant first, check the id, or set on\_unknown\_participant to CREATE. |
| <a id="unknown_recipient" />`unknown_recipient` | `422` | The event names a recipient that does not exist: recipient\_external\_id matches none and on\_unknown\_participant is REJECT, or recipient\_id matches none. | Create the recipient first, or set on\_unknown\_participant to CREATE. |
| <a id="webhook_registration_failed" />`webhook_registration_failed` | `422` | The provider rejected the webhook registration. | Check the fulfillment account's webhook settings and try again. |

## Rate limited

You sent requests faster than the limit allows. See [Limits and durations](/limits). Type: `rate_limited`.

| Code | Status | Cause | Fix |
| - | - | - | - |
| <a id="rate_limit_exceeded" />`rate_limit_exceeded` | `429` | Your organization sent more requests than the rate limit allows. | Wait for the Retry-After delay and slow the request rate. |
| <a id="resend_cooldown_active" />`resend_cooldown_active` | `429` | A resend was requested before the cooldown ended. | Wait for the Retry-After delay, then resend. |

## Server and upstream

Something failed on the Scrip side or at a service Scrip depends on. Retry with backoff. Type: `internal`.

| Code | Status | Cause | Fix |
| - | - | - | - |
| <a id="internal_error" />`internal_error` | `500` | Scrip hit an unexpected error while handling the request. | Retry the request; if it keeps failing, contact support with the request\_id. |
| <a id="claim_link_provider_error" />`claim_link_provider_error` | `502` | The fulfillment provider failed to create the claim link. | Retry later; if it keeps failing, contact support with the request\_id. |
| <a id="google_wallet_unavailable" />`google_wallet_unavailable` | `502` | Google Wallet rejected or failed the pass request. | Retry later; if it keeps failing, check the issuer connection. |
| <a id="apple_wallet_not_configured" />`apple_wallet_not_configured` | `503` | This deployment has no Apple Wallet configuration. | Contact support; this is a deployment setting. |
| <a id="google_wallet_not_configured" />`google_wallet_not_configured` | `503` | This deployment has no Google Wallet configuration. | Contact support; this is a deployment setting. |
| <a id="pass_delivery_not_configured" />`pass_delivery_not_configured` | `503` | This deployment has no Apple Wallet or Google Wallet delivery configuration. | Contact support; this is a deployment setting. |
| <a id="pass_media_not_configured" />`pass_media_not_configured` | `503` | This deployment has no pass media storage configured. | Contact support; this is a deployment setting. |
| <a id="pass_rendering_not_configured" />`pass_rendering_not_configured` | `503` | This deployment has no pass rendering configuration. | Contact support; this is a deployment setting. |
| <a id="pass_unavailable" />`pass_unavailable` | `503` | The pass could not be prepared because its issuer is unavailable. | Retry after a short delay. |
| <a id="provider_connections_not_configured" />`provider_connections_not_configured` | `503` | This deployment has no fulfillment provider configuration. | Contact support; this is a deployment setting. |
| <a id="provider_unavailable" />`provider_unavailable` | `503` | The fulfillment provider could not be reached. | Retry the request after a short delay. |
| <a id="redeem_unavailable" />`redeem_unavailable` | `503` | The redeem page's provider is unavailable. | Retry after a short delay. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.