{
  "openapi": "3.0.1",
  "info": {
    "title": "EU & France Public Tenders Scraper — TED + BOAMP, Deduped",
    "description": "Scrape EU public tenders from TED (27 countries) and French BOAMP in one deduplicated dataset, plus French contract awards (DECP). Filter by country, CPV, keyword, region and value. Monitor mode returns only new notices. Official open data, no personal data. Appels d'offres, marchés publics.",
    "version": "0.2",
    "x-build-id": "UaOExe7zdkQUs1P0M"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tenderlantern~eu-public-tenders/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tenderlantern-eu-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/tenderlantern~eu-public-tenders/runs": {
      "post": {
        "operationId": "runs-sync-tenderlantern-eu-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/tenderlantern~eu-public-tenders/run-sync": {
      "post": {
        "operationId": "run-sync-tenderlantern-eu-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": {
          "keywords": {
            "title": "Mots-clés",
            "type": "array",
            "description": "Au moins un des mots doit apparaître (texte intégral TED, objet et contenu BOAMP, objet DECP). Ex. : logiciel, nettoyage, cybersécurité.",
            "items": {
              "type": "string"
            }
          },
          "cpvCodes": {
            "title": "Codes CPV (préfixes)",
            "type": "array",
            "description": "Ex. 72 (services informatiques), 48 (logiciels), 45 (travaux), 90910000. Un préfixe couvre toute la sous-arborescence. Les codes CPV publiés dans les avis BOAMP (formulaires européens et nationaux) sont lus ; pour les avis BOAMP sans aucun code CPV (surtout MAPA), voir « Avis sans code CPV ».",
            "items": {
              "type": "string"
            }
          },
          "cpvWithoutCode": {
            "title": "Avis sans code CPV (BOAMP)",
            "enum": [
              "descriptor",
              "include",
              "exclude"
            ],
            "type": "string",
            "description": "Quand un filtre CPV est donné et qu'un avis BOAMP ne publie aucun code CPV : « descriptor » garde l'avis si l'un de ses descripteurs BOAMP correspond au préfixe demandé (table documentée, aucun code CPV n'est inventé : `cpv` reste vide et `cpvMatchedBy` = boampDescriptor) ; « include » garde tous ces avis (`cpvMatchedBy` = noCpvIncluded) ; « exclude » les écarte.",
            "default": "descriptor"
          },
          "regions": {
            "title": "Régions",
            "type": "array",
            "description": "Lieu d'exécution (TED : codes NUTS ; BOAMP/DECP : départements).",
            "items": {
              "type": "string",
              "enum": [
                "Auvergne-Rhône-Alpes",
                "Bourgogne-Franche-Comté",
                "Bretagne",
                "Centre-Val de Loire",
                "Corse",
                "Grand Est",
                "Guadeloupe",
                "Guyane",
                "Hauts-de-France",
                "Île-de-France",
                "La Réunion",
                "Martinique",
                "Mayotte",
                "Normandie",
                "Nouvelle-Aquitaine",
                "Occitanie",
                "Pays de la Loire",
                "Provence-Alpes-Côte d'Azur"
              ]
            }
          },
          "departments": {
            "title": "Départements",
            "type": "array",
            "description": "Numéros : 75, 13, 2A, 971… Prioritaire sur les régions.",
            "items": {
              "type": "string"
            }
          },
          "tedCountries": {
            "title": "Pays TED (ISO 3, ou EU)",
            "type": "array",
            "description": "Pays couverts sur TED quand aucun filtre région/département n'est donné. « EU » (par défaut) = les 27 États membres ; ajoutez des codes ISO 3 (NOR, CHE…) ou n'en gardez que certains (FRA, BEL, DEU). « ALL » ou liste vide = tous les pays publiés sur TED. Les filtres région/département ne visent que la France. Les mots-clés sont cherchés dans la langue de l'avis : pour l'UE entière, combinez plusieurs langues (logiciel, software, Software) ou utilisez les codes CPV. BOAMP et DECP (France uniquement) ne sont interrogés que si la France est dans le périmètre (FRA, EU, ALL, ou un filtre région/département).",
            "default": [
              "EU"
            ],
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "DECP = marchés attribués (données essentielles) ; utile avec Type = attributions. Vide = TED + BOAMP pour les avis en cours ; TED + BOAMP + DECP pour les attributions.",
            "items": {
              "type": "string",
              "enum": [
                "TED",
                "BOAMP",
                "DECP"
              ]
            }
          },
          "noticeKind": {
            "title": "Type d'avis",
            "enum": [
              "tenders",
              "awards",
              "all"
            ],
            "type": "string",
            "description": "Appels d'offres en cours, attributions, ou tout.",
            "default": "tenders"
          },
          "daysBack": {
            "title": "Publiés depuis (jours)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Ignoré si « Publiés à partir du » est renseigné.",
            "default": 7
          },
          "publishedFrom": {
            "title": "Publiés à partir du",
            "type": "string",
            "description": "AAAA-MM-JJ"
          },
          "publishedTo": {
            "title": "Publiés jusqu'au",
            "type": "string",
            "description": "AAAA-MM-JJ"
          },
          "onlyOpen": {
            "title": "Seulement les consultations encore ouvertes",
            "type": "boolean",
            "description": "Date limite de réponse ≥ aujourd'hui (les avis sans date limite restent inclus côté BOAMP).",
            "default": true
          },
          "minAmount": {
            "title": "Montant minimum (€ HT)",
            "minimum": 0,
            "type": "integer",
            "description": "Montant minimum (€ HT)."
          },
          "maxAmount": {
            "title": "Montant maximum (€ HT)",
            "minimum": 0,
            "type": "integer",
            "description": "Montant maximum (€ HT)."
          },
          "excludeUnknownAmount": {
            "title": "Exclure les avis sans montant",
            "type": "boolean",
            "description": "Beaucoup d'avis ne publient pas de montant : à n'activer qu'en connaissance de cause.",
            "default": false
          },
          "onlyNew": {
            "title": "Nouveaux avis seulement (veille)",
            "type": "boolean",
            "description": "Ne renvoie que les avis jamais vus lors des exécutions précédentes avec la même clé de veille. Idéal avec une planification quotidienne.",
            "default": false
          },
          "stateKey": {
            "title": "Clé de veille",
            "type": "string",
            "description": "Une clé par veille (ex. informatique-paca).",
            "default": "default"
          },
          "maxResults": {
            "title": "Nombre maximum d'avis",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Nombre maximum d'avis.",
            "default": 200
          },
          "maxPerSource": {
            "title": "Maximum d'avis lus par source",
            "minimum": 10,
            "maximum": 5000,
            "type": "integer",
            "description": "Vide = TED et DECP : 1 000 avis lus au plus ; BOAMP : toute la fenêtre demandée (jusqu'à 20 000 avis), car le filtre CPV BOAMP s'applique après lecture. Une valeur (10 à 5 000) fixe le même plafond pour toutes les sources."
          },
          "resolveNames": {
            "title": "Résoudre les noms d'organisations (DECP)",
            "type": "boolean",
            "description": "Acheteurs et titulaires via l'API Recherche d'entreprises. Les entrepreneurs individuels (personnes physiques) sont toujours masqués.",
            "default": true
          },
          "strictKeywords": {
            "title": "Filtrage strict des mots-clés",
            "type": "boolean",
            "description": "Exige le mot-clé dans l'objet ou la description de l'avis (évite les faux positifs du texte intégral TED, ex. libellés CPV « à l'exception des logiciels »).",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}