Apply API
Applications are the entry point to lending. Create one for a UK incorporated company, then either hand the applicant to Credicorp's hosted journey or drive a fully white-label flow from your own UI. Every application is decisioned and, once accepted and funded, becomes a servicing account.
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.
The resource will live at /partner/v1/applications and will require a write grant (scope to be announced). An application moves through a strict lifecycle; the most reliable way to follow it is to subscribe to webhooks rather than poll. Below: create, retrieve, list and withdraw, then the two integration patterns.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /applications | Create an application. |
| GET | /applications/{id} | Retrieve a single application. |
| GET | /applications | List & filter applications. |
| POST | /applications/{id}/withdraw | Withdraw before it funds. |
Create an application
Creates an application in the created state and returns a handoff_url. Always send an Idempotency-Key so a retried request does not open a second application for the same borrower.
Body parameters
| Field | Type | Description | |
|---|---|---|---|
business.company_number | string | req | Companies House number of the borrowing entity (8 chars, e.g. 16093826 or SC123456). |
amount_pence | integer | req | Requested principal in pence. Minimum £1,000 (100000), maximum £250,000 (25000000). |
term_months | integer | req | Requested term, 3–60 months. |
purpose | enum | opt | working_capital, asset_finance, expansion, refinance, stock. |
applicant.email | string | opt | Contact for the hosted journey. Required if no redirect_uri is set. |
applicant.first_name | string | opt | Pre-fills the hosted journey. |
redirect_uri | string | opt | Where to return the applicant after the hosted flow completes. |
reference | string | opt | Your own reference; echoed back on every object and webhook for reconciliation. |
introduction_id | string | opt | Attributes the deal to a distribution partner. See Introductions. |
metadata | object | opt | Up to 20 key/value string pairs, stored and returned verbatim. |
Request
curl -s https://hub.credicorp.co.uk/partner/v1/applications \ -H "Authorization: Bearer $TOKEN" \ -H "Idempotency-Key: 7c1f-9b22-001" \ -H "Content-Type: application/json" \ -d '{ "business": { "company_number": "16093826" }, "amount_pence": 2500000, "term_months": 12, "purpose": "working_capital", "redirect_uri": "https://yourapp.com/return", "reference": "INV-4821" }'
$application = $cc->applications->create([ 'business' => ['company_number' => '16093826'], 'amount_pence' => 2500000, 'term_months' => 12, 'purpose' => 'working_capital', 'redirect_uri' => 'https://yourapp.com/return', 'reference' => 'INV-4821', ], ['idempotency_key' => '7c1f-9b22-001']); header('Location: ' . $application->handoff_url);
const application = await cc.applications.create({ business: { companyNumber: '16093826' }, amountPence: 2500000, termMonths: 12, purpose: 'working_capital', redirectUri: 'https://yourapp.com/return', reference: 'INV-4821', }, { idempotencyKey: '7c1f-9b22-001' }); res.redirect(application.handoffUrl);
Response 201 Created
{
"id": "app_8Kd2c9Qm",
"object": "application",
"status": "created",
"business": { "company_number": "16093826", "name": "Credicorp Limited" },
"amount_pence": 2500000,
"term_months": 12,
"purpose": "working_capital",
"reference": "INV-4821",
"handoff_url": "https://apply.credicorp.co.uk/s/3fa7c1…",
"expires_at": "2026-07-06T10:00:00Z",
"created_at": "2026-06-29T10:00:00Z"
}Retrieve an application
Returns the current state of one application, including the linked decision once decisioning has run and the account_id once it funds.
curl https://hub.credicorp.co.uk/partner/v1/applications/app_8Kd2c9Qm \ -H "Authorization: Bearer $TOKEN"
List applications
Returns a cursor-paginated list, newest first. Combine the filters below; all are optional.
| Query param | Type | Description |
|---|---|---|
status | enum | One of the status values, e.g. funded. |
reference | string | Exact match on your supplied reference. |
created_after | string | RFC 3339 lower bound on created_at. |
limit | integer | 1–100, default 25. |
starting_after | string | Cursor — an application id from the previous page. |
curl "https://hub.credicorp.co.uk/partner/v1/applications?status=funded&limit=20" \ -H "Authorization: Bearer $TOKEN"
Withdraw an application
Cancels an application that has not yet funded and moves it to withdrawn. The call is idempotent — withdrawing an already-withdrawn application returns 200 with no change. Attempting to withdraw a funded application returns 409 conflict; servicing a funded loan is handled through Accounts roadmap.
curl -s -X POST https://hub.credicorp.co.uk/partner/v1/applications/app_8Kd2c9Qm/withdraw \ -H "Authorization: Bearer $TOKEN" \ -d '{ "reason": "duplicate" }'
Status values
An application advances through these states. Transitions are one-directional except for the terminal cancel states.
| Status | Meaning |
|---|---|
created | Open; awaiting applicant completion via the handoff_url. |
submitted | Applicant finished and consented; queued for decisioning. |
in_review | The decision engine (and any referral) is running. |
approved | An offer is available — read it from Decisioning roadmap. |
declined | No offer; structured reasons attached to the decision. |
funded | Disbursed; a servicing account now exists. |
withdrawn | Cancelled by you before funding. |
expired | Applicant did not complete before expires_at. |
Hosted vs white-label handoff
There are two ways to take the applicant from "created" to "submitted". Pick per integration; you can mix them across products.
Hosted journey (recommended)
Redirect the applicant to the handoff_url returned at creation. Credicorp runs the entire regulated flow — identity, open-banking affordability, consents and the offer screen — on apply.credicorp.co.uk, themed to your brand. When it finishes we redirect back to your redirect_uri with the application_id appended, and fire application.submitted. This is the fastest route to live and keeps the compliance surface with us.
White-label flow
Drive the screens in your own UI and submit collected data through the API. You own the front end; Credicorp still owns decisioning, identity verification and the credit agreement. This unlocks identity and consent endpoints on partner/v1 — see Identity — and requires a completed data-protection review because you are now handling applicant PII directly.
| Hosted | White-label | |
|---|---|---|
| Front end owned by | Credicorp | You |
| PII handled by you | No | Yes |
| Time to integrate | Hours | Days |
| Extra approval | None | DP review |
React to events, don't poll. Subscribe to application.submitted, decision.completed and application.funded via webhooks. Each event carries your reference so you can match it straight to your ledger.
Credicorp lends only to UK incorporated bodies corporate (limited companies and LLPs). A company_number that resolves to a sole trader, partnership or dissolved entity is rejected at create with validation_failed. This lending sits outside FCA consumer-credit regulation.
Errors
All errors from this endpoint use the standard hub error envelope. The top-level key is always error — branch your logic on code and quote correlation_id when contacting support.
{
"error": {
"code": "validation_failed",
"message": "The request failed validation.",
"detail": [{ "field": "amount_pence", "reason": "required" }],
"correlation_id": "cor_01J2K3M4N5P6Q7R8S9T0A1V2W3",
"retryable": false
}
}| code | HTTP | When |
|---|---|---|
validation_failed | 422 | A required field is missing or a value is out of range. detail[] carries per-field specifics. |
not_found | 404 | No application exists for the supplied ID, or it is not visible to this client. |
conflict | 409 | Idempotency-Key reused with a different body, or a duplicate submission. |
unauthenticated | 401 | Missing or invalid access token. |
token_expired | 401 | Token has expired — refresh it and retry. |
insufficient_scope | 403 | Token not granted the scope this endpoint requires. |
payload_too_large | 413 | Request body exceeded the size limit. |
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.
