Update job details and move jobs through the manufacturer workflow.
These endpoints are available to manufacturers only. Authenticate with your API key as described in the API overview.
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.
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.
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"
}
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.
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."
}
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
}
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.
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).
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. |
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.
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.
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.
| 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). |
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."
}
{
"success": 0,
"error": "Only manufacturers may change job status via this API."
}
{
"success": 0,
"error": "Job could not be found."
}
{
"success": 1,
"message": "Job moved to awaiting payment.",
"job_id": 12345,
"status": 2
}
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. |
pending_payMoves a job from Pending Approval (1) to Pending Payment (2).
Allowed current status: Pending Approval (1)
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": 1,
"message": "Job moved to awaiting payment.",
"job_id": 12345,
"status": 2
}
{
"success": 0,
"error": "Awaiting payment is only valid from pending approval."
}
in_productionMoves 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:
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 |
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": 1,
"message": "Job moved to in production.",
"job_id": 12345,
"status": 3
}
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."
}
processingMoves 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.
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": 1,
"message": "Job moved to processing.",
"job_id": 12345,
"status": 0
}
{
"success": 0,
"error": "This job cannot be moved back to processing from its current status."
}
completedMoves a job from In Production (3) to Job Completed (4).
Allowed current status: In Production (3)
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": 1,
"message": "Job marked as completed.",
"job_id": 12345,
"status": 4,
"email_sent": false
}
{
"success": 0,
"error": "estimated_completion_date is required."
}
{
"success": 0,
"error": "Completed is only valid for jobs that are in production."
}
mark_paidRecords 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.
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": 1,
"message": "Job marked as paid.",
"job_id": 12345,
"status": 3,
"email_sent": false
}
{
"success": 0,
"error": "Mark paid is only valid for jobs in production or completed."
}