# App Store purchase could not be verified

> Canonical HTML: https://screenrig.ai/problems/app-store-transaction-invalid

HTTP 422 · `app_store_transaction_invalid`

## What it means

The API answers with HTTP 422 Unprocessable Content and an `application/problem+json` document when the condition is App Store purchase could not be verified. The document's `type` member is `https://screenrig.ai/problems/app-store-transaction-invalid`, the address of this page, and its `code` member is `app_store_transaction_invalid`.

## What to do

The signed value is not a screenRIG plan transaction from the App Store for this server's environment. Send the transaction exactly as StoreKit returned it, from a build of the app that buys against this server.

## Should you retry?

The `retryable` member appears only on HTTP 5xx problems, so this one has none. Follow the steps under What to do before sending the request again.

## Example response

Most routes answer with the error in the first entry of `errors`, and the document members `instance` and `request_id` beside it. The `type`, `code`, `title` and `status` of this problem type are fixed; `detail` varies per request, and `hint` is the registry default unless the handler sets a more specific one.

~~~http
HTTP/1.1 422 Unprocessable Content
Content-Type: application/problem+json

{
  "errors": [
    {
      "status": 422,
      "code": "app_store_transaction_invalid",
      "type": "https://screenrig.ai/problems/app-store-transaction-invalid",
      "title": "App Store purchase could not be verified",
      "detail": "What went wrong in this request.",
      "hint": "The signed value is not a screenRIG plan transaction from the App Store for this server's environment. Send the transaction exactly as StoreKit returned it, from a build of the app that buys against this server."
    }
  ],
  "instance": "INSTANCE",
  "request_id": "REQUEST_ID",
  "server_time": "2026-01-01T00:00:00Z"
}
~~~

## In the API contract

The OpenAPI contract describes this problem in these words:

> The app finishes the transaction after a 2xx or a definitive 4xx problem. Problems: app_store_transaction_invalid (422), app_store_account_mismatch (409), education_not_eligible (403), app_store_plan_conflict (409), billed_by_reseller (409, the organization is delegated to a reseller, which pays for its plan).

> Any other type, a notification for a product that is not a plan, and one that names no organization are acknowledged and logged. 200 acknowledges. A payload that does not verify is a 422 app_store_transaction_invalid problem; a failure on the server's side is a 5xx, which Apple sends again. Limited per client address.

## Operations that name this problem

These operations name this problem in the API reference:

- [Record App Store Transaction](https://screenrig.ai/docs/api/billing#op-recordAppStoreTransaction) — `POST /api/organizations/{organization_id}/app-store/transactions`
- [Receive App Store Notification](https://screenrig.ai/docs/api/billing#op-receiveAppStoreNotification) — `POST /api/app-store/notifications`

## Related problems

The contract mentions these problems alongside this one:

- [The organization is billed through its reseller](https://screenrig.ai/problems/billed-by-reseller) — `billed_by_reseller`
- [Purchase belongs to another organization](https://screenrig.ai/problems/app-store-account-mismatch) — `app_store_account_mismatch`
- [Organization is not eligible for the Education plan](https://screenrig.ai/problems/education-not-eligible) — `education_not_eligible`
- [Organization already holds a plan](https://screenrig.ai/problems/app-store-plan-conflict) — `app_store_plan_conflict`

## Player action

This problem defines no Player action class. It belongs to a project, pairing or account flow that an agent or the dashboard drives.

## Reference

| Field | Value |
| --- | --- |
| Code | `app_store_transaction_invalid` |
| HTTP status | `422 Unprocessable Content` |
| Type | `https://screenrig.ai/problems/app-store-transaction-invalid` |
| Player action | `none` |

- [All problem types](https://screenrig.ai/problems)
- [API reference](https://screenrig.ai/docs/api#problems)
- [Problem registry YAML](https://screenrig.ai/docs/api/problems.yaml)
