Jobs

Update job

Updates mutable job attributes. Preserves domain-level validation rules.

put/jobs/{id}

Request

  • Base URL: https://api.100hires.com/v2
  • URL: https://api.100hires.com/v2/jobs/{id}
  • Auth: HTTP bearer

Path parameters

idstring required

Job ID (numeric) or alias

Query parameters

includestring

Comma-separated list of related resources to include. Supported: workflow, hiring_team, pipeline_stages.

Request body

form_idinteger

Application form ID to assign to this job. Replaces the job's active form; the previous link is kept inactive. The response's form_id reflects the new form.

statusstring

Job status (e.g. Draft, Public). See GET /taxonomy/statuses.

titlestring

Public job title.

internal_titlestring

Internal-only title visible to the hiring team.

internal_job_idstring

External reference ID from your ATS or HR system.

descriptionstring

Job description (HTML allowed).

languagestring nullable

Locale the job page renders in, overriding the career site language (e.g. de-DE; underscore aliases like de_DE are normalized). Omit the field to leave the current override untouched; send null to remove it and follow the career site language. Unknown, disabled, empty and longer-than-35-character values are rejected with a 400 validation error on language. Available locales come from GET /languages.

resume_field_status'required' | 'optional' | 'hidden'

Resume field behavior on the application form.

location_citystring

Job city. Required unless is_remote is true; leave city, state and postal code empty for a nationwide remote posting on Indeed. Street, city, state, postal code and country are validated together on save, the same way the back-office form checks them: with Google Address Validation in the countries it covers, with a geocoding provider elsewhere. A confirmed location is stored as validated, so a misspelt city is corrected; a location that is unknown, suspicious (for example a city in the wrong state) or would need a part replaced is stored as sent, and the job boards tab of the job reports it until it is fixed. Components that are already confirmed are not checked again.

location_countrystring

Job country: a country name or an ISO 3166-1 alpha-2 code from the country list. Anything else is rejected with a validation error.

location_statestring

Job state or region.

location_street_addressstring

Street address.

location_full_addressstring

Accepted and ignored: the job address is assembled from street, city, state, postal code and country. Kept for compatibility.

location_postal_codestring

Postal or ZIP code.

salary_minnumber

Minimum salary.

salary_maxnumber

Maximum salary.

salary_currencystring

Salary currency code (e.g. USD, EUR).

salary_period'annually' | 'monthly' | 'daily' | 'hourly'

Salary period. A job created without it is "annually". An "annually" salary with an amount below 1000 is rejected as an hourly rate typed against the yearly period: send "hourly" instead.

is_remoteboolean

Whether this is a remote position. With an empty city, state and postal code Indeed lists it nationwide.

is_hybridboolean

Hybrid position: office days plus remote days at the job address, so location_city stays required. Requires is_remote false; sending both as true is rejected, and is_remote true on a hybrid job clears is_hybrid. Indeed lists it as Hybrid Remote, LinkedIn as Hybrid, other boards as an on-site job at that address.

job_board_remote_scope'city' | 'statewide' | 'nationwide' | 'null' nullable

How a remote job is listed on Indeed: city (default) keeps the address, statewide sends the state alone, nationwide the country alone. Other boards always get the full address. Non-city requires is_remote true, statewide also location_state; null resets to city.

employment_type_idinteger

Employment type ID from GET /taxonomy/employment-types.

department_idinteger

Department ID from GET /taxonomy/departments.

category_idinteger

Job category ID from GET /taxonomy/categories.

education_level_idinteger

Education level ID from GET /taxonomy/education-levels.

experience_level_idinteger

Experience level ID from GET /taxonomy/experience-levels.

workflow_idinteger

Workflow ID to assign to this job.

parent_job_idinteger

Canonical parent job ID. If provided, the job becomes a satellite job.

Example request

{
  "language": "de-DE"
}

Response

Updated job

idinteger required

Unique identifier

aliasstring nullable

Short alphanumeric alias used in UI URLs. Use this to build job links — https://app.100hires.com/job/{alias}/candidates/pipeline. Also accepted as {id} in API requests.

company_idinteger required

ID of the company this job belongs to

titlestring required

Public job title shown to candidates

internal_titlestring nullable

Internal job title visible only to the hiring team

internal_job_idstring nullable

Company's internal job identifier (e.g. requisition number)

descriptionstring

Job description (HTML). Present only when view=full (default); omitted entirely when view=summary to keep list responses inside the agent context budget. Use GET /jobs/{id} or view=full to retrieve.

resume_field_status'required' | 'optional' | 'hidden' nullable

Whether resume upload is required, optional, or hidden on the application form

urlstring required

Public URL of the job posting page

url_backofficestring

Backoffice URL — opens the job's pipeline view inside the recruiter app (https://app.100hires.com/job/{alias}/candidates/pipeline). Use this to link agent widgets / UI to the in-app job page rather than the public career page.

is_remoteboolean required

Whether this is a remote position

is_hybridboolean required

Whether this is a hybrid position: office days plus remote days at the job address. Never true together with is_remote.

job_board_remote_scope'city' | 'statewide' | 'nationwide' nullable

How a remote job is listed on Indeed: city, statewide or nationwide. Null when the job is not remote.

statusstring required

Job status: open, closed, draft, or archived

workflow_idinteger nullable

ID of the hiring workflow (pipeline) assigned to this job

form_idinteger nullable

ID of the application form candidates fill in for this job — the form attached to the job, or the company default form when the job has none attached yet (the same rule the public apply page follows). null only when the company has no forms. Fetch the questions with GET /forms/{id}. Present in both view=full and view=summary.

salary_minnumber nullable

Minimum salary

salary_maxnumber nullable

Maximum salary

salary_currencystring nullable

Salary currency code (e.g. USD, EUR)

salary_period'annually' | 'monthly' | 'daily' | 'hourly' nullable

Salary period

hours_per_week_mininteger nullable

Minimum hours per week

hours_per_week_maxinteger nullable

Maximum hours per week

indeed_posting_dataobject

Indeed job board posting metadata. Present only when view=full (default); omitted entirely when view=summary.

is_satelliteboolean

Whether this job is a satellite (child) of a canonical job. Satellite jobs share the candidate pipeline of their parent.

parent_job_idinteger nullable

ID of the canonical (parent) job. Null for canonical jobs. Recruiting operations should target the canonical job.

languagestring nullable

Locale this job's public page renders in, overriding the career site language. Null means the page follows the career site language (GET /companies/career-site-settings), which in turn falls back to en-US. This is the override, not the effective language. Present in both view=full and view=summary.

created_atinteger required

Unix timestamp (seconds)

updated_atinteger required

Unix timestamp (seconds)

Example response

{
  "alias": "79SZHfT",
  "language": "de-DE"
}

Changes

No recorded changes to this operation across all 1 revision of this API.