Files
VacatureRadar/docs/operations/SOURCE_ONBOARDING.md
T
Jens b8091e59bd
deploy / deploy (push) Canceled after 0s
Initial deploy setup
2026-07-21 14:00:00 +02:00

6.2 KiB

Bron onboarden

Een nieuwe bron wordt nooit direct als onbeperkt actief beschouwd. Gebruik het traject candidate → trial → active en ga bij veiligheids- of kwaliteitsproblemen naar quarantined.

Toegestane broncategorieën

Voorkeursvolgorde:

  1. openbare carrièrepagina van de feitelijke werkgever;
  2. openbare, door de werkgever bedoelde ATS-vacaturepagina;
  3. expliciete RSS/Atom-feed of sitemap met vacatures;
  4. vacaturemail die de gebruiker zelf heeft geactiveerd;
  5. handmatige browserimport door de gebruiker.

Niet onboarden zonder expliciete, aantoonbare toestemming:

  • ingelogde zoekresultaten of profielpagina's;
  • pagina's achter CAPTCHA, anti-bot challenge of toegangscontrole;
  • denylistplatformen via directe crawling;
  • verborgen/private endpoints die alleen door reverse engineering zijn gevonden;
  • bronnen waarvan robots/voorwaarden of technische signalen automatisering verbieden.

Reviewchecklist

Leg per bron vast:

  • naam, bronsoort, hoofddomein en exacte start-URL;
  • eigenaar/eindwerkgever en eventuele ATS-provider;
  • publieke toegankelijkheid zonder login;
  • datum en samenvatting van robots- en voorwaardenreview;
  • toegestane paden en eventuele uitgesloten paden;
  • parserstrategie: JSON-LD, RSS, gespecialiseerd ATS of generieke HTML;
  • verwachte frequentie en minimale interval;
  • maximaal documentvolume en paginatie;
  • welke velden daadwerkelijk aanwezig zijn;
  • retentiebehoefte en mogelijke persoonsgegevens;
  • contact-/user-agentinformatie indien passend;
  • rollback/quarantainecriterium.

robots.txt alleen is geen volledige juridische toestemming, en afwezigheid ervan is geen automatische toestemming. Het technische bronbeleid ondersteunt een conservatieve beslissing; de beheerder blijft verantwoordelijk voor de bronreview.

Candidate aanmaken

Gebruik Django admin of seed_sources met een gecontroleerd YAML-record. Begin met:

name: Voorbeeld Werkgever
source_type: employer
base_url: https://careers.example.org/jobs
status: candidate
policy: review
parser_key: auto
strict_mode: true
honor_robots: true
crawl_interval_minutes: 720
minimum_interval_seconds: 30
max_concurrency: 1

Zet policy: allow pas na review. Een onbekende bron blijft in strict mode zonder fetch.

Fixture vóór live request

Bewaar een gesaneerd voorbeeld onder fixtures/pages, fixtures/feeds of fixtures/emails. Verwijder trackingtokens, persoonsgegevens en niet-noodzakelijke volledige teksten. Schrijf tests voor:

  • normale vacature;
  • ontbrekende optionele velden;
  • nul vacatures;
  • gewijzigde markup of meerdere jobs;
  • kwaadaardige HTML en onveilige links;
  • idempotente replay;
  • parserconfidence en waarschuwingen.

Trialrun

  1. Zet bron op trial en policy=allow.
  2. Voer één handmatige run uit via de retryknop of Celerytask.
  3. Controleer status, final URL, bytes, parser, warnings en tellers.
  4. Open alleen gesaniteerde jobweergave; vergelijk steekproefsgewijs met de publieke bron.
  5. Controleer canonieke URL, werkgever, locatie, datum, verloopdatum, taal en duplicaten.
  6. Verifieer dat redirectdoelen, rate limit en conditional requests correct zijn.
  7. Laat minimaal twee geplande cycli goed verlopen vóór promotie naar active.

Automatische quarantainecriteria

Een bron moet worden gepauzeerd of in quarantaine gezet bij:

  • redirect naar denylist, login, private adresruimte of onverwacht domein;
  • herhaalde 401/403/429, CAPTCHA of anti-botpagina;
  • contenttype/grootte buiten beleid;
  • parseroutput met plotseling nul jobs terwijl de bron zichtbaar jobs bevat;
  • abnormale volumestijging of duplicaatstorm;
  • HTML-sanitization/securityfout;
  • voorwaardenwijziging of verlopen bronreview;
  • opeenvolgende fouten boven de vastgelegde drempel.

Gespecialiseerde ATS-adapter

Voeg alleen een adapter toe wanneer meerdere bronnen hetzelfde stabiele publieke formaat gebruiken of de generieke adapter onvoldoende bewijs levert. De adapter:

  • krijgt geen credentials;
  • gebruikt uitsluitend gedocumenteerde publieke jobdata of publieke pagina's;
  • implementeert het interne adaptercontract;
  • heeft providerfixtures en contracttests;
  • valt veilig terug zonder globale pipeline te breken;
  • documenteert paginatie, sluitingssignalen en rate limits.

Bron verwijderen

Pauzeer eerst. Behoud canonieke vacatures en herkomst zolang productretentie dat vereist; verwijder niet blind clusters die ook andere aliassen hebben. Verwijder raw documents volgens retentie, trek de policy in en noteer de reden en datum.

Reviewbeleid bij bronbeoordeling

  • Een bron mag alleen automatisch gefetcht worden wanneer een actuele SourcePolicyReview bestaat met geldige reden, scope en vervaldatum.
  • Terms review blijft menselijk, niet automatisch door AI of heuristiek.
  • Bij ontbrekende of verlopen review of bij expliciet pause/deny besluit blokkeert de taakuitvoering.

Handmatige import in de interface

Voor uitzonderlijke vacatures kan de beheerder handmatig importeren via de bronpagina:

  • navigeer naar Brongezondheid en gebruik het "Handmatige import" formulier;
  • gebruik de bookmarklet om de huidige pagina-URL te vullen in source_url;
  • of plak direct relevante vacaturetekst in het tekstveld wanneer fetch niet is toegestaan.

De bookmarklet stuurt alleen source_url naar de import-URL, zonder secret of broninhoud.

Na import toont de bronlijst:

  • de gekozen modus (url of paste);
  • bron-ID/bron-URL;
  • aantallen herkend, nieuw en duplicaat;
  • waarschuwingen;
  • links naar vacaturedetail voor direct vervolg.

Providerdetails (VR-106)

Voor het onboarden van publieke ATS-bronnen moet het bronrecord minimaal een van de volgende providerspecificaties gebruiken:

  • Greenhouse (*.greenhouse.io / *.boards.greenhouse.io) — max 15 requests/min, alleen publiek toegankelijke jobdata.
  • Lever (jobs.lever.co) — max 60 requests/min, alleen jobs.lever.co en officiële publieke endpoints.
  • Recruitee (*.recruitee.com) — max 60 requests/min, geen login/partner endpoint.
  • SmartRecruiters (*.smartrecruiters.com) — max 30 requests/min, alleen publieke vacaturepagina/feeds.
  • Workable (apply.workable.com) — max 30 requests/min, alleen publieke vacaturepagina/feeds.

Bij twijfel altijd op review blijven en eerst via een trialrun met gesloten evaluatiecriteria (gesloten job, lege joblijst, markeringswijziging) valideren.