Properties and definitions
| Property / definition | Required | Type / reference | Description / constraints |
|---|---|---|---|
| pack_id | yes | common.json#/$defs/packId | {“$ref”:“common.json#/$defs/packId”} |
| pack_version | yes | common.json#/$defs/packVersion | {“$ref”:“common.json#/$defs/packVersion”} |
| answers | yes | common.json#/$defs/answers | {“$ref”:“common.json#/$defs/answers”} |
| artist_review_mode | yes | common.json#/$defs/reviewMode | {“$ref”:“common.json#/$defs/reviewMode”} |
| price_range | yes | common.json#/$defs/priceRange | {“$ref”:“common.json#/$defs/priceRange”} |
| sessions | yes | object | {“type”:“object”,“properties”:{“count”:{“type”:“integer”,“minimum”:0},“hours_per_session”:{“type”:“number”,“minimum”:0}},“required”:[“count”,“hours_per_session”],“additionalProperties”:false} |
| deposit | yes | common.json#/$defs/deposit | {“$ref”:“common.json#/$defs/deposit”} |
| assumptions | yes | array | {“type”:“array”,“items”:{“type”:“string”}} |
| intermediates | yes | array | {“type”:“array”,“minItems”:1,“items”:{“type”:“object”,“properties”:{“step”:{“type”:“string”,“minLength”:1},“factor_id”:{“type”:“string”,“minLength”:1},“input”:{},“value”:{},“skipped”:{“const”:true},“reason”:{“type”:“string”}},“required”:[“step”,“factor_id”,“input”,“value”],“additionalProperties”:false}} |
| review_status | yes | enum | {“enum”:[“QUOTED”,“ACCEPTED”,“DECLINED”,“EXPIRED”]} |
| consent | yes | common.json#/$defs/consent | {“$ref”:“common.json#/$defs/consent”} |
| anonymized | yes | boolean | {“type”:“boolean”} |
| valid_until | yes | string | {“type”:“string”,“format”:“date-time”} |
| kind | yes | see JSON | {“const”:“quote”} |
| binding | yes | see JSON | {“const”:true} |
| confidence | yes | enum | {“enum”:[“low”,“medium”,“high”]} |
| client_approval | no | common.json#/$defs/clientApproval | {“$ref”:“common.json#/$defs/clientApproval”} |
| attribution | no | common.json#/$defs/attribution | {“$ref”:“common.json#/$defs/attribution”} |
| quantity | no | common.json#/$defs/quantity | {“$ref”:“common.json#/$defs/quantity”} |
| quantity_unit | no | common.json#/$defs/quantityUnit | {“$ref”:“common.json#/$defs/quantityUnit”} |
| checkout_handoff | no | common.json#/$defs/checkoutHandoff | {“$ref”:“common.json#/$defs/checkoutHandoff”} |
| id | no | common.json#/$defs/identifier | {“$ref”:“common.json#/$defs/identifier”} |
| expires_at | no | string | {“type”:“string”,“format”:“date-time”} |
Full JSON
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://uqp.dev/spec/schemas/quote.json",
"title": "Quote",
"type": "object",
"properties": {
"pack_id": {
"$ref": "common.json#/$defs/packId"
},
"pack_version": {
"$ref": "common.json#/$defs/packVersion"
},
"answers": {
"$ref": "common.json#/$defs/answers"
},
"artist_review_mode": {
"$ref": "common.json#/$defs/reviewMode"
},
"price_range": {
"$ref": "common.json#/$defs/priceRange"
},
"sessions": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"hours_per_session": {
"type": "number",
"minimum": 0
}
},
"required": [
"count",
"hours_per_session"
],
"additionalProperties": false
},
"deposit": {
"$ref": "common.json#/$defs/deposit"
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"intermediates": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"step": {
"type": "string",
"minLength": 1
},
"factor_id": {
"type": "string",
"minLength": 1
},
"input": {},
"value": {},
"skipped": {
"const": true
},
"reason": {
"type": "string"
}
},
"required": [
"step",
"factor_id",
"input",
"value"
],
"additionalProperties": false
}
},
"review_status": {
"enum": [
"QUOTED",
"ACCEPTED",
"DECLINED",
"EXPIRED"
]
},
"consent": {
"$ref": "common.json#/$defs/consent"
},
"anonymized": {
"type": "boolean"
},
"valid_until": {
"type": "string",
"format": "date-time"
},
"kind": {
"const": "quote"
},
"binding": {
"const": true
},
"confidence": {
"enum": [
"low",
"medium",
"high"
]
},
"client_approval": {
"$ref": "common.json#/$defs/clientApproval"
},
"attribution": {
"$ref": "common.json#/$defs/attribution"
},
"quantity": {
"$ref": "common.json#/$defs/quantity"
},
"quantity_unit": {
"$ref": "common.json#/$defs/quantityUnit"
},
"checkout_handoff": {
"$ref": "common.json#/$defs/checkoutHandoff"
},
"id": {
"$ref": "common.json#/$defs/identifier"
},
"expires_at": {
"type": "string",
"format": "date-time"
}
},
"required": [
"pack_id",
"pack_version",
"answers",
"artist_review_mode",
"sessions",
"deposit",
"valid_until",
"assumptions",
"intermediates",
"review_status",
"consent",
"anonymized",
"price_range",
"kind",
"binding",
"confidence"
],
"additionalProperties": false,
"allOf": [
{
"if": {
"properties": {
"review_status": {
"const": "ACCEPTED"
}
},
"required": [
"review_status"
]
},
"then": {
"required": [
"client_approval"
],
"properties": {
"client_approval": {}
}
}
}
]
}
Reference example
Tattoo pack 0.1.0 at a fixed evaluation time. Example data, not real prices. The Quote represents synthetic artist review, not evaluator approval.{
"kind": "quote",
"binding": true,
"confidence": "low",
"pack_id": "tattoo",
"pack_version": "0.1.0",
"answers": {
"description": "A small geometric mountain design with clean outlines.",
"size": "sm",
"placement": [
"Lower Arm"
],
"complexity": "simple",
"style": "blackgrey"
},
"artist_review_mode": "post_price",
"price_range": {
"min": 150,
"max": 250,
"currency": "USD",
"basis": "hourly",
"method": "rule",
"provenance": {
"who": "Example artist (synthetic review)",
"when": "2026-11-05T12:00:00Z"
}
},
"sessions": {
"count": 1,
"hours_per_session": 1
},
"deposit": {
"amount": 50,
"basis": "low",
"provenance": {
"who": "PricingModel tattoo@0.1.0 (example rules, unvalidated)",
"when": "2026-11-05T12:00:00.000Z"
},
"policies": [
"Example data, not real prices; provider must state final deposit policies before artist review."
],
"status": "unpaid",
"merchant_of_record": "provider"
},
"assumptions": [
"tattoo.co current constant, unvalidated; supplied handoff attributed to f018b86, not independently revalidated.",
"Pricing uses unrounded hours; display logs both Formula A Math.round(t*10)/10 and Formula B toFixed(1).",
"Sessions are a provisional single block (zero for by_piece); session splitting and caps are not modeled.",
"Multiple placements trigger any-tricky once; area summing is not modeled.",
"Raw answers are preserved; anonymized=false because free text has not been deidentified."
],
"intermediates": [
{
"step": "pricing_mode",
"factor_id": "pricing",
"input": "hourly",
"value": "hourly"
},
{
"step": "input_resolved",
"factor_id": "complexity",
"input": {
"source": "asked",
"rule_id": null,
"keywords": []
},
"value": "simple"
},
{
"step": "input_resolved",
"factor_id": "style",
"input": {
"source": "asked",
"rule_id": null,
"keywords": []
},
"value": "blackgrey"
},
{
"step": "input_resolved",
"factor_id": "size",
"input": {
"source": "asked",
"rule_id": null,
"keywords": []
},
"value": "sm"
},
{
"step": "input_resolved",
"factor_id": "placement",
"input": {
"source": "asked",
"rule_id": null,
"keywords": []
},
"value": [
"Lower Arm"
]
},
{
"step": "input_resolved",
"factor_id": "tier",
"input": {
"source": "configured",
"rule_id": null,
"keywords": []
},
"value": "fallback_standard"
},
{
"step": "input_resolved",
"factor_id": "deposit",
"input": {
"source": "configured",
"rule_id": null,
"keywords": []
},
"value": "pct_of_low_30"
},
{
"step": "dimensions",
"factor_id": "size",
"input": {
"raw_size": "sm",
"width": null,
"height": null
},
"value": {
"width": 3,
"height": 3
}
},
{
"step": "area",
"factor_id": "size",
"input": {
"width": 3,
"height": 3
},
"value": 9
},
{
"step": "base_hours",
"factor_id": "size",
"input": {
"area": 9,
"area_per_hour": 12,
"minimum_hours": 1
},
"value": 1
},
{
"step": "placement",
"factor_id": "placement",
"input": {
"hours": 1,
"placements": [
"Lower Arm"
],
"mode": "additive_0_5h",
"match": "substring",
"tricky": false,
"adjustment": 0
},
"value": 1
},
{
"step": "complexity",
"factor_id": "complexity",
"input": {
"source": "asked",
"selected": "simple",
"hours": 1
},
"value": 1
},
{
"step": "complexity_hours",
"factor_id": "complexity",
"input": {
"multiplier": 1
},
"value": 1
},
{
"step": "skipped",
"factor_id": "wraparound",
"input": {
"skipped": true,
"reason": "disabled",
"question_ids": []
},
"value": 1,
"skipped": true,
"reason": "disabled"
},
{
"step": "hours_raw",
"factor_id": "hours",
"input": {
"pricing_mode": "hourly"
},
"value": 1
},
{
"step": "hours_estimate",
"factor_id": "hours",
"input": {
"raw": 1,
"decimal_places": 1,
"formula_a": 1,
"formula_b": "1.0"
},
"value": 1
},
{
"step": "tier",
"factor_id": "tier",
"input": {
"source": "fallback_standard",
"complexity": "simple",
"style": "blackgrey",
"rule_id": null,
"keywords": [],
"used": true
},
"value": "standard"
},
{
"step": "rate",
"factor_id": "rate",
"input": {
"pricing_mode": "hourly"
},
"value": {
"amount": 200,
"source": "tier:standard"
}
},
{
"step": "style",
"factor_id": "style",
"input": {
"source": "asked",
"selected": "blackgrey"
},
"value": 1
},
{
"step": "subtotal",
"factor_id": "pricing",
"input": {
"hours": 1,
"rate": 200,
"style_multiplier": 1
},
"value": 200
},
{
"step": "shop_minimum",
"factor_id": "minimum",
"input": {
"subtotal": 200,
"minimum": 200,
"applied": false
},
"value": 200
},
{
"step": "total",
"factor_id": "pricing",
"input": {
"by_piece": false
},
"value": 200
},
{
"step": "range_band",
"factor_id": "range",
"input": {
"total": 200,
"low_multiplier": 0.85,
"high_multiplier": 1.15
},
"value": {
"low": 170,
"high": 229.99999999999997
}
},
{
"step": "range",
"factor_id": "range",
"input": {
"low": 170,
"high": 229.99999999999997,
"rounding": {
"increment": 50,
"mode": "nearest"
}
},
"value": {
"low": 150,
"high": 250
}
},
{
"step": "deposit_base",
"factor_id": "deposit",
"input": {
"basis": "low",
"base": 150,
"percentage": 0.3
},
"value": 45
},
{
"step": "deposit_raw",
"factor_id": "deposit",
"input": {
"basis": "low"
},
"value": 45
},
{
"step": "deposit",
"factor_id": "deposit",
"input": {
"mode": "pct_of_low_30",
"unrounded": 45,
"increment": 25,
"minimum": 0
},
"value": 50
},
{
"step": "skipped",
"factor_id": "sessions",
"input": {
"skipped": true,
"reason": "disabled",
"question_ids": []
},
"value": 0,
"skipped": true,
"reason": "disabled"
},
{
"step": "skipped",
"factor_id": "cover_up",
"input": {
"skipped": true,
"reason": "disabled",
"question_ids": []
},
"value": 0,
"skipped": true,
"reason": "disabled"
},
{
"step": "skipped",
"factor_id": "multi_area",
"input": {
"skipped": true,
"reason": "disabled",
"question_ids": []
},
"value": 0,
"skipped": true,
"reason": "disabled"
},
{
"step": "skipped",
"factor_id": "city_rate",
"input": {
"skipped": true,
"reason": "disabled",
"question_ids": []
},
"value": 0,
"skipped": true,
"reason": "disabled"
},
{
"step": "skipped",
"factor_id": "non_usd",
"input": {
"skipped": true,
"reason": "disabled",
"question_ids": []
},
"value": 0,
"skipped": true,
"reason": "disabled"
},
{
"step": "sessions",
"factor_id": "sessions",
"input": {
"hours": 1,
"provisional": true
},
"value": {
"count": 1,
"hours_per_session": 1
}
},
{
"step": "expiry",
"factor_id": "expiry",
"input": {
"now": "2026-11-05T12:00:00.000Z",
"expiry_days": 7
},
"value": "2026-11-12T12:00:00.000Z"
}
],
"review_status": "QUOTED",
"consent": {
"share_for_pricing_research": false,
"anonymize": true,
"captured_at": "2026-11-05T12:00:00Z"
},
"anonymized": false,
"valid_until": "2026-11-12T12:00:00.000Z"
}