API reference

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.read to read, accounts.manage for sub-accounts and payouts.
Identifiers
Account ids are prefixed acc_; sub-accounts sub_; introductions intro_; payouts po_.
Money
All amounts are integer pence, currency GBP.

Endpoints

MethodPathPurpose
GET/accountsList funded accounts (filter by status, sub-account).
GET/accounts/{id}Retrieve a single account and its repayment schedule.
GET/accounts/{id}/balanceCurrent principal, interest and payoff figures.
GET/accounts/{id}/transactionsLedger of drawdowns, collections and adjustments.
POST/sub-accounts BetaOpen a partner sub-account.
GET/introductions BetaList introductions you have originated and their conversion state.
GET/payouts BetaRevenue-share payouts owed to you.

Retrieve an account

GET/partner/v1/accounts/{id}
bash
curl -s https://hub.credicorp.co.uk/partner/v1/accounts/acc_2WdR7yK \
  -H "Authorization: Bearer $TOKEN"
javascript
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);
python
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

json
{
  "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

FieldTypeDescription
statusstringServicing state — see the table below.
productstringFacility type, e.g. business_term_loan or flex_facility.
principal_penceintegerOriginal amount disbursed.
rate_aprnumberRepresentative APR at origination.
balanceobjectLive balance breakdown; payoff_pence is the amount to settle in full today.
sub_account_idstringPartner sub-account this loan is attributed to, if any.

Account statuses

StatusMeaning
performingOn schedule, no arrears.
in_arrearsOne or more collections missed; arrears_pence > 0.
forborneOn an agreed hardship / forbearance arrangement.
settledRepaid in full (including early settlement).
closedTerminated — 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.

json
{
  "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.

POST/partner/v1/sub-accounts
bash
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 }'
FieldTypeDescription
namestringreqHuman label for the segment.
revenue_share_bpsintegeroptAgreed 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.

GET/partner/v1/introductions
json
{
  "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

StageMeaning
startedApplication created, not yet submitted.
decisionedAn AI decision has been reached.
fundedApproved and disbursed — an account now exists.
declinedNot 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.

GET/partner/v1/payouts
json
{
  "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.

json
{
  "error": {
    "code": "not_found",
    "message": "The requested resource was not found.",
    "correlation_id": "cor_01J2K3M4N5P6Q7R8S9T0A1V2W3",
    "retryable": false
  }
}
codeHTTPWhen
not_found404No account exists for the supplied ID, or it is not visible to this client.
unauthenticated401Missing or invalid access token.
token_expired401Token has expired — refresh it and retry.
insufficient_scope403Token not granted accounts.read (or accounts.manage for write operations).
rate_limited429Request rate over the quota; honour retry_after_ms and Retry-After. See Rate limits.
internal_error500Unexpected fault on our side. Safe to retry idempotent calls with back-off; quote correlation_id to support.
service_unavailable503Temporary 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.