On-demand fabrication
Products and variants
Define a product once; Glyph approves it and locks a price per variant.
A product is something you will sell more than once. You describe it one time: what we do to make one unit, the files, and the variants your customers choose between. We review it, set a price per variant, and from then on orders for it run without a quote step.
Create a product
/api/intake/productsCreate a product. With submit: true it goes straight to review; otherwise it stays a draft you can edit and attach files to first.
{
"name": "Wall bracket",
"description": "Powder-coat ready steel bracket",
"material": "1008 steel",
"external_reference": "shopify-product-8841",
"submit": true,
"recipe": [
{ "op_ref": "OP-10", "name": "Laser profile", "machine_options": "ROUTER", "duration_hr": 0.1 },
{ "op_ref": "OP-20", "name": "Bend and deburr", "machine_options": "BENCH", "duration_hr": 0.15, "predecessors": "OP-10" }
],
"variants": [
{ "sku": "WB-S", "name": "Small", "options": { "size": "S" } },
{ "sku": "WB-L", "name": "Large", "options": { "size": "L" } }
]
}
| name | Required. 200 characters. |
|---|---|
| recipe | Required. 1 to 50 operations for ONE unit, same shape as a job's operations. Hours scale with order quantity. |
| variants | Required. 1 to 100 of { sku, name, options }. sku is your identifier, unique within the product; options is a flat object of strings. |
| description, material, notes | Optional. Free text. |
| external_reference | Optional. Your product id, returned on every read. |
| submit | Optional. true sends it for review at once. |
201 returns the product. A draft has next: "attach_files_then_submit"; a submitted one, "awaiting_review".
{
"id": "ea70ec0b-5f41-4f81-b6de-140ec8918b0d",
"status": "submitted",
"next": "awaiting_review",
"name": "Wall bracket",
"variants": [
{ "id": "…", "sku": "WB-S", "name": "Small", "options": { "size": "S" }, "active": true, "unit_price_cents": null, "price_breaks": [], "lead_time_days": null }
],
"files": []
}
Attach files
/api/intake/products/{id}/filesmultipart/form-data, field files. Same limits and types as job files.
Attach the model and the drawing before you submit. We review faster with them.
Submit for review
/api/intake/products/{id}/submitA person at Glyph reads the recipe, opens the files, and sets a unit price for each variant, quantity breaks if they apply, the lead time, and the shipping weight. The product becomes approved, or rejected with a review_note. Either way a product.approved or product.rejected webhook fires, and the product's status and next change.
What an approved product looks like
{
"id": "ea70ec0b-…",
"status": "approved",
"next": "orderable",
"variants": [
{
"id": "6f4f…",
"sku": "WB-S",
"name": "Small",
"options": { "size": "S" },
"active": true,
"unit_price_cents": 1800,
"price_breaks": [ { "min_quantity": 10, "unit_price_cents": 1500 } ],
"lead_time_days": 7,
"weight_oz": 9,
"dimensions_in": { "length": 8, "width": 5, "height": 2 }
}
]
}
unit_price_cents is what we charge you per unit. A price_breaks entry applies when the order quantity for that line reaches min_quantity. lead_time_days is our working-day estimate from release to shipment.
Edit, revise, archive
A product is edited by sku, not by variant id. Its variants come back sorted by sku.
/api/intake/products/{id}While draft or rejected: change fields, the recipe, or the variants. Variants are matched by sku; a sku you leave out is deactivated, never deleted. Include submit: true to resubmit.
/api/intake/products/{id}Archive. Existing orders are unaffected; no new orders can use it.
{ "id": "ea70ec0b-…", "status": "archived" }
An edit that is not allowed answers 409:
{ "error": "A product that is approved cannot be edited. Archive it and create a new one, or contact Glyph.", "status": "approved" }
An approved product cannot be edited through the API, because its price was set for that recipe. Archive it and create a new one, or ask us to adjust.
Read
/api/intake/products?status=approved/api/intake/products/{id}