# Latvia Company Data — Officers, Owners (UBO) & Financials (`foxlabs/latvia-company-data`) Actor

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.

- **URL**: https://apify.com/foxlabs/latvia-company-data.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Lead generation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<p align="center"><a href="https://apify.com/foxlabs/latvia-company-data"><img src="https://data.foxlabs.com.tr/img/latvia-company-data-banner.svg" alt="Latvia Company Data" width="100%" /></a></p>

## Latvia Company Data — Officers, Owners (UBO) & Financials

Need **verified company data for Latvia** — identity, who runs it, who owns it, and how it performs? This Actor turns the official **Register of Enterprises of the Republic of Latvia** (Uzņēmumu reģistrs) open data into clean, ready-to-use records: **~485,000 legal entities** with registered identity, legal form, address, activity and capital — plus, on demand, the **officers**, **shareholders**, **beneficial owners (UBO)** and the latest **annual-report financials**.

Built on Latvia's **official open data** — **free for commercial reuse and redistribution**, **no API key, no login, no fragile HTML scraping**. It reads the register's daily-updated data files directly, so it doesn't break when a website changes.

- 🇱🇻 **~485K Latvian entities** — the whole register, not a sample
- 👔 **Officers & ownership** *(opt-in)* — board / representatives, shareholders (SIA members + AS stockholders) and **beneficial owners (UBO)**
- 📊 **Financials** *(opt-in)* — latest annual report: employees, total assets, equity, net turnover, net income
- 🧭 **Rich filters** — name, registration number, legal form, **register** (companies only, or all), status, location, activity
- 🆓 **Resale-open data** — reuse **and resell**, no key, no scraping

### Quick start (API)

Find active Rīga companies in transport, with officers and owners attached:

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~latvia-company-data/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "location": "Rīga", "activityQuery": "transport", "includeOwnership": true, "maxResults": 100 }'
```

Prefer no code? Open the **Input** tab, set your filters, and click **Start** — then download the results.

### What you get

One clean, flat record per company:

| Field | Type | Description |
|---|---|---|
| `name` | string | Full registered legal name |
| `shortName` | string | Distinctive part of the name (without legal-form wrapper) |
| `registrationNumber` | string | Latvian registration number (the register's unique key) |
| `legalForm` | string | Legal form in English — e.g. `Private limited company (SIA)`, `Joint-stock company (AS)`. Translated for **every** code the register labels (99.7% of entities) |
| `legalFormCode` | string | Original legal-form code (`SIA`, `AS`, `IK`, `ZEM`, `BDR`…) |
| `registerType` | string | Which register the entity sits in, in English — `Commercial Register`, `Mass media register`, `Associations and foundations register`… |
| `registerTypeCode` | string | The register's own one-letter code (`K`, `U`, `B`, `M`…) |
| `status` | string | `active` or `terminated` |
| `registeredDate` / `terminatedDate` | string | Registration and (if struck off) termination dates |
| `address` / `city` / `postalCode` | string | Registered address, derived city, postal index |
| `capital` / `capitalFormatted` | object / string | Registered equity capital (`{ amount, currency }` + a display string) |
| `primaryActivity` / `activities[]` | string / array | Declared areas of activity, **one per array item** — the register stores them as a single free-text blob, which this Actor splits and de-bullets (avg 4.2 items where present) |
| `ownership` *(opt-in)* | object | `{ officers[], shareholders[], beneficialOwners[] }` — see below |
| `financials` *(opt-in)* | object | Latest annual report `{ year, employees, totalAssets, equity, netTurnover, netIncome, currency, reportedIn }`. `reportedIn` is the filer's own unit (`ONES` / `THOUSANDS` / `MILLIONS`); the amounts above it are already scaled to units |
| `source` / `license` / `registryUrl` | string | Provenance — the register, its open-data licence, and the entity's registry link |

**`ownership`** (when `includeOwnership` is on):

- `officers[]` — `{ name, position, governingBody, type, representation }` (board members & representatives)
- `shareholders[]` — `{ name, type, shareClass, shares, nominalValue / votes, currency }` (SIA members + AS stockholders)
- `beneficialOwners[]` — `{ name, nationality, residence }` (UBO as filed with the register)

Missing values come back as `null`, never a guess. Personal identity codes are **masked at source** — this Actor never exposes them.

#### Sample output

Real record for **Lidl Latvija SIA** (`registrationNumbers: ["40203023760"]`, ownership + financials on) — officers abbreviated (7 in full):

```json
{
  "name": "Lidl Latvija SIA",
  "shortName": "Lidl Latvija",
  "registrationNumber": "40203023760",
  "legalForm": "Private limited company (SIA)",
  "legalFormCode": "SIA",
  "registerType": "Commercial Register",
  "registerTypeCode": "K",
  "status": "active",
  "registeredDate": "2016-10-05",
  "terminatedDate": null,
  "address": "Rīga, Dzelzavas iela 131",
  "city": "Rīga",
  "postalCode": "1021",
  "capital": { "amount": 365500000, "currency": "EUR" },
  "capitalFormatted": "365,500,000 EUR",
  "ownership": {
    "officers": [
      { "name": "Dokozic Marin", "position": "CHAIR_OF_BOARD", "governingBody": "EXECUTIVE_BOARD", "type": "person", "representation": "WITH_AT_LEAST" },
      { "name": "Kybartas Marius", "position": "BOARD_MEMBER", "governingBody": "EXECUTIVE_BOARD", "type": "person", "representation": "WITH_AT_LEAST" }
    ],
    "shareholders": [
      { "name": "LSTR-11 GmbH", "type": "entity", "shareClass": "SIA member", "shares": 36550, "nominalValue": 10000, "currency": "EUR" }
    ],
    "beneficialOwners": [
      { "name": "Dieter Josef Schwarz", "nationality": "DE", "residence": "DE" }
    ]
  },
  "financials": {
    "year": 2024, "employees": 1348, "currency": "EUR", "reportedIn": "ONES",
    "totalAssets": 425605168, "equity": 192095909,
    "netTurnover": 460869524, "netIncome": -18465625
  },
  "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/#/data-search?number=40203023760"
}
```

### Example inputs (copy & paste)

```jsonc
// 1) Browse active companies in a city
{ "location": "Rīga", "status": "active", "maxResults": 5000 }

// 2) Exact lookup by registration number, with ownership & financials
{ "registrationNumbers": ["40003009497"], "includeOwnership": true, "includeFinancials": true }

// 3) All joint-stock companies (AS) with their financials
{ "legalForm": "AS", "includeFinancials": true, "maxResults": 2000 }

// 4) Name search — real companies only, no press titles or journal entries
{ "searchQuery": "transport", "status": "active", "registerType": "K" }

// 5) Companies in an activity, with owners for lead / KYC lists
{ "activityQuery": "būvniecība", "includeOwnership": true, "maxResults": 1000 }

// 6) Whole-register sweep, identity only (fast at scale)
{ "status": "all", "maxResults": 200000 }
```

### Input & filters

- **Company name contains** (`searchQuery`) — case-insensitive substring on the registered name.
- **Registration numbers** (`registrationNumbers`) — exact lookup; overrides the name search.
- **Legal form** (`legalForm`) — code or Latvian text (`SIA`, `AS`, `IK`, `ZEM`, `BDR`, `NOD`…).
- **Register** (`registerType`) — the register holds more than companies. `K` keeps only the **Commercial Register** (today's companies), `KU` adds the pre-2005 Enterprise Register journal; empty means all registers. Use it to drop press titles, associations and political parties from a broad name search.
- **Status** (`status`) — `active`, `terminated`, or `all`.
- **Location contains** (`location`) — matches the registered address (city / district / street).
- **Activity contains** (`activityQuery`) — matches the declared area of activity.
- **Include officers & ownership** (`includeOwnership`) — attach officers, shareholders and beneficial owners.
- **Include financials** (`includeFinancials`) — attach the latest annual-report figures.
- **Max results** (`maxResults`) — 1 to **500,000**.

### Use cases

- **B2B prospecting & market mapping.** Filter by location, activity and legal form to build a targeted list of Latvian companies, then attach officers to reach the decision-makers.
- **KYC / KYB & due diligence.** Resolve the exact legal entity, its officers, shareholders and **beneficial owners** — the ownership chain your compliance file needs, from one authoritative source.
- **Financial screening.** Pull the latest annual-report figures (turnover, assets, equity, net income, headcount) to size and rank companies.
- **Ownership & risk mapping.** Trace who controls a company through its shareholders and UBO records.
- **Enrichment.** Match your CRM on the registration number and top up legal form, address, activity, capital, officers and financials.

### Performance & throughput

The Actor reads Latvia's official open-data files directly (daily-updated) and queries them locally with DuckDB. Identity-only runs are quick; **ownership** adds four register files and **financials** add the annual-report files, so those runs download more up front and take a little longer. A whole-register sweep pages through all ~485K entities up to your `maxResults`. No proxies, no keys, no per-request rate limits.

### Integrations

**JavaScript** (`apify-client`):

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('foxlabs/latvia-company-data').call({
  location: 'Rīga', includeOwnership: true, maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python** (`apify-client`):

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("foxlabs/latvia-company-data").call(run_input={
    "location": "Rīga", "includeOwnership": True, "maxResults": 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["registrationNumber"])
```

Also works with **Make / n8n / Zapier**, scheduled runs, webhooks, and the **Apify MCP server** for AI agents.

### Data quality (honest)

- **Identity is dense.** Name, registration number, legal form, status, address and registration date are present for essentially every entity — they're core register fields.
- **Capital** is present for most commercial companies (SIA / AS); some entity types carry none and come back `null`.
- **Declared activity** comes from the register's legacy activity dataset and covers a subset of entities (63,299 of ~485K, skewed to older companies) — Latvia's open data doesn't publish a broad industry / NACE classification, so many modern companies return an empty `activities` list. Use it where present, not as a primary filter. Where present it is free text as typed by the filer, split into one array item per declared activity (avg 4.2), not a coded taxonomy.
- **The register is wider than "companies."** Press titles, associations, political parties, religious congregations and pre-2005 journal entries live in the same database and match the same name searches — 21 of 100 rows for a plain "transport" search. `registerType` (`K` = Commercial Register) filters them out; `registerTypeCode` tells you which register any given row came from.
- **Ownership is richer for commercial companies.** SIA members, AS stockholders, officers and UBO exist where the company was required to file them; sole traders and some small entities have fewer. `directly` reported only — nothing inferred.
- **Financials** cover companies that file annual reports (most active SIA/AS); the latest available year is returned. Amounts are as filed, in the reported currency.
- **No contact details.** The Latvian open register does **not** publish company email or phone, so this Actor doesn't invent them — it focuses on identity, ownership and financials. For email/phone lead data see our other company Actors.
- Nothing is fabricated — a missing value is `null`, never a guess. Personal ID codes are masked at source.

### Pricing

**Pay per result** — you're billed per company returned; officers, ownership and financials are included in that price when enabled. There's an Apify **free tier** to evaluate the full feature set. No proxies, no third-party API costs — Latvia's data is a free public open-data source.

### FAQ

**Where does the data come from?** The official **Register of Enterprises of the Republic of Latvia** (Uzņēmumu reģistrs) open data, published on Latvia's national open-data portal and updated daily.

**Can I use this data commercially / resell it?** Yes. Latvia's open data may be **reused and redistributed freely, including commercially**, by natural and legal persons. Records carry a `Source` credit as good practice.

**Do I get beneficial owners (UBO)?** Yes — turn on **Include officers & ownership** and each record carries `beneficialOwners[]` as filed with the register (name, nationality, residence).

**Does it include company email or phone?** No — the Latvian register doesn't publish contact details, so we don't fabricate them. This Actor is identity, ownership and financials.

**How fresh is it?** The register republishes the open data daily; each run reads the current files.

**Do I need an API key or account for the source?** No. No key, no login, no scraping.

**What export formats?** JSON, CSV, Excel, or via the Apify API / integrations.

### Troubleshooting

- **Few / no results** → your filters may be too narrow, or the companies are `terminated` (the default is active only — set `status` to `all`).
- **No ownership / financials on a record** → confirm the relevant toggle is on; small entities and non-filers legitimately have none.
- **Name search returns extra matches** → it's a substring match; narrow with `legalForm`, `location` or an exact `registrationNumbers` lookup.

### Notes, limits & legal (honest)

- **Official open data**, reused under Latvia's open-data terms (free commercial reuse & redistribution). Not affiliated with the Register of Enterprises.
- **Identity, ownership & financials — not contacts.** No email or phone in the source.
- **Ownership & financials are what companies filed** with the register; coverage varies by entity type and filing obligations.
- **Personal data** is limited to what the public register publishes (names, roles); identity codes are masked.

### Support

Questions, a field you'd like added, or a custom build? Open the **Issues** tab on this Actor, or email **info@foxlabs.com.tr**. We reply fast.

*If this Actor saves you time, a ⭐ review really helps.*

### Changelog

#### 0.1.2 — 2026-07-28

- **`legalForm` is now translated for every code the register labels.** The old map carried five codes the register never uses (`ZS`, `IU`, `KOOP`, `VAS`, `PAS`) and was missing common real ones, so `MIL`, `IND` and `KB` rows came back in Latvian — **21 of 100** rows on a `"transport"` search. The map now covers all 48 labelled codes: **90.7% → 99.71%** of the register's 485,846 entities (measured 2026-07-28). The remaining 0.29% are six legacy public-organisation codes (`SPO`, `ASF`, `KOR`, `SAA`, `SPA`, `PRO`) that the register itself publishes **no label for** — those return the raw code rather than a guess.
- **`activities[]` is a real array now.** The register stores declared activities as one free-text blob (CRLF- or `;`-separated, with `*` used as a bullet); the Actor emitted the whole blob as a single string. It is now split, de-bulleted, trimmed and de-duplicated: across all 63,299 entities with activity data, **63,299 → 267,181** items (avg **4.2** per company); the 27 rows whose blob was only whitespace now return `[]` instead of a junk string. `primaryActivity` is the first real activity, not the head of a blob.
- **New `registerType` filter.** The Register of Enterprises holds press titles, associations, political parties and pre-2005 journal entries alongside companies — **21 of 100** rows for a plain `"transport"` name search. Set `registerType` to `K` for the Commercial Register only, `KU` to add the pre-2005 journal, or pick any single register.
- `registerType` in the output is now **English** (`Commercial Register`) instead of Latvian (`Komercreģistrs`), with the register's own letter code in the new **`registerTypeCode`** field — matching how `legalForm` / `legalFormCode` already work.
- **`legalForm` filter tightened.** Picking `AS` also returned European companies (`SE`), because a code was matched as a substring of the Latvian label too ("Eiropas"). An exact code now matches the code only; free text still searches the label.
- Docs: `financials.reportedIn` is now described in the field table.

#### 0.1.1.1 — 2026-07-28

- **Fixed: financial figures could be 1000× too small.** Latvian filers may report in units or in thousands (the register's `rounded_to_nearest` column), which the Actor ignored — so every `THOUSANDS` filing was understated by three orders of magnitude, and those are disproportionately the largest companies. All figures are now scaled to real currency units, and the filer's stated unit is surfaced as `financials.reportedIn`. Verified on the platform: Latvenergo `totalAssets` 4,189,397 → **4,189,397,000** (≈ €4.19 bn); Rimi Latvia, which files in units, is unchanged.

#### 0.1.1 — 2026-07-28

- **Officers/ownership and financials are now prefilled ON**, with a ready KYB lookup (`40003053029` SIA "RIMI LATVIA" + `40003286799` SIA "Mikrotīkls"/MikroTik) — the first run out of the box returns officers, shareholders, **beneficial owners (UBO)** and the latest annual report (100% fill on both records, measured 2026-07-28), not identity-only rows. The API `default` for both toggles is unchanged (`false`).
- Docs: enrichment toggles now state their measured download cost (ownership ~85 MB, financials ~500 MB).

#### 0.1 — 2026-07-09

- Initial release. ~485K Latvian entities from the official Register of Enterprises open data: identity, legal form, address, activity and capital, with opt-in officers, shareholders, beneficial owners (UBO) and annual-report financials. Resale-open, no key.

***

Part of the **[foXLabs data platform](https://data.foxlabs.com.tr/)** — official public-data company, contact, ownership, jobs, charity, location & AI-search intelligence scrapers. Browse the full suite at **[data.foxlabs.com.tr](https://data.foxlabs.com.tr/)**.

# Actor input Schema

## `searchQuery` (type: `string`):

Keep only companies whose registered name contains this text (case-insensitive). Example: "transport", "SIA Rimi". Leave empty to browse by the other filters.

## `registrationNumbers` (type: `array`):

Exact 11-digit Latvian registration numbers for precise lookup (e.g. \["40003053029"] = SIA "RIMI LATVIA", \["40003286799"] = SIA "Mikrotīkls" / MikroTik). Overrides the name search when set.

## `legalForm` (type: `string`):

Filter to a single legal form, using the Latvian register's own entity-type codes. Select "All" to include every legal form. Counts are the whole register (485,846 entities, 2026-07-28).

## `registerType` (type: `string`):

The Latvian Register of Enterprises holds more than companies — press titles, associations, political parties and pre-2005 journal entries share the same database. Pick "Commercial Register only" for company data; a broad name search otherwise mixes them in (measured: 21 of 100 rows for "transport").

## `status` (type: `string`):

Filter by registration status. Active = still on the register; Terminated = struck off / liquidated.

## `location` (type: `string`):

Keep only companies whose address contains this text — a city, district or street (e.g. "Rīga", "Liepāja", "Jūrmala"). Leave empty for all of Latvia.

## `activityQuery` (type: `string`):

Keep only companies whose declared area of activity contains this text (e.g. "transport", "būvniecība", "IT"). Leave empty for all activities.

## `includeOwnership` (type: `boolean`):

Attach each company's officers (board / representatives), shareholders (SIA members + AS stockholders) and beneficial owners (UBO). Off by default — adds ~85 MB of reference downloads at the start of the run.

## `includeFinancials` (type: `boolean`):

Attach the latest annual-report figures — employees, total assets, equity, net turnover and net income. Off by default — adds ~500 MB of reference downloads at the start of the run, so it is the slowest option.

## `maxResults` (type: `integer`):

Maximum number of companies to return (1–500000).

## Actor input object example

```json
{
  "registrationNumbers": [
    "40003053029",
    "40003286799"
  ],
  "legalForm": "",
  "registerType": "",
  "status": "active",
  "includeOwnership": true,
  "includeFinancials": true,
  "maxResults": 1000
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "",
    "registrationNumbers": [
        "40003053029",
        "40003286799"
    ],
    "legalForm": "",
    "registerType": "",
    "location": "",
    "activityQuery": "",
    "includeOwnership": true,
    "includeFinancials": true,
    "maxResults": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/latvia-company-data").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "",
    "registrationNumbers": [
        "40003053029",
        "40003286799",
    ],
    "legalForm": "",
    "registerType": "",
    "location": "",
    "activityQuery": "",
    "includeOwnership": True,
    "includeFinancials": True,
    "maxResults": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/latvia-company-data").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "",
  "registrationNumbers": [
    "40003053029",
    "40003286799"
  ],
  "legalForm": "",
  "registerType": "",
  "location": "",
  "activityQuery": "",
  "includeOwnership": true,
  "includeFinancials": true,
  "maxResults": 1000
}' |
apify call foxlabs/latvia-company-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=foxlabs/latvia-company-data",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ZQZgOdhaJDnoZBPWO/builds/0JU5IxUZPUzuRdFQl/openapi.json
