# Cyprus Company Registry Scraper - DRCOR Directors & Filings (`scrapers_lat/cyprus-drcor-companies-scraper`) Actor

Search the Cyprus register of companies (DRCOR): registration number, type, status, incorporation date, registered office, directors and secretaries, former names, annual return and accounts filing history, pending filings. Greek names transliterated to Latin. JSON, CSV, Excel.

- **URL**: https://apify.com/scrapers\_lat/cyprus-drcor-companies-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $13.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

[![Cyprus Company Registry Scraper](https://scrapers.lat/banners/cyprus-drcor-companies-scraper.png)](https://apify.com/scrapers_lat/cyprus-drcor-companies-scraper)

## Cyprus Company Registry Scraper

Company data from the official Cyprus register of companies: who owns the file, who runs it, where it is registered, what it has filed and whether it is still alive. Names filed in Greek come back transliterated to Latin as well, so the output drops straight into a CRM or a screening pipeline.

Here is one real result, trimmed to show every field the actor returns:

```json
{
  "organisationName": "BOLUMIO HOLDINGS LIMITED",
  "organisationNameLatin": "BOLUMIO HOLDINGS LIMITED",
  "registrationNumber": "HE 470001",
  "registrationNumberDigits": "470001",
  "registerPrefix": "HE",
  "registerName": "Company",
  "organisationType": "Limited Company",
  "organisationSubType": "Private",
  "organisationStatus": "Active",
  "isActive": true,
  "statusDate": "20/01/2025",
  "statusDateIso": "2025-01-20",
  "nameStatus": "Current Name",
  "registrationDate": "20/01/2025",
  "registrationDateIso": "2025-01-20",
  "ageYears": 1.6,
  "matchedName": null,
  "previousNames": [],
  "registeredOfficeStreet": "Γρίβα Διγενή, 42,",
  "registeredOfficeBuilding": "OFFICE 3",
  "registeredOfficePostalCode": "3035",
  "registeredOfficeCity": "Λεμεσός",
  "registeredOfficeCityLatin": "Lemesos",
  "registeredOfficeCountry": "Κύπρος",
  "registeredOffice": "Γρίβα Διγενή, 42, OFFICE 3 3035, Λεμεσός, Κύπρος",
  "registeredOfficeLatin": "Griva Digeni, 42, OFFICE 3 3035, Lemesos, Kypros",
  "officials": [
    { "name": "ΜΑΡΙΑ ΒΕΝΙΖΕΛΟΥ", "nameLatin": "MARIA VENIZELOU", "position": "Director", "isCorporate": false },
    { "name": "ΑΝΔΡΕΑΣ ΕΡΩΤΟΚΡΙΤΟΥ", "nameLatin": "ANDREAS EROTOKRITOU", "position": "Secretary", "isCorporate": false }
  ],
  "directors": ["MARIA VENIZELOU", "ALEXIS EROTOKRITOU"],
  "secretaries": ["ANDREAS EROTOKRITOU"],
  "officialsCount": 4,
  "directorsCount": 3,
  "hasCorporateOfficials": false,
  "pendingServices": [],
  "pendingServicesCount": 0,
  "hasPendingServices": false,
  "lastAnnualReturnDate": "31/12/2025",
  "lastAnnualReturnDateIso": "2025-12-31",
  "annualReturns": [
    { "service": "Filing of annual return", "orderNumber": "3311902", "formNumber": "HE32", "annualReturnDate": "31/12/2025", "annualReturnDateIso": "2025-12-31" }
  ],
  "annualReturnsCount": 2,
  "latestFiledAnnualReturn": "2025-12-31",
  "latestFiledAccounts": "2025-12-31",
  "fileLastUpdate": "12/02/2026",
  "fileLastUpdateIso": "2026-02-12",
  "scrapedAt": "2026-08-21T21:31:07.482Z"
}
```

### What you get

**Identity** — current registered name in the original script and in Latin, full registration number with its register prefix (HE company, AE overseas company, S partnership, BN business name, EE European company), organisation type and sub-type (private or public), and the register the file sits in.

**Status and dates** — live registry status (Active, Dissolved, Strike Off, Winding Up by the Court, Dissolution following Voluntary Liquidation and the rest), the date that status took effect, incorporation date, and company age in years. `isActive` gives you a one-field filter.

**Former names** — the complete rename chain. Search a company under a name it used ten years ago and you still get the record under its current name, with the old one preserved in `previousNames` and `matchedName`.

**Officers** — every director and secretary on file, each with the name as filed, a Latin transliteration, the position, and an `isCorporate` flag that marks corporate directors and secretaries. `directors`, `secretaries` and `hasCorporateOfficials` are pre-split so nominee and trustee structures stand out immediately.

**Registered office** — street, building, floor and office, parish, postal code, city and country, as filed and transliterated.

**Filing history** — the annual return and financial statement archive with dates, form numbers and order numbers, plus `latestFiledAnnualReturn` and `latestFiledAccounts` so you can spot a file that has gone quiet. `pendingServices` lists filings that have been ordered but not yet registered, which is a live signal that something is changing right now.

### Ways to search

| Mode | What it does |
|---|---|
| By organisation name | Find a known company. Words are matched whole, so add a second word to narrow a common one |
| By registration number | Look up a list of numbers, in any format: `HE 336562`, `HE336562` or `336562` |
| Registration number range | Sweep a slice of the register. Numbers are handed out in order, so a range is also a clean feed of newly incorporated companies |

### Filters

Every filter is applied before a record is counted, so you only pay for rows you asked for.

- `activeOnly` and `organisationStatuses` — drop dissolved, struck-off and liquidated files, or keep only one status
- `registerPrefixes` and `organisationTypes` — companies only, partnerships only, overseas branches only
- `registeredFrom` and `registeredTo` — incorporation date window, for new-company lead lists
- `officialNameContains` — every organisation in the scanned set that has a given person or corporate nominee as an officer. Matches the Greek and the Latin spelling
- `cityContains` — Limassol, Nicosia, Larnaca, Paphos, Famagusta
- `minOfficials` — skip shelf files with a single officer
- `includeNameApplications` — reserved names that are not yet registered companies, an early signal of formations in progress
- `fetchDetails` — turn off for a fast name, number, type and status listing

### Who is it for

| Use case | Who benefits |
|---|---|
| KYB and onboarding | Compliance teams verifying a Cyprus counterparty, its officers and whether the file is current |
| AML and due diligence | Investigators mapping nominee directors, corporate secretaries and rename histories |
| Corporate services leads | Firms targeting companies with overdue annual returns or newly incorporated entities |
| Fund and holding research | Analysts tracing Cyprus holding structures behind a group |
| Data enrichment | Teams appending registration numbers, status and addresses to an existing company list |

### Tips

- Name search is refused by the registry when a term matches too many organisations. Add a second word, or switch to a registration number range to work through the register in slices.
- Registration numbers are sequential, so `registrationNumberFrom` and `registrationNumberTo` around the current top of the register give you the companies formed in a given week.
- `officialNameContains` filters within whatever you search, so pair it with a number range when you want an officer's portfolio across a period.
- `maxRecords` is a hard cap and controls run cost.

### FAQ and troubleshooting

**Which organisations are covered?** Everything on the public register: limited companies, public companies, partnerships, business names, overseas companies and European companies, active and dissolved alike.

**Why are some names in Greek?** Cypriot-owned entities often file in Greek. Every name and address field has a `Latin` companion produced by transliteration, and the original is always kept.

**Why do some officer names read as XXXXX?** A small number of older files, mostly dissolved partnerships, have their officer names masked on the public register. That is how the register publishes them; the actor does not alter it.

**Are shareholders included?** No. The public register publishes directors and secretaries. Shareholder registers are not part of the public file.

**How fresh is the data?** It is read live on every run. `fileLastUpdate` tells you when the registry itself last touched the file, and `scrapedAt` when the record was collected.

**Why is `annualReturns` empty for some companies?** Partnerships and business names do not file annual returns, and a company incorporated in the last year may not have filed its first one yet.

**Do I need an API key or credentials?** No. The register is public and the actor needs nothing from you beyond the search input.

**What happens if a lookup fails?** It is skipped and the run continues. Nothing is charged for a record that could not be retrieved.

***

Not affiliated with, endorsed by or sponsored by the Department of Registrar of Companies and Intellectual Property of Cyprus. All data is read from publicly available records.

# Actor input Schema

## `searchMode` (type: `string`):

How to pick the organisations. Name search is best for a known company; a registration-number range sweeps whole slices of the register (the only route to complete coverage, because name search is refused when it matches too many organisations).

## `searchName` (type: `string`):

Words to look for in the organisation name. The registry matches WHOLE WORDS, not prefixes: "ZORBAS" finds ZORBAS but "ZORB" does not. Add a second word to narrow a common term.

## `nameMatchType` (type: `string`):

All words: every word must appear in the name. Any word: at least one word must appear (much broader).

## `soundLike` (type: `boolean`):

Also match names that sound like the search term.

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

Registration numbers to look up, e.g. "HE 336562", "HE233333" or just "200000". Used when search mode is "By registration number(s)".

## `registrationNumberFrom` (type: `integer`):

First registration number of the sweep. Used when search mode is "Registration number range".

## `registrationNumberTo` (type: `integer`):

Last registration number of the sweep. The Cyprus register currently runs to roughly 490,000.

## `registerPrefixes` (type: `array`):

Keep only these registers. HE = company, AE = overseas company, S = partnership, BN = business name, EE = European company (SE). Leave empty for all.

## `organisationTypes` (type: `array`):

Keep only organisations whose type contains one of these, e.g. "Limited Company", "Partnership", "Overseas Company", "Business Name".

## `organisationStatuses` (type: `array`):

Keep only these statuses, e.g. "Active", "Dissolved", "Winding Up by the Court", "Dissolution following Voluntary Liquidation", "Strike Off".

## `activeOnly` (type: `boolean`):

Drop dissolved, struck-off and liquidated organisations.

## `registeredFrom` (type: `string`):

Keep only organisations incorporated on or after this date (YYYY-MM-DD). Great for finding newly formed Cyprus entities.

## `registeredTo` (type: `string`):

Keep only organisations incorporated on or before this date (YYYY-MM-DD).

## `officialNameContains` (type: `string`):

Keep only organisations that have an officer whose name contains this text (matched against both the Greek and the transliterated Latin form). Use it to map the portfolio of a director or a corporate nominee.

## `cityContains` (type: `string`):

Keep only organisations whose registered office is in this city, e.g. "Limassol", "Nicosia", "Larnaca".

## `minOfficials` (type: `integer`):

Keep only organisations with at least this many directors and secretaries on file.

## `currentNamesOnly` (type: `boolean`):

Return one record per organisation under its current name, with former names listed in previousNames. Turn off to also emit hits that only matched a former name.

## `includeNameApplications` (type: `boolean`):

Also return reserved-but-not-yet-registered names (early signal of companies about to be formed). They have no registration number.

## `fetchDetails` (type: `boolean`):

Open each organisation's file for directors and secretaries, registered office, incorporation date, filing history and pending filings. Turn off for a fast name/number/status listing only.

## `maxRecords` (type: `integer`):

Stop after this many organisations.

## `maxConcurrency` (type: `integer`):

Parallel registry sessions. Higher is faster but leans harder on the registry.

## `proxyConfiguration` (type: `object`):

Optional proxy. The registry is reachable without one; enable a proxy only if you hit rate limits.

## Actor input object example

```json
{
  "searchMode": "name",
  "searchName": "DELOITTE",
  "nameMatchType": "allWords",
  "soundLike": false,
  "registrationNumbers": [
    "HE 233333",
    "HE 200000"
  ],
  "registrationNumberFrom": 1,
  "registrationNumberTo": 500,
  "registerPrefixes": [],
  "organisationTypes": [],
  "organisationStatuses": [],
  "activeOnly": false,
  "currentNamesOnly": true,
  "includeNameApplications": false,
  "fetchDetails": true,
  "maxRecords": 10,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (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 = {
    "searchName": "DELOITTE",
    "registrationNumbers": [
        "HE 233333",
        "HE 200000"
    ],
    "registerPrefixes": [],
    "organisationTypes": [],
    "organisationStatuses": [],
    "maxRecords": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/cyprus-drcor-companies-scraper").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 = {
    "searchName": "DELOITTE",
    "registrationNumbers": [
        "HE 233333",
        "HE 200000",
    ],
    "registerPrefixes": [],
    "organisationTypes": [],
    "organisationStatuses": [],
    "maxRecords": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/cyprus-drcor-companies-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchName": "DELOITTE",
  "registrationNumbers": [
    "HE 233333",
    "HE 200000"
  ],
  "registerPrefixes": [],
  "organisationTypes": [],
  "organisationStatuses": [],
  "maxRecords": 10
}' |
apify call scrapers_lat/cyprus-drcor-companies-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/cyprus-drcor-companies-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LhcRG51kw43tDAzSD/builds/xKf0aJKgwj1qGSBMQ/openapi.json
