{
  "openapi": "3.0.1",
  "info": {
    "title": "EU and Dutch Tender Alerts: TED + TenderNed Monitor",
    "description": "Get new public tenders from TED and TenderNed every day. Filter by CPV code, keyword, country, buyer, notice type and minimum value. Scheduled runs can return only new notices, skip TED duplicates and remove personal data. Works with schedules, webhooks and AI agents over MCP. $0.003 per notice.",
    "version": "0.1",
    "x-build-id": "x5qu9j2yovE4btvEw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/vizellie~eu-nl-tender-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-vizellie-eu-nl-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/vizellie~eu-nl-tender-monitor/runs": {
      "post": {
        "operationId": "runs-sync-vizellie-eu-nl-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/vizellie~eu-nl-tender-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-vizellie-eu-nl-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",
        "properties": {
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which official sources to query. TED = EU Tenders Electronic Daily (all EU/EEA countries). TenderNed = Dutch government tender platform (includes national, below-EU-threshold Dutch tenders).",
            "items": {
              "type": "string",
              "enum": [
                "ted",
                "tenderned"
              ],
              "enumTitles": [
                "TED (EU)",
                "TenderNed (Netherlands)"
              ]
            },
            "default": [
              "ted",
              "tenderned"
            ]
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Full-text search terms. A notice matches if it matches ANY keyword. Words within one keyword must all appear (e.g. 'cloud hosting'). Works in any language; for Dutch tenders use Dutch terms too (e.g. 'onderhoud', 'schoonmaak', 'software').",
            "items": {
              "type": "string"
            }
          },
          "cpvCodes": {
            "title": "CPV codes",
            "type": "array",
            "description": "Common Procurement Vocabulary codes. Trailing zeros act as a wildcard: '72000000' matches all IT services (72xxxxxx), '45000000' all construction work. Check digits (e.g. '45000000-7') are optional.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Buyer countries",
            "type": "array",
            "description": "ISO 2-letter country codes of the contracting authority (e.g. NL, BE, DE). Leave empty for all countries (TED). TenderNed is only queried when NL is included or the list is empty.",
            "default": [
              "NL"
            ],
            "items": {
              "type": "string"
            }
          },
          "buyerName": {
            "title": "Buyer name contains",
            "type": "string",
            "description": "Only notices whose contracting authority name contains this text, e.g. 'gemeente Utrecht' or 'Rijkswaterstaat'."
          },
          "noticeCategories": {
            "title": "Notice categories",
            "type": "array",
            "description": "competition = open calls for tender (what most bidders want); planning = prior information notices & market consultations; result = contract award notices; change = corrections & modifications; other = early terminations, direct-award pre-announcements.",
            "items": {
              "type": "string",
              "enum": [
                "competition",
                "planning",
                "result",
                "change",
                "other"
              ],
              "enumTitles": [
                "Open calls for tender",
                "Planning / market consultation",
                "Contract awards",
                "Corrections / modifications",
                "Other"
              ]
            },
            "default": [
              "competition"
            ]
          },
          "publishedSince": {
            "title": "Published since",
            "type": "string",
            "description": "Start of the publication-date range: YYYY-MM-DD or relative like '7 days', '2 weeks', 'yesterday'.",
            "default": "7 days"
          },
          "publishedUntil": {
            "title": "Published until",
            "type": "string",
            "description": "Optional end of the publication-date range (YYYY-MM-DD, inclusive)."
          },
          "sinceLastRun": {
            "title": "Since last run",
            "type": "boolean",
            "description": "Ignore 'Published since' and search from the day before the previous run (stored in the state store). Ideal for schedules.",
            "default": false
          },
          "onlyNewItems": {
            "title": "New items only",
            "type": "boolean",
            "description": "Skip notices already returned by earlier runs with the same state store + state key. Turn on for scheduled monitoring/alerts.",
            "default": false
          },
          "minValue": {
            "title": "Minimum estimated value",
            "minimum": 0,
            "type": "integer",
            "description": "Only notices with an estimated value at or above this amount (in the notice's own currency, almost always EUR). TenderNed does not publish values in its open API."
          },
          "includeUnknownValue": {
            "title": "Keep notices without a value",
            "type": "boolean",
            "description": "When a minimum value is set, keep notices that don't state an estimated value (many don't, and TenderNed never does).",
            "default": true
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum number of notices saved per run, newest first across sources.",
            "default": 50
          },
          "skipTenderNedEuropean": {
            "title": "Skip EU-wide TenderNed duplicates",
            "type": "boolean",
            "description": "When TED is also selected, skip TenderNed notices flagged as European - they are also published on TED, so this avoids duplicates.",
            "default": true
          },
          "tenderNedDetails": {
            "title": "Enrich TenderNed notices",
            "type": "boolean",
            "description": "Fetch each TenderNed notice's detail record to add CPV and NUTS codes (one extra request per notice).",
            "default": true
          },
          "includeDescription": {
            "title": "Include description",
            "type": "boolean",
            "description": "Add a short (max 1,000 characters) description. Email addresses, phone numbers and contact-person names are removed.",
            "default": true
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store used to remember seen notice IDs and the last run date.",
            "default": "tender-monitor-state"
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Use a different key per saved search/schedule so their 'seen' lists don't mix.",
            "default": "default"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}