Hiring: candidates move through the pipeline of an opening (screening, assessment, interview, offer) until one is hired.
Resources
| Resource | API | Pages |
|---|---|---|
| Applications | read, create (add a candidate to an opening), stage move, reject, hire | Applications |
| Interviews | read, create (offer slots), update (re-propose or cancel) | Interviews |
| Offers | read, offer-letter download | Offers |
Typical flow
- Add a candidate to an opening:
POST /api/v1/applicationswith{ "openingId": "…", "candidate": { "externalSystem": "jobboard", "externalId": "C-881" } }. - Follow screening and assessment results with
application.updatedandapplication.stage_changed. - Offer interview slots:
POST /api/v1/interviews; the candidate picks one (interview.updated), and the panel scores it (interview.completed). - Move to
OFFERED(recruitment.offer.issue), then read the offer letter from/api/v1/offers/{id}/file(needsrecruitment.candidate.contact). - Hire:
POST /api/v1/applications/{id}/hire. The candidate becomes an employee: you receiveapplication.hiredandemployee.created, and the candidate's external links move to the employee.
Rules worth knowing
- Adding a candidate follows the opening's hiring pathway, as on the careers page (
409 conflictwithopening_internal_onlyornot_yet_external); a candidate applies once per opening (already_applied). - The opening must be
OPEN(opening_not_open). - Hiring runs the same handoff as the Hire button in the app, including the seat-capacity check (
position_full). - A hired application is final: moving, rejecting or hiring it again returns
409 conflict(already_hired). A rejected application can't be hired (already_rejected); move it back to an active stage first. - Cancelling an already cancelled interview changes nothing; a completed one returns
409 conflict(interview_closed).