---
title: "PUT /jobs/{jobId}/finalise"
method: PUT
path: "/jobs/{jobId}/finalise"
tags: ["Jobs"]
---

# PUT /jobs/{jobId}/finalise

`PUT /jobs/{jobId}/finalise`

## Request

- Base URL: `https://api.fergus.com`
- URL: `https://api.fergus.com/jobs/{jobId}/finalise`
- Auth: one of:
  - OAuth 2
    - Authorization code: `https://auth.fergus.com/oauth2/authorize`
    - Token URL: `https://auth.fergus.com/oauth2/token`
  - HTTP bearer
- TypeScript: <https://skmtc.dev/fergus/apis/fergus-api/docs/jobs/:jobId/finalise/put.ts> (a function with typed inputs; its response is checked against the schema)

Finalises a draft job, turning it into an active job.

A draft job (created with `isDraft: true` via `POST /jobs`) has the status `Draft`, has no job number (`jobNo` and `jobNumber` are `null`), and doesn't appear in the Fergus job list. Finalising it:

- assigns the job its job number, after which it appears in the job list
- for `Charge Up` jobs, creates the job's first phase, and moves the job from `To Price` to `Active`
- sets the job's invoice due days from the customer's setting, or from the company default if the customer has none
- records the job as created by the authenticated user in the job's activity history

Quotes on the job aren't changed. A draft quote stays a draft, and isn't published or sent.

**Required fields:** the job must have a customer, site, job type, title and description. Use `PUT /jobs/:jobId` to fill in any that are missing first. If one is missing, the request fails with `400` and a message naming the first missing field, for example `The job cannot be finalised: site must be set.`

Finalising a job that's already finalised has no effect, and returns the job unchanged.

**Request:** send no body, with `Content-Type: text/plain`. Any other Content-Type, including `application/json`, is rejected with `400`.

## Path parameters

- `jobId` integer, required

## Headers

- `Content-Type` string, required

## Response `200`

Successful Response

- JobResponse
  - `result` string, required
  - `data` Job, required
    - `id` number, required
    - `jobNo` string, nullable, required
    - `jobNumber` string, nullable, required
    - `description` string, nullable, required
    - `longDescription` string, nullable, required
    - `createdAt` string, date-time, required
    - `lastModified` string, date-time, nullable, required
    - `jobType` string, required
    - `status` string, required
    - `assignedGroups` string[], required: Default group assigned to a job for easy tracking. This gets assigned automatically by default on new job phases.
    - `customer` JobCustomer, required
      - `id` number, required
      - `customerFullName` string, nullable, required
    - `siteAddress` JobSiteAddress, required
      - `id` number, required
      - `name` string, nullable, required
      - `firstName` string, nullable, required
      - `lastName` string, nullable, required
      - `address1` string, nullable, required
      - `address2` string, nullable, required
      - `addressSuburb` string, nullable, required
      - `addressCity` string, nullable, required
      - `addressRegion` string, nullable, required
      - `addressCountry` string, nullable, required
      - `addressPostcode` string, nullable, required
    - `mainContact` object, nullable, required
      - `id` number, required
      - `firstName` string, nullable, required
      - `lastName` string, nullable, required
      - `contactItems` ContactItem[], nullable, required
        - `id` number, required
        - `contactType` 'email' | 'phone' | 'mobile' | 'other' | 'fax' | 'website', required: The type of this contact item. It can be one of the following: email, phone, mobile, other, fax, website
        - `contactValue` string, required: The value of this contact item.
    - `activeQuote` object, nullable, required
      - `id` number, required
      - `versionNumber` number, required
      - `guid` string, nullable, required
      - `title` string, nullable, required
      - `description` string, nullable, required
      - `quoteDate` string, date-time, nullable, required
      - `isSent` boolean, required
      - `isAccepted` boolean, required
      - `isSuperseded` boolean, required
      - `isLocked` boolean, required
      - `voidedAt` string, date-time, nullable, required
      - `declinedAt` string, date-time, nullable, required
      - `createdAt` string, date-time, required
      - `lastModified` string, date-time, required
      - `publishedAt` string, date-time, nullable, required
      - `dueDate` string, date-time, nullable, required
      - `dueDays` string, nullable, required
      - `isDraft` boolean, required
      - `total` number, nullable
    - `onHold` boolean, required
    - `archived` boolean, required
    - `customerReference` string, nullable, required
    - `parentJobId` number, nullable, required: The id of the parent job when this job is a variant, otherwise null.
    - `jobVariants` number[], nullable, required: The ids of the variant (child) jobs when this job is a parent job, otherwise null.
    - `links` Links[], required
      - `href` string, required
      - `rel` string, required
      - `type` 'GET' | 'POST' | 'PUT' | 'PATCH', required

## Other responses

- `4XX`: Client Request Errors
- `5XX`: Server Errors

## Changes

- **2026-10-21** `53c1fe167983`: 1 breaking
  - added the new required `header` request parameter `Content-Type`

[Operation history](https://skmtc.dev/fergus/apis/fergus-api/changes/jobs/:jobId/finalise/put.md)

---

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