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. 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. 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. Check the people
With
GET /v1/dev/personasand 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. Watch for news
Each day query
GET /v1/dev/boletines/{fecha}andGET /v1/dev/estadoto know how far the data goes, and request again the profile of the companies you watch.
The operations
- GET
/empresasSearch 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
/personasSearch 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
/estadoHow 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:
/estadosays 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/estadotells 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.
More APIs and use cases
Spanish company registry API (BORME)
Search Spanish companies by tax ID, sheet or name; get status, capital, officers and latest filing as JSON, gazette linked. 1 euro cent per query.
See the API →Company data for CRM and ERP
Complete and keep up to date the profile of a Spanish company from its tax ID with the BORME API: status, capital and officers as JSON. 1 euro cent per query.
See the API →Spanish legislation API
Ask for an article by citation (“ET 59”) on a date; get the consolidated text with its validity and official link. Versions and search. Free.
See the API →Content reviewed on 2026-10-06