BORME API
com.bormeapi/borme-mcpVersion 2.1.0Spain's company registry gazette (BORME): more than 9.6 million events since 2009. API key or OAuth.
Status
Responds159 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 13:50 UTC
- Latency
- 159 ms
- Remotes responding
- 2 of 2
- Sign-in
- OAuth sign-in, No sign-in
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 21:12 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://mcp.bormeapi.com/mcpResponds159 msNo sign-in
Claude Code
claude mcp add --transport http borme-mcp https://mcp.bormeapi.com/mcpClaude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: borme-mcp
Remote MCP server URL: https://mcp.bormeapi.com/mcpCursor
{
"mcpServers": {
"borme-mcp": {
"url": "https://mcp.bormeapi.com/mcp"
}
}
}VS Code
code --add-mcp '{"name":"borme-mcp","type":"http","url":"https://mcp.bormeapi.com/mcp"}'Streamable HTTP
https://mcp.bormeapi.com/mcp/oauthSign-in required222 msOAuth sign-in
Claude Code
This server asks for sign-in. Your client opens the sign-in when it connects.
claude mcp add --transport http borme-mcp https://mcp.bormeapi.com/mcp/oauthClaude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: borme-mcp
Remote MCP server URL: https://mcp.bormeapi.com/mcp/oauthCursor
{
"mcpServers": {
"borme-mcp": {
"url": "https://mcp.bormeapi.com/mcp/oauth"
}
}
}VS Code
code --add-mcp '{"name":"borme-mcp","type":"http","url":"https://mcp.bormeapi.com/mcp/oauth"}'Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
16 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
act_statsCount BORME acts by act type, period (month, quarter or year) and
province: how many companies and entries had mergers, spin-offs, capital
increases or any other act type, newest period first.
Use it for trends ("mergers per quarter in Spain since 2020"). To read
the acts themselves use search_events.
Returns JSON {grain, count, truncated, rows: [{period, act_type, province,
companies, events}], data_through, built_from, built_to, note,
plan_window}, plus hidden_by_plan when the plan left buckets out, and
not_built (no rows, never zeros) when the range reaches years outside
built_from..built_to. period is the bucket's first day by BORME
publication date. companies counts distinct companies in that bucket:
never add rows up. Province "*" is all of Spain; a community gives one row
per province, not a total.
Read-only; one request per call. Needs the pro plan or higher: send your
key in the X-API-Key header (https://bormeapi.com/account). | No | Yes | Yes | No |
brand_ownerFind the Spanish company a trademark or trading name is linked to, in the
Spanish patent office (OEPM) records we hold (since 1987).
Use it when the user names a brand; for a company's own name use
search_companies, for a known company's brands use company_brands.
Returns JSON {found, brand, matches: [{brand, kind, company_slug,
company_name, company_status, file}], truncated, source, note}: one match
per company and name; file is that name's newest OEPM file. kind
commercial_name identifies a business; trademark distinguishes goods or
services (NESCAFÉ is not another name for Nestlé): say which kind a hit is.
Links are holder-name matches (no tax IDs are published); ambiguous holders
stay unlinked: present a hit as a name match, not confirmed ownership.
found false is not proof the brand is unused. On a hit, use company_history
with the slug.
Read-only; one request per call. Needs the basic plan or higher: send your
API key in the X-API-Key header (https://bormeapi.com/account). | No | Yes | Yes | No |
company_brandsList the trademarks and trading names that the Spanish patent office (OEPM)
records under a holder with this company's name.
Use it with a slug from search_companies or company_history; to go from a
brand to its company use brand_owner.
Returns JSON {company_slug, commercial_names, trademarks (each {name, file,
status, since}), counts, truncated, limit_per_kind, source, note}: one
entry per OEPM file, so a name can repeat, the company's own name included.
No tax IDs are published: each link is a name match, not confirmed
ownership. An empty list means none is linked in our data, not that the
company holds none; {error, suggested_companies} means an unknown slug:
nothing was looked up. limit applies per kind, newest first; counts is what
this answer lists, not the company's total, and truncated true for a kind
means more are linked: raise limit.
Read-only; one request per call. Needs the basic plan or higher: send your
API key in the X-API-Key header (https://bormeapi.com/account). | No | Yes | Yes | No |
company_by_nifLook up a company by NIF/CIF. Use it for a tax ID; for names,
search_companies. On a hit, call company_history with company_slug.
Returns {found, company_slug, current_name, website, lei, nif_caveat, ...}; use
current_name. lei: GLEIF Legal Entity Identifier matched by NIF; null means
no match yet. website: newest BORME website act; null if none or
removed.
BORME has no dedicated tax-ID field: more than 580,000 NIF mappings from
public sources and the text of BORME notices cover a minority of companies.
reason nif_unmapped: not matched yet, not proof of absence.
reason nif_revoked: AEAT records a revocation; relay tell_the_user.
On a company match, relay nif_status.note if present.
invalid_input true: not a NIF/CIF.
reason nif_check_character_failed: relay tell_the_user and did_you_mean.
reason not_registry_entity: explain entity_type.
ambiguous true: ask which one. nif_caveat: say the link is not settled.
Read-only. Basic plan+. API key: X-API-Key
(https://bormeapi.com/account). | No | Yes | Yes | No |
company_groupGet a company's sole-shareholder network from links with no ending
identified in available BORME publications. Links do not establish
current ownership, control or a legal group. Use it for identified sole
shareholders or connected companies; use group_history for events. Name
lookup: multiple matches return {ambiguous: true, candidates}; none
return {error, suggested_companies}.
Returns {company_slug, parents (nearest first), top_parent_slug,
members: [{slug, name, province, status, owner_slug, depth, link_kind,
since, evidence: {event_id, date, text (excerpt, max 600 chars)}}],
unresolved, truncated, note}. The highest member has owner_slug,
link_kind, since and evidence null. Names not matched to exactly one
company appear as printed in unresolved; do not treat them as resolved
companies. Max 200 members. include_directors adds director links, not
members. Empty parents does not rule out control or a legal group.
Read-only. Pro plan; X-API-Key header. | No | Yes | Yes | No |
company_historyGet one company's BORME timeline: its published registry events within your
plan's window.
Use it once the company is known (a slug from search_companies or
company_by_nif); across many companies use search_events. A name is
searched too: several matches return {ambiguous: true, candidates}, none
returns {error, suggested_companies}.
Returns JSON {company_slug, total_events, first_seen, last_seen, truncated,
next_offset, count, events} (as in search_events), with former_slugs for
a merged company (an old slug returns the merged timeline) and
plan_window on a limited plan. total_events, first_seen and last_seen
cover the whole timeline in your window, not this page. To page,
keep limit and order and pass next_offset as offset (at most 10000)
until it is null.
Read-only; one request per call. Without an API key (X-API-Key header) only
the last 7 days; basic covers 365 days, pro and risk the full history
back to 2009. If all its events are outside your window, the refusal
counts them. | No | Yes | Yes | No |
company_signalsGet one company's derived signals within your plan's window, newest first:
the REST API's GET /v1/companies/{slug}/signals.
Use it for one company's ownership changes, mass exits, insolvency
declarations and the like; across all companies use recent_signals. A name
is searched as in
company_history: several matches return {ambiguous: true, candidates},
none returns {error, suggested_companies}.
Returns JSON {company_slug, total, count, next_offset, signals:
[{event_id, signal_type, date, company_slug, company_name, province,
details}]}, with former_slugs for a merged company (every slug is read),
and plan_window or hidden_by_plan when your plan's window applied: relay
their notes. AEAT_DEBTOR: say the company was on the list published on
that date, never that the debt is outstanding. count 0 is not proof of
good health.
Read-only; one request per call. Needs the pro plan or higher
(CONSOLIDATION and PE_ENTRY: risk); key in the X-API-Key header
(https://bormeapi.com/account). | No | Yes | Yes | No |
company_snapshotGet a company registry card, as in REST API GET /v1/companies/{slug}.
Use it for officers (current roles from published acts), sole_shareholder
as printed, capital_eur, address, status, NIF with its source, public_contracts
and a size_hint estimate. For dated acts use company_history.
Names are searched as in company_history: multiple matches return
{ambiguous: true, candidates, candidate_names with name, province and status};
no match returns {error, suggested_companies}.
Returns company_slug, current_name, nif, nif_caveat, sources and other card
fields; former_slugs for a merged company. lei: GLEIF Legal Entity Identifier
matched by NIF; null means no match yet. website: from the newest BORME act
about the company website; null if none or removed. BORME does not report
minority shareholdings, employee counts or revenue.
Read-only; one request per call. Requires basic plan or higher; send your
API key in X-API-Key (https://bormeapi.com/account). | No | Yes | Yes | No |
daily_digestSummarise one BORME publication day: total events, counts by act type, the
top 10 provinces and the day's insolvency-proceedings notices.
Use it for "what was published today" or a day's figures; to read the
notices use search_events with date_from = date_to = that day.
Returns JSON {date, total_events, by_type, top_provinces, insolvencies:
[{company, province}]}. insolvencies lists the events with
INSOLVENCY_DECLARATION or INSOLVENCY_STATUS (not SUSPENSION_OF_PAYMENTS,
BANKRUPTCY_LEGACY or PROVISIONAL_SHEET_CLOSURE_INSOLVENCY). An
INSOLVENCY_STATUS notice can record any stage, from a request for a
declaration to the conclusion: before saying a company was declared
insolvent, read the act's payload with search_events. A day without a
gazette (weekends, holidays) returns total_events 0.
Read-only; one request per call. Without an API key only days within the
last 7 days; send your key in the X-API-Key header
(https://bormeapi.com/account) for your plan's window. | No | Yes | Yes | No |
group_historyGet the BORME events of every company in the identified sole-shareholder
network (as company_group returns it), newest first, within your plan's
window.
Use it before a visit ("which BORME events were published this year for
companies in X's identified sole-shareholder network") or for the
published mergers, demergers and capital changes concerning companies in
the identified network; for one company use company_history. A name is searched as in company_group.
Returns JSON {company_slug, members, member_count, group_truncated,
count, offset, next_offset, events: [{event_id, date, borme_id, province,
company_name, company_slug, member_slug, acts, registral}]}, with
plan_window on a limited plan. member_slug is the group member the event
belongs to. To page, pass next_offset as offset until it is null.
Read-only. Needs the pro plan (X-API-Key header). | No | Yes | Yes | No |
list_act_typesList every normalized BORME act type: the enum used by the act_types filter
of search_events (act_type), its Spanish label (spanish) and its English
label (english).
Use it to choose act_types values or to translate act types in an answer; it
reads no registry data. Returns a JSON array of {act_type, spanish,
english}, sorted by act_type. Read-only, open to everyone, no key needed
and not counted against a quota. The same list is the resource
borme://act-types. | No | Yes | Yes | No |
recent_signalsGet a sample of the latest risk signals derived from BORME and public
sources: at most 10 rows dated within the last 7 days.
Use it for "what risk signals appeared this week"; not a per-company check
(use company_history) and not the full feed (the hosted API's
/v1/signals).
Returns JSON {count, window, sample_cap, signals: [{signal_type, date,
company_slug, company_name, province, details}], full_feed}. AEAT_DEBTOR
comes from the AEAT's yearly debtors list (art. 95 bis LGT): details
carry listed_on, list_year, is_current_list (true for 12 months from
listed_on) and debt_eur, the published total at 31 December of the prior
year. Say the company was on the list published on that date; never say
the debt is still outstanding. count 0 means none in the window, not
that a company is risk-free; an unknown signal_type is refused with the
valid list.
Read-only; one request per call. Needs the risk plan: send your API key in
the X-API-Key header (https://bormeapi.com/account). | No | Yes | Yes | No |
registry_statsReport the coverage and freshness of the BORME data behind this server.
Use it to answer "how much data is there?", "how fresh is it?" and "can I
trust date filters for period X?" before running searches; it says
nothing about any one company.
Returns JSON {events_approx, companies_approx, coverage: {from, to},
parse_completeness_last_30d, source}: exact event and company counts
from the latest hourly snapshot (planner estimates if no snapshot
exists), the first and latest publication day held (YYYY-MM-DD), and the event-weighted parse
completeness over the 30 days up to the latest run (e.g. 0.9987). Takes
no arguments. Read-only, open to everyone, no key needed and not counted
against a quota. The same report is the resource borme://coverage. | No | Yes | Yes | No |
search_companiesFind Spanish companies by name and return ranked company cards. Use it first
when the user gives a company name, then company_history with its
company_slug; with a tax ID use company_by_nif, with a brand use
brand_owner.
Matches current names, former names and variants, ignoring accents, case,
punctuation and the legal form. Returns JSON {query, count, total,
total_is_at_least, truncated, limit, offset, companies: [{company_slug,
name, legal_form, province, municipality, status, in_insolvency,
last_act_date, match, matched_on}]}. match is exact, prefix, contains or
fuzzy (a lead, not an identification; say so). Ranked by match, then
active companies, then newest act.
Read-only; one request per call; not limited by the free plan's 7 days of
history. The free plan shows at most the first 5 ranked cards;
hidden_by_plan counts the rest: relay its note. The NIF is on the card
from the basic plan up (X-API-Key header). An empty answer is not proof
that a business does not exist. | No | Yes | Yes | No |
search_eventsSearch BORME registry events (since 2009) across companies by publication
date, province, act type and company name, newest first.
Use it for questions about many companies ("insolvency notices in Valencia
in September"). For one known company use company_history; to find a
company use search_companies; for one day's totals use daily_digest.
Returns JSON {count, events: [{event_id, date, borme_id, province,
company_name, company_slug, acts: [{act_type, act_type_raw, roles,
payload}], registral}]}, plus company_name_match, plan_window and
hidden_by_plan when they apply. No next page: when count equals limit,
narrow the filters.
Read-only; one request per call against your daily quota. Without an API key
(X-API-Key header, https://bormeapi.com/account) only the last 7 days
are searched (plan_window). For an empty page with hidden_by_plan or
company_name_match (matched_companies or suggested_companies), relay its
note. Invalid dates, provinces or act types are refused with a reason. | No | Yes | Yes | No |
vat_checkCheck whether a VAT number was valid for intra-EU transactions according
to VIES, the European Commission's VAT Information Exchange System, on
request_date. Results are cached for 24 hours. Use it when the user asks
whether a VAT number (NIF-IVA) is valid for intra-EU trade. For a Spanish
NIF, use company_by_nif to look for a company with that NIF in our registry.
Returns JSON {vat_number, country_code, number, valid, request_date, source,
note}. Relay note as given: the check does not identify the holder, and a
negative result says nothing about the domestic tax identifier.
invalid_input true: relay tell_the_user. error vies_unavailable or
vat_check_rate_limited: the check could not be made now; do not call the
number valid or invalid.
Read-only. Needs the basic plan or higher: send your API key in the
X-API-Key header (https://bormeapi.com/account). | No | Yes | Yes | Yes |
Details
- Registry status
- Active
- Published
- Oct 30, 2026
- Updated
- Oct 30, 2026
- Categories (suggested)
- Invoicing and accountingMarketing and SEOSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared