Swiss Public Tenders Scraper (simap.ch) — Tenders & Awards
Pricing
from $4.25 / 1,000 tenders
Swiss Public Tenders Scraper (simap.ch) — Tenders & Awards
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.
Pricing
from $4.25 / 1,000 tenders
Rating
0.0
(0)
Developer
PublicData
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Stop refreshing simap.ch by hand: every Swiss tender matching your cantons and CPV codes arrives as a structured feed — and for contracts already decided, you get the awarded price, the winner, and how many bids came in.
simap.ch is the official gazette for Swiss public procurement: the Confederation, all 26 cantons and the municipalities publish there, around 1,000 tender publications a month plus the awards that follow. The site shows one publication at a time; this Actor turns the same public data into a dataset you can filter, schedule and pipe anywhere — JSON export, CSV or Excel.
What you get
Around 45 fields per publication — 50 on awards, which add the decision block — in the language you ask for (IT/DE/FR/EN, with fallback to the other official languages; raw translations stay in translations).
Award data that is rarely exported in bulk:
winnerPriceandwinnerCurrency— the price simap publishes for the awarded offer (e.g.616666.6CHF), not an estimate. It is the price of the first entry ofaward.vendors. Measured on 2026-08-21 over all 877 award-of-tender publications of July 2026: 44 of them (5.0 %) publish no vendor price at all; for 17 of those simap publishes a total range instead, exported asaward.totalPriceRange.min/.max(e.g. 341,738 – 910,198.80 CHF), which leaves 27 awards (3.1 %) with no amount anywhere because the buyer withheld it under the procurement law (award.totalPriceSelection: "no_specification_according_to_ppa_law").award.numberOfSubmissions— how many bidders you were up againstwinnerName, the fullaward.vendorslist, the decision date and justification, andreferencedTenderlinking the Zuschlag back to its tender.award.vendorsis not a ranked list: simap'srankwas null on 904 of the 931 vendor rows of July 2026 (97.1 %), and each of the 27 rows that did carryrank: 1was the sole vendor of its award. 27 of the 877 awards (3.1 %) name several vendors — framework agreements, split lots — and every one of those hadrank: nullthroughout, so therewinnerName/winnerPriceare simply the first vendor simap returned: neither the largest nor a ranked first place. Readaward.vendorsin full for those. Example: project 37387 (electricity framework contract 2028-2030) lists four suppliers at 11.21, 11.38, 11.84 and 12.17 M CHF with no rank on any of them, and the Actor exports the 12.17 M one aswinnerPrice.
awardCriteria with weighting and maxPoints — e.g. Price 70 %, References 30 %, with isPriceCriterion separating price from quality — but read the numbers before you plan around this field. Most buyers tick criteria in the tender documents, which puts the weights into PDFs this Actor does not download. Measured on 2026-08-21 over every one of the 1,153 tenders published in July 2026: awardCriteria is populated on 178 of them (15.4 %, about one in six) and 175 of those carry weightings; of the 975 empty ones, awardCriteriaSelection is criteria_in_documents for 874, null for 100 and total_price for 1. awardCriteriaSelection ships with every detailed record so you can tell "the buyer published no weights" from "the field is missing". simap does not repeat criteria or deadlines on an award publication at all — 0 of the 877 July-2026 awards carried them; the Actor reads them off the tender the award refers to and marks that with criteriaSource: "referencedTender". 814 of those 877 awards (92.8 %) point at a readable tender, and all 814 yielded an offerDeadline, 152 (18.7 %) a non-empty awardCriteria.
Deadlines that decide whether you can still bid: offerDeadline (ISO 8601 with timezone), qnaDeadline for questions to the buyer, offerOpening, offerValidityUntil, documentsAvailableFrom.
Who is buying, where, and what:
buyerNameplus abuyercontact block (address, e-mail, phone, city, canton), andrecipient, where offers must be sentcanton,city,postalCode,countryof the place of performancecpvCodewith readablecpvLabel, plusadditionalCpvCodesand per-lot codes inlotsDetailed— a CPV filter matches those too, so they explain why a record with an unrelated primarycpvCodecame backorderType(supply / service / construction),processType(open, selective, invitation, direct)title, plain-textdescription,qualificationCriteria,lotsDetailedfor multi-lot projectsstateContractArea(WTO/GPA treaty scope) andpublicationTed(also in the EU journal TED)
Identifiers and provenance: projectNumber (stable across all publications of one project), publicationNumber, projectId, publicationId, pubType, publicationDate, the simapUrl deep link, source and the mandatory disclaimer.
Who uses this
- A bid manager watches three cantons and two CPV branches, and sees new tenders the morning they appear.
- A sales lead pulls a year of awards to see which competitor wins at which Zuschlagspreis, against how many bidders, before pricing the next offer — reading
award.vendorsrather thanwinnerNamealone on the 3 % of awards that name several suppliers. - A bid-strategy analyst reads the criteria weights first: 70 % price and 30 % references call for two different documents.
- A compliance officer or researcher keeps a dated, unaltered record of what each body published. For multi-year statistics, collect awards as well as tenders — a past tender window alone understates history (see Honest limits).
- An AI agent calls this Actor as an MCP tool to answer "which public tenders in Switzerland close in the next 14 days for CPV 72000000?".
Example output
A tender (shortened):
{"projectNumber": "42601","pubType": "tender","publicationDate": "2026-08-19","title": "Concorso per la fornitura di tre carburanti di aviazione","buyerName": "Aeroporto cantonale di Locarno","canton": "TI","city": "Gordola","cpvCode": "09100000","cpvLabel": "Combustibili","processType": "open","offerDeadline": "2026-10-12T12:00:00+02:00","qnaDeadline": "2026-09-23","awardCriteria": [{ "title": "Prezzo", "weighting": 70, "maxPoints": 6, "isPriceCriterion": true }],"buyer": {"name": "Aeroporto cantonale di Locarno","email": "dt-sg.ud@ti.ch","phone": "+41918142625","city": "Gordola","canton": "TI"},"simapUrl": "https://www.simap.ch/it/project-detail/93027c93-e1c9-4b7d-99db-c974e735ba8b","source": "simap.ch","disclaimer": "Dies ist keine amtliche Veröffentlichung. Massgebend sind die auf der Plattform www.simap.ch veröffentlichten Daten."}
An award (shortened) — the part other sources leave out:
{"projectNumber": "24563","pubType": "award","winnerName": "Edilstrada SA","winnerPrice": 616666.6,"winnerCurrency": "CHF","source": "simap.ch"}
Input
| Field | What it does |
|---|---|
search | Full-text query: keyword, project number, buyer name. Quotes = exact phrase. Empty = all filter matches. By default run against all four language versions and merged, so a German keyword is found with language: "it" — see searchAllLanguages. |
searchAllLanguages | Default true. Only applies when search is set. false searches the language version only, at a quarter of the upstream requests. |
publicationTypes | Default ["tender"]. Use ["award_tender"] for who won what. Matched against each project's newest publication only, and "direct_award" needs onlySwitzerland: false — see Honest limits. |
cantons | Canton codes of the place of performance, e.g. ["TI","ZH","GE"]. Only the 26 official codes are accepted; anything else fails the run with a message instead of being sent to simap, which answers HTTP 400 for a non-two-letter code and HTTP 200 with zero records for an unknown one. Empty = all of Switzerland. |
cpvCodes | CPV codes, exactly 8 digits, matched hierarchically by CPV level, e.g. 45000000 construction, 72000000 IT services. 00000000 is rejected: simap accepts it but it switches the filter off. |
publishedFrom / publishedUntil | Date window, YYYY-MM-DD, on each project's newest publication date. Default from = 30 days ago. Must be real calendar dates. Records outside the window are never exported, so you are never charged for one. |
onlySwitzerland | Keep only publications whose place of performance simap records as Switzerland. Default true. It also drops publications with no recorded place of performance — including every direct award. See Honest limits. |
language | Preferred language for text fields: it, de, fr, en. Default it. Does not narrow search unless you also set searchAllLanguages: false. |
includeDetails | Adds description, CPV label, deadlines, award criteria (when the buyer published them — 15.4 % of tenders), qualification criteria, contact, lots. Default true. |
stripHtml | Rich text converted to plain text. Default true. |
maxItems | Safety cap. Default 200, 0 = no limit. |
Every open IT-services tender in Zurich and Bern published since 1 August, texts in German:
{"publicationTypes": ["tender"],"cantons": ["ZH", "BE"],"cpvCodes": ["72000000"],"publishedFrom": "2026-08-01","language": "de"}
Competitor intelligence: every Zuschlag in Ticino this year, with winner, price and bid count:
{"publicationTypes": ["award_tender"],"cantons": ["TI"],"publishedFrom": "2026-01-01","language": "it","maxItems": 0}
Run it on a schedule
To monitor new Swiss tenders daily, save your filters as a Task, leave publishedFrom empty so each run covers the last 30 days, and schedule it. Attach an Apify integration to the dataset and results go straight to Google Sheets, Slack, e-mail, a webhook, Make or Zapier — no code in between. Many teams run one task per canton or CPV branch so each alert reaches the right person.
If you keep history, deduplicate on publicationId, unique per publication, or on publicationNumber. Group a tender with its later award using projectNumber.
Use it from code or from an AI agent
Developers start runs and read results through the Apify API or CLI in any language; the dataset comes back as JSON, CSV, Excel or XML. The Actor is also exposed as an MCP tool via the Apify MCP server, so an AI agent can call it directly — every input field carries a description written for that purpose.
Pricing
Pay per event: a small fee for each publication exported, shown in the pricing box on this page. Platform usage is negligible because this tender scraper uses simap's public REST API only — no browser, no proxies, no captcha, no login. Measured on 2026-08-21: 100 tenders with full details took 32 seconds, politely rate-limited with retries, and 100 awards took 81 seconds, because 97 of those 100 needed a second request to recover the deadlines and criteria simap keeps on the referenced tender.
Where the data comes from
Data comes from the public simap.ch API, read anonymously. simap's API terms (AGB der Nutzung des Application Programming Interfaces (API) von simap.ch, version 13.11.2023, published at simap.ch/de/about/legal) say how that may be used: §3 states the API can be used without a user account, §4 permits API users to obtain publication data for commercial purposes and pass it on to third parties, and §5 requires that the data is not altered in content, is displayed visually distinct from commentary, and carries this notice — prescribed there word for word, and shipped verbatim in the disclaimer field of every record:
Dies ist keine amtliche Veröffentlichung. Massgebend sind die auf der Plattform www.simap.ch veröffentlichten Daten. — This is not an official publication; the data published on the platform www.simap.ch prevails. (Unofficial translation; the German wording above is the one simap prescribes.)
Honest limits
Only the newest publication of a project is searchable. simap's search endpoint returns one row per project — that project's current newest publication — and both the date window and publicationTypes apply to that newest publication only. There is no parameter that reaches superseded publications (pubTypes, publicationTypes, anyPubTypes and allPubTypes are silently ignored by the API; only newestPubTypes exists). So a tender that has since been awarded, revoked or abandoned drops out of a tender search of the month it was published in.
How much that costs you was measured on 2026-08-21, not estimated: all 7,711 terminal publications (awards, abandonments, revocations) whose newest publication falls on or after 2025-12-01 were read, and the tender each one references was recovered from referencedTender. Column still visible is what a tender query for that month returns today; recovered from awards is how many more tenders that month really had.
| Tender month | Age today | Still visible | Recovered from awards | Real total (≥) | Understated by |
|---|---|---|---|---|---|
| 2026-07 | 1 month | 1153 | 19 | 1172 | 1.6 % |
| 2026-06 | 2 months | 982 | 102 | 1084 | 9.4 % |
| 2026-05 | 3 months | 700 | 306 | 1006 | 30.4 % |
| 2026-04 | 4 months | 517 | 519 | 1036 | 50.1 % |
| 2026-03 | 5 months | 429 | 639 | 1068 | 59.8 % |
| 2026-02 | 6 months | 326 | 558 | 884 | 63.1 % |
| 2026-01 | 7 months | 230 | 653 | 883 | 74.0 % |
| 2025-12 | 8 months | 212 | 538 | 750 | 71.7 % |
These are lower bounds: a tender superseded by something the awards do not point back to is not counted. The real total column is the same ~1,000 publications a month in every row, which is the check that the method works. Recent windows — the daily-monitoring case this Actor is built for — are essentially complete; a window six months old or older is missing roughly seven tenders in ten. Award publications are barely affected, being usually terminal. To reconstruct history, also run publicationTypes: ["award_tender"] and follow referencedTender / projectNumber back to the tender.
onlySwitzerland also hides publications with no stated place of performance. It is simap's own orderAddressCountryOnlySwitzerland filter, and simap treats "not recorded" the same as "abroad". Measured on 2026-08-21 across all 13 publication types over 2026-06-01..2026-07-31 (4,606 publications, of which only 10 were genuinely foreign):
| Type | With onlySwitzerland: true | With false | Lost |
|---|---|---|---|
| Tender | 2128 | 2135 | 0.3 % |
| Award of tender | 1695 | 1780 | 4.8 % |
| Advance notice | 42 | 59 | 28.8 % |
| Request for information | 26 | 60 | 56.7 % |
| Revocation | 2 | 4 | 50 % |
| Award of study contract | 2 | 5 | 60 % |
| Direct award | 0 | 367 | 100 % |
| Competition, study contract, award of competition, participant selection, abandonment | unchanged | unchanged | 0 % |
No direct award carries a place of performance, so publicationTypes: ["direct_award"] returns nothing at all while onlySwitzerland is true — 0 records against 367 for June–July 2026, 0 against 1,312 for 2026 to date, 0 against 2,080 for 2025. The Actor logs a warning when you ask for that combination. Set onlySwitzerland: false to receive them; the price is roughly two foreign records per thousand.
Award criteria are usually not published as data. See the numbers under What you get: 178 of the 1,153 tenders published in July 2026 (15.4 %) carry awardCriteria; for 874 of the remaining 975 the buyer put the weights in the tender documents instead, which awardCriteriaSelection: "criteria_in_documents" tells you.
Tender documents (PDFs) are not downloaded — they stay the intellectual property of the contracting authorities, so you get publication metadata and texts, not the specification files.
Publications appear as simap publishes them: daily, not real-time. Coverage is whatever a body chooses to publish; below-threshold invitation and direct awards are largely unpublished. award.*, winnerName and winnerPrice are filled only on award publications, and buyers sometimes omit an optional field. This Actor is independent and not affiliated with the simap.ch association.
Frequently asked questions
Is it legal to reuse simap.ch data?
Yes. simap's own terms of use foresee electronic reuse, and every exported record carries the mandatory disclaimer field in the language of the publication. The Swiss Public Tenders Scraper never removes it.
How fresh is the data?
It is a publication feed: a tender appears the day simap publishes it. Note that simap's data may only be passed on to third parties from 08:00 on the publication day, so a scheduled run before then is for your own use.
How much does 1,000 tenders cost?
See the pricing box on this page. There is no browser and no proxy involved, only API calls, so Apify platform usage on top is negligible.
Why not just use simap's own e-mail alerts?
simap's Suchabo sends a raw notification per publication. This Actor returns 38 structured fields per tender — CPV codes, award criteria with weights, buyer contacts, winner and awarded price — as CSV, JSON or Excel you can filter, join and archive.
Related Actors
Same engine, same official-source approach:
- AusTender (Australia) — federal contracts, winners and expiry dates
- UK Public Tenders — Contracts Finder and Find a Tender in one run
- Swiss Commercial Register (SHAB) — new companies, changes, deletions and bankruptcies
- EU Tenders (TED) — European procurement notices and contract awards
- France Company Register — SIREN/SIRET, executives, official labels
- GLEIF LEI — LEI lookup, lapsed-LEI screening, parent companies
- Brazil CNPJ — Receita Federal company data and partners