{
  "openapi": "3.0.1",
  "info": {
    "title": "French & EU Tenders Monitor – BOAMP + TED Daily Alerts",
    "description": "Daily alerts for French (BOAMP, incl. MAPA below EU thresholds) and EU (TED) public tenders in one deduplicated feed. Filter by keyword, CPV, département, value. Award notices with winners. \"Only new\" mode: pay only for new notices, about $3/month at 20 new notices a day.",
    "version": "0.0",
    "x-build-id": "Ra6fOshb5txfWJIzC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/spherical_distinction~fr-eu-tenders-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-spherical_distinction-fr-eu-tenders-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/spherical_distinction~fr-eu-tenders-monitor/runs": {
      "post": {
        "operationId": "runs-sync-spherical_distinction-fr-eu-tenders-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/spherical_distinction~fr-eu-tenders-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-spherical_distinction-fr-eu-tenders-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": {
          "keywords": {
            "title": "Keywords (any of)",
            "type": "array",
            "description": "Notices matching ANY keyword are returned, e.g. \"logiciel\", \"maintenance informatique\", \"nettoyage\". Tip: use the notice language — French for BOAMP, English for Find a Tender (UK), Dutch for TenderNed; TED titles follow 'Preferred language' when translated. Leave empty for all.",
            "items": {
              "type": "string"
            }
          },
          "keywordScope": {
            "title": "Search keywords in",
            "enum": [
              "title",
              "fullText"
            ],
            "type": "string",
            "description": "Title only (precise) or full notice text (broader, noisier).",
            "default": "title"
          },
          "cpvPrefixes": {
            "title": "CPV codes or prefixes",
            "type": "array",
            "description": "Common Procurement Vocabulary codes. A prefix matches all sub-codes: 72 = IT services, 48 = software, 45 = construction works, 90911 = cleaning.",
            "items": {
              "type": "string"
            }
          },
          "noticeTypes": {
            "title": "Notice types",
            "type": "array",
            "description": "Contract notices = open calls for tenders. Awards = results with winners (great for competitor intelligence and sales leads).",
            "items": {
              "type": "string",
              "enum": [
                "contract-notice",
                "award",
                "prior-information",
                "correction"
              ],
              "enumTitles": [
                "Calls for tenders (avis de marché)",
                "Awards / results (attributions)",
                "Prior information (pré-information)",
                "Corrections & modifications"
              ]
            },
            "default": [
              "contract-notice"
            ]
          },
          "contractTypes": {
            "title": "Contract types",
            "type": "array",
            "description": "Works (travaux), services, supplies (fournitures). Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "works",
                "services",
                "supplies"
              ],
              "enumTitles": [
                "Works / Travaux",
                "Services",
                "Supplies / Fournitures"
              ]
            }
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "BOAMP = all French notices incl. below EU thresholds (MAPA). TED = EU-wide notices above thresholds. Find a Tender = UK notices (not on TED since Brexit). TenderNed = Dutch notices incl. national ones below EU thresholds. Default (empty): BOAMP + TED, as in previous versions.",
            "items": {
              "type": "string",
              "enum": [
                "boamp",
                "ted",
                "fts",
                "tenderned"
              ],
              "enumTitles": [
                "BOAMP (France)",
                "TED (European Union)",
                "Find a Tender (United Kingdom)",
                "TenderNed (Netherlands)"
              ]
            },
            "default": [
              "boamp",
              "ted"
            ]
          },
          "boampDepartments": {
            "title": "French departments (BOAMP)",
            "type": "array",
            "description": "Department codes, e.g. 75, 69, 13, 2A, 971. Applies to BOAMP only (TED uses NUTS codes; see output field nutsCodes).",
            "items": {
              "type": "string"
            }
          },
          "tedCountries": {
            "title": "Buyer countries (TED)",
            "type": "array",
            "description": "ISO 3166 alpha-3 codes, e.g. FRA, BEL, LUX, NLD, DEU. Use ALL for every country. Applies to TED only (Find a Tender is always UK, TenderNed always NL). Add NLD when you also select TenderNed so Dutch EU notices are deduplicated.",
            "default": [
              "FRA"
            ],
            "items": {
              "type": "string"
            }
          },
          "publishedWithinDays": {
            "title": "Published in the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Look-back window. For daily monitoring use 2–3 together with 'Only new notices'.",
            "default": 3
          },
          "publishedFrom": {
            "title": "…or published since (YYYY-MM-DD)",
            "type": "string",
            "description": "Overrides the look-back window."
          },
          "openOnly": {
            "title": "Only calls still open",
            "type": "boolean",
            "description": "Drop calls for tenders whose response deadline has passed.",
            "default": true
          },
          "minEstimatedValue": {
            "title": "Min estimated value",
            "type": "integer",
            "description": "Drop notices with a known estimated value below this amount, compared in the notice's currency (EUR for BOAMP / TED euro notices, GBP for Find a Tender). Notices with no published value are kept (TenderNed never publishes values in its open data)."
          },
          "onlyNew": {
            "title": "Only new notices (monitoring mode)",
            "type": "boolean",
            "description": "Remember notices already returned and output only new ones on each run, across all selected sources. Schedule the Actor daily and connect Slack / email / Google Sheets via Apify integrations. You only pay for new notices.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Optional. Runs sharing a monitor name share their 'already seen' memory. By default it is derived from your filters."
          },
          "dedupeAcrossSources": {
            "title": "Deduplicate across sources",
            "type": "boolean",
            "description": "European notices appear on BOAMP and TED, and Dutch EU notices on TenderNed and TED; keep only one copy (matched on the eForms notice ID, the TED publication number, or buyer + title for TenderNed ↔ TED).",
            "default": true
          },
          "language": {
            "title": "Preferred language (TED)",
            "enum": [
              "fra",
              "eng",
              "deu",
              "spa",
              "ita",
              "nld"
            ],
            "type": "string",
            "description": "Language of TED titles and texts when available.",
            "default": "fra"
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of notices to save. You pay per notice.",
            "default": 200
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}