{
  "openapi": "3.0.1",
  "info": {
    "title": "UK & EU Public Tenders & Contracts Finder · SiteVerdict",
    "description": "Search UK and EU public tenders and contract awards in one feed: Find a Tender, Contracts Finder, Public Contracts Scotland, Sell2Wales and TED. Filter by keyword, CPV, buyer, region, value and deadline; schedule daily alerts. $5 per 1,000 notices; in monitor mode, already-seen notices are free.",
    "version": "1.1",
    "x-build-id": "pIIIXWZC558S17Z2G"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/siteverdict~siteverdict-public-tenders/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-siteverdict-siteverdict-public-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/siteverdict~siteverdict-public-tenders/runs": {
      "post": {
        "operationId": "runs-sync-siteverdict-siteverdict-public-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/siteverdict~siteverdict-public-tenders/run-sync": {
      "post": {
        "operationId": "run-sync-siteverdict-siteverdict-public-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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "monitor",
              "closingSoon"
            ],
            "type": "string",
            "description": "<b>search</b>: one-off search. <b>monitor</b>: only notices that are NEW since the previous run with the same monitor name (schedule it daily for alerts). <b>closingSoon</b>: open tenders whose deadline falls within the next N days, sorted by deadline.",
            "default": "search"
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Official open APIs to search. Find a Tender = all UK notices under the Procurement Act 2023 (from 24 Feb 2025) plus older above-threshold notices. Contracts Finder = England below-threshold and legacy (pre-24 Feb 2025) procurements. Public Contracts Scotland and Sell2Wales add below-threshold Scottish/Welsh notices. TED = EU/EEA above-threshold notices (eForms).",
            "items": {
              "type": "string",
              "enum": [
                "fts",
                "contractsFinder",
                "scotland",
                "wales",
                "ted"
              ],
              "enumTitles": [
                "Find a Tender (UK)",
                "Contracts Finder (UK)",
                "Public Contracts Scotland",
                "Sell2Wales",
                "TED — Tenders Electronic Daily (EU)"
              ]
            },
            "default": [
              "fts",
              "contractsFinder",
              "scotland",
              "ted"
            ]
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Words or phrases to look for in the title, description, lots and CPV labels (whole-word, case-insensitive, simple plurals match; end a word with * for prefix match, e.g. \"cyber*\"). TED uses its own full-text search in all languages.",
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Match ANY keyword or ALL keywords.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop notices whose title or description contains any of these words or phrases.",
            "items": {
              "type": "string"
            }
          },
          "cpvCodes": {
            "title": "CPV codes",
            "type": "array",
            "description": "Common Procurement Vocabulary codes. Hierarchical: \"72\" or \"72000000\" matches every IT service code below it; \"79340000\" matches advertising and marketing. Check digits (\"-5\") are optional.",
            "items": {
              "type": "string"
            }
          },
          "cpvKeywords": {
            "title": "Find CPV codes by keyword",
            "type": "array",
            "description": "Plain-English terms (e.g. \"cleaning\", \"software development\", \"catering\") looked up in the official CPV 2008 vocabulary; matching codes are added to the CPV filter. The run summary (OUTPUT) shows which codes were used.",
            "items": {
              "type": "string"
            }
          },
          "buyers": {
            "title": "Buyer name contains",
            "type": "array",
            "description": "Keep notices whose buyer name contains any of these (e.g. \"NHS\", \"Leeds City Council\", \"Ministry of Defence\").",
            "items": {
              "type": "string"
            }
          },
          "regions": {
            "title": "Regions (NUTS / ITL codes or UK region names)",
            "type": "array",
            "description": "Delivery or buyer location. UK: region names (\"London\", \"Scotland\", \"North West\") or NUTS/ITL codes (\"UKI\", \"TLI3\", \"UKM7\"). EU: NUTS codes (\"DE1\", \"FR10\", \"IE06\"). Codes are prefix-matched.",
            "items": {
              "type": "string"
            }
          },
          "postcodes": {
            "title": "Postcode prefixes",
            "type": "array",
            "description": "UK postcode areas or districts (e.g. \"M\", \"LS1\", \"EH\"). Matches buyer or delivery postcodes.",
            "items": {
              "type": "string"
            }
          },
          "includeNationwide": {
            "title": "Include UK-wide notices in UK region searches",
            "type": "boolean",
            "description": "When filtering by a UK region, also keep notices whose delivery location is the whole UK.",
            "default": true
          },
          "tedCountries": {
            "title": "TED countries",
            "type": "array",
            "description": "Limit TED results to buyers or places of performance in these countries (ISO codes: IE or IRL, DE or DEU, FR, NL …).",
            "items": {
              "type": "string"
            }
          },
          "minValue": {
            "title": "Minimum value",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum estimated (or awarded) value, in the notice's own currency (GBP for UK sources, mostly EUR for TED). No currency conversion is done."
          },
          "maxValue": {
            "title": "Maximum value",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum estimated (or awarded) value, in the notice's own currency."
          },
          "includeNoValue": {
            "title": "Keep notices without a published value",
            "type": "boolean",
            "description": "Many notices do not publish a value. Keep them when a value range is set?",
            "default": true
          },
          "noticeTypes": {
            "title": "Notice types",
            "type": "array",
            "description": "planning = pipeline / prior information / market engagement; tender = open opportunities (contract notices, tender notices); award = contract awards (who won); contract = contract details, changes and terminations.",
            "items": {
              "type": "string",
              "enum": [
                "planning",
                "tender",
                "award",
                "contract"
              ],
              "enumTitles": [
                "Planning / pipeline",
                "Tender (open opportunity)",
                "Award",
                "Contract / change / termination"
              ]
            },
            "default": [
              "tender"
            ]
          },
          "openOnly": {
            "title": "Open now only",
            "type": "boolean",
            "description": "Only notices with a submission deadline in the future (excludes cancelled tenders).",
            "default": false
          },
          "closingWithinDays": {
            "title": "Closing within N days",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Only notices whose deadline falls within the next N days. In closingSoon mode the default is 7."
          },
          "lookbackDays": {
            "title": "Look back (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Search notices published or updated in the last N days (ignored when 'Published from' is set). closingSoon mode looks back at least 45 days so long-running tenders are included. Monitor mode continues from the previous run automatically.",
            "default": 7
          },
          "publishedFrom": {
            "title": "Published from",
            "type": "string",
            "description": "Start date (YYYY-MM-DD) or relative (\"14 days\", \"2 weeks\")."
          },
          "publishedTo": {
            "title": "Published to",
            "type": "string",
            "description": "End date (YYYY-MM-DD). Defaults to now."
          },
          "profileKeywords": {
            "title": "Supplier profile — keywords for relevance ranking",
            "type": "array",
            "description": "What you sell. Title hits score highest, then description, lots and CPV labels.",
            "items": {
              "type": "string"
            }
          },
          "profileExcludeKeywords": {
            "title": "Supplier profile — never relevant",
            "type": "array",
            "description": "Notices mentioning these get relevance 0 (e.g. \"construction\", \"framework call-off only\").",
            "items": {
              "type": "string"
            }
          },
          "minRelevance": {
            "title": "Minimum relevance score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Drop notices scoring below this (0 = keep all).",
            "default": 0
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "publishedDate",
              "deadline",
              "relevance",
              "value"
            ],
            "type": "string",
            "description": "Order of the results.",
            "default": "publishedDate"
          },
          "monitorKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name of the saved search for monitor mode. Each name remembers which notices it has already sent you. Use a different name per alert.",
            "default": "default"
          },
          "alertOnUpdates": {
            "title": "Alert on updates too",
            "type": "boolean",
            "description": "Off: one alert per procurement and stage (tender, then award). On: every updated notice (corrections, changed deadlines) alerts again.",
            "default": false
          },
          "maxResults": {
            "title": "Max notices",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum notices to save (each saved notice is one billable 'notice' event).",
            "default": 100
          },
          "maxPagesPerSource": {
            "title": "Max pages per source",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Safety cap on API pages (100 records each) per source. UK APIs filter only by date, so long windows need more pages.",
            "default": 40
          },
          "maxDescriptionChars": {
            "title": "Max description length",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Truncate long descriptions (0 = no limit).",
            "default": 1500
          },
          "includeLots": {
            "title": "Include lots",
            "type": "boolean",
            "description": "Include lot titles, values and contract periods.",
            "default": true
          },
          "includeContactDetails": {
            "title": "Include buyer contact details (personal data)",
            "type": "boolean",
            "description": "Off by default. When on, the buyer's published contact point (name, email, phone) is included exactly as published. You are responsible for UK GDPR / PECR compliance — do not use it for unsolicited marketing to individuals.",
            "default": false
          },
          "tedLanguage": {
            "title": "TED language",
            "type": "string",
            "description": "Preferred language for TED titles and descriptions (3-letter code: eng, deu, fra …). Falls back to English, then the original language.",
            "default": "eng"
          },
          "saveBeforeTimeout": {
            "title": "Save found notices before the run times out",
            "type": "boolean",
            "description": "On (default): shortly before the run's timeout, the Actor stops reading sources and saves (and charges for) the notices found so far. The run then finishes as Succeeded, not Timed out, and the OUTPUT record shows complete: false. Off: in standard delivery, if the timeout is reached first nothing is saved and nothing is charged; in progressive delivery, portals already saved are kept and charged.",
            "default": true
          },
          "timeBudgetSecs": {
            "title": "Finish within (seconds)",
            "minimum": 60,
            "maximum": 3600,
            "type": "integer",
            "description": "Optional. Stop reading sources and save what was found so the run finishes within this many seconds (60–3600). Useful when your code or agent waits for a result, for example 240 for a 5-minute synchronous call. Results may then be incomplete; check OUTPUT.complete."
          },
          "sourceTimeBudgetSecs": {
            "title": "Longest time per portal (seconds)",
            "minimum": 0,
            "maximum": 3600,
            "type": "integer",
            "description": "Each portal (Find a Tender, Contracts Finder, Scotland, Wales, TED) may take at most this long. When a portal is slow or stops answering, it is cut off here and keeps what it already read; the other portals carry on. OUTPUT.sourceStates shows which portals were cut short. Default 900. Use 0 to turn it off.",
            "default": 900
          },
          "deliveryMode": {
            "title": "Delivery",
            "enum": [
              "standard",
              "progressive"
            ],
            "type": "string",
            "description": "Standard (default): notices are saved once, at the end, after duplicates across portals are merged. Progressive: each portal's notices are saved as soon as that portal is finished, so a run that is aborted or times out part-way keeps, and is charged for, the notices already saved. In progressive mode a notice cross-posted on several portals is kept from the portal that finished first, the newest-first order applies within each portal, and Max notices keeps the first ones saved. Not available in monitor mode.",
            "default": "standard"
          },
          "useSampleData": {
            "title": "Use sample data (offline demo)",
            "type": "boolean",
            "description": "Run on bundled recorded responses from each API (October 2026) — no network calls, no charges. Handy for testing integrations.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}