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.iofor live keys (not serving yet),https://sandbox.vertexbridge.iofor test keys (not serving yet). Every path starts/v1. The examples read the base URL fromVERTEXBRIDGE_API_BASE. - Authentication: your key in the
X-API-Keyheader on every request — see Authentication. - Errors: every error body is an
ErrorOut. Any endpoint can also answer429when your account is over its rate limit, and500if 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
MoneyOutobjects whoseamount_minoris 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.
| Status | Body | When |
|---|---|---|
| 200 | PartnerAgreementStatusOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | The request body or query string did not validate. |
{
"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.
| Name | In | Type | Required |
|---|---|---|---|
currency | query | string — default "NGN" | No |
| Status | Body | When |
|---|---|---|
| 200 | PartnerBalanceOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | The request body or query string did not validate. |
{
"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.
| Name | In | Type | Required |
|---|---|---|---|
product | path | string | Yes |
| Status | Body | When |
|---|---|---|
| 200 | array of PartnerBillerOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
product | path | string | Yes |
biller_code | path | string | Yes |
| Status | Body | When |
|---|---|---|
| 200 | array of PartnerPackageOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
limit | query | integer — min 1, max 200, default 50 | No |
| Status | Body | When |
|---|---|---|
| 200 | array of WebhookDeliveryOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
delivery_id | path | string (uuid) | Yes |
| Status | Body | When |
|---|---|---|
| 200 | WebhookReplayOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 404 | ErrorOut | No such resource, or none belonging to this account. |
| 422 | ErrorOut | The request body or query string did not validate. |
{ "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.
| Status | Body | When |
|---|---|---|
| 200 | PartnerWhoamiOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | The request body or query string did not validate. |
{
"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.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | Yes |
Request body: PartnerPayoutIn, as JSON.
| Status | Body | When |
|---|---|---|
| 200 | PartnerPayoutOut | A replay. This |
| 201 | PartnerPayoutOut | Successful Response |
| 202 | PartnerPayoutOut | The rail was told and did not answer. The payout is held at **Do not retry.** The money may already be in flight. Replaying the same |
| 400 | ErrorOut | A required header is missing. Money endpoints require an |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 402 | ErrorOut | Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 409 | ErrorOut | The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — |
| 422 | ErrorOut | The request body or query string did not validate. |
| 429 | ErrorOut | Too many requests. |
| 503 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
reference | path | string | Yes |
| Status | Body | When |
|---|---|---|
| 200 | PartnerPayoutOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 404 | ErrorOut | No such resource, or none belonging to this account. |
| 422 | ErrorOut | 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.
| Status | Body | When |
|---|---|---|
| 200 | array of PartnerBankOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | 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.
| Status | Body | When |
|---|---|---|
| 200 | PartnerEnquiryOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | The request body or query string did not validate. |
| 429 | ErrorOut | Too many requests. |
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.
| Name | In | Type | Required |
|---|---|---|---|
reference | path | string | Yes |
| Status | Body | When |
|---|---|---|
| 200 | PartnerPurchaseOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 404 | ErrorOut | No such resource, or none belonging to this account. |
| 422 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | Yes |
Request body: PartnerPurchaseIn, as JSON.
| Status | Body | When |
|---|---|---|
| 200 | PartnerPurchaseOut | A replay. This |
| 201 | PartnerPurchaseOut | Successful Response |
| 202 | PartnerPurchaseOut | The rail was told and did not answer. The purchase is held at **Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same |
| 400 | ErrorOut | A required header is missing. Money endpoints require an |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 402 | ErrorOut | Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 409 | ErrorOut | The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — |
| 422 | ErrorOut | The request body or query string did not validate. |
| 429 | ErrorOut | Too many requests. |
| 503 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | Yes |
Request body: PartnerPurchaseIn, as JSON.
| Status | Body | When |
|---|---|---|
| 200 | PartnerPurchaseOut | A replay. This |
| 201 | PartnerPurchaseOut | Successful Response |
| 202 | PartnerPurchaseOut | The rail was told and did not answer. The purchase is held at **Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same |
| 400 | ErrorOut | A required header is missing. Money endpoints require an |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 402 | ErrorOut | Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 409 | ErrorOut | The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — |
| 422 | ErrorOut | The request body or query string did not validate. |
| 429 | ErrorOut | Too many requests. |
| 503 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | Yes |
Request body: PartnerPurchaseIn, as JSON.
| Status | Body | When |
|---|---|---|
| 200 | PartnerPurchaseOut | A replay. This |
| 201 | PartnerPurchaseOut | Successful Response |
| 202 | PartnerPurchaseOut | The rail was told and did not answer. The purchase is held at **Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same |
| 400 | ErrorOut | A required header is missing. Money endpoints require an |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 402 | ErrorOut | Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 409 | ErrorOut | The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — |
| 422 | ErrorOut | The request body or query string did not validate. |
| 429 | ErrorOut | Too many requests. |
| 503 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | Yes |
Request body: PartnerPurchaseIn, as JSON.
| Status | Body | When |
|---|---|---|
| 200 | PartnerPurchaseOut | A replay. This |
| 201 | PartnerPurchaseOut | Successful Response |
| 202 | PartnerPurchaseOut | The rail was told and did not answer. The purchase is held at **Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same |
| 400 | ErrorOut | A required header is missing. Money endpoints require an |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 402 | ErrorOut | Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 409 | ErrorOut | The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — |
| 422 | ErrorOut | The request body or query string did not validate. |
| 429 | ErrorOut | Too many requests. |
| 503 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | Yes |
Request body: PartnerPurchaseIn, as JSON.
| Status | Body | When |
|---|---|---|
| 200 | PartnerPurchaseOut | A replay. This |
| 201 | PartnerPurchaseOut | Successful Response |
| 202 | PartnerPurchaseOut | The rail was told and did not answer. The purchase is held at **Do not retry and do not refund your customer.** The biller may already have delivered. Replaying the same |
| 400 | ErrorOut | A required header is missing. Money endpoints require an |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 402 | ErrorOut | Your prepaid balance is too low for this request, including our fee. Top up and retry with a NEW idempotency key. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 409 | ErrorOut | The request conflicts with the current state. Either the same idempotency key is still in flight, or your balance has not cleared yet — |
| 422 | ErrorOut | The request body or query string did not validate. |
| 429 | ErrorOut | Too many requests. |
| 503 | ErrorOut | 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.
| Name | In | Type | Required |
|---|---|---|---|
limit | query | integer — min 1, max 200, default 50 | No |
state | query | string | null — at most 16 characters | No |
product | query | string | null — at most 32 characters | No |
your_reference | query | string | null — at most 128 characters | No |
| Status | Body | When |
|---|---|---|
| 200 | array of PartnerTransactionOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | 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.
| Status | Body | When |
|---|---|---|
| 200 | WebhookSigningOut | Successful Response |
| 401 | ErrorOut | No credential, or one that is not valid. |
| 403 | ErrorOut | Authenticated, but not permitted — a missing scope, a product that is not enabled for this account, or an account that is not active. |
| 422 | ErrorOut | The request body or query string did not validate. |
{
"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
| Field | Type | Always present |
|---|---|---|
code | string | Yes |
correlation_id | string | Yes |
details | object | No |
message | string | Yes |
retry_after_seconds | integer | null | No |
MoneyOut
| Field | Type | Always present |
|---|---|---|
amount_minor | string | Yes |
currency | string — exactly 3 characters | Yes |
PartnerAgreementStatusOut
| Field | Type | Always present |
|---|---|---|
current_version | string | null | No |
signed | boolean | Yes |
signed_at | string (date-time) | null | No |
PartnerBalanceOut
PartnerBankOut
| Field | Type | Always present |
|---|---|---|
code | string | Yes |
name | string | Yes |
PartnerBillerOut
| Field | Type | Always present |
|---|---|---|
code | string | Yes |
name | string | Yes |
PartnerEnquiryIn
| Field | Type | Always present |
|---|---|---|
account_number | string — exactly 10 digits, exactly 10 characters | Yes |
bank_code | string — at least 3 characters, at most 6 characters | Yes |
PartnerEnquiryOut
| Field | Type | Always present |
|---|---|---|
account_name | string | null | Yes |
message | string | null | Yes |
PartnerPackageOut
| Field | Type | Always present |
|---|---|---|
amount | MoneyOut | null | No |
code | string | Yes |
name | string | Yes |
requires_validation | boolean | Yes |
PartnerPayoutIn
| Field | Type | Always present |
|---|---|---|
account_number | string — exactly 10 digits, exactly 10 characters | Yes |
amount_minor | integer — greater than 0 | Yes |
bank_code | string — at least 3 characters, at most 6 characters | Yes |
your_reference | string | null — at most 128 characters | No |
PartnerPayoutOut
| Field | Type | Always present |
|---|---|---|
account_name | string | null | No |
amount | MoneyOut | null | No |
charged | MoneyOut | null | No |
fee | MoneyOut | null | No |
reference | string | Yes |
state | "succeeded" | "pending" | "indeterminate" | "failed" | Yes |
your_reference | string | null | No |
PartnerPurchaseIn
| Field | Type | Always present |
|---|---|---|
amount_minor | integer — greater than 0 | Yes |
biller_code | string | null — at most 64 characters | No |
customer_reference | string — at least 3 characters, at most 64 characters | Yes |
package_code | string | null — at most 64 characters | No |
subject_id | string (uuid) | null | No |
your_reference | string | null — at most 128 characters | No |
PartnerPurchaseOut
| Field | Type | Always present |
|---|---|---|
amount | MoneyOut | null | No |
charged | MoneyOut | null | No |
data | object | null | No |
fee | MoneyOut | null | No |
product | string | Yes |
reference | string | Yes |
state | string | Yes |
your_reference | string | null | No |
PartnerTransactionOut
| Field | Type | Always present |
|---|---|---|
charged | MoneyOut | null | No |
created_at | string (date-time) | Yes |
idempotency_key | string | null | No |
product | string | Yes |
reference | string | Yes |
state | string | Yes |
your_reference | string | null | No |
PartnerWhoamiOut
| Field | Type | Always present |
|---|---|---|
allowed_products | array of string | Yes |
name | string | Yes |
partner | string | Yes |
rate_limit_per_minute | integer | Yes |
scopes | array of string | Yes |
status | "pending" | "active" | "suspended" | "closed" | Yes |
WebhookDeliveryOut
| Field | Type | Always present |
|---|---|---|
attempts | integer | Yes |
created_at | string (date-time) | Yes |
delivered_at | string (date-time) | null | Yes |
event_id | string (uuid) | Yes |
event_type | string | Yes |
id | string (uuid) | Yes |
last_status_code | integer | null | Yes |
status | "pending" | "delivered" | "failed" | "abandoned" | Yes |
WebhookReplayOut
| Field | Type | Always present |
|---|---|---|
delivery_id | string (uuid) | Yes |
status | "pending" | Yes |
WebhookSigningOut
| Field | Type | Always present |
|---|---|---|
algorithm | string | Yes |
event_id_header | string | Yes |
notes | array of string | Yes |
replay_window_seconds | integer | Yes |
signature_header | string | Yes |
signed_material | string | Yes |
timestamp_header | string | Yes |