Asset Loans
Issue loans secured against a customer's assets. The customer keeps their asset — security is established by registering a credit marking with the relevant authority.
This page describes the flow of converting an unsecured loan to a secured one. The flow has two stages: discover (which assets are eligible as security, and for how much?) and execute (create the loan and trigger contract signing).
This API is not finalised and endpoints, request/response shapes, and field names are subject to change without notice.
Asset offers
POST /v1/asset-offers
The bank wants to know which of the customer's assets are eligible as security and the maximum loan amount against each. Creates an offer record but has no effect on the customer or their assets.
Request body:
- Name
identityNumber- Type
- string
- Description
Customer identity number (e.g. personal number, national ID). Format varies by country.
- Name
country- Type
- string
- Description
ISO 3166-1 alpha-2 country code, e.g.
"SE","NO","FI". Determines which registries and valuation rules apply.
Notes:
offerIdis stable for its lifetime; use it to reference the offer in a loan.assetIdis deterministic — the same vehicle always returns the same ID.- Offers expire. After expiry the bank must request a fresh one as valuations may have changed.
Request body
{
"identityNumber": "196801012345",
"country": "SE"
}
Response (200)
{
"offerId": "off_k93mxp12",
"expiresAt": "2026-04-22T10:23:44Z",
"assets": [
{
"assetId": "asset_vehicle_9f3kd82jpl",
"assetType": "vehicle",
"maxLoanAmount": 129000,
"currency": "SEK",
"details": {
"make": "Volvo",
"model": "XC60",
"modelYear": 2021
}
},
{
"assetId": "asset_vehicle_4m2np91xqk",
"assetType": "vehicle",
"maxLoanAmount": 45000,
"currency": "SEK",
"details": {
"make": "BMW",
"model": "320i",
"modelYear": 2019
}
}
]
}
GET /v1/asset-offers
List previously issued offers.
Query parameters:
- Name
identityNumber- Type
- string
- Description
Filter by customer identity number.
Request
GET /v1/asset-offers?identityNumber=196801012345
Response is an array of offers in the same shape as POST /v1/asset-offers.
GET /v1/asset-offers/:offerId
Fetch a previously issued offer, e.g. if the bank wants to re-display it to an advisor later in the same session.
Path parameters:
- Name
:offerId- Type
- string
- Description
The
offerIdreturned fromGET /v1/asset-offers.
Request
GET /v1/asset-offers/off_k93mxp12
Response has the same shape as GET /v1/asset-offers.
Executing a loan
POST /v1/asset-loans
The bank has done their credit assessment, the customer has chosen an asset, and the bank wants to execute a secured loan. This starts the contract signing flow with the customer.
Request body:
- Name
offerId- Type
- string
- Description
Reference to the asset offer. A soft reference — the bank may pass
assetIddirectly if they already know it.
- Name
assetId- Type
- string
- Description
The asset to use as security for the loan. The customer retains ownership and possession — a credit marking is registered against it.
- Name
loanAmount- Type
- number
- Description
Requested loan amount. Must not exceed
maxLoanAmountfor the asset.
- Name
termMonths- Type
- number
- Description
Loan term in months.
- Name
currency- Type
- string
- Description
ISO 4217 currency code, e.g.
"SEK".
- Name
customer- Type
- object
- Description
Customer details for the signing request.
- Name
customer.identityNumber- Type
- string
- Description
Customer identity number. Format varies by country.
- Name
customer.country- Type
- string
- Description
ISO 3166-1 alpha-2 country code, e.g.
"SE","NO","FI". Determines which registry the credit marking is filed with.
- Name
customer.email- Type
- string
- Description
Customer email address.
- Name
customer.phone- Type
- string
- Description
Customer phone number in E.164 format.
Notes:
- After this call the customer receives a signing request and authorises the credit marking on their asset. They keep the asset — the credit marking is the security.
Request body
{
"offerId": "off_k93mxp12",
"assetId": "asset_vehicle_9f3kd82jpl",
"loanAmount": 80000,
"termMonths": 60,
"currency": "SEK",
"customer": {
"identityNumber": "196801012345",
"country": "SE",
"email": "anna.larsson@email.se",
"phone": "+46701234567"
}
}
Response (200)
{
"loanId": "loan_8xk2mp91za",
"status": "IN_PROGRESS",
"assetId": "asset_vehicle_9f3kd82jpl",
"requirements": [
{
"type": "CUSTOMER_CONTRACT",
"status": "PENDING",
"responsibleParty": "USER",
"details": {
"signingUrl": "https://sign.yourservice.se/ctr_x91pla33",
"expiresAt": "2026-04-18T10:23:44Z"
}
},
{
"type": "CREDIT_MARKING_REGISTRATION",
"status": "PENDING",
"responsibleParty": "SYSTEM",
"details": {
"registry": "transportstyrelsen"
}
}
]
}
Loan status
GET /v1/asset-loans/:loanId
Poll loan and contract status, or fetch for display in the bank's internal system.
Path parameters:
- Name
:loanId- Type
- string
- Description
The
loanIdreturned fromPOST /v1/asset-loans.
Loan status values:
| Status | Meaning |
|---|---|
IN_PROGRESS | One or more requirements are not yet completed. |
COMPLETED | All requirements met; loan is fully active. |
CANCELLED | Loan or signing was cancelled. |
Requirement type values:
| Type | responsibleParty | Description |
|---|---|---|
CUSTOMER_CONTRACT | USER | Customer must sign the loan agreement. details includes signingUrl and expiresAt while pending. |
CREDIT_MARKING_REGISTRATION | SYSTEM | Credit marking must be registered with the relevant authority. details includes registry and, once done, registeredAt and reference. |
Requirement status values: PENDING · IN_PROGRESS · COMPLETED · FAILED
Response (200) — completed
{
"loanId": "loan_8xk2mp91za",
"status": "COMPLETED",
"assetId": "asset_vehicle_9f3kd82jpl",
"requirements": [
{
"type": "CUSTOMER_CONTRACT",
"status": "COMPLETED",
"responsibleParty": "USER",
"details": {
"completedAt": "2026-04-16T08:00:00Z"
}
},
{
"type": "CREDIT_MARKING_REGISTRATION",
"status": "COMPLETED",
"responsibleParty": "SYSTEM",
"details": {
"registry": "transportstyrelsen",
"reference": "TS-2026-88821",
"registeredAt": "2026-04-16T09:14:00Z"
}
}
]
}
Response (200) — in progress
{
"loanId": "loan_8xk2mp91za",
"status": "IN_PROGRESS",
"assetId": "asset_vehicle_9f3kd82jpl",
"requirements": [
{
"type": "CUSTOMER_CONTRACT",
"status": "COMPLETED",
"responsibleParty": "USER",
"details": {
"completedAt": "2026-04-16T08:00:00Z"
}
},
{
"type": "CREDIT_MARKING_REGISTRATION",
"status": "PENDING",
"responsibleParty": "SYSTEM",
"details": {
"registry": "transportstyrelsen"
}
}
]
}
Response (404)
{ "error": "Loan not found" }