{
  "openapi": "3.0.1",
  "info": {
    "title": "Ukraine ProZorro Tenders — Buyers, Suppliers & Values",
    "description": "Search Ukraine's ProZorro public procurement — tenders, buyers, awarded suppliers, values, items (CPV) and status from the official OpenProcurement API. Filter by keyword, category, value and date; ideal for reconstruction-contract monitoring. Open data, no key.",
    "version": "0.2",
    "x-build-id": "VVSYXlEhgPCtJzN1X"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/foxlabs~ukraine-prozorro-tenders/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-foxlabs-ukraine-prozorro-tenders",
        "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/foxlabs~ukraine-prozorro-tenders/runs": {
      "post": {
        "operationId": "runs-sync-foxlabs-ukraine-prozorro-tenders",
        "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/foxlabs~ukraine-prozorro-tenders/run-sync": {
      "post": {
        "operationId": "run-sync-foxlabs-ukraine-prozorro-tenders",
        "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",
        "properties": {
          "searchTerm": {
            "title": "Keyword",
            "type": "string",
            "description": "Keep only tenders whose title, description, item descriptions or CPV codes contain this text — in any case, and also inside a longer word. Tender text is Ukrainian: type Ukrainian, and a word stem finds more than one grammatical form (\"ремонт\", or \"школ\" for школа, школи, школі). An apostrophe matches whichever apostrophe sign the tender uses. A word in Latin letters matches only where the tender itself uses one (a brand, a model name); when such a keyword has matched nothing after 3,000 tenders read in full, the run stops early (not when Max tenders to read in full is set). A CPV code such as \"45230000\" works too. Leave empty for all recent tenders."
          },
          "status": {
            "title": "Status",
            "enum": [
              "any",
              "tendering",
              "active",
              "complete",
              "cancelled",
              "unsuccessful"
            ],
            "type": "string",
            "description": "Tender status. Accepting bids or questions = the two stages before bidding closes (active.enquiries, active.tendering), without the tenders whose bidding deadline is already over. Active = every status that starts with \"active\", which also includes tenders in evaluation or already awarded. Complete = concluded; Cancelled / Unsuccessful as named. A status filter is decided from the feed's listing, so only matching tenders are read in full.",
            "default": "any"
          },
          "category": {
            "title": "Procurement category",
            "enum": [
              "any",
              "goods",
              "works",
              "services"
            ],
            "type": "string",
            "description": "Main procurement category.",
            "default": "any"
          },
          "region": {
            "title": "Buyer region contains",
            "type": "string",
            "description": "Keep only tenders whose buyer's region contains this text, as ProZorro writes it in Ukrainian (e.g. \"Львівська\", \"Київська\", \"м. Київ\"); a region typed in Latin letters matched nothing in the measurements, and the run stops after 20,000 changes without a match, whatever Max tenders to read in full says. Decided from the feed's listing, so only matching tenders are read in full. Leave empty for all of Ukraine."
          },
          "minValue": {
            "title": "Minimum value",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only tenders with an expected value of at least this amount. The number is compared as it is, whatever the currency (nearly every value is in Ukrainian hryvnia); a tender without a value never matches. Leave empty for no minimum."
          },
          "maxValue": {
            "title": "Maximum value",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only tenders with an expected value of at most this amount, compared as it is; a tender without a value never matches. A maximum below the minimum stops the run. Leave empty for no maximum."
          },
          "datePreset": {
            "title": "Date range",
            "enum": [
              "last_7_days",
              "last_30_days",
              "last_90_days",
              "all_time",
              "custom"
            ],
            "type": "string",
            "description": "The range of last-change dates to look at, in Kyiv calendar days (the calendar of ProZorro's own timestamps). The feed is read backwards from the newest change (a Custom range: from the end of its To date); a run ends at the start of the range, at Max results, at Max tenders to read in full, at the run's maximum charge, after 3,000,000 changes or at the end of the feed, whichever comes first (a keyword or region in Latin letters that matches nothing ends it earlier) — its status message says which, and how far back it got. The From / To dates below count only with Custom range; next to another choice they are not used, and the status message says so.",
            "default": "last_30_days"
          },
          "dateFrom": {
            "title": "From date (custom)",
            "type": "string",
            "description": "Only with Date range = Custom. First day of the range, YYYY-MM-DD, a Kyiv calendar day; empty = no start. A date that does not exist stops the run, and so does Custom with neither date."
          },
          "dateTo": {
            "title": "To date (custom)",
            "type": "string",
            "description": "Only with Date range = Custom. Last day of the range, YYYY-MM-DD, a Kyiv calendar day, the whole day included; the run enters the feed at the end of that day. Empty = up to now; a day that is not over is read up to the start of the run, and the status message says so. A date before the From date stops the run."
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of matching tenders to return. The price is per tender delivered, so this number and a maximum charge on the run are what bound the cost.",
            "default": 500
          },
          "maxScan": {
            "title": "Max tenders to read in full",
            "minimum": 100,
            "maximum": 1000000,
            "type": "integer",
            "description": "The most tenders one run reads in full to apply keyword, category and value filters. Tenders a status or region filter rules out are not read and do not count. Leave empty for the automatic limit of 20,000; with a keyword typed in Latin letters the run then also stops early when nothing has matched after 3,000 tenders read in full (the status message says so). Give a number to read up to that many, with no early stop for a keyword. A region typed in Latin letters is decided without reading a tender, so this limit never fills: such a run stops after 20,000 changes without a match, with or without a number here."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}