# Greek Public Contractor Profile (ΑΦΜ lookup) (`jimkarageo/greek-contractor-profile`) Actor

Give a company VAT number (ΑΦΜ), get its complete record with the Greek state: total value won, which authorities award it, direct-award share, CPV mix, yearly trend and biggest contracts.

- **URL**: https://apify.com/jimkarageo/greek-contractor-profile.md
- **Developed by:** [Dimitris Karageorgis](https://apify.com/jimkarageo) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $150.00 / 1,000 company profiles

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Greek Public Contractor Profile (ΑΦΜ lookup)

Give a company's Greek VAT number (**ΑΦΜ**) and get its complete record with the Greek state: how much it has won, which authorities award it, how much came through direct awards, what it sells, how that has changed year by year, and its biggest and most recent contracts.

Built on the official ΚΗΜΔΗΣ procurement registry API. No scraping, no login, no API key.

***

### Why this exists

The registries publish contracts. Nobody publishes **the company**. To answer "who is this contractor, really?" you would have to pull every act it appears in, across hundreds of contracting authorities, and add it up yourself — through an API that silently truncates long date ranges.

This Actor does that, and answers in one record.

**Who needs it:** banks and insurers assessing a contractor, companies vetting a partner or sizing up a competitor before a joint bid, procurement consultants, journalists, and AI agents that need "tell me everything about this company's public business" as a single tool call.

***

### Input

| Field | Type | Description |
|---|---|---|
| `contractorVatNumbers` | array | One or more 9-digit company VAT numbers (ΑΦΜ). **Required.** |
| `recordTypes` | array | `contracts` (recommended), `auctions`, `payments`. |
| `dateFrom` / `dateTo` | string | `YYYY-MM-DD`. Defaults to the last three years. |
| `includeRecords` | boolean | Also output every underlying contract as its own item. |

**Why VAT numbers and not names:** Greek authorities type the same company's name inconsistently. One supplier appeared as `ΝΤΑΛΑΕΚ ΜΟΝ. ΙΚΕ`, `ΝΤΑΛΑΕΚ ΜΟΝΟΠΡΟΣΩΠΗ ΙΚΕ` and `ΝΤΑΛΑΕΧ` across eight contracts. A name search misses contracts; the VAT number does not. Get contractor VAT numbers from the companion [KIMDIS search Actor](https://apify.com/jimkarageo/greek-public-contracts-kimdis).

```json
{
  "contractorVatNumbers": ["099360290"],
  "recordTypes": ["contracts"],
  "dateFrom": "2023-01-01"
}
```

***

### Output

One record per company:

```json
{
  "vatNumber": "099360290",
  "companyName": "INTRASOFT INTERNATIONAL SA ΕΛΛΗΝΙΚΟ ΥΠΟΚΑΤΑΣΤΗΜΑ",
  "nameVariants": ["NETCOMPANY S.A.", "NETCOMPANY-INTRASOFT SA", "…"],
  "totalRecords": 668,
  "totalValue": 3836500241.60,
  "originalAwardsValue": 983257301.44,
  "originalAwardsCount": 525,
  "amendmentCount": 143,
  "cancelledCount": 17,
  "distinctAuthorities": 144,
  "directAwardShareOfValuePct": 0.3,
  "averageValue": 5743264.0,
  "medianValue": 30000.0,
  "largestValue": 116095220.85,
  "firstRecordDate": "2023-01-02",
  "lastRecordDate": "2026-10-01",
  "byYear": [{ "year": "2023", "contracts": 146, "value": 477467860.08 }],
  "topAuthorities": [{ "organizationName": "…", "contracts": 24, "value": 317407216.74, "shareOfValuePct": 21.9 }],
  "topCpvCodes": [{ "cpvCode": "72000000-5", "contracts": 61, "value": 412000000.0 }],
  "contractTypes": [{ "contractType": "Υπηρεσίες", "contracts": 480, "value": 2900000000.0 }],
  "procedureTypes": [{ "procedureType": "Ανοιχτή διαδικασία", "contracts": 41, "shareOfValuePct": 94.1 }],
  "largestContracts": [{ "adam": "26SYMV019735140", "title": "…", "amount": 116095220.85 }],
  "recentContracts": [{ "…": "…" }]
}
```

**`nameVariants` is a feature, not noise.** It reconstructs corporate history: the example above shows INTRASOFT becoming NETCOMPANY-INTRASOFT and then NETCOMPANY, all under one VAT number.

**`directAwardShareOfValuePct`** is the share of value awarded without competition (*απευθείας ανάθεση*). It is usually the first number a journalist or a due-diligence team looks for.

***

### Read the totals correctly

**`totalValue` overstates. Use `originalAwardsValue`.**

ΚΗΜΔΗΣ registers an amendment or extension as a new act restating the contract's **whole** value, not just the change. Summing every record therefore counts the same euros repeatedly. In the example above, €3.84bn of records come from €983m of original awards — the rest is 143 amendments restating contracts already counted.

Both figures are reported, with `amendmentCount` and `amendmentValue` so you can see the gap. `originalAwardsValue` excludes amendments and is the defensible figure. `cancelledCount` shows how many acts were later cancelled; their value is still inside the totals.

***

### How the full history is actually retrieved

The ΚΗΜΔΗΣ API serves **at most about six months per query**, and given a wider range it does not fail — it silently returns only the final months. A naive three-year query returns roughly a sixth of the truth.

This Actor splits the period into windows the API honours, merges them and de-duplicates by ΑΔΑΜ. For one company over three years that turned 113 records into 668. If you build against ΚΗΜΔΗΣ yourself, this is the trap to know about.

***

### Limitations & disclaimer

- Data comes from the official ΚΗΜΔΗΣ OpenData API **as published** by contracting authorities. Completeness and accuracy are theirs. **No guarantee of completeness is given or implied.**
- A profile covers only what is registered in ΚΗΜΔΗΣ: public contracts. It is not a company's turnover, and says nothing about private-sector business.
- Below-threshold and some defence or classified procurement may not be registered.
- Figures are as submitted. Amendments, cancellations and framework agreements all affect what a total means — see *Read the totals correctly*.
- CPV shares are indicative: a contract carrying several CPV codes contributes its value to each, so CPV shares do not sum to 100%.
- This tool profiles **companies** by VAT number, not individuals. Some sole traders appear as named persons because Greek procurement law requires publication. Handle any personal data in results in line with the GDPR, and do not use results to profile private individuals.
- Source data is licensed CC BY 4.0 by the Greek Ministry of Digital Governance. Not affiliated with or endorsed by the Ministry.

***

### Related Actors

- [Greek Public Contracts & Tenders Search (KIMDIS)](https://apify.com/jimkarageo/greek-public-contracts-kimdis) — find the contracts, and the contractor VAT numbers to feed this Actor.
- [Greek Public Tenders Monitor & Alerts](https://apify.com/jimkarageo/greek-tenders-monitor) — be told when a company you watch wins something new.
- [Greek Government Decisions Search (Diavgeia)](https://apify.com/jimkarageo/greek-diavgeia-search) — every kind of Greek government decision, not just procurement.

***

***

## Ελληνικά

### Τι κάνει

Δίνεις **ΑΦΜ εταιρείας** και παίρνεις την πλήρη εικόνα της στο ελληνικό δημόσιο: συνολική αξία συμβάσεων, ποιοι φορείς την αναθέτουν, **ποσοστό απευθείας αναθέσεων**, κατηγορίες CPV, εξέλιξη ανά έτος, μεγαλύτερες και πιο πρόσφατες συμβάσεις.

Από το επίσημο API του ΚΗΜΔΗΣ — χωρίς scraping, χωρίς κλειδί.

### Γιατί ΑΦΜ και όχι επωνυμία

Η ίδια εταιρεία γράφεται διαφορετικά από κάθε φορέα: σε οκτώ συμβάσεις εμφανίστηκε ως «ΝΤΑΛΑΕΚ ΜΟΝ. ΙΚΕ», «ΝΤΑΛΑΕΚ ΜΟΝΟΠΡΟΣΩΠΗ ΙΚΕ» και «ΝΤΑΛΑΕΧ». Μόνο το ΑΦΜ είναι αξιόπιστο. Το πεδίο `nameVariants` κρατά όλες τις γραφές — και αποκαλύπτει εταιρική ιστορία, π.χ. INTRASOFT → NETCOMPANY.

### Διάβασε σωστά τα σύνολα

**Το `totalValue` υπερεκτιμά. Χρησιμοποίησε το `originalAwardsValue`.**

Το ΚΗΜΔΗΣ καταχωρεί κάθε τροποποίηση ως νέα πράξη που **επαναδηλώνει ολόκληρη** την αξία της σύμβασης. Το άθροισμα όλων μετράει τα ίδια ευρώ πολλές φορές: στο παράδειγμα, €3,84 δισ. εγγραφών προκύπτουν από €983 εκ. αρχικών αναθέσεων. Δίνονται και τα δύο μεγέθη.

### Το τεχνικό εμπόδιο που λύθηκε

Το API του ΚΗΜΔΗΣ σερβίρει **το πολύ ~6 μήνες ανά ερώτημα** και, σε μεγαλύτερο εύρος, **δεν βγάζει σφάλμα** — επιστρέφει σιωπηλά μόνο τους τελευταίους μήνες. Ο Actor σπάει την περίοδο σε παράθυρα και τα ενώνει. Για μία εταιρεία σε τρία χρόνια, 113 εγγραφές έγιναν 668.

### Νομικά

Δεδομένα από το επίσημο API, **όπως έχουν αναρτηθεί** — χωρίς εγγύηση πληρότητας. Το προφίλ καλύπτει μόνο δημόσιες συμβάσεις, δεν είναι ο τζίρος της εταιρείας. Αφορά **εταιρείες**, όχι ιδιώτες. Άδεια πηγής CC BY 4.0. Δεν συνδέεται με το Υπουργείο Ψηφιακής Διακυβέρνησης.

***

**Keywords:** Greece, Greek public procurement, contractor profile, company intelligence, due diligence, ΑΦΜ, ΚΗΜΔΗΣ, δημόσιες συμβάσεις, ανάδοχος, προφίλ εταιρείας, direct awards, απευθείας αναθέσεις, CPV, supplier risk, competitor analysis, MCP

# Actor input Schema

## `contractorVatNumbers` (type: `array`):

One or more 9-digit Greek company VAT numbers to profile. The VAT number is the only reliable key: Greek authorities type the same company's name inconsistently, so a name search misses contracts. You can get contractor VAT numbers from the companion KIMDIS search Actor. | Ένα ή περισσότερα ΑΦΜ εταιρειών. Το ΑΦΜ είναι το μόνο αξιόπιστο κλειδί — η ίδια εταιρεία γράφεται διαφορετικά από κάθε φορέα.

## `recordTypes` (type: `array`):

Which KIMDIS acts count towards the profile. Contracts alone is the cleanest measure of what a company actually won. Adding awards and payment orders widens the picture but can double-count the same job. | Ποιες πράξεις μετράνε. Μόνο συμβάσεις = η καθαρότερη μέτρηση.

## `dateFrom` (type: `string`):

Earliest registry submission date to include, YYYY-MM-DD. Defaults to three years before 'To date'. | Παλαιότερη ημερομηνία ανάρτησης. Προεπιλογή: 3 χρόνια πριν.

## `dateTo` (type: `string`):

Latest registry submission date to include, YYYY-MM-DD. Defaults to today. | Νεότερη ημερομηνία ανάρτησης. Προεπιλογή: σήμερα.

## `includeRecords` (type: `boolean`):

In addition to the profile, write every underlying contract as its own dataset item. Useful for your own analysis, but it makes the run much larger. The profile already embeds the largest and most recent contracts. | Επιστρέφει και κάθε σύμβαση ξεχωριστά. Το προφίλ ήδη περιέχει τις μεγαλύτερες και τις πιο πρόσφατες.

## Actor input object example

```json
{
  "contractorVatNumbers": [
    "099360290"
  ],
  "recordTypes": [
    "contracts"
  ],
  "dateFrom": "2023-01-01",
  "dateTo": "2026-12-31",
  "includeRecords": false
}
```

# Actor output Schema

## `profiles` (type: `string`):

The company profiles, as JSON items in the default dataset.

# 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 = {
    "contractorVatNumbers": [
        "099360290"
    ],
    "recordTypes": [
        "contracts"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jimkarageo/greek-contractor-profile").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 = {
    "contractorVatNumbers": ["099360290"],
    "recordTypes": ["contracts"],
}

# Run the Actor and wait for it to finish
run = client.actor("jimkarageo/greek-contractor-profile").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 '{
  "contractorVatNumbers": [
    "099360290"
  ],
  "recordTypes": [
    "contracts"
  ]
}' |
apify call jimkarageo/greek-contractor-profile --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jimkarageo/greek-contractor-profile"
        }
    }
}
```

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/RJPndiMkP4klbJMzy/builds/aAfvaeUdJ0uyYhzvb/openapi.json
