# zakupki.gov.ru Tender Scraper & Monitor (44-FZ / 223-FZ) (`isolovyev/zakupki-tender-monitor`) Actor

Scrape and monitor Russian government tenders on zakupki.gov.ru (EIS), 44-FZ and 223-FZ: reg number, subject, customer, start price (RUB), procedure, stage, deadlines, link. Plus product-match evidence and an optional Russian Software Registry check by INN. Monitor alerts on new and changed tenders.

- **URL**: https://apify.com/isolovyev/zakupki-tender-monitor.md
- **Developed by:** [Ivan Solovyev](https://apify.com/isolovyev) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 tender (list level)s

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## 📄 zakupki.gov.ru Tender Scraper & Monitor (44-ФЗ / 223-ФЗ)

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#EEF2FF;border:1px solid #C7D2FE;border-top:4px solid #4F46E5;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1E1B4B;line-height:1.3">Russian government tenders as a keyword-triggered lead feed - 44-ФЗ + 223-ФЗ, over the public search page.</span><br>
<span style="font-size:15px;color:#4B5563;line-height:1.6">Turn zakupki.gov.ru (ЕИС) notices into a structured feed and get alerted the moment a new tender matching your keywords appears - no certificate, no registration. National-regime and Russian-software-registry filters built in.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #E0E7FF;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#4338CA">📡 New-tender alerts</span><br>
<span style="font-size:12px;color:#57534E">monitor mode fires a webhook the first time a matching tender appears</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #E0E7FF;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#4338CA">⚖️ 44-ФЗ + 223-ФЗ</span><br>
<span style="font-size:12px;color:#57534E">both procurement laws in one unified schema</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #E0E7FF;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#4338CA">🇷🇺 National regime</span><br>
<span style="font-size:12px;color:#57534E">nationalRegime / ПП719 filter and Russian software registry check</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #E0E7FF;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#4338CA">💰 НМЦК &amp; deadlines</span><br>
<span style="font-size:12px;color:#57534E">start price, procedure type and submission deadline per notice</span>
</td>
</tr>
</table>

### ✨ Overview

Scrape and **monitor Russian government procurement** from [zakupki.gov.ru](https://zakupki.gov.ru)
(ЕИС - the Unified Information System). Turn public tender notices into a structured feed **and get
alerted the moment a NEW tender matching your keywords appears** - the same tender-lead product that
Seldon / Tenderplan sell, as a self-serve Apify actor.

Works over the **public search page** (no certificate, no registration) - cheap and fast.

### 🚀 How to use

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#EEF2FF;border:1px solid #C7D2FE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#4F46E5;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1E1B4B">Add your tender keywords</span><br>
<span style="font-size:12px;color:#4B5563">Set laws, regions, НМЦК range and optional product matching.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EEF2FF;border:1px solid #C7D2FE;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#4F46E5;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1E1B4B">Run once or schedule monitor</span><br>
<span style="font-size:12px;color:#4B5563">Collect current notices, or alert only when a tender appears or changes.</span>
</td>
<td style="padding:16px 14px;width:34%;background:#EEF2FF;border:1px solid #C7D2FE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#4F46E5;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1E1B4B">Act on the tender feed</span><br>
<span style="font-size:12px;color:#4B5563">Export results or send a webhook summary to your workflow.</span>
</td>
</tr>
</table>

### ✨ What you get

Per tender:

| Field | Description |
|-------|-------------|
| `reg_number` | EIS registry number of the notice |
| `law` | `44-ФЗ` (state/municipal) or `223-ФЗ` (state companies) |
| `title` | Subject of the procurement (Объект закупки) |
| `customer` | Customer / organization (Заказчик) |
| `price` | Start (maximum) contract price **НМЦК**, RUB |
| `procedureType` | Procedure (electronic auction, tender, request for quotations, …) |
| `status` | Stage (e.g. accepting bids) |
| `publishDate` / `updatedDate` / `deadline` | Publication, last-update, submission-deadline dates (ISO) |
| `url` | Direct link to the tender notice |

### ⚙️ Two modes

- **search** - collect current tenders by keyword, filtered by law (44/223), НМЦК range, region
  (OKATO), and "active only".
- **monitor** - run on a schedule; keeps state (KV store, keyed by `reg_number`) and emits **only
  NEW tenders** since the previous run (plus, optionally, ones whose status / price / deadline
  changed). POST a run summary to a **webhook** (n8n / Zapier / Make → Telegram / Slack).

> Monitor deliberately does **not** emit "removed" tenders: a tender leaving the search window is not
> the same as a cancelled one, so emitting it would create false alerts.

### ✨ Differentiators

- **New-tender alerting out of the box** - a natural lead product, not just a one-off dump.
- **44-FZ and 223-FZ in a single run.**
- **НМЦК / active-only / region filters** to cut noise.
- Public HTML search - no client certificate or ЕИС integration account required.
- **National regime facts** (`positions`/`full`) - the `nationalRegime` field reports what the tender
  card itself states under Article 14 of 44-FZ for each line item: a prohibition, restriction, or
  preference for Russian-origin goods, with a verbatim quote (`evidence`) and the cited decree when
  the card names one. Straight from the EIS card, no legal interpretation added.
- **Registry-eligibility** (optional `myInn`) - set your company's INN and the actor checks it once
  per run against the Unified Register of Russian Software, then flags each tender's `registryEligibility`
  with two facts side by side: is a national-regime clause present on this tender, and is your INN a
  registered right holder. Two verified facts, not a win prediction.

### ⚙️ Input

See the input schema. Key fields: `mode`, `searchQueries` (required), `laws`, `actualOnly`,
`priceFrom` / `priceTo`, `regions`, `maxPagesPerQuery`, `myInn`, `alertOnly`, `includeUpdated`,
`notifyWebhookUrl`, `proxyConfiguration`.

### 🗺️ Proxy / geo

zakupki.gov.ru **serves data only to Russian IP addresses**. On Apify use **Residential proxy with
country `RU`** (the default in the input schema). The site's TLS certificate is issued by the Russian
"Russian Trusted Sub CA" (Ministry of Digital Development); the actor loads a CA bundle from
`ZAKUPKI_CA_BUNDLE` if provided, otherwise proceeds without certificate verification (public data).

### 📝 Notes

Data comes from the public extended-search results page of ЕИС. Field extraction is resilient to the
223-FZ vs 44-FZ card differences. If a query returns zero cards without a network error, the actor
flags a possible layout change via the run status message.

### 👥 Для кого

| Вы… | Используйте, чтобы… |
|---|---|
| Поставщик / подрядчик | находить релевантные тендеры по нише раньше конкурентов |
| Тендерное агентство | вести поток лидов для клиентов без ручного мониторинга ЕИС |
| Аналитик рынка | мерить объёмы, заказчиков и НМЦК по сегменту |
| SaaS для закупок | питать свой продукт структурированным фидом ЕИС |

### ▶️ Quick start

**Search mode** - current tenders, with vendor-radar matching against attached spec documents:

```json
{
  "mode": "search",
  "searchQueries": ["поставка компьютеров"],
  "laws": ["44", "223"],
  "actualOnly": true,
  "detailLevel": "full",
  "okpd2Codes": ["58.29"],
  "matchProducts": ["1С", "Р7-Офис", "МойОфис"],
  "maxPagesPerQuery": 2
}
````

**Monitor mode** - alert on new tenders (and status/price/deadline changes) on a schedule:

```json
{
  "mode": "monitor",
  "searchQueries": ["поставка компьютеров"],
  "laws": ["44", "223"],
  "alertOnly": true,
  "includeUpdated": true,
  "notifyWebhookUrl": "https://example.com/hooks/tender-alerts"
}
```

Set a schedule under **Schedules** in the Apify Console to run `monitor` mode periodically. State
(keyed by `reg_number`) carries over between runs via the Key-Value Store.

### 💰 Pricing

Priced by `detailLevel`, since each level does materially more work: `list` (search cards only) is
cheap, `positions` (opens each tender to extract KTRU line items) is mid-priced, and `full` (also
downloads and parses attached ТЗ documents - docx/xlsx/pdf) costs more per tender because of the
document processing. `matchProducts` (vendor-radar) is a premium feature on top of `positions`/`full` -
it turns a plain tender feed into a lead list of tenders that specifically mention your product or a
competitor's, with a quote (`matchEvidence`) from the spec.

### 🇷🇺 RU / На русском

**Поиск и мониторинг госзакупок РФ (zakupki.gov.ru, 44-ФЗ/223-ФЗ) с тремя уровнями детализации и
vendor-radar: ловит тендеры, где в спецификации или ТЗ фигурирует ваш продукт или конкурент
(1С/Р7/МойОфис).**

- **Три уровня детализации** - `list` (карточки поиска, быстро и дёшево), `positions` (актор
  открывает тендер и достаёт позиции КТРУ - конкретные товары с кодом ОКПД2, количеством и ценой),
  `full` (дополнительно скачивает и парсит приложенные документы ТЗ - docx/xlsx/pdf → совпадения
  продуктов с **цитатой** из документа, поле `matchEvidence`). Особенно важно для 223-ФЗ, где часто
  нет структурированных позиций КТРУ вовсе.
- **Фильтр по ОКПД2** - актор сам находит код в справочнике ЕИС (сайт не принимает код напрямую) и
  включает вложенные подкоды.
- **Monitor** - алерт на новые тендеры (и, опционально, на изменение статуса/цены/срока) + вебхук.
  Специально НЕ шлёт алерт на «исчезнувшие» тендеры - уход из окна поиска не то же самое, что отмена.
- **Vendor-radar** (`matchProducts`) - целевая аудитория: вендоры ПО, интеграторы, тендерные отделы,
  B2G-продажи. Ловит тендер, где в спецификации упомянут ваш продукт или конкурент, ещё до того как
  вы его нашли вручную.
- **Национальный режим** (`positions`/`full`) - поле `nationalRegime` берёт из карточки закупки, что
  заказчик сам указал по ст. 14 44-ФЗ: запрет, ограничение или преференцию по конкретной позиции, с
  дословной цитатой (`evidence`) и ссылкой на постановление, если карточка её приводит. Факт из ЕИС,
  без собственной юридической оценки.
- **Реестровая приемлемость** (опциональный `myInn`) - укажите ИНН своей компании, актор один раз за
  прогон проверит его в Едином реестре российского ПО и добавит на каждый тендер `registryEligibility`:
  два факта рядом - есть ли на тендере оговорка нацрежима и числится ли ваш ИНН правообладателем в
  реестре. Не прогноз победы, а сопоставление двух проверенных фактов.

**Технические детали:** данные только из публичной расширенной выдачи ЕИС, без сертификата и
регистрации; на Apify обязателен residential-прокси со страной RU - сайт отдаёт данные только на
российские IP (гео-блок); собственный счётчик запросов ЕИС ограничен на уровне ~4000 обращений, это
влияет на глубину `maxPagesPerQuery` при больших объёмах. Тариф зависит от уровня: `list` дёшево,
`positions` дороже, `full` - дороже всего из-за парсинга документов; vendor-radar (`matchProducts`) -
премиум-функция поверх `positions`/`full`.

### 🔗 Все наши акторы для данных по России, Казахстану и СНГ

<span style="font-size:14px;color:#4B5563">Одна линейка для маркетплейсов, госзакупок и проверки контрагентов - соседний актор открывается одним кликом по карточке.</span>

<table width="100%">
<tr>
<td style="padding:0;width:20%;background:#FFFFFF;border:1px solid #E0E7FF;border-top:3px solid #4F46E5;border-radius:10px 0 0 10px;vertical-align:top">
<a href="https://apify.com/isolovyev/marketplace-seller-leads" style="display:block;padding:14px 12px;text-decoration:none">
<span style="font-size:13px;font-weight:800;color:#4338CA">🛍️ Лиды продавцов маркетплейсов</span><br>
<span style="font-size:11px;color:#57534E">продавцы WB / Ozon / Яндекс.Маркет / Kaspi с ИНН и ОГРН</span>
</a>
</td>
<td style="padding:14px 12px;width:20%;background:#EEF2FF;border:1px solid #C7D2FE;border-left:none;border-top:3px solid #4F46E5;vertical-align:top">
<span style="font-size:13px;font-weight:800;color:#1E1B4B">📄 Тендеры 44-ФЗ / 223-ФЗ</span><br>
<span style="font-size:11px;color:#57534E">госзакупки, нацрежим, реестр российского ПО</span><br>
<span style="font-size:10px;font-weight:800;color:#4F46E5;letter-spacing:0.5px">● ВЫ ЗДЕСЬ</span>
</td>
<td style="padding:0;width:20%;background:#FFFFFF;border:1px solid #E0E7FF;border-left:none;border-top:3px solid #4F46E5;vertical-align:top">
<a href="https://apify.com/isolovyev/ru-counterparty-check" style="display:block;padding:14px 12px;text-decoration:none">
<span style="font-size:13px;font-weight:800;color:#4338CA">🔍 Проверка контрагента по ИНН</span><br>
<span style="font-size:11px;color:#57534E">5 источников, скоринг риска</span>
</a>
</td>
<td style="padding:0;width:20%;background:#FFFFFF;border:1px solid #E0E7FF;border-left:none;border-top:3px solid #4F46E5;vertical-align:top">
<a href="https://apify.com/isolovyev/ru-marketplaces-price-monitor" style="display:block;padding:14px 12px;text-decoration:none">
<span style="font-size:13px;font-weight:800;color:#4338CA">📈 Цены на маркетплейсах</span><br>
<span style="font-size:11px;color:#57534E">WB / Ozon / Яндекс.Маркет / Avito, трекинг цены</span>
</a>
</td>
<td style="padding:0;width:20%;background:#FFFFFF;border:1px solid #E0E7FF;border-left:none;border-top:3px solid #4F46E5;border-radius:0 10px 10px 0;vertical-align:top">
<a href="https://apify.com/isolovyev/kaspi-price-monitor" style="display:block;padding:14px 12px;text-decoration:none">
<span style="font-size:13px;font-weight:800;color:#4338CA">🇰🇿 Цены и позиции на Kaspi.kz</span><br>
<span style="font-size:11px;color:#57534E">Казахстан, позиция в выдаче и цена</span>
</a>
</td>
</tr>
</table>

### 💬 Вопросы и поддержка

Нашли ошибку или есть вопрос? Откройте тикет на вкладке **Issues** этого актора.

# Actor input Schema

## `mode` (type: `string`):

search = collect current tenders. monitor = compare vs the previous run (needs a schedule) and emit only NEW tenders (and, optionally, ones whose status/price/deadline changed), with webhook alerts.

## `searchQueries` (type: `array`):

Keywords to search on zakupki.gov.ru, e.g. 'поставка компьютеров', 'ремонт кровли', 'медицинское оборудование'. Russian. Morphology (word forms) is enabled.

## `laws` (type: `array`):

Which laws to include: 44 = 44-FZ (state/municipal), 223 = 223-FZ (state companies). Default: both.

## `actualOnly` (type: `boolean`):

Only tenders currently open for applications ('Подача заявок'). Turn off to also include completed/cancelled ones.

## `priceFrom` (type: `integer`):

Optional. Only tenders with a start price (НМЦК) at or above this amount.

## `priceTo` (type: `integer`):

Optional. Only tenders with a start price (НМЦК) at or below this amount.

## `regions` (type: `array`):

Optional. Customer-location region filter by OKATO subject codes (e.g. 45000000000 Moscow, 40000000000 St. Petersburg). Leave empty for all of Russia.

## `okpd2Codes` (type: `array`):

Optional. Filter tenders by ОКПД2 classification code(s), e.g. '58.29' (software), '62.01' (custom software development). The actor looks each code up in ЕИС's own OKPD2 directory (zakupki.gov.ru does not accept the code directly as a search parameter) and applies the resulting server-side filter with nested sub-codes included. A code the directory doesn't recognize (typo, wrong code) is reported in the run log/status and is simply NOT filtered - it never silently falls back to an unverified filter.

## `maxPagesPerQuery` (type: `integer`):

50 tenders per page. Higher = more tenders, more time. Sorted by update date (freshest first).

## `maxItemsPerQuery` (type: `integer`):

Optional hard cap on tenders kept per query.

## `detailLevel` (type: `string`):

list = search cards only (fast, cheapest). positions = also open each tender and extract the actual KTRU line items (specific goods with ОКПД2 code, quantity, unit price) - needed to catch a specific product inside the spec even when the title is generic. full = also open the tender's Documents tab, download attached spec files (docx/xlsx/pdf/rtf/doc, incl. inside zip) and match products in their text - essential for 223-FZ tenders, which often have no structured KTRU positions at all. Each level is priced separately.

## `matchProducts` (type: `array`):

Optional. Product/vendor names to flag when found in the tender subject, KTRU positions (detailLevel=positions) or attached documents (detailLevel=full), e.g. '1С', 'Р7-Офис', 'МойОфис'. Output fields matchedProducts (subject/positions) and matchedInDocuments (documents) list which matched - a vendor radar over procurement.

## `alertOnly` (type: `boolean`):

Monitor mode only: emit just the NEW (and, if enabled, changed) tenders instead of the full current set.

## `includeUpdated` (type: `boolean`):

Monitor + alertOnly: besides new tenders, also emit ones whose status, start price or submission deadline changed since the previous run.

## `notifyWebhookUrl` (type: `string`):

Monitor mode: POST the run summary (counts, per-query, new tenders) to this URL - wire it to n8n/Zapier/Make for Telegram/Slack tender alerts.

## `myInn` (type: `string`):

Optional. Your company's INN. When set, the actor checks it once per run against the Unified Register of Russian Software and adds a registryEligibility fact to every tender: whether your INN is a registered right holder there, and whether that fact lines up with a national-regime clause on that specific tender (Article 14, 44-FZ). Leave empty to skip this check.

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

REQUIRED on Apify: zakupki.gov.ru serves data only to Russian IPs. Use Apify Residential proxy with country RU.

## Actor input object example

```json
{
  "mode": "search",
  "searchQueries": [
    "поставка компьютеров"
  ],
  "laws": [
    "44",
    "223"
  ],
  "actualOnly": true,
  "okpd2Codes": [
    "58.29"
  ],
  "maxPagesPerQuery": 2,
  "detailLevel": "list",
  "matchProducts": [
    "1С",
    "Р7-Офис",
    "МойОфис"
  ],
  "alertOnly": true,
  "includeUpdated": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RU"
  }
}
```

# 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 = {
    "searchQueries": [
        "поставка компьютеров"
    ],
    "laws": [
        "44",
        "223"
    ],
    "okpd2Codes": [
        "58.29"
    ],
    "matchProducts": [
        "1С",
        "Р7-Офис",
        "МойОфис"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "RU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("isolovyev/zakupki-tender-monitor").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 = {
    "searchQueries": ["поставка компьютеров"],
    "laws": [
        "44",
        "223",
    ],
    "okpd2Codes": ["58.29"],
    "matchProducts": [
        "1С",
        "Р7-Офис",
        "МойОфис",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "RU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("isolovyev/zakupki-tender-monitor").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 '{
  "searchQueries": [
    "поставка компьютеров"
  ],
  "laws": [
    "44",
    "223"
  ],
  "okpd2Codes": [
    "58.29"
  ],
  "matchProducts": [
    "1С",
    "Р7-Офис",
    "МойОфис"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RU"
  }
}' |
apify call isolovyev/zakupki-tender-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=isolovyev/zakupki-tender-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "zakupki.gov.ru Tender Scraper & Monitor (44-FZ / 223-FZ)",
        "description": "Scrape and monitor Russian government tenders on zakupki.gov.ru (EIS), 44-FZ and 223-FZ: reg number, subject, customer, start price (RUB), procedure, stage, deadlines, link. Plus product-match evidence and an optional Russian Software Registry check by INN. Monitor alerts on new and changed tenders.",
        "version": "0.1",
        "x-build-id": "zgHOPRsYRZBzznv1j"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/isolovyev~zakupki-tender-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-isolovyev-zakupki-tender-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/isolovyev~zakupki-tender-monitor/runs": {
            "post": {
                "operationId": "runs-sync-isolovyev-zakupki-tender-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/isolovyev~zakupki-tender-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-isolovyev-zakupki-tender-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "searchQueries"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "monitor"
                        ],
                        "type": "string",
                        "description": "search = collect current tenders. monitor = compare vs the previous run (needs a schedule) and emit only NEW tenders (and, optionally, ones whose status/price/deadline changed), with webhook alerts.",
                        "default": "search"
                    },
                    "searchQueries": {
                        "title": "Search queries (keywords)",
                        "type": "array",
                        "description": "Keywords to search on zakupki.gov.ru, e.g. 'поставка компьютеров', 'ремонт кровли', 'медицинское оборудование'. Russian. Morphology (word forms) is enabled.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "laws": {
                        "title": "Laws (federal procurement laws)",
                        "type": "array",
                        "description": "Which laws to include: 44 = 44-FZ (state/municipal), 223 = 223-FZ (state companies). Default: both.",
                        "default": [
                            "44",
                            "223"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "actualOnly": {
                        "title": "Only active (accepting bids)",
                        "type": "boolean",
                        "description": "Only tenders currently open for applications ('Подача заявок'). Turn off to also include completed/cancelled ones.",
                        "default": true
                    },
                    "priceFrom": {
                        "title": "Min start price (НМЦК), RUB",
                        "type": "integer",
                        "description": "Optional. Only tenders with a start price (НМЦК) at or above this amount."
                    },
                    "priceTo": {
                        "title": "Max start price (НМЦК), RUB",
                        "type": "integer",
                        "description": "Optional. Only tenders with a start price (НМЦК) at or below this amount."
                    },
                    "regions": {
                        "title": "Regions (OKATO codes)",
                        "type": "array",
                        "description": "Optional. Customer-location region filter by OKATO subject codes (e.g. 45000000000 Moscow, 40000000000 St. Petersburg). Leave empty for all of Russia.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "okpd2Codes": {
                        "title": "ОКПД2 codes filter",
                        "type": "array",
                        "description": "Optional. Filter tenders by ОКПД2 classification code(s), e.g. '58.29' (software), '62.01' (custom software development). The actor looks each code up in ЕИС's own OKPD2 directory (zakupki.gov.ru does not accept the code directly as a search parameter) and applies the resulting server-side filter with nested sub-codes included. A code the directory doesn't recognize (typo, wrong code) is reported in the run log/status and is simply NOT filtered - it never silently falls back to an unverified filter.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPagesPerQuery": {
                        "title": "Max pages per query",
                        "minimum": 1,
                        "maximum": 40,
                        "type": "integer",
                        "description": "50 tenders per page. Higher = more tenders, more time. Sorted by update date (freshest first).",
                        "default": 2
                    },
                    "maxItemsPerQuery": {
                        "title": "Max items per query",
                        "type": "integer",
                        "description": "Optional hard cap on tenders kept per query."
                    },
                    "detailLevel": {
                        "title": "Detail level (price tier)",
                        "enum": [
                            "list",
                            "positions",
                            "full"
                        ],
                        "type": "string",
                        "description": "list = search cards only (fast, cheapest). positions = also open each tender and extract the actual KTRU line items (specific goods with ОКПД2 code, quantity, unit price) - needed to catch a specific product inside the spec even when the title is generic. full = also open the tender's Documents tab, download attached spec files (docx/xlsx/pdf/rtf/doc, incl. inside zip) and match products in their text - essential for 223-FZ tenders, which often have no structured KTRU positions at all. Each level is priced separately.",
                        "default": "list"
                    },
                    "matchProducts": {
                        "title": "Match products (flag tenders mentioning these)",
                        "type": "array",
                        "description": "Optional. Product/vendor names to flag when found in the tender subject, KTRU positions (detailLevel=positions) or attached documents (detailLevel=full), e.g. '1С', 'Р7-Офис', 'МойОфис'. Output fields matchedProducts (subject/positions) and matchedInDocuments (documents) list which matched - a vendor radar over procurement.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "alertOnly": {
                        "title": "Monitor: alert only on new tenders",
                        "type": "boolean",
                        "description": "Monitor mode only: emit just the NEW (and, if enabled, changed) tenders instead of the full current set.",
                        "default": true
                    },
                    "includeUpdated": {
                        "title": "Monitor: also emit changed tenders",
                        "type": "boolean",
                        "description": "Monitor + alertOnly: besides new tenders, also emit ones whose status, start price or submission deadline changed since the previous run.",
                        "default": true
                    },
                    "notifyWebhookUrl": {
                        "title": "Monitor: notify webhook URL",
                        "type": "string",
                        "description": "Monitor mode: POST the run summary (counts, per-query, new tenders) to this URL - wire it to n8n/Zapier/Make for Telegram/Slack tender alerts."
                    },
                    "myInn": {
                        "title": "My INN (registry-eligibility check)",
                        "type": "string",
                        "description": "Optional. Your company's INN. When set, the actor checks it once per run against the Unified Register of Russian Software and adds a registryEligibility fact to every tender: whether your INN is a registered right holder there, and whether that fact lines up with a national-regime clause on that specific tender (Article 14, 44-FZ). Leave empty to skip this check."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "REQUIRED on Apify: zakupki.gov.ru serves data only to Russian IPs. Use Apify Residential proxy with country RU.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "RU"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
