Reloadly Airtime API
Send mobile airtime top-ups and data bundles to phones across 170+ countries and 800+ mobile operators. Supports auto-detection of mobile operators from phone numbers with real-time fulfillment and FX conversion.
Send mobile airtime top-ups and data bundles to phones across 170+ countries and 800+ mobile operators. Supports auto-detection of mobile operators from phone numbers with real-time fulfillment and FX conversion.
openapi: 3.1.0
info:
title: Reloadly Airtime API
description: >-
The Reloadly Airtime API enables businesses to programmatically deliver
mobile airtime top-ups and data bundles to phones across 170+ countries
and 800+ mobile operators. The API supports both operator-specific and
auto-detect top-ups, with real-time fulfillment and detailed transaction
reporting. Authentication uses OAuth 2.0 client credentials with separate
sandbox and production environments.
version: '1.0.0'
contact:
name: Reloadly Support
url: https://support.reloadly.com
termsOfService: https://www.reloadly.com/terms
externalDocs:
description: Reloadly Airtime API Reference
url: https://docs.reloadly.com/airtime
servers:
- url: https://topups.reloadly.com
description: Production Server
- url: https://topups-sandbox.reloadly.com
description: Sandbox Server
tags:
- name: Authentication
description: Obtain OAuth 2.0 access tokens for API authorization.
- name: Operators
description: Browse mobile network operators and their coverage.
- name: Top-Ups
description: Send airtime top-ups to mobile phones worldwide.
- name: Transactions
description: List and retrieve top-up transaction history.
- name: Balance
description: Check your Reloadly account balance.
security:
- bearerAuth: []
paths:
/oauth/token:
post:
operationId: getAirtimeAccessToken
summary: Get Access Token
description: >-
Exchange your client credentials for an OAuth 2.0 bearer access token
for the Airtime API. Set audience to https://topups.reloadly.com.
tags:
- Authentication
security: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TokenRequest'
responses:
'200':
description: Access token issued successfully
content:
application/json:
schema:
$ref: '#/components/schemas/TokenResponse'
'401':
$ref: '#/components/responses/Unauthorized'
/operators:
get:
operationId: listOperators
summary: List Operators
description: >-
Retrieve a paginated list of supported mobile network operators.
Supports filtering by country code. Returns operator details including
name, country, supported denominations, and FX rates.
tags:
- Operators
parameters:
- $ref: '#/components/parameters/PageParam'
- $ref: '#/components/parameters/SizeParam'
- name: countryCode
in: query
description: Filter by ISO 3166-1 alpha-2 country code
schema:
type: string
example: US
- name: includeBundles
in: query
description: Include data bundle operators
schema:
type: boolean
- name: includeData
in: query
description: Include data-only operators
schema:
type: boolean
- name: includePin
in: query
description: Include PIN-based top-up operators
schema:
type: boolean
responses:
'200':
description: Paginated list of operators
content:
application/json:
schema:
$ref: '#/components/schemas/OperatorsPage'
'401':
$ref: '#/components/responses/Unauthorized'
/operators/{operatorId}:
get:
operationId: getOperator
summary: Get Operator
description: >-
Retrieve details for a specific mobile network operator including
coverage, denominations, and FX exchange rate.
tags:
- Operators
parameters:
- name: operatorId
in: path
required: true
description: Unique identifier of the operator
schema:
type: integer
responses:
'200':
description: Operator details
content:
application/json:
schema:
$ref: '#/components/schemas/Operator'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/operators/auto-detect/phone/{phone}/countries/{countryCode}:
get:
operationId: autoDetectOperator
summary: Auto-Detect Operator
description: >-
Automatically detect the mobile network operator for a phone number
in a given country. Returns the detected operator with confidence score.
tags:
- Operators
parameters:
- name: phone
in: path
required: true
description: Phone number in E.164 format (without leading +)
schema:
type: string
example: '12025551234'
- name: countryCode
in: path
required: true
description: ISO 3166-1 alpha-2 country code
schema:
type: string
example: US
- name: suggestedAmounts
in: query
description: Include suggested top-up amounts
schema:
type: boolean
- name: suggestedAmountsMap
in: query
description: Include suggested amounts as a map
schema:
type: boolean
responses:
'200':
description: Detected operator
content:
application/json:
schema:
$ref: '#/components/schemas/Operator'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/topups:
post:
operationId: sendTopUp
summary: Send Top-Up
description: >-
Send an airtime top-up to a mobile phone. Specify the operator ID
or let the API auto-detect it from the phone number and country.
Returns a transaction object with delivery confirmation.
tags:
- Top-Ups
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TopUpRequest'
responses:
'200':
description: Top-up sent successfully
content:
application/json:
schema:
$ref: '#/components/schemas/TopUpTransaction'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/topups/transactions:
get:
operationId: listTopUpTransactions
summary: List Top-Up Transactions
description: >-
Retrieve a paginated list of all airtime top-up transactions.
Supports filtering by date range, phone number, and status.
tags:
- Transactions
parameters:
- $ref: '#/components/parameters/PageParam'
- $ref: '#/components/parameters/SizeParam'
- name: startDate
in: query
description: Filter from this date (YYYY-MM-DD)
schema:
type: string
format: date
- name: endDate
in: query
description: Filter to this date (YYYY-MM-DD)
schema:
type: string
format: date
responses:
'200':
description: Paginated list of top-up transactions
content:
application/json:
schema:
$ref: '#/components/schemas/TransactionsPage'
'401':
$ref: '#/components/responses/Unauthorized'
/topups/transactions/{transactionId}:
get:
operationId: getTopUpTransaction
summary: Get Top-Up Transaction
description: >-
Retrieve details for a specific airtime top-up transaction.
tags:
- Transactions
parameters:
- name: transactionId
in: path
required: true
description: Unique transaction identifier
schema:
type: integer
responses:
'200':
description: Transaction details
content:
application/json:
schema:
$ref: '#/components/schemas/TopUpTransaction'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/accounts/balance:
get:
operationId: getAirtimeBalance
summary: Get Account Balance
description: >-
Retrieve the current balance of your Reloadly account for airtime
top-ups.
tags:
- Balance
responses:
'200':
description: Account balance
content:
application/json:
schema:
$ref: '#/components/schemas/Balance'
'401':
$ref: '#/components/responses/Unauthorized'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: >-
OAuth 2.0 bearer token obtained via the /oauth/token endpoint using
client credentials grant.
parameters:
PageParam:
name: page
in: query
description: Page number (1-based)
schema:
type: integer
minimum: 1
default: 1
SizeParam:
name: size
in: query
description: Number of results per page
schema:
type: integer
minimum: 1
maximum: 200
default: 25
schemas:
TokenRequest:
type: object
required:
- client_id
- client_secret
- grant_type
- audience
properties:
client_id:
type: string
client_secret:
type: string
grant_type:
type: string
enum:
- client_credentials
audience:
type: string
example: https://topups.reloadly.com
TokenResponse:
type: object
properties:
access_token:
type: string
scope:
type: string
expires_in:
type: integer
token_type:
type: string
Operator:
type: object
properties:
operatorId:
type: integer
description: Unique operator identifier
name:
type: string
description: Operator display name
bundle:
type: boolean
description: Whether the operator offers data bundles
data:
type: boolean
description: Whether this is a data-only operator
pin:
type: boolean
description: Whether the operator uses PIN-based top-ups
denominationType:
type: string
enum:
- FIXED
- RANGE
localFixedAmounts:
type: array
items:
type: number
description: Available fixed amounts in local currency
internationalFixedAmounts:
type: array
items:
type: number
description: Available fixed amounts in international currency
localMinAmount:
type: number
description: Minimum top-up in local currency (range products)
localMaxAmount:
type: number
description: Maximum top-up in local currency (range products)
internationalMinAmount:
type: number
description: Minimum top-up in international currency (range products)
internationalMaxAmount:
type: number
description: Maximum top-up in international currency (range products)
country:
$ref: '#/components/schemas/Country'
fxRate:
$ref: '#/components/schemas/FxRate'
logoUrls:
type: array
items:
type: string
format: uri
description: Operator logo image URLs
Country:
type: object
properties:
isoName:
type: string
description: ISO 3166-1 alpha-2 country code
name:
type: string
description: Country display name
FxRate:
type: object
properties:
currencyCode:
type: string
description: Local currency code
rate:
type: number
format: double
description: Exchange rate from USD to local currency
TopUpRequest:
type: object
required:
- operatorId
- amount
- useLocalAmount
- customIdentifier
- recipientPhone
- senderPhone
properties:
operatorId:
type: integer
description: Target mobile network operator ID
amount:
type: number
format: double
description: Top-up amount
useLocalAmount:
type: boolean
description: Whether amount is in local currency or international (USD)
customIdentifier:
type: string
description: Custom reference identifier for tracking
recipientPhone:
$ref: '#/components/schemas/Phone'
senderPhone:
$ref: '#/components/schemas/Phone'
Phone:
type: object
required:
- countryCode
- number
properties:
countryCode:
type: string
description: ISO 3166-1 alpha-2 country code
number:
type: string
description: Phone number in E.164 format (without leading +)
TopUpTransaction:
type: object
properties:
transactionId:
type: integer
status:
type: string
enum:
- SUCCESSFUL
- REFUNDED
- FAILED
operatorTransactionId:
type: string
description: Transaction ID from the mobile operator
customIdentifier:
type: string
recipientPhone:
type: string
recipientEmail:
type: string
senderPhone:
type: string
countryCode:
type: string
operatorId:
type: integer
operatorName:
type: string
discount:
type: number
discountCurrencyCode:
type: string
requestedAmount:
type: number
requestedAmountCurrencyCode:
type: string
deliveredAmount:
type: number
deliveredAmountCurrencyCode:
type: string
transactionDate:
type: string
format: date-time
Balance:
type: object
properties:
balance:
type: number
format: double
currencyCode:
type: string
updatedAt:
type: string
format: date-time
OperatorsPage:
type: object
properties:
content:
type: array
items:
$ref: '#/components/schemas/Operator'
totalElements:
type: integer
totalPages:
type: integer
last:
type: boolean
number:
type: integer
size:
type: integer
TransactionsPage:
type: object
properties:
content:
type: array
items:
$ref: '#/components/schemas/TopUpTransaction'
totalElements:
type: integer
totalPages:
type: integer
last:
type: boolean
number:
type: integer
size:
type: integer
Error:
type: object
properties:
timeStamp:
type: string
format: date-time
message:
type: string
path:
type: string
errorCode:
type: string
responses:
BadRequest:
description: Invalid request parameters
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Missing or invalid authentication token
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Requested resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'