Post a job to Ashby via its API — create a job with a title, team, location, employment type, interview plan, template and brand. BYOK-only.
Ask for the outcome and your agent composes the run itself. Or start from a skill, a whole pipeline it already knows end to end.
browse all skills →Every tool ships with a written playbook, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.
Read the Ashby docs →Ashby is BYOK-only. Connect your own Ashby API key in Integrations; the key needs Ashby's
jobsWrite permission. There is no managed-key fallback and the write costs 0 Hyreflow credits. list_departments is the free connection check: it verifies the key and returns the departments a teamId comes from.
create_job(payload) posts a job. Three fields are required, and the schema is closed: any field not
listed here is rejected.
title (required) — the job title.teamId (required) — UUID of the department/team.locationId (required) — UUID of the job's location.defaultInterviewPlanId — UUID; a job cannot be opened without one.jobTemplateId — UUID; only an active template may be used.employmentType — FullTime, PartTime, Intern, Contract, Temporary.brandId — UUID of the brand the job publishes under.hyreflow tools execute ashby_create_job --payload '{
"title": "Senior Platform Engineer",
"teamId": "f9e52a51-a075-4116-a7b8-484deba69004",
"locationId": "3ae2b801-19f6-41ef-ad28-214bd731948f",
"employmentType": "FullTime"
}'
The new job's id is results.id.
list_departments returns the teamId values. locationId, defaultInterviewPlanId,
jobTemplateId and brandId are Ashby UUIDs Hyreflow does not look up. Ask the user for them, or have them read the ids out of Ashby
(Departments, Locations, Job Templates, Brands each show the id in the admin URL). Never invent a UUID —
a wrong id is a failed write.
set_job_status(job_id, status) moves a job between Draft, Open, Closed and Archived.
close_reason_id is accepted only alongside Closed. A job can't move to Open until it has a default
interview plan — set defaultInterviewPlanId at create time or the open fails.
hyreflow tools execute ashby_set_job_status --payload '{
"job_id": "1be42b8e-cafd-4beb-8121-f4981eb20f42",
"status": "Open"
}'
create_job_posting(payload) creates the candidate-facing posting — the object that actually puts a
role on a careers page. Only jobId is required; the posting defaults to Draft, so pass
"status": "Published" to go live, and a published posting must carry a description.
jobId (required) — the job the posting belongs to.title — defaults to the parent job's title.description — required to publish — {"type": "text/html", "value": "<p>…</p>"}.status — Draft (default) or Published.workplaceType — OnSite, Hybrid, Remote.isListed — defaults to true; forced false when the parent job is confidential.locationId — inherits the job's location.secondaryLocationIds — additional locations.applicationFormDefinitionId — falls back to the org default form.hyreflow tools execute ashby_create_job_posting --payload '{
"jobId": "1be42b8e-cafd-4beb-8121-f4981eb20f42",
"description": {"type": "text/html", "value": "<p>Own the deployment platform.</p>"},
"status": "Published",
"workplaceType": "Hybrid"
}'
Publishing is public and irreversible in the way that matters — candidates can see it. Confirm with the
user before the Published call, not after.
success: false — treat any error text as "not
created", not a partial success.Draft. Opening it is set_job_status, above, and it cannot open at all until
it has a default interview plan.create_job_posting, above.confidential cannot be set through the API, on create or update.