{
  "openapi": "3.0.1",
  "info": {
    "title": "Tender Data API – EU European Tenders, TED Europa, CPV Codes",
    "description": "Search the EU's official TED public-procurement journal by country, CPV code, date or open submission deadline. Returns clean, deduplicated JSON in your choice of 24 EU languages: buyer, value, deadlines, CPV codes and notice link. Includes tender notices, contract awards and corrigenda.",
    "version": "0.1",
    "x-build-id": "7mog6UPEHU3FxYnWC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fetchsmith~eu-ted-tenders-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fetchsmith-eu-ted-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/fetchsmith~eu-ted-tenders-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fetchsmith-eu-ted-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/fetchsmith~eu-ted-tenders-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fetchsmith-eu-ted-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",
        "properties": {
          "countries": {
            "title": "Buyer countries",
            "type": "array",
            "description": "ISO 3166-1 alpha-3 codes of the buyer's country (e.g. DEU, FRA, ITA, ESP, NLD). Leave empty for all EU/EEA countries.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "cpvCodes": {
            "title": "CPV codes",
            "type": "array",
            "description": "Common Procurement Vocabulary codes to filter by, 8 digits (e.g. 72000000 for IT services, 45000000 for construction). Leave empty for all. IMPORTANT -- TED matches the whole CPV SUBTREE under each code you give, at every level, not the code itself: 72000000 also returns notices tagged only 72313000 or 72220000, and even a narrow code like 72267000 also returns its children 72267100/72267200. Measured 2026-09-21: of 10 notices matched by 72267000, only 6 carried that literal code. There is no exact-code mode -- post-filter the cpvCodes output field yourself if you need one.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "noticeTypes": {
            "title": "Notice types",
            "type": "array",
            "description": "TED notice-type codes to filter by. This is TED's COMPLETE filterable notice-type vocabulary (all 22 codes, verified cycle 836 by exhausting TED's expert-search index: excluding all 22 leaves 0 notices over TED's whole history). Leave empty for all types. The common ones are cn-standard (contract notice, ~2.92M notices), can-standard (contract award notice, ~2.83M) and pin-only/pin-buyer/pin-rtl (prior information). Note there is no \"pin-standard\" code — TED rejects it — the prior-information notices are split across the six pin-* codes below.",
            "items": {
              "type": "string",
              "enum": [
                "pin-only",
                "pin-buyer",
                "pin-rtl",
                "pin-tran",
                "pin-cfc-standard",
                "pin-cfc-social",
                "cn-standard",
                "cn-social",
                "cn-desg",
                "can-standard",
                "can-social",
                "can-desg",
                "can-tran",
                "can-modif",
                "veat",
                "corr",
                "qu-sy",
                "subco",
                "compl",
                "pmc",
                "brin-ecs",
                "brin-eeig"
              ],
              "enumTitles": [
                "Prior information notice – information only (no call for competition)",
                "Prior information notice – buyer profile / shortened time limits",
                "Prior information notice – used to reduce time limits",
                "Prior information notice – public passenger transport services",
                "Prior information notice used as a call for competition – standard regime",
                "Prior information notice used as a call for competition – social and other specific services",
                "Contract notice – standard regime",
                "Contract notice – social and other specific services",
                "Design contest notice",
                "Contract award notice – standard regime",
                "Contract award notice – social and other specific services",
                "Design contest result notice",
                "Contract award notice – public passenger transport services",
                "Contract modification notice",
                "Voluntary ex-ante transparency notice (direct award)",
                "Corrigendum (correction to an earlier notice)",
                "Qualification system notice (utilities)",
                "Subcontract notice (defence and security)",
                "Contract completion notice",
                "Preliminary market consultation notice",
                "Business registration information – European Company / European Cooperative Society",
                "Business registration information – European Economic Interest Grouping"
              ]
            },
            "default": []
          },
          "procedureType": {
            "title": "Procedure types",
            "type": "array",
            "description": "TED procedure-type codes to filter by. This is TED's COMPLETE filterable procedure-type vocabulary (all 17 codes, verified cycle 836; the 8 modern eForms codes plus 9 legacy pre-2023 single-character codes that TED still accepts). Leave empty for all. Server-side filter, same OR-group as noticeTypes. Two upstream quirks: there is no \"exp-int-rest\" code (TED rejects it), and the value \"7\" DOES appear in the output 'procedureType' field on some older notices but TED's expert search refuses it as a filter value, so it cannot be selected here. Most notices older than ~2014 carry no procedure type at all.",
            "items": {
              "type": "string",
              "enum": [
                "open",
                "restricted",
                "neg-w-call",
                "neg-wo-call",
                "comp-dial",
                "oth-single",
                "oth-mult",
                "innovation",
                "4",
                "9",
                "V",
                "E",
                "Z",
                "6",
                "A",
                "F",
                "8"
              ],
              "enumTitles": [
                "Open procedure (5,514,283 notices)",
                "Restricted procedure (272,065)",
                "Negotiated with prior call for competition (347,731)",
                "Negotiated without prior call for competition (218,760)",
                "Competitive dialogue (16,857)",
                "Other, single stage (30,716)",
                "Other, multiple stages (8,256)",
                "Innovation partnership (1,319)",
                "Legacy pre-eForms code 4 (170,522) - TED publishes no label for it",
                "Legacy pre-eForms code 9 (155,269) - TED publishes no label for it",
                "Legacy pre-eForms code V (78,038) - TED publishes no label for it",
                "Legacy pre-eForms code E (23,813) - TED publishes no label for it",
                "Legacy pre-eForms code Z (9,541) - TED publishes no label for it",
                "Legacy pre-eForms code 6 (4,255) - TED publishes no label for it",
                "Legacy pre-eForms code A (2,633) - TED publishes no label for it",
                "Legacy pre-eForms code F (1,183) - TED publishes no label for it",
                "Legacy pre-eForms code 8 (854) - TED publishes no label for it"
              ]
            },
            "default": []
          },
          "publishedWithinDays": {
            "title": "Published within (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Only return notices published in the last N days. Ignored if publicationDateFrom or publicationDateTo is set.",
            "default": 7
          },
          "publicationDateFrom": {
            "title": "Published from (absolute date)",
            "type": "string",
            "description": "YYYYMMDD or YYYY-MM-DD. Overrides 'Published within (days)' with an absolute historical window. Leave empty for no lower bound (with publicationDateTo set)."
          },
          "publicationDateTo": {
            "title": "Published to (absolute date)",
            "type": "string",
            "description": "YYYYMMDD or YYYY-MM-DD. Overrides 'Published within (days)'. Leave empty for no upper bound (with publicationDateFrom set)."
          },
          "keywords": {
            "title": "Keywords (full-text)",
            "type": "string",
            "description": "Free-text search using TED's FT~ full-text operator. Example: \"cloud hosting\". Verified live (cycle 919): this matches against the WHOLE notice text TED indexes, not just title/description/buyer name -- e.g. a search for \"software\" matched a notice whose only occurrence of the word was in its technical-capacity/selection-criteria text, which is not one of this Actor's output fields. A returned row may not visibly contain your keyword anywhere in its output. Leave empty to match everything in your other filters."
          },
          "expertQuery": {
            "title": "Expert query (advanced, overrides the filters above)",
            "type": "string",
            "description": "Raw TED expert-query string (same syntax as the TED website's expert search), e.g. \"buyer-country=DEU AND classification-cpv=72000000 AND publication-date>=today(-30)\". If set, this replaces countries/cpvCodes/noticeTypes/publishedWithinDays entirely."
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many notices.",
            "default": 100
          },
          "outputLanguage": {
            "title": "Output language",
            "enum": [
              "eng",
              "deu",
              "fra",
              "ita",
              "spa",
              "pol",
              "nld",
              "por",
              "swe",
              "dan",
              "fin",
              "ces",
              "ell",
              "hun",
              "ron",
              "slk",
              "slv",
              "bul",
              "hrv",
              "est",
              "lav",
              "lit",
              "gle",
              "mlt"
            ],
            "type": "string",
            "description": "Preferred language for localized fields (title, description, buyer name, notice link). Falls back to English, then to whichever language TED provided, if this notice has no translation into the chosen language.",
            "default": "eng"
          },
          "minValue": {
            "title": "Min contract value",
            "type": "integer",
            "description": "Only keep notices whose estimated/total contract value (the 'totalValue' output field) is at least this number. Compares the raw numeric value regardless of currency (TED reports EUR, CZK, RON, SEK etc. per notice — check 'totalValueCurrency' before comparing across countries). Roughly half of all TED notices carry no value at all; those are dropped whenever this filter is set. Leave empty for no minimum."
          },
          "maxValue": {
            "title": "Max contract value",
            "type": "integer",
            "description": "Only keep notices whose estimated/total contract value is at most this number. Same currency caveat as 'Min contract value'. Leave empty for no maximum."
          },
          "onlyOpenDeadlines": {
            "title": "Only tenders still open for bids",
            "type": "boolean",
            "description": "Keep only notices whose submission deadline ('deadlineDate') is today or later, i.e. ones you can still bid on. Notices where TED published no deadline at all are dropped while this is on — award/result notices and many prior-information notices carry none, and an absent deadline cannot be shown to be open. Off by default (every matching notice, open or closed). Filtered-out notices are not charged.",
            "default": false
          },
          "minDaysUntilDeadline": {
            "title": "Minimum days until deadline",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only notices with at least this many whole days left before the submission deadline, counted in Brussels local time — the zone every TED deadline is stamped in ('daysUntilDeadline' in the output). Use it to skip tenders you cannot realistically prepare a bid for: 14 drops anything closing inside two weeks. Implies the open-deadline filter (a passed deadline is negative), and drops notices with no published deadline. Leave empty for no deadline floor."
          },
          "flatten": {
            "title": "Flatten array fields for CSV/Excel",
            "type": "boolean",
            "description": "Join the 4 array fields (CPV codes, contract nature, place of performance country/city) into a single comma-separated string instead of a JSON array. Off by default (JSON arrays); turn on if you're exporting to CSV/Excel and want one clean column per field instead of numbered field/0, field/1 columns.",
            "default": false
          },
          "watchLabel": {
            "title": "Watch mode: label",
            "type": "string",
            "description": "Set a name (e.g. \"my-cpv-watch\") to turn this run into an alert: the FIRST run with a given label + filter combination records every currently-matching notice and returns nothing (you pay nothing). Every run after that returns and charges only for notices NOT already delivered under that label — ideal for a scheduled run that should only tell you what's new. Leave empty for a normal one-off search."
          },
          "webhookUrl": {
            "title": "Webhook URL (notify on completion)",
            "type": "string",
            "description": "Optional. An http(s) URL to POST a small JSON summary to when the run finishes — notices pushed, pages scanned, TED's own reported total, watch-label new count if Watch mode label is set, and the run's dataset ID so you can fetch the results. A convenience for callers who want a completion ping without setting up an Apify platform webhook (which needs separate Console/API configuration per Task, not per run). Best-effort: a failed or slow webhook is logged as a warning and never fails the run or affects charging — it fires after every notice has already been pushed and charged. Leave empty to skip."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}