# 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](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.