Latvia Company Data — Officers, Owners (UBO) & Financials
Pricing
from $4.00 / 1,000 results
Latvia Company Data — Officers, Owners (UBO) & Financials
Search Latvian companies from the official Register of Enterprises open data — identity, legal form, address, activity and capital, plus optional officers, shareholders, beneficial owners (UBO) and annual-report financials. Resale-open data, no key.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
3
Monthly active users
5 days ago
Last modified
Categories
Share
Latvia Company Data — Enterprise Register 🇱🇻
foXLabs European company-registry series: UK · France · Estonia · Czechia · Poland · Slovakia · Slovenia · Denmark · Norway · Finland
🎉 Turn the Latvian Register of Enterprises into clean, structured company data — no login, no API key, one row per registered entity, with its officers, shareholders, beneficial owners (UBO) and the figures of its latest annual report. Built for KYB / compliance, credit and B2B sales teams.
🔍 What is Latvia Company Data — and when should you use it?
Give this Actor registration numbers, a name, a location or a legal form, and it returns the matching entities from the open data of the Register of Enterprises of the Republic of Latvia (Uzņēmumu reģistrs) — published on data.gov.lv under CC0 and, by the portal's own record, updated daily; 489,090 entities on 2026-10-08, 221,388 of them active. Two switches add who runs and owns each company and what its latest annual report says.
Use it when you need: the officers, shareholders and beneficial owners behind a Latvian company; turnover, profit, assets and headcount from the latest annual report; a check of a list of registration numbers — active, closed or not in the register; or the active companies of a municipality or a legal form as a list.
Use something else when: you need e-mail addresses, phone numbers or websites — this Actor returns none; a search of companies by industry — in the Commercial Register almost only companies registered in the 1990s state an activity; or the people behind a company that has been closed (see "What it does not do").
🤖 Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/latvia-company-data. Checked on 2026-10-08: the server lists it as the tool foxlabs--latvia-company-data.
Your agent can pay for its own runs. For an agent with a wallet and no human to sign in, Apify sells a prepaid, spend-capped API token over x402 at agi.apify.com; such a token runs any Actor that uses limited permissions, as this one does (the terms of that path are Apify's own — see apify.com/agents.md). The Actor also meets Apify's conditions for per-request agentic payments — pay-per-event only, limited permissions, no Standby — and Apify Store lists it as eligible for them (read from the Store on 2026-10-08). The Actor charges the same events either way: one per company delivered, plus the run start.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want Latvian company records from the Apify Actor `foxlabs/latvia-company-data`.Input: `registrationNumbers` is a list of Latvian registration numbers as strings; or, with that list empty, search with `searchQuery` (the name contains this text — "Rimi", not "SIA Rimi"), `location` (the address contains this text, with Latvian letters, e.g. "Saldus nov."), `legalForm` (e.g. "SIA", "AS") and `registerType` ("K" = Commercial Register, "KU" adds farms). Leave `status` out: a search then returns active entities, and a lookup by number returns the entity whatever its status. `includeOwnership` adds officers, shareholders and beneficial owners; `includeFinancials` adds the latest annual report. `maxResults` caps the rows.Start with: {"registrationNumbers":["40003053029","40003286799"],"includeOwnership":true,"includeFinancials":true}Ask me which companies or which town I want, run the Actor and read the run's status message — it names the numbers that returned no row and the entries that are not registration numbers. Then show the companies as a table with name, registration number, status, officers, beneficial owners, turnover and employees.
API examples and the MCP server configuration are on apify.com/foxlabs/latvia-company-data.md; that page links to the OpenAPI definition (read on 2026-10-08).
📋 Overview
Everything you need to turn the Latvian register's open data into structured company records — in one Actor, with no login, cookies or API key.
Why teams pick this Actor:
- ✅ The register's own open data — every run downloads the current files from data.gov.lv, compares each with the size the portal announces (all ten announced one on 2026-10-08) and reads them directly.
- 👤 Who runs and owns the company — of 1,625 active Commercial Register entities in a measured run (see "Output"), 97.7% came back with an officer, 90.2% with a shareholder and 89.3% with a beneficial owner.
- 📈 The latest annual report — employees, total assets, equity, net turnover and net income for 77.1% of the same entities.
- 🧾 Measured, not promised — this page says how often each field was filled and what the Actor does not return.
- 💰 Pay only for rows delivered — a search that finds nothing costs only the run start.
- 🤖 Agent-ready — MCP tool + agentic payments.
✨ Features
- 🔢 Exact lookup — registration numbers, as many as
maxResultsallows; the entity comes back whatever its status, and the run's status message names the numbers that returned no row. - 🔎 Search — by name, address text, legal form, register and status, combined.
- 👥 Ownership — officers with their right of representation and, where the register states one, their position; SIA members and stockholders with their shares and nominal value; beneficial owners with nationality and country of residence.
- 📈 Financials — the entity's own latest annual report, with the period it covers; figures are multiplied out to full currency units by the unit the register's file names for the report (see the FAQ for what that means when the file is wrong).
- 🧹 Clean schema — legal forms and registers in English, with the register's own codes beside them; six legacy forms of terminated organisations have no label and come as the bare code.
🎬 Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~latvia-company-data/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"registrationNumbers":["40003053029","40003286799"],"includeOwnership":true,"includeFinancials":true}'
The call starts a run and returns it; the rows are in the run's default dataset. On 2026-10-08 this input returned SIA "RIMI LATVIA" and SIA "Mikrotīkls" with officers, shareholders, beneficial owners and their 2025 annual-report figures, in 48 seconds. The run ended with the status message Delivered 2 of 2 registration numbers.
🚀 Getting Started (3 steps)
- Choose the companies — registration numbers, or a search by name, location, legal form and register.
- Choose the depth —
includeOwnershipfor the people,includeFinancialsfor the annual report. Each adds files to download at the start of the run. - Run and export — read the run's status message, then get the dataset as JSON, CSV or Excel.
In the Console form registrationNumbers comes pre-filled with two examples, and a name typed next to them is not searched; both switches are ticked — clear or untick what you do not want.
📥 Input
{"registrationNumbers":["40003053029","40003286799"],"includeOwnership":true,"includeFinancials":true}
Every field is optional, and all filters apply together. Rows come in the order of the registration number, read as text, so a capped search returns the lowest numbers first, not the newest or largest companies. With no filter at all those are press titles of the mass media register, whose 9-digit numbers (0007…) sort before the 11-digit numbers of companies: {"maxResults":20} returned twenty of them on 2026-10-08.
| Field | Type | Description |
|---|---|---|
registrationNumbers | array | Exact registration numbers, as strings: 11 digits, or 9 for press titles and some old closed entries. Other characters are dropped (LV40003286799), an entry may hold several numbers separated by commas, and an entry with another count of digits is named in the status message. With a number in the list, searchQuery is not used; the other filters still apply, and a list longer than maxResults — or than the rows a maximum charge covers — is cut to its first numbers. A list that holds entries but no registration number returns no row: it is never run as a search. To search, leave the list empty. |
searchQuery | string | Entities whose registered name contains this text, any case (transport, Rimi). The name is matched as the register writes it — SIA "RIMI LATVIA", quotation marks included — so SIA Rimi does not match it. |
legalForm | string | One legal form by the register's code: SIA private limited company, AS joint-stock company, IK sole trader, ZEM farm, BDR association, NOD foundation, FIL branch … (the form lists 22). |
registerType | string | K — the Commercial Register: SIA, AS, sole traders, partnerships, branches. KU adds the Enterprise Register journal (U): the active farms, individual undertakings and co-operative societies, and many older terminated companies. Other letters select associations and foundations (B), mass media (M), religious organisations (R) and more. Empty = all registers. |
status | string | Empty (the default; "Automatic" in the form) — a search returns active entities, a lookup by registrationNumbers returns the entity whatever its status. active — no termination date; terminated; all. A value you set applies to a lookup too. |
location | string | Entities whose address contains this text. Saldus nov. returns the municipality; Saldus alone also matches a "Saldus iela" in another town. |
activityQuery | string | Entities whose stated activity text contains this. Almost no company of the Commercial Register states one — see "What it does not do". |
includeOwnership | boolean | Add officers, shareholders and beneficial owners. Off by default in the API; ticked in the Console form. |
includeFinancials | boolean | Add the entity's own latest annual report. Off by default in the API; ticked in the Console form. The slowest option. |
maxResults | integer | Most entities to return. Default 1,000; 1 to 500,000. |
Text filters are literal — write Latvian letters (see "Troubleshooting"). % and _ act as wildcards.
📤 Output
One row per entity, saved to the dataset.
{"name": "Sabiedrība ar ierobežotu atbildību \"Mikrotīkls\"","shortName": "Mikrotīkls","registrationNumber": "40003286799","legalForm": "Private limited company (SIA)","legalFormCode": "SIA","registerType": "Commercial Register","registerTypeCode": "K","status": "active","registeredDate": "1996-03-14","terminatedDate": null,"address": "Rīga, Aizkraukles iela 23","city": "Rīga","postalCode": "1006","capital": { "amount": 2840, "currency": "EUR", "kind": "PAID_UP_EQUITY" },"capitalFormatted": "2,840 EUR","registeredCapital": null,"primaryActivity": null,"activities": [],"ownership": {"officers": [{ "name": "Riekstiņš Arnis", "position": "BOARD_MEMBER", "governingBody": "EXECUTIVE_BOARD", "type": "person", "representation": "INDIVIDUALLY", "representationWithAtLeast": null },{ "name": "Tallijs Džons Martins", "position": "CHAIR_OF_BOARD", "governingBody": "EXECUTIVE_BOARD", "type": "person", "representation": "INDIVIDUALLY", "representationWithAtLeast": null }],"shareholders": [{ "name": "Riekstiņš Arnis", "type": "person", "shareClass": "SIA member", "shares": 10, "nominalValue": 142, "currency": "EUR" },{ "name": "Tallijs Džons Martins", "type": "person", "shareClass": "SIA member", "shares": 10, "nominalValue": 142, "currency": "EUR" }],"beneficialOwners": [{ "name": "Arnis Riekstiņš", "nationality": "LV", "residence": "LV" },{ "name": "Džons Martins Tallijs", "nationality": "LV", "residence": "LV" }]},"financials": { "year": 2025, "periodStart": "2025-01-01", "periodEnd": "2025-12-31", "employees": 384, "currency": "EUR", "reportedIn": "ONES", "totalAssets": 485292086, "equity": 445923127, "netTurnover": 344565796, "netIncome": 36172414 },"source": "Register of Enterprises of the Republic of Latvia (Uzņēmumu reģistrs)","license": "Latvian open data — free commercial reuse & redistribution","registryUrl": "https://info.ur.gov.lv/#/legal-entity/40003286799"}
"Filled" is the number of rows that carried the field in one run on 2026-10-08 with both switches on: every active entity of the Commercial Register (K) and of the Enterprise Register journal (U) whose address contains "Saldus nov." — 2,745 rows. K: 1,625 rows — 1,459 SIA, 156 sole traders and 10 of other forms. U: 1,120 rows — 992 farms, 118 individual undertakings, 9 co-operative societies and 1 SIA.
| Field | What it is | K (of 1,625) | U (of 1,120) |
|---|---|---|---|
name / shortName | Registered name, and the name without the legal form, as the register gives it | 1,625 / 1,624 | 1,120 / 1,099 |
registrationNumber | The registration number — unique per entity; 11 digits in every row here, 9 for press titles | 1,625 | 1,120 |
legalForm / legalFormCode | Legal form in English, and the register's code | 1,625 | 1,120 |
registerType / registerTypeCode | The register the entity belongs to, and its letter | 1,625 | 1,120 |
status | active (no termination date) or terminated | 1,625 | 1,120 |
registeredDate | Date of registration | 1,625 | 1,120 |
terminatedDate | Date of termination — only on terminated entities | 0 (all active) | 0 |
address / city / postalCode | Address as the register writes it; city is its first part: a town, a municipality (Saldus nov.) or, on old terminated entries, a former district (Tukuma rajons) | 1,625 | 1,120 (postalCode 1,118) |
capital / capitalFormatted | Paid-up share capital — amount, currency, and kind, the register's code for the record: PAID_UP_EQUITY in every row here, another kind only where there is no paid-up record — and the amount as text | 1,465 — every SIA and AS, no sole trader | 0 |
registeredCapital | Registered share capital — amount, currency — where the register keeps one next to the paid-up amount | 32 | 0 |
primaryActivity / activities | The entity's own activity text, in Latvian, when it stated one; primaryActivity is its first line | 47 — all registered between 1991 and 1997 | 966 |
ownership.officers | Each with name, position (BOARD_MEMBER, CHAIR_OF_BOARD, OWNER, LIQUIDATOR, ADMINISTRATOR …; null on the 145 officer lines of sole traders here), governingBody, type, representation and representationWithAtLeast — the number that goes with the right WITH_AT_LEAST (together with at least that many others; 21 officer lines of K and 9 of U here), null with any other right | 1,588 with at least one | 1,015 |
ownership.shareholders | Each with name, type (person, entity, joint owners, depository), shareClass, shares, nominalValue and currency. Any shareClass other than SIA member — the register's stock type (REGISTERED_STOCKS on all 198 such lines here), or AS stock when it gives none — is a stockholder line and adds votes | 1,465 with at least one | 1 |
ownership.beneficialOwners | Each with name, nationality and residence (country codes) | 1,451 with at least one | 474 |
financials | The entity's own latest annual report: year, periodStart, periodEnd, employees, currency, reportedIn, totalAssets, equity, netTurnover, netIncome | 1,253 — the 2025 report for 1,096, an older one for 157 (the oldest from 2010) | 174 |
source / license | Source and licence note | 1,625 | 1,120 |
registryUrl | The entity's own page on the register's portal | 1,625 | 1,120 |
ownership appears only with includeOwnership, financials only with includeFinancials. An entity without an annual report in the open data gets financials: null; none of the 156 sole traders had one. In this sample every report carried all its figures, in the report's own currency (lats in 5 old ones of the 1,427); a 0 is what the register's file states (336 reports give 0 employees). A report does not always cover twelve months: 35 of the 1,253 K reports here cover fewer than 300 days and 14 more than 430 (9 to 545 days) — periodStart and periodEnd say which.
Other rows are thinner — counted in the register's files of 2026-10-08, not in a run:
- Associations and foundations register (27,864 active): officer 98% (97% of those lines without a
position), beneficial owner 25%, annual report 89% — withnetTurnoverandnetIncomenullin all but 2 of those 24,698 reports,totalAssetsandequityin 16,320. - Press titles (3,428 active): no officer, owner, annual report, capital, activity text or
shortName. - Terminated entities (267,702): no officer, shareholder, beneficial owner, capital or activity text; an annual report for 100,875.
How to read the people and the figures:
- Names come in two orders. Officers and shareholders are written "Surname Forename", beneficial owners "Forename Surname". Each list has a fixed order — by name (beneficial owners by surname) as the characters compare, not by the Latvian alphabet: a name that begins with Ā, Č or Š comes after Z, and a shareholder line the register leaves without a name comes last. The Actor returns no personal code, date of birth, appointment date or ownership percentage, and a corporate shareholder comes without its registration number.
activeis not "trading". 30 of the 1,625Krows and 44 of the 1,120Urows had a liquidator or an insolvency administrator among their officers — visible only withincludeOwnership.capitalis the paid-up amount. For 3,038 entities in the files the register keeps a registered amount next to it — higher in 2,830 of them: shares not fully paid — returned asregisteredCapital. Here 32 SIA have one, twice the paid-up amount in 28, and the members' shares of all 1,459 SIA with capital add up tocapital(1,427) or toregisteredCapital(32) — to within half a euro where a line is in lats.- Shares without a person's name. Jointly held shares come as a line with
typejoint ownersandnamenull(3 lines in 2 SIA here). An AS's stock held through the depository comes as a line withtypedepositoryand the depository asname; itsshares,votesandnominalValuearenull: the register's file states no number for stock held that way (it carries a 0). The files hold 182 joint-owner lines and 37 depository lines; for 78 companies (46 and 32) they are the only shareholder lines. nominalValuecan be in lats. 96 of the 2,027 member lines here (80 companies) state it inLVL— readcurrencybefore you multiply byshares.financialsis the entity's own report. A group's consolidated report, which a parent files next to its own, is not used: 354 entities in the files had both for their latest year. Of several own reports for one year, the one that ends last, then the one filed last, is returned.- A report can cover less or more than a year. Of the 124,445 reports returned for active Commercial Register entities (files of 2026-10-08), 3,982 cover fewer than 300 days — 3,831 of them begin on the day the company was registered — and 1,509 more than 430 (a long first year, up to 549 days); 71 are of "year" 2026, a year that had not ended. Compare
netTurnoveracross companies only after a look atperiodStartandperiodEnd.
💼 Use cases
1. KYB on known companies — who runs it, who owns it, how large it is.
Input: {"registrationNumbers":["40003053029","40003286799"],"includeOwnership":true,"includeFinancials":true}. Output: the two companies of "Quick Start", each with its people and its 2025 annual report.
2. Clean a list of registration numbers — which are active, which are closed, which are not in the register.
Input: {"registrationNumbers":["40003053029","LV40003286799","99999999999","abc","4000305302","41202013815"],"searchQuery":"Rimi"}. Output: 3 rows in 16 seconds on 2026-10-08 — two active SIA and a sole trader terminated on 2014-04-10 — and the status message Delivered 3 of 4 registration numbers. No row for: 99999999999 — not in the register. searchQuery was not used: with registration numbers the run is a lookup of those numbers. Empty registrationNumbers to search by name. Not a registration number (9 or 11 digits): abc, 4000305302. Set status to active to leave closed entities out.
3. Companies by name, qualified by turnover
Input: {"searchQuery":"logistik","registerType":"K","status":"active","includeOwnership":true,"includeFinancials":true,"maxResults":1000}. Output: 57 companies on 2026-10-08 in 48 seconds, 49 of them with an annual report. Use: sort by financials.netTurnover to find the ones worth a call — after a look at periodStart and periodEnd: a first-year report covers less than a year.
4. Every business of a municipality
Input: {"location":"Saldus nov.","registerType":"KU","maxResults":5000,"includeOwnership":true,"includeFinancials":true}. Output: 2,745 active entities on 2026-10-08 in 50 seconds. K alone leaves out the 1,120 farms and other journal entries; the default maxResults of 1,000 would cut the list.
🔗 Integration
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/latvia-company-data').call({"registrationNumbers":["40003053029","40003286799"],"includeOwnership":true,"includeFinancials":true});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('foxlabs/latvia-company-data').call(run_input={"registrationNumbers":["40003053029","40003286799"],"includeOwnership":True,"includeFinancials":True})for item in client.dataset(run.default_dataset_id).iterate_items():print(item)
Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict — write run['defaultDatasetId'] there.
Automation (n8n / Zapier / Make): send registration numbers from your CRM or onboarding form → read the JSON dataset → write owners and figures back. Send many numbers in one run rather than one run per company: every run downloads the register files first. The numbers that returned no row are in the run's status message (the first 20) and, all of them, in the NOT_RETURNED record of its key-value store; the OUTPUT record there has the counts (pushed, notReturned, invalidNumbers, notLookedUp). With a maximum charge on the run only the first numbers that charge covers are looked up, and the message says how many (run locally, not on the platform).
📊 Pricing
Pay-per-event. The Store page read "from $4.00 / 1,000 results" on 2026-10-08, that is $0.004 per row written to the dataset (one row is one entity); what "from" stands for was not read, and the stop measured under a maximum charge — 14 rows for $0.06 — fits that price. Each run is also charged Apify's run-start event — four of them at the default 4 GB of memory in every measured run; the Store page does not give its price. A run that matches nothing costs only the run start (checked: the start events, no row charged). A registration number that returns no row is not charged either: the lookup of use case 2 was charged three rows for its four numbers. An input with no filter returns 1,000 rows for $4.00 — all press titles, whose 3,428 active entries sort first (not run: from the code, the price and the register's files). Set a filter, maxResults or a maximum charge: a search stops at the rows the charge covers and says so — with $0.06, a name search that matched 762 entities delivered and charged 14 rows — and a new run starts from the first row again; a lookup looks up only the first numbers the charge covers. View current pricing.
🚧 What it does not do
- No e-mail, phone or website. The Actor returns none.
- No search of companies by industry.
activityQueryreads free text that an entity states in its own words. In the Commercial Register almost only companies registered in the 1990s have one: in the files of 2026-10-08, 5,563 of its 153,862 active entities, all but 8 of them registered before 1999. The associations and foundations register (27,739 of its 27,864 active entities) and most of the journal (27,209 of 34,641) do state one — as free text, not as an industry code. - No people behind a closed entity. A terminated entity comes back with its name, dates, address and, if there is one, its last annual report. The register's files hold no officer, owner, capital or activity text for it.
- No history. One row is the entity today, and
financialsis one annual report. - Not instant, and untested for large pulls. Every run first downloads the register files: six runs without the switches took 12 to 17 seconds, four with both 48 to 50 — the largest delivered 2,745 rows. Nothing larger was run, so the duration and memory of a pull of tens of thousands of rows are not known.
locationis a text match on the address, so the name of a town also matches streets named after it elsewhere: 55 of the 1,680 active Commercial Register entities whose address contains "Saldus" (files of 2026-10-08).
❓ FAQ
Do I need an account, login or API key for the register? No. The Actor reads the open-data files the register publishes.
How current is the data? As current as the published files. On the two evenings observed (7 and 8 October 2026) the portal replaced the ten files at about 20:25 GMT, within two minutes; a run that downloads in such minutes could read files of two days. The run cannot see that directly — it compares the times the portal gives for its files and says so in its status message when they lie more than six hours apart (run locally with altered times; no platform run met it). Counts "in the files" on this page are from the set online during 2026-10-08; the runs of that evening read the next one.
Which entities are covered? Everything in the register file — companies, sole traders, farms, associations, foundations, branches, mass media and more, active and terminated.
Are the financial figures in euros? They are in the currency of the report (financials.currency). A report filed in thousands is multiplied out — by the unit the register's file names for that report, which reportedIn repeats. Where the file names the wrong unit, the figures are wrong by the same factor: in the files of 2026-10-08 the 2025 report of AS "Latvijas Gāze" (40003000642) is flagged ONES and comes back with total assets of 166,926, a thousand times too small (its 2024 report, flagged THOUSANDS: 175,510,000). Found by comparing with the entity's earlier reports, which is possible only for the 14 entities that ever filed in thousands (66 reports); a second returned report reads the same way (AS "Amber Assets", 2024). When the size matters, compare totalAssets with capital.
Where does registryUrl lead? To the entity's own page on info.ur.gov.lv. Opened in a browser for ten entities of six registers, active and terminated, the page showed the entity's registration number each time.
Can I export to CSV / Excel / JSON? Yes — directly from the Apify dataset.
🐛 Troubleshooting
Start with the run's status message. Every run that finishes or fails ends with one: it is the run's statusMessage in the API and the last line of the log. A run that is stopped from outside — aborted, or out of time — keeps the last progress message instead (Downloading the register's files (10). No row has been delivered yet., Delivered 5,000 of 60,000 rows so far.): run locally, the SDK ended the process as soon as the abort arrived.
- The run succeeded but the dataset is empty — nothing matched; the message names the filters in force and how many matching entities have ended:
No entity matched (status "active", legal form "SAB"). 2,238 entities that match have ended: set status to "terminated" or "all" to get them. - A company I looked up by number is missing — the message names it and the reason that can apply (use case 2). If it names a filter, your input still sends that filter — one saved with the earlier form may hold
"status":"active". A list longer thanmaxResults, or than the rows a maximum charge covers, is cut to its first numbers; the message says so. No entity read: registrationNumbers holds no registration number— the list was sent with entries and none of them has 9 or 11 digits (holds only empty entrieswhen they were blank). Nothing is delivered and only the run start is charged; the other filters were not used. Send an empty list to search.- A search by town returns nothing or odd rows — write the name with Latvian letters (
Rīga,Liepāja): in the register's files of 2026-10-08,locationRīgamatches 94,574 active entities,Riga142 — 131 of them on a "Brigaderes iela". - A capped search returned press titles or old companies only — rows come in the order of the registration number, as the message says:
Delivered 20 entities (stopped at maxResults 20; rows come in order of registration number).RaisemaxResultsor narrow the search. financialsisnull— the open data holds no annual report for the entity (372 of the 1,625Krows of the sample, all 156 sole traders among them; 946 of the 1,120Urows).ownershiplists are empty — terminated entities and press titles have nobody on record, sole traders have no shareholders or beneficial owners, and 12 of the 1,625Krows had nobody at all.- The run failed with "Could not download …" — data.gov.lv did not deliver a complete file in six attempts; the message names the file and the last answer, and no row was delivered. Run it again later. (Run locally against a stand-in for the portal that answered HTTP 503, and one that cut a file short; no platform run failed.)
⚖️ Is it legal to use this data?
The Actor reads open data that the Register of Enterprises publishes on data.gov.lv under CC0. The rows contain personal data: the names of officers, shareholders and beneficial owners, with nationality and country of residence. Personal data is protected by the GDPR and similar laws, so only process it with a legitimate basis. foXLabs is not affiliated with the Register of Enterprises.
🤝 Support & contact
- 🌐 Website: data.foxlabs.com.tr
- 📧 Email: info@foxlabs.com.tr
- 🐛 Issues: open a ticket in the Actor’s Issues tab
- 🧰 More clean B2B data actors: Fox Labs on Apify
Changelog
0.1.12 — 2026-10-09 — lookups return terminated entities, capital and annual report no longer left to chance, registryUrl opens the entity's page; README rewritten
- A lookup by registration number returns the entity whatever its status.
statushas a new first choice, "automatic", and it is the default: active entities for a search, as before, and any status for a lookup. Before, the defaultactivealso applied to lookups, so a terminated company asked for by number came back as nothing. Chooseactiveto keep the old filter on a lookup. - Numbers that return no row are named in the run's status message and in its
NOT_RETURNEDrecord, with the reason that can apply (not in the register, or a filter the entity does not pass). An entry that is not a registration number — nine or eleven digits — is named as well; it used to match nothing, without a word (the earlier build wrote no status message at all). A list longer thanmaxResultsis cut at that many numbers and the message says so, and a name typed next to registration numbers is not searched, which the message also says. A list that holds entries but no registration number returns no row, as it did before, and the message now says why; it is never run as a search of the other filters. capitalis the paid-up share capital, on every run. The register keeps a paid-up amount and, for some companies, a registered one. The Actor took whichever record was newer and, when both carried the same date, either of them — not the same one on every run: on 2026-10-08 that was open for 2,764 companies.capitalis now the paid-up amount (140,503 companies have one), or the entity's latest record of another kind where there is no paid-up one, and the newcapital.kindsays which. New fieldregisteredCapital: the registered amount, for the 3,039 companies whose entry has one (higher than the paid-up amount in 2,830 of them: shares not fully paid).financialsis the entity's own latest report. A parent company files its group's consolidated report next to its own; for the 354 entities with both for their latest year, either could come back. Consolidated reports are no longer used, and among several own reports of one year the one that ends last, then the one filed last, is taken. New fieldsfinancials.periodStartandfinancials.periodEndgive the period the report covers: of the 124,445 reports returned for active Commercial Register entities, 3,982 cover fewer than 300 days and 1,509 more than 430.- The lists of people have a fixed order (by name, as the characters compare); two runs on the same day could return the same two officers in opposite order. Shareholder lines without a name are kept: joint owners (168 member lines and 14 stockholder lines — the register gives no names), an AS's stock held through the depository (37 lines;
nameis the depository;shares,votesandnominalValuearenullbecause the register states no number) and six stockholder lines of persons the file has no name for. Dropping the joint owners left a company's listed shares below its capital.typeon a shareholder line isperson,entity,joint ownersordepository. - Two things the register's files hold are now in the rows. An officer line carries
representationWithAtLeast, the number that belongs to the rightWITH_AT_LEAST— together with at least that many others (27,087 officer lines of 8,968 entities;nullwith any other right). A stockholder line carriesnominalValueandcurrency, as SIA member lines already did (above zero on 22,462 of the 22,476 stock lines that are not depository lines). registryUrlnow leads to the entity's own page on the register's portal (https://info.ur.gov.lv/#/legal-entity/<number>). The earlier link (#/data-search?number=<number>) opened the portal's empty search page: checked in a browser on five entities, the old form showed the entity on none, the new form on all five; five more entities from the other registers (journal, press titles, religious organisations, representative offices) were opened with the new form, and each page shows the entity's number. The value of the field changes; no field was added or removed for it.- Downloads are checked. Each of the register's files is compared with the size the portal announces, and the time limit covers the whole transfer; a file that ended early without an error would have been read as a smaller register (not seen to happen). A run that downloads while the portal replaces its files — at about 20:25 GMT on the two evenings observed — can get files of two days; the run now says so in its status message when the times the portal gives for its files lie more than six hours apart. Lines the CSV reader cannot parse are counted and reported (none in the ten files on 2026-10-08). Rows are written in batches — one by one, 1,625 rows took 46 seconds — and a run with a maximum charge stops at the rows it covers and says so; a lookup then looks up only the first numbers the charge covers.
- A run that finishes or fails says why. The earlier build wrote no status message. A search says "stopped at maxResults" only when the cap cut something. An empty search names the filters in force and, when matching entities exist but have ended, how many:
legalForm: "SAB"matches 2,238 entities, none of them active. A run that cannot download the register's files fails with a message that names the file, and writes itsOUTPUTrecord; it used to end with a stack trace in the log and no message. While it works the run sets progress messages, so a run that is stopped from outside shows the step it had reached. The download failure, the two-day message and the stop from outside were run locally against a stand-in for the portal, not on the platform. - The form's counts are active entities of all, counted on 2026-10-08. They were totals that included terminated entities ("Public organisation (SAB) — 2,238" returned no row by default), dated 2026-07-28 but counted on an older copy. The Enterprise Register journal is no longer called "pre-2005 entities": 34,641 of its entities are active.
- The README's examples did not match this Actor. They used input keys it does not have (
queries,maxResultsPerQuery, with a literalundefinedvalue) and the input table listed phantom fields (maxConcurrency,includeRaw). The text also told readers to look elsewhere for revenue and headcount, which this Actor delivers. Every example now uses the real input and was run on the platform; the output table says how often each field was filled in a measured run. - Corrected claims:
statusisactiveorterminated(notinactive/dissolved); the name search is a "contains" search, not relevance-ranked; rows carry noqueryorscrapedAtfield;activedoes not mean trading. - The Python example works with the current Apify client. It read the results with
run['defaultDatasetId']; withapify-client3 for Pythoncall()returns a run object and that line raisedTypeError: 'Run' object is not subscriptableafter the run had finished. It now readsrun.default_dataset_id; with client version 1 or 2, keeprun['defaultDatasetId']. - No pricing change. Output changes:
capital.kind,registeredCapital,financials.periodStartandperiodEnd,representationWithAtLeaston officer lines andnominalValueandcurrencyon stockholder lines added;capitalcan differ from earlier runs for 2,773 companies — the 2,764 counted above and 9 with a conditional-equity record of the same date — and does differ for 66 more, whose newest record is a registered (58) or a conditional (8) one;financialscan differ for the 354 parents counted above; shareholder lines without a name are delivered (nameisnullor the depository), with the newtypevaluesjoint ownersanddepository; a capital record with no currency hascurrency: null(it was written asEUR; 4 records). Behaviour changes for inputs that already exist: a lookup by number with nostatusgiven also returns terminated entities; a list of numbers longer thanmaxResultsis cut to the first numbers of the list (it was cut to the lowest numbers found); an entry that holds several numbers separated by commas is read as those numbers (its digits were run together and matched nothing).
0.1 — 2026-09-07
- The README was regenerated from a template shared by many Actors; the entry of that day read "Enabled AI-agent payments (x402) + rebuilt the README to the full standard". The label is the generator's: the builds of that day were numbered like the others of this Actor. That README is the one the entry above corrects — its examples and parts of its text did not describe this Actor.
0.1.2 — 2026-07-28
legalFormlabels rebuilt from the register's own code list;activities[]split into separate entries; newregisterTypefilter and EnglishregisterTypeoutput with the letter inregisterTypeCode; thelegalFormfilter no longer over-matches (ASused to matchSEas well).
0.1.1.1 — 2026-07-28
- Financial figures were up to 1,000 times too small for companies that file in thousands; they are now scaled to full currency units and the filing unit is exposed as
financials.reportedIn.
0.1.1 — 2026-07-28
- The Console form's example run shows ownership and financials: both switches are ticked and two example registration numbers are pre-filled.
0.0
- Initial release, 2026-07-09 (the Actor's first changelog called it 0.1): Latvian entities from the Register of Enterprises open data — identity, legal form, address, activity and capital, with opt-in officers, shareholders, beneficial owners (UBO) and annual-report financials.