Phase: 2
Scope: Technical + policy constraints only — not authorization to ship scraping
Date: 2026-10-12
Spike posture for this repo: no live scrape client. Fixtures simulate permitted JSON payloads.
Mapped to JobListing:
| Domain field | Required | Notes |
|---|---|---|
indeedJobKey |
Yes | Dedupe + save identity |
title |
Yes | |
company |
Yes | |
location |
Yes | Free-text OK |
remoteType |
Preferred | Map remote/hybrid/onsite/unknown |
salary |
Optional | min/max/currency/period |
postedAt |
Preferred | Relative date UI |
snippet |
Preferred | Detail / row preview |
indeedURL |
Yes | Must be Indeed TLD |
availability |
Preferred | open / unknown / unavailable |
| employment / experience | Optional | Filter support |
Indeed hosts vary by country (examples): indeed.com, indeed.co.uk, pk.indeed.com, ca.indeed.com, etc.
Canonicalization rules (implemented in IndeedURLCanonicalizer):
indeed. / *.indeed. patternsjk= or known path segments when presentCountry setting (Settings → Search defaults / criteria.country) should map to the vendor’s locale parameter and preferred TLD when the provider supports it.
| Concern | Default (until vendor docs override) |
|---|---|
| Page size | 25 |
| Max pages per user search (UI) | 4 (100 results) before “load more” |
| Cache TTL (listing metadata) | 15 minutes in-memory (Phase 4+) |
| Saved-job revalidation TTL | 24 hours (Phase 5) |
| Rate limit handling | Surface IndeedDataError.rateLimited(retryAfter:) — backoff UI |
| Empty page | Treat as end of results |
| Error | User-facing intent |
|---|---|
unauthorized |
Source credentials missing/invalid |
forbidden |
License / geo not allowed |
rateLimited |
Retry later |
invalidResponse |
Decode / schema failure |
unsupportedFilter |
Best-effort note (hide or label in UI later) |
network |
Offline / transport |
cancelled |
Task cancelled |
nonIndeedURL |
Mapper rejected non-Indeed link |
indeedJobKey extractionPriority:
jobKey / jk field from provider DTOjk on Indeed URL/viewjob?jk=Measure against sandbox credentials (still no scrape):
Record results in this doc when a vendor sandbox is available.