hyreflow
Integrations

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

ToolDoesCost
create_jobCreate a job (unpublished)Free
publish_jobPublish a created job's default adFree

create_job parameters

FieldTypeRequiredNotes
titlestringyes1–256 characters.
locationobjectyesFull details or a predefined identifier — see below.
location.countryCodestringin details form2-letter ISO country code.
location.citystringin details form1–128 characters.
location.regionCodestringnoRegion/state code.
location.regionstringnoRegion/state name.
location.addressstringnoStreet address, 1–2000 characters.
location.postalCodestringno1–32 characters.
location.longitude / location.latitudenumber or stringnoWorkplace coordinates.
location.remotebooleannoThe role is remote.
location.hybridbooleannoThe role is hybrid.
location.hybridDescriptionstringnoMax 60 characters.
location.identifierstringmutually exclusive with the detail-only fields above3–64 characters, a predefined location configured for the company. remote, hybrid and hybridDescription may accompany it.
industry.idstringyesAn industry id from the account's reference data.
function.idstringyesA job-function id from the account's reference data.
experienceLevel.idstringyese.g. entry_level, associate, mid_senior_level, director, executive, internship, not_applicable.
typeOfEmployment.idstringnoe.g. permanent, contract, part-time, intern.
department.idstringnoA configured department id.
eeoCategory.idstringnoSmartRecruiters publishes no list of valid values.
refNumberstringnoMax 63 characters, must be unique — a reused one is refused.
targetHiringDatedate-timenoWhen the role should be filled.
templatebooleannoCreate a job template rather than a job.
compensation.min / compensation.maxnumber or nullnoPay range.
compensation.currencystring or nullnoUnsupported code is refused.
compensation.periodstring or nullnoHOURLY, DAILY, WEEKLY, MONTHLY, YEARLY.
jobAd.sections.companyDescriptionobjectnotitle + text (max 24,999 chars).
jobAd.sections.jobDescriptionobjectnotitle + text (max 24,999 chars).
jobAd.sections.qualificationsobjectnotitle + text (max 24,999 chars).
jobAd.sections.additionalInformationobjectnotitle + text (max 24,999 chars).
jobAd.sections.videosobjectnourls, an array of video URLs shown on the ad.
jobAd.language.codestringrequired whenever jobAd.language is sentThe ad's language code.
jobAd.language.label / jobAd.language.labelNativestringnoEnglish / native language label.
propertiesarraynoid (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.

FieldTypeNotes
visibilitystringPUBLIC or INTERNAL.
aggregatorsbooleanAlso push to job aggregators.
includeInternalbooleanPublish internally alongside the public ad.
delayPublicInDaysintegerHold 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 no status field on the create request.
  • The creator is the credential. creator and 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.

On this page