API reference · Getting paid

Payer

GET Read a payment attempt

GET /pay/attempt/{reference}

What the payer's application polls while an authentication step runs in another window. Carries a masked instrument and never anything more.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponseCollectionAttemptResponse

curl -X GET "https://api.bridgemoni.com/pay/attempt/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Collection attempt retrieved successfully

POST Submit a tokenised card against an attempt

POST /pay/attempt/{reference}/card

The request body has no field that can hold a card number, an expiry or a CVV. The payer typed into the acquirer's hosted field and the application received a token; the token is what arrives here. A decline comes back as a single generic reason - an issuer's precise reason is a card-testing oracle, so it is recorded against the attempt and not returned.

Headers

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

Path parameters

Name
reference

Example

Request body: SubmitCardRequest · Response: GenericResponseCollectionAttemptResponse

curl -X POST "https://api.bridgemoni.com/pay/attempt/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/card" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "instrumentToken": "string",
  "threeDsServerTransactionId": "string",
  "captureImmediately": true
}'

Responses

StatusWhen
200Card payment submitted successfully

POST Ask the operator to prompt the payer's handset

POST /pay/attempt/{reference}/mobile-money

One prompt per attempt: prompting again would ask the payer to approve a second debit, and an operator that honours both has taken the money twice. The attempt then waits. Our own timer stops showing it as pending after a few minutes, which is a statement about this checkout and not about the payer's wallet - a payer who approves after it fires has sent real money, and that confirmation is still honoured.

Headers

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

Path parameters

Name
reference

Example

Request body: SubmitMobileMoneyRequest · Response: GenericResponseCollectionAttemptResponse

curl -X POST "https://api.bridgemoni.com/pay/attempt/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/mobile-money" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "payerMsisdn": "string"
}'

Responses

StatusWhen
200Payment prompt sent successfully

GET Read a collection request by its short payment code

GET /pay/code/{shortCode}

For the rails where a person retypes a code rather than following a link - USSD, and a printed QR somebody is reading off a receipt. The code carries a check character, so a single mistyped or transposed character fails here rather than naming somebody else's collection. Every failure returns the same refusal: a malformed code, a code nobody minted, and a code whose request is expired, cancelled or already paid are indistinguishable in the response, because a screen that answered them differently would be a directory of every collection on the platform, walkable one guess at a time.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
shortCode

Example

Response: GenericResponsePayerProjectionResponse

curl -X GET "https://api.bridgemoni.com/pay/code/value" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Collection request retrieved successfully

POST Approve a held payment from the notice

POST /pay/escrow/approve/{token}

The same token as the objection link, which is why it has to be treated as a payment credential: whoever holds it can release money.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
User-Agent

Path parameters

Name
token

Example

Response: GenericResponseEscrowObjectionResponse

curl -X POST "https://api.bridgemoni.com/pay/escrow/approve/value" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Approval recorded successfully

POST Object to a held payment being released

POST /pay/escrow/object/{token}

One click from the notice, no account and no reason. A mandatory reason field is a barrier, and a payer who cannot articulate why still gets to say no. The objection moves the gate to the existing dispute path; nothing new adjudicates it. The collector cannot withdraw, dismiss or expire it.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live
User-Agent

Path parameters

Name
token

Example

Response: GenericResponseEscrowObjectionResponse

curl -X POST "https://api.bridgemoni.com/pay/escrow/object/value" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Objection recorded successfully

GET Read a collection request as the payer

GET /pay/{reference}

The payer-facing projection, served to the application the payer is using rather than to the payer. The application authenticates with its own client credentials; the payer needs no Bridge account and holds no session, so nothing here is unauthenticated and nothing here identifies a payer either. It lives under /pay so a checkout application's role can be granted this and nothing else - the collector endpoints under /collection stay out of its reach. Deliberately thin: it carries the collector's display name, what is being asked for and how it can be paid, and nothing else. The fee, the merchant discount rate, the settlement account, the collector's own reference, the metadata and every other payer are absent from the response type itself rather than filtered on the way out.

Headers

NameNotes
AuthorizationBearer token
X-TenantYour tenant
X-Environmenttest or live

Path parameters

Name
reference

Example

Response: GenericResponsePayerProjectionResponse

curl -X GET "https://api.bridgemoni.com/pay/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV"

Responses

StatusWhen
200Collection request retrieved successfully

POST Start a payment attempt on a collection request

POST /pay/{reference}/attempt

Reserves an attempt on a chosen rail and hands back whatever the payer's application needs to continue - for a card that is where to collect the card details, which is the acquirer's own hosted field and never Bridge. The return URL is taken from the collection request rather than from this body: a checkout that names its own return address is how an attacker sends an authenticated payer somewhere of their choosing. Several attempts may exist on one request; only one can succeed, because the receipt is what closes the request and there is one of those.

Headers

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

Path parameters

Name
reference

Example

Request body: StartAttemptRequest · Response: GenericResponseCollectionAttemptResponse

curl -X POST "https://api.bridgemoni.com/pay/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/attempt" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "railCode": "string",
  "amount": "string",
  "payerIdentifier": "string"
}'

Responses

StatusWhen
200Collection attempt started successfully

POST Send the payer a code to prove they control a contact

POST /pay/{reference}/contact

Asked for only where the collection is held behind gates that can release on the payer's silence, and shown with that reason: so we can tell you before your money is released. A contact supplied by the collector never reaches this level however it behaves afterwards, because a collector who can nominate the address we serve can manufacture a silence the payer never had a chance to break.

Headers

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

Path parameters

Name
reference

Example

Request body: VerifyPayerContactRequest · Response: GenericResponsePayerContactResponse

curl -X POST "https://api.bridgemoni.com/pay/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/contact" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "contact": "string",
  "channel": "string"
}'

Responses

StatusWhen
200Verification started successfully

POST Prove a contact with the code that was sent to it

POST /pay/{reference}/contact/prove

Attempts are capped. An unlimited guess count on a six digit code proves nothing about who holds the address.

Headers

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

Path parameters

Name
reference

Example

Request body: ProvePayerContactRequest · Response: GenericResponsePayerContactResponse

curl -X POST "https://api.bridgemoni.com/pay/b3f1c2d4-5e6a-4b7c-8d9e-0f1a2b3c4d5e/contact/prove" \
  -H "Authorization: Bearer $BRIDGEMONI_TOKEN" \
  -H "X-Tenant: $BRIDGEMONI_TENANT" \
  -H "X-Environment: $BRIDGEMONI_ENV" \
  -H "Content-Type: application/json" \
  -d '{
  "code": "string"
}'

Responses

StatusWhen
200Contact verified successfully

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