API reference
Jobs
List, create, retrieve, and accept jobs.
GET
/api/intake/jobsList this key's jobs, newest first, without operations and files. Query: limit, 1 to 100, default 50.
200:
{ "jobs": [ { "id": "2c5c95fc-…", "status": "invoiced", "next": "pay", "name": "Bracket run, 50 pcs", "operations": [], "files": [], … } ] }
POST
/api/intake/jobsCreate a job and compute its estimate. Needs a key tied to a customer. Supports Idempotency-Key.
| name | Required. 200 characters. |
|---|---|
| operations | Required. 1 to 50 of { op_ref, name, machine_options, duration_hr, predecessors? }. |
| material | Optional. 200 characters. |
| material_cost_cents | Optional. Non-negative integer. |
| quantity | Optional. Positive integer. |
| due_at | Optional. ISO 8601. |
| notes | Optional. 4 000 characters. |
| external_reference | Optional. 200 characters. |
201, the Job object plus two extra fields:
{
"id": "2c5c95fc-0ec3-4a30-9d75-17d6e012c645",
"status": "estimated",
"next": "accept",
"estimate": { "machine_cents": 21000, "material_cents": 12000, "setup_cents": 5000, "total_cents": 38000 },
"operations": [ { "op_ref": "OP-10", "name": "Rough mill", "machine_options": "MILL", "duration_hr": 2, "predecessors": "", "status": "pending" } ],
"files": [],
"estimate_lines": [ { "op_ref": "OP-10", "machine": "MILL", "hours": 2, "cents": 18000 } ],
"auto_quote_limit_cents": 50000
}
200, replay: the Job, with its operations and files, plus "replayed": true. 403:
{ "error": "This API key is not linked to a customer, so it cannot create jobs. Ask Glyph to link it in Hiero." }
400, 401, 409, 503: see Errors.
GET
/api/intake/jobs/{id}Retrieve a job with its operations and files.
200: the Job object below. 404 if it belongs to another key.
POST
/api/intake/jobs/{id}/acceptAccept the estimate or the quote.
201, invoiced:
{ "id": "2c5c95fc-…", "status": "invoiced", "next": "pay", "quoted_total_cents": 38000, "invoice": { "url": "https://invoice.stripe.com/i/…", "invoiced_at": "2026-10-12T14:06:10.002+00:00", "paid_at": null }, "accepted": true }
202, above the auto-quote limit:
{ "id": "2c5c95fc-…", "status": "estimated", "next": "awaiting_staff_quote", "quote_requested_at": "2026-10-12T14:06:10.002+00:00", "accepted": true, "awaiting": "staff_quote" }
200: already invoiced or paid; the Job with "accepted": true. 202 again if the job is still waiting for a staff quote. 409: wrong state. See Accept and pay.
The Job object
| id | UUID. |
|---|---|
| status | See Statuses and next steps. |
| next | accept, awaiting_staff_quote, pay, awaiting_release, scheduled, in_production, awaiting_shipment, complete, or the status itself. |
| name, material, quantity, due_at, notes | As submitted. |
| external_reference | As submitted. |
| currency | usd. |
| estimate | { machine_cents, material_cents, setup_cents, total_cents } or null. |
| quoted_total_cents | The confirmed price, or null. |
| quote_requested_at | Set when you accepted above your limit. |
| invoice | { url, invoiced_at, paid_at } or null. |
| schedule | { start, end } or null. |
| operations | [{ op_ref, name, machine_options, duration_hr, predecessors, status, scheduled_machine, scheduled_start, scheduled_end }] |
| files | [{ id, filename, size_bytes, content_type, uploaded_at }]. content_type is what your client sent with the upload. |
| created_at, updated_at | ISO 8601. |