{
  "openapi": "3.0.1",
  "info": {
    "title": "Tenders Scraper: EU TED, UK Find a Tender & AusTender",
    "description": "Scrape public tenders from the official EU TED, UK Find a Tender, UK Contracts Finder and AusTender APIs. Filter by keyword, country, CPV code and notice type; get normalized JSON with deadlines, values and buyers, only-new monitoring and webhooks. Pay per tender ($0.002).",
    "version": "0.1",
    "x-build-id": "FqnTCEmifz9mNaZmQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/owlabee~tenders-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-owlabee-tenders-scraper",
        "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/owlabee~tenders-scraper/runs": {
      "post": {
        "operationId": "runs-sync-owlabee-tenders-scraper",
        "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/owlabee~tenders-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-owlabee-tenders-scraper",
        "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": [
          "keywords"
        ],
        "properties": {
          "keywords": {
            "title": "Keywords",
            "minItems": 1,
            "type": "array",
            "description": "Search terms, one per line. Each keyword is searched in every selected source and charged as one search run per source. TED runs its own full-text search; Find a Tender, Contracts Finder and AusTender have no keyword search, so the Actor reads their date window once and keeps notices whose title, description, buyer name or code descriptions contain every word of the keyword. Use * for every notice in the window. The prefilled value is the cheap example used by Apify's daily automated test.",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which official open APIs to read. None needs a key or a login. TED covers above-threshold public procurement in the EU, the EEA and partner countries; Find a Tender covers UK above-threshold notices (Procurement Act 2023); Contracts Finder covers UK central government and below-threshold notices; AusTender covers Australian Commonwealth contract notices (awards only: its open tenders are not in the API).",
            "items": {
              "type": "string",
              "enum": [
                "ted",
                "findATender",
                "contractsFinder",
                "ausTender"
              ],
              "enumTitles": [
                "EU TED (Tenders Electronic Daily)",
                "UK Find a Tender",
                "UK Contracts Finder",
                "AusTender (Australia, contract notices)"
              ]
            },
            "default": [
              "ted"
            ]
          },
          "noticeTypes": {
            "title": "Notice types",
            "type": "array",
            "description": "bid = calls for competition (open and recent tenders); award = contract award notices (TED also returns direct-award transparency notices here, as noticeType \"intent-to-award\"); planning = prior information and pipeline notices. Applies to TED, Find a Tender and Contracts Finder; AusTender always returns contract notices. Each extra UK notice type splits the UK page allowance between stages.",
            "items": {
              "type": "string",
              "enum": [
                "bid",
                "award",
                "planning"
              ],
              "enumTitles": [
                "Bids / calls for competition",
                "Awards / contract notices",
                "Planning / prior information"
              ]
            },
            "default": [
              "bid"
            ]
          },
          "countries": {
            "title": "Buyer countries (TED)",
            "type": "array",
            "description": "Optional ISO country codes of the buyer, e.g. [\"DE\", \"FR\"] (two- or three-letter). Narrows TED only; the UK and Australian sources are national. Empty = every country.",
            "items": {
              "type": "string",
              "pattern": "^[A-Za-z]{2,3}$"
            },
            "default": []
          },
          "cpvCodes": {
            "title": "CPV codes (TED and UK)",
            "type": "array",
            "description": "Optional CPV codes or prefixes, e.g. [\"72000000\", \"48\"]. Trailing zeros mean the whole branch: 72000000 matches every IT services code (72xxxxxx). TED filters on the server; the UK sources keep notices with at least one matching code. Empty = every code.",
            "items": {
              "type": "string",
              "pattern": "^\\s*\\d{2,8}(-\\d)?\\s*$"
            },
            "default": []
          },
          "unspscCodes": {
            "title": "UNSPSC codes (AusTender)",
            "type": "array",
            "description": "Optional UNSPSC codes or prefixes for AusTender, e.g. [\"81110000\"] for computer services. Same prefix rule as CPV. Empty = every code.",
            "items": {
              "type": "string",
              "pattern": "^\\s*\\d{2,8}\\s*$"
            },
            "default": []
          },
          "postedWithinDays": {
            "title": "Published within (days)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Only notices published in the last N days (1–90). Find a Tender filters on the notice's last update, AusTender on the contract notice's publication date.",
            "default": 7
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Upper bound on dataset items across all keywords and sources per run (notices and error items). Use together with the run's maximum cost to control spend.",
            "default": 200
          },
          "maxPagesPerSource": {
            "title": "Max pages per source",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Upper bound on result pages read per source: per keyword on TED (100 notices a page), per run on the shared UK and Australian windows (100 releases a page; one day a page on AusTender). The UK and Australian windows also stop at 3 pages (Contracts Finder 5, AusTender 7 days) per keyword in the run, so their reading stays covered by the search-run charge. The run summary lists sources that stopped at the cap.",
            "default": 10
          },
          "fetchDetails": {
            "title": "Fetch TED notice details",
            "type": "boolean",
            "description": "Make one more TED request per emitted TED notice to add its lots (title, description, estimated value, deadline, duration), the procurement documents link and the e-submission link (plus the buyer's telephone when contacts are included). Each detail is a separate paid event. The UK sources already return full notices.",
            "default": false
          },
          "maxDetails": {
            "title": "Max detail fetches",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap on TED detail requests per run (only used when \"Fetch TED notice details\" is on).",
            "default": 50
          },
          "omitContacts": {
            "title": "Omit buyer contact persons",
            "type": "boolean",
            "description": "On by default: buyer contact names, e-mail addresses and telephone numbers are personal data under the GDPR and UK GDPR, so they are left out. Turn it off to include the official buyer contact exactly as the notice publishes it (you are then the controller of that data). Supplier contacts are never included.",
            "default": true
          },
          "includeIndividualRecipients": {
            "title": "Include award winners who are individuals",
            "type": "boolean",
            "description": "Off by default: on award notices, a winner whose name reads as a private person (sole traders, named individuals) is returned with name and id set to null and nameWithheld true; company winners are always named. Turn it on only if you have a lawful basis to process those names.",
            "default": false
          },
          "onlyNewSinceLastRun": {
            "title": "Only new or updated since last run",
            "type": "boolean",
            "description": "Monitor mode for schedules: remember what was seen per source and keyword in the state store and emit only notices that are new or whose key fields changed, flagged with isNew / isUpdated. The first run is a baseline and emits (and charges for) everything; later runs read at most 3 pages per source and stop at the first page already seen.",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that holds the monitor snapshots (notice ids and fingerprints only). Use a different name per schedule if two schedules share keywords.",
            "default": "tenders-scraper-state"
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "pattern": "^https?://.+",
            "type": "string",
            "description": "If set, the Actor POSTs a JSON run summary plus the emitted notices (max 500) to this URL when it finishes. Failures are logged, never fatal."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}