hyreflow
Integrations

Ashby

Post a job to Ashby: title, team, location, employment type, interview plan, template and brand. BYOK-only, production writes.

Use Ashby to stand up a role directly in the customer's ATS: create a job with its team, location and employment type, open it, and publish the candidate-facing posting. Hyreflow reads only the department list, to resolve a teamId and verify the key.

Free (BYOK). Ashby writes cost no credits. Connect your own Ashby API key from the dashboard Integrations page. The key needs Ashby's jobsWrite permission, granted per module under the API-key settings in Ashby — without it the call comes back 403 missing_endpoint_permission. list_departments is the free connection check: it verifies the key and returns the departments a teamId comes from.

Capability

ToolDoesCost
create_jobCreate a job in Draft statusFree
set_job_statusMove a job between Draft, Open, Closed and ArchivedFree
create_job_postingCreate (and optionally publish) the candidate-facing postingFree

create_job parameters

Ashby's schema is closed — any field not in this table is rejected outright.

FieldTypeRequiredNotes
titlestringyesThe job title.
teamIdUUIDyesThe department/team the job belongs to.
locationIdUUIDyesThe job's location.
defaultInterviewPlanIdUUIDnoA job cannot be opened without one; omitting it here just defers setting it.
jobTemplateIdUUIDnoOnly an active template may be used.
employmentTypestringnoOne of FullTime, PartTime, Intern, Contract, Temporary.
brandIdUUIDnoThe brand the job publishes under.

teamId, locationId, defaultInterviewPlanId, jobTemplateId and brandId are Ashby UUIDs. list_departments returns the teamId values; the rest Hyreflow does not look up, so ask the user for them, or have them read the ids out of Ashby's admin URLs (Departments, Locations, Job Templates, Brands). Never guess a UUID — a wrong id is a failed write, and Ashby doesn't say which field was wrong.

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 response is {success, results}; the new job's id is results.id.

Ashby answers a rejected write with HTTP 200 and success: false. Hyreflow turns that into an error rather than a fake success — treat any error text as "the job was not created", and check Ashby before retrying a timed-out call. There is no idempotency key, so a blind retry can create a duplicate.

set_job_status parameters

FieldTypeRequiredNotes
job_idUUIDyesThe job to move.
statusstringyesDraft, Open, Closed or Archived.
close_reason_idUUIDonly with ClosedAccepted 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 parameters

This is the call that puts a role on a careers page — Ashby models the posting as a separate object from the job, so create_job alone publishes nothing.

FieldTypeRequiredNotes
jobIdUUIDyesThe job the posting belongs to.
titlestringnoDefaults to the parent job's title.
descriptionobjectrequired to publish{"type": "text/html", "value": "<p>…</p>"}.
statusstringnoDraft (default) or Published.
workplaceTypestringnoOnSite, Hybrid, Remote.
isListedbooleannoDefaults to true; forced false when the parent job is confidential.
locationIdUUIDnoInherits the job's location.
secondaryLocationIdsarray of UUIDnoAdditional locations.
applicationFormDefinitionIdUUIDnoFalls back to the org's default form.

The posting defaults to Draft — pass "status": "Published" to go live, and a published posting must carry a description.

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.

What creating a job does not do

  • The job is created in Draft. Opening it is set_job_status, above, and it can't be opened at all until it has a default interview plan.
  • Nothing appears on a careers page yet. Ashby models the candidate-facing posting as a separate object from the job; create_job_posting, above, creates and optionally publishes it.
  • confidential cannot be set through the API, on create or update.

This is a write into the customer's own ATS. Confirm the exact payload — title, team, location, employment type — with the user before executing.

On this page