simap.ch Scraper — Swiss Public Procurement Tenders avatar

simap.ch Scraper — Swiss Public Procurement Tenders

Pricing

from $1.20 / 1,000 result scrapeds

Go to Apify Store
simap.ch Scraper — Swiss Public Procurement Tenders

simap.ch Scraper — Swiss Public Procurement Tenders

Search and extract Swiss public procurement tenders from simap.ch, Switzerland's national tender platform. Filter by canton, CPV code, publication type or date range. Returns buyer, deadline, CPV codes, lots and (for awards) the winning vendor and price. No cookies, no login required.

Pricing

from $1.20 / 1,000 result scrapeds

Rating

0.0

(0)

Developer

Studio Amba

Studio Amba

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Swiss Public Procurement Scraper — simap.ch Tenders & Awards

Search and extract Swiss public procurement tenders from simap.ch, the official national platform where every Swiss federal, cantonal and communal authority publishes its tenders. Filter by keyword, canton, CPV code, publication type or date range. Returns the buyer, submission deadline, CPV classification, lots and — for contract awards — the winning vendor, awarded price and number of bids received. No cookies, no login required.

How to scrape simap.ch data

This actor queries the official simap.ch publication API directly. simap.ch is the single national platform Swiss public authorities are legally required to use for procurement above the WTO/cantonal thresholds — federal offices, cantonal administrations, municipalities, hospitals, public transport operators and universities all publish here. That makes this actor a complete feed of Swiss public-sector buying activity across construction, IT, supplies and services.

The actor fetches the public project-search endpoint for the list of matching tenders, then — when "Fetch full details" is enabled — makes one extra call per tender to pull the submission deadline, CPV classification codes, buyer contact details and, for award publications, the winning vendor and contract value. None of this requires an account: simap.ch's /api/publications/... endpoints are open, unauthenticated JSON, confirmed against the site's own robots.txt (only admin/account/vendor-profile paths are disallowed — the API is not).

Who benefits from this data?

  • Construction and engineering firms — Monitor new public works tenders by canton and CPV code, and see what competitors are winning and at what price.
  • IT and software vendors — Track federal and cantonal IT procurement (CPV 72xxxxxx / 48xxxxxx) before an RFP deadline closes.
  • Consultancies and advisory firms — Build market intelligence on which authorities are buying what, and how often direct awards bypass open competition.
  • B2B sales and business development teams — Turn every open tender in your sector into a prospect list with a buyer name, email and phone number.
  • Market researchers and journalists — Analyze award prices, submission counts and canton-level procurement volumes.

Search by keyword

Enter any keyword to search tender titles, descriptions and buyer names server-side via the simap.ch API itself (unlike some tender platforms, this is a real search, not a client-side filter). Use German, French or Italian for the best results — simap.ch publications are written in the buyer's own language, and English titles only exist where a buyer chose to add one. Examples: "Bau" (construction), "informatique" (IT), "nettoyage" (cleaning), "Tiefbau" (civil engineering).

Filter by publication type, canton and CPV code

  • Publication type: open tenders (calls for bids), contract awards, direct awards, design competitions, abandoned procedures, or all
  • Canton: narrow to any of the 26 Swiss cantons by the buyer's or place-of-performance's address
  • CPV code: filter by the EU/Swiss Common Procurement Vocabulary code, e.g. 45000000 for construction or 72000000 for IT services

Date range filtering

Set publication date filters to monitor new tenders on a schedule, or search historically for market research. publishedAfter and publishedBefore accept YYYY-MM-DD and map to the API's own newestPublicationFrom / newestPublicationUntil parameters.

Input parameters

ParameterTypeDefaultDescription
searchQueryStringKeywords to search in tender titles, descriptions and buyer names (server-side search)
pubTypeEnumtenderFilter: tender, award, direct_award, competition, abandonment, or all
cantonEnum— (all)2-letter Swiss canton code, e.g. ZH, GE, VD
cpvCodeStringCPV classification code to filter by
publishedAfterStringOnly publications on or after this date (YYYY-MM-DD)
publishedBeforeStringOnly publications on or before this date (YYYY-MM-DD)
languageEnumenSearch/output language: de, fr, it, or en
fetchDetailsBooleantrueFetch deadline, CPV codes, lots and award vendor per tender (one extra API call each)
maxResultsInteger100Maximum number of tenders to return (1–10,000)
proxyConfigurationObjectAutomaticApify proxy settings — simap.ch has no anti-bot, so the default is enough

Leaving every field empty ({}) still returns data: the actor defaults to pubType: "tender", i.e. all currently open Swiss tenders.

What data does this scraper extract?

FieldTypeDescription
projectIdStringsimap.ch project ID (stable across all publications of the same tender)
publicationIdStringID of this specific publication
projectNumberStringPublic simap.ch project number
publicationNumberStringPublic publication number, e.g. 43403-01
tenderTitleStringTender title in the requested/best-available language
titleTranslationsObjectTitle in each published language (de/fr/it/en), null where untranslated
projectTypeStringAlways tender for procurement projects
projectSubTypeStringconstruction, supply, or service
processTypeStringProcedure type: open, selective, invitation, etc.
pubTypeStringtender, award, abandonment, direct_award, or competition
correctedBooleanTrue when a later correction publication exists for this project
publicationDateStringDate this publication went live (YYYY-MM-DD)
deadlineStringBid submission deadline, ISO timestamp (open tenders only)
procOfficeNameStringContracting authority / buyer name
procOfficeEmailStringBuyer contact email
procOfficePhoneStringBuyer contact phone
procOfficeUrlStringBuyer website
cantonString2-letter Swiss canton code
cityStringCity of the buyer / place of performance
postalCodeStringPostal code
countryStringISO country code, almost always CH
cpvCodeStringPrimary CPV classification code
cpvLabelStringHuman-readable CPV category
additionalCpvCodesArraySecondary CPV codes with labels
lotsArrayPer-lot breakdown: lot number, title, canton, city
descriptionStringFull tender description, HTML stripped
awardedVendorNameStringWinning vendor name (award publications only)
awardedPriceNumberContract value awarded (award publications only)
awardedCurrencyStringCurrency of awardedPrice, almost always CHF
numberOfSubmissionsNumberNumber of bids received (award publications only)
urlStringDirect link to the project on simap.ch
scrapedAtStringISO timestamp of when the data was scraped

Example output

{
"projectId": "0afabb3b-cba8-41f6-b77e-9665d941174d",
"publicationId": "8ccfc1c3-a7a5-4d44-aa72-0444e352c92a",
"projectNumber": "43403",
"publicationNumber": "43403-01",
"tenderTitle": "BKP 358 Kücheneinrichtungen",
"pubType": "tender",
"publicationDate": "2026-09-03",
"deadline": "2026-10-13T13:58:00+02:00",
"procOfficeName": "Politische Gemeinde Balgach",
"procOfficeEmail": "neubau-verahus@balgach.ch",
"canton": "SG",
"city": "Balgach",
"cpvCode": "45215212",
"cpvLabel": "Retirement home construction work",
"lots": [
{ "lotNumber": 1, "title": "BKP 358 Kücheneinrichtungen", "canton": "SG", "city": "Balgach" }
],
"url": "https://www.simap.ch/en/project-detail/0afabb3b-cba8-41f6-b77e-9665d941174d",
"scrapedAt": "2026-09-04T19:46:14.193Z"
}

Tips for best results

  • Daily monitoring: Run on a schedule with publishedAfter set to today for fresh open tenders only — set an alert before a bid deadline passes.
  • CPV code targeting: Note the CPV codes relevant to your business from an initial run, then filter by them directly. 45000000 = construction, 72000000 = IT services, 71000000 = architectural/engineering services.
  • Award intelligence: Set pubType: "award" to see who won recent contracts and at what price — useful for competitor and pricing intelligence. This filter runs client-side (see Limitations), so pair it with a canton or CPV code for a fast scrape.
  • Canton-by-canton sweep: Run once per canton to build a complete national dataset without hitting maxResults on a single broad query.
  • Multilingual titles: titleTranslations carries every language the buyer published in — useful if you need the original German/French/Italian text alongside the display title.

How much does it cost to run?

The simap.ch API is free and public. Your only cost is Apify compute time — there is no proxy or anti-bot cost since simap.ch requires no residential proxy.

Search sizeEstimated timeEstimated cost per result
20 tenders~15 seconds~$0.002/result
100 tenders~1 minute~$0.002/result
500 tenders~4 minutes~$0.002/result
1,000 tenders~8 minutes~$0.002/result

Each tender requires one extra API call when "Fetch full details" is enabled (default), for the deadline, CPV codes and award data that the list endpoint doesn't expose. Disable it for a faster list-only scrape if you only need title, buyer and canton.

Usage cost only settles once a run reports SUCCEEDED — reading the dataset mid-run (before the run finishes) will undercount the final cost, since Apify's per-event billing is reconciled at run completion.

Use as an API

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("studio-amba/simap-scraper").call(run_input={
"searchQuery": "Bau",
"pubType": "tender",
"canton": "ZH",
"maxResults": 50,
})
for tender in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{tender['tenderTitle']} | {tender['procOfficeName']} | Deadline: {tender['deadline']}")

Limitations

  • award and correction publication types aren't filterable server-side: the simap.ch API rejects newestPubTypes=award with HTTP 400. The actor works around this for pubType: "award" by fetching unfiltered pages and filtering client-side, which scans more pages for a given result count — narrow with canton, cpvCode or a date range to keep it fast. correction publications are rare enough on simap.ch that they aren't offered as a dedicated filter; they still surface in pubType output when present.
  • Deadline is empty on non-tender publications: awards, abandonments and corrections don't carry a submission deadline.
  • Titles are often single-language: a buyer publishing only in German will have null for fr/it/en in titleTranslations — this is how simap.ch itself publishes the data, not a scraping gap.
  • Detail fetching adds time: each tender gets an individual API call for CPV codes, deadline and award data when fetchDetails is enabled. Set maxResults accordingly for large sweeps.

Other European procurement scrapers

Your feedback

Found a bug or want a feature? Open an issue on the Issues tab.