{
  "openapi": "3.0.1",
  "info": {
    "title": "EU Tender Qualifier - AI Bid/No-Bid on TED & BOAMP",
    "description": "Find open EU public tenders on TED and French BOAMP (appels d'offres, Ausschreibungen, licitaciones, bandi di gara, aanbestedingen), score them against your company profile and get an AI bid/no-bid analysis with reasons and red flags. Alerts when a tender is corrected, postponed or cancelled.",
    "version": "0.2",
    "x-build-id": "xHESiLPH8AQMzcSYW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/bidcompass~eu-tender-qualifier/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-bidcompass-eu-tender-qualifier",
        "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/bidcompass~eu-tender-qualifier/runs": {
      "post": {
        "operationId": "runs-sync-bidcompass-eu-tender-qualifier",
        "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/bidcompass~eu-tender-qualifier/run-sync": {
      "post": {
        "operationId": "run-sync-bidcompass-eu-tender-qualifier",
        "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": {
          "cpvCodes": {
            "title": "CPV codes",
            "type": "array",
            "description": "8-digit CPV codes of what you sell. Parent codes match their children: 72000000 matches every IT service code. Provide CPV codes, keywords, or both.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Words or phrases searched as whole words in the tender title and description (accents, case and plurals ignored: 'video' does not match 'videoprotection'). Title hits score higher.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Tenders containing one of these words get a strong penalty (for example: travaux, nettoyage).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "requireKeyword": {
            "title": "At least one keyword required",
            "type": "boolean",
            "description": "On: a tender is returned only if one of your keywords (or its translation) appears in its title or description. Useful when your CPV codes are broad (72000000 covers all IT services).",
            "default": false
          },
          "contractNatures": {
            "title": "Type of contract",
            "type": "array",
            "description": "Keep only services, supplies or works contracts. Empty = all. An IT services company would pick services to drop hardware supply tenders.",
            "items": {
              "type": "string",
              "enum": [
                "services",
                "supplies",
                "works"
              ],
              "enumTitles": [
                "Services",
                "Supplies (goods)",
                "Works"
              ]
            },
            "default": []
          },
          "excludeCpvCodes": {
            "title": "Exclude CPV codes",
            "type": "array",
            "description": "Tenders whose MAIN CPV code falls under one of these get a strong penalty (for example 45000000 to drop construction works that only mention your products as a secondary code).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "translateKeywords": {
            "title": "Translate keywords for foreign notices",
            "type": "boolean",
            "description": "Translate your keywords once per run into the languages of the selected buyer countries (one small AI call, included in the price), so a French keyword also finds Spanish or German notices. Needs at least one country selected. This call happens in rules mode too: turn it off to send nothing to an AI model.",
            "default": true
          },
          "companyProfile": {
            "title": "Company profile (for the AI analysis)",
            "type": "string",
            "description": "Describe your company in a few lines: size, skills, certifications, references, regions served, what you never bid on. The AI compares each tender with this profile.",
            "default": ""
          },
          "countries": {
            "title": "Buyer countries",
            "type": "array",
            "description": "ISO-2 codes of the buyer countries (FR, BE, DE…). Empty = all countries on TED. BOAMP is only used when FR is selected or the list is empty.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "French départements (BOAMP)",
            "type": "array",
            "description": "Optional département codes (for example 69, 38, 2A). French notices from TED and BOAMP are kept only when their place of performance (or, failing that, the buyer's address) is in one of them.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "nutsCodes": {
            "title": "Regions (NUTS codes, TED)",
            "type": "array",
            "description": "Optional NUTS region prefixes to narrow TED notices of their country: DE2 = Bavaria, AT13 = Vienna, BE1 = Brussels, ES51 = Catalonia, FRK2 = Rhône-Alpes. Countries without a region filter stay whole.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "TED covers notices above EU thresholds in 30+ countries. BOAMP adds French national and below-threshold (MAPA) notices; its EU notices are skipped when TED is also selected, to avoid duplicates.",
            "items": {
              "type": "string",
              "enum": [
                "ted",
                "boamp"
              ],
              "enumTitles": [
                "TED (EU)",
                "BOAMP (France)"
              ]
            },
            "default": [
              "ted",
              "boamp"
            ]
          },
          "publishedWithinDays": {
            "title": "Published in the last (days)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Only tenders published in this many days. Use 1 for a daily schedule, 7 for a weekly one.",
            "default": 7
          },
          "minDaysToDeadline": {
            "title": "Minimum days before deadline",
            "minimum": 0,
            "maximum": 120,
            "type": "integer",
            "description": "Skip tenders closing sooner than this, since there is not enough time to answer.",
            "default": 7
          },
          "minValueEur": {
            "title": "Minimum estimated value (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Tenders below this estimated value get a red flag and a 20-point penalty. 0 = no minimum. Tenders without a published value are kept.",
            "default": 0
          },
          "maxValueEur": {
            "title": "Maximum estimated value (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Tenders above this estimated value get a red flag and a 20-point penalty. 0 = no maximum.",
            "default": 0
          },
          "strictValueRange": {
            "title": "Exclude tenders outside the value range",
            "type": "boolean",
            "description": "On: tenders whose published value is outside your range are not returned (tenders without a value are kept). Off: they are returned with a red flag and a 20-point penalty.",
            "default": false
          },
          "analysisMode": {
            "title": "Analysis mode",
            "enum": [
              "ai",
              "rules"
            ],
            "type": "string",
            "description": "\"ai\": rule-based score for every tender, plus an AI go/no-go analysis of the best ones. \"rules\": rule-based score only (cheaper).",
            "default": "ai"
          },
          "maxAiAnalyses": {
            "title": "Max AI analyses per run",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "AI analysis runs on the best-scored tenders only, up to this number. Each analysis is a paid event.",
            "default": 10
          },
          "minFitScore": {
            "title": "Minimum fit score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Only tenders whose rule-based score (0-100) reaches this value are returned and charged.",
            "default": 35
          },
          "maxTenders": {
            "title": "Max tenders returned",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of qualified tenders pushed to the dataset, best first.",
            "default": 50
          },
          "language": {
            "title": "Output language",
            "enum": [
              "en",
              "fr",
              "de",
              "es",
              "it",
              "nl",
              "pl",
              "pt"
            ],
            "type": "string",
            "description": "Language of the reasons and red flags (English, French, German; others fall back to English), of TED texts when the buyer provides them, and of the AI analysis.",
            "default": "en"
          },
          "aiModel": {
            "title": "AI model",
            "enum": [
              "anthropic/claude-haiku-5.5"
            ],
            "type": "string",
            "description": "Model used for the AI analysis and the keyword translation. Only models whose cost per analysis is known and included in the price are offered.",
            "default": "anthropic/claude-haiku-5.5"
          },
          "onlyNewSinceLastRun": {
            "title": "Only new tenders since last run",
            "type": "boolean",
            "description": "Remember the tenders already returned and skip them next time. Ideal for a daily or weekly schedule.",
            "default": false
          },
          "trackChanges": {
            "title": "Track corrections and cancellations",
            "type": "boolean",
            "description": "Label corrected notices (extended deadline, correction, cancellation) and merge them with the version they replace. With \"Only new tenders\", you also get an alert when a tender you already received is corrected or cancelled, even if it no longer matches your filters.",
            "default": true
          },
          "stateKey": {
            "title": "Monitoring key",
            "type": "string",
            "description": "Name of the memory used by \"Only new tenders\". Use a different key for each profile you monitor.",
            "default": "default"
          },
          "maxNoticesPerSource": {
            "title": "Max notices fetched per source",
            "minimum": 10,
            "maximum": 5000,
            "type": "integer",
            "description": "Safety cap on notices downloaded from each source before scoring.",
            "default": 1500
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}