Raw schema
{
"type": "object",
"properties": {
"process": {
"type": "string",
"enum": [
"fdm_print",
"resin_print",
"powder_print",
"metal_print",
"cnc",
"sheetmetal",
"laser_cut",
"decal",
"print",
"apparel"
],
"description": "What to fabricate. If the user just drops a file and asks for a price, OMIT this — UFP detects the file type (artwork, mesh — STL/OBJ/PLY/3MF/AMF, BREP — STEP/IGES, DXF) and routes it to every process that can make it; the response's routing.also_possible lists processes UFP can't quote yet"
},
"part_number": {
"type": "string",
"description": "UFP part number from a previous paid order (UFP-… or part_…). Reorders: replaces design_file/file_url entirely; any other fields provided override the stored spec"
},
"share_key": {
"type": "string",
"description": "Share key for a LOCKED part — the k=… value from the owner's share link (…/part/UFP-…?k=KEY). Required with part_number when the part is locked; omit otherwise"
},
"design_file": {
"anyOf": [
{
"type": "object",
"properties": {
"file_id": {
"type": "string"
},
"download_url": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"file_name": {
"type": "string"
}
},
"required": [
"file_id",
"download_url"
],
"additionalProperties": false
},
{
"type": "string"
}
],
"description": "The design file itself (user-attached or generated image/STL). ChatGPT supplies the file reference automatically when the user attached a file — just bind the attachment here. Other clients may pass a data: URL (base64) or a public https URL string. Preferred over file_url."
},
"file_url": {
"type": "string",
"format": "uri",
"description": "Public URL of the design file — only when the design lives at a URL"
},
"attachment_urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"maxItems": 10,
"description": "Additional files for the SAME part — the PDF drawing next to the STEP, spec sheets, BOMs. Pass everything the user gave you; UFP works out which file is the part and which are supporting documents."
},
"ship_to_zip": {
"type": "string",
"pattern": "^\\d{5}(-\\d{4})?$",
"description": "Destination US ZIP code, exactly as the user stated it. OMIT if the user has not given one — NEVER guess or invent a ZIP. Without it, prices come back all-in with shipping to an assumed central-US destination, flagged on routing.ship_to"
},
"quantities": {
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0
},
"maxItems": 5,
"description": "Quantities the user actually wants — pass [1] or [2] if that's the ask. Vendors with a higher minimum quote AT their minimum and the offer notes it (requested_quantity). Default: 25 for decals, 1 for prints; a part_number reorder defaults to the quantity last purchased"
},
"material": {
"type": "string",
"description": "fdm_print: pla|petg|asa (free-form — \"abs\", \"polycarbonate\" asks resolve to the closest stocked filament with a substitution note); resin_print: standard|tough|high_temp|high_detail resin (free-form asks resolve to the closest supported resin); powder_print: Powder-bed nylon: nylon_12|nylon_12_smooth|nylon_11|nylon_12_gf|nylon_12_esd|tpu (free-form — \"PA12\", \"glass filled\" resolve to the closest stocked powder); cnc: aluminum_6061|aluminum_7075|stainless_304|titanium|brass|acetal|delrin|abs|nylon_pa6|peek|acrylic (free-form asks resolve to the closest supported stock); sheetmetal: mild_steel|aluminum_5052|stainless_304 (free-form — \"steel\", \"5052\", \"stainless\" resolve; unknown asks get closest-match offers). Omit to compare the defaults; laser_cut: acrylic|plywood|mdf|delrin|uhmw|hdpe|g10|carbon_fiber|mild_steel|aluminum_5052|stainless_304 (free-form — \"plexiglass\", \"birch\" resolve; unknown asks get closest-match offers); decal: vinyl|holographic|transparent|glitter (free-form — \"chrome\" etc. gets closest matches)"
},
"color": {
"type": "string",
"description": "fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye (\"black\", \"dark blue\") — vendor-resolved; print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"
},
"powder_technology": {
"type": "string",
"description": "Powder process: mjf (HP Multi Jet Fusion) | sls (laser sintering). Omit to let the vendor pick its default lane for the material"
},
"powder_finish": {
"type": "string",
"description": "Powder post-processing: as_printed (raw powder surface) | vapor_polished | polished"
},
"metal_alloy": {
"type": "string",
"description": "Metal AM alloy: stainless_316l|stainless_17_4ph|titanium_ti64|aluminum_alsi10mg|inconel_718|cobalt_chrome|tool_steel_h13|copper (free-form asks like \"Ti-6Al-4V\" resolve to the closest stocked powder)"
},
"metal_technology": {
"type": "string",
"description": "Metal AM process: laser_powder_bed (SLM/DMLS/LPBF)|binder_jet|ebm. Omit to let the vendor pick its default for the alloy"
},
"metal_finish": {
"type": "string",
"description": "Metal AM post-processing: as_printed|bead_blast|machined_critical|polished|heat_treated (as_printed keeps support witness marks)"
},
"finish": {
"type": "string",
"description": "cnc: CNC surface finish: standard|anodized|polished|bead_blasted (default standard); sheetmetal: as_cut (default) | deburred | powder_coat — powder coat protects mild steel for outdoor use"
},
"thickness_in": {
"type": "number",
"exclusiveMinimum": 0,
"description": "sheetmetal: Sheet thickness in inches (e.g. 0.063 = 14 ga aluminum). Quoted at the nearest stocked thickness; omit for ~16 ga default; laser_cut: Nominal thickness in inches; quoted at the vendor's nearest stocked thickness. Omit for the material's common stock"
},
"bend_count": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Number of bends in the design (bend lines must be in the file). Prices CNC bending; omit for flat parts"
},
"units": {
"type": "string",
"description": "sheetmetal: DXF drawing units: \"mm\" (default) or \"in\". STEP files carry their own units; laser_cut: DXF drawing units: \"mm\" (default) or \"in\""
},
"width_in": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Decal width in inches (default 3)"
},
"height_in": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Decal height in inches (default 3)"
},
"cut": {
"type": "string",
"description": "Decal cut style — pass the user's words verbatim (\"triangle\", \"die cut\", \"circle\"). Known: contour|square|oval|kiss_cut; anything else gets closest-match offers with a substitution note. Omit to compare the main options"
},
"product": {
"type": "string",
"description": "print: Print product kind: business_cards|flyers|posters. Omit to quote every kind the artwork fits; apparel: apparel: t_shirt|hoodie|long_sleeve|tank_top (free-form — \"tee\", \"crewneck\" resolve to the closest product)"
},
"size": {
"type": "string",
"description": "Print size — pass the user's words verbatim (\"letter\", \"24x36\", \"half letter\"). Cards are 3.5x2; flyers 8.5x5.5|8.5x11|11x17; posters 12x18 through 36x48. Unknown sizes get closest-match offers"
},
"paper": {
"type": "string",
"description": "Paper stock — free-form (\"matte\", \"glossy\", \"recycled\", \"14pt\"). Resolved to the closest stock the vendor runs"
},
"sides": {
"type": "string",
"description": "single|double sided printing (defaults: cards double, flyers/posters single)"
},
"placement": {
"type": "string",
"description": "Print placement for apparel: front (default) | back | front_back"
},
"processes": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 8,
"description": "Only quote these fabrication processes — a constraint that narrows the auto-routing fan. Friendly terms accepted (\"sheet metal\", \"3d printing\", \"cnc\", \"laser\"); unmappable terms are reported, never an error. Usually OMIT: auto-routing quotes every process that can make the file. Pass it only when the user explicitly limits the process"
},
"ships_from": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 8,
"description": "Only vendors that ship from these countries/regions (\"only US vendors\", \"keep it domestic\") — an INCLUDE list. Friendly terms accepted (\"US\", \"Europe\", \"Germany\", \"China\", \"UK\"); unmappable terms are reported, never an error. Vendors whose origin is unknown or whose network is worldwide (origin not guaranteed) are excluded, each with a note saying why. Usually OMIT: pass it only when the user explicitly limits where vendors ship from"
},
"vendors": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 16,
"description": "Only these specific vendors/makers (\"just quote Slant 3D\") — an INCLUDE list of vendor names as they appear on offers. Friendly names accepted (\"A3D\", \"slant 3d\"); unmatched names are reported, never an error. Usually OMIT: pass it only when the user explicitly names the vendors they want"
},
"deadline": {
"type": "string",
"description": "Latest acceptable delivery date, ISO YYYY-MM-DD"
},
"outdoor_rated": {
"type": "boolean",
"description": "Must survive outdoor exposure"
},
"submersible": {
"type": "boolean",
"description": "Must survive submersion in water"
},
"high_temp": {
"type": "boolean",
"description": "Must tolerate sustained heat (vendor heat-resistance claim)"
},
"food_safe": {
"type": "boolean",
"description": "Must be vendor-certified food safe"
},
"requirements": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"maxItems": 20,
"description": "Verbatim context terms from the user — materials, finishes, certifications, tolerances (\"UV resistant\", \"anodized: red\", \"iso 13485\", \"tolerance: 0.1mm\"). UFP applies what it can and reports what it could not; unresolvable terms are logged for vendor sourcing. Do not interrogate the user to fill this — pass what they said."
},
"callouts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "number"
},
"unit": {
"type": "string",
"enum": [
"mm",
"in"
]
},
"tolerance_mm": {
"type": "number",
"exclusiveMinimum": 0
},
"critical": {
"type": "boolean"
}
},
"required": [
"name",
"value",
"unit"
],
"additionalProperties": false
},
"maxItems": 50,
"description": "Dimensions you read off the user's drawing that matter (\"hole_diameter 6.5mm ±0.1\"). The tightest tolerance prunes vendors that cannot hold it."
},
"max_budget_usd": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Hard budget cap in USD, all-in"
},
"min_vendor_stars": {
"type": "number",
"minimum": 1,
"maximum": 5,
"description": "Only vendors whose displayed review rating is at least this many stars (1-5). Vendors with no reviews yet are excluded — the filter demands demonstrated quality"
},
"min_vendor_reviews": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "Only vendors with at least this many verified-purchase reviews"
},
"proven_spec_orders": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "Only vendors with at least N completed orders for this exact process+material — \"a vendor that prints PC reliably\""
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}