neo-pays

Quick start

From account to first collection, in five steps.

1. Create your merchant account

Sign up on the dashboard. Your account starts in status pending: you can explore the dashboard and create keys and webhooks, but API calls answer client_inactive until your file is approved.

2. Complete the KYB file

Under Compliance, name the legal representative and the beneficial owners, then upload the trade register (RCCM). A rejected document always comes back with a reason — fix it and resubmit; the history is kept.

Once approved, your account becomes active and your keys open. Nothing else is required of you.

3. Create an API key

Under Developers → API keys, create a test key and then, when you are ready, a live one. The secret (sk_test_… or sk_live_…) is shown only once, at creation — put it straight into your secret manager.

4. Find your asset and platform identifiers

Before the first call, ask what your account may use:

curl https://api.neo-pays.com/v1/corridors \
  -H "Authorization: Bearer sk_test_..."

The response gives the asset_id and platform_id values to use, by country and direction. GET /v1/assets additionally gives each asset's decimal count — that is what says what a minor unit is worth.

5. Create your first collection

curl https://api.neo-pays.com/v1/payments \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1042" \
  -d '{
    "asset_id": 1,
    "amount_minor": "500000",
    "country": "SN",
    "platform_id": 1,
    "client_ref": "order-1042",
    "payer": { "name": "Adama Diop", "phone": "+221771234567", "country": "SN" }
  }'

The response carries a payment_url (or a deeplink, or a qrcode_url, depending on the rail): show it to your customer.

Amounts are strings, in minor units. "500000" on a zero-decimal asset is 500,000. Always a string, never a floating-point number: the API refuses anything that does not read back exactly.

6. Listen for the webhook

Never trust the browser return for confirmation — the customer can close the tab. The truth is the payment.success event delivered to your endpoint (configure it), or failing that GET /v1/payments/{id}.

Next