Contents
v1Partner API
Talent Update API Integration
Keep candidate records current
Resolve identity and return structured employment, education, and online-presence data from public web sources. No CV upload on this endpoint.
Request API AccessBest fit for
Applicant Tracking Systems refreshing stale candidate records
Recruitment CRMs enriching profiles before outreach
Staffing agencies keeping submission data aligned with reality
HR tech vendors adding identity resolution to their stack
Teams that already hold a name, employer, or work email and need structured updates
Integration flow
Get approved and receive an API key
Request access from TieTalent. Once approved, you receive an X-API-Key for your integration.
Submit a talent update
POST to /api/v1/talent-updates with a candidate object containing identity anchors. See Request fields.
Receive 202 Accepted
The response includes an id, candidate_id, and cached. When a recent completed run exists (seven-day window), you may get status: completed and cached: true immediately; otherwise status: pending. Store the id for polling.
Poll or wait for a webhook
GET /api/v1/talent-updates/{id} until status is completed or failed. Webhooks (talent_update_ready / talent_update_failed) are preferred when configured.
Write results into your ATS
Map identity, work_experience, education, and online_presence into your candidate record. Treat low or missing identity confidence as unverified.
vs Candidate Intelligence
Talent Update shares authentication, webhooks, and precompute caps with Candidate Intelligence, but targets a different outcome: structured profile enrichment instead of an LLM hiring report.
- No
clientobject: onlycandidate(orcandidatesfor batch precompute). - No
language,cv,report_type, oreu_compliantfields. - No cancel endpoint. Runs are short-lived profile lookups, not long SSE analyses.
- Response is structured fields (
identity,work_experience, etc.), not areportobject or PDF. - Same
X-API-Keyheader andX-CI-Signaturewebhook signing as Candidate Intelligence.
Authentication
X-API-Key header on every request, identical to Candidate Intelligence.Request headers
X-API-Key: ats_your_api_key_here Content-Type: application/json
Create talent update
Creates an asynchronous talent-update run. The request body accepts identity anchors only: no CV, free-text document, or file upload.
Optional fields such as profile_urls and experience improve resolution accuracy. Send profile URLs whenever you have them.
{
"candidate": {
"id": "cand-9911",
"first_name": "Alex",
"last_name": "Rivera",
"work_email": "alex.rivera@example-corp.com",
"employer_website": "example-corp.com",
"company": "Example Corp",
"role": "Software Engineer",
"location": "London, UK",
"profile_urls": [
"https://linkedin.com/in/alex-rivera-example"
],
"experience": [
{
"company": "Previous Corp",
"role": "Engineer",
"start_date": "2014-01",
"end_date": "2016-01"
}
]
}
}Request fields
candidate (required object)
candidate.id is always required. At least one identity combination below must also be satisfied.
Required combination (at least one)
Fields
Accuracy
A
work_email
Best single anchor. A corporate domain identifies person and employer at once.
B
first_name + last_name + (employer_website or company)
Good when you hold a name and employer but no work email.
C
employer_website + role
Useful when you know where someone works and their title, but not their name.
idYour identifier for the candidate. Echoed back as candidate_id; never interpreted by TieTalent.first_name, last_namePerson name. Same meaning as on /api/v1/analyses.work_emailCorporate work email. See Field rules.employer_websiteDomain or full URL. Preferred over company when you have it.companyEmployer name. Used when employer_website is absent.roleCurrent or expected role. Free text.locationCity and country.profile_urlsAbsolute URLs (LinkedIn, GitHub, etc.). Up to 10. Strongest optional field for common names.experiencePrior employment you already hold. Up to 40 entries. Dates as YYYY-MM or YYYY-MM-DD.Optional top-level fields
force_refreshBoolean (default false). When true, skip cache reuse and run fresh enrichment on live and precompute requests.mode"precompute" for background batch warming. See Precompute updates.Not accepted
No CV, no free-text document, no file upload on this endpoint.
Field rules
Validation failures return 422 with RFC 9457 application/problem+json. Branch on status and detail; do not parse free-form error text in production.
work_emailCorporate domains only. Personal mailboxes (Gmail, Outlook, etc.) and role mailboxes such as info@ or hr@ are rejected.employer_websiteDomain or full URL. Normalised to a hostname server-side.profile_urlsMust be absolute URLs. Up to 10 per candidate.experienceEach entry requires company. Dates as YYYY-MM or YYYY-MM-DD.Precompute updates
Use the same POST /api/v1/talent-updates endpoint with mode: "precompute". Poll and retrieve with the same GET /api/v1/talent-updates/{id} as live runs.
force_refresh: true.Single-candidate precompute
Send mode: "precompute" with a single candidate object.
{
"mode": "precompute",
"force_refresh": false,
"candidate": {
"id": "cand-9911",
"first_name": "Alex",
"last_name": "Rivera",
"work_email": "alex.rivera@example-corp.com",
"employer_website": "example-corp.com"
}
}Batch precompute
Send mode: "precompute" with candidates (array) instead of candidate. Provide exactly one of candidate or candidates. Maximum 50 candidates per request.
{
"mode": "precompute",
"candidates": [
{
"id": "cand-9911",
"first_name": "Alex",
"last_name": "Rivera",
"work_email": "alex.rivera@example-corp.com"
},
{
"id": "cand-9912",
"first_name": "Jordan",
"last_name": "Lee",
"employer_website": "acme.example",
"role": "Product Manager"
}
]
}Cache behaviour
- Completed runs for the same partner and candidate fingerprint may be reused within a seven-day window.
- Reused runs return
status: completedandcached: trueimmediately on both live and precompute creates. force_refresh: trueskips completed-cache reuse (live and precompute). An in-flight run for the same fingerprint is still returned instead of starting a duplicate.
Precompute is capped per partner (1,000 net-new runs per UTC day and 10 concurrent in-flight). Exceeding a cap returns 429 Too Many Requests with error precompute-cap-exceeded and Retry-After. Cache hits do not count toward the daily cap. Live runs are exempt from precompute caps.
Create response
A successful create returns <code>202 Accepted</code>. The response includes a <code>cached</code> boolean. Batch precompute returns an <code>items</code> array with one entry per candidate.
Single-candidate response (new run)
{
"id": "tu_01JCXY",
"status": "pending",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"cached": false
}Single-candidate response (cache hit)
When a completed run exists within the seven-day reuse window and force_refresh is not set, the create response may already be status: completed with cached: true.
{
"id": "tu_01JCXY",
"status": "completed",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"cached": true
}Batch precompute response
{
"items": [
{
"id": "tu_01JCXY",
"status": "completed",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"cached": true
},
{
"id": "tu_01JCXZ",
"status": "pending",
"candidate_id": "cand-9912",
"created_at": "2026-08-28T12:56:45.102Z",
"cached": false
}
]
}Get talent update
Call GET /api/v1/talent-updates/{id} to check progress and retrieve the completed profile.
completed with identity.confidence: "none" means we ran but could not confidently identify the person. While status is pending, profile fields are present but null or empty arrays.status values
pendingRun in progress. Poll again after a short interval.completedRun finished. Profile fields are present (arrays may be empty).failedRun failed. Check error for details.While status is pending
{
"id": "tu_01JCXY",
"status": "pending",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"completed_at": null,
"error": null,
"identity": {
"confidence": null,
"full_name": null,
"headline": null,
"current_employer": null,
"location": null
},
"work_experience": [],
"education": [],
"online_presence": []
}When status is completed
{
"id": "tu_01JCXY",
"status": "completed",
"candidate_id": "cand-9911",
"created_at": "2026-08-28T12:56:44.642Z",
"completed_at": "2026-08-28T12:57:26.031Z",
"error": null,
"identity": {
"confidence": "high",
"full_name": "Alex Rivera",
"headline": "Software Engineer at Example Corp",
"current_employer": "Example Corp",
"location": "London, UK"
},
"work_experience": [
{
"company": "Example Corp",
"role": "Software Engineer",
"start_date": "2016-01",
"end_date": null,
"is_current": true,
"confidence": "high"
}
],
"education": [
{
"institution": "Example University",
"qualification": "Bachelor of Science",
"confidence": "high"
}
],
"online_presence": [
{
"platform": "linkedin",
"url": "https://linkedin.com/in/alex-rivera-example",
"confidence": "high"
}
]
}Response fields
Every GET response includes the profile shape (identity, work_experience, education, online_presence). While status is pending, those fields are null or empty arrays; when completed, they hold resolved data.
identityconfidence (high, medium, low, none, or null while pending), full_name, headline, current_employer, location.work_experienceEach entry: company, role, start_date, end_date, is_current, confidence.educationinstitution, qualification, confidence.online_presenceDiscovered profiles not already in your profile_urls. Each entry: platform, url, confidence.Timestamps are UTC with a Z. Employment dates are typically YYYY-MM.
Enumerations
Every enum may gain new members. Treat an unrecognised value as its safest neighbour, not as an error.
statuspending, completed, failedidentity.confidencehigh, medium, low, none, null (pending)*.confidencehigh, medium, lowErrors
Non-2xx responses use application/problem+json (RFC 9457). Branch on status and stable error codes where present.
Status
When
401
Missing or invalid API key, deactivated key, or suspended partner.
404
Unknown run id, or one belonging to another partner.
422
Well-formed but fails required-combination or field rules.
429
Rate limited or precompute cap exceeded. Respect <code>Retry-After</code>.
500
Could not start or complete the run. Retryable for live calls.
Example problem response
{
"type": "https://intelligence.tietalent.com/errors/invalid-request",
"title": "Unprocessable Entity",
"status": 422,
"detail": "work_email must be a corporate address, not a personal mailbox."
}Rate limits & versioning
Rate limits
Requests are rate-limited per IP and per partner. 429 responses include Retry-After (seconds). Back off exponentially with jitter.
Retry-After: 42
Versioning
The version is in the path (/v1). Additive response fields may appear without a version bump.
Webhooks
Polling is supported but webhooks are preferred when configured. Delivery is at-least-once; handlers must be idempotent on event id. Treat GET /api/v1/talent-updates/{id} as authoritative at all times.
Event types
talent_update_readyTalent update finished successfully.talent_update_failedTalent update failed. Includes error_code in data.Signature verification
Every delivery carries an X-CI-Signature header: t=<unix>,v1=<hmac-sha256> over "{t}.{raw_body}", HMAC-SHA256 with your whsec_... secret. Verify the signature and reject timestamps older than five minutes.
X-CI-Signature: t=<unix>,v1=<hmac-sha256>
# Signed over "{t}.{raw_body}". Reject timestamps older than five minutes.The webhook payload is a thin pointer: result_url, talent_update_id, and candidate_id. Fetch the full profile via authed GET.
api_environment mirrors the label of the API key that authenticated the run (Production, Staging, or Test): the same value shown in your admin API key list.
talent_update_ready
{
"id": "evt_01JDABC",
"type": "talent_update_ready",
"created_at": "2026-08-28T12:57:26.031Z",
"api_environment": "Production",
"data": {
"candidate_id": "cand-9911",
"status": "completed",
"result_url": "https://intelligence.tietalent.com/api/v1/talent-updates/tu_01JCXY",
"talent_update_id": "tu_01JCXY"
}
}talent_update_failed
{
"id": "evt_01JDABD",
"type": "talent_update_failed",
"created_at": "2026-08-28T12:57:30.031Z",
"api_environment": "Production",
"data": {
"candidate_id": "cand-9911",
"status": "failed",
"result_url": "https://intelligence.tietalent.com/api/v1/talent-updates/tu_01JCXY",
"talent_update_id": "tu_01JCXY",
"error_code": "internal_error"
}
}Known limits
Publishing these limits is what makes the numbers trustworthy.
identity.confidencecan belowor absent. Common names are genuinely hard; treat low-confidence data as unverified.- Empty arrays are normal when public sources do not expose the information.
- Employment
start_dateis often missing. Do not build strict date logic on it. - Coverage is weaker for common names and regions with thinner web presence.
- Maximum 50 candidates per batch precompute request; maximum 10
profile_urlsper candidate.
Partner Program
Start integrating Talent Update
Request access and we will activate your partner API credentials for talent-update enrichment.