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

# AptaPay

> One signed REST API for collections, payouts, FX and beneficiaries across African payment corridors.

AptaPay is a multi-provider payment gateway for African corridors. It exposes collections (money in), payouts (money out), FX and saved beneficiaries behind a single signed REST API, so your app integrates once instead of once per provider.

The gateway routes each request to whichever upstream provider serves that corridor, then normalises the answer. You branch on a canonical `status` and a stable error code rather than on a provider-shaped payload.

## Start here

<Columns cols={2}>
  <Card title="Quickstart" icon="rocket" href="/quickstart">
    Sign your first request and take a payment end to end.
  </Card>

  <Card title="Authentication" icon="key" href="/authentication">
    The four `X-AptaPay-*` headers and the canonical string you sign.
  </Card>

  <Card title="Collect a payment" icon="arrow-down-to-line" href="/guides/collections">
    Charge a customer's mobile money wallet, bank account or card.
  </Card>

  <Card title="Send a payout" icon="arrow-up-from-line" href="/guides/payouts">
    Pay a person from your float, and budget for the provider's fee.
  </Card>
</Columns>

## Corridors

Capability is per **corridor**, and a corridor is a `(country, currency, direction, method)` tuple — never a country on its own. Nigeria accepts bank payouts but no mobile money; Rwanda accepts mobile money but no bank; Tanzania is wallet-to-wallet only.

Render your UI against `GET /v1/reference/corridors` rather than hardcoding a country list. A route that does not exist is a `422` at request time, not a surprise at settlement.

## What to know before you build

<Columns cols={2}>
  <Card title="Money is integer minor units" icon="coins" href="/concepts/money">
    Every amount field ends in `_minor`. UGX, RWF, XAF and XOF are zero-decimal, so `2000` UGX is two thousand shillings.
  </Card>

  <Card title="Nothing settles synchronously" icon="clock" href="/concepts/webhooks">
    A charge or payout returns `pending`. The webhook, or a poll, is the real answer.
  </Card>

  <Card title="Money-moving calls are idempotent" icon="repeat" href="/concepts/idempotency">
    `Idempotency-Key` is required on collections and payouts, so a retry after a timeout is always safe.
  </Card>

  <Card title="Errors are stable codes" icon="triangle-alert" href="/concepts/errors">
    Branch on `error.code`, and read `error.details` for the figures behind a refusal.
  </Card>
</Columns>

## Base URLs

| Environment    | Base URL                                         |
| -------------- | ------------------------------------------------ |
| Production     | `https://apta-pay.web.app`                       |
| Local emulator | `http://127.0.0.1:5101/apta-pay/us-central1/api` |

There is one deployed host. Test mode is a separate credential on that same host, not a separate environment — see [Test and live modes](/concepts/modes).
