Download OpenAPI specification:
Account and transaction data plane of the partner AISP API for contracted partners: providers, clients, connection records, accounts and transactions, plus connect sessions and partner capability discovery.
Connection lifecycle actions - create, refresh, reconnect, revoke and delete -
exist only on /v1 (see the Partner API v1.1 reference). Connect sessions,
partner config, providers, clients and all reads have their home on /v2
(this reference); the /v1 connect-session and partner-config paths are
transitional aliases. Both path sets are served on the same host with the same
API key, so do not hardcode a shared version prefix.
Sandbox and live mode are selected by the API key prefix (bb_test_… /
bb_live_…), never by the host. Guides:
https://aisp-docs.bbapi.io/guide/getting-started
The contract evolves additively: new endpoints, optional fields, envelope fields and enum values may be added without notice, and clients must ignore what they do not recognize.
{"data": …}, lists as {"limit": …, "nextCursor": …, "data": […]}.
New envelope fields may be added without notice; unknown fields must be
ignored."816.00",
"-2326.00"), or three where the third digit carries value
("1.005") — the upstream store keeps three-decimal precision. Never
parse as binary float.id is the tiebreaker in the same direction as order.sort, order and filter parameters it
was produced with; any mismatch is rejected with validation_error.
Keyset cursors are stable under concurrent inserts — a page walk never
skips or duplicates rows because new rows arrived mid-walk.Identical to v1: every request requires X-Api-Key. Client-scoped
endpoints (accounts, transactions, connection read, client
get/delete) additionally require X-Client-Id; partner-scoped ones
(client create/lookup, providers) do not. Traffic passes our API
gateway with per-partner rate limits.
Same machine-readable model as v1.1 - {"error": {"code", "message"}, "requestId"} with a stable error.code - but the v1.1 errorDesc
string is not part of v2 responses. Branch on error.code only.
Resources outside the caller's partner + client scope are indistinguishable
from absent ones: both return 404 not_found.
Same operation as v1.1 createConnectSession served by the same handler - the /v1 path remains a transitional alias. Creates a session for the hosted connect flow and returns a one-time hostedUrl. The underlying connection is created internally once the user confirms a bank — or, with connectionId set, the session reconnects that connection instead and the bank picker is skipped.
| X-Client-Id required | string <uuid> Client ID obtained from |
| Idempotency-Key | string <= 255 characters Unique key (UUID recommended) making the request idempotent for 24 hours, scoped per partner. A replay with the same key returns the original response. |
| returnUrl required | string <uri> Final destination after the hosted flow completes. Validated at session creation against the app's registered return-URL patterns. In sandbox mode the partner portal's own Try-it-now return page is accepted without registration. The redirect appends |
| locale | string Default: "en" ISO 639-1; hosted UI language. The hosted flow ships |
| country | string ISO 3166-1 alpha-2 preselect for the bank picker. |
| providerId | string or null <uuid> When set, the bank picker is skipped and the flow starts at the consent step. |
| connectionId | string or null <uuid> Reconnect mode: the session re-authorizes this existing connection instead of creating a new one; the bank picker is skipped because the bank is implied by the connection. Mutually exclusive with |
{- "locale": "en",
- "country": "CZ"
}{- "sessionId": "cs_9c1e7ab24d",
- "expiresAt": "2026-07-15T10:35:00Z"
}For troubleshooting and server-side reconciliation; the webhook stream remains the authoritative completion signal. Same handler as the v1.1 operation.
| sessionId required | string |
| X-Client-Id required | string <uuid> Client ID obtained from |
{- "sessionId": "cs_9c1e7ab24d",
- "state": "Completed",
- "connectionId": "38d0322a-a01f-4ab5-811a-7014b597834a",
- "resultCode": "Ok",
- "error": null
}Self-description of the calling partner (partner-scoped, no X-Client-Id). Same handler as the v1.1 operation. Calling a disabled capability elsewhere returns 403 capability_disabled.
{- "partnerId": "2f5a1c3e-9b7d-4e21-a6c8-0d4f5e6a7b8c",
- "name": "Acme Lending",
- "mode": "sandbox",
- "capabilities": {
- "refresh": false,
- "reconnect": false,
- "enrichment": false,
- "autoRevokeAfterCreate": true,
- "nonRegulatedProviders": false
}, - "consentDuration": "PT1H",
- "countries": null,
- "webhook": {
- "signatureVersion": "v1"
}
}Providers filtered to the partner's allowed countries and integration sources (from platform configuration). Ordering (normative): stable ascending by id (pagination guarantee only). Partner-scoped — no X-Client-Id.
A provider whose effective status is Forbidden is absent from this page, unconditionally and with no parameter to include it. Forbidden is an internal curation decision, not a state of the bank: it says BudgetBakers has not offered this provider to this partner, so for the partner it does not exist rather than being unavailable. The status itself therefore never reaches this plane and is not in status's vocabulary.
Sandbox providers (code *_xf, country XF) are listed to a sandbox key (bb_test_) only. A live key (bb_live_) never reaches them, so they are absent from its pages the same way.
| limit | integer [ 1 .. 500 ] Default: 100 Maximum number of items in this page. Values outside |
| nextCursor | string Keyset cursor returned by the previous page's |
| country | string = 2 characters ISO 3166-1 alpha-2 filter ( |
| search | string <= 100 characters Case-insensitive substring match on the provider name. |
{- "limit": 100,
- "nextCursor": null,
- "data": [
- {
- "id": "ef86e35c-83f1-4b9e-bde2-cfc40b543e05",
- "name": "Komerční banka",
- "code": "kb_cz",
- "countryCode": "CZ",
- "bicCodes": [
- "KOMBCZPP"
], - "status": "Active",
- "mode": "Api",
- "timeZone": "Europe/Prague"
}
]
}Creates the partner's end user. Partner-scoped. Re-posting an existing externalId returns the existing client — never a duplicate.
| email required | string |
| countryCode required | string |
| externalId | string Optional partner identifier. Re-posting an existing |
{- "email": "string",
- "countryCode": "CZ",
- "externalId": "string"
}{- "data": {
- "id": "5e4d3c2b-1a09-4f8e-8d7c-6b5a4d3c2b1a",
- "email": "user@example-partner.test",
- "countryCode": "CZ",
- "externalId": "partner-user-001"
}
}Partner-scoped lookup; the page contains zero or one items.
| externalId | string <= 255 characters Look up the client by the partner-supplied external id (exact match). Returns a page with zero or one items. |
| limit | integer [ 1 .. 500 ] Default: 100 Maximum number of items in this page. Values outside |
| nextCursor | string Keyset cursor returned by the previous page's |
{- "limit": 100,
- "nextCursor": null,
- "data": [
- {
- "id": "5e4d3c2b-1a09-4f8e-8d7c-6b5a4d3c2b1a",
- "email": "user@example-partner.test",
- "countryCode": "CZ",
- "externalId": "partner-user-001"
}
]
}| clientId required | string <uuid> |
| X-Client-Id required | string <uuid> Client ID obtained from |
{- "data": {
- "id": "5e4d3c2b-1a09-4f8e-8d7c-6b5a4d3c2b1a",
- "email": "user@example-partner.test",
- "countryCode": "CZ",
- "externalId": "partner-user-001"
}
}Removes the client and cascades to their connections, accounts and transactions in the v2 store. Idempotent — deleting an absent client returns 404.
| clientId required | string <uuid> |
| X-Client-Id required | string <uuid> Client ID obtained from |
{- "error": {
- "code": "unauthorized",
- "message": "Invalid or missing API key."
}, - "requestId": "req_8f3a2c1e"
}The stored connection record (state, provider, consent expiry). Lifecycle actions (create, refresh, revoke…) remain on their /v1 paths.
| connectionId required | string <uuid> Connection ID as returned by the v1 connection endpoints. |
| X-Client-Id required | string <uuid> Client ID obtained from |
{- "data": {
- "id": "2b7a51c0-e6f4-4c53-9d4e-3f9c6a1e8f2b",
- "state": "Active",
- "providerId": "ef86e35c-83f1-4b9e-bde2-cfc40b543e05",
- "consentExpiresAt": "2026-10-27T00:00:00Z"
}
}Paginated list of the connection's accounts. Ordering (normative): stable ascending by id; the order carries no business meaning and is documented only as a pagination guarantee. Unlike v1 there is no 100-account cap — connections with more accounts paginate instead of being silently truncated. The list is not filtered by subscriptionStatus: accounts the user did not select in the account picker are returned too, as Disabled — visible, with their balance, but carrying no transactions.
| connectionId required | string <uuid> Connection ID as returned by the v1 connection endpoints. |
| limit | integer [ 1 .. 500 ] Default: 100 Maximum number of items in this page. Values outside |
| nextCursor | string Keyset cursor returned by the previous page's |
| X-Client-Id required | string <uuid> Client ID obtained from |
{- "limit": 100,
- "nextCursor": null,
- "data": [
- {
- "id": "3f9c6a1e-8f2b-4c53-9d4e-2b7a51c0e6f4",
- "name": "Current Account",
- "type": "CurrentAccount",
- "balance": "816.00",
- "currencyCode": "CZK",
- "iban": "CZ6508000000192000145399",
- "subscriptionStatus": "Active"
}, - {
- "id": "a0e1b2c3-d4e5-4f60-8a9b-0c1d2e3f4a5b",
- "name": "Savings",
- "type": "SavingAccount",
- "balance": "120000.00",
- "currencyCode": "CZK",
- "iban": null,
- "subscriptionStatus": "Unsubscribed"
}
]
}Single account wrapped in the {"data": …} envelope.
| accountId required | string <uuid> Account ID as returned by |
| X-Client-Id required | string <uuid> Client ID obtained from |
{- "data": {
- "id": "3f9c6a1e-8f2b-4c53-9d4e-2b7a51c0e6f4",
- "name": "Current Account",
- "type": "CurrentAccount",
- "balance": "816.00",
- "currencyCode": "CZK",
- "iban": "CZ6508000000192000145399",
- "subscriptionStatus": "Active"
}
}Paginated transaction list. Default ordering (normative): recordDate descending, then id descending — newest first, deterministic. Sorting is configurable via sort/order; filters (dateFrom/dateTo, recordState, variableSymbol) combine with AND semantics. All filter and sort parameters must stay constant across a cursor walk (see nextCursor). History depth is provider-driven — typically around 90 days of history is available after the initial connect. Delta sync: poll with sinceSeq (combinable only with limit) to receive every row inserted or modified since your last position, ordered by seq — including late-arriving transactions whose recordDate predates rows you already hold, which date-based paging would miss.
| accountId required | string <uuid> Account ID as returned by |
| limit | integer [ 1 .. 500 ] Default: 100 Maximum number of items in this page. Values outside |
| nextCursor | string Keyset cursor returned by the previous page's |
| sort | string Default: "recordDate" Enum: "recordDate" "amount" Sort key for the transaction list. |
| order | string Default: "desc" Enum: "asc" "desc" Sort direction, |
| dateFrom | string <date> Inclusive lower bound on |
| dateTo | string <date> Inclusive upper bound on |
| recordState | string Enum: "Cleared" "Uncleared" Return only transactions in the given record state. |
| variableSymbol | Array of strings <= 20 items [ items <= 64 characters ] Return only transactions whose |
| sinceSeq | integer <int64> >= 0 Delta sync (exclusive lower bound): return only rows whose |
| sinceCreatedSeq | integer <int64> >= 0 Create-only delta sync (exclusive lower bound): return only rows whose |
| X-Client-Id required | string <uuid> Client ID obtained from |
{- "limit": 100,
- "nextCursor": "eyJ2IjoxLCJzb3J0IjoicmVjb3JkRGF0ZSIsIm9yZGVyIjoiZGVzYyIsImsiOlsiMjAyNi0wNy0wMVQwOToxNTowMFoiLCI3YzUwZjA5ZS0zZDQ0LTRiNmEtYThiOS0xZjJlM2Q0YzViNmEiXX0",
- "data": [
- {
- "id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
- "seq": 4211,
- "createdSeq": 4180,
- "amount": "-2326.00",
- "currencyCode": "CZK",
- "recordState": "Cleared",
- "recordDate": "2026-07-14T10:03:00Z",
- "note": "Payment card purchase",
- "counterParty": "Albert CZ",
- "enrichment": {
- "category": {
- "categoryId": 550,
- "categoryName": "food_and_drinks",
- "subcategoryId": 55001,
- "subcategoryName": "food_and_drinks__groceries"
}, - "merchant": {
- "id": "1a2b3c4d-5e6f-4a70-9b8c-0d1e2f3a4b5c",
- "name": "Albert CZ",
}, - "recurrent": false
}, - "details": {
- "variableSymbol": "888",
- "constantSymbol": null,
- "specificSymbol": null,
- "transactionCode": "PMNT-RCDT-ESCT",
- "creditorReference": null,
- "externalCategoryName": null,
- "mccCode": "5411",
- "others": null
}
}
]
}