SmartRecruiters
Post a job to SmartRecruiters: title, location, industry, function, experience level, employment type, compensation band, multi-section job ad and custom job properties. BYOK-only, production writes.
Use SmartRecruiters to stand up a role directly in the customer's ATS, and publish it. It is a write target — Hyreflow reads only the department list, to verify the token.
Free (BYOK). SmartRecruiters writes cost no credits. Connect your own SmartToken, minted in the
customer's SmartRecruiters Credential Manager, from the dashboard Integrations page. list_departments is the free connection check: it verifies the key and returns the configured departments. There is no sandbox
host either — a test job is a real job in the account.
Capability
| Tool | Does | Cost |
|---|---|---|
create_job | Create a job (unpublished) | Free |
publish_job | Publish a created job's default ad | Free |
create_job parameters
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | yes | 1–256 characters. |
location | object | yes | Full details or a predefined identifier — see below. |
location.countryCode | string | in details form | 2-letter ISO country code. |
location.city | string | in details form | 1–128 characters. |
location.regionCode | string | no | Region/state code. |
location.region | string | no | Region/state name. |
location.address | string | no | Street address, 1–2000 characters. |
location.postalCode | string | no | 1–32 characters. |
location.longitude / location.latitude | number or string | no | Workplace coordinates. |
location.remote | boolean | no | The role is remote. |
location.hybrid | boolean | no | The role is hybrid. |
location.hybridDescription | string | no | Max 60 characters. |
location.identifier | string | mutually exclusive with the detail-only fields above | 3–64 characters, a predefined location configured for the company. remote, hybrid and hybridDescription may accompany it. |
industry.id | string | yes | An industry id from the account's reference data. |
function.id | string | yes | A job-function id from the account's reference data. |
experienceLevel.id | string | yes | e.g. entry_level, associate, mid_senior_level, director, executive, internship, not_applicable. |
typeOfEmployment.id | string | no | e.g. permanent, contract, part-time, intern. |
department.id | string | no | A configured department id. |
eeoCategory.id | string | no | SmartRecruiters publishes no list of valid values. |
refNumber | string | no | Max 63 characters, must be unique — a reused one is refused. |
targetHiringDate | date-time | no | When the role should be filled. |
template | boolean | no | Create a job template rather than a job. |
compensation.min / compensation.max | number or null | no | Pay range. |
compensation.currency | string or null | no | Unsupported code is refused. |
compensation.period | string or null | no | HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY. |
jobAd.sections.companyDescription | object | no | title + text (max 24,999 chars). |
jobAd.sections.jobDescription | object | no | title + text (max 24,999 chars). |
jobAd.sections.qualifications | object | no | title + text (max 24,999 chars). |
jobAd.sections.additionalInformation | object | no | title + text (max 24,999 chars). |
jobAd.sections.videos | object | no | urls, an array of video URLs shown on the ad. |
jobAd.language.code | string | required whenever jobAd.language is sent | The ad's language code. |
jobAd.language.label / jobAd.language.labelNative | string | no | English / native language label. |
properties | array | no | id (1–1000 chars) + value.id (1–256 chars) + value.label — the company's own custom job properties. |
location is one shape or the other
Send either full details (countryCode + city required) or a single identifier naming a predefined
location. Those two sets are mutually exclusive — a payload carrying 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",
"refNumber": "ENG-014",
"location": {"countryCode": "DE", "city": "Berlin", "remote": false},
"industry": {"id": "internet"},
"function": {"id": "engineering"},
"experienceLevel": {"id": "mid_senior_level"},
"typeOfEmployment": {"id": "permanent"},
"compensation": {"min": 90000, "max": 120000, "currency": "EUR", "period": "YEARLY"},
"jobAd": {"sections": {"jobDescription": {"title": "About the role",
"text": "Own the deployment platform."}},
"language": {"code": "en"}}
}'The response is a 201 Created with the full job, including its id, status and postingStatus.
An unrecognized properties[].id or value is silently dropped, not rejected. A typo returns 201
with the property simply missing. Get exact ids from the client and read the created job back to
confirm custom fields landed.
publish_job parameters
Every field is optional — the job just needs to exist.
| Field | Type | Notes |
|---|---|---|
visibility | string | 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, not a miss.
Publishing needs the vendor's jobs_publications_manage permission — a token that can create jobs
cannot necessarily publish them. It is also paced at 2 requests/second rather than 10. Four refusals
are worth recognizing: PUBLISHED_JOB_AD_LIMIT_REACHED (the account's 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.
What creating a job does not do
- The job is not published. Publishing is
publish_job, above, and there's nostatusfield on the create request. - The creator is the credential.
creatorand the hiring process come from the authenticated token and cannot be set here.
Rejections come back with a typed error code — INDUSTRY_NOT_FOUND, FUNCTION_NOT_FOUND,
EXPERIENCE_LEVEL_NOT_FOUND, CITY_NOT_FOUND, COUNTRY_CODE_NOT_RECOGNIZED,
LOCATION_IDENTIFIER_NOT_FOUND, REF_NUMBER_ALREADY_EXISTS, COMPENSATION_INVALID_CURRENCY and
others — naming the exact field to fix. Relay it rather than retrying blind. The API paces at 10
requests/second.
Smartlead
Outbound email campaign management: create, sequence, schedule, push leads, and monitor. Key gotcha: status is START (not STARTED), and sends are approval-gated.
SourceWhale
Recruiting outreach sequencer: push sourced candidates into existing campaigns and report. Key gotcha: there is no create-campaign API; the campaign must already exist in the UI.