Partner API Create candidates, collect documents and references, retrieve the compliance pack.

Get an API key

The candidate object

The full shape GET /candidates/{id} returns.

Every field GET /candidates/{id} can return, in one place — see Retrieve a candidate for the request itself.

GET /candidates/{id} — every field

idstringrequired
The Onboardly candidate id — use this in every other endpoint’s path.
external_idstring or nullrequired
The Idempotency-Key you created this candidate with, or null for a dashboard-created candidate.
statusstringrequired
awaiting_consent, consent_denied, in_progress, verified, flagged, or revoked — the same stage a recruiter sees on the dashboard header pill.
consentbooleanrequired
True once the candidate has granted WhatsApp consent.
candidate.namestringrequired
Full display name.
candidate.mobile_numberstring or nullrequired
E.164.
candidate.emailstring or nullrequired
candidate.job_titlestring or nullrequired
Your role_type at creation, if any.
documents[].namestringrequired
The checklist entry’s name — any string, not limited to a fixed catalogue.
documents[].statusstringrequired
pending, needs_review, accepted, rejected, or awaiting_recruiter_action.
documents[].submitted_atstring or nullrequired
ISO-8601 timestamp of the latest submission, or null if nothing has been uploaded for this slot.
documents[].content_urlstring or nullrequired
Absolute URL — set whenever ANY submission exists, whatever its status. Never a signal that the document was accepted. For a document sent as several pages it serves the page the document’s submission was recorded against — not necessarily page 1.
documents[].pagesarrayoptional
Present ONLY on a document the candidate sent as several pages (two or more); a single-file document has no pages key. The pages that can be opened, in page order — see Retrieve a document page.
documents[].pages[].page_numberintegerrequired
1-based position in the document. A page that cannot be opened right now is left out, so the numbering can have a gap.
documents[].pages[].content_urlstringrequired
Absolute URL of that page’s bytes — GET .../documents/{docId}/pages/{pageId}/content.
cvobject or nullrequired
null when no CV is on file, or on file but not currently servable. Fetch its bytes at Retrieve the CV.
cv.file_namestring or nullrequired
Always null today — nothing in this repo’s CV writer stamps the original filename.
cv.content_typestringrequired
One of the accepted CV types (PDF or Word), derived from the stored file.
cv.sizeinteger or nullrequired
Byte count actually stored.
cv.content_urlstringrequired
Absolute URL for GET .../cv.
references[].organisationstring or nullrequired
references[].rolestring or nullrequired
The referee’s own position, not the candidate’s.
references[].statusstringrequired
pending_send, sent, received, bounced, flagged, or completed.
references[].received_atstring or nullrequired
references[].reply_textstring or nullrequired
The referee’s reply, with contact details redacted.
reference_requirements.requiredintegerrequired
How many referees this candidate needs in total.
reference_requirements.receivedintegerrequired
reference_requirements.outstandingintegerrequired
0 once every required slot is settled.
compliance_pack.readybooleanrequired
Documents-only readiness — an outstanding reference never blocks this.
compliance_pack.urlstring or nullrequired
Set only when ready.
compliance_pack.blockersstring[]required
Bare document names still blocking readiness.
chase.docs_attemptsintegerrequired
Consecutive unanswered document-chase reminders sent so far.
chase.docs_attempts_maxintegerrequired
This candidate’s resolved cap.
chase.reference_attemptsintegerrequired
The highest attempt count across this candidate’s referees.
chase.reference_attempts_maxintegerrequired
Follow-up chases after the first email.