Introduction
The Axra API is organised around REST. It has predictable resource-oriented URLs, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.
Access: API access requires a verified Axra Business account. Generate API keys from your dashboard under Settings → API Keys.
Authentication
All requests must include your API key in the Authorization header as a Bearer token.
curl https://api.axra.io/v1/payments \ -H "Authorization: Bearer axra_live_sk_xxxxxxxxxxxxxxxx" \ -H "Content-Type: application/json"
Keep your secret key private — never expose it in client-side code or public repositories. Test keys are prefixed axra_test_sk_ and only affect sandbox data; live keys are prefixed axra_live_sk_ and move real money.
Base URL
# Production https://api.axra.io/v1 # Sandbox https://sandbox.api.axra.io/v1
Errors
Axra uses standard HTTP status codes. Errors return a JSON object with a code and message.
{
"error": {
"code": "insufficient_balance",
"message": "Your wallet balance is too low to complete this transfer."
}
}| Status | Meaning |
|---|---|
| 200 | Success |
| 201 | Created |
| 400 | Bad Request — check your parameters |
| 401 | Unauthorized — invalid or missing API key |
| 422 | Unprocessable — validation failed |
| 429 | Too Many Requests — you've hit a rate limit |
| 500 | Server Error — retry with exponential backoff |
Rate limits
All endpoints are rate-limited per API key. Limits are returned in the response headers.
| Header | Description |
|---|---|
| X-RateLimit-Limit | Max requests per window |
| X-RateLimit-Remaining | Requests left in current window |
| X-RateLimit-Reset | Unix timestamp when the window resets |
Default limits: 100 requests/minute for payment creation, 1,000 requests/minute for read endpoints. Higher limits are available on request.
Create a payment
POST /payments — creates a payment link your customer can use to send money. The link expires after 24 hours unless a custom expiry is set.
| Parameter | Type | Description |
|---|---|---|
| amount | integer · required | Amount in the smallest currency unit (e.g. kobo, pence) |
| currency | string · required | 3-letter ISO code (e.g. NGN, GBP, USD) |
| settle_in | string · optional | Currency to settle in. Defaults to your settlement currency. |
| description | string · optional | Payment description shown to the customer |
| redirect_url | string · optional | URL to redirect to after successful payment |
| webhook_url | string · optional | URL to POST payment events to |
| metadata | object · optional | Arbitrary key-value pairs stored with the payment |
# Request
curl -X POST https://api.axra.io/v1/payments \
-H "Authorization: Bearer axra_live_sk_xxxx" \
-H "Content-Type: application/json" \
-d '{
"amount": 5000000,
"currency": "NGN",
"description": "Order #1042",
"redirect_url": "https://yoursite.com/success",
"webhook_url": "https://yoursite.com/webhook"
}'
# Response 201
{
"id": "pay_01HXN2K9ZT...",
"status": "pending",
"amount": 5000000,
"currency": "NGN",
"payment_url": "https://pay.axra.io/p/01HXN2K9ZT",
"expires_at": "2026-06-01T14:00:00Z"
}Retrieve a payment with GET /payments/:id, or list payments with GET /payments (paginated with limit, after, and status query params).
Create a transfer
POST /transfers — initiates an international transfer from your Axra Business wallet to a bank account or Axra user in another country.
{
"source_amount": 5000000,
"source_currency": "NGN",
"destination_currency": "GBP",
"recipient": {
"name": "Jane Doe",
"sort_code": "20-00-00",
"account_number": "12345678",
"country": "GB"
}
}Get an exchange rate
curl "https://api.axra.io/v1/rates?from=NGN&to=GBP" \
-H "Authorization: Bearer axra_live_sk_xxxx"
# Response
{
"from": "NGN",
"to": "GBP",
"rate": 0.000519,
"fee_pct": 0.9,
"expires_at": "2026-06-01T13:00:30Z"
}Webhooks
Axra sends signed POST requests to your webhook URL when a payment or transfer event occurs. Each request includes an Axra-Signature header — verify it before processing.
const crypto = require('crypto');
function verifyWebhook(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature),
);
}| Event | Description |
|---|---|
| payment.completed | A payment was successfully received |
| payment.failed | A payment attempt failed |
| payment.expired | A payment link expired before use |
| transfer.completed | An outbound transfer was delivered |
| transfer.failed | An outbound transfer failed |
| wallet.low_balance | Wallet balance fell below your threshold |
SDKs
Official Axra SDKs wrap the REST API and handle authentication, retries, and signature verification automatically.
# Node.js npm install @axra/node # Python pip install axra # PHP composer require axra/axra-php
const Axra = require('@axra/node');
const axra = new Axra('axra_live_sk_xxxx');
const payment = await axra.payments.create({
amount: 5000000,
currency: 'NGN',
description: 'Order #1042',
});
console.log(payment.payment_url);Looking for more? Explore our developer guides and the payment gateway reference.
Ready to build?
Create an Axra Business account to generate API keys, or talk to our team about your integration.