API reference
Products
Create, edit, submit, archive products; attach files.
GET
/api/intake/products?status=approvedList this account's products, newest first, with variants. status filters.
POST
/api/intake/productsCreate. Body: name, recipe[], variants[], optional description, material, notes, external_reference, submit. Supports Idempotency-Key. 201 product; 400 details; 403 key not tied to a customer.
GET
/api/intake/products/{id}One product with variants and files.
PATCH
/api/intake/products/{id}Edit while draft or rejected. Any of the create fields; variants upsert by sku. 409 if approved or archived.
POST
/api/intake/products/{id}/submitSend for review. 200 with the product. 409 if archived.
DELETE
/api/intake/products/{id}Archive. 200 returns { id, status: "archived" }.
POST
/api/intake/products/{id}/filesUpload. multipart/form-data, field files, up to 10 × 25 MB. 201 { files }.
GET
/api/intake/products/{id}/filesThe Product object
| id, status, next | status: draft, submitted, approved, rejected, archived. next: attach_files_then_submit, awaiting_review, orderable, rejected, archived. |
|---|---|
| name, description, material, notes | As submitted. |
| external_reference | As submitted. |
| review_note, reviewed_at | Glyph's note on approval or rejection. |
| recipe | [{ op_ref, name, machine_options, duration_hr, predecessors }] per unit. |
| variants | [{ id, sku, name, options, active, unit_price_cents, price_breaks, lead_time_days, weight_oz, dimensions_in }], sorted by sku. |
| files | [{ id, filename, size_bytes, content_type, uploaded_at }] |
| created_at, updated_at |