Sources
How SignalDock fetches publications, pages them, and dedupes before the pipeline.
A signal source belongs to an organization: a provider key, display name, JSON
config (validated by that provider’s schema), enabled flag, schedule, and a
country (NL, BE, DE, …) and language (nl, de, fr, en).
Country and language are passed to classification, and the country selects the
company registry used for entity resolution.
| Provider key | Source | Country | Key needed |
|---|---|---|---|
overheid | KOOP SRU, officiële publicaties | NL | No |
tenderned | TenderNed public tenders | NL | No |
ted | TED, EU Official Journal tenders | Any EU | No |
dso | Omgevingsloket spatial plans | NL | Yes |
What a provider does
Every source implements SignalSourceProvider:
fetchNew({ config, cursor, limit })— page of raw publications + next cursornormalize(raw)— candidate signal fieldsexternalId(raw)— stable id for dedupe
Cursors are stored per source. Ingest is started from the API (Vercel Cron every 30 minutes, or Run now in the app).
After fetch
- Insert or skip
raw_publications - Insert
signalswith statusingested - Start
processSignalWorkflowfor new (or changed) signals
Rows are unique on (source_id, external_id), and a content hash skips
unchanged payloads, so a provider may safely return a publication twice.
Failed ingest runs are visible on the source (last run, errors). Disable a source to stop cron from fetching it without deleting history.
Last updated on