Use case

Spanish company due diligence by API (KYB)

Before contracting with a Spanish company, check in BORME data whether it is active, in insolvency, dissolved or struck off, what its capital is, who appears among its officers and what has been published lately, with a link to the official gazette behind every datum.

Access status

Access is open

Create your developer account, confirm your email and enable two-factor authentication (mandatory) to create your key. The library, calculators and deadlines do not use balance; companies and assistant come with 100 trial queries, no card needed.

Access will be for verified businesses worldwide.

Who it is for

  • Compliance and risk teams at companies, accounting firms and law firms that verify counterparties.
  • Fintechs and onboarding platforms for business customers that want to automate the first check.
  • Procurement and vendor teams: see a supplier’s status before signing and watch for changes afterwards.

How it works, step by step

  1. 1. Find the company

    Search by tax ID, registry sheet or name with GET /v1/dev/empresas. The response says how it understood the search and, if there are several matches, lists them with province and dates.

  2. 2. Read its profile

    With the identifier, GET /v1/dev/empresas/{empresaId} returns the status (active, insolvency, dissolved or struck off, with a date), the capital, the current officers and the latest filing with its gazette and official PDF.

  3. 3. Check the people

    With GET /v1/dev/personas and the person’s profile you see in which companies a name appears. The BORME does not publish national ID numbers: equal names can be different people and the response flags it. It never labels anyone.

  4. 4. Watch for news

    Each day query GET /v1/dev/boletines/{fecha} and GET /v1/dev/estado to know how far the data goes, and request again the profile of the companies you watch.

The operations

  • GET/empresas

    Search Spanish companies in the BORME by tax ID (CIF), registry sheet or name Details (Spanish)

    1 euro cent per query
  • GET/empresas/{empresaId}

    Company profile: status, capital, current officers and latest filing Details (Spanish)

    1 euro cent per query
  • GET/personas

    Search people in the BORME by name, with a homonym warning Details (Spanish)

    1 euro cent per query
  • GET/personas/{slug}

    Person profile: the companies where the name appears Details (Spanish)

    1 euro cent per query
  • GET/boletines/{fecha}

    What the BORME published on a date, by province, with the official PDF Details (Spanish)

    1 euro cent per query
  • GET/estado

    How far the BORME is loaded Details (Spanish)

    Free

Request and response examples

The examples read your key from the JURILIA_API_KEY environment variable.

Find the company

Replace q with the tax ID, the sheet or the name.

curl

curl "https://api.jurilia.com/v1/dev/empresas?q=acme&provincia=Madrid" \
  -H "Authorization: Bearer $JURILIA_API_KEY"

Python

import os
import requests

r = requests.get(
    "https://api.jurilia.com/v1/dev/empresas",
    headers={"Authorization": f"Bearer {os.environ['JURILIA_API_KEY']}"},
    params={"q":"acme","provincia":"Madrid"},
    timeout=30,
)
r.raise_for_status()
print(r.json())

JavaScript

const url = new URL("https://api.jurilia.com/v1/dev/empresas");
url.search = new URLSearchParams({"q":"acme","provincia":"Madrid"});
const r = await fetch(url, {
  headers: { Authorization: `Bearer ${process.env.JURILIA_API_KEY}` },
});
if (!r.ok) throw new Error(`HTTP ${r.status}`);
console.log(await r.json());

Response (the shape; the values are examples)

{
  "tipo": "nombre",
  "sugerencia": null,
  "empresas": [
    {
      "id": "1234567",
      "denominacion": "ACME SOCIEDAD LIMITADA",
      "provincia": "Madrid",
      "hoja": "M 167931",
      "titular": "sociedad",
      "primeraPublicacion": "2010-03-15",
      "ultimaPublicacion": "2026-06-02",
      "concursalPublicadoEn": null,
      "disolucionPublicadaEn": null,
      "extincionPublicadaEn": null,
      "nombreQueCasa": null
    }
  ]
}

The values are illustrative so you can see the exact shape of the response; they are not data from a real query.

Its profile, with the latest filing

Status, capital, current officers and the official gazette.

curl

curl "https://api.jurilia.com/v1/dev/empresas/1234567" \
  -H "Authorization: Bearer $JURILIA_API_KEY"

Python

import os
import requests

r = requests.get(
    "https://api.jurilia.com/v1/dev/empresas/1234567",
    headers={"Authorization": f"Bearer {os.environ['JURILIA_API_KEY']}"},
    timeout=30,
)
r.raise_for_status()
print(r.json())

JavaScript

const url = new URL("https://api.jurilia.com/v1/dev/empresas/1234567");
const r = await fetch(url, {
  headers: { Authorization: `Bearer ${process.env.JURILIA_API_KEY}` },
});
if (!r.ok) throw new Error(`HTTP ${r.status}`);
console.log(await r.json());

Response (the shape; the values are examples)

{
  "id": "1234567",
  "denominacion": "ACME SOCIEDAD LIMITADA",
  "provincia": "Madrid",
  "hoja": "M 167931",
  "titular": "sociedad",
  "situacion": "activa",
  "situacionFecha": null,
  "constitucionFecha": "2010-03-15",
  "primeraPublicacion": "2010-03-15",
  "ultimaPublicacion": "2026-06-02",
  "capitalCentimos": 300000,
  "totalInscripciones": 14,
  "denominaciones": [],
  "cargosVigentes": [{ "cargo": "Administrador único", "nombre": "…" }],
  "ultimaInscripcion": {
    "fecha": "2026-06-02",
    "boletin": "BORME-A-2026-104-12",
    "urlPdf": "https://www.boe.es/borme/dias/2026/06/02/pdfs/…pdf",
    "actos": [{ "tipo": "cambio_de_administradores", "etiqueta": null }]
  }
}

The values are illustrative so you can see the exact shape of the response; they are not data from a real query.

Where a name appears

With the homonym warning.

curl

curl "https://api.jurilia.com/v1/dev/personas?q=juan+perez" \
  -H "Authorization: Bearer $JURILIA_API_KEY"

Python

import os
import requests

r = requests.get(
    "https://api.jurilia.com/v1/dev/personas",
    headers={"Authorization": f"Bearer {os.environ['JURILIA_API_KEY']}"},
    params={"q":"juan perez"},
    timeout=30,
)
r.raise_for_status()
print(r.json())

JavaScript

const url = new URL("https://api.jurilia.com/v1/dev/personas");
url.search = new URLSearchParams({"q":"juan perez"});
const r = await fetch(url, {
  headers: { Authorization: `Bearer ${process.env.JURILIA_API_KEY}` },
});
if (!r.ok) throw new Error(`HTTP ${r.status}`);
console.log(await r.json());

Response (the shape; the values are examples)

{
  "personas": [
    {
      "slug": "juan-perez-garcia",
      "nombre": "JUAN PÉREZ GARCÍA",
      "empresas": 2,
      "ultimaAparicion": "2026-05-10",
      "homonimos": "posibles"
    }
  ]
}

The values are illustrative so you can see the exact shape of the response; they are not data from a real query.

Why you can trust what it returns

Every datum, with its gazette

The latest filing of each profile links the gazette and the official PDF: you can show where what you decide on comes from.

Facts, not labels

Only the published fact and its citation. The API does not qualify any person or company.

One more source, not a verdict

It works as a documented check inside your procedure; the decision remains yours.

Limits and what it does not do

  • It is a data source, not a certification or a compliance service: it does not include sanctions lists, lists of politically exposed persons or annual accounts.
  • It is information published in the gazette, not a Commercial Registry certificate.
  • Homonyms are possible: a name does not identify a person.
  • Only what is loaded: /estado says up to which day.
  • 120 calls per minute per key.

Price

The first 100 company and assistant queries are a one-time trial, shared between the two. After that, 1 euro cent per query, from a prepaid balance bought in packages, with no subscription and no expiry. With no balance the call is not served (402) and no debt is ever created.

Authentication and errors

Every call carries the key of your developer account in the header Authorization: Bearer iuris_sk_…. The base address is https://api.jurilia.com. There is a limit of 120 calls per minute per key, with the headers X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset on every response. A key can carry an allow-list of IPs or networks (CIDR).

Failures come as JSON with a stable code: 401 (missing or invalid key), 402 (no balance: not served and not charged), 403 (IP not allowed), 409 (a datum that decides the calculation is missing: not charged) and 429 (too many calls in a row).

Frequently asked questions

What can I check about a Spanish company with this API?
Its status (active, insolvency, dissolved or struck off), its capital, its current officers and its latest filing with the official gazette, according to the BORME.
Does it satisfy anti-money-laundering requirements?
It is a data source for your own due-diligence procedure, not a compliance service or a certification. It does not include sanctions lists or lists of politically exposed persons.
How do I watch for changes in a company?
Query the news each day (GET /v1/dev/boletines/{fecha}) and request again the profile of the companies you watch. GET /v1/dev/estado tells you up to which day the BORME is loaded.
How much does it cost to check a company?
A search and a profile are two queries: 1 euro cent each after the trial of 100 queries.