{
  "openapi": "3.0.1",
  "info": {
    "title": "French Public Tenders Scraper & Monitor (BOAMP)",
    "description": "Get French public tenders and awards from BOAMP, including contracts below EU thresholds that never reach TED: buyer, department, CPV, deadline, value and winners. Filter by keyword, department and contract type, or get new tenders daily with Telegram or Slack alerts.",
    "version": "0.1",
    "x-build-id": "N3XfZKrKjcPCkgGo3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/gr1n~fr-tenders-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-gr1n-fr-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/gr1n~fr-tenders-monitor/runs": {
      "post": {
        "operationId": "runs-sync-gr1n-fr-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/gr1n~fr-tenders-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-gr1n-fr-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",
            "type": "array",
            "description": "Full-text search (in French) across the notice. A notice matches if it contains any of these words, for example [\"nettoyage\", \"propreté\"].",
            "items": {
              "type": "string"
            }
          },
          "cpvCodes": {
            "title": "CPV codes",
            "type": "array",
            "description": "Common Procurement Vocabulary codes, like 45000000 (construction work) or 72000000 (IT services). Child codes are included. Small (MAPA) notices often have no CPV code, so they are skipped when this filter is used; use keywords for them.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments",
            "type": "array",
            "description": "French department numbers where the buyer is located, like 75, 92, 06, 2A or 971. Leave empty for all of France.",
            "items": {
              "type": "string"
            }
          },
          "noticeTypes": {
            "title": "Notice types",
            "type": "array",
            "description": "'Open tenders' are calls for bids; 'Awards' name the winners.",
            "items": {
              "type": "string",
              "enum": [
                "APPEL_OFFRE",
                "ATTRIBUTION",
                "RECTIFICATIF",
                "ANNULATION",
                "MODIFICATION",
                "PRE-INFORMATION",
                "EX_ANTE_VOLONTAIRE",
                "all"
              ],
              "enumTitles": [
                "Open tenders (avis de marché)",
                "Awards (résultats de marché)",
                "Corrections (rectificatifs)",
                "Cancellations (annulations)",
                "Modifications",
                "Planned tenders (pré-information)",
                "Voluntary ex ante notices",
                "All notice types"
              ]
            },
            "default": [
              "APPEL_OFFRE"
            ]
          },
          "contractTypes": {
            "title": "Contract types",
            "type": "array",
            "description": "Works, services or supplies. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "TRAVAUX",
                "SERVICES",
                "FOURNITURES"
              ],
              "enumTitles": [
                "Works (travaux)",
                "Services",
                "Supplies (fournitures)"
              ]
            }
          },
          "thresholdBands": {
            "title": "Contract size bands",
            "type": "array",
            "description": "BOAMP publishes three bands: European-threshold contracts (also on TED), contracts between €90k and the EU thresholds, and small contracts under €90k (MAPA). The last two are not on TED. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "eu",
                "national",
                "small"
              ],
              "enumTitles": [
                "Above EU thresholds (also on TED)",
                "€90k to EU thresholds",
                "Under €90k (MAPA)"
              ]
            }
          },
          "daysBack": {
            "title": "Published in the last N days",
            "minimum": 1,
            "type": "integer",
            "description": "Used when 'Published from' is empty.",
            "default": 7
          },
          "publishedFrom": {
            "title": "Published from",
            "type": "string",
            "description": "Only notices published on or after this date."
          },
          "publishedTo": {
            "title": "Published to",
            "type": "string",
            "description": "Only notices published on or before this date."
          },
          "openOnly": {
            "title": "Only tenders still open",
            "type": "boolean",
            "description": "Skip tenders whose submission deadline has passed.",
            "default": false
          },
          "minValue": {
            "title": "Minimum value (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only notices whose estimated value (or awarded value for awards) is at least this many euros. Many French notices don't publish a value; they are skipped when this is set."
          },
          "maxItems": {
            "title": "Max notices",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many notices. Leave empty to get every match."
          },
          "outputMode": {
            "title": "Output format",
            "enum": [
              "full",
              "compact"
            ],
            "type": "string",
            "description": "'Full' gives every field. 'Compact' gives a short row per notice, handy for spreadsheets, alerts and AI agents.",
            "default": "full"
          },
          "monitorMode": {
            "title": "Only new notices since the last run",
            "type": "boolean",
            "description": "Remember what earlier runs of this same search returned and save only notices published since. Schedule the Actor daily to get a feed of new tenders and pay only for new ones.",
            "default": false
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Send a digest of the saved notices to Telegram. Create a bot with @BotFather and paste its token here."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Chat, group or channel to send the digest to. Add the bot to it first."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Send the digest to a Slack channel through an incoming webhook."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "POST the digest as JSON to any URL, for example a Make, Zapier or n8n webhook."
          },
          "notifyWhenEmpty": {
            "title": "Send alerts when nothing is new",
            "type": "boolean",
            "description": "Also send a message when a run finds no notices.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}