---
title: "What do RevenueDot's API errors mean?"
description: "The SDK and REST v1 error codes, the REST v2 error types, which HTTP status each uses, and what to do about each one."
url: https://revenuedot.app/docs/api/errors
---

# What do RevenueDot's API errors mean?

RevenueDot answers errors in the format each API's clients already parse: SDK endpoints and REST v1 send `{ "code", "message" }` with RevenueCat's backend codes, and REST v2 sends an `error` object with a `type`. For receipts, the HTTP status class matters most: a 4xx makes the SDK finish the transaction for good, and a 5xx makes it retry. See [4xx or 5xx on a receipt](https://revenuedot.app/docs/help/receipt-errors-4xx-vs-5xx.md).

## SDK and REST v1 error codes

```json
{
  "code": 7103,
  "message": "The receipt is not a valid Test Store purchase token."
}
```

| Code | Name | HTTP status | Meaning |
|---|---|---|---|
| 7000 | BAD_REQUEST / INVALID_PLATFORM | 400 | The request is malformed, a secret-key receipt post has no X-Platform app, the store action does not exist for this store, or a web checkout was asked for (RevenueDot takes no web payments). |
| 7101 | STORE_PROBLEM | 400 or 503 | The store refused the request (400), or the store or its credentials could not be used right now (503, retry later). |
| 7102 | RECEIPT_ALREADY_IN_USE | 400 | The purchase belongs to another customer and the project's transfer behaviour is keep or transfer_if_no_active. |
| 7103 | INVALID_RECEIPT | 400 | The receipt, signed transaction or purchase token is not valid, or it belongs to another bundle id or package name. |
| 7110 | INTERNAL | 500 | An unexpected server error. The SDK keeps the transaction and retries. |
| 7220 | INVALID_APP_USER_ID | 400 | The app user id is empty or longer than 100 characters. |
| 7224 | INVALID_AUTH_TOKEN | 401 | A Google Pub/Sub push token is missing or invalid (store notifications only). |
| 7225 | INVALID_API_KEY | 401 or 403 | The API key is unknown (401), or a REST v1 endpoint was called with a public key (403). |
| 7226 | BAD_REQUEST_PARAMS | 400 | A store action got parameters it cannot use, or a required field (such as `aad_attribution_token` or `generate_offers`) is missing. |
| 7234 | INVALID_APPLE_SUBSCRIPTION_KEY | 400 or 500 | A StoreKit 1 receipt arrived for an App Store app without an in-app purchase key, or the key is incomplete (500, so the SDK retries once you add the key). A promotional offer cannot be signed without the key (400; the SDK reports `invalidAppleSubscriptionKeyError` for that offer). |
| 7259 | NOT_FOUND | 404 | The customer, entitlement, offering or subscription does not exist. |
| 7263 | INVALID_SUBSCRIBER_ATTRIBUTES | 400 | Some attributes were not saved; `attribute_errors` lists them. |
| 7662 | UNSUPPORTED_RECEIPT | 400 | Receipts for this app's store are not supported yet (Amazon, Stripe, Web Billing, Paddle, Roku), including the Android SDK's Amazon receipt lookup. |
| 7849 | INVALID_WEB_REDEMPTION_TOKEN | 400 | A web purchase redemption token is not valid. RevenueDot has no web purchases, so every token answers this; the SDKs return the `invalidToken` result. |
| 7877 | INVALID_OPERATION_SESSION | 400 | A Web Billing checkout session does not exist. |

## REST API v2 error types

```json
{
  "object": "error",
  "type": "parameter_error",
  "message": "app_id: Required",
  "param": "app_id",
  "doc_url": "https://revenuedot.app/docs/api/errors#parameter-error",
  "retryable": false
}
```

Every v2 error has `object: "error"`, `type`, `message`, `doc_url` (a link to the section below) and `retryable`. `param` names the field at fault when there is one.

<a id="parameter-error"></a>

### parameter_error

A field or query parameter is missing or invalid. `param` names it. Fix the request; do not retry it unchanged.

<a id="resource-already-exists"></a>

### resource_already_exists

An object with this id or lookup key already exists (409). Fetch it instead of creating it.

<a id="resource-missing"></a>

### resource_missing

The object does not exist in this project (404). Another project's ids also answer 404, so ids cannot be probed.

<a id="idempotency-error"></a>

### idempotency_error

Reserved for RevenueCat compatibility. RevenueDot does not send it today.

<a id="rate-limit-error"></a>

### rate_limit_error

Too many requests of one kind: project invites (50 per project per day). The error is `retryable`; try again later. The dashboard's password reset and email verification endpoints answer 429 with the same `type`.

<a id="authentication-error"></a>

### authentication_error

No API key, an unknown key, or no dashboard session (401).

<a id="authorization-error"></a>

### authorization_error

The key lacks a permission, a public app key was used, or the action needs a dashboard admin (403).

<a id="store-error"></a>

### store_error

The App Store or Google Play refused the action (422) or could not be reached (503, `retryable: true`).

<a id="server-error"></a>

### server_error

RevenueDot failed (500, `retryable: true`). Retry with backoff.

<a id="resource-locked-error"></a>

### resource_locked_error

Reserved for RevenueCat compatibility. RevenueDot does not send it today.

<a id="unprocessable-entity-error"></a>

### unprocessable_entity_error

The request is valid but not possible in this state or for this store (422), for example archiving the current offering or refunding an App Store purchase.

<a id="invalid-request"></a>

### invalid_request

The body is not valid JSON (400), or a package would get two products of one app with overlapping eligibility (409).

<a id="entity-references-archived-entities"></a>

### entity_references_archived_entities

The action would make an archived object current (422). Unarchive it first.

## Related

- [Authentication](https://revenuedot.app/docs/api/authentication.md)
- [Troubleshooting](https://revenuedot.app/docs/help/troubleshooting.md)
