# Mercell Tender

> Haalt publieke tenderdata op van Mercell Source-to-Contract (S2C / Negometrix), zoals pagina's op s2c.mercell.com/today/{id}. Gebruik deze skill altijd wanneer de gebruiker vraagt om de planning, mijlpalen of het tijdschema van een Mercell-aanbesteding, om het aanbestedingsdossier of de aanbestedingsstukken (leidraad, bijlagen, Nota van Inlichtingen), of om documenten van een Mercell-tender te downloaden, ook als de gebruiker alleen een s2c.mercell.com-link plakt. Ook gebruiken wanneer web_fetch op zo'n pagina faalt met een robots- of botblokkade, want de data is publiek (geen login nodig) en wordt via een directe API opgehaald.

- Skill: `martinwolve/mercell-tender` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add martinwolve/mercell-tender`
- Raw SKILL.md: https://api.skillmd.com/api/skills/martinwolve/mercell-tender/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: martinwolve (https://skillmd.com/u/martinwolve)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/martinwolve/mercell-tender

---


# Mercell S2C dossier ophalen

## Wanneer en waarom

`web_fetch` op `s2c.mercell.com` faalt met `ROBOTS_DISALLOWED`, en de `/today/{id}`-pagina is een Angular single-page app: de HTML bevat geen data. De data is echter publiek (geen login) en komt via een RPC-achtige API. Deze skill praat rechtstreeks met die API met `bash`/`curl` of het meegeleverde script, zodat je niet opnieuw hoeft te reverse-engineeren.

Gebruik het script `scripts/mercell.py`. Het lost het tender-id op uit een `/today/`-URL of een kaal nummer, vertaalt labels naar het Nederlands, rekent tijden om naar Europe/Amsterdam en kan het hele dossier downloaden.

## Snelstart

```bash
# alleen de planning/mijlpalen (standaard)
python3 scripts/mercell.py 224100 --what planning

# hele dossier: gegevens + planning + documentenlijst, weggeschreven naar md
python3 scripts/mercell.py https://s2c.mercell.com/today/224100 --what dossier --md dossier.md

# alle aanbestedingsstukken downloaden naar een map
python3 scripts/mercell.py 224100 --download ./stukken
```

Alleen stdlib nodig (geen pip install). Draai vanuit de skillmap of geef het volledige scriptpad op.

## Werkwijze

1. Bepaal het tender-id. Een gebruiker plakt vaak `https://s2c.mercell.com/today/224100`; het id is het getal na `/today/`. Een kaal getal mag ook.
2. Kies wat er gevraagd wordt:
   - "planning / mijlpalen / tijdschema" -> `--what planning`
   - "aanbestedingsgegevens / opdrachtgever / procedure" -> `--what details`
   - "hele dossier / aanbestedingsstukken / leidraad + planning + documenten" -> `--what dossier`
   - "download de stukken / geef me de documenten" -> voeg `--download <map>` toe (werkt met elke `--what`)
3. Standaard schrijf je het resultaat inline; met `--md <bestand>` naar een markdown-bestand. Presenteer gedownloade documenten en het md-bestand met `present_files`.
4. Respecteer de bestandsnaamvoorkeur van de gebruiker voor md-bestanden die je zelf aanmaakt (compact-onderwerp gevolgd door `vYYYYMMDD`).

## Wat "het hele aanbestedingsdossier" bevat

Het snelst en compleetst is de **export-ZIP** (`T{nr}-Export-YYYYMMDD.zip`). Die bevat het volledige gepubliceerde dossier: Beschrijving, Planning, de volledige leidraad met alle bijlagen (UEA, kerncompetenties, selectie-/gunningscriteria, voorwaarden) en de gepubliceerde antwoorden. `--download` haalt deze ZIP(s) plus losse export-PDF's en de Nota van Inlichtingen op. Wil je de losse bestanden zien, pak dan de ZIP uit met `unzip`.

## Belangrijke details (voor handmatig werk of debuggen)

- API-basis: `https://api.s2c.mercell.com/api/v1`
- URL-patroon: `{basis}/{Controller}/{Methode}?{queryparams}`
- Stuur headers mee: `Origin: https://s2c.mercell.com`, `Referer: https://s2c.mercell.com/`, een browser-`User-Agent`, `Accept: application/json`. Zonder deze headers kan de API weigeren.
- Datums in de JSON zijn UTC (`...Z`); reken om naar Europe/Amsterdam.
- Labels zijn localisatiesleutels (`str_...`). Vertaal via het bestand op `TranslationUrl` uit `Util/RetrieveSystemSettings` (nl = `.../live-translations/nl-NL.json`). Let op: sleutels in dat bestand zijn **lowercase**, dus case-insensitief matchen. `UserDefinedName` gaat vóór op de vertaalde sleutel.

### Publieke endpoints (controller `PublishedTender`, param `tenderId`)

| Methode | Inhoud |
|---------|--------|
| `GetPublishedTenderDetails` | opdrachtgever, contactpersoon, procedure, kenmerk, onderdelen |
| `GetPublishedTenderPlanningData` | planning/mijlpalen per ronde en fase |
| `GetPublishedTenderExports` | export-ZIP('s) met het volledige dossier + losse export-PDF's |
| `GetPublishedClarificationAnswersData` | Nota van Inlichtingen (gepubliceerde antwoorden) |
| `GetPublicTenderAnnouncements` | mededelingen (kan `null` zijn) |
| `GetPublishedChildTendersPublications` | percelen (lots) |
| `GetPublishedTenderRoundAndRequirementsData` | eisen/vragenlijsten |

Documenten downloaden: `DefaultDocument/GetSignedUrlByDocumentId?documentId={id}` geeft `{ "Url": "<signed blob-url>" }`; haal daarna die URL op om het bestand te downloaden. Bestandsnaam staat in het `Name`-veld naast het `DocumentId`.

### Planning-JSON, structuur

Array met een record per (deel)tender. Relevante velden: `TenderName`, `TenderId`, `Rounds` (met `UserDefinedName` zoals "Selectiefase"/"Gunningsfase"), `Phases`, en `Dates` met per mijlpaal: `Type`, `Date` (UTC of `null`), `OrderNumber`, `TenderProcessRoundId`, `Name` (sleutel), `UserDefinedName`, `NoTimeSet`. Groepeer op `TenderProcessRoundId` en gebruik de rondenaam als kop wanneer er meer dan één ronde is.

Let op de context: in een selectiefase toont het platform de sluiting van ronde 1 met de generieke sleutel "Deadline voor het indienen van offertes", terwijl het feitelijk om de aanmelding gaat. Benoem dat als het relevant is.

## Nieuwe endpoints vinden

Werkt een gewenst gegeven nog niet? Herleid het endpoint uit de app-bundel: haal `https://s2c.mercell.com/runtime.<hash>.js` (chunk-map) en `main.<hash>.js` op, en zoek naar `get controller(){return"..."}` en `.get("Methode",{param:...})`. Het URL-patroon blijft `{basis}/{controller}/{methode}?{params}`.

## Wijzigingshistorie

- 1.0 (2026-09-09): eerste versie met tenderdata, planning en dossier via de publieke Mercell S2C-API, inclusief download van het exportdossier.

