Skip to main content
Every refusal says what failed and how to fix it. Act on the stable code, show or log the fix, and quote the requestId when you ask Tassyir for help.

The shape

The Admin API answers errors as application/problem+json:
A 5xx never carries an internal message. The token endpoint is the one exception to this shape: it answers OAuth errors (below). In @tassyir/app, an Admin API error is a TassyirApiError (code, fix, status, requestId, retryAfterSeconds, problem), a token endpoint error a TassyirOAuthError (its code is OAUTH_ and the OAuth error in capitals), and every other refusal a TassyirError with a code and a fix. App Bridge’s errors are listed in Embedded pages, the manifest’s in The manifest.

Common errors and what to do

VALIDATION_FAILED

HTTP 400. A parameter or a field failed validation, or is not one the route takes. errors lists each problem. Fix the request: unknown parameters are refused on purpose, so a misspelt filter never silently returns everything.

INVALID_CURSOR

HTTP 400. The cursor is not this list’s, was edited, or was made with other filters. Send nextCursor back unchanged, with the same filters; to change a filter, start again without a cursor.

INVALID_FIELDS

HTTP 400. fields names a field the resource does not have. allowedFields lists the valid names; fields are top-level only.

APP_TOKEN_REQUIRED

HTTP 401. No Authorization: Bearer header. Send the installation’s access token.

APP_TOKEN_INVALID

HTTP 401. The token is unknown, expired or revoked, or its installation or app is no longer active. Refresh it once (the SDK does). If the refresh is refused, the installation was uninstalled, suspended or had its scopes changed: an embedded app gets a new token on the next page view, a headless app needs a new install code.

PERMISSION_DENIED

HTTP 403. Your installation lacks the permission the route checks (permission). The fix names the scope: add it to the manifest, upload a version, and the merchant must accept the update. With an online token, the person may lack it even when your app has it.

STORE_SCOPE_FORBIDDEN

HTTP 460. Your request named a store (storeId) outside the stores the merchant gave your installation. Use one of its stores; list them with GET /stores (read_stores).

NOT_FOUND

HTTP 404. No such route, or no resource your token can read under that id: a resource of another store or business, or a malformed id, reads the same.

RATE_LIMITED

HTTP 429. Your installation’s bucket is empty. Wait Retry-After seconds, then retry; spread your calls using the RateLimit-* headers.

BUSINESS_RATE_LIMITED

HTTP 429. All the apps of this business together are past its ceiling. Wait Retry-After seconds; other apps are using the room, so slow down.

API_BUSY

HTTP 503. The API was too busy to take your call and did nothing. Wait Retry-After (1 second) and send the same call again, a write included.

IDEMPOTENCY_KEY_REUSED

HTTP 422. You reused an Idempotency-Key with another method, path, query or body. Use a new key for a different write.

IDEMPOTENCY_KEY_IN_USE

HTTP 409. A request with the same key is still running. Wait, then retry with the same key: you will get its answer.

IDEMPOTENCY_UNAVAILABLE

HTTP 503. Tassyir cannot check idempotency keys right now, so the write was not attempted. Retry after Retry-After with the same key.

PLAN_FEATURE_REQUIRED

HTTP 403. The merchant’s plan lacks the feature (feature), such as stock at a chosen location. Do without it, or tell the merchant.

SUBSCRIPTION_REQUIRED

HTTP 422. The route needs a plan, and the business has no usable subscription. Tell the merchant.

ORDER_LIMIT_REACHED

HTTP 403. The order is waiting: it is past the plan’s order allowance, and cannot be confirmed until it unlocks (orders/updated with waiting).

ORDER_NOT_EDITABLE

HTTP 409. The order is dispatched, delivered or returned (orderStatus): it can no longer be edited, confirmed or cancelled.

ORDER_STATUS_CONFLICT

HTTP 409. The order’s status does not allow this move (orderStatus, requestedStatus): read the order again and decide.

MEDIA_URL_NOT_ALLOWED

HTTP 400. An image is not on https://cdn.tassyir.io/ and not already on the resource (field, url). Upload it with POST /images first (Products and collections).

APP_DATA_KEY_NOT_DECLARED

HTTP 400. Your installation’s version does not declare that key for that owner type. Declare it under [[data.definitions]], upload, and have the merchant accept the update.

INTERNAL_ERROR

HTTP 500. Tassyir’s fault. Retry reads with backoff; retry writes only with the same Idempotency-Key. Quote the requestId if it persists.

SERVICE_UNAVAILABLE

HTTP 503. Something Tassyir depends on is down. Retry with backoff, writes with the same Idempotency-Key.

Every Admin API code

Generated from the OpenAPI document of API version 2026-10 that @tassyir/app is typed from (41 operations under /apps/2026-10/). An operation lists every code it can answer, per status, in that document.

Token endpoint errors

POST /apps/oauth/token answers OAuth errors, { "error": "…", "error_description": "…" }, never problem+json.