> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mysubwallet.ng/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors & Status

> How the API reports success and failure.

Every response includes a **`status`** field and a human-readable **`message`**. Always branch on `status` rather than HTTP code alone.

## Status values

| `status`  | Meaning                                                                                                        |
| --------- | -------------------------------------------------------------------------------------------------------------- |
| `success` | The service was delivered and your wallet was debited.                                                         |
| `fail`    | The transaction did not go through. Read `message` for the reason. No charge, or an automatic refund, applies. |
| `pending` | The transaction is being processed. The final outcome is delivered via [webhook](/guides/webhooks).            |

## Example failure

```json theme={null}
{
  "status": "fail",
  "message": "Insufficient wallet balance.",
  "request-id": "Data_12345678900"
}
```

## Common errors

<AccordionGroup>
  <Accordion title="401 Unauthorized" icon="lock">
    Missing or invalid token. Send `Authorization: Token <your_api_key>` — see [Authentication](/authentication).
  </Accordion>

  <Accordion title="Insufficient wallet balance" icon="wallet">
    Top up your wallet from the [dashboard](https://app.mysubwallet.ng) before retrying.
  </Accordion>

  <Accordion title="Duplicate request-id" icon="copy">
    A transaction with that `request-id` already exists — the original result is returned instead of charging again. Use a fresh `request-id` for a new purchase.
  </Accordion>

  <Accordion title="Invalid plan or network" icon="circle-xmark">
    Check the plan ID / network ID against the [catalog endpoints](/services/verification) or the dashboard's Pricing & Plan IDs page.
  </Accordion>
</AccordionGroup>

<Tip>
  For `pending` transactions, never re-send the purchase — wait for the webhook, or re-query using the same `request-id`.
</Tip>
