Jobs
Create a job linked to an ATS job
/v1/integration/jobsCreates an Alfa job from one of your ATS's jobs, already linked to it, so no recruiter has to link it in the job form. With `publish: true` the job goes live at once and answers with status `live`, ready for `POST /v1/integration/jobs/{jobId}/sourcing`; publishing uses one of the company's job postings and spends no sourcing credits. Otherwise the job is a draft that a recruiter reviews and publishes in Alfa, or that you publish later with `POST /v1/integration/jobs/{jobId}/publish`. If publishing fails, the draft is kept and the error names its id. The job belongs to the person who created the API key. If you have not sent the ATS job with `PUT /v1/integration/ats-jobs/{externalJobId}` yet, Alfa records it as open with this title; an ATS job already sent is left as it is. Send an `Idempotency-Key` header so that a retry returns the same job instead of creating another. An unrecognised country is 422 `invalid_country`; a company that already uses another ATS integration is 409 `ats_integration_conflict`; a company with no job postings left is 402 `job_quota_exceeded`; a company that uses job slots is 409 `publish_in_alfa`, and its draft waits for a recruiter to publish it in Alfa. Requires an API key with the `jobs:write` scope.
Requires an Alfa API key as a bearer token. How API keys work
Headers
Alfa-Company-IdstringThe Company ID of the company to act for. Required with a platform key, and that company must have authorized your platform; a company key acts for its own company and can leave it out.
Idempotency-KeystringA unique value, such as a UUID, sent unchanged on every retry of one request. A retry after the request succeeded returns the same response, marked `Idempotent-Replayed: true`, without running the operation again. Reusing a key for a different request is a 422.
at least 1 characters · at most 255 characters
Request body
externalJobIdstringrequiredYour ATS's own id for the job.
at least 1 characters · at most 200 characters
titlestringrequiredThe job title.
at least 1 characters · at most 200 characters
descriptionstringrequiredThe job description. It becomes the advert as written. Unless you send `screeningCriteria`, Alfa also writes the scoring criteria from it. Markdown is allowed.
at least 50 characters · at most 20000 characters
screeningCriteriastringWhat Alfa screens candidates against, kept separate from the advert. Alfa writes the scoring criteria from this text instead of the description, and it is never published.
at least 20 characters · at most 10000 characters
citystring | nullWhere the job is. Use `locations` instead to advertise in more than one place.
countrystring | nullThe country of the job, by English name or ISO code. Defaults to the company's country.
locationsobject[]Every place to advertise the job, in place of `city` and `country`. The first is where the job is based. Each place uses its own share of sourcing credits.
at least 1 items · at most 10 items
Show fields
citystring | nullA city, town or county. Leave it out to advertise across the whole country.
countrystringrequiredThe country, by English name or ISO code.
at least 1 characters · at most 80 characters
workSetup"Remote" | "Hybrid" | "On-site"Defaults to On-site.
contractType"Permanent" | "Contract" | "Temporary"Defaults to Permanent.
salaryobjectThe pay for the job.
Show fields
minnumberrequiredThe lowest pay offered.
minimum 0
maxnumberrequiredThe highest pay offered.
minimum 0
currencystringrequiredThe currency, as an ISO 4217 code.
period"year" | "month" | "day" | "hour"requiredWhat the figures are paid per.
showOnAdvertbooleanWhether the advert shows the salary. Defaults to true.
interviewQuestionsstring[]Questions the AI interviewer asks every applicant word for word, before it asks about the role’s requirements.
at most 10 items
requireInterviewbooleanWhether applicants must take the AI Interview. They cannot skip it, and anyone who has not completed it is marked not suitable. Defaults to false.
publishbooleanPublish the job straight away, so it is live and ready for sourcing. Defaults to false, which leaves a draft for a recruiter to review and publish in Alfa.
Response body
jobIdintegerrequiredAlfa's id for the job.
externalJobIdstringrequiredThe ATS job the Alfa job is linked to.
titlestring | nullrequiredThe Alfa job title.
statusstringrequiredThe Alfa job status: `draft`, `live`, `published`, `paused` or `closed`.
applyUrlstringrequiredThe public page where candidates apply.
interviewsApplicantsbooleanrequiredWhether the job screens applicants with an AI Interview. Applicant intake then needs no resume and answers with the applicant’s interview link.
screeningQuestionsobject[]requiredThe job's screening questions. Send answers to them with applicant intake.
Show fields
questionstringrequiredThe question, as `screeningAnswers` must quote it.
typestring | nullrequiredThe answer type: `boolean`, `number`, `text` or `choice`.
mandatorybooleanrequiredWhether the job marks the question as required.
Responses
- 201Created.
- 400The request is malformed: invalid JSON, an unexpected body or an unknown query parameter. Problem details
- 401The bearer token is missing, expired or invalid. Problem details
- 403The caller may not perform this operation, or has no active organisation. Problem details
- 404The resource does not exist or is not visible to the caller. Problem details
- 409The resource is not in a state that allows this, or a request with the same `Idempotency-Key` is still running. Problem details
- 422The request failed validation; `errors` lists each invalid field. Problem details
- 429Too many requests, or the AI service is busy. Retry after a short wait. Problem details
- 500An unexpected error. Quote the `correlationId` to support. Problem details