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.

OpenAPI Specification

reloadly-airtime-openapi.yml Raw ↑
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'