Skip to main content
This takes two calls. The first finds the candidate and returns their 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.
Each row has a 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 /recruiter/candidates/{candidateId}/recommended-roles returns the roles Paraform recommends you submit the candidate to, strongest first.
The candidate must be in your own CRM. Any other 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 has status set to generating and an empty roles list:
Wait 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.
Stored recommendations are served as they are, and refreshed in the background once they’re about a week old.

What each role includes

Each role has the same fields as GET /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 carry details.candidatesUrl, a link to the Candidates page, and name it in the message. See Errors for the envelope.