Job Management

Update job details and move jobs through the manufacturer workflow.

Availability

These endpoints are available to manufacturers only. Authenticate with your API key as described in the API overview.

Setting estimated completion dates

Set or update the estimated completion date for a job by sending a POST request to:

https://cabinetry.online/api/job/{jobId}/estimatedCompletion

Replace {jobId} with the numeric job ID.

Request

The request body is a JSON object with the following fields:

Field Type Mandatory Description
estimated_completion_date string Yes Estimated completion date in ISO 8601 format (date only or date and time)
trigger_notification boolean No When true, email the customer about this change
reason string No Additional text included in the customer email

The estimated_completion_date may be a date only (2025-01-02) or a full ISO 8601 timestamp (2025-01-02T12:34:56+10:00). Both forms are accepted.

Example request

POST https://cabinetry.online/api/job/1234/estimatedCompletion
Content-Type: application/json
X-GC-API-KEY: Your.API.Key-HERE

{
    "estimated_completion_date": "2025-01-02T12:34:56+10:00",
    "trigger_notification": true,
    "reason": "Supplier delays"
}

Response

On success the API returns HTTP 200 and a JSON body with success: 1, the normalised estimated_completion_date, and email_sent indicating whether a customer email was sent.

If the job cannot be updated or the date is invalid, the API returns an appropriate HTTP status and success: 0 with an error message. When multiple validation errors apply, only the first error encountered is returned.

Example error response

POST https://cabinetry.online/api/job/1234/estimatedCompletion
Content-Type: application/json
X-GC-API-KEY: Your.API.Key-HERE

{
    "estimated_completion_date": "2025-99-99T99:99:99+10:00",
    "trigger_notification": true,
    "reason": "Supplier delays"
}
{
    "success": 0,
    "error": "date is invalid or incorrectly formatted."
}

Example success response

POST https://cabinetry.online/api/job/1234/estimatedCompletion
Content-Type: application/json
X-GC-API-KEY: Your.API.Key-HERE

{
    "estimated_completion_date": "2025-01-02T12:34:56+10:00",
    "trigger_notification": true,
    "reason": "Supplier delays"
}
{
    "success": 1,
    "estimated_completion_date": "2025-01-02",
    "email_sent": true
}

Job status transitions

Manufacturers can move jobs through the core Cabinetry.Online lifecycle using dedicated POST endpoints. These endpoints perform the same status changes as the manufacturer web application for the supported transitions.

Example requests for all transitions are available in the Postman manufacturer API collection.

Scope

The status transition API supports:

The following are not supported by these endpoints:

Mark paid (POST https://cabinetry.online/api/job/{jobId}/status/mark_paid) is used when the job is already In Production or Job Completed. It is not the same as moving a job into production with payment recorded (POST https://cabinetry.online/api/job/{jobId}/status/in_production with "paid": true).

Job statuses

The table below lists core job status IDs returned on job records. See Job listing for the same reference.

Name (as shown in the application) Status ID API path to reach this status Description
Processing 0 POST https://cabinetry.online/api/job/{jobId}/status/processing Customer-owned while the customer is editing. Manufacturers cannot change status until the customer submits. Use processing to unsubmit back to this status from allowed prior statuses.
Pending Approval 1 Customer has submitted the job for manufacturer review. Reached through the customer workflow, not via a manufacturer status endpoint.
Pending Payment 2 POST https://cabinetry.online/api/job/{jobId}/status/pending_pay Awaiting payment from the customer. Only valid when the job is currently Pending Approval (status ID 1) or Customer Approved (status ID 2, can only be transitioned by customer).
In Production 3 POST https://cabinetry.online/api/job/{jobId}/status/in_production Job is in production. Use in_production with "paid": true or "paid": false as described below.
Job Completed 4 POST https://cabinetry.online/api/job/{jobId}/status/completed Job is completed. Only valid when the job is currently In Production (status ID 3).
Pending Confirmation 5 Customer-owned. Manufacturers receive HTTP 409 if they attempt any status transition while the job is in this status.
Customer Approved 7 Customer has approved the job without manufacturer payment recorded. Manufacturers may move to In Production without payment from this status using in_production with "paid": false.
DELETED 35 Job is deleted. Status transitions are not available.

Listing slugs and transition actions

Two different path patterns are used. Do not mix their {status} / {action} values.

List jobs (read-only filter):

GET https://cabinetry.online/api/jobs/{status}

Here {status} is a listing slug (for example gcpendingpayment, gcproduction, completed). See the full slug list in Job listing.

Change job status:

POST https://cabinetry.online/api/job/{jobId}/status/{action}

Here {action} is a transition action: processing, pending_pay, in_production, completed, or mark_paid.

Listing slugs and transition actions use different names and are not interchangeable. For example, list awaiting-payment jobs with slug gcpendingpayment, but move a job to awaiting payment with POST https://cabinetry.online/api/job/12345/status/pending_pay—not pendingpayment in the POST path.

Status flow (core lifecycle)

Customer steps (not available through these manufacturer endpoints):

Manufacturer transitions (POST …/status/{action}). See transition endpoints for request bodies and examples.

From status Action To status
Pending Approval (1) pending_pay Pending Payment (2)
Pending Approval (1) in_production (paid: false) In Production (3)
Pending Payment (2) in_production In Production (3)
Customer Approved (7) pending_pay Pending Payment (2)
Customer Approved (7) in_production (paid: false) In Production (3)
In Production (3) completed Job Completed (4)
In Production (3) or Job Completed (4) mark_paid (records payment; status unchanged)
Pending Approval (1), Pending Payment (2), or In Production (3) processing Processing (0) — unsubmit

While a job is Processing (0) and still customer-owned, manufacturers cannot change status until the customer submits.

How to transition a job

Jobs can be transitioned by sending a POST request to the API endpoints in the table above with an appropriate JSON object. Replace {jobId} with the numeric job ID.

see immediately below for:

Authenticate every request with your manufacturer API key (X-GC-API-KEY header). Example requests in this document omit the header for brevity; include it on real requests.

Common responses

HTTP status Meaning
200 Transition succeeded. Response includes success: 1 and transition details.
400 Invalid request body (missing required field, invalid date, invalid paid value, conflicting fields).
401 Caller is not a manufacturer, or API key authentication failed.
404 Job does not exist, is deleted, or is not accessible to the authenticated manufacturer.
409 Transition is not allowed for the job's current status (including customer-owned Processing or Pending Confirmation).

Example error response (409 — customer-owned status)

POST https://cabinetry.online/api/job/12345/status/pending_pay
Content-Type: application/json

{
    "trigger_notification": false,
    "reason": ""
}
{
    "success": 0,
    "error": "The manufacturer cannot change this job's status while it is in processing or pending customer confirmation."
}

Example error response (401 — not a manufacturer)

{
    "success": 0,
    "error": "Only manufacturers may change job status via this API."
}

Example error response (404 — job not found)

{
    "success": 0,
    "error": "Job could not be found."
}

Example success response

{
    "success": 1,
    "message": "Job moved to awaiting payment.",
    "job_id": 12345,
    "status": 2
}

Shared request fields

These fields may appear on any status transition request unless noted otherwise in the endpoint section.

Field Type Required Description
trigger_notification boolean No When present and truthy, send the customer email associated with this transition. When omitted or false, no email is sent.
reason string No Additional text included in customer emails when notifications are enabled.
estimated_completion_date string Varies Estimated completion date (YYYY-MM-DD or ISO 8601). Required for completed. May be applied on other transitions where noted.

Transition endpoints

Move to Pending Payment — pending_pay

Moves a job from Pending Approval (1) to Pending Payment (2).

Allowed current status: Pending Approval (1)

Request

POST https://cabinetry.online/api/job/12345/status/pending_pay
Content-Type: application/json

{
    "trigger_notification": true,
    "reason": "Waiting on customer transfer.",
    "estimated_completion_date": "2026-05-20"
}
Field Type Required Description
trigger_notification boolean No Email the customer when truthy
reason string No Email body addition
estimated_completion_date string No May update the job delivery date when provided

Success response

{
    "success": 1,
    "message": "Job moved to awaiting payment.",
    "job_id": 12345,
    "status": 2
}

Example error (409 — wrong current status)

{
    "success": 0,
    "error": "Awaiting payment is only valid from pending approval."
}

Move to In Production — in_production

Moves a job to In Production (3). You must include "paid": true or "paid": false.

paid value Meaning Allowed current status
true Payment is recorded when entering production Pending Approval (1), Pending Payment (2)
false Enter production without payment recorded on the job Pending Approval (1), Pending Payment (2), Customer Approved (7)

When "paid": false and trigger_notification is truthy, the customer email depends on the prior status:

Request — into production with payment recorded

POST https://cabinetry.online/api/job/12345/status/in_production
Content-Type: application/json

{
    "paid": true,
    "trigger_notification": false,
    "estimated_completion_date": "2026-06-01"
}
Field Type Required Description
paid boolean Yes Must be true
trigger_notification boolean No Email the customer when truthy
reason string No Email body addition
estimated_completion_date string No May update delivery date

Request — into production without payment recorded

POST https://cabinetry.online/api/job/12345/status/in_production
Content-Type: application/json

{
    "paid": false,
    "trigger_notification": false,
    "reason": ""
}
Field Type Required Description
paid boolean Yes Must be false
trigger_notification boolean No Email the customer when truthy (see status-specific behaviour above)
reason string No Email body addition

Success response

{
    "success": 1,
    "message": "Job moved to in production.",
    "job_id": 12345,
    "status": 3
}

Example errors

Missing or non-boolean paid:

{
    "success": 0,
    "error": "Field \"paid\" (boolean) is required for in_production."
}
{
    "success": 0,
    "error": "Field \"paid\" must be a boolean."
}

Conflict when paid is true but the job is not in an allowed status:

{
    "success": 0,
    "error": "Moving to in production with payment recorded is only valid from pending approval or awaiting payment."
}

Conflict when paid is false but the job is not in an allowed status:

{
    "success": 0,
    "error": "Moving to in production without payment recorded is only valid from pending approval, awaiting payment, or customer approved."
}

Move to Processing (unsubmit) — processing

Moves the job back to Processing (0) when the current status allows unsubmit.

Unsubmit is allowed from several statuses when the job is not in a customer-owned phase. If unsubmit is not permitted, the API returns HTTP 409.

Not allowed when current status is: Processing (0) or Pending Confirmation (5) — customer-owned.

Request

POST https://cabinetry.online/api/job/12345/status/processing
Content-Type: application/json

{
    "trigger_notification": false,
    "reason": ""
}
Field Type Required Description
trigger_notification boolean No Email the customer when truthy
reason string No Email body addition

Success response

{
    "success": 1,
    "message": "Job moved to processing.",
    "job_id": 12345,
    "status": 0
}

Example error (409)

{
    "success": 0,
    "error": "This job cannot be moved back to processing from its current status."
}

Move to Job Completed — completed

Moves a job from In Production (3) to Job Completed (4).

Allowed current status: In Production (3)

Request

POST https://cabinetry.online/api/job/12345/status/completed
Content-Type: application/json

{
    "estimated_completion_date": "2026-06-30",
    "trigger_notification": false,
    "reason": ""
}
Field Type Required Description
estimated_completion_date string Yes Completion / delivery date (YYYY-MM-DD or ISO 8601)
trigger_notification boolean No Email the customer when truthy
reason string No Email body addition

Success response

{
    "success": 1,
    "message": "Job marked as completed.",
    "job_id": 12345,
    "status": 4,
    "email_sent": false
}

Example errors

{
    "success": 0,
    "error": "estimated_completion_date is required."
}
{
    "success": 0,
    "error": "Completed is only valid for jobs that are in production."
}

Mark paid — mark_paid

Records payment on a job that is already In Production (3) or Job Completed (4). This does not change the job to a different status ID in all cases; it runs the mark-paid workflow (including optional customer email).

Allowed current status: In Production (3), Job Completed (4)

This is not used to move a job from Pending Approval or Pending Payment into production with payment; use in_production with "paid": true instead.

Request

POST https://cabinetry.online/api/job/12345/status/mark_paid
Content-Type: application/json

{
    "trigger_notification": false
}
Field Type Required Description
trigger_notification boolean No Email the customer when truthy

Success response

{
    "success": 1,
    "message": "Job marked as paid.",
    "job_id": 12345,
    "status": 3,
    "email_sent": false
}

Example error (409)

{
    "success": 0,
    "error": "Mark paid is only valid for jobs in production or completed."
}