# 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: ```yaml 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.