API10 min read

Adding Contact Lookup to an ATS: Architecture Notes for Builders

Architecture notes for builders: add contact lookup to an ATS as an optional module – profile URL in, contacts out when found, empty UI that stays honest.

Builders adding contact enrichment to an ATS should treat lookup as an optional module, not a CRM bolt-on. Invenitor is a contact lookup API: LinkedIn or GitHub profile URL in, email/phone/links out when found, empty means not found. Credits are prepaid (INR packs ~₹2, Razorpay/UPI). Connecting people – a lookup API, not a sales cloud.

This post is architecture notes for product and platform teams. Category lock: What a Contact Lookup API Actually Does. Request shape hub: LinkedIn or GitHub Profile URL → Contact Lookup API.

What belongs inside the ATS vs outside it?

Inside the ATS: candidate identity, stages, notes, permissions, audit, and UI for “contact fields.” Outside (or via API): resolving those contact fields from a profile URL when the desk asks.

Do not merge sequencer logic, mailbox verification theater, or invent-on-empty into the lookup client. Honesty: Empty Means Not Found – Why Guessed Emails Break Hiring.

  1. Trigger: recruiter clicks “Look up contacts” on a candidate that already has a LinkedIn/GitHub URL.
  2. Call: POST /api/v1/find with Bearer auth (see /docs).
  3. Persist: store returned email/phone/links with provenance (“Invenitor find”, timestamp).
  4. Empty path: set status not_found; do not invent; disable auto-email.
  5. Error path: surface retryable error; do not write fake contacts; timeouts do not spend credits under Credit B.

Agents: same contract via MCP – MCP for Recruiting Agents and /mcp.md. Definition for PMs: What Is an MCP Server? (For Hiring Product Teams).

Sync patterns that stay sane

PatternWhen to useRisk if abused
On-demand buttonMost ATS desksNone if empty UI is honest
Batch job on new candidatesHigh-volume agency importOver-lookup without shortlist quality
Agent-assisted fillMCP/REST from internal agentsHallucinated fill if empty ignored
Nightly re-enrichRarelyWaste; coverage does not flip on a clock

Soft mesh: coverage varies. We do not publish hit-rate percentages. Design SLAs around honesty and latency, not invented accuracy.

Credits, tenancy, and product packaging

Map Invenitor credits to a workspace or tenant pool – not one forced seat per recruiter for lookup alone. 1 credit only when we return an email, a phone, or both. Empty completed finds are free. Timeouts and errors do not spend. Product packaging tip: sell “lookup module” as usage-based, and keep ATS seats for workflow. Cost model: Seat Subscriptions vs Pay-Per-Lookup Credits – A Cost Model. India packs: INR Credit Packs for Contact Lookup. Live tiles: /pricing.

UI contract for empty and primary contacts

Show one primary email and one primary phone when returned. Never invent a second “likely” mailbox. If empty, show not found. Deeper product language: One Primary Contact, Never Invented. Recruiter plain English for support docs: Contact Enrichment Explained for Recruiters.

Security and ops checklist (high level)

  • Store API keys in secrets, not in frontend bundles.
  • Log find requests with candidate id + outcome class (found / empty / error) without shipping PII to analytics dumpsters.
  • Rate-limit UI clicks; soft ~1 find/min language in docs is guidance, not a fake SLA – see /docs.
  • Respect your ATS permission model: only roles that may see contacts can trigger lookup.

What not to build

  • A LinkedIn scraper “fallback.”
  • Auto-guessed emails from name + domain.
  • Hit-rate dashboards that invent percentages for marketing.
  • Bundling cold-email sequencing as if it were enrichment.

India desk reality check for your customers: India Boutique IT Staffing and Agency Desk Playbook: Bulk Candidate Sheets + API Lookups in India.

What should you do next?

Prototype the on-demand button against /docs, wire empty UI first, buy a small pack on /pricing, and only then discuss batch jobs. If agents are in scope, read /mcp.md. Keep the module optional. Keep empty empty.

How should ATS analytics treat lookup outcomes?

Count found, empty, and error as three different outcomes. Do not fold empty into “failed enrichment” if the API completed honestly. Do not publish customer-facing hit-rate % from soft mesh data. Finance can attribute credit spend to found outcomes only under Credit B. That keeps product analytics aligned with billing and with hiring trust.

Cross-rail note for India and global ATS buyers

India buyers often need Razorpay/UPI; global builders often need PAYG without annual seats. Same API. See Pay-As-You-Go Contact APIs and UPI to API Key. Link /docs and /pricing from your design doc.

Data model and rollout

Store profile URLs, email, phone, outcome (found | empty | error), and lookup timestamp. Never invent on merge. Primary fields: One Primary Contact, Never Invented. Make double-clicks idempotent in UX. Credit B: 1 credit only when we return an email, a phone, or both. Empty completed finds are free. Timeouts and errors do not spend. Rollout: empty UI → admin button → all recruiters → capped batch → MCP (What Is an MCP Server?, /mcp.md). Sheets path: Agency Desk Playbook. /pricing · LinkedIn or GitHub Profile URL → Contact Lookup API · Empty Means Not Found.

Questions

Should contact lookup live inside the ATS core or as a module?

Prefer an optional module triggered when a candidate already has a profile URL – not a mandatory CRM-style enrichment suite.

How should empty responses render in the ATS?

Show not found, disable auto-email, and never invent a mailbox. Soft mesh coverage varies.

When do credits spend for ATS lookups?

1 credit only when we return an email, a phone, or both. Empty completed finds are free. Timeouts and errors do not spend.

Can agents call the same lookup the ATS uses?

Yes via MCP or REST. Same honesty rules. See /mcp.md and /docs.

Should we nightly re-enrich every candidate?

Usually no. Prefer on-demand or import-time batch with shortlist quality gates.

Where is the API reference?

/docs for POST /api/v1/find. Pricing packs on /pricing.

Is Invenitor a sequencer?

No. It is a contact lookup API for hiring – not a sales cloud.

ShareShare on X

Look up a contact

Sign in, buy a pack, copy the key once. REST on docs. Agents read mcp.md.

Adding Contact Lookup to an ATS – Architecture Notes for Builders – Invenitor