Draft, pending review by a qualified lawyer. The bracketed items are the operator details still to be completed. This page describes what the code actually does, verified on 1 September 2026 — where practice and promise differ, we changed the code, not the words.
This page is for people, not companies. If you run a business, sit on a board, or are named as a director in a public company register, we may hold your name. This page tells you what we hold, where it came from, what we deliberately do not keep, and what you can do about it.
If you are looking for the page about our customers' accounts and cookies, that is our privacy policy. This page is the one for people who never signed up to anything and found themselves in a database anyway. That is a fair thing to be annoyed about, so we have tried to answer it straight.
We are [OPERATOR LEGAL NAME], [REGISTERED ADDRESS], company number [COMPANY REGISTRATION NUMBER]. We decide what happens to this data, so under the GDPR — and, where it applies, the UK GDPR — we are the controller of it. Write to us at [CONTACT EMAIL]. We have not appointed a Data Protection Officer: [DPO OR NULL].
We copy public company registers — Companies House, Brønnøysundregistrene, Bolagsverket, PRH, Uzņēmumu reģistrs, Registrų centras, GLEIF — and we read company websites for the contact details the companies themselves publish. Most of what we hold is about companies. Some of it is unavoidably about people: your name if you are a director, and your name, business address and trade if you are a sole trader, because a sole trader is a person. We keep the least we can, we publish less than we keep, and we did not buy any of it from a data broker.
We hold your name and your role. Nothing else.
(data.brreg.no/enhetsregisteret/api/enheter/{orgnr}/roller), one request per company.
managing officer (DAGL, LEDE, NEST, STYR, INNH, KOMP, BEST). If the register says you have resigned, we skip you.
the register about 74,724 companies; where it listed nobody, we record that we asked and got nothing, rather than pretending we never looked.
site, in the JSON version of that page, and as a "who to ask for" line for logged-in salespeople. Company pages are open to search engines, so your name can be indexed by Google against that company. We would rather say that plainly than bury it.
We do not hold officer records for any other country.
If you trade in your own name, the register lists you as the business, so our copy does too. That can include:
that is your home address. The register made that choice, not us, but we are the ones repeating it, so we say so. We hold a registered address for 460,464 Norwegian sole traders (ENK) out of 461,392 on file;
the register publishes it, and the register's own description of what you do;
have a contact record for 188,429 Norwegian sole traders.
The same applies to the sole-trader and one-person forms in the other registers we hold. Measured 2026-09-01: Latvian individuālais komersants (IK, 28,104), Latvian individuālais uzņēmums (IND, 23,442), Latvian zemnieku saimniecība — farm holdings, usually run by a named person (ZEM, 38,960), and Lithuanian individuali įmonė (810, 13,122). Finland's open dataset ships no sole-trader form, and Companies House's basic file does not cover sole traders at all.
Swedish sole traders are not in here at all. Bolagsverket's file identifies enskild firma by personnummer — a living person's national identity number. Our importer accepts only $ORGNR-IDORG company identities and deliberately skips every $PERSON-IDORG row: 1,038,523 identities left on the floor on purpose. We also refuse to reconstruct an org number from Statistics Sweden's file unless it carries the 16 company prefix, so a birth-century 19/20 prefix can never be silently truncated into something that looks like a company. That was a deliberate decision and it cost us a million rows.
Some sole traders are kept out of the leads we match and sell, and some are not. Two forms are excluded by name in our matching code: Norwegian ENK, because they may be registered in Reservasjonsregisteret, which we do not screen, and Latvian IK, for the same reason. To be clear about what that does and does not mean:
a wall** — a search of the dataset without that filter still returns you, and a CSV export of that search still contains your name and your registered address;
IND and ZEM or Lithuanian 810, which are sole-traderand one-person forms too.
[GAP 3 — must be fixed or this wording stands.]
NON_BUYER_FORMSinlib/buyers.tslistsNO/ENKandLV/IKbut notLV/IND(23,442),LV/ZEM(38,960) or any Lithuanian form — there is noLTkey at all. Those rows clear the matching floor and can be assigned to a salesperson. Either add them, with the one-line reason the file requires, or leave this section saying exactly what it says now.
Our crawler reads company websites for contact details and sorts what it finds into two kinds:
post@, info@, sales@, a mailbox belonging to the business;We hold 202,129 named addresses. We do not publish them. They are stripped out of company pages, out of the public JSON, out of the dataset browser, out of the search tool, and out of every CSV download — the download code says so in a comment: "Named addresses belong to people and never leave the platform." Only the count is public.
[GAP 1 — must be fixed or this wording changes.] The exception, today: the assigned-work queue. One internal screen (
/app/queue, seen only by a logged-in salesperson, only for companies already assigned to them) selects the email without checking its kind, so a named address can appear there. 175,831 contact records are in scope — named email plus a phone number, on a trading company in the matched pool./for-salespeoplecurrently claims "you will never see one — not on a company page, not in the workbench, not in an export"; that is true of those three and false of the queue. Fixlib/match.ts,app/app/queue/page.tsxandlib/supply.tsto apply the sameemail_kind = 'generic'gate before publishing this page — it is a three-line change — and then this section can say "never" without an asterisk. Until then, neither this page nor/for-salespeoplemay say it.
If you email us, we keep your message and your address for as long as it takes to deal with it and to show we dealt with it. If you use the "claim this profile" form on a company page, we store the email address you gave and which company you claimed (profile_claims). That is a handful of records today, and it is handled by a person reading email, not by a system.
Every line here is enforced in code, not by policy:
their name. We drop it before it is ever written down. The importer says why: "A salesperson needs to know who to ask for, and every extra personal field is liability without value."
phone number, not an email, not an address. (A sole trader's registered business address is a different thing, and it is covered above.)
national_id we store is a company registry number or an LEI. We checked: the Swedish rows are 10-digit organisationsnummer and 20-character LEIs, and nothing else.
religion, trade-union membership, sex life or ethnicity, and no register we read publishes it. We will not claim more than that: if you are the named officer of a church body or a political association, our copy of the public register records that association, and someone could draw an inference from it. The register publishes that; we repeat it; you can object, and we will act on it.
similarly significant effect for any person, and nothing is decided about a person by machine.
only. Not Proff, not Krak, not a directory, not a list vendor. If a register will not licence its data for reuse, we record the refusal and go without.
Even our fonts are built into the site and served from our own server, so loading a page never sends your IP address to Google.
One thing we do that is worth naming plainly. We rank and score companies for salespeople, and we generate a short list of reasons to call each one from its registry facts. Where the company is a sole trader, that is an automated evaluation of a person's business — profiling, in the GDPR's sense of the word. It produces a line on a sales list, not a decision about you, and you can object to it.
Every record carries the register it came from and the day we read it. These are the registers on file:
| Register | Country | Licence recorded |
|---|---|---|
| Companies House basic company data | UK | Companies Act 2006 register data; no reuse restrictions stated by Companies House |
| Brønnøysundregistrene, Enhetsregisteret | Norway | NLOD (Norwegian Licence for Open Government Data) |
| Bolagsverket + SCB bulk files | Sweden | Avgiftsfri, EU High-Value Dataset regime |
| PRH / YTJ open data | Finland | CC BY 4.0 |
| Uzņēmumu reģistrs | Latvia | CC BY 4.0 (EU High-Value Dataset) |
| Registrų centras JAR | Lithuania | CC BY 4.0 |
| GLEIF LEI records | worldwide | CC0 (public domain) |
| Company websites | — | facts from each company's own public site, attributed field by field |
Two footnotes that belong here rather than in a corner. Lithuanian records are held but not shown: they are in the database and excluded from every public page, count, list and sitemap on this site. And the GLEIF slice is a global set of legal-entity records that overlaps the national registers, so a business that holds an LEI can appear here twice — once from its own register and once from GLEIF. If that happens to you, tell us and we will merge or remove the duplicate.
How our crawler behaves, exactly. When we look for a company's own website we guess a domain from the registered name and fetch one page — the front page. If the company name is not on it, we keep nothing. The request identifies itself as berry-registry-bot/0.1 and carries our contact URL ([CRAWLER CONTACT URL]); the separate job that talks to register APIs identifies itself as berry-ingest/0.1.
[GAP 2] Two honest limits on that. The contact URL comes from
APP_CONTACT_URL, which is unset in.env.example— if it is unset in production the header literally readsno-contact-configured, and nobody can tell who called. And the bulk crawler (ingest/enrich.ts) does not readrobots.txt; only the Denmark-specific contacts path (ingest/sources/contacts.ts) parses it. Set the contact URL and teach the bulk crawler to honourrobots.txtand ado-not-crawlflag, or this page cannot tell a site owner they have a way to stop us other than emailing.
Our stated legal basis is legitimate interests, GDPR Art. 6(1)(f) — running a business-to-business lead database built on data that the state already publishes, so that salespeople can reach companies about business offers. We are not claiming your consent, because we never asked for it, and we should not pretend otherwise. Stating a basis is not the same as a supervisory authority agreeing with it.
The plain-language version of the balancing we did:
that is designed to be public, and is normally free to look up by anyone. That does not make republishing it at scale automatically fine — it is the starting point of the argument, not the end of it.
are the parts of you that face the market. We do not collect anything about your health, beliefs, politics or family.
identity numbers are exactly the fields that would turn a business record into an identity-theft resource, and they are exactly the fields we drop.
rule is for. Under Norwegian marketing law (Markedsføringsloven §15 [verify]), emailing a person's own address is off-limits whoever the offer is for — and it was our rule before we read the statute.
Why you are only hearing about this now (Art. 14(5)(b)). We hold 10,838,346 public company records across 222 country codes, of which 10,603,837 are shown publicly. For the overwhelming majority of the people in them we have no way to reach them at all, and for most we would have to acquire new personal data in order to send them a notice. We have taken the position that individually notifying every person would involve disproportionate effort, and that publishing this page — indexed, linked from every page of the site, written to be understood — is the "appropriate measure to protect your rights" the Regulation asks for in that case. That is our position and our reasoning; it is for a supervisory authority, not us, to say whether it holds. [verify: Art. 14(5)(b) and its national implementations, with counsel.]
[GAP 4] Two things that weaken that argument and should be fixed rather than argued. First, for the 202,129 named addresses we hold, "we have no way to reach them" is not true — we could notify those people, and the disproportionate-effort exemption is much harder to rely on for them. Second, if we ever send an outbound message to a company mailbox ourselves (the tooling exists in
engine.pitches; nothing has been sent —engine.sent_emailsis empty), that first communication must carry this notice with it. Decide both before publishing, and record a written legitimate-interests assessment — this section is currently the summary of a document that does not exist.
and roles, sole traders' names, and the register's published business address.
company-level contact details, save searches and export company rows as CSV. Exports contain no officer names and no named email addresses. They do contain a sole trader's business name, address, sector and generic contact details, because that is the company record. Once a row is downloaded it is in the buyer's hands; our terms bind them, but we cannot recall a file.
[HOSTING COUNTRY]. [GAP 7] Both are unresolved. Until the physical location of the server is confirmed, this page cannot say whether data leaves the EEA or the UK, and if it does, a transfers section naming the safeguards relied on must be added here. Resolve this from the hosting contract, not by guessing from an IP address.
run no advertising, analytics or enrichment vendors. To be exact about what the product is: we sell access to a database of companies, and where you are named on a public company record — as an officer, or because you trade in your own name — your name is part of what a subscriber can see on this site. That is the whole point of the page you are reading.
This matters for everything below it, so it gets its own heading and an honest answer.
We do not re-read the registers nightly. Each register arrives as a bulk file that a person downloads and imports; the automatic nightly job covers only the GLEIF slice and a Danish source that is currently blocked. So a re-import happens when we do one — periodically, with no fixed schedule, and months can pass between runs for a given country. When it does happen, the import overwrites our copy of each record with the register's current version.
Two consequences we would rather you heard from us:
overnight;
source does not remove our copy. If you need our copy gone, ask us — see below.
[GAP 8] Wire this up or keep saying it.
ingest/all.tsrunsgleifandcvronly; every other source reads a local file (data/uk-basic-2026-08-01.zipand friends). No code path anywhere deletes an entity, contact or officer row, so records outlive the register entry that created them. A retention rule this page could honestly state needs a reconciliation step in the importer first.
There are two places to fix it, and they are not the same.
1. The register — this is the one that matters. We are a copy. If your name, role, address or status is wrong at the source, correcting it there fixes it at the source and reaches us at our next import of that register. Go to [verify these routes before publication]:
virksomhet.brreg.nofind-and-update.company-information.service.gov.uktietopalvelu.ytj.fiinfo.ur.gov.lvsearch.gleif.orgEvery company page on this site links to that company's own official record, so you can check what the register actually says about you before you argue with us.
2. Us — for anything the register did not say, and for anything you want fixed sooner. Contact details we read off a website, a page that is stale, a website match that is simply the wrong company, a duplicate LEI record: email [CONTACT EMAIL] with a link to the page and we will fix or remove it. We will do that whether or not the register has been corrected.
[GAP 5] The claim form on company pages only works for Danish companies.
POST /api/claimshard-codescountry = 'DK', so the form shown on roughly 10.5 million non-Danish company pages returns a 404 on submit. Either make the route country-agnostic or take the form off the pages it does not work on — before this page tells people to use it. AGENTS.md doctrine already requires a visible correction path on every published entity; today the site has one that fails silently.
You have the right to object at any time to our processing your data, on grounds relating to your situation, and you have an absolute right to object to direct marketing. You do not have to justify the second one. Email [CONTACT EMAIL] with enough detail to find the record — ideally the link to the page. We may ask you for enough information to be sure which record is yours; we will not ask you for identity documents we have no way to check.
What we will actually do, today. Being straight about this matters more than sounding capable:
a row, and it holds: our officer importer only asks the register about companies it has never asked about, and we leave the "we asked" marker in place so it will not ask again.
row, which is what keeps the crawler from going back for it. (Deleting the row outright would put the company back in the crawl queue, so we do not do that.)
off it again.
an objection by removing our copy from the site rather than by arguing about it, unless we have a reason we can state to you.
What we have not built yet, and will not pretend we have:
is a person running a query by hand. If you get no reply, the failure is ours, and you should escalate to a supervisory authority.
a decision; no part of the running code reads that list — not the search, not the exports, not the matching engine, not any sending tool. Today it is a note to ourselves that a human checks. An address on it can still exist on a company record until we act on it by hand. [GAP 6] This is the single largest gap between what this page promises and what the code does. Wire the list into the query layer, or leave this paragraph exactly as it is.
deletes them on a schedule, because no schedule exists. We are not going to write "as long as necessary" here and leave it at that.
copy without also recording a suppression that the importer honours, the next re-import of that register brings it back. Until suppression is wired into the import path, ask us to confirm an erasure has held, and tell us if it has not.
The honest limit of erasure. We can delete our copy. We cannot delete the register. Norway, the UK, Finland, Sweden, Latvia and Lithuania publish company officers and sole traders because their company law requires it, and that publication continues whatever we do. If your objection is really to being listed at all, the argument that changes anything is with the register, not with us. What we owe you is our copy, and that is what we will act on.
You can ask us for a copy of what we hold about you, ask us to correct it, ask us to restrict how we use it while we look into an objection, and object to it. Because our basis is legitimate interests and not consent, there is nothing for you to withdraw, and the data-portability right does not attach to this processing. You can also ask us for the reasoning behind our legitimate-interests balancing; we will send it.
Requests go to [CONTACT EMAIL]. There is no charge. We answer within one month. If a request is complex or there are several of them, the law lets us take up to two further months, and we will tell you inside the first month if we need them.
If you think we have handled this badly, you can complain to a supervisory authority — [SUPERVISORY AUTHORITY] is ours, and you can also go to the one where you live:
[EU/UK REPRESENTATIVE — required only if the operator is established outside the relevant territory; cannot be determined until [OPERATOR LEGAL NAME] and [REGISTERED ADDRESS] are known.]
Visiting this page sets no cookie. The site as a whole uses four — a login session, a dashboard hint, an admin session and a sidebar preference. No analytics, no advertising, no third-party cookies, nothing that follows you anywhere. Details on the cookies page.
Last updated [EFFECTIVE DATE]. Counts on this page were measured on 2026-09-01. This page is a draft prepared by reading our own source code, and it must be reviewed by a qualified lawyer before it is relied on. It describes what our code does today. When the code changes, this page changes with it — and if you find a place where it does not, tell us at [CONTACT EMAIL]; that is a bug of the worst kind.