Post a job to Lever via its Data API — create a posting with a title, team/department/location categories, description, requirement lists, workplace type, salary range, tags and requisition codes. 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 Lever docs →Lever calls a job a posting.
Lever is BYOK-only. Connect your own Lever API key in Integrations; a Lever Super Admin mints it
under Settings → Integrations and API. There is no managed-key fallback and the write costs 0 Hyreflow
credits. list_users is the free connection check: it verifies the key and returns the users a perform_as comes from.
perform_as userLever has no system actor — every posting is attributed to a real Lever user, passed as
perform_as in the payload; it is sent as the query parameter Lever requires, not as a body field.
That user becomes the creator and, unless owner says otherwise, the owner.
Ask the user whose Lever account the posting should be created under; do not guess.
create_job(payload) posts a job. Required: perform_as and text, plus categories.team,
categories.department and categories.location.
perform_as (required) — the Lever user the posting is created as; sent as a query parameter.text (required) — the posting title.categories.team / categories.department / categories.location (all required).categories.commitment — Full-time, Part-time, Internship, …categories.allLocations — additional locations.state — published, internal, closed, draft, pending, rejected — defaults to draft.distributionChannels — internal, public — defaults to BOTH.owner / hiringManager — Lever user ids.tags — extra posting tags.content.descriptionHtml, content.lists ([{text, content}]), content.closingPostingHtml.salaryDescriptionHtml, salaryRange ({currency, interval, min, max}).workplaceType — onsite, remote, hybrid.requisitionCodes.hyreflow tools execute lever_create_job --payload '{
"text": "Senior Platform Engineer",
"state": "draft",
"categories": {"team": "Engineering", "department": "Technology", "location": "Berlin"},
"perform_as": "8d49b010-cc6a-4f40-ace5-e86061c677ed"
}'
The posting id is data.id; data.urls carries the live list/show/apply links once published.
set_job_state(posting_id, perform_as) is a partial update — POST /postings/{id} — that changes only
what it sends. state defaults to published, taking a draft posting live on the sites named by its
distributionChannels.
hyreflow tools execute lever_set_job_state --payload '{
"posting_id": "730e37db-93d3-4acf-b9de-7cfc397cef1d",
"perform_as": "8d49b010-cc6a-4f40-ace5-e86061c677ed"
}'
The same call moves a posting to any other state — internal, closed, draft, pending, rejected —
and takes an optional payload of the create fields to change alongside it. Read the posting first so a
partial update doesn't clobber a concurrent edit in Lever Hire; updating through the API skips the
approvals chain, exactly like creating does.
state defaults to draft — the posting is not live unless "state": "published" is sent.distributionChannels defaults to BOTH public and internal — say ["internal"] to keep it internal.state and distributionChannels before executing.state is draft unless told otherwise.