Workflows, Hiring & HRRecruitment & Hiring
On this page0

Unfamiliar word? See Glossary: words used in these docs. Looking for the tasks in order? Begin at Start Here.

Reference

Included in: Team and Advanced. Which Plan Includes What

Recruitment & Hiring

The recruitment module takes a role from a budget-approved job posting to a signed offer: a public careers page, a candidate pipeline, interviews with scorecards, offers that a second person approves, and a private page where the new hire signs and chooses their equipment. For the step-by-step, see the guide Hire someone.

An administrator uses it to open roles, decide who may see and move candidates, and keep the approval steps separate from the people who ask for them.

Two People For Every Money Decision

A job’s budget is approved by someone with the finance permission who did not create the job, and an offer is approved by someone other than the person who set its terms. A signed offer is reversed only by a rescission that a second person approves. An administrator is exempt from all three rules (the budget approval, the offer approval and the rescission approval), so a company with one administrator is never locked out of hiring. An administrator approving the budget of a job they created is recorded in the audit log as an exemption.

Plan

Recruitment is included from Team. On a plan without it none of the menu items below are shown. All Zonitix pricing is per instance, never per seat.

Where Everything Is In The Menu

A person sees a menu item only when their role allows it. Which permission shows which item is listed under Technical detail at the end of this page.

Menu ItemWhat It Is
HR & TalentRecruitment OverviewThe hiring home page, with an Overview tab and a Reports tab.
HR & TalentJob PostingsRequisitions, their budget approval, the careers page and the job-board feeds.
HR & TalentCandidate PipelineEvery candidate the viewer may see, by stage.
HR & TalentTemplatesOffer letters and interview guides. The Hiring policies page is opened from a link on this page.
HR & TalentOffer ApprovalsOffers waiting for a second person to approve.
My WorkMy InterviewsThe interviews assigned to the signed-in person, and their scorecards.
My WorkInternal ReferralsRefer someone for an open role and follow their progress.

The command palette (Ctrl+K or Cmd+K) also lists Hiring Templates, Hiring Policies and Hiring Reports. Those are the HR & TalentTemplates page, the Hiring policies page reached from it, and the Reports tab of HR & TalentRecruitment Overview.

Who Sees Which Candidate

An administrator or a person who manages recruitment can act on every candidate. Everyone else sees a candidate only when one of these is true: they are the candidate’s owner, they own or are the hiring manager of the candidate’s job, or they are assigned an interview with the candidate. The same rule limits the pipeline list, a candidate’s messages and the actions on a candidate; a candidate outside it is treated as if it did not exist.

The Pages Of This Reference

The detail of recruitment is on its own pages, one per subject. Each opens with a short description in plain words, followed by the technical part. The permissions and the typed fields of the API objects are in the technical part of this page.

If something here is not working as you expect, start with When something goes wrong.

The plain explanation is above. This part is for IT and developers: the exact settings, permission names, API addresses and data fields behind it. Closed: select the heading above to open it. While it is closed, your browser’s find-on-page (Ctrl+F or Cmd+F) does not search this part.

Permissions

Give these to people through a role in Access Control. A permission other than manage_recruitment does not by itself show every candidate; see Who Sees Which Candidate.

PermissionWhat It Allows
manage_recruitmentEverything in recruitment: requisitions, every candidate, templates, policies, sending and withdrawing offers, reassigning owners. It cannot approve a budget.
view_recruitmentRead requisitions, the candidates the holder is connected to, message threads, templates and hiring reports. No notes, and no moving, rejecting or messaging candidates.
source_candidatesAdd and screen candidates, move, tag, reject and message the candidates the holder is connected to, and write notes.
schedule_interviewsAssign, reschedule and cancel interviews, and send time options.
conduct_interviewSee My Interviews, submit scorecards, and work on the candidates the holder interviews.
approve_offerSee Offer Approvals, set offer terms, approve or withhold an offer, send it, and request or approve a rescission.
manage_financeApprove or refuse a requisition budget, and approve offers.
review_executive_packetRead candidates, interviews and hiring reports for a final review.
view_referralsSee Internal Referrals and submit referrals.

Which Permission Shows Which Menu Item

Every row also needs recruitment on the plan (the recruitment licence entitlement). A request for a candidate outside the caller’s visibility rule is answered with 404, as if the candidate did not exist.

Menu ItemShown To Holders Of
HR & TalentRecruitment Overviewmanage_recruitment
HR & TalentJob Postingsmanage_recruitment | manage_finance
HR & TalentCandidate Pipelinemanage_recruitment | view_recruitment | source_candidates | schedule_interviews | review_executive_packet
HR & TalentTemplatesmanage_recruitment
HR & TalentOffer Approvalsapprove_offer | manage_recruitment | manage_finance
My WorkMy Interviewsconduct_interview | manage_recruitment
My WorkInternal Referralsview_referrals

The full route list, with the permission on every route, is in the API reference under Recruitment & Hiring.

Data Objects (Typed Fields)

In plain words: a call to the API answers with objects such as a requisition, a candidate, an offer or an interview. This section lists what is inside each one: every field, its type, and whether it can be empty. Open an object to see its fields. The routes that return them are in the API reference under the six groups whose names start with Recruitment, where a capitalised name in a row’s returns line is one of these objects.

  • Types. integer, number, string, boolean, object and arrays written as string[]. string (date-time) is ISO 8601; string (date) is YYYY-MM-DD. A type followed by a colon and values separated by | takes only those values. A capitalised type is another object in this list.
  • The third column. “nullable” means the field can be null; “optional” means the key can be missing; “no” means neither. “read-only” means the server sets the field and a write does not change it. Do not fail on a field you do not recognise: a reply can carry fields beyond these. A card marked “request body” is what you send, not what comes back: its third column is headed Required, where “required” means the field must be sent and every other field is optional.
  • Who sees what. Offer pay (salary, signOnBonus) is null for a caller who may not see offer compensation. Another interviewer’s score and feedback are masked until you have submitted your own scorecard, unless you manage recruitment or are the hiring manager of the requisition.
  • Never returned: the link a candidate signs an offer with, and the link to the candidate’s offer portal.
JobPostingin a reply36 fields

A requisition.

FieldTypeNull / optional / read-onlyNote
idintegerread-only
titlestringno
descriptionstringnullable
departmentstringnullable
statusstring: Draft | Open | Published | Closed | Filled | On HoldnoOnly Published roles are on the careers site.
financeApprovalStatusstring: Pending | Approved | Rejectedread-onlyThe headcount budget gate.
locationstringnullable
employmentTypestringnullable
senioritystringnullable
workModestringnullable
minExperienceMonthsintegernullable
currencystringnullable
salaryRangestringnullable
salaryMinintegernullable
salaryMaxintegernullable
payPeriodstringnullable
competenciesarrayno
requirementsarrayno
applicationQuestionsobject[]noEach has id, label, type, required and options on the careers site.
hiringManagerIdintegernullable
ownerIdintegernullable
personaIdintegernullable
createdByIdintegernullable, read-only
financeApprovedByIdintegernullable, read-only
financeApprovedAtstring (date-time)nullable, read-only
financeRejectionReasonstringnullable, read-only
financeRequestedAtstring (date-time)nullable, read-only
isTalentPoolbooleanread-onlytrue only for the talent-pool requisition, which the list leaves out.
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
candidateCountintegerread-onlyIn the list only: every applicant, not the preview.
stageCountsobjectnullable, read-onlyIn the list only: { "<STAGE IN CAPITALS>": integer }; null when the role has no candidates.
Candidatesobject[]read-onlyIn the list only: the newest applicants in your own candidate scope, each { id, firstName, lastName, email, stage, matchScore, jobPostingId }.
HiringManager{ id:integer, firstName:string|null, lastName:string|null, email:string }nullable, read-onlyIn the list only. Owner, Creator and FinanceApprover have the same shape.
OfferTemplatesobject[]read-onlyIn the list only: each { id:integer, name:string, createdAt }.
InterviewTemplatesobject[]read-onlyIn the list only: each { id:integer, name:string, roundName:string|null, createdAt }.
Candidatein a reply32 fields

One application to one requisition.

FieldTypeNull / optional / read-onlyNote
idintegerread-only
firstNamestringno
lastNamestringno
emailstringno
phoneNumberstringnullable
resumeUrlstringnullableThe stored file name; fetch the file with GET /recruitment/candidates/:id/resume.
sourcestringnullable
stagestring: Sourced | Screen | Interview | Offer | Hired | Rejectedno
matchScoreintegernullable
aiSummarystringnullable
scoreSourcestringnullableprocessing until the first screen has finished.
calibrationResultobjectnullablenull for an interviewer who has not yet submitted their own scorecard.
parsedProfileobjectnullable
rejectionEmailSentbooleanno
onboardingDataobjectno
applicationAnswersarrayno
knockoutFlagbooleanno
knockoutReasonsarrayno
jobPostingIdintegerno
userIdintegernullableThe linked user account, when there is one.
ownerIdintegernullable
consentAtstring (date-time)nullable
humanReviewRequestedbooleanno
aiNoticeAckAtstring (date-time)nullable
tagsstring[]noEach up to 40 characters.
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
technicalFitScoreintegernullable, read-onlyIn the list only: 0 to 100 from the completed scorecards; null without one.
JobJobPostingread-onlyIn the list only, with HiringManager.
Owner{ id:integer, firstName:string|null, lastName:string|null, email:string }nullable, read-onlyIn the list only.
OfferOffernullable, read-onlyIn the list only.
InterviewsInterview[]read-onlyIn the list only.
Offerin a reply29 fields

A candidate has at most one. The signing link and the candidate-portal link are never part of a reply.

FieldTypeNull / optional / read-onlyNote
idintegerread-only
candidateIdintegerno
salarynumbernullableA number in the candidate list, for a caller who may see offer pay; null for anyone else. null in the reply to a write on the offer itself.
signOnBonusstringnullableIn the candidate list only, under the same rule as salary.
currencystringnullable
payPeriodstringnullable
levelstringnullable
targetBonusPctintegernullable
startDatestring (date)nullable
statusstring: Draft | Sent | Accepted | Declinedno
declineReasonstringnullable
signedAtstring (date-time)nullable
signedManuallyByintegernullable
approvalStatusstring: Pending | Approved | Rejectedno
approverIdintegernullable
termsSetByintegernullableThe person an approval is refused from.
offerTemplateIdintegernullable
supportingDocsobject[]no
documentUrlstringnullable
docusealSubmissionIdstringnullableThe signing submission, once the offer has been sent.
rescindStatusstringnullable
rescindRequestedByintegernullable
rescindReasonstringnullable
rescindApprovedByintegernullable
tokenExpiresAtstring (date-time)nullable
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
TemplateOfferTemplatenullable, read-onlyIn the candidate list only.
Approver{ id:integer, firstName:string|null, lastName:string|null, email:string }nullable, read-onlyIn the candidate list only.
Interviewin a reply21 fields
FieldTypeNull / optional / read-onlyNote
idintegerread-only
candidateIdintegerno
interviewerIdintegerno
scheduledAtstring (date-time)nullablenull while the candidate has not yet picked one of the proposed times.
feedbackstringnullable"Hidden from your view" on another interviewer's row until you have submitted your own scorecard.
structuredFeedbackobjectnullablenull on a masked row.
scoreintegernullable1 to 5; null on a masked row.
statusstring: Scheduled | Completed | Cancelledno
externalEventIdstringnullable
icsSequenceintegerno
cancelledAtstring (date-time)nullable
cancelReasonstringnullable
sequenceintegernullable
isShadowbooleannullableA shadow interviewer's score does not count towards technicalFitScore.
interviewTemplateIdintegernullable
proposedSlotsarraynoThe times offered for self-scheduling.
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
maskedbooleanoptionaltrue on a row whose score and feedback were hidden from you.
Interviewer{ id:integer, firstName:string|null, lastName:string|null, email:string }nullable, read-onlyIn the candidate list only.
TemplateInterviewTemplatenullable, read-onlyIn the candidate list only, with its Questions.
InterviewTemplatein a reply11 fields
FieldTypeNull / optional / read-onlyNote
idintegerread-only
namestringno
descriptionstringnullable
roundNamestringnullable
jobPostingIdintegernullablenull for a template that is not tied to one requisition.
sourceJobIdintegernullable
sourceJobTitlestringnullable
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
QuestionsInterviewQuestion[]noIn order.
usageCountintegerread-onlyIn the list only.
InterviewQuestionin a reply12 fields
FieldTypeNull / optional / read-onlyNote
idintegerread-only
interviewTemplateIdintegerno
questionTextstringno
categorystringnullable
contextstringnullable
idealAnswerstringnullable
weightintegernullableDefault 1.
mustHavebooleannullable
anchorsobjectnullable
orderintegernullable
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
OfferTemplatein a reply11 fields
FieldTypeNull / optional / read-onlyNote
idintegerread-only
namestringno
bodystringno
docusealTemplateIdintegernullable
jobPostingIdintegernullable
sourceJobIdintegernullable
sourceJobTitlestringnullable
supportingDocsobject[]no
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
usageCountintegerread-onlyIn the list only.
CandidateNotein a reply8 fields
FieldTypeNull / optional / read-onlyNote
idintegerread-only
candidateIdintegerno
authorIdintegernullable
bodystringno
mentionsarrayno
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
Author{ id:integer, firstName:string|null, lastName:string|null, email:string }nullable, read-onlyIn the list only.
CandidateMessagein a reply8 fields

One email to or from a candidate, as the message list returns it.

FieldTypeNull / optional / read-onlyNote
idintegerread-only
directionstring: outbound | inboundno
fromAddrstringnullable
toAddrstringnullable
subjectstringnullable
bodystringnullable
createdAtstring (date-time)read-only
sentByIdintegernullableThe user who sent an outbound message.
Referralin a reply8 fields
FieldTypeNull / optional / read-onlyNote
idintegerread-only
userIdintegernoThe employee who made the referral.
candidateIdintegerno
notesstringnullable
statusstring: Pending | Reviewed | Hired | Rejectedno
createdAtstring (date-time)read-only
updatedAtstring (date-time)read-only
Candidateobjectread-onlyIn the list only: { id, firstName, lastName, stage, source, createdAt, Job:{ id, title, department } }.
JobPostingWriterequest body20 fields

Create and update take the same keys; an update changes only the keys you send. The budget-approval fields and the creator are set by the server and are not read from the body.

FieldTypeRequiredNote
titlestringrequired on create
descriptionstringoptional
departmentstringoptional
statusstring: Draft | Open | Published | Closed | Filled | On HoldoptionalOpen and Published are refused with 409 until the headcount budget is approved.
locationstringoptional
employmentTypestringoptional
senioritystringoptional
workModestringoptional
minExperienceMonthsintegeroptional, null clears itA number, or text that is a number: rounded, 0 to 2147483647. Blank is stored as empty; anything else answers 400 INVALID_NUMBER.
currencystringoptional
salaryRangestringoptional
salaryMinintegeroptional, null clears itRead the same way as minExperienceMonths.
salaryMaxintegeroptional, null clears itRead the same way as minExperienceMonths.
payPeriodstringoptional
competenciesarrayoptional
requirementsarrayoptional
applicationQuestionsobject[]optionalThe extra questions on the public application form.
hiringManagerIdintegeroptional, null clears it
ownerIdintegeroptional, null clears it
personaIdintegeroptional, null clears itAssigning a persona is checked against what you are allowed to grant.
CandidateCreaterequest body7 fields

A candidate added by a signed-in recruiter. The stage, the scores and the consent fields are set by the server.

FieldTypeRequiredNote
jobPostingIdintegerrequired
emailstring (email)requiredStored in one normalised spelling. The same email on the same requisition answers 409.
firstNamestringrequired
lastNamestringrequired
phoneNumberstringoptionalStored encrypted.
sourcestringoptional
ownerIdintegeroptionalRead only from a caller who holds manage_recruitment. Otherwise the candidate takes the owner of the requisition, or you when it has none.
CandidateBulkActionrequest body8 fields

One action for many candidates. Each candidate is handled on its own and lands in succeeded, skipped or failed.

FieldTypeRequiredNote
idsinteger[]required1 to 200 candidate ids.
actionstring: stage | reject | reassign | tagrequired
stagestring: Sourced | Screen | Interview | Offer | Hired | Rejectedrequired for stageAny capitalisation.
sendEmailbooleanoptionalreject only: the rejection email is sent unless this is false.
reasonstringoptionalreject only.
ownerIdintegeroptional, null clears itreassign only.
addstring[]optionaltag only: labels to add.
removestring[]optionaltag only: labels to remove.
CandidateTagsUpdaterequest body2 fields

A label is trimmed and cut to 40 characters; labels that differ only in capitalisation count as one; a candidate keeps at most 30.

FieldTypeRequiredNote
addstring[]optional
removestring[]optionalMatched without regard to capitalisation.
CandidateNoteCreaterequest body2 fields
FieldTypeRequiredNote
bodystringrequiredTrimmed and cut to 5000 characters; empty answers 400.
mentionsinteger[]optionalUser ids to notify. Values that are not positive whole numbers, and repeats, are dropped.
CandidateMessageSendrequest body2 fields
FieldTypeRequiredNote
subjectstringrequiredTrimmed and cut to 500 characters.
bodystringrequiredTrimmed. A blank line starts a new paragraph in the email.
InterviewCreaterequest body7 fields
FieldTypeRequiredNote
interviewerIdintegerrequiredA person who is allowed to conduct interviews.
scheduledAtstring (date-time)optional, null clears itText that is not a date answers 400 INVALID_TIME. Without it the interview is created with no time.
sequenceintegeroptionalThe round number. Default 1.
interviewTemplateIdintegeroptional
isShadowbooleanoptionalDefault false.
durationMinsintegeroptionalUsed when checking the interviewer's other bookings.
allowOverlapbooleanoptionaltrue books the time although the interviewer already has an interview then.
InterviewSlotsProposerequest body6 fields

Offers the candidate a choice of times. Times in the past, times that are not dates and repeats are dropped, and the first 10 are kept.

FieldTypeRequiredNote
interviewerIdintegerrequired400 INTERVIEWER_REQUIRED without it.
slotsstring (date-time)[]requiredAt least two usable times, or the answer is 400 NOT_ENOUGH_SLOTS.
interviewTemplateIdintegeroptional
durationMinsintegeroptional
allowOverlapbooleanoptionalWithout it, times that clash with the interviewer's bookings are dropped, and fewer than two left answers 409 DOUBLE_BOOKED.
isShadowbooleanoptionalDefault false.
ScorecardSubmitrequest body3 fields

Marks the interview Completed.

FieldTypeRequiredNote
scoreintegeroptional1 to 5; anything else answers 400 INVALID_SCORE.
feedbackstringoptional
structuredFeedbackobjectoptionalYour marks and notes per competency. The recommendation is carried inside it.
InterviewQuestionInputrequest body8 fields
FieldTypeRequiredNote
questionTextstringrequired
categorystringoptional
contextstringoptional
idealAnswerstringoptional
weightintegeroptionalDefault 1.
mustHavebooleanoptionalDefault false.
anchorsobjectoptional
orderintegeroptionalDefaults to the position in the list.
InterviewTemplateWriterequest body5 fields

Create and update take the same keys. On an update, sending questions replaces the question list; leaving it out keeps the questions as they are.

FieldTypeRequiredNote
namestringrequired on create
descriptionstringoptional
roundNamestringoptional
jobPostingIdintegeroptional, null clears itnull makes the template available to every requisition.
questionsInterviewQuestionInput[]optional
OfferTemplateWriterequest body4 fields

Create and update take the same keys; an update changes only the keys you send.

FieldTypeRequiredNote
namestringrequired on create
bodystringrequired on createThe text of the offer letter.
jobPostingIdintegeroptional, null clears itnull makes the template available to every requisition.
supportingDocsobject[]optionalAt most 20. A link is { type:"link", label, url } with an http or https address; an uploaded file is { type:"file", label, storedName, filename?, size? } as POST /recruitment/offer-documents returns it. An entry without a label, or with an address or file name that does not pass the check, is dropped.
OfferTermsWriterequest body8 fields

The terms of a candidate's offer. Only the keys you send are changed; an empty text or null clears a value. Changing the terms of an approved offer sends it back for approval.

FieldTypeRequiredNote
salarynumberoptional, null clears itNot negative, or the answer is 400.
currencystringoptional, null clears it
payPeriodstringoptional, null clears it
startDatestring (date)optionalYYYY-MM-DD, or the answer is 400.
levelstringoptional, null clears it
targetBonusPctintegeroptional, null clears it0 to 100; rounded to a whole number.
signOnBonusnumberoptional, null clears itNot negative.
hiringManagerIdintegeroptional, null clears itWritten to the requisition, not the offer.
OfferBulkDecisionrequest body4 fields

Approve or refuse many offers. Each one goes through the same checks as the single routes and lands in succeeded or failed.

FieldTypeRequiredNote
idsinteger[]required1 to 200 candidate ids.
approvebooleanrequiredOnly true approves; any other value refuses.
reasonstringoptionalStored with a refusal.
termsVersionsobjectoptional{ "<candidate id>": string }: the version of the terms you saw for each offer, cut to 64 characters. An offer whose terms changed since lands in failed.
RequisitionOwnerWriterequest body2 fields
FieldTypeRequiredNote
ownerIdintegeroptional, null clears itA user id. null, 0 or a missing key leaves the requisition without an owner.
cascadebooleanoptionaltrue also moves the requisition's candidates that belonged to the previous owner or had none. A candidate given to someone else by hand keeps that owner.
CandidateOwnerWriterequest body1 field
FieldTypeRequiredNote
ownerIdintegeroptional, null clears itA user id. null, 0 or a missing key leaves the candidate without an owner.
BudgetRefusalrequest body1 field
FieldTypeRequiredNote
reasonstringrequiredTrimmed; at least 3 characters, or the answer is 400 with code REASON_REQUIRED. Cut to 1000 characters and stored on the requisition.
CompetencySuggestrequest body2 fields
FieldTypeRequiredNote
jobTitlestringrequiredBlank is refused with 400.
jobDescriptionstringoptional
JobDescriptionSuggestrequest body1 field

The whole body is passed to the model as context, so the other fields of the requisition form may be sent with it.

FieldTypeRequiredNote
jobTitlestringrequiredBlank is refused with 400.
CandidateStageWriterequest body1 field
FieldTypeRequiredNote
stagestringrequiredSourced, Screen, Interview, Offer, Hired or Rejected, in any capitalisation.
CandidateRejectrequest body2 fields
FieldTypeRequiredNote
sendEmailbooleanoptionalWhether the candidate is sent the rejection email.
reasonstringoptional
InterviewReschedulerequest body3 fields
FieldTypeRequiredNote
scheduledAtstring (date-time)requiredText that is not a date is refused with 400, code INVALID_TIME.
durationMinsintegeroptional
allowOverlapbooleanoptionalOnly the value true books the time although the interviewer already has an interview then.
InterviewCancelrequest body1 field
FieldTypeRequiredNote
reasonstringoptionalCut to 500 characters.
DraftForRequisitionrequest body1 field

Asks for a generated draft: interview questions, or an offer template.

FieldTypeRequiredNote
jobPostingIdintegeroptionalThe requisition used as context. Without it the draft is written for a general role.
OfferGatePolicyWriterequest body1 field
FieldTypeRequiredNote
requireScorecardsBeforeOfferbooleanrequiredAnything that is not true or false is refused with 400.
OfferApproverequest body1 field
FieldTypeRequiredNote
termsVersionstringoptionalThe version of the terms the approver saw; cut to 64 characters. When it no longer matches the stored terms the answer is 409, code OFFER_TERMS_CHANGED.
OfferRejectrequest body1 field
FieldTypeRequiredNote
reasonstringoptional
OfferDeclineReasonrequest body1 field
FieldTypeRequiredNote
reasonstringoptionalTrimmed and cut to 2000 characters. Blank, or anything that is not text, clears the stored reason.
OfferRescindRequestrequest body1 field
FieldTypeRequiredNote
reasonstringrequiredBlank is refused with 400, code REASON_REQUIRED.
OfferSendrequest body1 field
FieldTypeRequiredNote
offerTemplateIdinteger | nulloptionalThe offer template the contract is generated from. null sends the offer with no template; a missing key keeps the template already on the offer.
AssistantQueryrequest body1 field
FieldTypeRequiredNote
querystringrequiredThe question. The streaming route refuses a blank one with 400.
FeedbackRefinerequest body1 field
FieldTypeRequiredNote
textstringrequiredThe feedback text to tidy.
JobAlertSubscriberequest body4 fields
FieldTypeRequiredNote
emailstringrequiredTrimmed, lower-cased and cut to 200 characters; must look like an address.
consentbooleanrequiredMust be true.
departmentstringoptionalCut to 120 characters. Without it the alert covers every department.
localestringoptionalCut to 8 characters.
JobAlertTokenrequest body1 field
FieldTypeRequiredNote
tokenstringrequiredThe token from the link in the email.
SelfScheduleChoicerequest body1 field
FieldTypeRequiredNote
chosenstring (date-time)requiredOne of the times offered by the GET on the same path; any other time is refused with 400, code SLOT_NOT_OFFERED.

Related reference