Accounts API
Read funded loan and servicing accounts and their balances, then — for distribution partners — manage sub-accounts, track the introductions you originate, and reconcile revenue-share payouts. An account is the live record of a drawn-down facility for one UK incorporated borrower.
Roadmap — not yet available. These endpoints do not exist yet and return 503 Service Unavailable. Documentation is provided so you can design against the planned shape. Build against the live token + MCP surface today; availability will be announced on the changelog.
Once an application is approved and funds are disbursed, a funded account is created. It carries the principal, the running balance, the agreed repayment schedule and the servicing status. This API is read-mostly: you query accounts and balances, and (in beta) administer the partner-side constructs that sit alongside them — sub-accounts, tracked introductions and payouts.
- Base URL
https://hub.credicorp.co.uk/partner/v1- Auth
- Bearer token — scope
accounts.readto read,accounts.managefor sub-accounts and payouts. - Identifiers
- Account ids are prefixed
acc_; sub-accountssub_; introductionsintro_; payoutspo_. - Money
- All amounts are integer pence, currency
GBP.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| GET | /accounts | List funded accounts (filter by status, sub-account). |
| GET | /accounts/{id} | Retrieve a single account and its repayment schedule. |
| GET | /accounts/{id}/balance | Current principal, interest and payoff figures. |
| GET | /accounts/{id}/transactions | Ledger of drawdowns, collections and adjustments. |
| POST | /sub-accounts Beta | Open a partner sub-account. |
| GET | /introductions Beta | List introductions you have originated and their conversion state. |
| GET | /payouts Beta | Revenue-share payouts owed to you. |
Retrieve an account
curl -s https://hub.credicorp.co.uk/partner/v1/accounts/acc_2WdR7yK \ -H "Authorization: Bearer $TOKEN"
import Credicorp from '@credicorp/sdk'; const cc = new Credicorp({ token: process.env.CC_TOKEN }); const account = await cc.accounts.retrieve('acc_2WdR7yK'); console.log(account.balance.payoff_pence);
from credicorp import Credicorp cc = Credicorp(token=os.environ["CC_TOKEN"]) account = cc.accounts.retrieve("acc_2WdR7yK") print(account.balance.payoff_pence)
Response 200 OK
{
"id": "acc_2WdR7yK",
"object": "account",
"status": "performing",
"product": "business_term_loan",
"borrower": {
"company_number": "09876543",
"company_name": "Acme Trading Ltd"
},
"principal_pence": 500000,
"term_months": 12,
"rate_apr": 14.9,
"disbursed_at": "2026-06-15T09:20:00Z",
"balance": {
"principal_outstanding_pence": 458333,
"interest_accrued_pence": 5120,
"arrears_pence": 0,
"payoff_pence": 463453
},
"sub_account_id": "sub_acme_intro"
}Account fields
| Field | Type | Description |
|---|---|---|
status | string | Servicing state — see the table below. |
product | string | Facility type, e.g. business_term_loan or flex_facility. |
principal_pence | integer | Original amount disbursed. |
rate_apr | number | Representative APR at origination. |
balance | object | Live balance breakdown; payoff_pence is the amount to settle in full today. |
sub_account_id | string | Partner sub-account this loan is attributed to, if any. |
Account statuses
| Status | Meaning |
|---|---|
performing | On schedule, no arrears. |
in_arrears | One or more collections missed; arrears_pence > 0. |
forborne | On an agreed hardship / forbearance arrangement. |
settled | Repaid in full (including early settlement). |
closed | Terminated — written off or otherwise concluded. |
Drive collections off the balance. When you build a collection schedule, read balance.payoff_pence first so the plan tracks the real outstanding amount — especially after an early repayment or a missed instalment.
Balance & transactions
GET /accounts/{id}/balance returns just the balance object for cheap polling, and /transactions returns the immutable ledger — every drawdown, collection, refund and adjustment, newest first. The ledger is cursor-paginated; see Pagination.
{
"object": "list",
"data": [
{ "id": "txn_91", "type": "collection", "amount_pence": 41667,
"payment_id": "pay_9Lm4Qx", "posted_at": "2026-06-15T11:09:40Z" },
{ "id": "txn_01", "type": "drawdown", "amount_pence": -500000,
"posted_at": "2026-06-15T09:20:00Z" }
],
"has_more": false
}Partner sub-accounts Beta
Distribution partners can open sub-accounts to segment funded loans by brand, region or campaign. Every application you originate is attributed to a sub-account, which is the unit revenue-share is calculated and paid against. Creating a sub-account requires the accounts.manage scope.
curl -s https://hub.credicorp.co.uk/partner/v1/sub-accounts \ -H "Authorization: Bearer $TOKEN" \ -H "Idempotency-Key: sub_001" \ -d '{ "name": "Acme — North West", "revenue_share_bps": 150 }'
| Field | Type | Description | |
|---|---|---|---|
name | string | req | Human label for the segment. |
revenue_share_bps | integer | opt | Agreed share in basis points; defaults to your master rate. |
Tracked introductions Beta
An introduction is created when you originate an application through your partner credentials. It links the borrower journey to your sub-account and exposes where it sits in the funnel — so you can attribute conversions and forecast revenue-share before payout.
{
"object": "list",
"data": [
{
"id": "intro_7Hb2",
"sub_account_id": "sub_acme_intro",
"application_id": "app_44Qx",
"stage": "funded",
"account_id": "acc_2WdR7yK",
"introduced_at": "2026-06-14T16:02:00Z"
}
],
"has_more": false
}Introduction stages
| Stage | Meaning |
|---|---|
started | Application created, not yet submitted. |
decisioned | An AI decision has been reached. |
funded | Approved and disbursed — an account now exists. |
declined | Not approved; no revenue-share accrues. |
Revenue-share payouts Beta
Payouts settle the revenue-share owed on funded introductions for a period. Each payout aggregates the per-account amounts across a sub-account, and is paid to your nominated bank account. A payout.paid webhook fires on settlement — reconcile it the same way you reconcile collections.
{
"id": "po_2026_06",
"object": "payout",
"sub_account_id": "sub_acme_intro",
"period": "2026-06",
"status": "paid",
"gross_pence": 128400,
"introductions": 17,
"paid_at": "2026-07-05T08:00:00Z"
}Beta surface. Sub-accounts, introductions and payouts are in partner beta — fields may be added without a major version bump and access is granted per partner agreement. Pin to a release in the changelog and contact developers@credicorp.co.uk to be enrolled.
Errors
All errors from this endpoint use the standard hub error envelope. Branch on code for precise handling; quote correlation_id when contacting support.
{
"error": {
"code": "not_found",
"message": "The requested resource was not found.",
"correlation_id": "cor_01J2K3M4N5P6Q7R8S9T0A1V2W3",
"retryable": false
}
}| code | HTTP | When |
|---|---|---|
not_found | 404 | No account exists for the supplied ID, or it is not visible to this client. |
unauthenticated | 401 | Missing or invalid access token. |
token_expired | 401 | Token has expired — refresh it and retry. |
insufficient_scope | 403 | Token not granted accounts.read (or accounts.manage for write operations). |
rate_limited | 429 | Request rate over the quota; honour retry_after_ms and Retry-After. See Rate limits. |
internal_error | 500 | Unexpected fault on our side. Safe to retry idempotent calls with back-off; quote correlation_id to support. |
service_unavailable | 503 | Temporary maintenance or overload. Retry with back-off; check status. |
The full error code list and all envelope fields are on the Errors page.
Related: Apply roadmap and Decisioning roadmap for how an account comes into being, Payments roadmap for collecting against it, and Webhooks roadmap for account.* and payout.* events.
