{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://uqp.dev/spec/ucp/2026-11-05/estimate.json",
"name": "dev.uqp.quoting.estimate",
"version": "2026-11-05",
"title": "Stateless quoting estimate",
"description": "Reference capability of dev.uqp.quoting, not a live merchant. Stage 1 is stateless, targets under 200 ms, and requires no human effort. Estimates are not binding quotes. UCP 2026-08-25 wire mapping; no conformance claim.",
"$defs": {
"request": {
"type": "object",
"properties": {
"pack_id": {
"$ref": "https://uqp.dev/spec/schemas/common.json#/$defs/packId"
},
"pack_version": {
"$ref": "https://uqp.dev/spec/schemas/common.json#/$defs/packVersion"
},
"answers": {
"$ref": "https://uqp.dev/spec/schemas/common.json#/$defs/answers"
}
},
"required": [
"pack_id",
"pack_version",
"answers"
],
"additionalProperties": false
},
"response": {
"type": "object",
"properties": {
"price_range": {
"$ref": "#/$defs/priceRange"
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"quantity_unit": {
"$ref": "#/$defs/quantityUnit"
},
"sessions": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"count"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"requires_review": {
"type": "boolean"
},
"expires_at": {
"type": "string",
"format": "date-time"
}
},
"required": [
"price_range",
"assumptions",
"requires_review",
"expires_at"
],
"additionalProperties": false,
"anyOf": [
{
"required": [
"sessions"
],
"properties": {
"sessions": {}
}
},
{
"required": [
"quantity",
"quantity_unit"
],
"properties": {
"quantity": {},
"quantity_unit": {}
}
}
]
},
"minorUnits": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"priceRange": {
"type": "object",
"properties": {
"min_minor": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"max_minor": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$"
}
},
"required": [
"min_minor",
"max_minor",
"currency"
],
"additionalProperties": false
},
"quantityUnit": {
"type": "object",
"properties": {
"unit": {
"enum": [
"C62",
"INH",
"CMT",
"FTK",
"MTK",
"HUR",
"MIN"
]
},
"scale": {
"type": "integer",
"minimum": 0,
"maximum": 15,
"default": 0
},
"display_text": {
"type": "string"
}
},
"required": [
"unit",
"display_text"
],
"additionalProperties": false,
"description": "Rec 20 sale basis. Quantity counts steps of 10^-scale units; omitted scale means 0. Each uses scale 0. An explicit descriptor includes its printable label.",
"allOf": [
{
"if": {
"properties": {
"unit": {
"const": "C62"
}
},
"required": [
"unit"
]
},
"then": {
"properties": {
"scale": {
"const": 0
}
}
}
}
]
},
"quoteRequest": {
"$ref": "https://uqp.dev/spec/schemas/quote-request.json"
},
"quoteResult": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"state": {
"$ref": "https://uqp.dev/spec/schemas/lifecycle.json"
},
"quote": {
"$ref": "#/$defs/response",
"description": "Reviewed price projection in integer minor units, not the native core UQP Quote object."
},
"quote_lock": {
"$ref": "https://uqp.dev/spec/ucp/2026-11-05/quote_lock.json#/$defs/quote_lock"
}
},
"required": [
"id",
"state"
],
"additionalProperties": false,
"description": "Stage 2 enters VALIDATED_PENDING_REVIEW before provider review yields QUOTED. Poll GET /quotes/{id}. The optional quote field is a reviewed price projection using integer minor units, not the native core UQP Quote object. Silence never accepts a quote.",
"title": "Stage 2 lifecycle result with reviewed minor-unit price projection"
}
}
}