Reference · POST /v1/jobs
Create job
Create job
Submit a new job request. The job is created unscheduled — your scheduling team picks the actual time. You can still edit the request (via PATCH) while it’s in that pre-scheduled state.
Request
curl -X POST -H "Authorization: Bearer fi_pk_…" \
-H "Content-Type: application/json" \
-d '{
"site": "3065756",
"job_type": "29400",
"title": "Annual service",
"start_time": "2026-07-01T09:00:00+10:00",
"end_time": "2026-07-01T11:00:00+10:00",
"notes": "Site contact prefers morning visits. Gate code 1742#.",
"purchase_order_number": "PO-12345",
"external_id": "client-ref-001",
"project": "1052232",
"custom_fields": { "scope_of_work": "Install" }
}' \
https://<host>/v1/jobsResponse
{
"id": "21172159",
"number": "16"
}Fields
siterequiredstring
Site ID the job is for. Fetch valid IDs from /v1/sites, or create a new site first with POST /v1/sites. Example: `"site": "3065756"`.
job_typerequiredstring
Job-type ID — describes the kind of work (e.g. Installation, Service, Inspection). Fetch IDs from /v1/job-types. Example: `"job_type": "29400"`.
titlerequiredstring
Short label shown on the job in lists and on the calendar. 1–200 chars. Example: `"Quarterly safety inspection"`.
start_timerequiredISO 8601
Preferred start. This is a hint — scheduling staff confirm the actual time. Include a timezone offset so it’s unambiguous. Example: `"2026-07-01T09:00:00+10:00"`.
end_timerequiredISO 8601
Preferred end. Same notes as start_time. Example: `"2026-07-01T11:00:00+10:00"`.
notesstring
Office-scoped log against the job — not shown to the field tech. Use it for internal context the scheduling and admin team should see: booking history, status updates, customer correspondence. Pair this with custom_fields when the tech needs to see something on the work order. ≤ 2000 chars.
purchase_order_numberstring
Your PO number for the job, if you use them. Surfaces on the job record. ≤ 100 chars. Example: `"PO-12345"`.
external_idstring
Your own reference for the job — typically a record ID in your system. Lets you reconcile webhooks back to your records. ≤ 36 chars.
projectstring
Project ID the job rolls up to. Fetch allowed IDs from /v1/projects. Example: `"project": "1052232"`. Omit if the job isn’t part of a project.
custom_fieldsobject<string, string>
Map of friendly field names to values. The valid names come from /v1/custom-fields. Unknown names are rejected. Example: `{ "scope_of_work": "Install + commissioning" }`.
Errors
400 invalid-body400 unknown-custom-field400 project-not-in-scope400 field-not-writable401 unauthorized429 rate-limited
The site must already exist — create it first via POST /v1/sites if needed. Job status, customer, and the `unscheduled` flag are set automatically and can’t be overridden.