Use case

Spanish company data for your CRM or ERP

Keep the tax ID of your customer or supplier and complete its profile with BORME data: name, province, status, capital and current officers. And keep it up to date by requesting it again when needed.

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

  • Product teams at CRM, ERP, invoicing and operations software who want to enrich Spanish company records.
  • Accounting and advisory firms that maintain client portfolios and want to detect changes.
  • Integrators who connect a client’s software with official data.

How it works, step by step

  1. 1. Search by tax ID

    With GET /v1/dev/empresas?q=<CIF> you get the company identifier. Store it next to the tax ID in your record.

  2. 2. Complete the profile

    With GET /v1/dev/empresas/{empresaId} you bring name, province, status, capital in euro cents, current officers and the latest filing with its gazette.

  3. 3. Keep it up to date

    Request the profile again when it suits you (when the customer is opened, or weekly) and compare with what you stored. A thousand companies, with one search and one profile each, are 2,000 queries: €20 of balance at the current price.

  4. 4. Flag relevant changes

    The status (situacion) and the date of the latest filing tell you whether something has changed; the linked gazette shows where it comes from.

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/provincias

    Provinces with at least one BORME gazette loaded Details (Spanish)

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

Search by name or tax ID

The response carries the identifier you need for the profile.

curl

curl "https://api.jurilia.com/v1/dev/empresas?q=acme&limite=5" \
  -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","limite":"5"},
    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","limite":"5"});
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.

Bring the profile

The fields are stable and money is in euro cents.

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.

Why you can trust what it returns

Stable JSON, no PDF reading

Fields with fixed names and types in the OpenAPI contract, so you can generate your client.

Per-query price

1 euro cent per query, with no monthly fee and no sales call.

The source, on every profile

The gazette and the official PDF of the latest filing.

Limits and what it does not do

  • Only what the BORME publishes: no phone, email, website, headcount or turnover.
  • It is information published in the gazette, not a registry certificate.
  • 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

Can I enrich my CRM with a company data API?
Yes: search by tax ID with GET /v1/dev/empresas, store the identifier and bring the profile with GET /v1/dev/empresas/{empresaId}: name, province, status, capital and current officers.
What data does it not bring?
Only what the BORME publishes: no phone, email, website, headcount or turnover.
How much does it cost to complete a thousand companies?
A search and a profile are two queries per company: 2,000 queries, €20 of balance at 1 euro cent per query, after the trial.
Is there an OpenAPI file to generate a client?
Yes: the reference documents the API’s OpenAPI 3.1 contract, which can be imported into the usual tools to generate a client.