Skip to content
GlyphTechnologies

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

POST/api/intake/products

Create 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" } }
  ]
}
Fields
nameRequired. 200 characters.
recipeRequired. 1 to 50 operations for ONE unit, same shape as a job's operations. Hours scale with order quantity.
variantsRequired. 1 to 100 of { sku, name, options }. sku is your identifier, unique within the product; options is a flat object of strings.
description, material, notesOptional. Free text.
external_referenceOptional. Your product id, returned on every read.
submitOptional. 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

POST/api/intake/products/{id}/files

multipart/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

POST/api/intake/products/{id}/submit

A 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.

PATCH/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.

DELETE/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

GET/api/intake/products?status=approved
GET/api/intake/products/{id}