← all tools
ATS

Ashby

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.

Cost per callBYOK · vendor billed
Your own keyrequired
CategoryATS

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 →

What your agent reads before it touches Ashby

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 →
Show the raw playbookwritten for the agent

Access

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 a job

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.
  • employmentTypeFullTime, 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.

Where the ids come from

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.

Opening the job

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"
}'

Publishing the posting

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>"}.
  • statusDraft (default) or Published.
  • workplaceTypeOnSite, 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.

Gotchas

  • Ashby answers a rejected write with HTTP 200 and success: false — treat any error text as "not created", not a partial success.
  • No idempotency key: a retried call after a timeout can create a second job. Check Ashby first.
  • This is a write into the customer's own ATS — confirm the exact payload before executing.

What creating a job does NOT do

  • The job is created in Draft. Opening it is set_job_status, above, and it cannot open at all until it has a default interview plan.
  • Nothing appears on a careers page yet — the candidate-facing posting is a separate object, created and optionally published with create_job_posting, above.
  • confidential cannot be set through the API, on create or update.