Skip to main content
Numero originates every webhook: we decide which events fire, when (including on failure), the exact payload, and the signature. Your integration is a pure receiver — verify the signature, read the fields, branch on status.

Setting up webhooks

Configure your webhook URL in the Merchant DashboardSettings → Developer → Webhooks:
  1. Add your webhook endpoint URL
  2. Select the events you want (or subscribe to all with "*")
  3. Your signing secret is generated — save it securely (you can view it again anytime via a verification code)
Your signing secret verifies that incoming webhooks are genuinely from Numero. Keep it private and never expose it in client-side code.

How webhooks work

Envelope

Every delivery is a POST of this structure:
The envelope and data use the API’s camelCase field names.

Headers

Event types

¹ An inbound credit has no “merchant failure” to report. ² FX conversion and VA creation are synchronous — a failure is returned in the API response (status: false + a 4xx/503), so there’s nothing to webhook. Branch on the call’s own response for those.
Determine the outcome from data.status (Successful / Unsuccessful / Pending) and data.requestState / data.requestStateDetails — don’t infer it from the event type. A failed outbound transfer/payout fires with status: "Unsuccessful" and requestState: "Failed"; the debit is returned to your wallet through the reversal workflow.

Payloads

TransactionWebhookData — money movement (transfer / funding / payout / internal)

All amounts are in naira.

BillsPurchaseWebhook — VAS

VerificationWebhookData

VirtualAccountCreatedData

CurrencyConversionData

Field casing. The four envelope fields are exactly id, event, created_at and data — note created_at is snake_case. Everything inside data is camelCase, matching the rest of the API.

Retries

  • Respond 2xx to acknowledge. Any non-2xx (or a timeout) is a failed delivery.
  • Every webhook is persisted before delivery, so events are never lost if your endpoint is down.
  • Failed deliveries are retried automatically with exponential backoff for up to 24 hours, and can be re-sent manually from the dashboard. After 10 consecutive failures the subscription is disabled.
  • Webhook delivery never affects the transaction it describes. A failed or refused delivery does not reverse, hold or retry the underlying money movement — treat the webhook as notification, and the transaction status endpoint as the source of truth.