Resources

Read the method.
Then check our work.

Coverage figures, benchmark methodology, ingest latency and incident history, published in full.

Twelve guides and a data dictionary

Every guide ends with a runnable example against the sandbox key, and an edit link into the repo.

SPOT-Bench v4

The benchmark, including where we lose

250,000 records drawn from real CRM exports, invoice OCR and web forms, labelled by two annotators with a third adjudicating disagreements. Published with the harness.

results · SPOT-Bench v4 · 2026-07n = 250,000
Input classShareTop-1Top-5Auto-accept precision
Clean legal name31%99.4%99.8%99.9%
Name + city, no legal form24%98.1%99.3%99.6%
Domain only14%96.8%98.4%99.4%
Identifier (VAT/LEI/register)11%99.9%99.9%100.0%
Trade name / brand alias9%94.2%97.6%98.8%
OCR-corrupted line7%91.7%96.1%98.1%
Former name, ≥3 years stale4%88.4%94.9%97.7%
Weighted total100%97.3%98.9%99.4%
Auto-accept precision is measured on the subset scoring ≥ 0.95, the default threshold. Top-1 counts the highest-scoring candidate whatever its confidence.

Run it yourself

The harness, the corruption generators and the label schema are public. The labelled set is available under a research agreement so it does not end up in a training corpus.

Calibration

Predicted confidence against observed precision on the held-out split. On the diagonal the number means what it says.

0.801.001.000.80predictedobserved

July run: predicted 0.925 across the 0.90–0.95 band, observed 0.928.

Where it degrades

Former names older than three years are our weakest class at 88.4%. Sole traders in jurisdictions without a public register are excluded from the benchmark entirely — we cannot resolve what nobody publishes, and averaging them in would flatter the number.

How the score is fitted

Per jurisdiction, on a held-out 40,000-record split, refitted monthly. A score is a probability, not a similarity: 0.90 has to be right nine times in ten or the fit is wrong and we say so in the changelog.

192 jurisdictions, three tiers

Financial depth is a separate axis from tier: it tracks what a jurisdiction obliges companies to file, which is why Swiss AGs sit at 22% and stay Tier 1.

Tier 159 jurisdictions

Ingested from the primary register, with the full event history behind every field.

Fields carriedIdentity · identifiers · officers · relations · events · financials where filed
Share of all entities71.4%
IncludesGermany, UK, France, Netherlands, Japan
Tier 276 jurisdictions

Assembled from official sources that publish identity but not a full filing stream.

Fields carriedIdentity · status · identifiers · addresses
Share of all entities26.9%
IncludesUnited States, Poland, Saudi Arabia, Nigeria
Tier 357 jurisdictions

Identity only, from official aggregates and international registers.

Fields carriedIdentity · jurisdiction · LEI where issued
Share of all entities1.7%
IncludesIraq, Angola, Tajikistan, Greenland
JurisdictionLegal entitiesBranchesPrimary sourceFiled financialsMedian freshnessTier
United States41,209,7741,884,01350 SoS registries · SEC EDGAR9%27 hTier 2
Germany6,412,880318,204Handelsregister · Bundesanzeiger88%3.1 hTier 1
United Kingdom5,704,11941,806Companies House94%1.4 hTier 1
France4,988,301602,447INPI RNE · INSEE SIRENE71%6.8 hTier 1
Italy3,146,902271,509Registro Imprese79%9.4 hTier 1
Poland2,905,44188,120KRS · CEIDG57%11 hTier 2
Netherlands2,381,66096,338KVK Handelsregister64%5.0 hTier 1
Switzerland762,45554,912Zefix · SHAB22%2.2 hTier 1
Eight flagship markets of 192. Beyond the company registers we also ingest EUIPO TMview, WIPO, USPTO, GLEIF, VIES, BRIS, Eurostat LAU, Destatis AGS, INSEE COG, GeoNames, RDAP and Certificate Transparency — 1,340 sources in all.Download full table (CSV)

1,340 sources, and how often each is read

Grouped by jurisdiction and by class. Cadence is the polling interval, not an average of how quickly a record happens to change.

DEHandelsregister · Unternehmensregister · Bundesanzeigerevery 15 min
CHZefix · SHAB/FOSC · BFS commune registerevery 15 min
GBCompanies House · FCA FS Registerevery 10 min
FRINPI RNE · INSEE SIRENE · BODACChourly
NLKVK Handelsregisterhourly
ITRegistro Imprese · InfoCamereevery 4 h
ESRegistro Mercantil · BORMEevery 6 h
ATFirmenbuch · Ediktsdateihourly
NORDICSBolagsverket · Brønnøysund · CVR · PRHevery 2 h
USSEC EDGAR · 50 Secretary-of-State registriesdaily 04:00 UTC
EUBRIS · VIES VAT · EBA credit institutionsdaily
GLOBALGLEIF LEI · ISO 3166 / ISO 20275daily
BRANDSEUIPO TMview · WIPO GBD · USPTO TSDRweekly
PLACESEurostat NUTS/LAU · Destatis AGS · INSEE COG · GeoNamesquarterly
WEBRDAP / WHOIS · certificate transparency · DNScontinuous

A feed that falls behind its cadence raises an alert against the expected volume for that source on that day, so a court holiday reads as a court holiday rather than an outage. Live lag per jurisdiction is on the status panel, and every ingest change is in the changelog.

Changelog

Breaking changes ship behind a dated version and the previous one runs for a year. Coverage and performance changes ship continuously.

2026-08-28feature

Brand resolution reaches general availability

58.4M marks from EUIPO TMview, WIPO GBD and USPTO TSDR are now first-class entities with brd_ IDs, linked to their proprietor. Resolving a trade name no longer silently returns the holding company.

2026-08-14coverage

Italy moves to Tier 1

Registro Imprese ingest now includes deposited accounts. Financial coverage for IT rises from 34% to 79%; median freshness drops from 31 h to 9.4 h.

2026-07-30performance

p95 on resolve down 26%

Blocking moved to a learned key set. p95 falls from 152 ms to 112 ms with no measurable change in top-1 accuracy (97.28% → 97.31% on SPOT-Bench v4).

2026-07-09feature

Saved-query enter and exit events

Watch subscriptions can now be defined by a saved search rather than an ID list, so a target universe maintains itself. Backfill of the first 90 days is included.

2026-06-01breaking

API version 2026-06-01

Confidence is now calibrated per jurisdiction rather than globally; alternatives is capped at 10 and sorted; the deprecated score field is removed. Prior version supported until 2027-06-01.

2026-05-19incident

Postmortem: 41-minute elevated error rate in eu-central-1

A bad index build on the blocking store returned 503s for 8.2% of resolve calls between 09:14 and 09:55 UTC. Root cause, timeline and the four changes we made are on the status page.

Engineering blog

Long posts about ingest internals, written by whoever did the work.

Status

Availability is probed from four networks we do not run. Incidents get a public postmortem within five business days.

status.spotit.ai 8 of 9 operational
API · eu-central-199.994%
API · eu-west-199.981%
API · us-east-199.97%
API · ap-southeast-199.94%
Batch jobs99.972%
Watch delivery99.91%
Warehouse shares99.989%
DE ingest · Handelsregister2.4 h behind
FR ingest · INPI RNE14 h behind
INPI RNE bulk feed is running 14 h behind following an upstream schema change. Incident inc_2026_0904 · updated 40 min ago.

Security & compliance

We hold registry facts, your query logs and your entity mappings — no payment data, no end-customer PII, no credentials to your systems.

controls
SOC 2 Type IIAudited annually; report on request
ISO 27001Certified · scope covers ingest, API and support
GDPRDPA with SCCs, sub-processor list, 30-day deletion
EU residencyEU-only processing and log retention, no egress on failover
Penetration testingIndependent test twice a year, summary on request
AccessSSO/SAML, SCIM, scoped keys, full audit log
on request
SOC 2 Type II reportUnder NDA, current period
Security questionnaireCAIQ and SIG Lite pre-filled
Sub-processor listWith 30 days notice of changes

All of it from trust.spotit.ai.

A key, a curl, a resolved entity.

That is the whole quickstart. If it does not work inside five minutes, tell us and we will fix the docs rather than explain the error.

$ export SPOTIT_KEY=spk_test_8f2c...

$ curl -s https://api.spotit.ai/v1/resolve \
    -H "Authorization: Bearer $SPOTIT_KEY" \
    -H "Content-Type: application/json" \
    -d '{"q":"nordwind logistik hamburg"}' \
  | jq '{id: .match.entity_id,
         conf: .match.confidence,
         name: .entity.name}'

{
  "id": "ent_01JR8K3F5T2QW9",
  "conf": 0.987,
  "name": "Nordwind Logistik GmbH"
}