> ## Documentation Index
> Fetch the complete documentation index at: https://uqp.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Estimate

> Non-binding PricingModel result returned on PAYLOAD_SUBMITTED; incomplete inputs require mutation, never omission of a price.

Source: spec/schemas/estimate.json. Draft v0.1; reference, not production.

Non-binding PricingModel result returned on PAYLOAD\_SUBMITTED; incomplete inputs require mutation, never omission of a price.

## 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 | see JSON | \{"oneOf":\[\{"type":"object","properties":\{"count":\{"type":"integer","minimum":0},"hours\_per\_session":\{"type":"number","minimum":0}},"required":\["count","hours\_per\_session"],"additionalProperties":false},\{"type":"object","properties":\{"min":\{"type":"integer","minimum":1},"max":\{"type":"integer","minimum":1}},"required":\["min","max"],"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":\["VALIDATED\_PENDING\_REVIEW","MUTATION\_REQUIRED"]} |
| consent | yes | common.json#/\$defs/consent | \{"\$ref":"common.json#/\$defs/consent"} |
| anonymized | yes | boolean | \{"type":"boolean"} |
| kind | yes | see JSON | \{"const":"estimate"} |
| binding | yes | see JSON | \{"const":false} |
| confidence | yes | enum | \{"enum":\["low","medium","high"]} |
| requires\_in\_person\_consult | no | boolean | \{"type":"boolean"} |

## Full JSON

```json theme={null}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://uqp.dev/spec/schemas/estimate.json",
  "title": "Estimate",
  "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": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "count": {
              "type": "integer",
              "minimum": 0
            },
            "hours_per_session": {
              "type": "number",
              "minimum": 0
            }
          },
          "required": [
            "count",
            "hours_per_session"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "min": {
              "type": "integer",
              "minimum": 1
            },
            "max": {
              "type": "integer",
              "minimum": 1
            }
          },
          "required": [
            "min",
            "max"
          ],
          "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": [
        "VALIDATED_PENDING_REVIEW",
        "MUTATION_REQUIRED"
      ]
    },
    "consent": {
      "$ref": "common.json#/$defs/consent"
    },
    "anonymized": {
      "type": "boolean"
    },
    "kind": {
      "const": "estimate"
    },
    "binding": {
      "const": false
    },
    "confidence": {
      "enum": [
        "low",
        "medium",
        "high"
      ]
    },
    "requires_in_person_consult": {
      "type": "boolean"
    }
  },
  "required": [
    "pack_id",
    "pack_version",
    "answers",
    "artist_review_mode",
    "sessions",
    "deposit",
    "assumptions",
    "intermediates",
    "review_status",
    "consent",
    "anonymized",
    "price_range",
    "kind",
    "binding",
    "confidence"
  ],
  "additionalProperties": false,
  "description": "Non-binding PricingModel result returned on PAYLOAD_SUBMITTED; incomplete inputs require mutation, never omission of a price."
}
```

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

```json theme={null}
{
  "kind": "estimate",
  "binding": false,
  "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": "PricingModel tattoo@0.1.0 (example rules, unvalidated)",
      "when": "2026-11-05T12:00:00.000Z"
    }
  },
  "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": "VALIDATED_PENDING_REVIEW",
  "consent": {
    "share_for_pricing_research": false,
    "anonymize": true,
    "captured_at": "2026-11-05T12:00:00Z"
  },
  "anonymized": false
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.