Post a job to SmartRecruiters via its Jobs API — create a job with a title, location (details or a predefined identifier), industry, function, experience level, employment type, compensation band and a multi-section job ad. 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 SmartRecruiters docs →SmartRecruiters is BYOK-only. Connect your own SmartToken (minted in the SmartRecruiters Credential
Manager) in Integrations; 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 configured departments. There is no sandbox host — a test job
is a real job in the account.
create_job(payload) posts a job. Required: title, location, industry.id, function.id,
experienceLevel.id.
title (required) — 1–256 characters.location (required) — either full details or a predefined-location identifier (see below).industry.id / function.id / experienceLevel.id (all required) — ids from the account's own
reference data (e.g. entry_level, associate, mid_senior_level, director, executive).typeOfEmployment.id — e.g. permanent, contract, part-time, intern.department.id — a configured department.refNumber — max 63 characters, must be unique — a reused one is refused.targetHiringDate, template (create a template instead of a job).compensation — {min, max, currency, period}; period is HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY.jobAd.sections — companyDescription, jobDescription, qualifications, additionalInformation
(each {title, text}, text max 24,999 chars), plus videos.urls.jobAd.language — {code, label, labelNative}; code required whenever language is sent.properties — [{id, value: {id, label}}], the company's own custom job properties.location is one shape or the otherSend either full details — countryCode + city required, with optional region, regionCode,
address, postalCode, longitude, latitude, remote, hybrid, hybridDescription — or a single
identifier naming a predefined location. Those two sets are mutually exclusive; a payload with
both is rejected. remote, hybrid and hybridDescription belong to BOTH shapes and stay legal with either.
hyreflow tools execute smartrecruiters_create_job --payload '{
"title": "Senior Platform Engineer",
"location": {"countryCode": "DE", "city": "Berlin", "remote": false},
"industry": {"id": "internet"},
"function": {"id": "engineering"},
"experienceLevel": {"id": "mid_senior_level"}
}'
publish_job(job_id, payload) publishes the job's default ad. Every field is optional:
visibility — PUBLIC or INTERNAL.aggregators — boolean, also push to job aggregators.includeInternal — boolean, publish internally alongside the public ad.delayPublicInDays — integer, hold the public posting back this many days.hyreflow tools execute smartrecruiters_publish_job --payload '{"job_id": "<job id>", "visibility": "PUBLIC"}'
It answers 204 with no body, so an empty result is success. Publishing needs the vendor's
jobs_publications_manage permission — a token that can create jobs cannot necessarily publish them —
and is paced at 2 requests/second rather than 10. Four refusals are worth recognizing:
PUBLISHED_JOB_AD_LIMIT_REACHED (the plan cap), NOT_AUTHORIZED_TO_PUBLISH_JOB (also fires when the job
needs approval first), and COMPENSATION_REQUIRED / COMPENSATION_HIDDEN when the account's
configuration disagrees with the job's compensation.
properties[].id or value — a typo returns 201
with the property missing. Read the created job back to confirm custom fields landed.INDUSTRY_NOT_FOUND, CITY_NOT_FOUND,
REF_NUMBER_ALREADY_EXISTS, COMPENSATION_INVALID_CURRENCY, …) naming the exact field — relay it
rather than retrying blind.publish_job, above, and there's no status field on create.