{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/agenticfabricationnetwork-ai/json-schema/agenticfabricationnetwork-ai-quote-preview-response-schema.json",
  "title": "QuotePreviewResponse",
  "description": "The SOFT quote (POST /v1/quotes/{id}/preview): the deterministic routing half of a refine — intake sniff, process filter, health/pause gates, capability gate, envelope prune, expected-vendor sizing — run for the refined request and stopped BEFORE the shell. Nothing is created: no child quote, no vendor dispatch, no supersede epoch, no demand-ledger or corpus write, so a client may fire one per edit. expected_vendors are exactly the rows the real refine's shell would publish; notes are the shell's notes verbatim (every plan-time 'vendor <id> excluded: …' line included). An expectation, never a promise — lanes can still decline once asked.",
  "x-generated": "2026-11-01",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/agenticfabricationnetwork-ai-openapi.json#/components/schemas/QuotePreviewResponse",
  "type": "object",
  "required": [
    "status",
    "quote_id",
    "process",
    "fabricators",
    "lanes",
    "expected_vendors",
    "notes"
  ],
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "preview"
      ]
    },
    "quote_id": {
      "type": "string",
      "description": "The quote the preview was planned against (the refine's parent)"
    },
    "process": {
      "type": "string",
      "enum": [
        "fdm_print",
        "resin_print",
        "powder_print",
        "metal_print",
        "elastomer_print",
        "cnc",
        "sheetmetal",
        "laser_cut",
        "decal",
        "print",
        "apparel",
        "auto"
      ]
    },
    "fabricators": {
      "type": "integer",
      "minimum": 0,
      "description": "Distinct fabricators across every expected lane"
    },
    "lanes": {
      "type": "array",
      "description": "Every candidate lane in routing order — zero-vendor lanes included",
      "items": {
        "type": "object",
        "required": [
          "process",
          "vendors"
        ],
        "properties": {
          "process": {
            "type": "string"
          },
          "vendors": {
            "type": "integer",
            "minimum": 0
          },
          "quotes": {
            "type": "integer",
            "description": "Estimated quotes on the lane — one per shop for a stated material, a shop's declared material count for a defaults run. An expectation; real quotes replace it."
          }
        }
      }
    },
    "expected_vendors": {
      "type": "array",
      "description": "Same rows as QuoteResponse.routing.expected_vendors would carry on the shell",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "spec_asked": {
      "type": "object",
      "additionalProperties": true,
      "description": "The refined ask's articulated spec (same filter as QuoteResponse.spec_asked)"
    }
  }
}