{
  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}