---
title: "Update a job"
method: PATCH
path: "/jobs/{id}"
tags: ["Jobs"]
---

# Update a job

`PATCH /jobs/{id}`

Partial update; only the fields you send change. The arrays (`locations`, `qualifications`, `questions`, `budgets`) are replace-sets: what you send becomes the entire new set. Live (ACTIVE/PAUSED) jobs are re-validated after the patch and the whole change is rejected if it would leave the listing incomplete. Once a job has applications, `qualifications` and `questions` are frozen.

## Path parameters

- `id` integer, required

## Request body

- JobInput — All fields optional; arrays use replace semantics (the set you send becomes the entire new set).
  - `title` string
  - `description` string
  - `remoteOption` 'REMOTE' | 'HYBRID' | 'IN_PERSON' | 'null', nullable
  - `remoteCountry` string, nullable — Where remote employees may work (REMOTE jobs).
  - `jobType` 'FULL_TIME' | 'PART_TIME' | 'CONTRACT' | 'INTERNSHIP' | 'null', nullable
  - `jobLevel` 'ENTRY' | 'MID' | 'SENIOR' | 'null', nullable
  - `locations` LocationInput[]
    - `locationId` integer, required
    - `city` string, required
    - `stateProvince` string, required
    - `country` string, required
  - `salaryMin` integer, nullable — Whole dollars
  - `salaryMax` integer, nullable
  - `salaryPeriod` 'ANNUAL' | 'HOURLY' | 'null', nullable
  - `bidPerQualifiedApplicantCents` integer, nullable — What you pay per qualified applicant, in cents.
  - `opportunityId` string, nullable — Your id for this opening on your source ATS. Optional; used by post-application flows to route submitted applications back.
  - `atsJobUrl` string, uri, nullable — Canonical job URL on your source ATS. Optional; used by post-application flows alongside opportunityId.
  - `qualifications` QualificationInput[]
    - `text` string, required
    - `kind` 'REQUIRED' | 'DESIRED', required
    - `order` integer, required
  - `questions` QuestionInput[] — Custom screening questions only. The applicant basics - first and last name, email, phone, location, and resume - are collected automatically on every application; never send them as questions.
    - `prompt` string, required
    - `answerFormat` 'TEXT' | 'TEXTAREA' | 'SINGLE_SELECT' | 'MULTI_SELECT' | 'NUMBER' | 'FILE' | 'DATE' | 'SINGLE_CHECKBOX', required — SINGLE_SELECT (pick exactly one option), MULTI_SELECT (pick one or more options), SINGLE_CHECKBOX (a single boolean toggle), and the freeform/typed formats (TEXT, TEXTAREA, NUMBER, FILE, DATE).
    - `options` string[] — For SINGLE_SELECT and MULTI_SELECT.
    - `order` integer, required
  - `budgets` BudgetInput[]
    - `window` 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'LIFETIME', required
    - `budgetCents` integer, required
    - `notes` string, nullable

## Response `200`

The updated job.

- Job — The full job, as the dashboard sees it.
  - `id` integer — Stable cross-service job id (`svcAtsId`).
  - `title` string
  - `status` 'DRAFT' | 'ACTIVE' | 'PAUSED' | 'CLOSED' | 'EXPIRED'
  - `description` string
  - `remoteOption` 'REMOTE' | 'HYBRID' | 'IN_PERSON' | 'null', nullable
  - `remoteCountry` string, nullable
  - `jobType` 'FULL_TIME' | 'PART_TIME' | 'CONTRACT' | 'INTERNSHIP' | 'null', nullable
  - `jobLevel` 'ENTRY' | 'MID' | 'SENIOR' | 'null', nullable
  - `salaryMin` integer, nullable
  - `salaryMax` integer, nullable
  - `salaryPeriod` 'ANNUAL' | 'HOURLY' | 'null', nullable
  - `bidPerQualifiedApplicantCents` integer, nullable
  - `opportunityId` string, nullable — Partner id for this opening on the source ATS.
  - `atsJobUrl` string, uri, nullable — Canonical job URL on the source ATS.
  - `companyId` string
  - `locations` LocationSuggestion[]
    - `locationId` integer
    - `displayName` string
    - `city` string
    - `stateProvince` string
    - `country` string
  - `qualifications` object[]
    - `text` string, required
    - `kind` 'REQUIRED' | 'DESIRED', required
    - `order` integer, required
    - `id` string
  - `questions` object[]
    - `prompt` string, required
    - `answerFormat` 'TEXT' | 'TEXTAREA' | 'SINGLE_SELECT' | 'MULTI_SELECT' | 'NUMBER' | 'FILE' | 'DATE' | 'SINGLE_CHECKBOX', required — SINGLE_SELECT (pick exactly one option), MULTI_SELECT (pick one or more options), SINGLE_CHECKBOX (a single boolean toggle), and the freeform/typed formats (TEXT, TEXTAREA, NUMBER, FILE, DATE).
    - `options` string[] — For SINGLE_SELECT and MULTI_SELECT.
    - `order` integer, required
    - `id` string
  - `budgets` BudgetInput[]
    - `window` 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'LIFETIME', required
    - `budgetCents` integer, required
    - `notes` string, nullable
  - `applicationCounts` object
    - `pending` integer
    - `accepted` integer
    - `rejected` integer
  - `isFrozen` boolean — True once the job has applications. Qualifications/questions locked.
  - `newApplicantCount` integer
  - `publishedAt` string, date-time, nullable
  - `expiresAt` string, date-time, nullable
  - `closedAt` string, date-time, nullable

## Other responses

- `401` — Missing, unknown, or revoked partner key.
- `404` — No such job for this key (including other companies' jobs).
- `409` — JOB_NOT_EDITABLE (closed/expired) or JOB_FROZEN (has applications).
- `422` — Bad input or incomplete listing; `fields` names each problem.

---

[API](https://skmtc.dev/sorce/apis/sorce-api.md) · [All operations](https://skmtc.dev/sorce/apis/sorce-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/sorce/sorce-api/revisions/7ddcdb67bc2c/schema)
