candidateId. The second returns the roles Paraform recommends for that candidate. You need a personal key with candidates:read and roles:read.
Find the candidate
GET /recruiter/candidates returns the candidates in your own CRM, newest first. It never includes candidates held by your agency teammates, even if you’re an agency owner. Filter it down to one person.
candidateId. Keep it for the next call.
Filters combine with AND. If nothing matches, you get an empty list, not an error. Rows never include an email address. Hidden and archived candidates are left out. See Pagination for paging through more than one page.
Get recommended roles
GET /recruiter/candidates/{candidateId}/recommended-roles returns the roles Paraform recommends you submit the candidate to, strongest first.
candidateId, including a teammate’s, returns 404.
Wait while Paraform generates
The first time you ask for a candidate, Paraform may need to build their recommendations. The response then hasstatus set to generating and an empty roles list:
retryAfterSeconds, then repeat the same request. Repeating it is safe. A status of ready means the roles are final for now.
ready with an empty roles list means Paraform finished and found no available recommendations. It doesn’t mean no role could ever fit. Fall back to GET /recruiter/roles with filters that match the candidate.What each role includes
Each role has the same fields asGET /recruiter/roles, including myRole, fee, and urls, plus a recommendation:
recommendation.fit is null when no saved analysis exists yet. The role is still a valid recommendation, and a later request can fill the analysis in.
The list is short, at most 20 roles. It only includes roles you can see and could submit this candidate to. If your agency hides payment from members, every fee amount is null. Treat null as hidden, never as zero.
Errors
Errors you can fix carrydetails.candidatesUrl, a link to the Candidates page, and name it in the message. See Errors for the envelope.