{
  "openapi": "3.0.1",
  "info": {
    "title": "Swiss Public Tenders Scraper (simap.ch) — Tenders & Awards",
    "description": "Scrape Swiss public tenders and contract awards from simap.ch: CPV codes, offer deadlines, award criteria with weights, buyer contacts and — for awards — the winner, awarded price and number of bids. Filter by canton, CPV, publication type and date. Official API, no login.",
    "version": "0.1",
    "x-build-id": "re3hTIiXSnOPmELaI"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/publicdata~simap-swiss-public-tenders/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-publicdata-simap-swiss-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/publicdata~simap-swiss-public-tenders/runs": {
      "post": {
        "operationId": "runs-sync-publicdata-simap-swiss-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/publicdata~simap-swiss-public-tenders/run-sync": {
      "post": {
        "operationId": "run-sync-publicdata-simap-swiss-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": {
          "search": {
            "title": "Search text",
            "type": "string",
            "description": "Full-text query (keyword, project number, buyer name). Leave empty to list everything matching the filters. Tip: use quotes for exact phrases, e.g. \"42601\". simap indexes each publication per language, so by default the Actor runs the query against all four language versions (DE/FR/IT/EN) and merges the hits - a German keyword is found even when 'language' is set to Italian. Turn 'searchAllLanguages' off to search one language only."
          },
          "searchAllLanguages": {
            "title": "Search all four language versions",
            "type": "boolean",
            "description": "Only used when 'search' is filled in. simap indexes each publication separately per language, so a German keyword scores zero against the Italian version. With this on (default) the Actor runs the query once per official language (DE/FR/IT/EN) and merges the hits, which costs four times the upstream requests. Turn it off to search only the language chosen in 'language'.",
            "default": true
          },
          "publicationTypes": {
            "title": "Publication types",
            "type": "array",
            "description": "Which publication types to return. Default: open tenders only. 'award_tender' gives who won what (useful for competitor intelligence). Two limits to know: simap matches this against each project's NEWEST publication only, so a tender that has since been awarded is returned as an award, not as a tender; and 'Direct award' returns nothing at all unless you also set onlySwitzerland to false, because no direct award carries a place of performance. See 'Honest limits' in the README.",
            "items": {
              "type": "string",
              "enum": [
                "tender",
                "award_tender",
                "advance_notice",
                "request_for_information",
                "competition",
                "study_contract",
                "award_study_contract",
                "award_competition",
                "direct_award",
                "participant_selection",
                "revocation",
                "abandonment",
                "selective_offering_phase"
              ],
              "enumTitles": [
                "Tender (open call)",
                "Award of tender (winner published)",
                "Advance notice",
                "Request for information",
                "Competition",
                "Study contract",
                "Award of study contract",
                "Award of competition",
                "Direct award",
                "Participant selection",
                "Revocation",
                "Abandonment",
                "Selective offering phase"
              ]
            },
            "default": [
              "tender"
            ]
          },
          "cantons": {
            "title": "Cantons (place of performance)",
            "type": "array",
            "description": "Two-letter codes of the canton where the contract is performed. Only the 26 official codes are accepted (AG, AI, AR, BE, BL, BS, FR, GE, GL, GR, JU, LU, NE, NW, OW, SG, SH, SO, SZ, TG, TI, UR, VD, VS, ZG, ZH); anything else is rejected before the run starts, because simap answers HTTP 400 for a code that is not two letters and answers HTTP 200 with zero records for a two-letter code it does not know (e.g. 'XX', 'FL'). Empty = all of Switzerland.",
            "items": {
              "type": "string",
              "pattern": "^\\s*[A-Za-z]{2}\\s*$"
            }
          },
          "cpvCodes": {
            "title": "CPV codes",
            "type": "array",
            "description": "Common Procurement Vocabulary codes to filter by (e.g. 45000000 construction, 72000000 IT services). Exactly 8 digits; simap matches hierarchically by CPV level (45000000 division, 45100000 group, 45110000 class). A record also matches on its additional or lot-level codes, so its primary cpvCode can sit outside the code you asked for - the exported 'additionalCpvCodes' and 'lotsDetailed' show why it matched. '00000000' is rejected: simap accepts it but it disables CPV filtering entirely.",
            "items": {
              "type": "string",
              "pattern": "^[0-9]{8}$"
            }
          },
          "publishedFrom": {
            "title": "Published from (YYYY-MM-DD)",
            "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Only projects whose NEWEST publication date is on/after this day. Default: 30 days ago. simap cannot search superseded publications, so a past window omits tenders that have since been awarded, revoked or abandoned: measured on 2026-08-21, a tender month understates the tenders actually published in it by ~2% at one month of age, ~30% at three months and ~70-74% from seven months on - see 'Honest limits' in the README."
          },
          "publishedUntil": {
            "title": "Published until (YYYY-MM-DD)",
            "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Only projects whose NEWEST publication date is on/before this day. Same newest-only limitation as 'Published from'. Records simap occasionally leaks from outside the window are not exported and not charged for."
          },
          "onlySwitzerland": {
            "title": "Only publications with a Swiss place of performance",
            "type": "boolean",
            "description": "Keep only publications whose place of performance simap records as Switzerland. This is simap's own filter and it also drops publications where the place of performance is not recorded at all, which is far more common than a foreign one. Measured on 2026-08-21 over 2026-06-01..2026-07-31: it keeps 2128 of 2135 tenders and 1695 of 1780 awards, but only 42 of 59 advance notices, 26 of 60 requests for information, 2 of 4 revocations and 0 of 367 direct awards - no direct award carries a place of performance, so 'Direct award' returns nothing at all unless you turn this off. Only 10 of those 4606 publications were actually foreign. Set to false to receive everything.",
            "default": true
          },
          "language": {
            "title": "Preferred language for text fields",
            "enum": [
              "it",
              "de",
              "fr",
              "en"
            ],
            "type": "string",
            "description": "Titles/descriptions are returned in this language when available, with automatic fallback to the other official languages. All raw translations are kept in the 'translations' field. It does not narrow the search unless you also set 'searchAllLanguages' to false.",
            "default": "it"
          },
          "includeDetails": {
            "title": "Fetch full details per publication",
            "type": "boolean",
            "description": "Adds description, CPV label, offer deadline, Q&A deadline, award criteria with weights when the buyer published them (15.4% of the 1153 tenders published in July 2026), qualification criteria, buyer contact, lots. One extra request per publication (still fast: ~3/s); for award publications, one more to read the criteria and deadlines off the tender the award refers to, since simap does not repeat them on the award itself (0 of 877 July-2026 awards did).",
            "default": true
          },
          "stripHtml": {
            "title": "Strip HTML from descriptions",
            "type": "boolean",
            "description": "Convert rich-text fields to plain text.",
            "default": true
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many publications (safety cap). 0 = no limit.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}