Axra Developer API · v1.0

API documentation.

The Axra API lets you accept payments from 30+ countries, send international transfers, check live exchange rates, and manage your Axra Business wallet — all programmatically. RESTful, JSON, standard HTTP codes.

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."
  }
}
StatusMeaning
200Success
201Created
400Bad Request — check your parameters
401Unauthorized — invalid or missing API key
422Unprocessable — validation failed
429Too Many Requests — you've hit a rate limit
500Server Error — retry with exponential backoff

Rate limits

All endpoints are rate-limited per API key. Limits are returned in the response headers.

HeaderDescription
X-RateLimit-LimitMax requests per window
X-RateLimit-RemainingRequests left in current window
X-RateLimit-ResetUnix 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.

ParameterTypeDescription
amountinteger · requiredAmount in the smallest currency unit (e.g. kobo, pence)
currencystring · required3-letter ISO code (e.g. NGN, GBP, USD)
settle_instring · optionalCurrency to settle in. Defaults to your settlement currency.
descriptionstring · optionalPayment description shown to the customer
redirect_urlstring · optionalURL to redirect to after successful payment
webhook_urlstring · optionalURL to POST payment events to
metadataobject · optionalArbitrary 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),
  );
}
EventDescription
payment.completedA payment was successfully received
payment.failedA payment attempt failed
payment.expiredA payment link expired before use
transfer.completedAn outbound transfer was delivered
transfer.failedAn outbound transfer failed
wallet.low_balanceWallet 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.

Talk to us