Contents
v1 Β· BetaPartner API
Candidate Intelligence API Integration
Give recruiters more confidence before interviews
Run Candidate Intelligence reports directly inside your ATS to verify candidate information, surface unexpected signals, and generate interview questions in seconds.
Request API AccessBest fit for
Applicant Tracking Systems (ATS)
Recruitment CRMs
Job Boards
Internal Talent Platforms
Executive Search Firms
HR Tech Vendors
Partner Benefits
Why Integrate Candidate Intelligence?
Give your customers additional context before interviews while creating new value inside your platform.
Increase Recruiter Engagement
Keep recruiters inside your ATS by providing candidate verification, interview preparation, and additional hiring insights directly within candidate profiles.
Create a New Revenue Stream
Offer Candidate Intelligence reports to your customers and earn recurring revenue through the partner program.
Differentiate Your Platform
Stand out from competing ATS and recruitment solutions with built-in Candidate Intelligence capabilities.
No Additional Research Required
Help recruiters uncover relevant information beyond the CV without leaving their workflow.
Improve Hiring Quality
Help recruiters and hiring managers make more informed decisions by providing additional context beyond the CV, highlighting verified findings, surfacing potential risks, and identifying areas that require further validation.
Fast Integration
Typical implementation requires only a few API endpoints and can be completed in less than a day.
Integration flow
Get approved and receive an API key
Request access from TieTalent. Once approved, you receive an API key (prefix ats_) for your integration.
Add a button inside candidate profiles
Add a "Run candidate intelligence report" button within candidate profiles. When clicked, it changes to "Running intelligence report..." while the report generates. Once ready, the report opens automatically and the button becomes "β Close report". When closed, the button reverts to "View Intelligence report" to reopen a report you have already generated.
Call the TieTalent API when clicked
POST to /api/v1/analyses with the candidate, client (recruiter), and language. Use your own external IDs on client.id and candidate.id.
TieTalent generates the report
The analysis runs in the background. Poll GET /api/v1/analyses/'{'id'}' using the returned id β wait at least 10 seconds between requests while status is queued or processing (see Retry-After response header). Call DELETE on the same path to cancel if the recruiter leaves the profile.
Display the report in the candidate profile
Render the report JSON in your own UI (see Report object reference), or open the full hosted report via the signed link in metadata.pdf_download_url β the hosted view also offers the PDF export.
Performance & Latency
Candidate Intelligence is designed to provide a responsive experience directly within recruiter workflows.
Action
Typical Response Time
Existing report found
< 1 second
New report generation
30β60 seconds
Report reuse logic
Reports are uniquely identified by platform + company + candidate.
Cache is scoped per recruiter: your API key identifies the partner integration, and client.id identifies the recruiter (user) within your platform. Different client.id values do not share cache, even under the same API key.
Cache key fields
candidate.idYour external candidate IDcandidate.first_name + candidate.last_nameCandidate name (normalized)candidate.companyCurrent company (normalized)candidate.locationLocation (normalized)candidate.roleRole or job title (normalized)Not part of the cache key
candidate.cvOptional CV text β used only on fresh runs. Changing the CV alone does not bust cache.languageRequested report language. Use force_refresh: true when you need a report in a different language.Cached reports are reused for up to 6 months. Completed analyses older than that are not returned from cache.
Force refresh
Set force_refresh: true on POST /api/v1/analyses to skip the cache lookup and run the full analysis pipeline β enrichment, live signals, and LLM report generation.
Omit force_refresh or set it to false to allow cache reuse (default).
When to set force_refresh: true
The recruiter explicitly requests updated or refreshed intelligence
Only the CV text changed while profile fields stayed the same
You need a report in a different language than a prior cached run
You want live signals and enrichment re-run regardless of cache
Fresh analysis request
{
"language": "en",
"client": {
"id": "client_company_123",
"first_name": "Jane",
"last_name": "Smith",
"company": "Acme Recruiting"
},
"candidate": {
"id": "candidate_456",
"first_name": "John",
"last_name": "Doe",
"company": "Example Company",
"location": "London, UK",
"role": "Software Engineer"
},
"force_refresh": true
}Authentication
HTTP headers
X-API-Key: ats_your_api_key_here Content-Type: application/json
Create analysis
Optional body fields: candidate.cv (plain-text CV, used only on fresh runs) and force_refresh (boolean, default false β see Force refresh).
{
"language": "en",
"client": {
"id": "client_company_123",
"first_name": "Jane",
"last_name": "Smith",
"company": "Acme Recruiting"
},
"candidate": {
"id": "candidate_456",
"first_name": "John",
"last_name": "Doe",
"company": "Example Company",
"location": "London, UK",
"role": "Software Engineer",
"cv": "Optional plain-text CV contentβ¦"
},
"force_refresh": false
}force_refresh (optional, default false) skips report reuse and always generates a fresh report β the new report is billed. Omit it unless the recruiter explicitly requests a refresh.
202 Accepted
The Location header points to GET /api/v1/analyses/'{'id'}'. Retry-After: 10 indicates when to poll next.
{
"id": "cmqp23kgg00067gk0rh6jol5o",
"status": "queued",
"candidate_id": "candidate_456",
"created_at": "2026-06-29T12:00:00.000Z"
}Polling & progressive results
After POST returns 202 Accepted, poll GET /api/v1/analyses/'{'id'}' with the same X-API-Key header. Use the id from the create response.
While status is queued or processing, each GET response includes Retry-After: 10 β wait at least 10 seconds before your next request.
Stop polling when status is completed, failed, or canceled.
{
"id": "cmqp23kgg00067gk0rh6jol5o",
"status": "processing",
"candidate_id": "candidate_456",
"stage": "enrichment",
"created_at": "2026-06-29T12:00:00.000Z",
"updated_at": "2026-06-29T12:00:20.000Z",
"quick_signal": {
"level": "Green",
"reason": "Identity supported by multiple matching signals.",
"identityConfidence": "Medium"
},
"signals": [
{
"statement": "Senior engineer at Example Company since 2021.",
"sourceType": "web",
"sourceUrl": "https://example.com/β¦",
"reliability": "High"
}
],
"report": null,
"metadata": null,
"error": null
}Fields that populate while processing
quick_signalPreliminary identity signal (Green, Orange, or Red) with a short reason β available once enrichment begins.signalsLive web signals discovered during enrichment. The array grows as external searches complete.stageCurrent pipeline stage: identity β enrichment β report β done.reportFull Candidate Intelligence report β populated only when status is completed.metadataReport metadata β populated only when status is completed. Includes the signed hosted-report link (pdf_download_url) and the cached / cached_at reuse flags.Status values
queuedAccepted and waiting to start.processingIn progress β poll for quick_signal, signals, and stage updates.completedReport ready β report and metadata are populated.failedAnalysis failed β error is populated.canceledAnalysis was canceled via DELETE /api/v1/analyses/'{'id'}' or reached a terminal cancel state.Cancel an analysis
DELETE /api/v1/analyses/'{'id'}' stops a queued or in-progress analysis when a recruiter leaves the candidate profile or dismisses a running report. Use the same X-API-Key header as POST and GET.
If the analysis is already completed, failed, or canceled, the endpoint returns the current resource unchanged β no additional charge or side effects.
// No request body β include X-API-Key header only
200 OK
Returns the analysis resource with status canceled. Partial quick_signal or signals may be present if cancellation happened mid-pipeline. Stop polling once status is canceled.
{
"id": "cmqp23kgg00067gk0rh6jol5o",
"status": "canceled",
"candidate_id": "candidate_456",
"stage": "enrichment",
"created_at": "2026-06-29T12:00:00.000Z",
"updated_at": "2026-06-29T12:00:25.000Z",
"quick_signal": null,
"signals": [],
"report": null,
"metadata": null,
"error": null
}Completed analysis
Returned when status is completed. The report below is abridged β see the Report object reference for the full field list.
Fresh report (metadata.cached: false)
{
"id": "clx_analysis_id",
"status": "completed",
"candidate_id": "candidate_456",
"stage": "done",
"created_at": "2026-06-29T12:00:00.000Z",
"updated_at": "2026-06-29T12:00:45.000Z",
"quick_signal": {
"level": "Green",
"reason": "Identity supported by multiple matching signals.",
"identityConfidence": "Medium"
},
"signals": [
{
"statement": "β¦",
"sourceType": "web",
"sourceUrl": "https://example.com/β¦",
"reliability": "High"
}
],
"report": {
"candidateName": "John Doe",
"profileHeadline": "Software Engineer",
"profileCompany": "Example Company",
"profileLocation": "London, UK",
"identity": {
"status": "Confirmed",
"confidence": "High",
"confidenceReason": "β¦",
"risk": { "level": "Low", "reason": "β¦" }
},
"sourcesCheckedCount": 24,
"recommendation": {
"decision": "Go with validation",
"confidence": "Medium",
"confidenceNote": "Identity verified Β· signals consistent",
"reason": "β¦",
"evidence": ["β¦"],
"nextStepPills": [
{ "variant": "confirmed", "label": "Role and tenure verified" },
{ "variant": "validate", "label": "Validate team leadership scope" }
]
},
"summary": "β¦",
"externalProfileSummary": "β¦",
"externalProfileTags": [
{ "kind": "catalog", "id": "linkedin_verified" },
{ "kind": "catalog", "id": "signals_highly_consistent" },
{ "kind": "custom", "group": "source_presence", "label": "Open-source contributor" }
],
"strengths": ["β¦"],
"signals": {
"verified": [
{
"statement": "β¦",
"sourceType": "web",
"sourceReference": "β¦",
"reliability": "High"
}
],
"weak": [],
"unverifiedClaims": [],
"noSignificantExternalData": false
},
"highImpactFindings": [
{
"type": "Career",
"title": "β¦",
"summary": "β¦",
"evidenceBadge": "validate",
"confidence": "Medium",
"polarity": "Concern"
}
],
"topDecisionDrivers": ["β¦"],
"expectationGap": {
"expectedSignals": ["β¦"],
"missingOrWeaker": ["β¦"],
"assessment": "β¦"
},
"impactAssessment": {
"summary": "β¦",
"riskLevel": "Low",
"overallRiskLabel": "Low validation needed",
"implications": ["β¦"]
},
"whatToValidate": ["β¦"],
"nextStep": {
"action": "β¦",
"focusAreas": ["β¦"],
"reasoning": "β¦"
},
"alertLevel": "Green",
"externalDataConfidence": "Medium"
},
"metadata": {
"report_id": "clx_analysis_id",
"candidate_id": "candidate_456",
"language": "en",
"generated_at": "2026-06-29T12:00:45.000Z",
"pdf_download_url": "https://intelligence.tietalent.com/api/ats/reports/{id}/pdf?sig=β¦",
"cached": false,
"cached_at": null
},
"error": null
}Cached report (metadata.cached: true)
{
"id": "clx_new_analysis_id",
"status": "completed",
"candidate_id": "candidate_456",
"stage": "done",
"created_at": "2026-07-15T12:00:00.000Z",
"updated_at": "2026-07-15T12:00:00.500Z",
"quick_signal": { "β¦": "β¦" },
"signals": [{ "β¦": "β¦" }],
"report": { "β¦": "β¦" },
"metadata": {
"report_id": "clx_new_analysis_id",
"candidate_id": "candidate_456",
"language": "en",
"generated_at": "2026-07-15T12:00:00.500Z",
"pdf_download_url": "https://intelligence.tietalent.com/api/ats/reports/{id}/pdf?sig=β¦",
"cached": true,
"cached_at": "2026-07-15T12:00:00.500Z"
},
"error": null
}The metadata object
metadata.pdf_download_url is a signed link that opens the full hosted TieTalent report (the same report design as the web app); the PDF export can be downloaded from that view. Treat the link as confidential β anyone holding it can open the report.
metadata.cached is true when an existing report was reused instead of generating a new one (see Report reuse logic); cached_at then carries the reuse timestamp, otherwise it is null.
Verdicts & compatibility
report.recommendation.decision is the headline verdict of the report. It is always one of the four values below.
recommendation.decision β possible values
"Proceed with confidence" "Go with validation" "Requires Validation (Signals flagged)" "Requires Validation (Insufficient data)"
Map each verdict to one of three UI states:
Suggested mapping (JavaScript)
function toUiState(decision) {
switch (decision) {
case "Proceed with confidence":
return "proceed";
case "Go with validation":
return "validation";
case "Requires Validation (Signals flagged)":
case "Requires Validation (Insufficient data)":
return "requires_validation";
default:
return "requires_validation";
}
}Report object reference
report is populated only when status is completed. Field names are camelCase. The structure reflects the current report design used across all TieTalent Intelligence surfaces (web app, extension, and the hosted report).
Core fields (always present)
candidateNameCandidate name as resolved by the analysis.identityIdentity resolution β status (Confirmed, Likely, Ambiguous, Unknown), confidence, confidenceReason, and risk (level, reason).recommendationThe verdict β decision (see Verdicts & compatibility), confidence, reason, evidence[], confidenceNote (short evidence headline), and nextStepPills[] (evidence-state pills with variant and label).summaryExecutive summary paragraph.externalProfileSummaryNarrative summary of the candidate's external footprint.strengthsKey strengths (array of strings).signalsSignal snapshot β verified[], weak[], unverifiedClaims[], and noSignificantExternalData.highImpactFindingsDecision-critical findings. Each has type, summary, and confidence, plus optional title, evidenceBadge, polarity, and sourceReference.topDecisionDriversThe signals that most influenced the verdict (array of strings).expectationGapExpected vs. found signals β expectedSignals[], missingOrWeaker[], and assessment.impactAssessmentHiring impact β summary, riskLevel, and implications[], plus optional overallRiskLabel, bestSuited[], and considerCarefully[].whatToValidateConcrete points to validate in interviews (array of strings).nextStepSuggested next step β action, focusAreas[], and reasoning.alertLevelOverall alert level β Green, Yellow, Orange, or Red.externalDataConfidenceConfidence in the external data behind the report β High, Medium, or Low.Optional fields
These fields may be absent. Treat them as nullable and ignore any field your UI does not use.
profileHeadline / profileCompany / profileLocationHeader lines for display β role/title, current company, and location.sourcesCheckedCountNumber of external search results consulted for the report (set by the pipeline).externalProfileTagsTags describing the candidate's external footprint β see Tags below.bestFitContext / bestFitTagsBest-fit narrative and tags β see Tags below.surprisingInsightsInsight cards (title, text, source, notOnCV?).keyTakeawaysstandsOut[] and needsChecking[] lists of (label, detail) items.claimsVsSignalsClaim-by-claim check β (claim, confirmed, assessment).interviewQuestionsSuggested interview questions β (question, hint).technicalIntelligenceTechnical footprint for technical roles β profileFound, signalStrength, observations[], repositories[], risks[], and impactAssessment.sensitiveUnverifiedSignalsSensitive signals with an attribution status. Handle with care and never present as established fact.Submit feedback on a report
POST /api/v1/analyses/'{'id'}'/feedback lets your recruiters rate a completed report β 1 to 5 stars, optional tags, and optional free text β so TieTalent can track report quality on your side of the integration.
The endpoint upserts on client.id plus the report id: submitting again for the same client and report overwrites the previous rating, tags and text β there is no revision history.
{
"client": {
"id": "client_company_123",
"first_name": "Jane",
"last_name": "Smith",
"company": "Acme Recruiting"
},
"rating": 4,
"feedback": "Helped me shortlist quickly, would have liked more sourcing links.",
"tags": ["saved_me_time", "good_signal_quality"]
}Request fields
clientRequired. Same client object as POST /api/v1/analyses β identifies which of your users is giving feedback.ratingRequired. Integer from 1 to 5.feedbackOptional. Free-text comment, up to 2000 characters.tagsOptional. Up to 5 canonical tag ids from the catalog below β invalid values or an out-of-range rating return a 4xx with a clear message.Feedback tag catalog
Tags are grouped by rating band and swap depending on the rating you send β render your own UI for these, but submit only the canonical ids so feedback stays analyzable across languages.
Canonical tag ids by rating band
// 1-2 stars missing_info Β· something_was_wrong Β· signals_felt_weak too_generic Β· hard_to_trust // 3 stars useful_but_missing_detail Β· right_idea_wrong_emphasis some_signals_felt_off Β· wanted_more_sources // 4-5 stars saved_me_time Β· helped_me_decide Β· good_signal_quality easy_to_read Β· trustworthy
200 OK
Returns the stored feedback, echoing back the current rating, tags and text on file for that client and report.
{
"report_id": "cmqp23kgg00067gk0rh6jol5o",
"rating": 4,
"feedback": "Helped me shortlist quickly, would have liked more sourcing links.",
"tags": ["saved_me_time", "good_signal_quality"],
"updated_at": "2026-07-21T12:00:00.000Z"
}Recommended partner UI
Add a button inside candidate profiles
Add a "Run candidate intelligence report" button within candidate profiles. When clicked, it changes to "Running intelligence report..." while the report generates. Once ready, the report opens automatically and the button becomes "β Close report". When closed, the button reverts to "View Intelligence report" to reopen a report you have already stored β without calling POST again.
No report exists
Report generating
Report is open
Report closed / exists
Privacy & security
βοΈ AI Compliance Notice
Candidate Intelligence is designed to support recruiter decision-making, not replace it. Hiring decisions remain the responsibility of the employer and should always include appropriate human review and oversight.
Partner Program
Start integrating Candidate Intelligence
Request access and we will activate your partner API credentials. Integration typically takes less than a day.