Caucasus Company Screen (Georgia · Armenia · Moldova)
Pricing
from $100.00 / 1,000 matched company records
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
6 days ago
Last modified
Categories
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
MDtocountries): 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
| Field | Type | Description |
|---|---|---|
query | string | Company name, any script; partial works, exact matches best. Names only: a registry ID is searched as a name. |
queries | array of strings | Batch mode: one company name per line, up to 200. When given, it replaces query. |
countries | array | Subset of GE, AM, MD (default GE,AM; Moldova opt-in until its open-data re-use terms are confirmed in writing). |
maxPerCountry | integer | Cap on matches per register (default 3; each is a charged record). |
includeContracts | boolean | Armenian 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:
- one
screenrecord, tagged withbatchIndex(0-based position in your list) andquery(the line as you sent it), then - its
companyrecords (same tags), then - any
unavailablerecords for registers that could not be read.
Rules that hold across the batch:
- A line whose screening fails outright still gets its
screenrecord, withverdict: "inconclusive: screening failed"and every register listed undersourcesUnavailable, plus oneunavailablerecord 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 2tail -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.jsoncurl -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 (isCurrentnot false). Distinct means one count per owner per company, bypersonKeywhen 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 fullpeoplelist on eachcompanyrecord 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, orcount: nullwithstatus: "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.