{
  "info": {
    "_postman_id": "2e5609da-644a-4e61-89b7-03ffb84f8d90",
    "name": "GoCabinets manufacturer API (examples)",
    "description": "**Manufacturer API key:** copy the key from the manufacturer portal under **Settings**. Leave the checked-in **`apiKey`** collection variable **empty**; set it only in your local Postman environment or a private fork so secrets are not committed.\n\n**Authentication:** set collection variable **`apiKey`**. Requests send **`X-GC-API-KEY: {{apiKey}}`**. Invalid or missing keys return HTTP **401**. Run **Verify manufacturer API key** to confirm your key before other requests.\n\n**Job status transitions:** `POST {{baseUrl}}/job/{{jobId}}/status/{action}` where `{action}` is `processing`, `pending_pay`, `in_production`, `completed`, or `mark_paid`. See the Job Management API documentation for full rules and examples.\n\n**`in_production`:** send boolean **`paid`** (`true` or `false`) on every request.\n\n**Customer email:** **`trigger_notification`** is opt-in: omitted or false means no customer email is sent.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Auth",
      "item": [
        {
          "name": "Verify manufacturer API key",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/auth/manufacturer",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "auth",
                "manufacturer"
              ]
            },
            "description": "Returns **`success: 1`** when **`apiKey`** is valid for a manufacturer. **401** if missing or invalid.\n\nUses the same auth resolution as other API requests (`UsersRoute` + manufacturer group check)."
          },
          "response": []
        }
      ],
      "description": "Authenticate with **`X-GC-API-KEY`** and collection variable **`{{apiKey}}`** (see **Authentication** in the API overview)."
    },
    {
      "name": "Jobs (read / list)",
      "item": [
        {
          "name": "Production jobs list (GET /jobs/production)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/jobs/production",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "jobs",
                "production"
              ]
            },
            "description": "Manufacturer-scoped production job list. Requires valid **`apiKey`**."
          },
          "response": []
        },
        {
          "name": "List jobs (GET /jobs)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/jobs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "jobs"
              ]
            },
            "description": "### Query\nOptional query parameters may filter results (for example pagination). See the Job Listing API documentation.\n\n### Notes\nNo body."
          },
          "response": []
        },
        {
          "name": "Jobs by status (GET /jobs/:status)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/jobs/completed",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "jobs",
                "completed"
              ]
            },
            "description": "### Path\n- `:status` — listing slug, for example `completed`, `processing`, `gcpendingpayment`, `gcproduction`. See the Job Listing API documentation for valid slugs.\n\n### Query\nOptional `page`, `limit`, and `customerId` query parameters are supported where documented."
          },
          "response": []
        },
        {
          "name": "Dashboard buckets (GET /jobs/manufacturer-dashboard)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              },
              {
                "key": "Accept",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/jobs/manufacturer-dashboard?status=in_production&page=1&page_size=10",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "jobs",
                "manufacturer-dashboard"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "in_production",
                  "description": "Job status"
                },
                {
                  "key": "field",
                  "value": "delivery_date",
                  "description": "Order by",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "desc",
                  "description": "Sort order",
                  "disabled": true
                },
                {
                  "key": "payment_status",
                  "value": "",
                  "description": "Payment integration status",
                  "disabled": true
                },
                {
                  "key": "page_show_last",
                  "value": "60",
                  "description": "Updated within days",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number",
                  "type": "text"
                },
                {
                  "key": "page_size",
                  "value": "10",
                  "description": "Page size",
                  "type": "text"
                }
              ]
            },
            "description": "### Query (required / important)\n\n| Key | Required | Values |\n| --- | --- | --- |\n| `status` | Yes | `pending_approval`, `customer_approved`, `in_production`, `pending_payment`, `job_completed` |\n| `field` | No | Customer Name: `0`  <br>  <br>Job Name: `1`  <br>Job Date Entered: `2`  <br>Job Status: `3`  <br>Job End Customer Name: `4`  <br>Job Dispatch Method: 5  <br>Job ID: 7 (default)  <br>Job Date Delivery: 8  <br>Job Date Updated: 9  <br>Job Date Submitted: 10  <br>Job Date Accepted: `11`  <br>Job Date Paid: `12` |\n| `sort` | No | `ASC`, `DESC` (default) |\n| `payment_status` | No | `unpaid`, `deposit_paid`, `paid_full`, `overpaid`, `partially_paid` |\n| `page` | No | Default `1` (page number to return result for) |\n| `page_size` | No | Default `10` (Number of records to include in result. Range: 1-100) |\n| `page_show_last` | No | Default `60` (only return records updated within the past number of days. Range: `1`\\-`365`) |\n\n### Notes\n\nManufacturer only.\n\nMust set request `Accept` HTTP header to `application/json` to recieve a JSON response."
          },
          "response": []
        },
        {
          "name": "Job download (GET /job/:jobId/download)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}/download",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}",
                "download"
              ]
            },
            "description": "Download job payload (CSV or as implemented). Requires valid **`apiKey`**."
          },
          "response": []
        },
        {
          "name": "View job (GET /job/:jobId)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}"
              ]
            },
            "description": "View details for an individual job record. Requires valid **`apiKey`**.\n\nExample response:\n\n``` json\n{\n  \"data\": {\n    \"id\": 571943,\n    \"external_id\": null,\n    \"client_id\": -1,\n    \"customer_id\": 928,\n    \"coupon_code_id\": null,\n    \"coupon_discount_price\": null,\n    \"depot_id\": 0,\n    \"address_region_id\": null,\n    \"address_state_id\": null,\n    \"status\": 1,\n    \"name\": \"cab + bench\",\n    \"delivery_city\": \"\",\n    \"delivery_street\": \"\",\n    \"delivery_suburb\": \"\",\n    \"delivery_postcode\": \"\",\n    \"delivery_state\": null,\n    \"dispatch_method\": 0,\n    \"is_dispatch_method_changed\": false,\n    \"description\": \"\",\n    \"end_contact_number\": \"0400123456\",\n    \"end_customer_name\": \"\",\n    \"additional_services_cost\": null,\n    \"cabinets_cost\": 415.577092997,\n    \"cabinets_variation\": 24.98,\n    \"customer_min_charge\": 100,\n    \"customer_price_adjust\": 10,\n    \"freight_cost\": 0,\n    \"min_mat_fee\": 421.482985219,\n    \"percentage_charged\": 6,\n    \"percentage_charged_sundries\": 6,\n    \"percentage_charged_benchtops\": 6,\n    \"sundry_cost\": null,\n    \"supplier_percentage_charged\": null,\n    \"supplier_price_adjust\": 0,\n    \"tax_rate\": null,\n    \"variation_cost\": 0,\n    \"is_accepted\": false,\n    \"is_variations_confirmed\": false,\n    \"is_room_assistant_enabled\": true,\n    \"manufacturer_edit_min_mat_usage\": false,\n    \"created_date\": \"2026-06-15 05:36:49\",\n    \"modified_date\": \"2026-06-15 22:41:45\",\n    \"accepted_date\": null,\n    \"delivery_date\": null,\n    \"paid_date\": null,\n    \"submitted_date\": \"2026-06-15 22:41:45\",\n    \"pricing_webhook_response\": null,\n    \"variations_all_accepted\": false,\n    \"order_submission_webhook_response\": null,\n    \"invoice_number_scheme\": 1,\n    \"requested_delivery_date\": null,\n    \"jobman_lead_id\": null,\n    \"jobman_quote_id\": null,\n    \"postwood_callback_token\": null,\n    \"jobman_last_sync_timestamp\": null\n  },\n  \"success\": 1\n}\n\n\n ```"
          },
          "response": []
        }
      ],
      "description": "Authenticated manufacturer requests (**`X-GC-API-KEY: {{apiKey}}`**). Paths under **`{{baseUrl}}`**."
    },
    {
      "name": "Manufacturer job status",
      "item": [
        {
          "name": "POST …/job/:jobId/estimatedCompletion",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"estimated_completion_date\": \"2026-06-15T12:00:00+10:00\",\n  \"trigger_notification\": false,\n  \"reason\": \"Example update\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}/estimatedCompletion",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}",
                "estimatedCompletion"
              ]
            },
            "description": "Updates estimated completion / delivery date for a job in an allowed status. See **Job management** documentation for fields and errors."
          },
          "response": []
        },
        {
          "name": "POST …/status/processing",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"trigger_notification\": false,\n  \"reason\": \"\",\n  \"estimated_completion_date\": \"\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}/status/processing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}",
                "status",
                "processing"
              ]
            },
            "description": "### Allowed when\n- Job **not** in Processing (0) or Pending Confirmation (5) (customer-owned).\n- Unsubmit is permitted for the job's current status (else **409**).\n\n### Body (JSON) — all optional\n| Field | If omitted | Notes |\n|-------|------------|--------|\n| `trigger_notification` | **No** customer email | Truthy → send unsubmit email. |\n| `reason` | null | Email body when notification sent. |\n| `estimated_completion_date` | ignored if absent/empty | Non-empty valid string updates stored date without standalone completion-date email. |\n\n### Result\nMoves job **back** to Processing (0)."
          },
          "response": []
        },
        {
          "name": "POST …/status/in_production (payment recorded)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"paid\": true,\n  \"trigger_notification\": false,\n  \"reason\": \"\",\n  \"estimated_completion_date\": \"2026-06-01\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}/status/in_production",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}",
                "status",
                "in_production"
              ]
            },
            "description": "### Body (JSON) — required\n| Field | Required | Values |\n|-------|----------|--------|\n| `paid` | **Yes** | **`true`** — payment recorded when entering production. |\n\n### Allowed **from** status\n- Pending Approval (1), Pending Payment (2) — else **409**.\n\n### Optional\n| Field | If omitted | Notes |\n|-------|------------|--------|\n| `trigger_notification` | **No** customer email | Truthy → send customer email when supported. |\n| `reason` | null | |\n| `estimated_completion_date` | ignored if absent/empty | |"
          },
          "response": []
        },
        {
          "name": "POST …/status/in_production (without payment recorded)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"paid\": false,\n  \"trigger_notification\": false,\n  \"reason\": \"\",\n  \"estimated_completion_date\": \"2026-06-01\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}/status/in_production",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}",
                "status",
                "in_production"
              ]
            },
            "description": "### Body (JSON) — required\n| Field | Required | Values |\n|-------|----------|--------|\n| `paid` | **Yes** | **`false`** — into production without payment recorded on the job. |\n\n### Allowed **from** status\n- Pending Approval (1), Pending Payment (2), Customer Approved (7) — else **409**.\n\n### Customer email behaviour\nWhen **`trigger_notification`** is truthy: from Pending Payment (2) the deferred / produce-before-payment email path is used; from Pending Approval (1) or Customer Approved (7) the approved-customer path is used.\n\n### Optional\n| Field | If omitted | Notes |\n|-------|------------|--------|\n| `trigger_notification` | **No** customer email | |\n| `reason` | null | |\n| `estimated_completion_date` | ignored if absent/empty | |"
          },
          "response": []
        },
        {
          "name": "POST …/status/pending_pay",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"trigger_notification\": false,\n  \"reason\": \"\",\n  \"estimated_completion_date\": \"\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}/status/pending_pay",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}",
                "status",
                "pending_pay"
              ]
            },
            "description": "### Body (JSON)\n**No required fields** (empty `{}` is valid).\n\n### Optional\n| Field | If omitted | Notes |\n|-------|------------|--------|\n| `trigger_notification` | **No** customer email | Truthy → send customer email when supported. |\n| `reason` | null | |\n| `estimated_completion_date` | ignored if absent/empty | |\n\n### Allowed **from** status\n- Pending Approval (1) only — else **409**.\n\n### Result\nMoves job to Pending Payment (2)."
          },
          "response": []
        },
        {
          "name": "POST …/status/completed",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"estimated_completion_date\": \"2026-05-15\",\n  \"trigger_notification\": false,\n  \"reason\": \"\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}/status/completed",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}",
                "status",
                "completed"
              ]
            },
            "description": "### Body (JSON) — required\n| Field | Required | Notes |\n|-------|----------|--------|\n| `estimated_completion_date` | **Yes** | Non-empty string; must parse for manufacturer timezone — invalid → **400**. |\n\n### Optional\n| Field | If omitted | Notes |\n|-------|------------|--------|\n| `trigger_notification` | **No** completion email | Truthy → email the customer. |\n| `reason` | null | Passed into email context when sent. |\n\n### Allowed **from** status\n- In Production (3) only — else **409**.\n\n### Behaviour\nApplies completion date when provided, sets status Job Completed (4), saves."
          },
          "response": []
        },
        {
          "name": "POST …/status/mark_paid",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-GC-API-KEY",
                "value": "{{apiKey}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"trigger_notification\": false,\n  \"reason\": \"\",\n  \"estimated_completion_date\": \"\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/job/{{jobId}}/status/mark_paid",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job",
                "{{jobId}}",
                "status",
                "mark_paid"
              ]
            },
            "description": "### Body (JSON)\n**No required fields**.\n\n### Optional\n| Field | If omitted | Notes |\n|-------|------------|--------|\n| `trigger_notification` | **No** customer email | Truthy → send customer email when supported. |\n| `reason` | null | |\n| `estimated_completion_date` | ignored if absent/empty | |\n\n### Allowed **from** status\n- In Production (3) or Job Completed (4) — else **409**.\n\n### Result\nRecords payment on the job. Response `email_sent` reflects whether a customer email was requested.\n\n### vs `in_production`\nUse **`mark_paid`** when the job is **already** in production or completed. Use **`in_production`** with **`paid: true`** when moving **into** production with payment recorded."
          },
          "response": []
        }
      ],
      "description": "**Manufacturer only.** Send **`X-GC-API-KEY: {{apiKey}}`**. The job must belong to your manufacturer account.\n\n**Blocked** while job status is Processing (0) or Pending Confirmation (5) — HTTP **409**.\n\n**`in_production`:** requires boolean **`paid`** (`true` or `false`). See the two `in_production` requests for allowed source statuses.\n\n**Shared optional JSON fields** (where applicable):\n| Field | If omitted | Notes |\n|-------|------------|--------|\n| `trigger_notification` | **No** customer / completion email | |\n| `reason` | omitted | |\n| `estimated_completion_date` | omitted | Invalid date → **400** where validated. |"
    }
  ],
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://cabinetry.online/api"
    },
    {
      "key": "jobId",
      "value": "1"
    },
    {
      "key": "apiKey",
      "value": "<Your Integration API Key>"
    }
  ]
}
