Error Codes
Complete catalog of Subscriby API error codes, HTTP statuses, and remediation hints.
Every error returned by api.subscriby.net and mcp.subscriby.net uses a uniform envelope:
{
"error": {
"code": "TENANT_MISMATCH",
"message": "The requested resource does not belong to the team this API token is scoped to.",
"docs_url": "https://docs.subscriby.net/api/v1/errors#tenant-mismatch",
"remediation": "Use a token minted for the correct team, or switch the creator's current team before minting.",
"request_id": "00-abc...",
"context": { "required_ability": "project:view" }
}
}Fields:
code— stable string identifier. Pattern-match on this.message— human-readable summary. Free to change between releases.docs_url— anchor into this page.remediation— one-sentence hint for self-correction.request_id— trace identifier. Share with support when filing an issue.fields— only present onVALIDATION_FAILED. Maps each offending key to a list of rule-failure messages.context— only present when the thrower supplied extra context (e.g.required_abilityonTOKEN_MISSING_ABILITY,project_idonTENANT_MISMATCH).
Agents should pattern-match on error.code, not error.message. The message
is free to change; the code is contractual.
Validation
VALIDATION_FAILED
- HTTP status:
422 - When: The request body failed a validation rule (missing required field, bad enum value, wrong type).
- Remediation: Inspect
error.fields— each offending key maps to an array of failure messages.
Authentication & authorization
AUTHENTICATION_REQUIRED
- HTTP status:
401 - When: No
Authorization: Bearer sbt_live_...header is present, or the token has been revoked. - Remediation: Mint a fresh token at
/settings/tokensand retry.
TOKEN_MISSING_ABILITY
- HTTP status:
403 - When: The token is valid but does not carry the ability required for this endpoint or tool.
- Context:
required_ability— the exact ability string to grant. - Remediation: Mint a replacement token that includes the listed ability, or ask the team owner to grant it.
FORBIDDEN
- HTTP status:
403 - When: The token carries the right ability and can see the resource, but its holder may not change it. Today this applies to webhook endpoints: only the member who registered an endpoint, or the team owner, may rotate, test or delete it.
- Remediation: Ask the endpoint's creator or the team owner to make the change, or mint the token as that member.
TENANT_MISMATCH
- HTTP status:
404 - When: The token's
scope:team:<uuid>does not match the team that owns the resource, the token is missingscope:team:<uuid>entirely, orscope:project:<uuid>excludes the project. - Remediation: Use a token minted for the correct team. The response is
404(not403) so existence outside the scope cannot be inferred.
RESOURCE_NOT_FOUND
- HTTP status:
404 - When: The UUID in the path does not exist (or is hidden by scope).
- Remediation: Verify the UUID path parameter.
Domain validation
PLAN_CURRENCY_MISMATCH
- HTTP status:
400 - When: A plan's currency is not supported by any payment method attached to its project.
- Remediation: Change the plan's currency, or enable a payment method that supports it.
PLAN_PROVIDER_UNSUPPORTED
- HTTP status:
400 - When: The billing cycle is not supported by the provider (e.g. monthly recurring on a one-off-only provider).
- Remediation: Pick a different provider, or switch to a one-off plan.
PAYMENT_METHOD_NOT_CONFIGURED
- HTTP status:
400 - When: Publishing a plan that has no enabled payment method on its project.
- Remediation: Configure at least one payment method on the project before publishing the plan.
SUBSCRIPTION_ALREADY_ACTIVE
- HTTP status:
400 - When: Creating or updating a subscription for a subscriber who already has an active subscription on the project.
- Remediation: Cancel the existing subscription first, or update its plan instead.
Access codes
ACCESS_CODE_INVALID
- HTTP status:
400 - When: The redemption code is unknown or does not match the project.
- Remediation: Verify the code is spelled correctly and belongs to this project. Codes are case-sensitive.
ACCESS_CODE_EXPIRED
- HTTP status:
400 - When: The code's expiry has passed.
- Remediation: Generate a new batch of access codes with a fresh expiry window.
ACCESS_CODE_ALREADY_REDEEMED
- HTTP status:
400 - When: The code has already been used. Access codes are single-use.
- Remediation: Generate a new code for the subscriber.
ACCESS_CODE_CAP_EXCEEDED
- HTTP status:
400 - When: The creator's monthly access-code generation quota is exhausted.
- Remediation: Upgrade the creator's tier for a higher allotment, or wait for the next cycle.
Idempotency
IDEMPOTENCY_KEY_MISSING
- HTTP status:
400 - When: A mutating endpoint (
POST/PATCH/PUT/DELETE) was called without anIdempotency-Keyheader. - Remediation: Generate a fresh UUID, send it as
Idempotency-Key, retry.
IDEMPOTENCY_KEY_REUSED
- HTTP status:
409 - When: The same
Idempotency-Keywas used previously with a different request body. - Remediation: Use a fresh key per distinct operation.
IDEMPOTENCY_REPLAY_IN_PROGRESS
- HTTP status:
425 - When: A prior request with the same key is still running; the server is serialising concurrent retries.
- Remediation: Wait briefly and retry.
Request shape
METHOD_NOT_ALLOWED
- HTTP status:
405 - When: The path exists but does not accept the verb you used — a
POSTto a read-only collection, say, or aPUTwhere the endpoint takesPATCH. - Remediation: Check the endpoint reference for the verbs the path accepts. The
response carries an
Allowheader listing them.
Throttling
RATE_LIMITED
- HTTP status:
429 - When: The token (or IP for unauthenticated routes) exceeded its bucket. See rate limiting.
- Remediation: Back off per the
Retry-Afterheader.
Tier
TEAM_TIER_REQUIRED
- HTTP status:
403 - When: An operation requires the creator's account to be on a higher Subscriby tier (e.g. Growth for custom handles or advanced RBAC).
- Remediation: Upgrade the creator's account from
/settings/billing.
Connectors
CONNECTOR_UNAVAILABLE
- HTTP status:
422 - When:
POST /v1/projects/{project}/connectors/{key}orinstall_connectornamed a connector creators may not install today: a roadmap entry, one still in development, or one paused during an incident.context.connectorechoes the key. - Remediation: Read
GET /v1/connectors; only a card whoseinstallableistruecan be installed.
CONNECTOR_TIER_REQUIRED
- HTTP status:
403 - When: A second distinct connector was installed on a project whose owner's plan lacks the
multi_connectorcapability. Official connectors are free; running two on one project is a Growth feature. - Remediation: Upgrade the project owner from
/settings/billing, or uninstall the project's other connector first.
CONNECTOR_NOT_INSTALLED
- HTTP status:
404 - When: An installation endpoint or tool named a connector that exists but the project does not run. Distinct from
RESOURCE_NOT_FOUNDwithreason: unknown_connector, which says the key names no connector at all.context.connectorandcontext.project_idsay which. - Remediation: Install it first (
POST /v1/projects/{project}/connectors/{key}), or readGET /v1/projects/{project}/connectorsfor what the project runs.
Webhooks
WEBHOOK_ENDPOINT_UNREACHABLE
- HTTP status:
502 - When: The synchronous webhook test call could not reach the target URL.
- Remediation: Verify the endpoint is HTTPS-reachable from the public internet.
Server
INTERNAL_SERVER_ERROR
- HTTP status:
500 - When: Unexpected server-side failure.
- Remediation: Capture
error.request_idand contact support. All 5xx errors are auto-reported to the internal error tracker.
How is this guide?