# Tassyir Developers > Build apps for Tassyir, the back office of e-commerce merchants in Algeria: guides, the Admin API reference, every error code and the SDK packages. - [Build apps for Tassyir](https://docs.tassyir.io/guides/index.md): What a Tassyir app is, the parts of the app contract, and where each guide fits. - [Getting started](https://docs.tassyir.io/guides/getting-started.md): Create an app with npm create tassyir-app, run it behind an https tunnel, and install it on a dev store. - [The manifest](https://docs.tassyir.io/guides/manifest.md): Describe your app in tassyir.app.toml, validate it with the API's own validator, and upload it as a version. - [Scopes and consent](https://docs.tassyir.io/guides/scopes-and-consent.md): Choose the scopes your app asks for, and understand what a merchant consents to on install and on every new version. - [Tokens](https://docs.tassyir.io/guides/tokens.md): Learn who is looking from the ID token, get and keep access tokens, and refresh them without locking a merchant out. - [Embedded pages and App Bridge](https://docs.tassyir.io/guides/embedded-pages.md): Show your app's page inside the Tassyir dashboard and use App Bridge for ID tokens, toasts, modals, the save bar, navigation and pickers. - [Webhooks](https://docs.tassyir.io/guides/webhooks.md): Subscribe to a business's events, verify each signed delivery, handle retries and replays once, and test your endpoint. - [Admin API conventions](https://docs.tassyir.io/guides/admin-api.md): How every Admin API route behaves, from versions, money and cursors to idempotent writes, errors and rate limits. - [Orders](https://docs.tassyir.io/guides/orders.md): Read a business's orders, keep them in sync, and create, edit, confirm, cancel, schedule and comment on them like a team member. - [Products and collections](https://docs.tassyir.io/guides/products-and-collections.md): Read and change the merchant's catalogue, bring images onto the Tassyir CDN, and organise collections. - [Stock](https://docs.tassyir.io/guides/stock.md): Read the stock of the merchant's products, follow it with webhooks, and correct a count with a reason. - [Customers and contact data](https://docs.tassyir.io/guides/customers.md): Read buyers and their delivery record, and handle buyers' names, phones and addresses with the read_customer_contact scope. - [Stores and delivery](https://docs.tassyir.io/guides/stores-and-delivery.md): Read a business's stores, the carriers it ships with and what it charges buyers for delivery to each wilaya. - [App data](https://docs.tassyir.io/guides/app-data.md): Keep your app's values in Tassyir, next to the business, its stores, products, orders and customers, under keys your manifest declares. - [Dev stores](https://docs.tassyir.io/guides/dev-stores.md): Build and test on businesses seeded with synthetic data, where nothing reaches a carrier, a buyer or a payment provider. - [Compliance and uninstall](https://docs.tassyir.io/guides/compliance-and-uninstall.md): What happens when a merchant uninstalls your app, and how to honour buyer data requests and the deletion that follows an uninstall. - [Errors](https://docs.tassyir.io/guides/errors.md): Every error code the Admin API and the token endpoint answer, and what to do about the common ones. - [Claude Code plugin](https://docs.tassyir.io/claude-code.md): Give Claude Code the Tassyir app contract and the developer MCP server with one plugin. - [The business the app is installed on](https://docs.tassyir.io/api-reference/admin/business/the-business-the-app-is-installed-on.md): Every installation may read it, whatever its scopes: the id, name, currency, country and time zone, nothing else. - [List orders](https://docs.tassyir.io/api-reference/admin/orders/list-orders.md): Every stage in one list, archived included, newest first. Never an undecided abandoned checkout nor an exchange-return row. Without `orders:read-all` (an online token of a member who sees only their own orders), only the orders assigned to that member. - [Create an order](https://docs.tassyir.io/api-reference/admin/orders/create-an-order.md): The dashboard's manual create: allowance admit, one distribution pass, `source = app:`. Past the plan's allowance the order is created WAITING (phones hidden, confirm and dispatch locked). On a dev store, orders are capped per day: 429 `DEV_STORE_ORDER_LIMIT_REACHED` with `retryAfterSeconds`… - [Get an order](https://docs.tassyir.io/api-reference/admin/orders/get-an-order.md): Needs the `read_orders` scope (permission `orders:read`). - [Update an order](https://docs.tassyir.io/api-reference/admin/orders/update-an-order.md): The buyer, the delivery choice and the notes. Not the status (confirm, cancel and schedule have their own routes), not the items, prices, carrier or store. - [Confirm an order](https://docs.tassyir.io/api-reference/admin/orders/confirm-an-order.md): Needs the `write_orders` scope (permission `orders:confirm`). - [Cancel an order](https://docs.tassyir.io/api-reference/admin/orders/cancel-an-order.md): With one of `GET cancel-reasons` and a note when that reason asks for one. Recorded as cancelled by the app. - [Schedule a call-back](https://docs.tassyir.io/api-reference/admin/orders/schedule-a-call-back.md): Needs the `write_orders` scope (permission `orders:schedule`). - [List an order's comments](https://docs.tassyir.io/api-reference/admin/orders/list-an-orders-comments.md): Needs the `read_orders` scope (permission `orders:read`). - [Comment on an order](https://docs.tassyir.io/api-reference/admin/orders/comment-on-an-order.md): Needs the `write_orders` scope (permission `orders:add-comment`). - [The merchant's cancel reasons](https://docs.tassyir.io/api-reference/admin/orders/the-merchants-cancel-reasons.md): The active reasons, in the merchant's order, all at once (`nextCursor` is always null). - [List products](https://docs.tassyir.io/api-reference/admin/products/list-products.md): Every product, active or not, newest first. A collection membership change does not move `updatedAt` (listen to `products/updated` for `collectionIds`). - [Create a product](https://docs.tassyir.io/api-reference/admin/products/create-a-product.md): Images must already be on the Tassyir CDN; a description is checked (no scripts, frames, forms, handlers, fetching CSS). - [Get a product](https://docs.tassyir.io/api-reference/admin/products/get-a-product.md): Needs the `read_products` scope (permission `products:read`). - [Update a product](https://docs.tassyir.io/api-reference/admin/products/update-a-product.md): `options` and `variants` are replace-all, together: every `id` sent must be one of this product's variants; a variant left out is removed. - [Update one variant's fields](https://docs.tassyir.io/api-reference/admin/products/update-one-variants-fields.md): Only this variant is written; the others are sent back as they are. The default variant follows its product and is changed through it. - [List collections](https://docs.tassyir.io/api-reference/admin/collections/list-collections.md): Needs the `read_products` scope (permission `categories:read`). - [Create a collection](https://docs.tassyir.io/api-reference/admin/collections/create-a-collection.md): Needs the `write_products` scope (permission `categories:create`). - [Get a collection](https://docs.tassyir.io/api-reference/admin/collections/get-a-collection.md): Needs the `read_products` scope (permission `categories:read`). - [Delete a collection](https://docs.tassyir.io/api-reference/admin/collections/delete-a-collection.md): Its products leave it (they stay in the catalogue); its subcollections move up one level. - [Update a collection](https://docs.tassyir.io/api-reference/admin/collections/update-a-collection.md): Needs the `write_products` scope (permission `categories:update`). - [Change a collection's members](https://docs.tassyir.io/api-reference/admin/collections/change-a-collections-members.md): `add` picks products by hand (and lifts an exclusion); `remove` takes them out whatever put them there. - [List stock levels](https://docs.tassyir.io/api-reference/admin/inventory/list-stock-levels.md): One per tracked variant. `unitCost` only for a caller holding `read_costs`. - [Get a stock level](https://docs.tassyir.io/api-reference/admin/inventory/get-a-stock-level.md): Needs the `read_inventory` scope (permission `inventory:read`). - [Correct a stock count](https://docs.tassyir.io/api-reference/admin/inventory/correct-a-stock-count.md): The dashboard's "correct the count, and say why". Never below zero at the location. - [List customers](https://docs.tassyir.io/api-reference/admin/customers/list-customers.md): The buyers with a counted order in the installation's stores. `name` and `phone` only with `read_customer_contact`. - [Get a customer](https://docs.tassyir.io/api-reference/admin/customers/get-a-customer.md): Needs the `read_customers` scope (permission `customers:read`). - [List stores](https://docs.tassyir.io/api-reference/admin/stores/list-stores.md): Needs the `read_stores` scope (permission `stores:read`). - [Get a store](https://docs.tassyir.io/api-reference/admin/stores/get-a-store.md): Needs the `read_stores` scope (permission `stores:read`). - [List delivery agents](https://docs.tassyir.io/api-reference/admin/delivery/list-delivery-agents.md): The carriers and private couriers the business ships with. Credentials are never returned. - [Get a delivery agent](https://docs.tassyir.io/api-reference/admin/delivery/get-a-delivery-agent.md): Needs the `read_delivery` scope (permission `delivery-agents:read`). - [List delivery fee groups](https://docs.tassyir.io/api-reference/admin/delivery/list-delivery-fee-groups.md): Every group at once, without its fees (read one group for them). - [Get a delivery fee group](https://docs.tassyir.io/api-reference/admin/delivery/get-a-delivery-fee-group.md): With its fees, one per wilaya. - [List the app's values](https://docs.tassyir.io/api-reference/admin/data/list-the-apps-values.md): The values this installation keeps, newest first, of the owner types its scopes may read. A value whose owner it can no longer read is left out, so a page can hold fewer than `limit` values while `nextCursor` is set: keep reading until it is null. `ownerId` needs `ownerType`. - [Get a value](https://docs.tassyir.io/api-reference/admin/data/get-a-value.md): Read whatever the manifest says now: a key the installation's version no longer declares is still read (`declared: false`). - [Write a value](https://docs.tassyir.io/api-reference/admin/data/write-a-value.md): Writes the whole value. The key must be declared for the owner type by the installation's version; the value must be of the declared type and at most 16,384 bytes of compact JSON; `visibility` comes from the declaration. An installation holds at most 50,000 values: past that a NEW key is refused, an… - [Delete a value](https://docs.tassyir.io/api-reference/admin/data/delete-a-value.md): Works for a key the version no longer declares too: that is how an app frees room after dropping a key. - [Upload an image from an address](https://docs.tassyir.io/api-reference/admin/images/upload-an-image-from-an-address.md): Downloads the image at `url` and stores it on the Tassyir CDN; the answer's `url` is what product and collection writes accept. https on port 443 only, a public host name; a JPEG, PNG, GIF or WebP image (read from its bytes, never its name or `Content-Type`; SVG refused) of at most 10,000,000 bytes,… - [List the installation's exports](https://docs.tassyir.io/api-reference/admin/bulk-exports/list-the-installations-exports.md): Newest first, kept 30 days. Only the lists whose read permission the caller holds; an online token sees only the exports its own user asked for. - [Export a whole list](https://docs.tassyir.io/api-reference/admin/bulk-exports/export-a-whole-list.md): Starts an export of every row the list route of `resource` returns (with these `filters`, the list's own), as one JSON Lines file: one resource per line, exactly as the list returns it, newest first. It runs in the background: read `GET /bulk/exports/{id}` or subscribe to `bulk/finished`; once `comp… - [Get an export](https://docs.tassyir.io/api-reference/admin/bulk-exports/get-an-export.md): Where it stands, and its download `url` once `completed`. Poll it at most every few seconds, or subscribe to `bulk/finished`. - [Get an access token](https://docs.tassyir.io/api-reference/admin/authentication/get-an-access-token.md): Three grants: the token exchange of an embedded page's ID token (an offline token, or an online one bound to the dashboard user), an install code, and a refresh token (rotated on every use; a spent one presented after 60 seconds revokes its whole family). - [ID-token public keys (JWKS)](https://docs.tassyir.io/api-reference/admin/authentication/id-token-public-keys-jwks.md): Verify the ID token your embedded page receives: pick the key by `kid`, require `alg: EdDSA`, `iss = https://api.tassyir.io/apps`, `aud = `, and `exp`/`nbf` with at most 30 s of clock skew. Reference: docs/api/apps/app-keys.md. - [Webhook public keys](https://docs.tassyir.io/api-reference/admin/authentication/webhook-public-keys.md): Verify a delivery: the signed content is `{webhook-id}.{webhook-timestamp}.{raw body}`; accept it when any `v1a,` signature verifies with any key here and the timestamp is within 5 minutes. Reference: docs/api/apps/app-keys.md. - [Orderscreated](https://docs.tassyir.io/api-reference/admin/webhooks/orderscreated.md): A real order was created (never an abandoned checkout), after the order allowance decided it. - [Abandoned checkoutscreated](https://docs.tassyir.io/api-reference/admin/webhooks/abandoned_checkoutscreated.md): An abandoned checkout was captured. - [Ordersconfirmed](https://docs.tassyir.io/api-reference/admin/webhooks/ordersconfirmed.md): An order was confirmed. - [Orderscancelled](https://docs.tassyir.io/api-reference/admin/webhooks/orderscancelled.md): An order was cancelled. - [Ordersdispatched](https://docs.tassyir.io/api-reference/admin/webhooks/ordersdispatched.md): An order was handed to a carrier. - [Ordersdelivered](https://docs.tassyir.io/api-reference/admin/webhooks/ordersdelivered.md): An order was delivered. - [Ordersreturned](https://docs.tassyir.io/api-reference/admin/webhooks/ordersreturned.md): An order came back (its status does not change: `returned` is true). - [Ordersupdated](https://docs.tassyir.io/api-reference/admin/webhooks/ordersupdated.md): Any other change to a field an app can read; `changed` names the fields. - [Productscreated](https://docs.tassyir.io/api-reference/admin/webhooks/productscreated.md): A product was created. - [Productsupdated](https://docs.tassyir.io/api-reference/admin/webhooks/productsupdated.md): A product changed (deactivation included: `active` turns false). - [Productsdeleted](https://docs.tassyir.io/api-reference/admin/webhooks/productsdeleted.md): A product was deleted; only its ids remain. - [Inventory levelsupdated](https://docs.tassyir.io/api-reference/admin/webhooks/inventory_levelsupdated.md): A variant's on-hand, in-transit or damaged stock changed. - [Customersupdated](https://docs.tassyir.io/api-reference/admin/webhooks/customersupdated.md): A customer's record changed. - [Appinstalled](https://docs.tassyir.io/api-reference/admin/webhooks/appinstalled.md): The app was installed on a business. - [Appuninstalled](https://docs.tassyir.io/api-reference/admin/webhooks/appuninstalled.md): The app was uninstalled; its tokens are already revoked. - [Appscopes updated](https://docs.tassyir.io/api-reference/admin/webhooks/appscopes_updated.md): The merchant granted a new set of scopes. - [Customersdata request](https://docs.tassyir.io/api-reference/admin/webhooks/customersdata_request.md): A buyer asked for the data held about them. - [Customersredact](https://docs.tassyir.io/api-reference/admin/webhooks/customersredact.md): Delete what you hold about this buyer. - [Businessredact](https://docs.tassyir.io/api-reference/admin/webhooks/businessredact.md): Delete what you hold about this business: the app was uninstalled 48 h ago and Tassyir has deleted its app data. - [Bulkfinished](https://docs.tassyir.io/api-reference/admin/webhooks/bulkfinished.md): A bulk export this installation asked for finished: `completed` (download it from `url`) or `failed` (`errorCode`). Sent only to that installation. - [API_BUSY](https://docs.tassyir.io/errors/api-busy.md): HTTP 503, from every operation of the Admin API. - [APP_DATA_KEY_NOT_DECLARED](https://docs.tassyir.io/errors/app-data-key-not-declared.md): HTTP 400, from PUT /data/{ownerType}/{ownerId}/{key}. - [APP_DATA_LIMIT_REACHED](https://docs.tassyir.io/errors/app-data-limit-reached.md): HTTP 409, from PUT /data/{ownerType}/{ownerId}/{key}. - [APP_DATA_VALUE_INVALID](https://docs.tassyir.io/errors/app-data-value-invalid.md): HTTP 400, from PUT /data/{ownerType}/{ownerId}/{key}. - [APP_DATA_VALUE_TOO_LARGE](https://docs.tassyir.io/errors/app-data-value-too-large.md): HTTP 400, from PUT /data/{ownerType}/{ownerId}/{key}. - [APP_TOKEN_INVALID](https://docs.tassyir.io/errors/app-token-invalid.md): HTTP 401, from every operation of the Admin API. - [APP_TOKEN_REQUIRED](https://docs.tassyir.io/errors/app-token-required.md): HTTP 401, from every operation of the Admin API. - [BAD_REQUEST](https://docs.tassyir.io/errors/bad-request.md): HTTP 400, from 16 operations of the Admin API. - [BRAND_NOT_FOUND](https://docs.tassyir.io/errors/brand-not-found.md): HTTP 400, from 2 operations of the Admin API. - [BULK_EXPORTS_NOT_CONFIGURED](https://docs.tassyir.io/errors/bulk-exports-not-configured.md): HTTP 503, from POST /bulk/exports. - [BULK_EXPORT_IN_PROGRESS](https://docs.tassyir.io/errors/bulk-export-in-progress.md): HTTP 409, from POST /bulk/exports. - [BULK_EXPORT_RATE_LIMITED](https://docs.tassyir.io/errors/bulk-export-rate-limited.md): HTTP 429, from POST /bulk/exports. - [BUSINESS_RATE_LIMITED](https://docs.tassyir.io/errors/business-rate-limited.md): HTTP 429, from every operation of the Admin API. - [CANCEL_NOTE_REQUIRED](https://docs.tassyir.io/errors/cancel-note-required.md): HTTP 400, from POST /orders/{id}/cancel. - [CANCEL_REASON_INVALID](https://docs.tassyir.io/errors/cancel-reason-invalid.md): HTTP 400, from POST /orders/{id}/cancel. - [COLLECTION_CONDITIONAL_LIMIT](https://docs.tassyir.io/errors/collection-conditional-limit.md): HTTP 409, from 2 operations of the Admin API. - [COLLECTION_DEPTH_LIMIT](https://docs.tassyir.io/errors/collection-depth-limit.md): HTTP 409, from 2 operations of the Admin API. - [COLLECTION_NOT_FOUND](https://docs.tassyir.io/errors/collection-not-found.md): HTTP 400, from POST /products. - [COLLECTION_PARENT_CYCLE](https://docs.tassyir.io/errors/collection-parent-cycle.md): HTTP 409, from PATCH /collections/{id}. - [COLLECTION_PARENT_NOT_FOUND](https://docs.tassyir.io/errors/collection-parent-not-found.md): HTTP 404, from 2 operations of the Admin API. - [COLLECTION_PRODUCT_WRONG_STORE](https://docs.tassyir.io/errors/collection-product-wrong-store.md): HTTP 400, from PATCH /collections/{id}/products. - [COLLECTION_RULE_INVALID](https://docs.tassyir.io/errors/collection-rule-invalid.md): HTTP 400, from 2 operations of the Admin API. - [DELIVERY_SPEED_UNAVAILABLE](https://docs.tassyir.io/errors/delivery-speed-unavailable.md): HTTP 400, from 2 operations of the Admin API. - [DELIVERY_SPEED_UNSUPPORTED](https://docs.tassyir.io/errors/delivery-speed-unsupported.md): HTTP 400, from PATCH /orders/{id}. - [DEV_STORE_ORDER_LIMIT_REACHED](https://docs.tassyir.io/errors/dev-store-order-limit-reached.md): HTTP 429, from POST /orders. - [FORBIDDEN](https://docs.tassyir.io/errors/forbidden.md): HTTP 403, from 4 operations of the Admin API. - [HTML_NOT_ALLOWED](https://docs.tassyir.io/errors/html-not-allowed.md): HTTP 400, from 4 operations of the Admin API. - [IDEMPOTENCY_KEY_INVALID](https://docs.tassyir.io/errors/idempotency-key-invalid.md): HTTP 400, from 18 operations of the Admin API. - [IDEMPOTENCY_KEY_IN_USE](https://docs.tassyir.io/errors/idempotency-key-in-use.md): HTTP 409, from 18 operations of the Admin API. - [IDEMPOTENCY_KEY_REUSED](https://docs.tassyir.io/errors/idempotency-key-reused.md): HTTP 422, from 18 operations of the Admin API. - [IDEMPOTENCY_UNAVAILABLE](https://docs.tassyir.io/errors/idempotency-unavailable.md): HTTP 503, from 18 operations of the Admin API. - [IMAGE_FETCH_FAILED](https://docs.tassyir.io/errors/image-fetch-failed.md): HTTP 400, from POST /images. - [IMAGE_QUOTA_REACHED](https://docs.tassyir.io/errors/image-quota-reached.md): HTTP 429, from POST /images. - [IMAGE_TOO_LARGE](https://docs.tassyir.io/errors/image-too-large.md): HTTP 400, from POST /images. - [IMAGE_TYPE_NOT_ALLOWED](https://docs.tassyir.io/errors/image-type-not-allowed.md): HTTP 400, from POST /images. - [IMAGE_URL_NOT_ALLOWED](https://docs.tassyir.io/errors/image-url-not-allowed.md): HTTP 400, from POST /images. - [INSUFFICIENT_AT_LOCATION](https://docs.tassyir.io/errors/insufficient-at-location.md): HTTP 409, from POST /inventory-levels/{id}/adjust. - [INTERNAL_ERROR](https://docs.tassyir.io/errors/internal-error.md): HTTP 500, from every operation of the Admin API. - [INVALID_CURSOR](https://docs.tassyir.io/errors/invalid-cursor.md): HTTP 400, from 10 operations of the Admin API. - [INVALID_FIELDS](https://docs.tassyir.io/errors/invalid-fields.md): HTTP 400, from 37 operations of the Admin API. - [LOCATION_NOT_FOUND](https://docs.tassyir.io/errors/location-not-found.md): HTTP 400, 404, from POST /inventory-levels/{id}/adjust. - [MEDIA_URL_NOT_ALLOWED](https://docs.tassyir.io/errors/media-url-not-allowed.md): HTTP 400, from 5 operations of the Admin API. - [NOT_FOUND](https://docs.tassyir.io/errors/not-found.md): HTTP 404, from 28 operations of the Admin API. - [ORDER_DUPLICATE](https://docs.tassyir.io/errors/order-duplicate.md): HTTP 409, from POST /orders. - [ORDER_LIMIT_REACHED](https://docs.tassyir.io/errors/order-limit-reached.md): HTTP 403, from POST /orders/{id}/confirm. - [ORDER_NOT_EDITABLE](https://docs.tassyir.io/errors/order-not-editable.md): HTTP 409, from 4 operations of the Admin API. - [ORDER_PRICING_LOCKED](https://docs.tassyir.io/errors/order-pricing-locked.md): HTTP 400, from PATCH /orders/{id}. - [ORDER_STATUS_CONFLICT](https://docs.tassyir.io/errors/order-status-conflict.md): HTTP 409, from 3 operations of the Admin API. - [PAYLOAD_TOO_LARGE](https://docs.tassyir.io/errors/payload-too-large.md): HTTP 413, from 15 operations of the Admin API. - [PERMISSION_DENIED](https://docs.tassyir.io/errors/permission-denied.md): HTTP 403, from 40 operations of the Admin API. - [PLAN_FEATURE_REQUIRED](https://docs.tassyir.io/errors/plan-feature-required.md): HTTP 403, from 3 operations of the Admin API. - [PRODUCT_DEFAULT_VARIANT](https://docs.tassyir.io/errors/product-default-variant.md): HTTP 409, from PATCH /products/{id}/variants/{variantId}. - [PRODUCT_OPTIONS_REQUIRE_VARIANTS](https://docs.tassyir.io/errors/product-options-require-variants.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_OPTION_DUPLICATE_NAME](https://docs.tassyir.io/errors/product-option-duplicate-name.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_OPTION_DUPLICATE_VALUE](https://docs.tassyir.io/errors/product-option-duplicate-value.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_OPTION_NOT_FOUND](https://docs.tassyir.io/errors/product-option-not-found.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_OPTION_NO_VALUES](https://docs.tassyir.io/errors/product-option-no-values.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_OPTION_VALUE_EMPTY](https://docs.tassyir.io/errors/product-option-value-empty.md): HTTP 400, from PATCH /products/{id}. - [PRODUCT_OPTION_VALUE_NOT_FOUND](https://docs.tassyir.io/errors/product-option-value-not-found.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_SLUG_INVALID](https://docs.tassyir.io/errors/product-slug-invalid.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_SLUG_TAKEN](https://docs.tassyir.io/errors/product-slug-taken.md): HTTP 409, from 2 operations of the Admin API. - [PRODUCT_VARIANT_COMBINATION_MISMATCH](https://docs.tassyir.io/errors/product-variant-combination-mismatch.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_VARIANT_COUNT_MISMATCH](https://docs.tassyir.io/errors/product-variant-count-mismatch.md): HTTP 400, from 3 operations of the Admin API. - [PRODUCT_VARIANT_DUPLICATE_COMBINATION](https://docs.tassyir.io/errors/product-variant-duplicate-combination.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_VARIANT_DUPLICATE_OPTION](https://docs.tassyir.io/errors/product-variant-duplicate-option.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_VARIANT_INVALID_VALUE](https://docs.tassyir.io/errors/product-variant-invalid-value.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_VARIANT_MISSING_COMBINATIONS](https://docs.tassyir.io/errors/product-variant-missing-combinations.md): HTTP 400, from 3 operations of the Admin API. - [PRODUCT_VARIANT_MISSING_OPTION](https://docs.tassyir.io/errors/product-variant-missing-option.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_VARIANT_SELECTED_COUNT](https://docs.tassyir.io/errors/product-variant-selected-count.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_VARIANT_UNKNOWN_OPTION](https://docs.tassyir.io/errors/product-variant-unknown-option.md): HTTP 400, from 2 operations of the Admin API. - [PRODUCT_WRITE_TIMEOUT](https://docs.tassyir.io/errors/product-write-timeout.md): HTTP 400, from 3 operations of the Admin API. - [RATE_LIMITED](https://docs.tassyir.io/errors/rate-limited.md): HTTP 429, from every operation of the Admin API. - [SERVICE_UNAVAILABLE](https://docs.tassyir.io/errors/service-unavailable.md): HTTP 503, from every operation of the Admin API. - [STORE_REQUIRED](https://docs.tassyir.io/errors/store-required.md): HTTP 400, from POST /orders. - [STORE_SCOPE_FORBIDDEN](https://docs.tassyir.io/errors/store-scope-forbidden.md): HTTP 460, from 15 operations of the Admin API. - [SUBSCRIPTION_REQUIRED](https://docs.tassyir.io/errors/subscription-required.md): HTTP 422, from 3 operations of the Admin API. - [UNSUPPORTED_MEDIA_TYPE](https://docs.tassyir.io/errors/unsupported-media-type.md): HTTP 415, from 15 operations of the Admin API. - [VALIDATION_FAILED](https://docs.tassyir.io/errors/validation-failed.md): HTTP 400, from 40 operations of the Admin API. - [@tassyir/app](https://docs.tassyir.io/packages/app.md): Server SDK for Tassyir apps: token exchange and refresh, ID-token and webhook verification, and a typed Admin API client. - [@tassyir/app-bridge](https://docs.tassyir.io/packages/app-bridge.md): App Bridge for Tassyir apps: the embedded page's side of the dashboard bridge (ID tokens, toasts, modals, navigation, save bar, title bar, resource pickers, context). - [@tassyir/app-manifest](https://docs.tassyir.io/packages/app-manifest.md): Schema and validator for tassyir.app.toml, the Tassyir app manifest: the normalised manifest or every error with a code, a path and a fix. - [@tassyir/dev-mcp](https://docs.tassyir.io/packages/dev-mcp.md): An MCP server for the AI agent that builds your Tassyir app: the guides, the Admin API and webhook schemas, manifest validation, the starter, and test webhooks and dev stores through your tassyir login. - [@tassyir/ui](https://docs.tassyir.io/packages/ui.md): Web components for Tassyir app pages: the dashboard's look (ink-on-paper tokens, right-to-left, dark mode) as custom elements that work in any framework or none. - [create-tassyir-app](https://docs.tassyir.io/packages/create-tassyir-app.md): Start a Tassyir app: npm create tassyir-app@latest. A Node server with an embedded page, webhooks and the Admin API, ready for AI coding agents (AGENTS.md, CLAUDE.md, a Claude Code skill). - [tassyir](https://docs.tassyir.io/packages/cli.md): The Tassyir developer CLI: sign in, create apps, validate and deploy tassyir.app.toml, manage client secrets, dev stores and test webhooks. --json on every command. ## OpenAPI Specs - [openapi.2026-10](/openapi/openapi.2026-10.json) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.