Indeed
Indeed email apply parsing, Apply API status, and compliance considerations for job board sourcing.
Indeed is a primary sourcing channel for InsightHire customers. Today the production path is email apply parsing — each position receives a unique inbound address and Indeed application notification emails are parsed into candidates automatically. A full Indeed Apply API integration exists in the codebase but is not the default customer-facing catalog entry.
Two integration paths
| Path | Status | How it works |
|---|---|---|
| Email apply (primary) | Production | Per-position address on in.insighthire.com; Mailgun inbound webhook parses Indeed emails |
| Apply API + OAuth | Available in API/UI; catalog disabled at platform level | OAuth employer access, job sync, application pull, results post-back |
Platform admin note: the indeed slug in platform_integration_settings is intentionally enabled: false because email apply covers most customers today. The Apply API UI remains at /dashboard/integrations/indeed for early adopters.
Email apply (recommended)
How addressing works
Each open position gets a unique token:
pos_{12-char-nanoid}@in.insighthire.com- Token stored as
positions.inboundEmailToken. - Domain configurable via
INBOUND_EMAIL_DOMAIN(defaultin.insighthire.com). - Visible on the position detail page for recruiters configuring Indeed job posts.
Because the To address encodes the position, InsightHire knows which role the candidate applied to — no fuzzy job-title matching.
Indeed job post setup
When posting on Indeed:
- Copy the position's Indeed apply email from InsightHire.
- In Indeed Employer, set Application delivery method to Email.
- Paste the InsightHire inbound address as the application email.
- Publish the job.
When a candidate applies, Indeed sends a notification email to that address.
Email parsing pipeline
Inbound mail hits the API inbound handler → inbound-email.service.ts:
- Source detection — sender/subject/body patterns (
indeed.com,@indeedemail.com, etc.). - Indeed parser —
indeed-parser.service.tsextracts:- Candidate name, email, phone
- Job title (for logging)
- Resume attachment (PDF)
- Indeed application URL and candidate ID when present
- Resume handling — PDF uploaded to S3; optional text extraction for contact info.
- Indeed resume fetcher — supplementary resume retrieval when email link available.
- Candidate creation — profile + application with source
INDEED; journey invite sent if configured.
Parse confidence is scored 0–100. Low-confidence parses are logged for ops review.
Supported email sources
The inbound parser also recognizes (with lower priority than dedicated integrations):
- LinkedIn notification forwards
- ZipRecruiter
- Glassdoor
- Manual recruiter forwards
Indeed-sourced applications are tagged with externalSource: INDEED.
Duplicate and edge handling
| Outcome | Behavior |
|---|---|
CANDIDATE_CREATED | New profile + application + optional journey session |
DUPLICATE | Same email + position within dedup window |
POSITION_INACTIVE | Email acknowledged; no candidate created |
IGNORED | Non-application mail or failed parse |
FAILED | Logged in inbound email logs for platform admin review |
Apply API path (advanced)
For employers with Indeed Developer / Employer API access:
Settings path
/dashboard/integrations/indeed
Configuration fields
| Field | Purpose |
|---|---|
| Client ID + Client Secret | OAuth employer credentials |
| Employer ID | Indeed employer account identifier |
| Webhook secret | Verify inbound Apply webhooks (optional) |
Stored in ats_integrations with platform INDEED. API key field encodes clientId:clientSecret.
OAuth scopes
employer_access manage_candidates read_applicationsAuthorization URL: https://secure.indeed.com/oauth/v2/authorize
Token exchange: https://apis.indeed.com/oauth/v2/tokens
API operations
| Procedure | Purpose |
|---|---|
ats.indeed.syncJobs | Pull Indeed postings → create/update positions |
ats.indeed.syncApplications | Pull applications → create candidates |
ats.indeed.getJobs | List Indeed jobs for mapping UI |
ats.indeed.syncStats | Sync health metrics |
ats.indeed.postResults | Push journey results back to Indeed |
ats.indeed.testConnection | Verify API credentials |
Requires Professional+ subscription (enforceATSAccess).
Apply API status
| Capability | Email apply | Apply API |
|---|---|---|
| Application import | ✅ Production | ✅ When credentialed |
| Job sync | ❌ Manual post | ✅ syncJobs |
| Results post-back | ❌ | ✅ postResults |
| Webhook push | ❌ (email pull) | ✅ With webhook secret |
| Platform catalog | N/A (always on via email) | Hidden (enabled: false) |
Contact InsightHire support or Indeed partner team to enable Apply API for your employer account.
Compliance
Candidate consent and data handling
- Indeed applications contain PII (name, email, phone, resume). InsightHire stores these under the org's tenant with standard retention and export controls.
- Resume files land in org-scoped S3 prefixes:
organizations/{orgId}/candidates/{candidateId}/resume/. - Journey invites sent after apply must comply with your organization's messaging and consent policies.
EEO and sourcing attribution
- Source is recorded as
INDEED(orINDEED_SPONSOREDwhen detected in API path) for analytics and compliance reporting. - Use Settings → Compliance (when DEI module enabled) for adverse impact and source reporting — Indeed applies flow into the same candidate pipeline as careers-page applies.
Email security
- Inbound domain (
in.insighthire.com) is operated by InsightHire; only position-scoped tokens route mail to the correct tenant. - Do not share one position email across multiple Indeed jobs — each role should have its own token for accurate attribution.
Indeed employer policies
- Follow Indeed Employer Guidelines for job content, apply methods, and candidate communication.
- Email apply must use the address Indeed sends applications to — do not intercept or modify candidate submissions outside Indeed's flow.
Troubleshooting
| Symptom | Check |
|---|---|
| No candidate after Indeed apply | Verify correct inbound email on Indeed post; confirm position is OPEN |
| Wrong position | Each job needs its own pos_*@in.insighthire.com address |
| Missing resume | Indeed email may lack attachment; check inbound email logs |
| Apply API sync fails | Verify OAuth credentials and employer ID; confirm Professional+ plan |
| Duplicate candidates | Expected if candidate reapplies; dedup uses email + position |
Related
- Integrations overview
- ATS imports — for Greenhouse/Workday alongside Indeed sourcing

