Going live

Test your integration, then switch to the live environment.

Test your integration

The test environment has the same endpoints as the live environment. It does not move real money. Use the test base URL and a test API key. Then trigger each outcome your integration handles. See Testing.

Every integration

  • Send a request you know is wrong, and branch on the code rather than the message. See Errors.
  • Repeat a create request with the same reference, and confirm you get one result. See Idempotency.
  • Receive each event on a test webhook endpoint, and confirm your handler verifies the signature. See Webhooks.

Orders

  • Quote, create an order, and read it back until it reaches completed.
  • Drive an order to failed and expired with a reserved value, and confirm your handler branches on each. See Testing.
  • For an offramp, resolve the account first and handle account_verification_failed.

Collections

  • Add a payout account and handle account_verification_failed. See Payout accounts.
  • Simulate a deposit of 10 or more, and confirm you match it to your customer by the collection reference. See Testing.
  • Simulate each held outcome, and confirm your handler for order.held records the held_reason.
  • For a naira collection, add a wallet payout account and simulate a transfer of ₦15,000 or more. Confirm that you read sender and payout from order.payment_received.

Switch to the live environment

Change the base URL

Point your client at the live base URL. See Environments.

Use your live API key

Replace the test key with the live key. Keep the key on your server, never in a browser or a mobile app. Rotate it if it ever leaks.

Register live webhook endpoints

Register every live endpoint in the Dashboard, and configure each handler with its live signing secret.

Confirm before you ship

One dry run

Complete this list in the live environment with a small amount. Then open the flow to your users.

Every integration

  • Every live webhook endpoint has received a live event before launch.
  • Every live webhook endpoint verifies X-Pulse-Signature against the raw request body. See Verify deliveries.
  • Your webhook handler stores event IDs durably, acknowledges duplicates, and does not depend on delivery order.
  • You read status first, then branch on the code when a request fails.
  • You repeat timeouts, 503, and 500 with the same reference, and never with a changed body.
  • You read amounts as decimal strings, never as numbers.
  • Your logs exclude API keys, signing secrets, NINs, BVNs, and full bank account numbers.

Orders

  • Your reference is unique for every order, and stored before each create.
  • You handle every terminal status: completed, expired, and failed, and stop reading once an order is terminal. See Order status.
  • You reconcile the delivered amount against amount in order.completed. Late funding can change the order's rate and destination.amount.

Collections

  • Your reference for each collection is your own ID for that customer, so a retry returns the same collection.
  • For a stablecoin collection, you show the customer every entry in deposit_addresses, with the networks from the response. For a naira collection, you show deposit_account as the response returns it.
  • You show the customer the minimum payment, and a maximum below the payment limit.
  • You handle order.held. A held order is not terminal, and you resolve it with support.
  • You handle order.failed on an order from a collection payment. Its reason is payout_failed or internal_error. See order.failed.

On this page