> 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.

# Credit registry

GET https://clients.infonite.tech/api/executions/results/{execution_id}/public/v1/credit/registry

Your customer's risk position at the Banco de España's credit registry (CIRBE).

Every loan, credit line and guarantee above the reporting threshold, entity by entity. It is the reference document for indebtedness analysis, and the one that shows debt your own institution cannot see. Field by field in [Credit Registry](/guides/data-models/credit-registry). The official report travels as a [document](https://infonite.dev/direct-executions/api-reference/direct-executions-api/fetching-the-results/attachments/direct-executions-v-1-results-attachments-list) of the execution.

**This source is slow by nature.** The registry produces its report on its own schedule rather than in real time, so an execution that includes this feature can take substantially longer than one that does not — and the widget-side flow even lets your customer go before it answers. Plan for a webhook rather than a polling loop, and do not size your timeout on the other features.

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

| Status | Meaning                                                                                                                             |
| :----- | :---------------------------------------------------------------------------------------------------------------------------------- |
| `200`  | The registry position.                                                                                                              |
| `202`  | `feature_not_ready` — `credit_registry_data` is still running. **Only this family waits**: the ones that already closed answer now. |
| `204`  | The execution never asked for `credit_registry_data`, or it did and the source had nothing to give. No body either way.             |
| `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/public-administration/direct-executions-v-1-results-public-credit-registry

## 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**What the central credit register holds on your customer: the risks declared by the institutions that lent to them, by kind and amount. It is the view of their borrowing that does not depend on which bank you asked. **An empty list is an answer, not a gap**: the feature ran and the source reported none.

- `list of EUCreditRegistryDataSchema`

### 202

**202 Accepted**`feature_not_ready`: `credit_registry_data` 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

### EUCreditRegistryDataSchema

The holder's risk position at a central credit register: in Spain, the Bank of Spain's CIRBE report, detailed (one row per operation and entity) or aggregated (operations grouped, no entities). Every key the register prints comes twice: as its meaning (an enum, the same whatever the report's period) and as the printed code (the `*_code` fields). Every amount is always present. One the report did not give — when the report could not be read — comes with currency `***` and amount `NaN`: unknown, never zero.

- `product` ("credit_registry_data", required) — The product type identifier.
- `sub_family` (enum, required) — Which report this is: detailed or aggregated — what the document turned out to be, not what was requested. A holder with nothing declared to the register only ever gets the aggregated report.
  - Allowed values: `credit_registry_data:es_cirbe_detailed`, `credit_registry_data:es_cirbe_aggregated`
- `fetch_date` (string, required) — Date this product was fetched.
- `country` (string, required) — Country of the credit registry.
- `report_month` (string, required) — Period the operations correspond to, `MM-YYYY`.
- `holder_code` (string, optional) — The holder's code exactly as the report prints it (e.g. `ES44444444A`). Not reported when the report could not be read.
- `holder_name` (string, optional) — Full name or business name of the holder, as the report prints it. Not reported when the report could not be read: the attached report is then the only reference.
- `identifier` (IdentificationNumberSchema, optional) — The holder's national identifier, from the report's holder code. Not reported when the report could not be read.
- `consultation_date` (string, optional, nullable) — When the register's data was taken, as the report states it.
- `total_drawn` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Total drawn across every operation in the system. In an aggregated report, exact to the thousand.
- `total_overdue` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Total overdue across every operation in the system.
- `total_arrears` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Total default interest and enforceable expenses in the system.
- `total_risk_available` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Total still available to draw in the system.
- `operations` (list of OperationSchema, optional, default: []) — The operations: one per operation in a detailed report, one per group in an aggregated one.
- `minor_risks` (list of MinorRiskSchema, optional, default: []) — Entities whose accumulated risk is below the reporting threshold. Detailed reports only.
- `attachments` (list of FileAttachmentSchema, optional, default: []) — The original report (PDF).

### ValidationError

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

### IdentificationNumberSchema

One identification document: its type, its value, and whether the value passed validation.

- `type` (enum, required) — Kind of document the number belongs to (e.g. a national ID, passport, tax ID, or Social Security number).
  - Allowed values: `unknown`, `es:dni`, `es:nie`, `es:cif`, `es:ssn`, `co:cc`, `co:ce`, `co:nit`, `co:ti`
- `value` (string, required) — The number itself, as reported by the source.
- `validated` (boolean, required) — True when the value passed the platform's format and check-digit validation. It vouches for the NUMBER being well-formed — not for the official status of the document behind it.
- `country` (string, optional, nullable) — Country that issued the number, as a two-letter ISO code.
- `valid_until` (date, optional) — Expiry date of the document, when the source reports it.

### 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

### OperationSchema

- `currency` (string, required) — Currency the operation is contracted in. `XXX` means "other currencies".
- `entity_name` (string, optional, nullable) — Name of the reporting entity. Detailed reports only.
- `entity_code` (string, optional, nullable) — Bank of Spain code of the reporting entity (e.g. `0182`). Detailed reports only.
- `operation_code` (string, optional, nullable) — Unique code of the operation, as the entity reports it. Detailed reports only.
- `product_type` (enum, optional, nullable) — Type of product: a loan, a lease, a guarantee… Empty only if the code is new to us; see `product_type_code`.
  - Allowed values: `securities_lending`, `trade_credit_with_recourse`, `trade_credit_without_recourse`, `trade_receivables`, `financial_credit`, `financial_lease`, `reverse_repurchase_agreement`, `debt_securities`, `financial_guarantee`, `forward_deposit`, `non_financial_guarantee`, `irrevocable_documentary_credit`, `available_in_other_commitments`, `overdraft`, `credit_card_debt`, `deposit`, `revolving_credit`, `credit_line`, `other_loans`
- `product_type_code` (string, optional, nullable) — Product code as printed (e.g. `V32`).
- `intervention_nature` (enum, optional, nullable) — How the holder takes part: as the direct obligor, or as a guarantor of someone else's operation.
  - Allowed values: `direct_holder`, `guarantor`, `bill_signatory`
- `intervention_nature_code` (string, optional, nullable) — Intervention code as printed (e.g. `T11`).
- `collective_status` (enum, optional, nullable) — Whether the holder answers jointly and severally, or collectively, with others. Empty when neither.
  - Allowed values: `joint_and_several`, `collective`, `not_joint_and_several`
- `collective_status_code` (string, optional, nullable) — Code as printed (e.g. `T33`).
- `participants_number` (integer, optional, nullable) — Number of participants in a joint and several or collective operation.
- `maturity_type` (enum, optional, nullable) — Time left to maturity at the report's date.
  - Allowed values: `up_to_three_months`, `three_months_to_one_year`, `one_to_five_years`, `over_five_years`, `indeterminate`
- `maturity_type_code` (string, optional, nullable) — Maturity code as printed (e.g. `L08`).
- `real_guarantee_type` (enum, optional, nullable) — Main real guarantee (collateral): a mortgage, a pledge… or `none`.
  - Allowed values: `none`, `financial_assets_pledge`, `real_estate_mortgage`, `other_real_guarantee`, `life_insurance_pledge`, `other_physical_collateral`, `credit_derivatives`, `financial_guarantee_other_than_credit_derivatives`, `other_protection`, `residential_real_estate`, `offices_and_commercial_premises`, `commercial_real_estate`, `debt_securities`, `gold`, `cash_and_deposits`, `loans`, `trade_receivables`, `equity_and_investment_fund_shares`
- `real_guarantee_type_code` (string, optional, nullable) — Code as printed (e.g. `G19`).
- `real_guarantee_coverage` (enum, optional, nullable) — Whether the real guarantee covers all of the risk or part of it. Empty when there is no guarantee.
  - Allowed values: `total`, `partial`
- `real_guarantee_coverage_code` (string, optional, nullable) — Code as printed (e.g. `E14`).
- `personal_guarantee_type` (enum, optional, nullable) — Main personal guarantee beyond the holders' own, or `none`.
  - Allowed values: `none`, `public_administration`, `other_personal_guarantee`, `reporting_entity`, `public_credit_insurer`, `unspecified`
- `personal_guarantee_type_code` (string, optional, nullable) — Code as printed (e.g. `G10`). Empty when there is no personal guarantee.
- `personal_guarantee_coverage` (enum, optional, nullable) — Whether the personal guarantee covers all of the risk or part of it.
  - Allowed values: `total`, `partial`
- `personal_guarantee_coverage_code` (string, optional, nullable) — Code as printed (e.g. `E15`).
- `operation_status` (enum, optional, nullable) — Special situation of the operation: refinanced, in default, written off… `standard` when none applies.
  - Allowed values: `standard`, `restructured_under_rdl_6_2012`, `refinanced_or_restructured`, `creditors_agreement`, `default_90_days_to_4_years`, `default_over_4_years`, `written_off`
- `operation_status_code` (string, optional, nullable) — Code as printed (e.g. `I19`). Empty when no special situation applies.
- `total_drawn` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Amount drawn, overdue amounts included. In an aggregated report, exact to the thousand.
- `overdue` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Part of the drawn amount that is overdue, with a first default over 90 days old.
- `arrears` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Part of the overdue amount that is default interest and enforceable expenses.
- `risk_available` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — Amount still available to draw.

### MinorRiskSchema

- `entity_name` (string, required) — Name of an entity whose accumulated risk with the holder is below the reporting threshold.
- `entity_code` (string, optional, nullable) — Bank of Spain code of the entity.
- `limit_amount` (infonite__schemas__utils__CurrencyAmountSchema__1, optional) — The reporting threshold: 1,000 EUR from period 01-2021, 9,000 EUR before.

### FileAttachmentSchema

A document attached to a result — an official report, a receipt, an invoice... The entry describes the file; its bytes are downloaded with `id`, through the attachments endpoint of the API that returned the result.

- `sub_family` (enum, required) — What kind of document this is (e.g. `attachment:es-tgss-life-report`).
  - Allowed values: `attachment:attachment`, `attachment:supplier_invoice`, `attachment:client_invoice`, `attachment:es-tgss-life-report`, `attachment:es-tgss-contribution-base-report`, `attachment:es-aeat-model-100`, `attachment:es-cirbe-report`, `attachment:sepa-direct-debit-bill`, `attachment:person-certified-photo`
- `id` (string, required) — Attachment identifier — what the attachments endpoint of the API that returned the result takes to download the file.
- `content_name` (string, required) — File name of the document.
- `content_type` (string, required) — MIME type of the content.
- `metadata` (map from string to any, required) — Extra facts about the document, as simple key-value pairs (e.g. its official verification code, its issue date).
- `product` ("attachment", optional, default: attachment) — The product type identifier. Always `attachment`.
- `content_hash` (string, optional) — Fingerprint of the content, to verify its integrity.

### ValidationErrorLocItems

- string
- integer

### ValidationErrorCtx

### InfoniteSchemasUtilsCurrencyAmountSchema1Currency

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

- string
- "***"

## Examples

### The CIRBE position, entity by entity

**Response**

```json
[
  {
    "product": "credit_registry_data",
    "sub_family": "credit_registry_data:es_cirbe_detailed",
    "fetch_date": "2026-09-12T01:28:15+00:00",
    "country": "ES",
    "report_month": "08-2026",
    "holder_code": "ES44444444A",
    "holder_name": "LISANDRO TAPIA BERENGUER",
    "identifier": {
      "type": "es:dni",
      "value": "44444444A",
      "validated": true,
      "country": "ES"
    },
    "consultation_date": "2026-09-12T01:28:15+00:00",
    "total_drawn": {
      "currency": "EUR",
      "amount": "1500.00"
    },
    "total_overdue": {
      "currency": "EUR",
      "amount": "0.00"
    },
    "total_arrears": {
      "currency": "EUR",
      "amount": "0.00"
    },
    "total_risk_available": {
      "currency": "EUR",
      "amount": "3500.00"
    },
    "operations": [
      {
        "currency": "EUR",
        "entity_name": "BANCO SANTANDER, S.A.",
        "entity_code": "0049",
        "operation_code": "00490000000000000000001234",
        "product_type": "financial_credit",
        "product_type_code": "V32",
        "intervention_nature": "direct_holder",
        "intervention_nature_code": "T11",
        "collective_status": "joint_and_several",
        "collective_status_code": "T33",
        "participants_number": 2,
        "maturity_type": "up_to_three_months",
        "maturity_type_code": "L08",
        "real_guarantee_type": "none",
        "real_guarantee_type_code": "G19",
        "personal_guarantee_type": "none",
        "operation_status": "standard",
        "total_drawn": {
          "currency": "EUR",
          "amount": "1500.00"
        },
        "overdue": {
          "currency": "EUR",
          "amount": "0.00"
        },
        "arrears": {
          "currency": "EUR",
          "amount": "0.00"
        },
        "risk_available": {
          "currency": "EUR",
          "amount": "3500.00"
        }
      }
    ],
    "minor_risks": [
      {
        "entity_name": "COFIDIS S.A. SUCURSAL EN ESPAÑA",
        "entity_code": "2000",
        "limit_amount": {
          "currency": "EUR",
          "amount": "1000.00"
        }
      }
    ],
    "attachments": [
      {
        "sub_family": "attachment:es-cirbe-report",
        "id": "6aa74daf9f005f6719cb62df",
        "content_name": "cirbe_report_es_cirbe_detailed.pdf",
        "content_type": "application/pdf",
        "metadata": {
          "document-date": "2026-09-12T03:28:15.068346+02:00",
          "document-type": "attachment:es-cirbe-report",
          "signature-certificate-authority": "BANCO DE ESPAÑA-AC CORPORATIVA V2",
          "signature-date": "2026-09-12T03:28:15.068346+02:00",
          "signature-organization": "BANCO DE ESPAÑA",
          "signature-signer": "[DEMO] CIR CENTRAL DE INFORMACION DE RIESGOS",
          "signature-status": "valid",
          "signature-verified": true
        },
        "product": "attachment",
        "content_hash": "80b3ad5dc1b5fec5eb7fb53ba9b9d6498ff4f2f13d82d50859445c22db0c1006c7fc66d817a17ba38523cd2b7f73a629281bb273b6081ae2c344a7c01ee195ec"
      }
    ]
  }
]
```

**SDK Code**

```python The CIRBE position, entity by entity
import requests

url = "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/credit/registry"

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

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

print(response.json())
```

```javascript The CIRBE position, entity by entity
const url = 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/credit/registry';
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 The CIRBE position, entity by entity
package main

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

func main() {

	url := "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/credit/registry"

	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 The CIRBE position, entity by entity
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/credit/registry")

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 The CIRBE position, entity by entity
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/public/v1/credit/registry")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php The CIRBE position, entity by entity
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

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

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

```csharp The CIRBE position, entity by entity
using RestSharp;

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

```swift The CIRBE position, entity by entity
import Foundation

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

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/public/v1/credit/registry")! 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/public/v1/credit/registry"

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/public/v1/credit/registry';
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/public/v1/credit/registry"

	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/public/v1/credit/registry")

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/public/v1/credit/registry")
  .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/public/v1/credit/registry', [
  '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/public/v1/credit/registry");
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/public/v1/credit/registry")! 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()
```