Company register number: look it up in the country's register, through GLEIF, or link to the register #935
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#935
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The Company register number identifier is only checked for its shape. Many countries now offer a free online lookup of their company register, so Postulo could confirm the number, fill in the company's details from it, and link to the register's own page.
What exists today
src/postulo/plugins/identifiers/schemes.pydeclaresScheme(REGISTER, _("Company register number"), …):subjects=ONLY_COMPANY;PT 501234567,FR 552081317,DE HRB 12345);starts_with_a_country.link, and nothing is looked up.What is available (researched 2026-10-16)
The EU rules
Commission Implementing Regulation (EU) 2023/138 (high-value datasets) has applied since 2024. It lists companies and company ownership and requires registers to make basic company data free, machine-readable and available through an API (bulk too where relevant), under CC BY 4.0 or less restrictive terms (data.europa.eu). Registers are still opening up under it: the Netherlands and Sweden recently, others to follow.
Free official APIs per country
No official API (a web search only): DE (handelsregister.de: per-company retrieval, no bulk), PT (Justiça portal search; the full certificate needs the company's access code), ES, IT, CH (Zefix: free search, extracts are cantonal and paid).
Across countries
registeredAs) and which register issued it (registeredAt). So for any company with an LEI, which Postulo already stores as an identifier, a single call gives its register number in any country.What would change
link_services, decided when implementing).linkper country to the register's own search page.To confirm before implementing
These came from secondary sources and need checking against each register's own pages:
Related
#673 (Wikidata lookup), #897 (NACE sector), #913 (outbound geocoding: same rate-limit and privacy pattern).
How to build it: inside the identifier module, or as a module beside it
What the code already says
IdentifierPlugininplugins/base.pysets two rules that decide most of this:crosschecks.py(#675) says the same: comparing a company's identifiers against an outside record "is a lookup, which is a deliberate act".A register lookup is a network call that an operator, or a person, must be able to switch off. So the two rules point the same way.
Option A: build it into the identifier module
Give
Schemean optionallookup(value) -> Record | Noneand put the per-country adapters inplugins/identifiers/.Option B: a separate module beside it (recommended)
A feature plugin, Register lookup (name to be decided), that depends on
identifiersand adds a lookup to the schemes that have an adapter.postulo.link_services, #305). That group is open because "a registry somebody else wrote can add to what is offered and can refuse nothing". The same holds here:linkto the register's search page, and per-country checksums such as the SIREN Luhn digit or the IČO check, belong to the scheme and are added there.Recommendation
Option B. Split the work along the contract's own line:
identifiers, offline:registeredAs/registeredAt;The offline half can land first. It already gives every register number a working link, and needs no decision about outbound requests.
The offline half is in PR #1022 (per-country check digits and register links, EU business registers search as the fallback). The online lookup is tracked in #1021; an LEI cross-check needs the GLEIF record and moved there. This issue stays open for it.