Recruitee
Post a job (or talent pool) to Recruitee: title, description, requirements, locations, department, work model and application-form location picker. BYOK-only, production writes.
Recruitee calls a job an offer, and the same endpoint creates either a real job or a talent pool. It is a write target — Hyreflow reads only the department list, to verify the token.
Free (BYOK). Recruitee writes cost no credits. Connect your own Recruitee token and your
company id or subdomain from the dashboard Integrations page. A Recruitee token is personal and
per-company: it carries exactly the permissions of whoever minted it, acts in their name, and a token
from one company isn't valid in another. list_departments is the free connection check: it verifies the key and returns the departments a department_id comes from.
Capability
| Tool | Does | Cost |
|---|---|---|
create_job | Create an offer — a job, or a talent pool via kind | Free |
set_job_state | Publish the offer, or move it to draft/closed/archived | Free |
create_job parameters
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | yes | The offer title. |
description | string | yes | The offer description. |
location_ids | array of integer | yes | Recruitee location ids — required even for a remote role, because some job boards demand the detail. |
requirements | string | yes for a job | Optional when kind is talent_pool. |
kind | string | no | job (default) or talent_pool. |
department_id | string | no | Assigns the offer to an existing department. |
on_site | boolean | one of three | Show the location as on-site. |
hybrid | boolean | no | Show the location as hybrid. |
remote | boolean | no | Show the location as remote. Defaults to false. |
visibility_options | array of string | no | Defaults to ["locations_question"], adding a location picker to the application form. |
locations_question | string | no | The picker's question text. Defaults to "What is your preferred location?". |
locations_question_type | string | no | single_choice (default) or multiple_choice. |
locations_question_required | boolean | no | Force a preferred location to be picked. |
At least one of on_site, hybrid and remote must be true — none of them defaults to true, so an
offer that names none is refused before it reaches Recruitee.
hyreflow tools execute recruitee_create_job --payload '{
"title": "Senior Platform Engineer",
"location_ids": [12345],
"description": "<p>Own the deployment platform.</p>",
"requirements": "<p>Kubernetes, Terraform, five years of platform work.</p>",
"kind": "job",
"hybrid": true
}'The response is an offer object; the id is offer.id, and offer.slug is what appears in the careers
URL.
location_ids are numeric Recruitee location ids. Hyreflow does not expose the locations endpoint,
so ask the user for them, or have them read the ids out of Recruitee's Locations settings. There is no
way to pass a location as a string on create — the derived location text on the response is
read-only.
What creating an offer does not do
Recruitee's ATS API accepts none of salary, employment type, category, experience, education, hours,
pipeline template, open questions, followers, hiring managers, or status when creating an offer — those
exist only as read-only fields on the response. Whether a fresh offer lands as draft or published is not
part of Recruitee's documented contract either.
set_job_state parameters
A created offer is a draft — this is the call that takes it live.
| Field | Type | Required | Notes |
|---|---|---|---|
offer_id | integer | yes | The offer to move. |
state | string | no | published (default), draft, closed or archived. |
hyreflow tools execute recruitee_set_job_state --payload '{"offer_id": 567441}'Recruitee moves an offer with a per-transition endpoint rather than a writable status field, so
status stays read-only on the offer itself. The response is the updated {offer}.
Publishing puts the role on your public careers site. Confirm the exact offer before the call — and
note kind decides whether you created a job or a talent pool in the first place.
kind is the only thing separating a job from a talent pool — read it back before executing, since
creating a talent pool when the user asked for a job is a silent, plausible-looking mistake. Recruitee
documents no validation-error shape, so if a create fails, re-check the required four
(title, description, requirements, location_ids) and the work-model flags rather than guessing
at the message.