The Gemba Open Banking API allows secure and easy integration with banking services. It provides endpoints for managing accounts, payments, messaging, and webhooks. This API supports operations like account retrieval, transaction processing, and sending messages securely.
All requests to the Gemba Open Banking API require an Authorization header containing a valid bearer access token. Example:
Authorization: Bearer ${access_token}
The access token is valid for 10 minutes. Once expired, a new token must be generated to continue using the API.
This endpoint allows clients to request an access token.
Pass the x-api-key header with a valid API key.
| x-api-key required | string Example: gm_prod_PAB2scRXgll7tS6lW7BzLRHqchlj8N35 A valid API key self-issued via the API Keys page |
| access_token | string The access token to be used for authenticated requests. |
| expires_in | integer The number of seconds until the token expires. |
| token_type | string The type of token issued, typically "Bearer" for OAuth 2.0. |
{- "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
- "expires_in": 3600,
- "token_type": "Bearer"
}The Gemba MCP server exposes this API to MCP-compatible AI clients over streamable HTTP.
| Environment | Endpoint |
|---|---|
| Production | https://api.ge.mba/mcp |
| Sandbox | https://sandbox.api.ge.mba/mcp |
The examples below use production. For sandbox, swap the host in both the endpoint and the token request, and use a sandbox API key.
Authentication is the same bearer access token used for REST calls — see Authentication. The token is short-lived, so a client configured with one has to be given a fresh token once it expires; there is no long-lived MCP credential yet.
For the CLI, desktop app, or VS Code extension, configure .mcp.json in the project
root, or ~/.claude.json for user scope:
{
"mcpServers": {
"gemba": {
"type": "http",
"url": "https://api.ge.mba/mcp",
"headers": {
"Authorization": "Bearer ${GEMBA_MCP_TOKEN}"
}
}
}
}
"type": "http" pins streamable HTTP and prevents SSE/OAuth negotiation. A present
Authorization header prevents 401-triggered OAuth discovery. Use ${VAR} expansion
here — ${env:VAR} is VS Code mcp.json syntax, which Claude Code passes through
literally.
The server can be registered from the command line instead:
GEMBA_MCP_TOKEN=$(curl -fsS -X POST https://api.ge.mba/0.1/auth/access-token \
-H "x-api-key: gm_prod_xxx" | jq -er .access_token) &&
claude mcp add --transport http gemba https://api.ge.mba/mcp \
--header "Authorization: Bearer $GEMBA_MCP_TOKEN"
claude_desktop_config.json launches stdio servers only, so a remote HTTP server is
reached through mcp-remote:
{
"mcpServers": {
"gemba": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.ge.mba/mcp",
"--transport",
"http-only",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer eyJhbGciOiJSUzI1NiIs..."
}
}
}
}
Do not put a space after Authorization:. mcp-remote splits --header on the first
space, so the token value is supplied through the environment variable instead.
--transport http-only prevents fallback to SSE.
Returns the banking clients linked to the authenticated user.
Use these endpoints when a user can belong to more than one client (for example a person with access to several companies). Call GET /clients to list those clients, then use a returned clientId on subsequent account, payment, and FX requests.
This is not an API for creating or managing white-label / partner clients.
Returns the banking clients the authenticated user belongs to.
A single user may be linked to multiple clients (for example several companies). Use this
endpoint to discover those clients and pick the correct clientId for later calls
(accounts, transfers, FX, and so on).
This endpoint does not create, update, or manage white-label / partner clients.
| id required | string <uuid> |
| name required | string [ 1 .. 255 ] characters Client name |
| isActive required | boolean |
| createdAt required | string <date-time> Timestamp of opening |
| updatedAt required | string <date-time> Last update timestamp |
| deletedAt | string <date-time> |
[- {
- "id": "123f4567-d89b-12d3-a456-436614174000",
- "name": "Sample Client",
- "isActive": true,
- "createdAt": "2022-01-01T00:00:00Z",
- "updatedAt": "2023-01-01T00:00:00Z",
- "deletedAt": null
}
]Returns details for one banking client linked to the authenticated user.
Use a clientId from GET /clients. This is not for managing white-label / partner clients.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| id required | string <uuid> |
| name required | string [ 1 .. 255 ] characters Client name |
| isActive required | boolean |
| createdAt required | string <date-time> Timestamp of opening |
| updatedAt required | string <date-time> Last update timestamp |
| deletedAt | string <date-time> |
{- "id": "550e8400-e29b-41d4-a716-446655440000",
- "name": "Sample Client",
- "isActive": true,
- "createdAt": "2022-01-01T10:00:00Z",
- "updatedAt": "2023-06-15T14:30:00Z",
- "deletedAt": null
}Endpoints related to managing user accounts, such as retrieving account details, balances, and performing account-based operations.
This endpoint retrieves a list of user accounts. It returns an array of account objects, each containing details such as account ID, client ID, name, status, associated IBANs, and available currencies.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| id required | string <uuid> |
| clientId required | string <uuid> |
| name required | string [ 1 .. 255 ] characters Account name |
| isActive required | boolean |
| status required | string (AccountStatusEnum) Enum: "active" "blockedCredit" "blockedDebit" "blockedAll" |
| endDate | string <date-time> Planned date of closure |
| createdAt required | string <date-time> Timestamp of opening |
| updatedAt | string <date-time> Last update timestamp |
| closedAt | string <date-time> Date of closure |
| deletedAt | string <date-time> |
required | Array of objects (IBANResponse) Account numbers |
required | Array of objects (CurrencyResponse) Available currencies |
[- {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "clientId": "123e4567-e89b-12d3-a456-426614174000",
- "name": "Sample Account",
- "isActive": true,
- "status": "active",
- "endDate": "2025-12-31T00:00:00Z",
- "createdAt": "2022-01-01T00:00:00Z",
- "updatedAt": "2023-01-01T00:00:00Z",
- "closedAt": null,
- "deletedAt": null,
- "numbers": [
- {
- "sortCode": "123456",
- "accountNumber": "12345678",
- "IBAN": "GB29NWBK60161331926819"
}, - {
- "sortCode": "654321",
- "accountNumber": "87654321",
- "IBAN": "GB29NWBK60161331926820"
}
], - "currencies": [
- {
- "name": "United States Dollar",
- "code": "USD"
}, - {
- "name": "Euro",
- "code": "EUR"
}
]
}
]Retrieves detailed information for a specific account. This endpoint returns a single account object containing comprehensive data such as account ID, client ID, name, status, associated IBANs, and available currencies.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the account to retrieve |
| id required | string <uuid> |
| clientId required | string <uuid> |
| name required | string [ 1 .. 255 ] characters Account name |
| isActive required | boolean |
| status required | string (AccountStatusEnum) Enum: "active" "blockedCredit" "blockedDebit" "blockedAll" |
| endDate | string <date-time> Planned date of closure |
| createdAt required | string <date-time> Timestamp of opening |
| updatedAt | string <date-time> Last update timestamp |
| closedAt | string <date-time> Date of closure |
| deletedAt | string <date-time> |
required | Array of objects (IBANResponse) Account numbers |
required | Array of objects (CurrencyResponse) Available currencies |
{- "id": "123e4567-e89b-12d3-a456-426614174000",
- "clientId": "98765432-e89b-12d3-a456-426614174000",
- "name": "Premium Savings Account",
- "isActive": true,
- "status": "active",
- "endDate": "2025-12-31T23:59:59Z",
- "createdAt": "2022-01-01T10:00:00Z",
- "updatedAt": "2023-06-15T14:30:00Z",
- "closedAt": null,
- "deletedAt": null,
- "numbers": [
- {
- "sortCode": "123456",
- "accountNumber": "12345678",
- "IBAN": "GB29NWBK60161331926819"
}
], - "currencies": [
- {
- "name": "British Pound Sterling",
- "code": "GBP"
}
]
}This endpoint retrieves an account statement for a specific account, providing transaction history and balance information for a given time period. The response can be filtered by date range and currency.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> The unique identifier for the account. This is a GUID that represents the account for which the statement is being requested. |
| from | string <date> The start date for the statement period (inclusive). Only transactions from this date onward will be included in the statement. Format: YYYY-MM-DD. |
| to | string <date> The end date for the statement period (inclusive). Only transactions up to this date will be included in the statement. Format: YYYY-MM-DD. |
| currencyCode | string The currency code (ISO 4217) to filter the statement by a specific currency. Example: USD, EUR, GBP. If not provided, the default currency of the account will be used. |
required | object (BalanceResponse) |
required | Array of objects (StatementRecord) |
{- "balance": {
- "accountId": "123e4567-e89b-12d3-a456-426614174000",
- "currencyCode": "str",
- "issuedAt": "2019-08-24T14:15:22Z",
- "opening": 0,
- "closing": 0,
- "openingDate": "2019-08-24T14:15:22Z",
- "closingDate": "2019-08-24T14:15:22Z"
}, - "records": [
- {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "documentRef": "DOC-2023-09-15-001",
- "transactionRef": "TRANS-20230915-001",
- "date": "2023-09-15T14:30:00Z",
- "type": "SEPA Transfer",
- "amount": 100000,
- "currencyCode": "EUR",
- "details": "Monthly salary payment",
- "recipientBIC": "DEUTDEFFXXX",
- "recipientAccount": "DE89370400440532013000",
- "recipientName": "John Doe",
- "senderBIC": "BOFAUS3NXXX",
- "senderAccount": "US29NWBK60161331926819",
- "senderName": "Alice Smith"
}
]
}This endpoint allows you to retrieve the balance of a specific account. You must specify the account ID and currency code, and optionally, you can provide a date range using the opening and closing date query parameters.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier for the account. This is a GUID that represents the account for which the balance is being requested. |
| currencyCode required | string <= 3 characters Example: USD The 3-letter currency code (ISO 4217) for which the balance is requested. Example: USD, EUR, GBP. |
| openingDate | string <date> Example: openingDate=2023-09-01 The starting date for the balance inquiry. This date marks the opening of the period for which you want to retrieve the account balance. |
| closingDate | string <date> Example: closingDate=2023-09-15 The ending date for the balance inquiry. This date marks the closure of the period for which you want to retrieve the account balance. |
| accountId required | string <uuid> |
| currencyCode required | string <= 3 characters Currency in ISO 4217 alpha-3 format |
| issuedAt required | string <date-time> |
| opening required | integer <int64> Amount specified in minor units of currency |
| closing required | integer <int64> Amount specified in minor units of currency |
| openingDate required | string <date-time> |
| closingDate required | string <date-time> |
{- "accountId": "123e4567-e89b-12d3-a456-426614174000",
- "currency": "USD",
- "balance": 1000000,
- "availableBalance": 950000,
- "pendingTransactions": 50000,
- "reservedBalance": 0,
- "asOf": "2023-09-15T14:30:00Z"
}This tag covers endpoints for processing various types of payments, including internal, international, UK-based transfers, and bulk batches.
Single-transfer resources expose a status field. Terminal outcomes rejected and canceled include reason (enum) and message (string). Status onhold means the payment is temporarily awaiting further processing and does not include reason or message.
Bulk endpoints use different payloads: create returns { bulkPaymentId }, status returns { status, count } (no per-row transfer objects). There is no bulk webhook; child transfers use standard transfer.outgoing.changed events.
This endpoint initiates an internal transfer between accounts. The transfer requires specifying the recipient's account details, the amount, and the currency code.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account from which the internal transfer will be initiated. |
| x-gemba-request-id required | string <uuid> <= 64 characters Request id. Will act as an idempotency key |
| amount required | integer <int64> The amount to be transferred. Must be a positive integer. |
| currencyCode required | string <= 3 characters The 3-letter ISO 4217 currency code for the transfer. Example: USD, EUR, GBP. |
| description | string A brief description or reference for the transfer. This field is optional. |
| recipientName | string The name of the recipient for this transfer. |
| recipientAccountNumber required | string The recipient's account number (IBAN) to which the funds will be transferred. |
| status required | string Enum: "rejected" "canceled" Terminal failure or client cancellation. | ||||||||||||
| reason required | string (TransferFailureReasonEnum) Enum: "insufficient_funds" "wrong_payment_details" "rejected_by_bank" "canceled_by_client" "other" Machine-readable reason when a transfer or incoming payment ends in Present together with
Use | ||||||||||||
| message required | string Human-readable explanation. Safe for partner display. Never includes AML, sanctions, or investigation details. | ||||||||||||
| id required | string <uuid> Unique identifier for the transfer. | ||||||||||||
| accountId required | string <uuid> Unique identifier of the account from which the transfer is made. | ||||||||||||
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., cents for USD). | ||||||||||||
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. | ||||||||||||
| total required | integer <int64> The total amount debited, including the transfer amount and fee. | ||||||||||||
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. | ||||||||||||
| description | string A description or reference for the transfer. | ||||||||||||
| recipientName | string The name of the transfer recipient. | ||||||||||||
| recipientAccountNumber required | string The account number or IBAN of the recipient's account. | ||||||||||||
| createdAt | string <date-time> Timestamp when the transfer was created. |
{- "amount": 100000,
- "currencyCode": "USD",
- "description": "Monthly rent payment",
- "recipientName": "John Doe",
- "recipientAccountNumber": "DE89370400440532013000"
}{- "id": "234e5678-e89b-12d3-a456-426614174000",
- "status": "completed",
- "amount": 100000,
- "fee": 500,
- "total": 100500,
- "currencyCode": "USD",
- "description": "Monthly rent payment",
- "recipientName": "John Doe",
- "recipientAccountNumber": "DE89370400440532013000",
- "createdAt": "2023-09-15T14:30:00Z"
}This endpoint retrieves a list of internal transfers for a specific account. The result can be paginated using offset and limit query parameters.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account from which internal transfers will be fetched. |
| from | string <date> The start date for the period (inclusive). Format: YYYY-MM-DD. |
| to | string <date> The end date for the statement period (inclusive). Format: YYYY-MM-DD. |
| offset | integer Default: 0 The number of records to skip from the beginning of the result set. Default is 0. |
| limit | integer Default: 10 Example: limit=10 The maximum number of records to return. Default is 10. |
| status required | string Enum: "rejected" "canceled" Terminal failure or client cancellation. | ||||||||||||
| reason required | string (TransferFailureReasonEnum) Enum: "insufficient_funds" "wrong_payment_details" "rejected_by_bank" "canceled_by_client" "other" Machine-readable reason when a transfer or incoming payment ends in Present together with
Use | ||||||||||||
| message required | string Human-readable explanation. Safe for partner display. Never includes AML, sanctions, or investigation details. | ||||||||||||
| id required | string <uuid> Unique identifier for the transfer. | ||||||||||||
| accountId required | string <uuid> Unique identifier of the account from which the transfer is made. | ||||||||||||
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., cents for USD). | ||||||||||||
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. | ||||||||||||
| total required | integer <int64> The total amount debited, including the transfer amount and fee. | ||||||||||||
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. | ||||||||||||
| description | string A description or reference for the transfer. | ||||||||||||
| recipientName | string The name of the transfer recipient. | ||||||||||||
| recipientAccountNumber required | string The account number or IBAN of the recipient's account. | ||||||||||||
| createdAt | string <date-time> Timestamp when the transfer was created. |
[- {
- "id": "234e5678-e89b-12d3-a456-426614174000",
- "status": "completed",
- "amount": 100000,
- "currencyCode": "USD",
- "description": "Monthly rent payment",
- "recipientName": "John Doe",
- "recipientAccountNumber": "DE89370400440532013000",
- "createdAt": "2023-09-15T14:30:00Z"
}, - {
- "id": "345e6789-e89b-12d3-a456-426614174000",
- "status": "pending",
- "amount": 50000,
- "currencyCode": "EUR",
- "description": "Invoice payment",
- "recipientName": "Jane Smith",
- "recipientAccountNumber": "FR1420041010050500013M02606",
- "createdAt": "2023-09-15T14:30:00Z"
}
]This endpoint retrieves fees for internal transfers for a specific account.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account from which internal transfers will be fetched. |
| amount required | integer <int64> Example: amount=100000 Amount of the internal transfer |
| currencyCode required | string <= 3 characters Example: currencyCode=USD Currency code of the internal transfer. ISO 4217 3-letter currency code. |
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., cents for USD). |
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. |
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. |
{- "fee": 500,
- "amount": 100000,
- "currencyCode": "USD"
}This endpoint retrieves allowed countries for SEPA transfer country fields.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account for which SEPA transfer countries will be fetched. |
required | Array of objects (SepaTransferCountriesByField) Allowed countries grouped by requested SEPA transfer country field. |
{- "items": [
- {
- "field": "beneficiaryCountry",
- "countries": [
- {
- "code": "DE",
- "name": "Germany"
}
]
}
]
}This endpoint send the OTP for a specific transfer.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account from which transfers will be fetched. |
| transferType required | string Enum: "internal" "international" "uk" Example: international The type of transfer to be confirmed. |
| transferId required | string <uuid> Example: f47ac10b-58cc-4372-a567-0e02b2c3d479 The unique identifier (GUID) for the transfer to be confirmed. |
| x-gemba-request-id required | string <uuid> <= 64 characters Request id. Will act as an idempotency key |
| id required | string <uuid> The unique identifier for the transfer/bulk of transfers confirmation. |
| type required | string Default: "sms" Enum: "sms" "email" The type of transfer confirmation. |
| code | string or null The confirmation code. Sandbox only |
| status required | string Enum: "confirmed" "sent" "expired" The status of the internal transfer confirmation |
| expiresAt required | string <date-time> The timestamp when the transfer was confirmed. |
{- "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "type": "sms",
- "status": "sent",
- "expiresAt": "2024-09-16T14:32:00Z"
}This endpoint initiates an transfer between accounts. The transfer requires specifying the recipient's account details, the amount, and the currency code.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account from which the transfer will be initiated. |
| transferType required | string Enum: "internal" "international" "uk" Example: international The type of transfer to be confirmed. |
| transferId required | string <uuid> Example: f47ac10b-58cc-4372-a567-0e02b2c3d479 The unique identifier (GUID) for the transfer to be confirmed. |
| x-gemba-request-id required | string <uuid> <= 64 characters Request id. Will act as an idempotency key |
| code required | string The OTP to confirm the transfer. |
| id required | string <uuid> The unique identifier for the transfer/bulk of transfers confirmation. |
| type required | string Default: "sms" Enum: "sms" "email" The type of transfer confirmation. |
| code | string or null The confirmation code. Sandbox only |
| status required | string Enum: "confirmed" "sent" "expired" The status of the internal transfer confirmation |
| expiresAt required | string <date-time> The timestamp when the transfer was confirmed. |
{- "code": "123456"
}{- "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "type": "sms",
- "status": "confirmed",
- "expiresAt": "2024-09-16T14:32:00Z"
}This endpoint creates an international transfer. The transfer requires specifying details about the recipient, bank, and intermediary (if applicable), along with the amount and currency code.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> The unique identifier (GUID) for the account from which the international transfer will be initiated. |
| x-gemba-request-id required | string <uuid> <= 64 characters Request id. Will act as an idempotency key |
| amount required | integer <int64> The amount to be transferred. Must be a positive integer. |
| currencyCode required | string <= 3 characters The 3-letter ISO 4217 currency code for the transfer. Example: USD, EUR, GBP. |
| description | string A brief description or reference for the transfer. |
| recipientName | string The name of the recipient for this transfer. |
| recipientAccountNumber required | string The recipient's account number (IBAN or another account format depending on the country). |
| recipientAccountType required | string (RecipientAccountTypeEnum) Enum: "individual" "company" |
| recipientAddress required | string <= 255 characters The address of the recipient. |
| recipientCountry required | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code for the recipient's country. |
| recipientRegistrationNumber | string The recipient’s registration number (e.g., national ID or tax ID). |
| chargesType required | string (InternationalTransferChargesTypeEnum) Enum: "our" "sha" Specifies who will bear the transfer charges. |
| bankName required | string The name of the recipient's bank. |
| bankAddress required | string The address of the recipient's bank. |
| bankCountry required | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code for the bank's location. |
| bankBIC required | string The Bank Identifier Code (BIC) or SWIFT code of the recipient's bank. |
| intermediaryBIC | string The Bank Identifier Code (BIC) or SWIFT code of the intermediary bank, if applicable. |
| intermediaryName | string The name of the intermediary bank, if applicable. |
| intermediaryAddress | string The address of the intermediary bank, if applicable. |
| intermediaryAccountNumber | string The account number at the intermediary bank, if applicable. |
| intermediaryCountry | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code for the intermediary bank's location. |
| status required | string Enum: "rejected" "canceled" Terminal failure or client cancellation. | ||||||||||||
| reason required | string (TransferFailureReasonEnum) Enum: "insufficient_funds" "wrong_payment_details" "rejected_by_bank" "canceled_by_client" "other" Machine-readable reason when a transfer or incoming payment ends in Present together with
Use | ||||||||||||
| message required | string Human-readable explanation. Safe for partner display. Never includes AML, sanctions, or investigation details. | ||||||||||||
| id required | string <uuid> Unique identifier for the transfer. | ||||||||||||
| accountId required | string <uuid> Unique identifier of the account from which the transfer is made. | ||||||||||||
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., cents for USD). | ||||||||||||
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. | ||||||||||||
| total required | integer <int64> The total amount debited, including the transfer amount and fee. | ||||||||||||
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. | ||||||||||||
| description | string A description or reference for the transfer. | ||||||||||||
| recipientName | string The name of the transfer recipient. | ||||||||||||
| recipientAccountNumber required | string The account number or IBAN of the recipient's account. | ||||||||||||
| recipientAccountType required | string (RecipientAccountTypeEnum) Enum: "individual" "company" | ||||||||||||
| recipientAddress required | string <= 255 characters The address of the recipient. | ||||||||||||
| recipientCountry required | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the recipient. | ||||||||||||
| recipientRegistrationNumber | string The registration number of the recipient (e.g., tax ID, company registration number). | ||||||||||||
| chargesType required | string (InternationalTransferChargesTypeEnum) Enum: "our" "sha" Specifies who will bear the transfer charges. | ||||||||||||
| bankName required | string The name of the recipient's bank. | ||||||||||||
| bankAddress required | string The address of the recipient's bank. | ||||||||||||
| bankCountry required | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the recipient's bank. | ||||||||||||
| bankBIC required | string The Bank Identifier Code (BIC) or SWIFT code of the recipient's bank. | ||||||||||||
| intermediaryBIC | string The BIC of the intermediary bank, if applicable. | ||||||||||||
| intermediaryName | string The name of the intermediary bank, if applicable. | ||||||||||||
| intermediaryAddress | string The address of the intermediary bank, if applicable. | ||||||||||||
| intermediaryAccountNumber | string The account number at the intermediary bank, if applicable. | ||||||||||||
| intermediaryCountry | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the intermediary bank, if applicable. | ||||||||||||
| createdAt | string <date-time> Timestamp when the transfer was created. |
{- "amount": 0,
- "currencyCode": "str",
- "description": "string",
- "recipientName": "string",
- "recipientAccountNumber": "string",
- "recipientAccountType": "individual",
- "recipientAddress": "7th Floor, The Bower Warehouse, 211 Old Street, London EC1V 9NR",
- "recipientCountry": "st",
- "recipientRegistrationNumber": "string",
- "chargesType": "sha",
- "bankName": "string",
- "bankAddress": "string",
- "bankCountry": "st",
- "bankBIC": "string",
- "intermediaryBIC": "string",
- "intermediaryName": "string",
- "intermediaryAddress": "string",
- "intermediaryAccountNumber": "string",
- "intermediaryCountry": "st"
}{- "status": "rejected",
- "reason": "insufficient_funds",
- "message": "Account has insufficient funds",
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "accountId": "234e5678-e89b-12d3-a456-426614174000",
- "amount": 100000,
- "fee": 500,
- "total": 100500,
- "currencyCode": "EUR",
- "description": "Monthly rent payment",
- "recipientName": "John Doe",
- "recipientAccountNumber": "DE89370400440532013000",
- "recipientAccountType": "individual",
- "recipientAddress": "7th Floor, The Bower Warehouse, 211 Old Street, London EC1V 9NR",
- "recipientCountry": "GB",
- "recipientRegistrationNumber": "DE123456789",
- "chargesType": "sha",
- "bankName": "Deutsche Bank",
- "bankAddress": "Taunusanlage 12, 60325 Frankfurt am Main, Germany",
- "bankCountry": "DE",
- "bankBIC": "DEUTDEFFXXX",
- "intermediaryBIC": "BOFAUS3NXXX",
- "intermediaryName": "Bank of America",
- "intermediaryAddress": "100 West 33rd Street, New York, NY 10001, USA",
- "intermediaryAccountNumber": 6550123456,
- "intermediaryCountry": "US",
- "createdAt": "2024-09-16T14:32:00Z"
}This endpoint retrieves a list of international transfers for a specific account. The result can be paginated using offset and limit query parameters.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> The unique identifier (GUID) for the account from which international transfers will be fetched. |
| from | string <date> The start date for the period (inclusive). Format: YYYY-MM-DD. |
| to | string <date> The end date for the statement period (inclusive). Format: YYYY-MM-DD. |
| offset | integer Default: 0 The number of records to skip from the beginning of the result set. Default is 0. |
| limit | integer Default: 10 The maximum number of records to return. Default is 10. |
| status required | string Enum: "rejected" "canceled" Terminal failure or client cancellation. | ||||||||||||
| reason required | string (TransferFailureReasonEnum) Enum: "insufficient_funds" "wrong_payment_details" "rejected_by_bank" "canceled_by_client" "other" Machine-readable reason when a transfer or incoming payment ends in Present together with
Use | ||||||||||||
| message required | string Human-readable explanation. Safe for partner display. Never includes AML, sanctions, or investigation details. | ||||||||||||
| id required | string <uuid> Unique identifier for the transfer. | ||||||||||||
| accountId required | string <uuid> Unique identifier of the account from which the transfer is made. | ||||||||||||
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., cents for USD). | ||||||||||||
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. | ||||||||||||
| total required | integer <int64> The total amount debited, including the transfer amount and fee. | ||||||||||||
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. | ||||||||||||
| description | string A description or reference for the transfer. | ||||||||||||
| recipientName | string The name of the transfer recipient. | ||||||||||||
| recipientAccountNumber required | string The account number or IBAN of the recipient's account. | ||||||||||||
| recipientAccountType required | string (RecipientAccountTypeEnum) Enum: "individual" "company" | ||||||||||||
| recipientAddress required | string <= 255 characters The address of the recipient. | ||||||||||||
| recipientCountry required | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the recipient. | ||||||||||||
| recipientRegistrationNumber | string The registration number of the recipient (e.g., tax ID, company registration number). | ||||||||||||
| chargesType required | string (InternationalTransferChargesTypeEnum) Enum: "our" "sha" Specifies who will bear the transfer charges. | ||||||||||||
| bankName required | string The name of the recipient's bank. | ||||||||||||
| bankAddress required | string The address of the recipient's bank. | ||||||||||||
| bankCountry required | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the recipient's bank. | ||||||||||||
| bankBIC required | string The Bank Identifier Code (BIC) or SWIFT code of the recipient's bank. | ||||||||||||
| intermediaryBIC | string The BIC of the intermediary bank, if applicable. | ||||||||||||
| intermediaryName | string The name of the intermediary bank, if applicable. | ||||||||||||
| intermediaryAddress | string The address of the intermediary bank, if applicable. | ||||||||||||
| intermediaryAccountNumber | string The account number at the intermediary bank, if applicable. | ||||||||||||
| intermediaryCountry | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the intermediary bank, if applicable. | ||||||||||||
| createdAt | string <date-time> Timestamp when the transfer was created. |
[- {
- "status": "rejected",
- "reason": "insufficient_funds",
- "message": "Account has insufficient funds",
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "accountId": "234e5678-e89b-12d3-a456-426614174000",
- "amount": 100000,
- "fee": 500,
- "total": 100500,
- "currencyCode": "EUR",
- "description": "Monthly rent payment",
- "recipientName": "John Doe",
- "recipientAccountNumber": "DE89370400440532013000",
- "recipientAccountType": "individual",
- "recipientAddress": "7th Floor, The Bower Warehouse, 211 Old Street, London EC1V 9NR",
- "recipientCountry": "GB",
- "recipientRegistrationNumber": "DE123456789",
- "chargesType": "sha",
- "bankName": "Deutsche Bank",
- "bankAddress": "Taunusanlage 12, 60325 Frankfurt am Main, Germany",
- "bankCountry": "DE",
- "bankBIC": "DEUTDEFFXXX",
- "intermediaryBIC": "BOFAUS3NXXX",
- "intermediaryName": "Bank of America",
- "intermediaryAddress": "100 West 33rd Street, New York, NY 10001, USA",
- "intermediaryAccountNumber": 6550123456,
- "intermediaryCountry": "US",
- "createdAt": "2024-09-16T14:32:00Z"
}
]This endpoint retrieves a list of international transfer fees for a specific account.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account from which international transfers will be fetched. |
| amount required | integer <int64> Example: amount=100000 The amount of the international transfer. |
| currencyCode required | string <= 3 characters Example: currencyCode=EUR The currency code of the international transfer. ISO 4217. |
| recipientAccountNumber required | string Example: recipientAccountNumber=DE89370400440532013000 The account number or IBAN of the recipient's account ( |
| recipientCountry required | string = 2 characters ^[A-Z]{2}$ Example: recipientCountry=DE The country of the recipient's account. ISO 3166-1 alpha-2. |
| chargesType required | string (InternationalTransferChargesTypeEnum) Enum: "our" "sha" Example: chargesType=sha Specifies who pays the transfer fees. 'our' means the sender pays all fees, 'sha' means fees are shared. |
| bankCountry required | string = 2 characters ^[A-Z]{2}$ Example: bankCountry=DE The country of the recipient's bank. ISO 3166-1 alpha-2. |
| intermediaryAccountNumber | string Example: intermediaryAccountNumber=6550123456 The account number at the intermediary bank, if applicable. |
| intermediaryCountry | string = 2 characters ^[A-Z]{2}$ Example: intermediaryCountry=US The country of the intermediary bank, if applicable. ISO 3166-1 alpha-2. |
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., cents for USD). |
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. |
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. |
| recipientAccountNumber required | string The account number or IBAN of the recipient's account. |
| recipientCountry required | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the recipient. |
| chargesType required | string (InternationalTransferChargesTypeEnum) Enum: "our" "sha" Specifies who will bear the transfer charges. |
| bankCountry required | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the recipient's bank. |
| intermediaryAccountNumber | string The account number at the intermediary bank, if applicable. |
| intermediaryCountry | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 country code of the intermediary bank, if applicable. |
{- "amount": 100000,
- "fee": 500,
- "currencyCode": "EUR",
- "recipientAccountNumber": "DE89370400440532013000",
- "recipientCountry": "DE",
- "chargesType": "sha",
- "bankCountry": "DE",
- "intermediaryAccountNumber": 6550123456,
- "intermediaryCountry": "US"
}This endpoint retrieves allowed countries for international transfer country fields.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account for which international transfer countries will be fetched. |
required | Array of objects (InternationalTransferCountriesByField) Allowed countries grouped by requested international transfer country field. |
{- "items": [
- {
- "field": "beneficiaryCountry",
- "countries": [
- {
- "code": "DE",
- "name": "Germany"
}
]
}
]
}Initiates a new UK transfer from the specified account. This endpoint supports both Faster Payments Service (FPS) and Clearing House Automated Payment System (CHAPS) transfers.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the source account |
| x-gemba-request-id required | string <uuid> <= 64 characters Request id. Will act as an idempotency key |
| amount required | integer <int64> The transfer amount in minor currency units (e.g., pence for GBP) |
| currencyCode required | string <= 3 characters The ISO 4217 currency code |
| description | string A description or reference for the transfer |
| recipientName | string The name of the transfer recipient |
| recipientAccountNumber required | string The recipient's account number |
| recipientAccountType required | string (RecipientAccountTypeEnum) Enum: "individual" "company" |
| type required | string (UKTransferTypeEnum) Enum: "fps" "chaps" The type of transfer, either 'fps' for Faster Payments Service or 'chaps' for CHAPS. |
| chapsPurpose | string Payment purpose for CHAPS payment type |
| chapsCategoryPurpose | string Payment category purpose for CHAPS payment type |
| sortCode required | string The sort code of the recipient's bank |
| bankName required | string The name of the recipient's bank |
| bankAddress required | string The address of the recipient's bank |
| status required | string Enum: "rejected" "canceled" Terminal failure or client cancellation. | ||||||||||||
| reason required | string (TransferFailureReasonEnum) Enum: "insufficient_funds" "wrong_payment_details" "rejected_by_bank" "canceled_by_client" "other" Machine-readable reason when a transfer or incoming payment ends in Present together with
Use | ||||||||||||
| message required | string Human-readable explanation. Safe for partner display. Never includes AML, sanctions, or investigation details. | ||||||||||||
| id required | string <uuid> Unique identifier for the transfer. | ||||||||||||
| accountId required | string <uuid> Unique identifier of the account from which the transfer is made. | ||||||||||||
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., pence for GBP). | ||||||||||||
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. | ||||||||||||
| total required | integer <int64> The total amount debited, including the transfer amount and fee. | ||||||||||||
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. | ||||||||||||
| description | string A description or reference for the transfer. | ||||||||||||
| recipientName | string The name of the transfer recipient. | ||||||||||||
| recipientAccountNumber required | string The account number of the recipient. | ||||||||||||
| recipientAccountType required | string (RecipientAccountTypeEnum) Enum: "individual" "company" | ||||||||||||
| type required | string (UKTransferTypeEnum) Enum: "fps" "chaps" The type of transfer, either 'fps' for Faster Payments Service or 'chaps' for CHAPS. | ||||||||||||
| chapsPurpose | string Payment purpose for CHAPS payment type | ||||||||||||
| chapsCategoryPurpose | string Payment category purpose for CHAPS payment type | ||||||||||||
| sortCode required | string The sort code of the recipient's bank. | ||||||||||||
| bankName required | string The name of the recipient's bank. | ||||||||||||
| bankAddress required | string The address of the recipient's bank. | ||||||||||||
| createdAt | string <date-time> Timestamp when the transfer was created. |
{- "amount": 10000,
- "currencyCode": "GBP",
- "description": "Monthly rent payment",
- "recipientName": "John Doe",
- "recipientAccountNumber": "12345678",
- "recipientAccountType": "individual",
- "type": "fps",
- "chapsPurpose": "BKFE",
- "chapsCategoryPurpose": "BONU",
- "sortCode": "123456",
- "bankName": "Example Bank Ltd",
- "bankAddress": "1 Bank Street, London, UK"
}{- "id": "123e4567-e89b-12d3-a456-426614174000",
- "status": "inprogress",
- "accountId": "987654321-e89b-12d3-a456-426614174000",
- "amount": 10000,
- "fee": 100,
- "total": 10100,
- "currencyCode": "GBP",
- "description": "Monthly rent payment",
- "recipientName": "John Doe",
- "recipientAccountNumber": "12345678",
- "recipientAccountType": "individual",
- "type": "fps",
- "sortCode": "123456",
- "bankName": "Example Bank Ltd",
- "bankAddress": "1 Bank Street, London, UK",
- "createdAt": "2023-09-15T14:30:00Z"
}Retrieves a list of UK transfers for the specified account. This endpoint supports pagination.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the account |
| from | string <date> The start date for the period (inclusive). Format: YYYY-MM-DD. |
| to | string <date> The end date for the statement period (inclusive). Format: YYYY-MM-DD. |
| offset | integer >= 0 Default: 0 Example: offset=0 The number of items to skip before starting to collect the result set |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 The maximum number of items to return |
| status required | string Enum: "rejected" "canceled" Terminal failure or client cancellation. | ||||||||||||
| reason required | string (TransferFailureReasonEnum) Enum: "insufficient_funds" "wrong_payment_details" "rejected_by_bank" "canceled_by_client" "other" Machine-readable reason when a transfer or incoming payment ends in Present together with
Use | ||||||||||||
| message required | string Human-readable explanation. Safe for partner display. Never includes AML, sanctions, or investigation details. | ||||||||||||
| id required | string <uuid> Unique identifier for the transfer. | ||||||||||||
| accountId required | string <uuid> Unique identifier of the account from which the transfer is made. | ||||||||||||
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., pence for GBP). | ||||||||||||
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. | ||||||||||||
| total required | integer <int64> The total amount debited, including the transfer amount and fee. | ||||||||||||
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. | ||||||||||||
| description | string A description or reference for the transfer. | ||||||||||||
| recipientName | string The name of the transfer recipient. | ||||||||||||
| recipientAccountNumber required | string The account number of the recipient. | ||||||||||||
| recipientAccountType required | string (RecipientAccountTypeEnum) Enum: "individual" "company" | ||||||||||||
| type required | string (UKTransferTypeEnum) Enum: "fps" "chaps" The type of transfer, either 'fps' for Faster Payments Service or 'chaps' for CHAPS. | ||||||||||||
| chapsPurpose | string Payment purpose for CHAPS payment type | ||||||||||||
| chapsCategoryPurpose | string Payment category purpose for CHAPS payment type | ||||||||||||
| sortCode required | string The sort code of the recipient's bank. | ||||||||||||
| bankName required | string The name of the recipient's bank. | ||||||||||||
| bankAddress required | string The address of the recipient's bank. | ||||||||||||
| createdAt | string <date-time> Timestamp when the transfer was created. |
[- {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "status": "done",
- "accountId": "987654321-e89b-12d3-a456-426614174000",
- "amount": 10000,
- "fee": 100,
- "total": 10100,
- "currencyCode": "GBP",
- "description": "Monthly rent payment",
- "recipientName": "John Doe",
- "recipientAccountNumber": "12345678",
- "recipientAccountType": "individual",
- "type": "fps",
- "sortCode": "123456",
- "bankName": "Example Bank Ltd",
- "bankAddress": "1 Bank Street, London, UK",
- "createdAt": "2023-09-15T14:30:00Z"
}, - {
- "id": "234567890-e89b-12d3-a456-426614174000",
- "status": "inprogress",
- "accountId": "987654321-e89b-12d3-a456-426614174000",
- "amount": 50000,
- "fee": 500,
- "total": 50500,
- "currencyCode": "GBP",
- "description": "Business invoice payment",
- "recipientName": "ABC Company Ltd",
- "recipientAccountNumber": "87654321",
- "recipientAccountType": "company",
- "type": "chaps",
- "sortCode": "654321",
- "bankName": "Business Bank PLC",
- "bankAddress": "10 Corporate Avenue, Manchester, UK",
- "createdAt": "2023-09-15T14:30:00Z"
}
]Retrieves a list of UK transfers fees for the specified account.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the account |
| amount required | integer <int64> Example: amount=100000 Amount of the internal transfer |
| currencyCode required | string <= 3 characters Example: currencyCode=USD Currency code of the internal transfer. ISO 4217 3-letter currency code. |
| recipientAccountNumber required | string Recipient's account number |
| recipientCountry required | string = 2 characters ^[A-Z]{2}$ Example: recipientCountry=DE The country of the recipient's account. ISO 3166-1 alpha-2. |
| type required | string (UKTransferTypeEnum) Enum: "fps" "chaps" Example: type=fps Type of the transfer |
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., pence for GBP). |
| fee required | integer <int64> The fee charged for the transfer, in the smallest unit of the currency. |
| currencyCode required | string <= 3 characters The ISO 4217 currency code for the transfer. |
| recipientAccountNumber required | string The account number of the recipient. |
| type required | string (UKTransferTypeEnum) Enum: "fps" "chaps" The type of transfer, either 'fps' for Faster Payments Service or 'chaps' for CHAPS. |
| sortCode required | string The sort code of the recipient's bank. |
[- {
- "amount": 10000,
- "fee": 100,
- "currencyCode": "GBP",
- "recipientAccountNumber": "12345678",
- "type": "fps"
}
]Initiates a number of transfers from the specified account in one bulk batch.
Single transfer (/transfers/uk, /transfers/international, /transfers/internal) |
Bulk (/transfers/bulk) |
|
|---|---|---|
| Request body | One transfer object (UKTransfer / InternationalTransfer / InternalTransfer field set) |
{ "payments": [ BulkPayment, ... ] } — row schema uses different field names |
| Success response | Full transfer resource (id, status, amounts, beneficiary fields, …) | { "bulkPaymentId": "<uuid>" } only |
| Status polling | GET list/filter on transfer endpoints, or webhooks | GET .../transfers/bulk/{bulkId} returns { status, count } |
| Webhooks | transfer.outgoing.changed with the single-transfer payload |
No bulk-aggregate webhook. Each spawned child transfer emits transfer.outgoing.changed with the same UK/international transfer payload as a single payment (including onhold and reason/message) |
OTP confirm the bulk via /transfers/bulk/{bulkId}/otp/* before processing starts.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the source account |
required | Array of IbanRouting (object) or UkRouting (object) (BulkPayment) non-empty Payment rows to include in the bulk. Each item is a BulkPayment, not a UKTransfer/InternationalTransfer. |
| bulkPaymentId required | string <uuid> Identifier of the created bulk batch. Use as |
{- "payments": [
- {
- "line": 1,
- "sortCode": "090127",
- "accountNumber": "80687896",
- "beneficiary": "Karl Frost",
- "amount": 77076,
- "currency": "GBP",
- "info": "GREEN GRP WAGES"
}, - {
- "line": 2,
- "IBAN": "DE89370400440532013000",
- "beneficiary": "Acme GmbH",
- "amount": 250000,
- "currency": "EUR",
- "country": "DE",
- "bic": "DEUTDEFFXXX",
- "bank": "Deutsche Bank",
- "bankCountry": "DE",
- "charges": "sha",
- "info": "Invoice 1042"
}
]
}{- "bulkPaymentId": "666e4567-e89b-13d3-a456-426614174000"
}Retrieves the aggregate status of a bulk payment batch.
Returns { status, count } only. It does not return an array of individual transfer
objects, and it does not include per-payment reason / message fields used on
single-transfer resources.
For per-payment outcomes after the bulk has spawned child transfers, use the standard
transfer GET endpoints and/or transfer.outgoing.changed webhooks (same payload shapes as
single UK/international transfers).
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the account |
| bulkId required | string <uuid> Example: 666e4567-e89b-13d3-a456-426614174000 The unique identifier of the bulk ( |
| status required | string (BulkStatusEnum) Enum: "inprogress" "done" "error" "sign_required" Aggregate status of a bulk payment batch (container document), not an individual transfer.
By design this is a subset of single-transfer | ||||||||||
| count required | integer Number of payment rows in the bulk. |
{- "status": "sign_required",
- "count": 5
}This endpoint send the OTP for a bulk of transfers.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account from which transfers will be fetched. |
| bulkId required | string <uuid> Example: f47ac10b-58cc-4372-a567-0e02b2c3d479 The unique identifier (GUID) for the bulk to be confirmed. |
| id required | string <uuid> The unique identifier for the transfer/bulk of transfers confirmation. |
| type required | string Default: "sms" Enum: "sms" "email" The type of transfer confirmation. |
| code | string or null The confirmation code. Sandbox only |
| status required | string Enum: "confirmed" "sent" "expired" The status of the internal transfer confirmation |
| expiresAt required | string <date-time> The timestamp when the transfer was confirmed. |
{- "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "type": "sms",
- "status": "sent",
- "expiresAt": "2024-09-16T14:32:00Z"
}This endpoint initiates a processing of the bulk. This require specifying the recipient's account details, the amount, and the currency code.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) for the account from which the bulk of transfers will be initiated. |
| bulkId required | string <uuid> Example: f47ac10b-58cc-4372-a567-0e02b2c3d479 The unique identifier (GUID) for the bulk to be confirmed. |
| code required | string The OTP to confirm the bulk. |
| id required | string <uuid> The unique identifier for the transfer/bulk of transfers confirmation. |
| type required | string Default: "sms" Enum: "sms" "email" The type of transfer confirmation. |
| code | string or null The confirmation code. Sandbox only |
| status required | string Enum: "confirmed" "sent" "expired" The status of the internal transfer confirmation |
| expiresAt required | string <date-time> The timestamp when the transfer was confirmed. |
{- "code": "123456"
}{- "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "type": "sms",
- "status": "confirmed",
- "expiresAt": "2024-09-16T14:32:00Z"
}Uploads a file for the request for a payment.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the account |
| transferId required | string <uuid> Example: 666e4567-e89b-13d3-a456-426614174000 The unique identifier (GUID) of the transaction |
| file required | string <binary> The file to upload |
| uploadedFileId | string <uuid> |
"666e4567-e89b-13d3-a456-426614174000"Retrieves a file attached for the transaction.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the account |
| transferId required | string <uuid> Example: 666e4567-e89b-13d3-a456-426614174000 The unique identifier (GUID) of the transaction |
| data required | string <byte> Base64 encoded file data |
| type required | string |
| name required | string Name of the file |
| size required | integer <int64> Size of the file in bytes |
{- "data": "string",
- "type": "filetype/type",
- "name": "filename.pdf",
- "size": 2000
}Push payouts to debit and credit cards: exchange card numbers for opaque encrypted
tokens — the only place card data enters the API — then create, sign and inspect
payouts funded from client accounts. All card-payout endpoints live under the
/card-payouts path prefix. Creating a payout prices it and holds it for signature;
signing it with an HTTP Message Signature (RFC 9421) executes it. An unsigned batch
can be cancelled. Batches created in the Gemba web app appear here too.
The same bearer access token as the rest of this API — see
Authentication. The caller's identity is taken exclusively from the
verified token. Any x-gemba-user-id, x-gemba-client-id or
x-gemba-application-id header sent by a client is discarded and overwritten — they
cannot be used to act as another user. clientId in the path must match the token's
client claim, or the request is rejected with 403.
The API key carries a permission set, which the token reproduces as a signed claim.
Every operation requires one of three permissions, and a token without it is
rejected with 403:
| Operation | Permission |
|---|---|
listPayoutCurrencies |
card-payouts:read |
listPayoutAccounts |
card-payouts:read |
tokenizeCards |
card-payouts:tokenize |
getCardToken |
card-payouts:read |
createPayout |
card-payouts:write |
listPayouts |
card-payouts:read |
getPayout |
card-payouts:read |
listPayoutItems |
card-payouts:read |
signPayout |
card-payouts:write, plus an HTTP Message Signature once verification is enabled |
cancelPayout |
card-payouts:write |
Note that reading a card token back requires only card-payouts:read;
card-payouts:tokenize is the permission that lets a key submit card numbers.
Because these permissions reach cardholder data, a key holding any of them is always issued with an expiry, no more than 90 days out, and is granted deliberately rather than as part of a general-purpose key. Plan to rotate.
POST /card-payouts/clients/{clientId}/cards/tokens is the only endpoint that
accepts a card number. It returns opaque encrypted card tokens and no card data
whatsoever. Every payout is created from those tokens, so a card number is never
required again. Callers posting raw card numbers are themselves in PCI DSS SAQ D
scope.
Tokenization validates the card with the payment processor and answers synchronously. The returned card token is an opaque encrypted value minted by the card-payouts API — it is NOT stored server-side, so keep it: a lost token cannot be recovered, only re-minted by tokenizing the card again. Tokens are bound to the client that minted them and expire with the card.
Creating a payout does not execute it. createPayout returns the batch in
awaitingSignature: every item validated, fees and FX quoted, the withdrawal
registered with the bank, and no funds moved. Executing it is a separate, explicit
call: POST /card-payouts/clients/{clientId}/payouts/{payoutBatchId}/sign. Its
intended authorisation is an HTTP Message Signature
(RFC 9421) made with a signing key
registered for the API key: the bearer token proves who is calling; the signature
proves that the holder of the registered private key authorised this specific payout.
See "Rollout" below for what applies today. There is no one-time-code flow on this
API — that is the Gemba web app's mechanism, where a client user can also sign an
API-created batch.
A batch must be signed on the London calendar day it was created; an unsigned batch
can be cancelled with POST /card-payouts/clients/{clientId}/payouts/{payoutBatchId}/cancel,
and expires on its own at the end of that day. The monthly reconciliation window and
the end-of-day buffer apply at signing, not at creation.
Exactly one signature, under any label, in the Signature-Input and Signature
fields. The sign endpoint takes no request body, so no Content-Digest is involved.
@method, @authority, @path and
authorization. Covering authorization binds the signature to the access token it
was made with. Further components may be covered.created and expires as Unix seconds, with expires at most 300
seconds after created and created no more than 60 seconds in the future; nonce,
unique per request, at least 16 random bytes encoded, rejected if reused while its
signature could still be valid; keyid, the identifier issued when the key was
registered; tag="card-payouts-sign". alg is optional and, when present, must
match the registered key's algorithm.ecdsa-p256-sha256, ed25519 or rsa-pss-sha512, fixed per key
at registration.Once verification is enabled, a request whose signature is missing, does not verify,
covers fewer components than required, is outside its validity window, reuses a nonce
or names an unregistered key is rejected with 403 and a SIGNATURE_* or
SIGNING_KEY_UNKNOWN code, and the response carries an Accept-Signature field
stating the required components and parameters. A rejected signature never signs or
processes the batch.
Signature verification is not enabled on the sign endpoint today. Until it is, the
Signature-Input and Signature fields are optional and, if sent, accepted without
being verified, and a sign request is authorised by the bearer token's
card-payouts:write permission alone. Sign requests from the start so that the switch
needs no change on your side.
Enabling verification is a breaking change for unsigned callers. It will be announced
in advance to every client holding a card-payouts:write key, together with the
key-registration process; from the announced date the two fields are required and an
unsigned request is rejected with 403 SIGNATURE_MISSING. Signing keys can already be
registered through Gemba developer support; a self-service flow in the Gemba web app
will follow.
Error bodies carry an optional machine-readable code alongside the message. Codes
currently in use (new codes may be added without notice — treat unknown codes as
their HTTP status):
| Code | Status | Meaning |
|---|---|---|
TOO_MANY_ITEMS |
400 | cards/items exceeds the per-request maximum |
UNSUPPORTED_CURRENCY |
400 | a payout currency is outside the allowlist (body lists them in currencies) |
PAYOUT_MONTHLY_CUTOFF |
400 | signing refused: monthly reconciliation window (1st of month, London) |
PAYOUT_EOD_CUTOFF |
400 | signing refused: end-of-day buffer before midnight London |
PAYOUT_EXPIRED |
400 | signing refused: the batch was created on a previous London day |
PRODUCT_NOT_AVAILABLE |
403 | the client is not entitled to card payouts |
SIGNATURE_MISSING |
403 | the sign request carries no Signature-Input / Signature |
SIGNATURE_INVALID |
403 | the signature does not verify, or a required component or parameter is not covered |
SIGNATURE_EXPIRED |
403 | created / expires fall outside the accepted window |
SIGNATURE_REPLAYED |
403 | this nonce has already been used |
SIGNING_KEY_UNKNOWN |
403 | keyid is not a signing key registered for this API key |
REQUEST_PREVIOUSLY_FAILED |
409 | this requestId was used by a failed attempt and cannot be reused |
DUPLICATE_PAYOUT_REQUEST |
409 | this requestId collided with a concurrent attempt |
BATCH_NOT_SIGNABLE |
409 | signing refused: the batch is already processing, has finished or was cancelled |
BATCH_NOT_CANCELLABLE |
409 | cancellation refused: the batch is signed, processing, finished, or already cancelled or expired |
FUNDS_ALREADY_MOVED |
422 | cancellation refused by the bank: the batch's funds have already moved |
CARD_TOKEN_EXPIRED |
422 | creation refused: a referenced card token has passed its card's expiry |
TOKEN_INVALID |
422 | creation refused: a referenced card token is no longer usable at the processor; tokenize the card again |
The SIGNATURE_* and SIGNING_KEY_UNKNOWN codes apply only once signature
verification is enabled — see "Rollout" under "Signing payouts".
Per-card tokenization failures use their own result codes — see CardTokenFailure.
Every money amount is a Money object: { "value": "100.00", "currency": "GBP" }.
value is a decimal string in major units — the number of decimal places matches the
currency (0 for JPY, 2 for GBP, 3 for BHD) — and strings avoid IEEE-754 precision
loss in JSON parsers; parse them with a decimal-safe type, never parseFloat. Fees
and totals are settled in GBP, so their currency is GBP.
ISO 4217 currency codes accepted for card payouts.
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| count required | integer >= 0 Number of entries in |
| results required | Array of strings (CurrencyCode) [ items^[A-Z]{3}$ ] |
{- "count": 3,
- "results": [
- "GBP",
- "EUR",
- "USD"
]
}Accounts belonging to the client that can fund a card payout, with their available balances.
| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| count required | integer >= 0 |
required | Array of objects (CardPayoutAccount) |
{- "count": 2,
- "results": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "name": "Operating account",
- "balance": {
- "value": "156.50",
- "currency": "GBP"
}
}
]
}Exchange one or more card numbers for opaque encrypted card tokens. Results are per-card: a failure on one card does not fail the request, because tokenization moves no money.
Always synchronous. Each card is validated locally (number check digit, expiry) and then tokenized with the payment processor; per-card processor rejections come back as TOKENIZATION_FAILED results.
The submitted card value is never echoed back, in a result or in an error.
| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
required | Array of objects (CardToTokenize) [ 1 .. 500 ] items Cards to tokenize. Every entry receives its own result — and its own token — keyed by |
| count required | integer >= 1 Cards submitted. Always equals the length of |
| succeeded required | integer >= 0 |
| failed required | integer >= 0 |
required | Array of any (CardTokenResult) One entry per submitted card, in submission order. |
{- "cards": [
- {
- "reference": "row-1",
- "card": "4111111111111111",
- "cardHolderName": "Jane Doe",
- "expirationMonth": "12",
- "expirationYear": "2028"
}
]
}{- "count": 3,
- "succeeded": 2,
- "failed": 1,
- "results": [
- {
- "reference": "row-1",
- "status": "tokenized",
- "cardTokenId": "string"
}
]
}Card metadata decoded from the token itself. Use this when the card needs to be identified to a user — the tokenization response deliberately returns no card data.
| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| cardTokenId required | string (CardToken) [ 1 .. 2048 ] characters ^[A-Za-z0-9_-]+$ Example: pDW3swQ0uQk Opaque encrypted card token returned by the tokenization endpoint (URL-safe base64). |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| cardTokenId required | string [ 1 .. 2048 ] characters ^[A-Za-z0-9_-]+$ The token exactly as supplied in the path. |
| cardLast4 required | string (CardLast4) ^[0-9]{4}$ Last 4 digits of card number |
| cardHolderName required | string <= 70 characters |
| cardBrand | string or null Enum: "VISA" "MASTERCARD" "AMEX" "DINERS" null Null until known: the brand is determined by the payment processor during payout processing, not at tokenization. |
| status required | string Enum: "active" "expired"
|
| expiresAt required | string <date-time> When this token stops being usable for new payouts. |
| createdAt required | string <date-time> (Timestamp) |
{- "cardTokenId": "string",
- "cardLast4": "1234",
- "cardHolderName": "Jane Doe",
- "cardBrand": "VISA",
- "status": "active",
- "expiresAt": "2025-01-04T12:00:00Z",
- "createdAt": "2025-01-04T12:00:00Z"
}Creates a payout batch from card tokens: validates every item, quotes fees and FX, and registers the withdrawal with the bank — but moves no funds. The batch is returned in awaitingSignature and executes only once it is signed (see the sign endpoint). An unsigned batch can be cancelled, and expires unsigned at the end of the London day it was created on.
Batch creation is all-or-nothing: if any item is invalid the whole request fails. Per-item outcomes appear later, once processing completes, on the list-payout-items endpoint.
requestId is the idempotency key. Replaying a requestId that already created a batch returns 201 with that batch's current state rather than creating a second one, so a lost response can be recovered safely. A requestId whose creation FAILED is burnt: it answers 409 with code REQUEST_PREVIOUSLY_FAILED, and a corrected request needs a new requestId.
| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| accountId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 123e4567-e89b-12d3-a456-426614174000 The account funding the payout. Must belong to |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| requestId required | string <uuid> ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Idempotency key you generate. Replaying a |
required | Array of objects (PayoutRequestItem) [ 1 .. 500 ] items |
{- "requestId": "550e8400-e29b-41d4-a716-446655440000",
- "items": [
- {
- "reference": "row-1",
- "cardTokenId": "string",
- "amount": {
- "value": "100.00",
- "currency": "GBP"
}
}
]
}{- "payoutBatchId": "550e8400-e29b-41d4-a716-446655440000",
- "status": "awaitingSignature",
- "count": 2,
- "totalAmount": {
- "value": "200.00",
- "currency": "GBP"
}, - "totalFee": {
- "value": "5.00",
- "currency": "GBP"
}, - "totalCharged": {
- "value": "205.00",
- "currency": "GBP"
}, - "results": [
- {
- "reference": "row-1",
- "payoutItemId": "550e8400-e29b-41d4-a716-446655440000",
- "status": "completed",
- "amount": {
- "value": "102.50",
- "currency": "GBP"
}, - "charged": {
- "value": "102.50",
- "currency": "GBP"
}, - "fee": {
- "value": "2.50",
- "currency": "GBP"
}
}
]
}Every payout batch belonging to the client, newest first — regardless of which user, API key, or surface (the Gemba web app's CSV upload or this API) created it. Creation and signing remain attributed to the individual user.
Paginated: at most limit batches per page; follow nextCursor until it is null.
| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| limit | integer [ 1 .. 200 ] Default: 50 Maximum batches to return in one page. |
| cursor | string <= 128 characters Opaque cursor from a previous response's |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| count required | integer >= 0 Number of entries in this page's |
required | Array of objects (PayoutBatchSummary) |
| nextCursor required | string or null Cursor for the next page — pass as |
{- "count": 12,
- "results": [
- {
- "payoutBatchId": "550e8400-e29b-41d4-a716-446655440000",
- "accountId": "550e8400-e29b-41d4-a716-446655440000",
- "status": "processing",
- "count": 2,
- "totalAmount": {
- "value": "102.50",
- "currency": "GBP"
}, - "totalFee": {
- "value": "102.50",
- "currency": "GBP"
}, - "totalCharged": {
- "value": "102.50",
- "currency": "GBP"
}, - "signedAt": "2025-01-04T12:05:00Z",
- "createdAt": "2025-01-04T12:00:00Z",
- "updatedAt": "2025-01-04T12:00:00Z"
}
], - "nextCursor": "string"
}| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| payoutBatchId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 789e0123-e89b-12d3-a456-426614174000 Payout batch GUID. |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| payoutBatchId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... |
| accountId required | string <uuid> ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... The account that funded the payout. |
| status required | string (PayoutStatus) Enum: "awaitingSignature" "processing" "completed" "partiallyCompleted" "failed" "cancelled" Status of a payout batch:
|
| count required | integer >= 1 |
object or null Sum of item amounts in the settlement currency (GBP). Null until every item is priced; the list endpoint reports totals only for single-item batches — read the single batch for bulk-batch aggregates. | |
object or null Sum of all fees, in the settlement currency (GBP). | |
object or null Total debited from the funding account. | |
| signedAt required | string or null <date-time> When the batch was signed. Null while it is |
| createdAt required | string <date-time> (Timestamp) |
| updatedAt required | string <date-time> (Timestamp) |
{- "payoutBatchId": "550e8400-e29b-41d4-a716-446655440000",
- "accountId": "550e8400-e29b-41d4-a716-446655440000",
- "status": "processing",
- "count": 2,
- "totalAmount": {
- "value": "102.50",
- "currency": "GBP"
}, - "totalFee": {
- "value": "102.50",
- "currency": "GBP"
}, - "totalCharged": {
- "value": "102.50",
- "currency": "GBP"
}, - "signedAt": "2025-01-04T12:05:00Z",
- "createdAt": "2025-01-04T12:00:00Z",
- "updatedAt": "2025-01-04T12:00:00Z"
}Per-card outcomes for a payout batch. This is where processing failures surface — a batch can complete with some items paid and others declined.
| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| payoutBatchId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 789e0123-e89b-12d3-a456-426614174000 Payout batch GUID. |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| count required | integer >= 0 |
required | Array of objects (PayoutItem) |
{- "count": 2,
- "results": [
- {
- "payoutItemId": "550e8400-e29b-41d4-a716-446655440000",
- "reference": "row-1",
- "cardLast4": "1234",
- "cardHolderName": "Jane Doe",
- "amount": {
- "value": "102.50",
- "currency": "GBP"
}, - "charged": {
- "value": "102.50",
- "currency": "GBP"
}, - "fee": {
- "value": "102.50",
- "currency": "GBP"
}, - "status": "completed",
- "failureReason": "cardDeclined",
- "createdAt": "2025-01-04T12:00:00Z",
- "updatedAt": "2025-01-04T12:00:00Z"
}
]
}Authorises the batch and starts processing in one call. The intended authorisation is an HTTP Message Signature (RFC 9421) in the Signature-Input and Signature fields, made with a signing key registered for the API key — the required components, parameters and algorithms are in "Signing payouts" in the API description. There is no request body.
Rollout — signatures are not verified yet. Until signature verification is enabled on this endpoint, the two fields are optional and, if sent, accepted without being verified; the request is authorised by the bearer token's card-payouts:write permission alone. Enabling verification will be announced in advance; from that date the fields are required and an unsigned request is rejected with 403 SIGNATURE_MISSING. Sign requests from the start so the switch needs no change on your side.
On success the batch moves to processing and funds are reserved on the funding account; 202 means accepted, not paid — poll the get-payout and list-payout-items endpoints for the outcome.
Signing must happen on the London calendar day the batch was created — afterwards it has expired (PAYOUT_EXPIRED) and a new batch must be created, because FX rates are re-quoted daily. Two windows refuse signing outright: the monthly reconciliation window (the 1st of each month, from 00:00 until the configured cutoff, Europe/London — PAYOUT_MONTHLY_CUTOFF) and the end-of-day buffer (the last 60 minutes before midnight, Europe/London — PAYOUT_EOD_CUTOFF). If a window refuses processing, call this endpoint again with a fresh signature once it has passed: an already-signed batch is not re-signed, processing is retried.
Once verification is enabled, a signature that is missing, does not verify, is outside its validity window, reuses a nonce or names an unregistered key answers 403 with a SIGNATURE_* or SIGNING_KEY_UNKNOWN code and an Accept-Signature field; nothing is signed or processed.
Rate limited more tightly than the read endpoints.
| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| payoutBatchId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 789e0123-e89b-12d3-a456-426614174000 Payout batch GUID. |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| signature-input | string Example: sig1=("@method" "@authority" "@path" "authorization");created=1735992000;expires=1735992300;nonce="hzs3xM8k1dPq2wR9fT0bVA";keyid="key_01JGX6Q5Z9V7";tag="card-payouts-sign" RFC 9421 Optional while signature verification is not enabled — see "Rollout" there. It becomes required, and its absence a |
| signature | string Example: sig1=:MEUCIQDf3xO0eSAo2Qb1vW5hZ2lJ9c4dVq7K8rS6tU3pY1mNwAIgL2kV8jH5fG7dC9bA1eZ3xR6tQ4wS0uP2oN7mK5jI8hG=: RFC 9421 Optional while signature verification is not enabled — see "Rollout" under "Signing payouts". Required from the announced date. |
| payoutBatchId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... |
| accountId required | string <uuid> ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... The account that funded the payout. |
| status required | string (PayoutStatus) Enum: "awaitingSignature" "processing" "completed" "partiallyCompleted" "failed" "cancelled" Status of a payout batch:
|
| count required | integer >= 1 |
object or null Sum of item amounts in the settlement currency (GBP). Null until every item is priced; the list endpoint reports totals only for single-item batches — read the single batch for bulk-batch aggregates. | |
object or null Sum of all fees, in the settlement currency (GBP). | |
object or null Total debited from the funding account. | |
| signedAt required | string or null <date-time> When the batch was signed. Null while it is |
| createdAt required | string <date-time> (Timestamp) |
| updatedAt required | string <date-time> (Timestamp) |
{- "payoutBatchId": "550e8400-e29b-41d4-a716-446655440000",
- "accountId": "550e8400-e29b-41d4-a716-446655440000",
- "status": "processing",
- "count": 2,
- "totalAmount": {
- "value": "102.50",
- "currency": "GBP"
}, - "totalFee": {
- "value": "102.50",
- "currency": "GBP"
}, - "totalCharged": {
- "value": "102.50",
- "currency": "GBP"
}, - "signedAt": "2025-01-04T12:05:00Z",
- "createdAt": "2025-01-04T12:00:00Z",
- "updatedAt": "2025-01-04T12:00:00Z"
}Cancels a batch that has not been signed. The withdrawal registered at creation is withdrawn at the bank and every item is marked failed with failureReason cancelled; no funds have moved. A signed batch cannot be cancelled through this API — once signed, a payout executes.
| clientId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 550e8400-e29b-41d4-a716-446655440000 The client the request acts for. Must match the client claim in the access token. |
| payoutBatchId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: 789e0123-e89b-12d3-a456-426614174000 Payout batch GUID. |
| x-gemba-request-id | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... Example: a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7 Caller-supplied correlation id, echoed into our logs. Generated automatically when omitted. This is the only |
| payoutBatchId required | string <uuid> (UUID) ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... |
| accountId required | string <uuid> ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]... The account that funded the payout. |
| status required | string (PayoutStatus) Enum: "awaitingSignature" "processing" "completed" "partiallyCompleted" "failed" "cancelled" Status of a payout batch:
|
| count required | integer >= 1 |
object or null Sum of item amounts in the settlement currency (GBP). Null until every item is priced; the list endpoint reports totals only for single-item batches — read the single batch for bulk-batch aggregates. | |
object or null Sum of all fees, in the settlement currency (GBP). | |
object or null Total debited from the funding account. | |
| signedAt required | string or null <date-time> When the batch was signed. Null while it is |
| createdAt required | string <date-time> (Timestamp) |
| updatedAt required | string <date-time> (Timestamp) |
{- "payoutBatchId": "550e8400-e29b-41d4-a716-446655440000",
- "accountId": "550e8400-e29b-41d4-a716-446655440000",
- "status": "processing",
- "count": 2,
- "totalAmount": {
- "value": "102.50",
- "currency": "GBP"
}, - "totalFee": {
- "value": "102.50",
- "currency": "GBP"
}, - "totalCharged": {
- "value": "102.50",
- "currency": "GBP"
}, - "signedAt": "2025-01-04T12:05:00Z",
- "createdAt": "2025-01-04T12:00:00Z",
- "updatedAt": "2025-01-04T12:00:00Z"
}Endpoints related to foreign exchange (FX) trades, including getting quotes, placing orders, and retrieving currency pairs.
Create a quote for a foreign exchange transaction.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the source account |
| amount required | integer <int64> The transfer amount in the smallest unit of the currency (e.g., cents for USD). |
| fixedSide required | string (FxFixedSideEnum) Enum: "sell" "buy" The side of the trade to be fixed. This can either be buy or sell. |
| sellCurrency required | string The currency code of the currency being sold. |
| buyCurrency required | string The currency code of the currency being bought. |
| id required | string <uuid> The unique identifier for the foreign exchange quote. |
| amount required | integer <int64> The amount of the foreign exchange transaction. |
| fixedSide required | string (FxFixedSideEnum) Enum: "sell" "buy" The side of the trade to be fixed. This can either be buy or sell. |
| sellCurrency required | string The currency code of the currency being sold. |
| sellAmount required | integer <int64> The sell amount of the foreign exchange transaction. |
| buyCurrency required | string The currency code of the currency being bought. |
| buyAmount required | integer <int64> The buy amount of the foreign exchange transaction. |
| exchangeRate required | integer <int64> The exchange rate encoded as an integer. Divide by 10^exchangeRateExponent to get the actual rate. |
| exchangeRateExponent required | integer Default: 4 The number of decimal places in the exchangeRate property |
| expiresAt required | string <date-time> The date and time at which the quote expires. |
{- "amount": 100000,
- "fixedSide": "sell",
- "sellCurrency": "EUR",
- "buyCurrency": "USD"
}{- "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "amount": 100000,
- "fixedSide": "sell",
- "sellCurrency": "EUR",
- "sellAmount": 100000,
- "buyCurrency": "USD",
- "buyAmount": 100000,
- "exchangeRate": 12000,
- "exchangeRateExponent": 4,
- "expiresAt": "2024-09-16T14:32:00Z"
}Execute a foreign exchange transaction quote.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the source account |
| quoteId required | string <uuid> The unique identifier for the quote. |
| action required | string Value: "execute" |
| id required | string <uuid> The unique identifier for the foreign exchange order. | ||||||||||||
| status required | string (FxStatusEnum) Enum: "pending" "executing" "settled" "expired" "cancelled" The status of the foreign exchange order.
| ||||||||||||
| accountId required | string <uuid> The foreign exchange Account | ||||||||||||
| fixedSide required | string (FxFixedSideEnum) Enum: "sell" "buy" The side of the trade to be fixed. This can either be buy or sell. | ||||||||||||
| sellCurrency required | string The currency code of the currency being sold. | ||||||||||||
| sellAmount required | integer <int64> The sell amount of the foreign exchange transaction. | ||||||||||||
| buyCurrency required | string The currency code of the currency being bought. | ||||||||||||
| buyAmount required | integer <int64> The buy amount of the foreign exchange transaction. | ||||||||||||
| exchangeRate required | integer <int64> The exchange rate encoded as an integer. Divide by 10^exchangeRateExponent to get the actual rate. | ||||||||||||
| exchangeRateExponent required | integer Default: 4 The number of decimal places in the exchangeRate property | ||||||||||||
| createdAt required | string <date-time> Timestamp when the order was created. |
{- "quoteId": "826e5192-f8c6-4e24-aab3-3910e46c52b7",
- "action": "execute"
}{- "id": "9545b658-6eca-1804-d325-79fbd54802c9",
- "status": "executing",
- "accountId": "702c2905-bd91-67e4-2fa8-c3d6917bac8f",
- "fixedSide": "sell",
- "sellCurrency": "USD",
- "sellAmount": 2500,
- "buyCurrency": "EUR",
- "buyAmount": 2268,
- "exchangeRate": 9070,
- "exchangeRateExponent": 4,
- "createdAt": "2026-01-29T17:00:52.92Z"
}This endpoint retrieves a list of foreign exchange orders for a specific account. The
result can be paginated using offset and limit query parameters.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the source account |
| from | string <date> The start date for the period (inclusive). Format: YYYY-MM-DD. |
| to | string <date> The end date for the order list period (inclusive). Format: YYYY-MM-DD. |
| offset | integer >= 0 Default: 0 The number of records to skip from the beginning of the result set. Default is 0. |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 The maximum number of records to return. Default is 10. |
| id required | string <uuid> The unique identifier for the foreign exchange order. | ||||||||||||
| status required | string (FxStatusEnum) Enum: "pending" "executing" "settled" "expired" "cancelled" The status of the foreign exchange order.
| ||||||||||||
| accountId required | string <uuid> The foreign exchange Account | ||||||||||||
| fixedSide required | string (FxFixedSideEnum) Enum: "sell" "buy" The side of the trade to be fixed. This can either be buy or sell. | ||||||||||||
| sellCurrency required | string The currency code of the currency being sold. | ||||||||||||
| sellAmount required | integer <int64> The sell amount of the foreign exchange transaction. | ||||||||||||
| buyCurrency required | string The currency code of the currency being bought. | ||||||||||||
| buyAmount required | integer <int64> The buy amount of the foreign exchange transaction. | ||||||||||||
| exchangeRate required | integer <int64> The exchange rate encoded as an integer. Divide by 10^exchangeRateExponent to get the actual rate. | ||||||||||||
| exchangeRateExponent required | integer Default: 4 The number of decimal places in the exchangeRate property | ||||||||||||
| createdAt required | string <date-time> Timestamp when the order was created. |
[- {
- "id": "81d1f136-b548-d327-160f-e9ac387db4e2",
- "status": "executing",
- "accountId": "702c2905-bd91-67e4-2fa8-c3d6917bac8f",
- "fixedSide": "sell",
- "sellCurrency": "USD",
- "sellAmount": 2500,
- "buyCurrency": "EUR",
- "buyAmount": 2268,
- "exchangeRate": 9070,
- "exchangeRateExponent": 4,
- "createdAt": "2026-01-30T07:08:38.387Z"
}, - {
- "id": "52f262f1-d4c0-eab5-7819-63f283d1045f",
- "status": "executing",
- "accountId": "702c2905-bd91-67e4-2fa8-c3d6917bac8f",
- "fixedSide": "sell",
- "sellCurrency": "EUR",
- "sellAmount": 2500,
- "buyCurrency": "USD",
- "buyAmount": 2664,
- "exchangeRate": 10653,
- "exchangeRateExponent": 4,
- "createdAt": "2026-01-30T07:11:14.597Z"
}
]Retrieves a list of available foreign exchange currency pairs for the specified account, including minimum and maximum transaction amounts, exchange rates, and cut-off times for same-day execution.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| accountId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier (GUID) of the account |
required | Array of objects (FxCurrencyPair) List of available currency pairs for FX trading |
{- "pairs": [
- {
- "sellCurrency": "EUR",
- "buyCurrency": "USD",
- "minAmount": 2500,
- "maxAmount": 10000000,
- "cutOffTime": "15:00:00",
- "isAvailable": true
}, - {
- "sellCurrency": "USD",
- "buyCurrency": "EUR",
- "minAmount": 2500,
- "maxAmount": 10000000,
- "cutOffTime": "15:00:00",
- "isAvailable": true
}, - {
- "sellCurrency": "GBP",
- "buyCurrency": "EUR",
- "minAmount": 2500,
- "maxAmount": 10000000,
- "cutOffTime": "15:00:00",
- "isAvailable": true
}, - {
- "sellCurrency": "EUR",
- "buyCurrency": "GBP",
- "minAmount": 2500,
- "maxAmount": 10000000,
- "cutOffTime": "15:00:00",
- "isAvailable": true
}
]
}Webhook events related to foreign exchange (FX) orders, including fx.order.changed notifications.
Manage secure communication via messages in threads, which allows users to exchange information within the API.
Retrieves a list of all message threads. This endpoint supports pagination.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| offset | integer >= 0 Default: 0 Example: offset=0 The number of items to skip before starting to collect the result set |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 The maximum number of items to return |
| id required | string <uuid> Unique identifier for the thread. |
| clientId required | string <uuid> Unique identifier for the client associated with the thread. |
| subject | string [ 1 .. 255 ] characters Subject of the thread. |
| createdAt | string <date-time> Timestamp when the thread was created. |
| updatedAt | string <date-time> Timestamp when the thread was last updated. |
| deletedAt | string or null <date-time> Timestamp when the thread was deleted. Null if not deleted. |
[- {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "clientId": "123e4567-e89b-12d3-a456-426614174001",
- "subject": "Meeting Request: Project Kickoff",
- "createdAt": "2024-09-16T14:32:00Z",
- "updatedAt": "2024-09-17T09:21:00Z",
- "deletedAt": null
}, - {
- "id": "234e5678-e89b-12d3-a456-426614174000",
- "clientId": "345e6789-e89b-12d3-a456-426614174001",
- "subject": "Follow-up on Contract Terms",
- "createdAt": "2024-09-18T10:15:00Z",
- "updatedAt": "2024-09-18T10:15:00Z",
- "deletedAt": null
}
]Creates a new message thread with an initial message. This endpoint allows clients to start a new conversation thread.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| subject required | string [ 1 .. 255 ] characters Subject of the new thread |
| text required | string [ 1 .. 255 ] characters Text of the first message in the thread |
| id required | string <uuid> Unique identifier for the thread. |
| clientId required | string <uuid> Unique identifier for the client associated with the thread. |
| subject | string [ 1 .. 255 ] characters Subject of the thread. |
| createdAt | string <date-time> Timestamp when the thread was created. |
| updatedAt | string <date-time> Timestamp when the thread was last updated. |
| deletedAt | string or null <date-time> Timestamp when the thread was deleted. Null if not deleted. |
{- "subject": "Request for Product Information",
- "text": "Hello, I would like to inquire about your latest product line. Can you provide more details?"
}{- "id": "345e6789-e89b-12d3-a456-426614174000",
- "clientId": "456e7890-e89b-12d3-a456-426614174001",
- "subject": "Request for Product Information",
- "createdAt": "2024-09-19T11:30:00Z",
- "updatedAt": "2024-09-19T11:30:00Z",
- "deletedAt": null
}Fetches the details of a specific message thread. This endpoint returns comprehensive information about the thread.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| threadId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 Unique identifier of the thread to retrieve. |
| id required | string <uuid> Unique identifier for the thread. |
| clientId required | string <uuid> Unique identifier for the client associated with the thread. |
| subject | string [ 1 .. 255 ] characters Subject of the thread. |
| createdAt | string <date-time> Timestamp when the thread was created. |
| updatedAt | string <date-time> Timestamp when the thread was last updated. |
| deletedAt | string or null <date-time> Timestamp when the thread was deleted. Null if not deleted. |
{- "id": "123e4567-e89b-12d3-a456-426614174000",
- "clientId": "123e4567-e89b-12d3-a456-426614174001",
- "subject": "Meeting Request: Project Kickoff",
- "createdAt": "2024-09-16T14:32:00Z",
- "updatedAt": "2024-09-17T09:21:00Z",
- "deletedAt": null
}Retrieves messages from a specific thread. This endpoint supports pagination.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| threadId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier of the thread |
| offset | integer >= 0 Default: 0 Example: offset=0 The number of items to skip before starting to collect the result set |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 The maximum number of items to return |
| id required | string <uuid> Unique identifier for the message. |
| threadId required | string <uuid> Unique identifier of the thread this message belongs to. |
| clientId | string <uuid> Unique identifier of the client associated with this message, if applicable. |
| employeeId | string <uuid> Unique identifier of the employee associated with this message, if applicable. |
| text required | string [ 1 .. 255 ] characters The content of the message. Must be between 1 and 255 characters. |
| createdAt required | string <date-time> Timestamp of when the message was created. |
| updatedAt | string <date-time> Timestamp of the last update to the message, if any. |
| deletedAt | string <date-time> Timestamp of when the message was deleted, if applicable. |
[- {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "threadId": "234e5678-e89b-12d3-a456-426614174000",
- "clientId": null,
- "employeeId": "456e7890-e89b-12d3-a456-426614174000",
- "text": "Hello, how can I assist you today?",
- "createdAt": "2023-09-16T10:30:00Z",
- "updatedAt": "2023-09-16T10:30:00Z",
- "deletedAt": null
}, - {
- "id": "567e8901-e89b-12d3-a456-426614174000",
- "threadId": "234e5678-e89b-12d3-a456-426614174000",
- "clientId": "345e6789-e89b-12d3-a456-426614174000",
- "employeeId": null,
- "text": "I have a question about my account balance.",
- "createdAt": "2023-09-16T10:35:00Z",
- "updatedAt": "2023-09-16T10:35:00Z",
- "deletedAt": null
}
]Adds a new message to a specific thread. This endpoint allows clients or employees to post messages in an ongoing conversation.
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| threadId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier of the thread to post the message to |
| text required | string [ 1 .. 255 ] characters The content of the message |
| id required | string <uuid> Unique identifier for the message. |
| threadId required | string <uuid> Unique identifier of the thread this message belongs to. |
| clientId | string <uuid> Unique identifier of the client associated with this message, if applicable. |
| employeeId | string <uuid> Unique identifier of the employee associated with this message, if applicable. |
| text required | string [ 1 .. 255 ] characters The content of the message. Must be between 1 and 255 characters. |
| createdAt required | string <date-time> Timestamp of when the message was created. |
| updatedAt | string <date-time> Timestamp of the last update to the message, if any. |
| deletedAt | string <date-time> Timestamp of when the message was deleted, if applicable. |
{- "text": "Thank you for your assistance."
}{- "id": "678e9012-e89b-12d3-a456-426614174000",
- "threadId": "234e5678-e89b-12d3-a456-426614174000",
- "clientId": "345e6789-e89b-12d3-a456-426614174000",
- "employeeId": null,
- "text": "Thank you for your assistance.",
- "createdAt": "2023-09-16T11:00:00Z",
- "updatedAt": "2023-09-16T11:00:00Z",
- "deletedAt": null
}Webhooks deliver real-time notifications to your callbackURL for transfer events (status changes and transfer.incoming.created) and FX order status changes. Register a webhook, then receive POST deliveries with event type transfer.outgoing.changed, transfer.incoming.created, transfer.incoming.changed, or fx.order.changed. See the Webhook event delivery callback for payload shapes, transfer statuses (including onhold, and reason/message on rejected/canceled), and FX order statuses.
Webhook callbacks are delivered from a static egress IP address that can be allowlisted on your side. Production and sandbox callbacks both originate from 34.13.6.63. This address does not rotate; if it ever changes or an additional address is added, partners are notified in advance.
Gemba delivers events to your registered callbackURL via HTTP POST for transfer events
(status changes and transfer.incoming.created) and FX order status changes.
All active webhooks receive every event type.
| Event type | When it fires | data shape |
|---|---|---|
transfer.outgoing.changed |
Outgoing transfer status changed (internal, international, or UK) | InternalTransfer, InternationalTransfer, or UKTransfer |
transfer.incoming.created |
Incoming side of an internal transfer (recipient perspective) | InternalTransfer |
transfer.incoming.changed |
External incoming payment changed | IncomingPayment |
fx.order.changed |
FX order status changed | FxOrder |
For internal transfers between two Gemba accounts, the sender receives transfer.outgoing.changed
and the recipient receives transfer.incoming.created.
Bulk batches use a different REST shape than single transfers (create → { bulkPaymentId };
status → { status, count }). There is no bulk-aggregate webhook event.
Per-row outcomes are delivered the same way as single payments: after the bulk is processed,
each spawned UK or international transfer emits transfer.outgoing.changed with the standard
UKTransfer / InternationalTransfer payload, including onhold and reason/message on
rejected/canceled.
Transfer-related events use these data.status values:
inprogress — transfer is being processedonhold — transfer is temporarily on hold and awaiting further processing (no reason / message)done — transfer completed successfullyerror — processing errorrejected — transfer rejected; includes reason (insufficient_funds, wrong_payment_details, rejected_by_bank, canceled_by_client, or other) and message (partner-safe human-readable explanation)sign_required — OTP/signature required before processingcanceled — transfer canceled; includes reason (insufficient_funds, wrong_payment_details, rejected_by_bank, canceled_by_client, or other) and message (partner-safe human-readable explanation)fx.order.changed events use these data.status values:
pending — order created, awaiting executionexecuting — order is being executedsettled — order completed and funds exchangedexpired — quote/order expired before settlementcancelled — order canceledCompare the X-Signature-SHA256 header to HMAC-SHA256(rawBody, HMACKey) encoded as base64.
Use the raw request body bytes; do not re-serialize JSON before verifying.
id for deduplication2xx promptly| X-Signature-SHA256 required | string HMAC-SHA256 of the raw request body, keyed with your webhook |
| id required | string Unique message ID for this delivery. |
| type required | string Value: "transfer.outgoing.changed" Outgoing transfer status changed (internal, international, or UK). |
| publishedAt required | string <date-time> Timestamp when the event was published. |
| webhookId required | string <uuid> ID of the webhook that received this delivery. |
required | (InternalTransfer (RejectedOrCanceled (object) or OnHold (object) or OtherStatus (object))) or (InternationalTransfer (RejectedOrCanceled (object) or OnHold (object) or OtherStatus (object))) or (UKTransfer (RejectedOrCanceled (object) or OnHold (object) or OtherStatus (object))) Outgoing transfer payload plus delivery metadata. |
{- "id": "msg-001",
- "type": "transfer.outgoing.changed",
- "publishedAt": "2024-09-16T14:32:00.000Z",
- "webhookId": "345e6789-e89b-12d3-a456-426614174000",
- "data": {
- "id": "456a7890-e89b-12d3-a456-426614174000",
- "status": "inprogress",
- "accountId": "456a7890-e89b-12d3-a456-426614174000",
- "amount": 500000,
- "fee": 2500,
- "total": 502500,
- "currencyCode": "USD",
- "description": "Invoice payment",
- "recipientName": "Acme Corp",
- "recipientAccountNumber": "US1234567890",
- "recipientAccountType": "company",
- "recipientAddress": "123 Main St, New York",
- "recipientCountry": "US",
- "recipientRegistrationNumber": "US123456789",
- "chargesType": "sha",
- "bankName": "Bank of America",
- "bankAddress": "100 N Tryon St",
- "bankCountry": "US",
- "bankBIC": "BOFAUS2N",
- "createdAt": "2024-09-16T14:32:00Z",
- "createAt": "2024-09-16T14:32:05.000Z",
- "updateAt": "2024-09-16T14:32:05.000Z",
- "createBy": "123e4567-e89b-12d3-a456-426614174000",
- "updateBy": "123e4567-e89b-12d3-a456-426614174000"
}
}Retrieves a list of all registered webhooks. This endpoint returns comprehensive information about each webhook, including its configuration, status, and last call details.
Delivered events use the WebhookEvent schema. See Webhook event delivery for event
types, transfer statuses, FX order statuses, and payload examples.
| id | string <uuid> |
| name required | string Webhook name |
| callbackURL required | string <uri> |
| HMACKey | string HMAC hash secret key |
| isActive | boolean Default: true status |
| lastCallAt | string or null <date-time> Last call date |
| lastCallStatus | string or null Last call status |
| createdAt | string <date-time> |
| updatedAt | string or null <date-time> |
| deletedAt | string or null <date-time> |
[- {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "name": "Account Updates Webhook",
- "HMACKey": "secretkey123",
- "isActive": true,
- "lastCallAt": "2024-09-19T10:15:00Z",
- "lastCallStatus": "success",
- "createdAt": "2024-09-16T14:32:00Z",
- "updatedAt": "2024-09-19T10:15:00Z",
- "deletedAt": null
}, - {
- "id": "234e5678-e89b-12d3-a456-426614174000",
- "name": "Payment Notifications",
- "HMACKey": "secretkey456",
- "isActive": false,
- "lastCallAt": "2024-09-18T09:30:00Z",
- "lastCallStatus": "failed",
- "createdAt": "2024-09-17T11:00:00Z",
- "updatedAt": "2024-09-18T09:30:00Z",
- "deletedAt": null
}
]Creates a new webhook registration. Registration subscribes the webhook to all supported events (there is no per-event selection). The webhook will be created in an active state and will start receiving event notifications immediately.
Registered webhooks receive all event types:
transfer.outgoing.changed — outgoing transfer status changed (internal, international, or UK)transfer.incoming.created — incoming side of an internal transfertransfer.incoming.changed — external incoming payment changedfx.order.changed — FX order status changedSee Webhook event delivery for payload examples, transfer statuses, and FX order statuses.
Webhook will be deactivated if 10 consecutive calls fail.
| name required | string A descriptive name for the webhook |
| callbackURL required | string <uri> The URL where webhook notifications will be sent |
| id | string <uuid> |
| name required | string Webhook name |
| callbackURL required | string <uri> |
| HMACKey | string HMAC hash secret key |
| isActive | boolean Default: true status |
| lastCallAt | string or null <date-time> Last call date |
| lastCallStatus | string or null Last call status |
| createdAt | string <date-time> |
| updatedAt | string or null <date-time> |
| deletedAt | string or null <date-time> |
{- "name": "Gemba Webhook",
}{- "id": "345e6789-e89b-12d3-a456-426614174000",
- "name": "Gemba Webhook",
- "HMACKey": "newlygeneratedsecretkey789",
- "isActive": true,
- "lastCallAt": null,
- "lastCallStatus": null,
- "createdAt": "2024-09-20T15:30:00Z",
- "updatedAt": "2024-09-20T15:30:00Z",
- "deletedAt": null
}This endpoint allows you to activate or deactivate a previously registered webhook. Activating a webhook enables it to receive event notifications, while deactivating it suspends notifications without deleting the webhook configuration.
| webhookId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier of the webhook to update. |
| isActive required | boolean Set to true to activate the webhook, false to deactivate it. |
| id | string <uuid> |
| name required | string Webhook name |
| callbackURL required | string <uri> |
| HMACKey | string HMAC hash secret key |
| isActive | boolean Default: true status |
| lastCallAt | string or null <date-time> Last call date |
| lastCallStatus | string or null Last call status |
| createdAt | string <date-time> |
| updatedAt | string or null <date-time> |
| deletedAt | string or null <date-time> |
{- "isActive": true
}{- "id": "123e4567-e89b-12d3-a456-426614174000",
- "name": "Account Updates Webhook",
- "HMACKey": "secretkey123",
- "isActive": true,
- "lastCallAt": "2024-09-19T10:15:00Z",
- "lastCallStatus": "success",
- "createdAt": "2024-09-16T14:32:00Z",
- "updatedAt": "2024-09-19T10:15:00Z",
- "deletedAt": null
}This endpoint allows you to permanently delete a registered webhook. Once deleted, the webhook will no longer receive any event notifications. This action cannot be undone.
| webhookId required | string <uuid> Example: 123e4567-e89b-12d3-a456-426614174000 The unique identifier of the webhook to delete. |
{ }Retrieves the list of prohibited industries
| industryCode | integer The code representing the industry |
| industryName | string The name of the industry |
[- {
- "industryCode": 7143746,
- "industryName": "Arms Trade and defense"
}
]Retrieves the list of restricted industries that require additional due diligence
| industryCode | integer The code representing the industry |
| industryName | string The name of the industry |
[- {
- "industryCode": 7143722,
- "industryName": "Gambling/gaming/betting activities"
}
]The business has determined the following economic or other activities to be of elevated risk
| industryCode | integer The code representing the industry |
| industryName | string The name of the industry |
[- {
- "industryCode": 7143767,
- "industryName": "Consultancy services"
}
]Retrieves the list of high risk transaction fee countries. High risk transaction fee may be applied to payments to/from the following countries
| CountryISO | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 code of the country |
| countryFullName | string The full name of the country |
[- {
- "CountryISO": "AL",
- "countryFullName": "Albania"
}
]Retrieves the list of high risk countries.
| CountryISO | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 code of the country |
| countryFullName | string The full name of the country |
[- {
- "CountryISO": "AL",
- "countryFullName": "Albania"
}
]Retrieves the list of prohibited countries.
| CountryISO | string = 2 characters ^[A-Z]{2}$ The ISO 3166-1 alpha-2 code of the country |
| countryFullName | string The full name of the country |
[- {
- "CountryISO": "BY",
- "countryFullName": "Belarus"
}
]| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| objectType | string (OTPObjectTypeEnum) Value: "transfer" Type of object for OTP validation |
| objectId | string <uuid> |
| id required | string <uuid> The unique identifier for the transfer/bulk of transfers confirmation. |
| type required | string Default: "sms" Enum: "sms" "email" The type of transfer confirmation. |
| code | string or null The confirmation code. Sandbox only |
| status required | string Enum: "confirmed" "sent" "expired" The status of the internal transfer confirmation |
| expiresAt required | string <date-time> The timestamp when the transfer was confirmed. |
{- "objectType": "transfer",
- "objectId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}{- "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "type": "sms",
- "status": "sent",
- "expiresAt": "2024-09-16T14:32:00Z"
}Validate OTP code
| clientId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 The unique identifier for the client. This is a GUID that represents the client. |
| objectType | string (OTPObjectTypeEnum) Value: "transfer" Type of object for OTP validation |
| objectId | string <uuid> |
| code required | string The OTP to confirm the transfer. |
| id required | string <uuid> The unique identifier for the transfer/bulk of transfers confirmation. |
| type required | string Default: "sms" Enum: "sms" "email" The type of transfer confirmation. |
| code | string or null The confirmation code. Sandbox only |
| status required | string Enum: "confirmed" "sent" "expired" The status of the internal transfer confirmation |
| expiresAt required | string <date-time> The timestamp when the transfer was confirmed. |
{- "code": "123456"
}{- "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "type": "sms",
- "status": "confirmed",
- "expiresAt": "2024-09-16T14:32:00Z"
}