API reference · Savings & everyday money

Offline Payments

Load a device online, pay offline, settle in batches when it reconnects, with replay protection. About offline payments Live

POST Deposit into the caller's device wallet from their own main account

POST /offline/deposit

Requires a validated transaction PIN and device (x-secret-value/x-device-id headers on this request) - both must have been validated, and the body's deviceId must be the specific device currently linked to the caller's device wallet. An optional Idempotency-Key header makes a retried call with the same key return the original result instead of moving funds again.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
X-Idempotency-KeyReuse the same value on every retry of this request
Content-Typeapplication/json

Example

Request body: TopupRequest · Response: TopupResponse

curl -X POST "https://api.bridgemoni.com/offline/deposit" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "X-Idempotency-Key: a-unique-key-per-intent" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": {
      "amount": "250000.00",
      "currencyCode": "NGN"
    },
    "narration": "March payroll",
    "deviceId": "a7f3-k2m9-4c1d-8e5b"
  }'

Responses

StatusWhen
200Deposit processed successfully

POST Issue a signed offline identity assertion for one of the caller's linked devices

POST /offline/identity

Two phones settling a payment with no network cannot look each other up, so each carries a statement signed by us saying which user a device public key belongs to. The receiving phone verifies that signature with no connectivity at all. Safe and cheap to call repeatedly - a device renews after linking, after a deposit, after a settlement that leaves a balance, and whenever the app opens online without a valid assertion. Nothing is issued for a key that is not a device currently linked to the caller, or for a blocked or closed account.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
Content-Typeapplication/json

Example

Request body: OfflineIdentityRequest · Response: GenericResponseOfflineIdentityResponse

curl -X POST "https://api.bridgemoni.com/offline/identity" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "identityPublicKey": "string"
}'

Responses

StatusWhen
200Offline identity assertion issued

POST Reconcile a batch of offline peer-to-peer taps into the real ledger

POST /offline/settlement

Requires a validated transaction PIN and device (x-secret-value/x-device-id headers on this request) for the caller's own side of each transaction. Each item already carries both parties' signatures over its canonical payload - whichever side calls first performs the real, one-time movement from the sender's device account to the receiver's main account; the other side's later call for the same sender/receiver transaction reference pair is a no-op returning the already-COMPLETED result. A failed item is reported with FAILED status in its own result entry rather than aborting the rest of the batch.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
Content-Typeapplication/json

Example

Request body: OfflineSettlementRequest · Response: OfflineSettlementResponse

curl -X POST "https://api.bridgemoni.com/offline/settlement" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
    "transactions": [
      {
        "amount": {
          "amount": "250000.00",
          "currencyCode": "NGN"
        },
        "narration": "March payroll",
        "senderTransactionReference": "financial transaction reference",
        "receiverTransactionReference": "financial transaction reference",
        "senderMsisdn": "+2348012345678",
        "receiverMsisdn": "+2348012345678",
        "role": "SENDER",
        "senderSignature": "signature data",
        "receiverSignature": "signature data",
        "callerDeviceId": "a7f3-k2m9-4c1d-8e5b"
      }
    ]
  }'

Responses

StatusWhen
200Settlement batch processed

Generated from the OpenAPI document. Branch on the HTTP status: there is no machine-readable error code on the wire. Errors