Spain's company registry gazette (BORME): more than 9.6 million events since 2009. API key or OAuth.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your BORME API key. Leave it out to use the free plan.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Find the Spanish company a brand or trading name is linked to, by holder name. Searches the patent office's trademarks and commercial names (1987 to today), which BORME does not print, and returns for each the company whose name matches the holder name the office published. `commercial_name` identifies a business; `trademark` distinguishes goods or services (NESCAFÉ is not another name for Nestlé). Say which kind a hit is; do not say a company "is called" X when X is one of its products. Links are made on a normalised company name only (the office publishes no tax IDs) and only where exactly one company or registry sheet fits: present a hit as a name match, not confirmed ownership. On a hit, use company_history with the slug. Needs the basic plan or higher: send your API key in the X-API-Key header (https://bormeapi.com/account).
Brand or trading name, or part of it.
Maximum results, 1-200 (default 20).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Find the Spanish company a brand or trading name is linked to, by holder name. Searches the patent office's trademarks and commercial names (1987 to today), which BORME does not print, and returns for each the company whose name matches the holder name the office published. `commercial_name` identifies a business; `trademark` distinguishes goods or services (NESCAFÉ is not another name for Nestlé). Say which kind a hit is; do not say a company "is called" X when X is one of its products. Links are made on a normalised company name only (the office publishes no tax IDs) and only where exactly one company or registry sheet fits: present a hit as a name match, not confirmed ownership. On a hit, use company_history with the slug. Needs the basic plan or higher: send your API key in the X-API-Key header (https://bormeapi.com/account).
| Argument | Type | Description |
|---|---|---|
| brand* | string | Brand or trading name, or part of it. |
| limit | integer | Maximum results, 1-200 (default 20). |
{
"type": "object",
"title": "brand_ownerArguments",
"required": [
"brand"
],
"properties": {
"brand": {
"type": "string",
"title": "Brand",
"description": "Brand or trading name, or part of it."
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 20,
"description": "Maximum results, 1-200 (default 20)."
}
}
}Trademarks and trading names linked to one company by name (slug from company_history). Answers "which trading names and trademarks does the patent office list under a holder of this company's name". The office publishes no tax IDs, so every link is a name match, not confirmed ownership. Commercial names identify a business; trademarks distinguish goods or services. An empty result is ordinary — most companies have neither on file. `limit` applies to each kind separately (newest first), so trademarks never push trading names out. `counts` is how many of each kind this answer lists, not the company's total: when `truncated` is true for a kind, more are linked than were returned — raise `limit` to see them. Needs the basic plan or higher: send your API key in the X-API-Key header (https://bormeapi.com/account).
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum results per kind (trademarks, trading names), 1-200 (default 50). |
| company* | string | Company slug, as returned by search_companies or company_history. |
{
"type": "object",
"title": "company_brandsArguments",
"required": [
"company"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 50,
"description": "Maximum results per kind (trademarks, trading names), 1-200 (default 50)."
},
"company": {
"type": "string",
"title": "Company",
"description": "Company slug, as returned by search_companies or company_history."
}
}
}Look up a Spanish company by its NIF/CIF tax ID. Needs the basic plan or higher: send your API key in the X-API-Key header (https://bormeapi.com/account). BORME itself has no dedicated tax-ID field: the mapping is cross-referenced from open official sources and, in some cases, taken from the text of BORME notices (more than 580,000 NIF mappings from public sources, still a minority of companies). A miss means "not matched yet", not "does not exist". On a hit, use company_history with the returned slug. If nif_caveat is present, say so and do not present the mapping as settled. A miss with reason "nif_check_character_failed" is an identifier never issued to anyone: relay that, the corrected identifier and did_you_mean. A miss with reason "not_registry_entity" has entity_type (the kind of entity or person): explain it as the response's note does. If ambiguous is true, list the candidates and ask which company is meant (records on one registry sheet in one province are one company).
| Argument | Type | Description |
|---|---|---|
| nif* | string | NIF/CIF, e.g. B12345674. Spaces, hyphens, dots and the ES VAT prefix (ESB12345674) are accepted; other country prefixes are not. |
{
"type": "object",
"title": "company_by_nifArguments",
"required": [
"nif"
],
"properties": {
"nif": {
"type": "string",
"title": "Nif",
"description": "NIF/CIF, e.g. B12345674. Spaces, hyphens, dots and the ES VAT prefix (ESB12345674) are accepted; other country prefixes are not."
}
}
}Registry timeline for one company, as JSON. `company` is a slug or a name; a name with several matches returns the candidate slugs instead. An older slug of a merged company returns the merged company's whole timeline: company_slug is the current slug, former_slugs the others, and each event keeps the slug it was printed under. total_events, first_seen and last_seen describe the whole timeline within your plan's window, not just this page; truncated is true when the page holds fewer events than total_events, and next_offset starts the next page (null on the last). Page with order and offset. Without an API key this is the free plan: only the last 7 days. Send your key in the X-API-Key header (https://bormeapi.com/account) for your plan's window (full history back to 2009 on pro).
| Argument | Type | Description |
|---|---|---|
| limit | integer | Events per page, 1-200 (default 100). |
| order | string | "desc" (default, newest first) or "asc" (oldest first). |
| offset | integer | Events to skip, 0-10000, in steps of limit. |
| company* | string | Company slug (e.g. vaz-metales-sl) or name; a name falls back to a case-insensitive search (at least 3 letters or digits). |
{
"type": "object",
"title": "company_historyArguments",
"required": [
"company"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 100,
"description": "Events per page, 1-200 (default 100)."
},
"order": {
"type": "string",
"title": "Order",
"default": "desc",
"description": "\"desc\" (default, newest first) or \"asc\" (oldest first)."
},
"offset": {
"type": "integer",
"title": "Offset",
"default": 0,
"description": "Events to skip, 0-10000, in steps of limit."
},
"company": {
"type": "string",
"title": "Company",
"description": "Company slug (e.g. vaz-metales-sl) or name; a name falls back to a case-insensitive search (at least 3 letters or digits)."
}
}
}Digest of one BORME publication day: totals by event type, top provinces, and `insolvencies`: every event of the day whose act types include INSOLVENCY_DECLARATION or INSOLVENCY_STATUS, with company and province only (SUSPENSION_OF_PAYMENTS, BANKRUPTCY_LEGACY and PROVISIONAL_SHEET_CLOSURE_INSOLVENCY are not listed). An INSOLVENCY_STATUS (Situación concursal) notice can record any stage of the proceedings, from a request for a declaration to the conclusion. Call the entries insolvency-proceedings notices; before saying a company was declared insolvent, read its act's payload with search_events (date_from = date_to = that day, both act types, company_name_contains). Without an API key this is the free plan: only publication days within the last 7 days. Send your key in the X-API-Key header (https://bormeapi.com/account) for your plan's window.
| Argument | Type | Description |
|---|---|---|
| date | string | Publication day, YYYY-MM-DD; omit for the latest day in the database. |
{
"type": "object",
"title": "daily_digestArguments",
"properties": {
"date": {
"type": "string",
"title": "Date",
"description": "Publication day, YYYY-MM-DD; omit for the latest day in the database."
}
}
}All normalized event types: the enum (act_type), the original Spanish label (spanish) and its English label (english).
No arguments.
{
"type": "object",
"title": "list_act_typesArguments",
"properties": {}
}Sample of the latest derived risk signals (last 7 publication days, max 10 rows). Types: INSOLVENCY_FILED, ACCORDION, MASS_EXIT, OWNERSHIP_CHANGE, DISTRESS_COMBO, PHOENIX, ADDRESS_CLUSTER, AEAT_DEBTOR, PUBLIC_CONTRACT_AWARD. AEAT_DEBTOR comes from the AEAT's yearly debtors list (art. 95 bis LGT): details carry listed_on, list_year and is_current_list (true for 12 months from listed_on, a window this API sets). debt_eur is the published total of tax debts and penalties at 31 December of the year before publication. Say the company was on the list published on that date; never say the debt is still outstanding. Only companies in the Registro Mercantil matched by NIF are covered. Needs the risk plan: send your API key in the X-API-Key header (https://bormeapi.com/account). The full history is in the hosted API's /v1/signals.
| Argument | Type | Description |
|---|---|---|
| signal_type | string | One signal type to filter by (see the tool description); omit for all types. |
{
"type": "object",
"title": "recent_signalsArguments",
"properties": {
"signal_type": {
"type": "string",
"title": "Signal Type",
"description": "One signal type to filter by (see the tool description); omit for all types."
}
}
}Coverage and freshness report for the BORME dataset behind this server. Returns a JSON object with: events_approx and companies_approx (planner estimates, not exact tallies), coverage {from, to} (first and latest publication day held, YYYY-MM-DD), parse_completeness_last_30d (share of gazette text successfully structured over the last 30 publication days, e.g. 0.9987) and source. Open to everyone; no key needed. Use this to answer "how much data is there?", "how fresh is it?" and "can I trust date filters for period X?" before running searches. Takes no arguments; counts are estimates (fast reads), not exact tallies.
No arguments.
{
"type": "object",
"title": "registry_statsArguments",
"properties": {}
}Find Spanish companies by name and return ranked company cards (slug, status, province). Use it first when the user gives a company name, then company_history with the slug. Matches current names, former names and name variants, ignoring accents, case, punctuation and the legal form. Each card's `match` is exact, prefix, contains or fuzzy (only when nothing else matched: a lead, not an identification; say so); `matched_on` says which name matched. Ranked by match, then active companies first, then the newest act. Plans: the free plan's events cover 7 days, but this search is not limited by history. Without a key a search shows 5 cards and `hidden_by_plan` counts the rest (`matches_beyond_limit`, a lower bound when `matches_is_at_least`): relay its note. The NIF is on the card from the basic plan up: send your key in the X-API-Key header. An empty answer is not proof that a business does not exist; relay the response's `note` in the user's language.
| Argument | Type | Description |
|---|---|---|
| name* | string | Company name or part of it, at least 3 letters or digits; accents, case, punctuation and legal form are ignored. |
| limit | integer | Cards per page, 1-50 (default 10). |
| offset | integer | Cards to skip. At most 200 cards are ranked; truncated true means more candidates existed, so add another word from the name. |
| status | string | One of active, dissolved, extinct, sheet_closed; applied like province. |
| province | string | The company's province, accent-insensitive, e.g. MADRID, VIZCAYA, or an autonomous community for all of its provinces, e.g. Catalonia; several values can be separated by commas, e.g. BIZKAIA,GIPUZKOA. Applied to the candidates the search reads (2,000 with a filter), so a broad name can return fewer companies than match it. |
Search Spanish commercial-registry (BORME) events, newest first, as JSON. All filters are optional (see each parameter); coverage starts in 2009. Returns at most `limit` events. Barcelona prints some acts as free text under "Otros conceptos": recognised wording gets its own act type (act_type_raw stays "Otros conceptos"; fields.shareholder names a sole shareholder when the text does), and a same-entry revocation and reappointment becomes RE_ELECTIONS. Reprocessed events keep their event_id, but their acts can change. Without an API key this is the free plan: only the last 7 days, stated in plan_window. Send your key in the X-API-Key header (https://bormeapi.com/account) for your plan's window (full history on pro). An empty page may carry hidden_by_plan: matches before the plan's window (matches_before_window, matches_is_at_least, newest_hidden_date) and a note to pass on. Do not infer from an empty page that no matching events exist.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum events returned, 1-200 (default 50). |
| date_to | string | Latest publication date, YYYY-MM-DD, inclusive. |
| act_types | array | Act types, e.g. INCORPORATION, APPOINTMENTS, TERMINATIONS, CAPITAL_INCREASE, DISSOLUTION, INSOLVENCY_STATUS (full list: list_act_types). |
| date_from | string | Earliest publication date, YYYY-MM-DD (data starts in 2009). |
| provinces | array | BORME province names, accent- and case-insensitive, e.g. MADRID, CADIZ, VIZCAYA. An autonomous community stands for all of its provinces, e.g. Basque Country, Cataluña, Andalucía. |
{
"type": "object",
"title": "search_companiesArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name",
"description": "Company name or part of it, at least 3 letters or digits; accents, case, punctuation and legal form are ignored."
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"description": "Cards per page, 1-50 (default 10)."
},
"offset": {
"type": "integer",
"title": "Offset",
"default": 0,
"description": "Cards to skip. At most 200 cards are ranked; truncated true means more candidates existed, so add another word from the name."
},
"status": {
"type": "string",
"title": "Status",
"description": "One of active, dissolved, extinct, sheet_closed; applied like province."
},
"province": {
"type": "string",
"title": "Province",
"description": "The company's province, accent-insensitive, e.g. MADRID, VIZCAYA, or an autonomous community for all of its provinces, e.g. Catalonia; several values can be separated by commas, e.g. BIZKAIA,GIPUZKOA. Applied to the candidates the search reads (2,000 with a filter), so a broad name can return fewer companies than match it."
}
}
}| company_name_contains |
| string |
| Part of the company name, at least 3 letters or digits, case-insensitive; % and _ match literally. |
{
"type": "object",
"title": "search_eventsArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 50,
"description": "Maximum events returned, 1-200 (default 50)."
},
"date_to": {
"type": "string",
"title": "Date To",
"description": "Latest publication date, YYYY-MM-DD, inclusive."
},
"act_types": {
"type": "array",
"items": {
"type": "string"
},
"title": "Act Types",
"description": "Act types, e.g. INCORPORATION, APPOINTMENTS, TERMINATIONS, CAPITAL_INCREASE, DISSOLUTION, INSOLVENCY_STATUS (full list: list_act_types)."
},
"date_from": {
"type": "string",
"title": "Date From",
"description": "Earliest publication date, YYYY-MM-DD (data starts in 2009)."
},
"provinces": {
"type": "array",
"items": {
"type": "string"
},
"title": "Provinces",
"description": "BORME province names, accent- and case-insensitive, e.g. MADRID, CADIZ, VIZCAYA. An autonomous community stands for all of its provinces, e.g. Basque Country, Cataluña, Andalucía."
},
"company_name_contains": {
"type": "string",
"title": "Company Name Contains",
"description": "Part of the company name, at least 3 letters or digits, case-insensitive; % and _ match literally."
}
}
}