Skip to content
VertexBridgeDocs
On this page

API reference

Every endpoint you can call, generated from our published OpenAPI contract (version 0.1.0). If it is not here, it does not exist yet.

Basics

  • Base URLs: https://api.vertexbridge.io for live keys (not serving yet), https://sandbox.vertexbridge.io for test keys (not serving yet). Every path starts /v1. The examples read the base URL from VERTEXBRIDGE_API_BASE.
  • Authentication: your key in the X-API-Key header on every request — see Authentication.
  • Errors: every error body is an ErrorOut. Any endpoint can also answer 429 when your account is over its rate limit, and 500 if something fails on our side — see Errors.
  • The contract: this page is generated from our OpenAPI document. Download it to generate a client or import it into your API tool — it is the same file, so the two cannot disagree.
  • Money: amounts are MoneyOut objects whose amount_minor is a string of digits in the currency's smallest unit.

Endpoints

GET /v1/partner/agreement

Have we signed the current API agreement?. Scope: read.

Whether this account has signed the version of the API agreement currently in force.

Live API keys are issued only to an account that has signed it. If we publish an amendment, signed returns to false until it is signed again and no further live keys are issued until then; keys already issued keep working.

Signing happens in the dashboard, by a person. This endpoint exists so your own systems can check the state without one — for example before a deploy that expects to rotate a key.

The agreement text is not returned here. Read it in the dashboard.

Responses
StatusBodyWhen
200PartnerAgreementStatusOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

200 — example
{
  "signed": true,
  "current_version": "2026-11-v3",
  "signed_at": "2026-11-06T09:14:02Z"
}

GET /v1/partner/balance

This partner's prepaid balance. Scope: read.

Your prepaid balance, and the floor below which we stop accepting your traffic rather than extending credit.

Amounts are strings of minor units — kobo for NGN — because a JSON number cannot carry them safely past 2^53. Parse into an integer type that does not lose precision, and format for display only at the edge of your own interface.

held is the part of balance that is recently added money still inside its clearing window. It is included in balance, and it can still pay for a reversible product; what it cannot yet do is fund a payout or another irreversible one. next_clears_at is the earliest time any of it clears — funds arrive in tranches with their own windows, so some may remain held after that moment. held is zero and next_clears_at is null when nothing is clearing.

Parameters
NameInTypeRequired
currencyquerystring — default "NGN"No
Responses
StatusBodyWhen
200PartnerBalanceOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

200 — example
{
  "partner": "your-platform",
  "balance": { "amount_minor": "5000000", "currency": "NGN" },
  "min_balance": { "amount_minor": "0", "currency": "NGN" },
  "held": { "amount_minor": "0", "currency": "NGN" },
  "next_clears_at": null
}

GET /v1/partner/catalogue/{product}

Who sells this product. Scope: read.

The billers we can buy this product from — the networks, discos or TV providers available for data, electricity or cable.

Take code from this list and send it back unchanged. It is opaque: treat it as a string, do not parse it, and do not hardcode a value you saw once. We may change what a code refers to behind the scenes, and a stored code can go stale without any visible error until it does.

An empty list means nothing is available for that product right now, not that the product does not exist.

Parameters
NameInTypeRequired
productpathstringYes
Responses
StatusBodyWhen
200array of PartnerBillerOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

GET /v1/partner/catalogue/{product}/{biller_code}

What that biller sells. Scope: read.

The packages a biller offers — a data bundle, a cable TV plan.

amount_minor is null when the biller prices it at purchase time. A prepaid electricity meter has no fixed price, and showing one would be a lie; send the amount you want instead.

requires_validation means the customer identifier has to be checked before you can buy — a meter number belongs to a named person, and buying against a wrong one sends money somewhere unrecoverable.

Codes here are opaque in the same way as a biller code.

Parameters
NameInTypeRequired
productpathstringYes
biller_codepathstringYes
Responses
StatusBodyWhen
200array of PartnerPackageOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

GET /v1/partner/deliveries

Webhook deliveries queued for this partner. Scope: read.

The webhook deliveries queued for you, newest first, with the number of attempts and the last status code we saw.

We are not delivering webhooks yet, so every delivery here is queued and none has been attempted. Once we are, this list is where you check whether one arrived.

Parameters
NameInTypeRequired
limitqueryinteger — min 1, max 200, default 50No
Responses
StatusBodyWhen
200array of WebhookDeliveryOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

POST /v1/partner/deliveries/{delivery_id}/replay

Re-send a failed delivery. Scope: read.

Queue a delivery to be sent to you again.

We are not delivering webhooks yet. This records your request; nothing leaves our side until delivery is switched on, and we will tell you before it is.

Deliveries are at-least-once, so your handler must already tolerate seeing the same event twice — deduplicate on the event id header. Replaying is for a delivery your endpoint never successfully received.

Parameters
NameInTypeRequired
delivery_idpathstring (uuid)Yes
Responses
StatusBodyWhen
200WebhookReplayOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

404ErrorOut

No such resource, or none belonging to this account.

422ErrorOut

The request body or query string did not validate.

200 — example
{ "delivery_id": "6f1d2c3b-8a4e-4f5d-9b6a-0c1e2d3f4a5b", "status": "pending" }

GET /v1/partner/me

Who this key belongs to, and what it may do. Scope: any valid key.

Returns the partner this API key belongs to, the products it is enabled for, and the scopes the key carries.

Use it to confirm an integration is wired correctly without moving money. A call that fails elsewhere for lack of a product or a scope is diagnosable from this response.

Responses
StatusBodyWhen
200PartnerWhoamiOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

200 — example
{
  "partner": "your-platform",
  "name": "Your Platform Ltd",
  "status": "active",
  "allowed_products": [],
  "scopes": ["read"],
  "rate_limit_per_minute": 60
}

POST /v1/partner/payouts

Send money to a bank account. Scope: payout.

Send amount_minor to a Nigerian bank account, charged to the partner.

Parameters
NameInTypeRequired
Idempotency-KeyheaderstringYes

Request body: PartnerPayoutIn, as JSON.

Responses
StatusBodyWhen
200PartnerPayoutOut

A replay. This Idempotency-Key was already used, and this is the original answer — nothing was sent a second time.

201PartnerPayoutOut

Successful Response

202PartnerPayoutOut

The rail was told and did not answer. The payout is held at pending and we will resolve it.

**Do not retry.** The money may already be in flight. Replaying the same Idempotency-Key returns this same body rather than sending anything new.

400ErrorOut

A required header is missing. Money endpoints require an Idempotency-Key, and it is refused before the body is validated.

401ErrorOut

No credential, or one that is not valid.

402ErrorOut

Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

409ErrorOut

The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — code says which, and retry_after_seconds carries the wait when there is one.

422ErrorOut

The request body or query string did not validate.

429ErrorOut

Too many requests. retry_after_seconds carries the wait; the Retry-After header is not relied upon.

503ErrorOut

We could not reach the rail, or no rail is available for this product right now. Nothing was sent.

GET /v1/partner/payouts/{reference}

How did this payout end?. Scope: payout.

The current state of a payout you sent.

Use this after a 202, and after any pending or indeterminate answer. Replaying your idempotency key returns the ORIGINAL response and will never change; this returns what is true now.

indeterminate means we still do not know whether the money moved. Do not retry and do not refund your user on it — we are asking the rail, and this endpoint is where the answer appears.

Parameters
NameInTypeRequired
referencepathstringYes
Responses
StatusBodyWhen
200PartnerPayoutOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

404ErrorOut

No such resource, or none belonging to this account.

422ErrorOut

The request body or query string did not validate.

GET /v1/partner/payouts/banks

Banks you can send a payout to. Scope: payout.

The institutions a payout can reach, for building a bank picker.

Take code from this list and send it back unchanged in bank_code. It is not always three characters and it is not always numeric, so do not validate or reformat it on your side.

Responses
StatusBodyWhen
200array of PartnerBankOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

POST /v1/partner/payouts/enquiry

Who owns this bank account?. Scope: payout.

Ask who owns a bank account before sending anything to it.

Show the name to whoever is sending the money and have them confirm it. We re-run this check when you send, and use the bank's spelling rather than anything you pass us.

Request body: PartnerEnquiryIn, as JSON.

Responses
StatusBodyWhen
200PartnerEnquiryOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

429ErrorOut

Too many requests. retry_after_seconds carries the wait; the Retry-After header is not relied upon.

GET /v1/partner/purchases/{reference}

How did this purchase end?. Scope: purchase.

The current state of a purchase you made.

Use this after a 202, and after any pending or indeterminate answer. Replaying your Idempotency-Key returns the ORIGINAL response and will never change; this returns what is true now.

indeterminate means we still do not know whether the biller delivered. Do not retry and do not refund your customer on it.

data carries what your customer bought once the purchase has succeeded, including when it succeeded later than our first answer to you. Before that it is empty.

Parameters
NameInTypeRequired
referencepathstringYes
Responses
StatusBodyWhen
200PartnerPurchaseOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

404ErrorOut

No such resource, or none belonging to this account.

422ErrorOut

The request body or query string did not validate.

POST /v1/partner/purchases/airtime

Buy airtime. Scope: purchase.

Top up a phone, charged to your prepaid balance.

Requires an Idempotency-Key header. Retrying with the same key returns the original answer rather than buying a second time.

data carries what your customer bought, such as a meter token or a PIN reference. It is empty until the purchase succeeds, and it is the only place we return it, so store it when you receive it.

A 202 means the biller was told and did not answer. Do not retry it and do not refund your customer: it may already have been delivered, and the state will resolve.

Send the phone number as customer_reference. Airtime needs no codes.

Parameters
NameInTypeRequired
Idempotency-KeyheaderstringYes

Request body: PartnerPurchaseIn, as JSON.

Responses
StatusBodyWhen
200PartnerPurchaseOut

A replay. This Idempotency-Key was already used, and this is the original answer — nothing was bought a second time.

201PartnerPurchaseOut

Successful Response

202PartnerPurchaseOut

The rail was told and did not answer. The purchase is held at pending and we will resolve it.

**Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same Idempotency-Key returns this same body rather than buying anything new.

400ErrorOut

A required header is missing. Money endpoints require an Idempotency-Key, and it is refused before the body is validated.

401ErrorOut

No credential, or one that is not valid.

402ErrorOut

Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

409ErrorOut

The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — code says which, and retry_after_seconds carries the wait when there is one.

422ErrorOut

The request body or query string did not validate.

429ErrorOut

Too many requests. retry_after_seconds carries the wait; the Retry-After header is not relied upon.

503ErrorOut

We could not reach the rail, or no rail is available for this product right now. Nothing was sent.

POST /v1/partner/purchases/cable

Pay a cable TV subscription. Scope: purchase.

Renew a cable TV subscription, charged to your prepaid balance.

Requires an Idempotency-Key header. Retrying with the same key returns the original answer rather than buying a second time.

data carries what your customer bought, such as a meter token or a PIN reference. It is empty until the purchase succeeds, and it is the only place we return it, so store it when you receive it.

A 202 means the biller was told and did not answer. Do not retry it and do not refund your customer: it may already have been delivered, and the state will resolve.

Send the smartcard or decoder number as customer_reference, and take biller_code and package_code from the catalogue and send them back unchanged.

Parameters
NameInTypeRequired
Idempotency-KeyheaderstringYes

Request body: PartnerPurchaseIn, as JSON.

Responses
StatusBodyWhen
200PartnerPurchaseOut

A replay. This Idempotency-Key was already used, and this is the original answer — nothing was bought a second time.

201PartnerPurchaseOut

Successful Response

202PartnerPurchaseOut

The rail was told and did not answer. The purchase is held at pending and we will resolve it.

**Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same Idempotency-Key returns this same body rather than buying anything new.

400ErrorOut

A required header is missing. Money endpoints require an Idempotency-Key, and it is refused before the body is validated.

401ErrorOut

No credential, or one that is not valid.

402ErrorOut

Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

409ErrorOut

The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — code says which, and retry_after_seconds carries the wait when there is one.

422ErrorOut

The request body or query string did not validate.

429ErrorOut

Too many requests. retry_after_seconds carries the wait; the Retry-After header is not relied upon.

503ErrorOut

We could not reach the rail, or no rail is available for this product right now. Nothing was sent.

POST /v1/partner/purchases/data

Buy a data bundle. Scope: purchase.

Buy a data bundle for a phone, charged to your prepaid balance.

Requires an Idempotency-Key header. Retrying with the same key returns the original answer rather than buying a second time.

data carries what your customer bought, such as a meter token or a PIN reference. It is empty until the purchase succeeds, and it is the only place we return it, so store it when you receive it.

A 202 means the biller was told and did not answer. Do not retry it and do not refund your customer: it may already have been delivered, and the state will resolve.

Send the phone number as customer_reference, and take biller_code and package_code from the catalogue and send them back unchanged.

Parameters
NameInTypeRequired
Idempotency-KeyheaderstringYes

Request body: PartnerPurchaseIn, as JSON.

Responses
StatusBodyWhen
200PartnerPurchaseOut

A replay. This Idempotency-Key was already used, and this is the original answer — nothing was bought a second time.

201PartnerPurchaseOut

Successful Response

202PartnerPurchaseOut

The rail was told and did not answer. The purchase is held at pending and we will resolve it.

**Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same Idempotency-Key returns this same body rather than buying anything new.

400ErrorOut

A required header is missing. Money endpoints require an Idempotency-Key, and it is refused before the body is validated.

401ErrorOut

No credential, or one that is not valid.

402ErrorOut

Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

409ErrorOut

The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — code says which, and retry_after_seconds carries the wait when there is one.

422ErrorOut

The request body or query string did not validate.

429ErrorOut

Too many requests. retry_after_seconds carries the wait; the Retry-After header is not relied upon.

503ErrorOut

We could not reach the rail, or no rail is available for this product right now. Nothing was sent.

POST /v1/partner/purchases/electricity

Pay an electricity bill. Scope: purchase.

Buy electricity for a meter, charged to your prepaid balance.

Requires an Idempotency-Key header. Retrying with the same key returns the original answer rather than buying a second time.

data carries what your customer bought, such as a meter token or a PIN reference. It is empty until the purchase succeeds, and it is the only place we return it, so store it when you receive it.

A 202 means the biller was told and did not answer. Do not retry it and do not refund your customer: it may already have been delivered, and the state will resolve.

Send the meter number as customer_reference, and take biller_code and package_code from the catalogue and send them back unchanged. The meter token comes back in data.

Parameters
NameInTypeRequired
Idempotency-KeyheaderstringYes

Request body: PartnerPurchaseIn, as JSON.

Responses
StatusBodyWhen
200PartnerPurchaseOut

A replay. This Idempotency-Key was already used, and this is the original answer — nothing was bought a second time.

201PartnerPurchaseOut

Successful Response

202PartnerPurchaseOut

The rail was told and did not answer. The purchase is held at pending and we will resolve it.

**Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same Idempotency-Key returns this same body rather than buying anything new.

400ErrorOut

A required header is missing. Money endpoints require an Idempotency-Key, and it is refused before the body is validated.

401ErrorOut

No credential, or one that is not valid.

402ErrorOut

Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

409ErrorOut

The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — code says which, and retry_after_seconds carries the wait when there is one.

422ErrorOut

The request body or query string did not validate.

429ErrorOut

Too many requests. retry_after_seconds carries the wait; the Retry-After header is not relied upon.

503ErrorOut

We could not reach the rail, or no rail is available for this product right now. Nothing was sent.

POST /v1/partner/purchases/exam_pin

Buy an exam PIN. Scope: purchase.

Buy an examination PIN, charged to your prepaid balance.

Requires an Idempotency-Key header. Retrying with the same key returns the original answer rather than buying a second time.

data carries what your customer bought, such as a meter token or a PIN reference. It is empty until the purchase succeeds, and it is the only place we return it, so store it when you receive it.

A 202 means the biller was told and did not answer. Do not retry it and do not refund your customer: it may already have been delivered, and the state will resolve.

Take biller_code from the catalogue. The PIN comes back in data and is returned once.

Parameters
NameInTypeRequired
Idempotency-KeyheaderstringYes

Request body: PartnerPurchaseIn, as JSON.

Responses
StatusBodyWhen
200PartnerPurchaseOut

A replay. This Idempotency-Key was already used, and this is the original answer — nothing was bought a second time.

201PartnerPurchaseOut

Successful Response

202PartnerPurchaseOut

The rail was told and did not answer. The purchase is held at pending and we will resolve it.

**Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same Idempotency-Key returns this same body rather than buying anything new.

400ErrorOut

A required header is missing. Money endpoints require an Idempotency-Key, and it is refused before the body is validated.

401ErrorOut

No credential, or one that is not valid.

402ErrorOut

Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

409ErrorOut

The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — code says which, and retry_after_seconds carries the wait when there is one.

422ErrorOut

The request body or query string did not validate.

429ErrorOut

Too many requests. retry_after_seconds carries the wait; the Retry-After header is not relied upon.

503ErrorOut

We could not reach the rail, or no rail is available for this product right now. Nothing was sent.

GET /v1/partner/transactions

Your money movements. Scope: read.

Every money movement on your account, newest first: purchases and payouts, what each cost you, and the state it is in now.

Filter by state, by product, or by your_reference — the reference you sent when you created the transaction.

your_reference is the one to reach for after a request of yours timed out. If you never saw our response you will not have our reference, but you will still have yours, and this is how you find out whether the transaction exists.

This is a read. It never returns what a purchase delivered, so no meter token or PIN appears here.

Parameters
NameInTypeRequired
limitqueryinteger — min 1, max 200, default 50No
statequerystring | null — at most 16 charactersNo
productquerystring | null — at most 32 charactersNo
your_referencequerystring | null — at most 128 charactersNo
Responses
StatusBodyWhen
200array of PartnerTransactionOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

GET /v1/partner/webhook-signing

How to verify the webhooks we send. Scope: read.

How to verify the webhooks, once we send them: the algorithm, the exact material that is signed, the header names, and the replay window in seconds.

Served from the same constants the sender will use, so this response cannot drift from what we will sign. Build against it now; we are not delivering webhooks yet and will tell you before we start.

Responses
StatusBodyWhen
200WebhookSigningOut

Successful Response

401ErrorOut

No credential, or one that is not valid.

403ErrorOut

Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active.

422ErrorOut

The request body or query string did not validate.

200 — example
{
  "algorithm": "HMAC-SHA256",
  "signed_material": "{timestamp}.{raw_request_body}",
  "signature_header": "X-VertexBridge-Signature",
  "timestamp_header": "X-VertexBridge-Timestamp",
  "event_id_header": "X-VertexBridge-Event-Id",
  "replay_window_seconds": 300,
  "notes": [
    "Compare signatures in constant time.",
    "Reject a delivery whose timestamp is outside the replay window.",
    "Deduplicate on the event id header — we retry, so you will see the same event more than once.",
    "Verify against the RAW body bytes; re-serialising JSON changes them."
  ]
}

Schemas

Every object the endpoints above return.

ErrorOut

FieldTypeAlways present
codestringYes
correlation_idstringYes
detailsobjectNo
messagestringYes
retry_after_secondsinteger | nullNo

MoneyOut

FieldTypeAlways present
amount_minorstringYes
currencystring — exactly 3 charactersYes

PartnerAgreementStatusOut

FieldTypeAlways present
current_versionstring | nullNo
signedbooleanYes
signed_atstring (date-time) | nullNo

PartnerBalanceOut

FieldTypeAlways present
balanceMoneyOutYes
heldMoneyOutYes
min_balanceMoneyOutYes
next_clears_atstring (date-time) | nullYes
partnerstringYes

PartnerBankOut

FieldTypeAlways present
codestringYes
namestringYes

PartnerBillerOut

FieldTypeAlways present
codestringYes
namestringYes

PartnerEnquiryIn

FieldTypeAlways present
account_numberstring — exactly 10 digits, exactly 10 charactersYes
bank_codestring — at least 3 characters, at most 6 charactersYes

PartnerEnquiryOut

FieldTypeAlways present
account_namestring | nullYes
messagestring | nullYes

PartnerPackageOut

FieldTypeAlways present
amountMoneyOut | nullNo
codestringYes
namestringYes
requires_validationbooleanYes

PartnerPayoutIn

FieldTypeAlways present
account_numberstring — exactly 10 digits, exactly 10 charactersYes
amount_minorinteger — greater than 0Yes
bank_codestring — at least 3 characters, at most 6 charactersYes
your_referencestring | null — at most 128 charactersNo

PartnerPayoutOut

FieldTypeAlways present
account_namestring | nullNo
amountMoneyOut | nullNo
chargedMoneyOut | nullNo
feeMoneyOut | nullNo
referencestringYes
state"succeeded" | "pending" | "indeterminate" | "failed"Yes
your_referencestring | nullNo

PartnerPurchaseIn

FieldTypeAlways present
amount_minorinteger — greater than 0Yes
biller_codestring | null — at most 64 charactersNo
customer_referencestring — at least 3 characters, at most 64 charactersYes
package_codestring | null — at most 64 charactersNo
subject_idstring (uuid) | nullNo
your_referencestring | null — at most 128 charactersNo

PartnerPurchaseOut

FieldTypeAlways present
amountMoneyOut | nullNo
chargedMoneyOut | nullNo
dataobject | nullNo
feeMoneyOut | nullNo
productstringYes
referencestringYes
statestringYes
your_referencestring | nullNo

PartnerTransactionOut

FieldTypeAlways present
chargedMoneyOut | nullNo
created_atstring (date-time)Yes
idempotency_keystring | nullNo
productstringYes
referencestringYes
statestringYes
your_referencestring | nullNo

PartnerWhoamiOut

FieldTypeAlways present
allowed_productsarray of stringYes
namestringYes
partnerstringYes
rate_limit_per_minuteintegerYes
scopesarray of stringYes
status"pending" | "active" | "suspended" | "closed"Yes

WebhookDeliveryOut

FieldTypeAlways present
attemptsintegerYes
created_atstring (date-time)Yes
delivered_atstring (date-time) | nullYes
event_idstring (uuid)Yes
event_typestringYes
idstring (uuid)Yes
last_status_codeinteger | nullYes
status"pending" | "delivered" | "failed" | "abandoned"Yes

WebhookReplayOut

FieldTypeAlways present
delivery_idstring (uuid)Yes
status"pending"Yes

WebhookSigningOut

FieldTypeAlways present
algorithmstringYes
event_id_headerstringYes
notesarray of stringYes
replay_window_secondsintegerYes
signature_headerstringYes
signed_materialstringYes
timestamp_headerstringYes