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

# Update a job

`PATCH /v1/jobs/{jobId}`

## Request

- Base URL: `https://api.workwing.io`
- URL: `https://api.workwing.io/v1/jobs/{jobId}`
- Auth: HTTP bearer

Update one job. Send only the fields to change; the response is the updated job.

`status` is not writable here: move the lifecycle with `POST /v1/jobs/{jobId}/status`, and assign people with `POST /v1/jobs/{jobId}/assignments`.

Requires an `Idempotency-Key` header.

## Path parameters

- `jobId` string, uuid, required

## Query parameters

- `select` string

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `status` 'T_PENDING' | 'T_SCHEDULED' | 'T_ASSIGNED' | 'T_IN_PROGRESS' | 'T_ON_HOLD' | 'T_INCOMPLETE' | 'T_REBOOK' | 'T_COMPLETED' | 'T_CANCELLED' | 'T_FAILED': Filterable, not writable here. Sending it answers 409 `E_AP_4011`; move the lifecycle with `POST /v1/jobs/{id}/status`.
  - `priority` 'T_LOW' | 'T_NORMAL' | 'T_HIGH' | 'T_URGENT'
  - `title` string
  - `notes` string
  - `internal_notes` string: Staff-only notes. Accepted on update but never returned over the API.
  - `scheduled_start` string, date-time
  - `scheduled_end` string, date-time

## Response `200`

The updated job

- object: The updated job
  - `data` object
    - `id` string, uuid
    - `brand_id` string, uuid
    - `customer_id` string, uuid
    - `location_id` string, uuid, nullable: The customer location the job is at
    - `template_id` string, uuid, nullable: Null on a project created without a sign-off job type
    - `created_by_user_id` string, uuid
    - `resource_group_id` string, uuid, nullable
    - `parent_job_id` string, uuid, nullable: The same value as `project_id`, under its column name.
    - `job_schedule_id` string, uuid, nullable: The recurring schedule that generated this job, if any.
    - `scheduled_instance_date` string, date, nullable: For a job generated by a recurring schedule, the occurrence date it was generated for.
    - `source_observation_id` string, uuid, nullable: The field observation this job was raised from, if any.
    - `job_number` string, nullable: Human-readable job identifier
    - `title` string, nullable: Optional name for the job, shown instead of its number
    - `status` 'T_PENDING' | 'T_SCHEDULED' | 'T_ASSIGNED' | 'T_IN_PROGRESS' | 'T_ON_HOLD' | 'T_INCOMPLETE' | 'T_REBOOK' | 'T_COMPLETED' | 'T_CANCELLED' | 'T_FAILED'
    - `status_notes` string, nullable: Free-text note recorded with the latest status change
    - `status_reason_code` 'T_REASON_CUSTOMER_NOT_AVAILABLE' | 'T_REASON_ACCESS_DENIED' | 'T_REASON_WRONG_EQUIPMENT' | 'T_REASON_SAFETY_CONCERN' | 'T_REASON_ALREADY_COMPLETED' | 'T_REASON_INCORRECT_ADDRESS' | 'null', nullable: Preset reason recorded with the latest status change. Null when none was picked.
    - `priority` 'T_LOW' | 'T_NORMAL' | 'T_HIGH' | 'T_URGENT' | 'null', nullable
    - `source` 'T_WEB' | 'T_API' | 'T_IMPORT': Where the job was created: in the app, through the API, or by a CSV import.
    - `notes` string, nullable
    - `scheduled_start` string, date-time, nullable
    - `scheduled_end` string, date-time, nullable
    - `is_schedule_locked` boolean: Whether the schedule is pinned. Not writable over the API: a job is locked and unlocked in the app by someone allowed to reschedule locked jobs. On a locked job, an API key that changes scheduled_start or scheduled_end is refused with E_DB_1111.
    - `route_sequence` integer, nullable: Position in the assigned resource's route for the day
    - `started_at` string, date-time, nullable
    - `completed_at` string, date-time, nullable
    - `completion_locked` boolean: Whether the completed job is locked against further edits
    - `sla_response_due_at` string, date-time, nullable
    - `sla_resolution_due_at` string, date-time, nullable
    - `operator_form_data` object, nullable: Operator-captured form data (JSON object)
    - `resource_form_data` object, nullable: Resource-captured form data (JSON object)
    - `operator_form_snapshot` object, nullable: The job type's operator form as it stood when the job was created.
    - `resource_form_snapshot` object, nullable: The job type's resource form as it stood when the job was created.
    - `resource_form_progress` object, nullable: Where the resource has got to in a multi-step form.
    - `integration_responses` object, nullable: Responses recorded by integrations that ran on the job.
    - `external_references` object[]: References to this job in external systems (at most 20)
      - `provider` string, required
      - `type` string, required
      - `ref` string, required
      - `url` string, uri
    - `tracking_id` string: The id in the job's customer tracking link.
    - `verification_code` string, nullable: Code the customer reads to the resource on arrival, when the brand enables verification
    - `created_at` string, date-time, nullable
    - `updated_at` string, date-time, nullable
    - `kind` 'T_STANDARD' | 'T_PROJECT': `T_PROJECT` owns a pool of jobs; `T_STANDARD` is an ordinary job, which is also what each job in a project is.
    - `project_id` string, uuid, nullable: The project this job belongs to, if any.
    - `child_count` integer: Jobs attached to this job when it is a project.
    - `child_completed_count` integer: Attached jobs in a completed state.
  - `meta` object
    - `request_id` string
    - `timestamp` string, date-time

## Other responses

- `400`: Default Response
- `401`: Default Response
- `404`: Default Response

---

[API](https://skmtc.dev/workwing/apis/workwing-api.md) · [All operations](https://skmtc.dev/workwing/apis/workwing-api/llms.txt) · [OpenAPI document](https://skmtc.dev/workwing/apis/workwing-api/revisions/54bb14368a35?raw)
