Version

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 on VALIDATION_FAILED. Maps each offending key to a list of rule-failure messages.
  • context — only present when the thrower supplied extra context (e.g. required_ability on TOKEN_MISSING_ABILITY, project_id on TENANT_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/tokens and 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 missing scope:team:<uuid> entirely, or scope:project:<uuid> excludes the project.
  • Remediation: Use a token minted for the correct team. The response is 404 (not 403) 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 an Idempotency-Key header.
  • Remediation: Generate a fresh UUID, send it as Idempotency-Key, retry.

IDEMPOTENCY_KEY_REUSED

  • HTTP status: 409
  • When: The same Idempotency-Key was 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 POST to a read-only collection, say, or a PUT where the endpoint takes PATCH.
  • Remediation: Check the endpoint reference for the verbs the path accepts. The response carries an Allow header 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-After header.

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} or install_connector named a connector creators may not install today: a roadmap entry, one still in development, or one paused during an incident. context.connector echoes the key.
  • Remediation: Read GET /v1/connectors; only a card whose installable is true can 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_connector capability. 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_FOUND with reason: unknown_connector, which says the key names no connector at all. context.connector and context.project_id say which.
  • Remediation: Install it first (POST /v1/projects/{project}/connectors/{key}), or read GET /v1/projects/{project}/connectors for 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_id and contact support. All 5xx errors are auto-reported to the internal error tracker.

How is this guide?

Version

On this page

Subscriby is a product
designed by you — for you.
No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request