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

# Data

> Sell mobile-data bundles. Discover networks and plans at runtime, then purchase by plan code.

Buy a mobile-data bundle for a phone number. Data is a three-step flow: find the network, look up
that network's plans, then purchase the plan by its `code`. Discover both at runtime — plan codes and
prices change without an API version bump.

## Get Data Networks

```
GET /api/v1/business/vas/internet/data/fetch-providers
```

**Signature required:** No

### Request example

```bash theme={null}
curl -X GET "https://api.usenumero.com/numeroaccount/api/v1/business/vas/internet/data/fetch-providers" \
  -H "X-Numero-Api-Key: your_api_key"
```

### Response

```json theme={null}
{
  "data": {
    "providers": [
      {
        "code": "MTNDATA",
        "name": "MTN Data"
      },
      {
        "code": "GLODATA",
        "name": "Glo Data"
      },
      {
        "code": "AIRTELDATA",
        "name": "Airtel Data"
      }
    ]
  },
  "error": null,
  "meta": {
    "request_id": "req_365123ebc73323f1482508560ce6400e",
    "pagination": null
  }
}
```

## Look Up Data Plans

```
GET /api/v1/business/vas/internet/data/lookup?provider={code}
```

**Signature required:** No

| Query      | Required | Description                                            |
| ---------- | -------- | ------------------------------------------------------ |
| `provider` | Yes      | Network `code` from `fetch-providers` (e.g. `MTNDATA`) |

### Request example

```bash theme={null}
curl -X GET "https://api.usenumero.com/numeroaccount/api/v1/business/vas/internet/data/lookup?provider=MTNDATA" \
  -H "X-Numero-Api-Key: your_api_key"
```

### Response

```json theme={null}
{
  "data": {
    "plans": [
      {
        "code": "MTN_1GB_30D",
        "name": "1GB - 30 days",
        "price": "500",
        "amount": "500",
        "validity": "30 days"
      },
      {
        "code": "MTN_2GB_30D",
        "name": "2GB - 30 days",
        "price": "1000",
        "amount": "1000",
        "validity": "30 days"
      }
    ]
  },
  "error": null,
  "meta": {
    "request_id": "req_365123ebc73323f1482508560ce6400e",
    "pagination": null
  }
}
```

Pass the plan's `code` as `code` when you purchase.

## Buy a Data Bundle

```
POST /api/v1/business/vas/internet/data
```

**Signature required:** Yes

### Headers

| Header                       | Required | Description                                                                                                 |
| ---------------------------- | -------- | ----------------------------------------------------------------------------------------------------------- |
| `X-Numero-Api-Key`           | Yes      | Your API key                                                                                                |
| `X-Numero-Signature`         | Yes      | HMAC-SHA256 of the raw request body — see [Request signing](/03-request-signing)                            |
| `X-Numero-Signature-Version` | Yes      | `v2`                                                                                                        |
| `Idempotency-Key`            | Yes      | A unique string per purchase. Replaying it returns the original result instead of selling the bundle twice. |

### Body

| Field       | Type   | Required | Description                                      |
| ----------- | ------ | -------- | ------------------------------------------------ |
| `reference` | string | Yes      | Your own unique reference for this purchase      |
| `code`      | string | Yes      | Plan code from `lookup`                          |
| `phone`     | string | Yes      | The number to credit                             |
| `provider`  | string | Yes      | Network `code` from `fetch-providers`            |
| `network`   | string | No       | Network qualifier where the provider exposes one |
| `type`      | string | No       | Optional plan-type qualifier                     |

<Note>
  `validationCode` and `transactionPin` are **not** used on this channel. The API key plus the request
  signature authorise a server-to-server purchase; there is no session to send a code to. Both remain in
  force on the merchant dashboard, which is a different channel.
</Note>

### Request example

```bash theme={null}
curl -X POST "https://api.usenumero.com/numeroaccount/api/v1/business/vas/internet/data" \
  -H "X-Numero-Api-Key: your_api_key" \
  -H "X-Numero-Signature: your_signature" \
  -H "X-Numero-Signature-Version: v2" \
  -H "Idempotency-Key: 7a2b1c9d-3e4f-4a5b-9c8d-2e1f0a9b8c7d" \
  -H "Content-Type: application/json" \
  -d '{
    "reference": "DATA-20260810-0001",
    "code": "MTN_1GB_30D",
    "provider": "MTNDATA",
    "phone": "08012345678"
  }'
```

### Response

```json theme={null}
{
  "data": {
    "message": "Purchase successful",
    "reference": "DATA-20260810-001",
    "data": {
      "status": "Successful",
      "customerIdentifier": "08012345678"
    }
  },
  "error": null,
  "meta": {
    "request_id": "req_365123ebc73323f1482508560ce6400e",
    "pagination": null
  }
}
```

## Checking the outcome

A purchase can settle after the response returns. Poll
[`GET /business/vas/status`](/api-reference/vas-overview) with your `reference`, or handle the
`VAS_NOTIFICATION` webhook — do not treat the absence of an error as proof the bundle landed.

## Fees

Data carries a per-transaction fee on your account. Read the charge from the transaction record rather
than assuming a rate; pricing is per merchant.
