> This page is for Direct Executions.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://infonite.dev/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://infonite.dev/_mcp/server.

# Loans & mortgages

GET https://clients.infonite.tech/api/executions/results/{execution_id}/financial/v1/loans

Loans, mortgages and financing granted by the institution.

Each one carries the amount granted and the amount outstanding, the instalment, the rate, the dates, the account it is charged to and the repayment record the institution publishes. Field by field in [Loans & mortgages](/guides/data-models/banking/credit).

**Half of an affordability assessment lives here**, and the other half in the [credit registry](https://infonite.dev/direct-executions/api-reference/direct-executions-api/fetching-the-results/public-administration/direct-executions-v-1-results-public-credit-registry): this endpoint shows what this institution lent, the registry shows what everybody else did.

Features are chosen when the execution **starts**, not here. An execution that did not ask for `loans_read` answers `204`, and the only way to get the data is to run another one.

| Status | Meaning                                                                                                                   |
| :----- | :------------------------------------------------------------------------------------------------------------------------ |
| `200`  | The loans and mortgages.                                                                                                  |
| `202`  | `feature_not_ready` — `loans_read` is still running. **Only this family waits**: the ones that already closed answer now. |
| `204`  | The execution never asked for `loans_read`. No body.                                                                      |
| `404`  | No execution with that id for your application, or it has been deleted.                                                   |

**Server to server only.** This call is authorised with your application secret: it belongs in your backend, never in a browser, a mobile app or anything your customer can read.

Reference: https://infonite.dev/direct-executions/api-reference/direct-executions-api/fetching-the-results/financial-data/direct-executions-v-1-results-financial-loans

## Authentication

- `X-APP-SECRET` header (required) — Application Secret

## Servers

- `https://clients.infonite.tech/api` (Legacy, default)
- `https://clients.infonite.io/api` (Production)

## Request

### Path parameters

- `execution_id` (string, required) — The execution, as the acceptance response returned it.

## Response

### 200

**200 OK**Personal loans and mortgages, with the principal, what is still owed, the instalment and the schedule the institution reports. **An empty list is an answer, not a gap**: the feature ran and the source reported none.

- `list of ExecutionsResultsExecutionIdFinancialV1LoansGetResponsesContentApplicationJsonSchemaItems`

### 202

**202 Accepted**`feature_not_ready`: `loans_read` is still running. **You do not have to wait for the whole execution** — every family answers as soon as its own feature closes, so a slow source does not hold up the ones that already finished. The SAME code carries the RECORDS when this family HAS finished and the execution has not: `202` means the run is still going, and the body says which of the two you are holding — `detail` when there is nothing yet, the records when there is.

- `detail` (string, required) — Error message

## Errors

### 404 Not Found Error

**404 Not Found**No execution with that id for your application, or it has been deleted.

- `detail` (string, required) — Error message

### 422 Unprocessable Entity Error

Validation Error

- `detail` (list of ValidationError, optional)

## Types

### ExecutionsResultsExecutionIdFinancialV1LoansGetResponsesContentApplicationJsonSchemaItems

- Personal Loan: PersonalLoanSchema
- Mortgage: MortgageSchema

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)
- `input` (any, optional)
- `ctx` (ValidationErrorCtx, optional)

### PersonalLoanSchema

- `id` (string, required) — Product ID for the current execution. Note: it may change between executions.
- `product` ("financial_loan", required)
- `sub_family` ("financial_loan:personal", required)
- `fetch_date` (string, required) — Date this product was fetched
- `identifier` (Generic Identifier, required) — Loan identifier
- `customer_segment` (enum, required)
  - Allowed values: `not_assigned`, `personal`, `business`, `corporate`, `private`, `retail`
- `product_name` (string, required) — Product name
- `linked_account` (PersonalLoanSchemaLinkedAccount, optional) — Linked account
- `product_alias` (string, optional) — Product alias
- `product_description` (string, optional) — Product Description
- `initial_balance` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Initial balance of the loan
- `outstanding_balance` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Outstanding balance of the loan
- `next_payment_amount` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Next payment amount
- `begin_date` (date, optional) — Loan start date
- `renovation_date` (date, optional) — Renovation Date
- `end_date` (date, optional) — Loan expected end date
- `next_payment_date` (date, optional) — Next payment date
- `interest_rate` (infonite__pydantic__fields__common___Rate__1, optional) — Loan interest rate
- `current_period` (integer, optional) — Current period
- `pending_periods` (integer, optional) — Pending periods
- `total_periods` (integer, optional) — Total periods

### MortgageSchema

- `id` (string, required) — Product ID for the current execution. Note: it may change between executions.
- `product` ("financial_loan", required)
- `sub_family` ("financial_loan:mortgage", required)
- `fetch_date` (string, required) — Date this product was fetched
- `identifier` (Generic Identifier, required) — Loan identifier
- `customer_segment` (enum, required)
  - Allowed values: `not_assigned`, `personal`, `business`, `corporate`, `private`, `retail`
- `product_name` (string, required) — Product name
- `linked_account` (MortgageSchemaLinkedAccount, optional) — Linked account
- `product_alias` (string, optional) — Product alias
- `product_description` (string, optional) — Product Description
- `initial_balance` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Initial balance of the loan
- `outstanding_balance` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Outstanding balance of the loan
- `next_payment_amount` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Next payment amount
- `begin_date` (date, optional) — Loan start date
- `renovation_date` (date, optional) — Renovation Date
- `end_date` (date, optional) — Loan expected end date
- `next_payment_date` (date, optional) — Next payment date
- `interest_rate` (infonite__pydantic__fields__common___Rate__1, optional) — Loan interest rate
- `current_period` (integer, optional) — Current period
- `pending_periods` (integer, optional) — Pending periods
- `total_periods` (integer, optional) — Total periods

### ValidationErrorLocItems

- string
- integer

### ValidationErrorCtx

### Generic Identifier

Generic account identifier

- `value` (string, required) — Identifier
- `entity_country` (string, optional) — Entity country
- `entity_code` (string, optional) — Entity code
- `entity_office` (string, optional) — Entity office
- `control_digits` (string, optional) — Control digits

### PersonalLoanSchemaLinkedAccount

Linked account

- IBAN: IBAN
- CLABE: CLABE
- Generic Identifier: Generic Identifier

### infonite__schemas__utils__CurrencyAmountSchema__1

A monetary amount together with its currency.

- `currency` (InfoniteSchemasUtilsCurrencyAmountSchema1Currency, required) — Three-letter ISO currency code — or `***` when the source did not disclose the currency.
- `amount` (string, required) — Decimal number with 2 digits precision

### infonite__pydantic__fields__common___Rate__1

- `value` (string, optional, default: NaN) — Decimal number with 6 digits precision
- `unit` (InfonitePydanticFieldsCommonRate1Unit, optional, default: %)
- `description` (string, optional, nullable)

### MortgageSchemaLinkedAccount

Linked account

- IBAN: IBAN
- CLABE: CLABE
- Generic Identifier: Generic Identifier

### IBAN

International Bank Account Number

- `value` (string, required) — International Bank Account Number
- `masked` (string, required) — Partial IBAN
- `entity_country` (string, required) — Bank Country
- `entity_code` (string, required) — Bank code
- `entity_office` (string, required) — Bank office
- `control_digits` (string, required) — Control digits

### CLABE

Clave Bancaria Estandarizada

- `value` (string, required) — Clave Bancaria Estandarizada
- `masked` (string, required) — Partial Clabe
- `entity_country` (string, required) — Bank Country
- `entity_code` (string, required) — Bank code
- `entity_office` (string, required) — Bank office
- `control_digits` (string, required) — Control digit

### InfoniteSchemasUtilsCurrencyAmountSchema1Currency

Three-letter ISO currency code — or `***` when the source did not disclose the currency.

- string
- "***"

### InfonitePydanticFieldsCommonRate1Unit

- "%"
- string

## Examples

### A mortgage and a personal loan

**Response**

```json
[
  {
    "begin_date": "2024-01-01",
    "current_period": 32,
    "customer_segment": "personal",
    "end_date": "2030-01-01",
    "fetch_date": "2026-09-12T01:48:52+00:00",
    "id": "6aa75284bfa8241c43cb6304",
    "identifier": {
      "control_digits": "61",
      "entity_code": "9999",
      "entity_office": "9837",
      "type": "generic",
      "value": "9876543210"
    },
    "initial_balance": {
      "amount": "30000.00",
      "currency": "EUR"
    },
    "interest_rate": {
      "description": "TIN",
      "unit": "%",
      "value": "5.500000"
    },
    "linked_account": {
      "control_digits": "18",
      "entity_code": "9999",
      "entity_country": "ES",
      "entity_office": "0000",
      "masked": "ES379999************8314",
      "type": "iban",
      "value": "ES3799990000186703078314"
    },
    "next_payment_amount": {
      "amount": "416.67",
      "currency": "EUR"
    },
    "next_payment_date": "2026-10-01",
    "outstanding_balance": {
      "amount": "-16666.67",
      "currency": "EUR"
    },
    "pending_periods": 40,
    "product": "financial_loan",
    "product_alias": "Mi Préstamo Personal",
    "product_description": "Préstamo Personal para pruebas",
    "product_name": "Préstamo Personal",
    "sub_family": "financial_loan:personal",
    "total_periods": 72
  },
  {
    "begin_date": "2020-01-01",
    "current_period": 80,
    "customer_segment": "personal",
    "end_date": "2050-01-01",
    "fetch_date": "2026-09-12T01:48:52+00:00",
    "id": "6aa75284bfa8241c43cb6303",
    "identifier": {
      "control_digits": "60",
      "entity_code": "9999",
      "entity_office": "0000",
      "type": "generic",
      "value": "0123456789"
    },
    "initial_balance": {
      "amount": "100000.00",
      "currency": "EUR"
    },
    "interest_rate": {
      "description": "TAE",
      "unit": "%",
      "value": "2.500000"
    },
    "linked_account": {
      "control_digits": "18",
      "entity_code": "9999",
      "entity_country": "ES",
      "entity_office": "0000",
      "masked": "ES379999************8314",
      "type": "iban",
      "value": "ES3799990000186703078314"
    },
    "next_payment_amount": {
      "amount": "277.78",
      "currency": "EUR"
    },
    "next_payment_date": "2026-10-01",
    "outstanding_balance": {
      "amount": "-77777.78",
      "currency": "EUR"
    },
    "pending_periods": 280,
    "product": "financial_loan",
    "product_alias": "Mi Hipoteca",
    "product_description": "Hipoteca para pruebas",
    "product_name": "Hipoteca",
    "renovation_date": "2027-01-01",
    "sub_family": "financial_loan:mortgage",
    "total_periods": 360
  }
]
```

**SDK Code**

```python A mortgage and a personal loan
import requests

url = "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans"

headers = {"X-APP-SECRET": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript A mortgage and a personal loan
const url = 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go A mortgage and a personal loan
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-APP-SECRET", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby A mortgage and a personal loan
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["X-APP-SECRET"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java A mortgage and a personal loan
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php A mortgage and a personal loan
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans', [
  'headers' => [
    'X-APP-SECRET' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp A mortgage and a personal loan
using RestSharp;

var client = new RestClient("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans");
var request = new RestRequest(Method.GET);
request.AddHeader("X-APP-SECRET", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift A mortgage and a personal loan
import Foundation

let headers = ["X-APP-SECRET": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### This family has not finished

**Response**

```json
{
  "detail": "feature_not_ready"
}
```

**SDK Code**

```python This family has not finished
import requests

url = "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans"

headers = {"X-APP-SECRET": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript This family has not finished
const url = 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go This family has not finished
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-APP-SECRET", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby This family has not finished
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["X-APP-SECRET"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java This family has not finished
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php This family has not finished
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans', [
  'headers' => [
    'X-APP-SECRET' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp This family has not finished
using RestSharp;

var client = new RestClient("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans");
var request = new RestRequest(Method.GET);
request.AddHeader("X-APP-SECRET", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift This family has not finished
import Foundation

let headers = ["X-APP-SECRET": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/financial/v1/loans")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```