Caucasus Company Screen (Georgia · Armenia · Moldova) avatar

Caucasus Company Screen (Georgia · Armenia · Moldova)

Pricing

from $100.00 / 1,000 matched company records

Go to Apify Store
Caucasus Company Screen (Georgia · Armenia · Moldova)

Caucasus Company Screen (Georgia · Armenia · Moldova)

Screen a company name, or a list of up to 200, across Georgia's and Armenia's public registers in one call, plus Moldova on request: status and legal form, Armenian beneficial owners and public-contract exposure, Moldovan founders and directors. One evidence-backed screening record per query.

Pricing

from $100.00 / 1,000 matched company records

Rating

0.0

(0)

Developer

Soso Pkhakadze

Soso Pkhakadze

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

6 days ago

Last modified

Share

One company name in, one evidence-backed screening record out, across Georgia's and Armenia's public registers in a single call, with Moldova added when you ask for it. Or paste a list of up to 200 names and get one screening record per line (see Batch mode below):

  • Georgia (NAPR public registry, default): matches with legal form and registration status
  • Armenia (state register, default): matches with registration data, tax ID, beneficial owners from the three most recent official declarations (only owners in the latest one are marked isCurrent: true), and public-contract exposure (count, total AMD, single-source awards, latest three contracts) from the weekly contracts index
  • Moldova (ASP open data, opt-in only: add MD to countries): matches with legal form, status, founders (with shares where the data gives them) and directors

Then one company record per match with the full detail, and an explicit unavailable record for any register that could not be read. The Armenian contracts index is treated the same way: if it cannot be read, Armenian matches carry publicContracts with status: "unavailable" and count: null, the summary shows armenianPublicContracts.count: null and lists AM-contracts under sourcesUnavailable, and an unavailable record says so. Unknown never reads as zero.

Who uses it

  • KYC / onboarding analysts who need a first-pass answer in seconds: does this name exist in the region, where, is it active, who's behind it, does it live on state contracts.
  • Sanctions and due-diligence teams mapping counterparties across the Caucasus corridor without three separate portals in three alphabets.
  • AI agents doing counterparty research: one tool call instead of orchestrating three.

Input

FieldTypeDescription
querystringCompany name, any script; partial works, exact matches best. Names only: a registry ID is searched as a name.
queriesarray of stringsBatch mode: one company name per line, up to 200. When given, it replaces query.
countriesarraySubset of GE, AM, MD (default GE,AM; Moldova opt-in until its open-data re-use terms are confirmed in writing).
maxPerCountryintegerCap on matches per register (default 3; each is a charged record).
includeContractsbooleanArmenian public-contract exposure (default true).

countries, maxPerCountry and includeContracts apply to every query in a batch.

Batch mode

Compliance teams rarely check one counterparty; they check a vendor file. Put the names in queries (one per line in the Console editor, a JSON array over the API) and the actor screens them in order, two at a time, and writes for each line:

  1. one screen record, tagged with batchIndex (0-based position in your list) and query (the line as you sent it), then
  2. its company records (same tags), then
  3. any unavailable records for registers that could not be read.

Rules that hold across the batch:

  • A line whose screening fails outright still gets its screen record, with verdict: "inconclusive: screening failed" and every register listed under sourcesUnavailable, plus one unavailable record per register. The rest of the list keeps running. Nothing is ever silently skipped.
  • If your run's maximum charge is reached, the actor stops cleanly after the last fully paid query and logs how many of the list were screened. Records already written stay in the dataset.
  • Blank lines are dropped. Lines past the 200th are ignored with a warning; split larger files across runs.
  • Duplicates are screened (and charged) each time they appear. Dedupe your file first if that matters.

To join results back to your file, group the dataset by batchIndex: the screen record gives the verdict, the company records give the detail.

From a CSV to a batch run

Take the name column of a CSV, turn it into the queries array and start a run over the API. With jq and curl:

# vendors.csv has a header row and the company name in column 2
tail -n +2 vendors.csv | cut -d, -f2 | sed 's/^"//; s/"$//' \
| jq -R -s -c '{queries: (split("\n") | map(select(length > 0))), countries: ["GE","AM"]}' \
> input.json
curl -s -X POST "https://api.apify.com/v2/acts/reestri~company-screen/runs?token=$APIFY_TOKEN&memory=512" \
-H "Content-Type: application/json" -d @input.json

When the run finishes, fetch the dataset as CSV (.../datasets/<datasetId>/items?format=csv) and filter on resultType = screen for one row per input line, or resultType = company for the matched companies. Both carry batchIndex and query.

Node users can do the same without jq:

import { ApifyClient } from "apify-client";
import { readFileSync } from "node:fs";
const queries = readFileSync("vendors.csv", "utf8").split("\n").slice(1)
.map((l) => l.split(",")[1]?.replace(/^"|"$/g, "").trim()).filter(Boolean);
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("reestri/company-screen").call({ queries, countries: ["GE", "AM"] }, { memory: 512 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const screens = items.filter((r) => r.resultType === "screen"); // one per input line, in order

Over MCP

The standby MCP server (https://mcp.apify.com/?tools=reestri/company-screen) exposes two tools: screen_company (one name, unchanged) and screen_companies (a queries array, up to 50 per call, same countries, maxPerCountry and includeContracts). screen_companies returns a batch header (queries, matched companies, inconclusive count) and a results array in input order, each entry carrying batchIndex, query, screen, companies and unavailable.

Output

First record, the screen. Real output for Silknet with the default countries, run on 2026-09-01 (hashes shortened):

{
"resultType": "screen",
"query": "Silknet",
"countries": ["GE", "AM"],
"summary": {
"matchedCompanies": 1,
"byCountry": { "AM": 0, "GE": 1 },
"byStatus": { "active": 1 },
"beneficialOwnersFound": 0,
"foundersOrShareholdersFound": 0,
"armenianPublicContracts": { "count": 0, "totalAMD": 0 },
"sourcesUnavailable": [],
"verdict": "1 match(es); review status, owners and contract exposure"
},
"sources": {
"AM": { "status": "ok", "matches": 0, "candidates": 0, "evidence": { "sourceUrl": "https://e-register.moj.am/en/search/companies?query=Silknet", "sha256": "98008…" }, "ms": 1369 },
"GE": { "status": "ok", "matches": 1, "candidates": 1, "evidence": { "sourceUrl": "https://enreg.reestri.gov.ge/main.php?c=search&m=find_legal_persons&name=Silknet", "sha256": "a7084…" }, "ms": 2881 }
},
"evidence": { "retrievedAt": "2026-09-01T00:06:43.754Z", "sourceUrls": { "AM": "https://e-register.moj.am/en/search/companies?query=Silknet", "GE": "https://enreg.reestri.gov.ge/main.php?c=search&m=find_legal_persons&name=Silknet" } }
}

The Georgian match here is შპს სილკნეტი (204952685), the company the registry's own search returns for the Latin spelling. For the telecom group itself, search in Georgian script (სილქნეტი).

Armenian names are mostly registered in Armenian script and the register has no English name index. For a name typed in Latin letters, the Armenian side retries without legal-form words and then with up to a few Armenian transliterations (four extra searches at most), and returns the Latin and Armenian matches together, so Inecobank finds «ԻՆԵԿՈԲԱՆԿ» ՓԲԸ. The company's match block shows method: "transliterated" and the variant used. Transliteration is a best guess; check the name and tax ID.

Summary fields:

  • matchedCompanies, byCountry, byStatus: matches returned, per register and per status.
  • beneficialOwnersFound: distinct current beneficial owners, summed over the matched companies. Current means named in the company's most recent declaration without an end date (isCurrent not false). Distinct means one count per owner per company, by personKey when the register gives one, otherwise by entity type plus name, so an owner who holds several interests or appears in older declarations counts once. The full people list on each company record still keeps every entry from every declaration read.
  • foundersOrShareholdersFound: the same rule for founders and shareholders (Moldova).
  • armenianPublicContracts: contract count and total AMD across Armenian matches, or count: null with status: "unavailable" when the index could not be read.
  • sourcesUnavailable, verdict: registers that could not be read, and a one-line reading of the result.

Followed by company records (same schema as the single-country tools, plus publicContracts on Armenian matches). In batch mode every record also carries batchIndex and query, and the screen/company/unavailable group repeats once per input line.

Pricing

Pay per event: one screen per query (including a query whose verdict is inconclusive because a register could not be read), one company-record per matched company. Georgia and Armenia are read live; Moldova and Armenian contracts come from weekly indexes (snapshot date in evidence.registryAsOf on Moldovan records and in publicContracts.indexAsOf on Armenian ones).

A batch costs exactly what the same names would cost one at a time: N screen events plus one company-record per matched company across the whole list. Worked example at the list prices ($0.50 per screen, $0.10 per company record): 100 names, of which 60 match one company each and 10 match two, is 100 x $0.50 + 80 x $0.10 = $58.00. The upper bound for a batch is N x (screen price + maxPerCountry x countries x record price); with the defaults (3 per register, 2 registers) that is $1.10 per name, and in practice most names return zero or one match. Set a maximum charge on the run if you want a hard cap; the actor stops cleanly when it is reached.

Scope, hygiene, legality

Georgia: search-level data only (ownership views are captcha-gated and not automated). Armenia: owners' home addresses never included. Moldova: published as the state publishes it; no personal identification numbers exist in the source. Every source URL and hash is in the evidence blocks.