DADR.md 4.4 KB

Data Access Decision Record (DADR)

Product: Indeed AI Jobs (macOS)
Phase: 2 — Indeed retrieval feasibility
Status: Approved — Option C
Date: 2026-10-12
Approved: 2026-10-12 (product owner)


1. Decision summary

Field Value
Chosen production source Licensed Indeed-index provider (or Indeed partner search channel) that returns Indeed-only listings with permitted desktop redistribution and link-back
Interim implementation FixtureIndeedJobDataSource + mapper (no production network traffic) until vendor contract is live
Rejected for production Client-side scraping / unauthorized automated HTML collection
Rejected as seeker search API Indeed Job Sync API (employer/partner posting sync — not job-seeker search)
Go / no-go gate Go on Option C. Live Indeed fetch still waits on a permitted vendor contract; OpenAI (Phase 3) proceeds against mocks/fixtures.

2. Context

The app must:

  • Show job listings in-app
  • Use Indeed-only results (every open action → Indeed TLD URL via NSWorkspace)
  • Remain App Store–viable under sandbox + privacy narrative
  • Keep ViewModels stable via IndeedJobDataSource while the concrete source is swapped

There is no public Indeed job-seeker search API suitable for arbitrary third-party desktop search.


3. Options considered

Option Permitted / ToS Fit for in-app search Decision
A. Official Job Sync API Partner/employer posting API Poor — not a seeker search API Out
B. Client scraping / bots Unauthorized automated collection typically prohibited Technically possible; brittle (CAPTCHA, HTML churn, IP blocks); high legal/ops risk Out for production
C. Licensed Indeed-index / partner feed Permitted if contract allows desktop redistribution + Indeed-only index Best fit if vendor confirms fields, geo TLDs, pagination, link-back Recommended
D. Hybrid “open Indeed in browser” only Low risk Does not meet “show listings in app” Out as sole strategy

4. Recommended decision

Proceed with Option C as the production path:

  1. Identify and contract a licensed provider (or Indeed partnership) whose index is Indeed-only (or can be filtered to Indeed-only with contractual guarantee).
  2. Implement IndeedJobDataSource against that API once credentials and redistribution rights are confirmed.
  3. Until then, ship fixture / sandbox responses only (FixtureIndeedJobDataSource). Keep UI on mocks where appropriate.

Explicit no-go without approval: any production adapter that scrapes Indeed HTML or mixes non-Indeed boards.


5. Contract requirements (must verify with vendor)

Before wiring live traffic:

  • License allows macOS desktop redistribution of listing metadata
  • Results are Indeed-only (or hard filter with audit)
  • Every result includes a canonical Indeed job URL (regional TLD OK)
  • Stable job key suitable for dedupe (indeedJobKey)
  • Pagination and rate limits documented
  • Field coverage: title, company, location, remote signals, salary (when present), posted date, snippet
  • Expired / closed signals (if any) documented for validation (Phase 4+)

6. Technical contract (in-repo)

Defined under Services/Indeed/:

  • IndeedJobDataSource — paginated search + error taxonomy
  • IndeedListingMapper — DTO → JobListing
  • IndeedURLCanonicalizer — regional hosts, jk= / path key extraction
  • FixtureIndeedJobDataSource — sandbox JSON fixtures (no network)

See also Indeed_Access_Spike.md.


7. App Store / privacy narrative (draft)

Job listings shown in the app come from a permitted Indeed data channel. Opening a listing launches the corresponding page on Indeed. The app does not scrape Indeed’s website. Search queries may later be interpreted by OpenAI (Phase 3); listing content remains Indeed-sourced.

Update Privacy Policy before live fetch ships.


8. Approval

Role Name Decision Date
Product owner Product owner Approved Option C (licensed/partner Indeed-only path) 2026-10-12

Live Indeed traffic still requires a signed vendor/partner contract (section 5). OpenAI Phase 3 may proceed against mocks/fixtures.