{
  "components": {
    "schemas": {
      "Accept": {
        "properties": {
          "accepted_terms": {
            "type": "boolean"
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "customer": {
            "$ref": "#/components/schemas/Customer"
          },
          "notes": {
            "maxLength": 2000,
            "type": "string"
          },
          "po_number": {
            "type": "string"
          },
          "shipping": {
            "type": "object"
          }
        },
        "required": [
          "accepted_terms"
        ],
        "type": "object"
      },
      "Bootstrap": {
        "properties": {
          "badge_mode": {
            "enum": [
              "standard",
              "minimal",
              "hidden"
            ]
          },
          "checkout": {
            "type": "object"
          },
          "compare": {
            "type": "boolean"
          },
          "configurations": {
            "items": {
              "$ref": "#/components/schemas/BootstrapConfig"
            },
            "type": "array"
          },
          "custom_fields": {
            "description": "What the shop asks beside the options; `scope` says whether to ask once or per part.",
            "items": {
              "$ref": "#/components/schemas/CustomField"
            },
            "type": "array"
          },
          "limits": {
            "properties": {
              "formats": {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "max_file_bytes": {
                "type": "integer"
              },
              "max_files": {
                "description": "How many parts one quote may carry.",
                "type": "integer"
              }
            },
            "type": "object"
          },
          "mode": {
            "enum": [
              "live",
              "test"
            ]
          },
          "name": {
            "type": "string"
          },
          "texts": {
            "description": "Languages the widget offers and per-language overrides of its own strings.",
            "type": "object"
          },
          "theme": {
            "type": "object"
          },
          "widget_id": {
            "type": "string"
          }
        },
        "required": [
          "widget_id",
          "mode",
          "configurations",
          "limits"
        ],
        "type": "object"
      },
      "BootstrapConfig": {
        "properties": {
          "build_volume_mm": {
            "description": "Largest usable build envelope across the configuration's machines, in millimetres.",
            "items": {
              "type": "number"
            },
            "maxItems": 3,
            "minItems": 3,
            "nullable": true,
            "type": "array"
          },
          "currency": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "options": {
            "properties": {
              "max_qty": {
                "type": "integer"
              },
              "min_qty": {
                "type": "integer"
              },
              "options": {
                "items": {
                  "$ref": "#/components/schemas/OptionSpec"
                },
                "type": "array"
              },
              "process": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "process": {
            "type": "string"
          },
          "shipping": {
            "description": "What the shipping estimator may ask for. Never the tariffs themselves.",
            "properties": {
              "countries": {
                "description": "Countries the shop has a tariff for; empty unless the mode is a table.",
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "mode": {
                "enum": [
                  "none",
                  "pickup",
                  "flat",
                  "table",
                  "quote_later"
                ]
              },
              "postcode_matters": {
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "version": {
            "type": "integer"
          },
          "visibility": {
            "properties": {
              "buyer_level": {
                "type": "string"
              },
              "review_price": {
                "type": "string"
              },
              "show_time": {
                "type": "boolean"
              },
              "show_weight": {
                "type": "boolean"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "id",
          "version",
          "label",
          "name",
          "process",
          "currency",
          "options",
          "visibility"
        ],
        "type": "object"
      },
      "Bytes": {
        "description": "The raw bytes: the whole file, or exactly one part's slice of it.",
        "format": "binary",
        "type": "string"
      },
      "Choice": {
        "properties": {
          "available_when": {
            "additionalProperties": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "type": "object"
          },
          "badge": {
            "type": "string"
          },
          "extra_lead_days": {
            "type": "number"
          },
          "hex": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "$ref": "#/components/schemas/I18nText"
          },
          "note": {
            "$ref": "#/components/schemas/I18nText"
          },
          "properties": {
            "$ref": "#/components/schemas/MaterialProperties"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "type": "object"
      },
      "CompleteUpload": {
        "properties": {
          "unit": {
            "enum": [
              "mm",
              "cm",
              "m",
              "inch"
            ]
          }
        },
        "type": "object"
      },
      "Control": {
        "oneOf": [
          {
            "properties": {
              "choices": {
                "items": {
                  "$ref": "#/components/schemas/Choice"
                },
                "type": "array"
              },
              "type": {
                "enum": [
                  "cards",
                  "swatches",
                  "segmented"
                ]
              }
            },
            "required": [
              "type",
              "choices"
            ],
            "type": "object"
          },
          {
            "properties": {
              "max": {
                "type": "number"
              },
              "min": {
                "type": "number"
              },
              "step": {
                "type": "number"
              },
              "type": {
                "const": "slider"
              },
              "unit": {
                "type": "string"
              }
            },
            "required": [
              "type",
              "min",
              "max",
              "step",
              "unit"
            ],
            "type": "object"
          },
          {
            "properties": {
              "type": {
                "const": "toggle"
              }
            },
            "required": [
              "type"
            ],
            "type": "object"
          },
          {
            "properties": {
              "max": {
                "type": "number"
              },
              "type": {
                "const": "count"
              }
            },
            "required": [
              "type",
              "max"
            ],
            "type": "object"
          }
        ]
      },
      "CouponStatus": {
        "properties": {
          "applied": {
            "type": "boolean"
          },
          "code": {
            "type": "string"
          },
          "reason": {
            "enum": [
              "unknown",
              "disabled",
              "not_started",
              "expired",
              "exhausted",
              "already_used",
              "first_order_only",
              "min_order",
              "not_applicable",
              "currency",
              null
            ],
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "code",
          "applied"
        ],
        "type": "object"
      },
      "CreateUpload": {
        "properties": {
          "content_hash": {
            "description": "Lower-case hex SHA-256 of the file, if the browser hashed it first; the bytes that land are checked against it.",
            "type": [
              "string",
              "null"
            ]
          },
          "filename": {
            "type": "string"
          },
          "size_bytes": {
            "type": "integer"
          }
        },
        "required": [
          "filename",
          "size_bytes"
        ],
        "type": "object"
      },
      "CustomField": {
        "description": "One field the shop asks for.",
        "properties": {
          "choices": {
            "items": {
              "properties": {
                "id": {
                  "type": "string"
                },
                "label": {
                  "$ref": "#/components/schemas/I18nText"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "help": {
            "$ref": "#/components/schemas/I18nText"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "$ref": "#/components/schemas/I18nText"
          },
          "max": {
            "type": [
              "number",
              "string",
              "null"
            ]
          },
          "max_len": {
            "type": "integer"
          },
          "min": {
            "type": [
              "number",
              "string",
              "null"
            ]
          },
          "multiline": {
            "type": "boolean"
          },
          "required": {
            "type": "boolean"
          },
          "scope": {
            "enum": [
              "order",
              "part"
            ]
          },
          "show_when": {
            "additionalProperties": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "type": "object"
          },
          "type": {
            "enum": [
              "text",
              "number",
              "select",
              "multi_select",
              "checkbox",
              "date"
            ]
          },
          "unit": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "type"
        ],
        "type": "object"
      },
      "CustomFieldValues": {
        "additionalProperties": {
          "items": {
            "type": "string"
          },
          "type": [
            "string",
            "number",
            "boolean",
            "array"
          ]
        },
        "description": "Answers to the widget's custom fields, by field id (spec §6.4). Checked when a quote is saved, never while pricing - a custom field does not move a price.",
        "type": "object"
      },
      "Customer": {
        "properties": {
          "company": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "vat_id": {
            "type": "string"
          }
        },
        "required": [
          "email",
          "name"
        ],
        "type": "object"
      },
      "CustomerView": {
        "properties": {
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "net_terms": {
            "type": "boolean"
          },
          "price_list": {
            "type": [
              "string",
              "null"
            ]
          },
          "token_error": {
            "type": [
              "string",
              "null"
            ]
          },
          "verified": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "EventStream": {
        "description": "text/event-stream of {status} objects until done or failed",
        "type": "string"
      },
      "Glb": {
        "format": "binary",
        "type": "string"
      },
      "HostedAccepted": {
        "properties": {
          "number": {
            "type": "string"
          },
          "order_id": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "totals": {
            "$ref": "#/components/schemas/Totals"
          }
        },
        "type": "object"
      },
      "HostedQuote": {
        "properties": {
          "currency": {
            "type": "string"
          },
          "customer": {
            "type": [
              "object",
              "null"
            ]
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "lines": {
            "items": {
              "type": "object"
            },
            "type": "array"
          },
          "message": {
            "type": "string"
          },
          "number": {
            "type": "string"
          },
          "shop": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "totals": {
            "$ref": "#/components/schemas/Totals"
          }
        },
        "type": "object"
      },
      "I18nText": {
        "additionalProperties": {
          "type": "string"
        },
        "description": "Text by BCP-47 locale",
        "type": "object"
      },
      "Issue": {
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "severity": {
            "type": "string"
          }
        },
        "required": [
          "severity",
          "code",
          "path",
          "message"
        ],
        "type": "object"
      },
      "LineItemRequest": {
        "properties": {
          "configuration_id": {
            "type": "string"
          },
          "custom_fields": {
            "$ref": "#/components/schemas/CustomFieldValues"
          },
          "line_ref": {
            "type": "string"
          },
          "model_part_id": {
            "type": "string"
          },
          "quantity": {
            "minimum": 1,
            "type": "integer"
          },
          "selections": {
            "$ref": "#/components/schemas/Selections"
          }
        },
        "required": [
          "line_ref",
          "model_part_id",
          "configuration_id",
          "quantity"
        ],
        "type": "object"
      },
      "LineView": {
        "properties": {
          "breakdown": {
            "properties": {
              "estimates": {
                "properties": {
                  "time_s": {
                    "type": "number"
                  },
                  "weight_g": {
                    "type": "number"
                  }
                },
                "type": "object"
              },
              "level": {
                "type": "string"
              },
              "rows": {
                "items": {
                  "properties": {
                    "amount": {
                      "$ref": "#/components/schemas/Money"
                    },
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "configuration": {
            "properties": {
              "id": {
                "type": "string"
              },
              "version": {
                "type": "integer"
              }
            },
            "type": "object"
          },
          "dfm": {
            "items": {
              "properties": {
                "action": {
                  "type": "string"
                },
                "code": {
                  "type": "string"
                },
                "limit": {
                  "type": "number"
                },
                "measure": {
                  "type": "number"
                },
                "unit": {
                  "type": "string"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "issues": {
            "items": {
              "$ref": "#/components/schemas/Issue"
            },
            "type": "array"
          },
          "lead_times": {
            "items": {
              "properties": {
                "business_days": {
                  "type": "integer"
                },
                "id": {
                  "type": "string"
                },
                "selected": {
                  "type": "boolean"
                },
                "ship_by": {
                  "format": "date",
                  "type": "string"
                },
                "unit_price": {
                  "$ref": "#/components/schemas/Money"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "line_ref": {
            "type": "string"
          },
          "line_total": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ]
          },
          "messages": {
            "items": {
              "properties": {
                "text": {
                  "$ref": "#/components/schemas/I18nText"
                },
                "warn": {
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "price_breaks": {
            "items": {
              "properties": {
                "quantity": {
                  "type": "integer"
                },
                "saving_pct": {
                  "type": "number"
                },
                "unit_price": {
                  "$ref": "#/components/schemas/Money"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "quantity": {
            "type": "integer"
          },
          "reasons": {
            "items": {
              "properties": {
                "code": {
                  "type": "string"
                },
                "message": {
                  "$ref": "#/components/schemas/I18nText"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "selections": {
            "$ref": "#/components/schemas/Selections"
          },
          "state": {
            "enum": [
              "ok",
              "review",
              "blocked"
            ]
          },
          "unit_price": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "line_ref",
          "state",
          "reasons",
          "selections",
          "issues",
          "quantity",
          "breakdown",
          "price_breaks",
          "lead_times",
          "dfm",
          "messages",
          "configuration"
        ],
        "type": "object"
      },
      "MaterialProperties": {
        "description": "Buyer-facing material properties (spec §4.1): five 1–5 ratings, measured figures, resistances, datasheet link, \"best for\" tags. Never a cost or a rate.",
        "properties": {
          "best_for": {
            "items": {
              "$ref": "#/components/schemas/I18nText"
            },
            "type": "array"
          },
          "chemical": {
            "enum": [
              "unknown",
              "poor",
              "fair",
              "good"
            ]
          },
          "datasheet_url": {
            "type": "string"
          },
          "detail": {
            "type": "integer"
          },
          "elongation_pct": {
            "type": "number"
          },
          "extra": {
            "additionalProperties": {
              "$ref": "#/components/schemas/I18nText"
            },
            "type": "object"
          },
          "flex": {
            "type": "integer"
          },
          "food_safe": {
            "type": "boolean"
          },
          "hdt_c": {
            "type": "number"
          },
          "heat": {
            "type": "integer"
          },
          "price_level": {
            "description": "Relative to the shop's own range; not a price.",
            "type": "integer"
          },
          "shore": {
            "type": "string"
          },
          "strength": {
            "type": "integer"
          },
          "tensile_mpa": {
            "type": "number"
          },
          "uv": {
            "enum": [
              "unknown",
              "poor",
              "fair",
              "good"
            ]
          }
        },
        "type": "object"
      },
      "ModelQueued": {
        "properties": {
          "model_id": {
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "ModelView": {
        "properties": {
          "attempt": {
            "description": "The attempt of the analysis the worker is on: 1 for the first, 0 before any; past 1 it is being tried again.",
            "type": "integer"
          },
          "failure_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "filename": {
            "description": "The name the buyer's file had.",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "parts": {
            "items": {
              "$ref": "#/components/schemas/Part"
            },
            "type": "array"
          },
          "preview_url": {
            "description": "Decimated preview mesh as binary glTF (spec §2.11), presigned for an hour.",
            "type": [
              "string",
              "null"
            ]
          },
          "retrying": {
            "description": "An attempt failed on our side and the analysis is queued to run again.",
            "type": "boolean"
          },
          "status": {
            "enum": [
              "queued",
              "parsing",
              "analysing",
              "done",
              "failed"
            ]
          },
          "thumbnail_url": {
            "description": "Studio thumbnail (spec §2.11), presigned for an hour.",
            "type": [
              "string",
              "null"
            ]
          },
          "unit": {
            "type": "string"
          },
          "unit_source": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "status",
          "unit",
          "unit_source",
          "filename",
          "parts"
        ],
        "type": "object"
      },
      "Money": {
        "properties": {
          "amount_minor": {
            "description": "Minor units (cents)",
            "type": "integer"
          },
          "currency": {
            "maxLength": 3,
            "minLength": 3,
            "type": "string"
          }
        },
        "required": [
          "amount_minor",
          "currency"
        ],
        "type": "object"
      },
      "OpenApi": {
        "type": "object"
      },
      "OptionSpec": {
        "properties": {
          "control": {
            "$ref": "#/components/schemas/Control"
          },
          "default": {
            "$ref": "#/components/schemas/SelectionValue"
          },
          "expert": {
            "type": "boolean"
          },
          "group": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "$ref": "#/components/schemas/I18nText"
          },
          "mode": {
            "enum": [
              "offered",
              "hidden",
              "locked"
            ]
          }
        },
        "required": [
          "id",
          "label",
          "group",
          "control",
          "default"
        ],
        "type": "object"
      },
      "OrderBody": {
        "properties": {
          "accepted_terms": {
            "type": "boolean"
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "customer": {
            "$ref": "#/components/schemas/Customer"
          },
          "metadata": {
            "description": "Opaque JSON from the embed, stored on the order and echoed in `order.created`. Never interpreted.",
            "type": "object"
          },
          "notes": {
            "description": "The buyer's notes to the shop, trimmed; never priced. Longer is 422 too_long.",
            "maxLength": 2000,
            "type": "string"
          },
          "po_number": {
            "type": "string"
          },
          "quote_id": {
            "type": "string"
          },
          "shipping": {
            "type": "object"
          }
        },
        "required": [
          "quote_id",
          "customer",
          "accepted_terms"
        ],
        "type": "object"
      },
      "OrderView": {
        "properties": {
          "created": {
            "description": "false on an idempotent replay",
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "number": {
            "type": "string"
          },
          "status": {
            "enum": [
              "new",
              "in_review",
              "confirmed"
            ]
          },
          "totals": {
            "$ref": "#/components/schemas/Totals"
          }
        },
        "required": [
          "id",
          "number",
          "status",
          "totals",
          "created"
        ],
        "type": "object"
      },
      "Part": {
        "properties": {
          "area_cm2": {
            "type": "number"
          },
          "dimensions_mm": {
            "items": {
              "type": "number"
            },
            "maxItems": 3,
            "minItems": 3,
            "type": "array"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "preview_url": {
            "description": "Decimated preview mesh of this body, presigned for an hour; null for a single-body file.",
            "type": [
              "string",
              "null"
            ]
          },
          "thumbnail_url": {
            "description": "Studio thumbnail of this body, presigned for an hour; null when the file held one body, whose thumbnail is the model's.",
            "type": [
              "string",
              "null"
            ]
          },
          "triangles": {
            "type": "integer"
          },
          "verdict": {
            "type": "string"
          },
          "volume_cm3": {
            "type": "number"
          }
        },
        "required": [
          "id",
          "name",
          "dimensions_mm",
          "volume_cm3",
          "area_cm2",
          "verdict",
          "triangles"
        ],
        "type": "object"
      },
      "PartPlan": {
        "properties": {
          "number": {
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          },
          "size": {
            "type": "integer"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "number",
          "offset",
          "size",
          "url"
        ],
        "type": "object"
      },
      "Pdf": {
        "format": "binary",
        "type": "string"
      },
      "Png": {
        "format": "binary",
        "type": "string"
      },
      "PriceBody": {
        "properties": {
          "country": {
            "description": "ISO alpha-2",
            "type": [
              "string",
              "null"
            ]
          },
          "coupon": {
            "type": [
              "string",
              "null"
            ]
          },
          "custom_fields": {
            "$ref": "#/components/schemas/CustomFieldValues"
          },
          "customer_email": {
            "description": "Unverified e-mail claim",
            "type": [
              "string",
              "null"
            ]
          },
          "customer_token": {
            "description": "HMAC customer token signed by the shop",
            "type": [
              "string",
              "null"
            ]
          },
          "line_items": {
            "items": {
              "$ref": "#/components/schemas/LineItemRequest"
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          },
          "postcode": {
            "description": "Destination postcode; shipping zones may narrow a country by prefix",
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "description": "State / region, for shipping zones and tax rates that name one",
            "type": [
              "string",
              "null"
            ]
          },
          "session_id": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "line_items"
        ],
        "type": "object"
      },
      "PriceView": {
        "properties": {
          "below_minimum_order": {
            "type": "boolean"
          },
          "coupon": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/CouponStatus"
              },
              {
                "type": "null"
              }
            ]
          },
          "currency": {
            "type": "string"
          },
          "customer": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/CustomerView"
              },
              {
                "type": "null"
              }
            ]
          },
          "lines": {
            "items": {
              "$ref": "#/components/schemas/LineView"
            },
            "type": "array"
          },
          "net_terms": {
            "type": "boolean"
          },
          "state": {
            "enum": [
              "ok",
              "review",
              "blocked"
            ]
          },
          "totals": {
            "$ref": "#/components/schemas/Totals"
          },
          "valid_until": {
            "format": "date",
            "type": "string"
          }
        },
        "required": [
          "lines",
          "totals",
          "state",
          "below_minimum_order",
          "valid_until",
          "currency"
        ],
        "type": "object"
      },
      "Problem": {
        "properties": {
          "code": {
            "description": "Stable code, see docs/agent-docs/api/errors.md",
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "incident_id": {
            "type": "string"
          },
          "issues": {
            "items": {
              "$ref": "#/components/schemas/Issue"
            },
            "type": "array"
          },
          "status": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "required": [
          "type",
          "title",
          "status",
          "code"
        ],
        "type": "object"
      },
      "QuoteView": {
        "properties": {
          "handoff": {
            "description": "Cart hand-off signature over the quote id (`v1.<exp>.<base64url hmac>`), verifiable with the shop's shared secret. Absent when the shop has none.",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "number": {
            "type": "string"
          },
          "price": {
            "$ref": "#/components/schemas/PriceView"
          }
        },
        "required": [
          "id",
          "number",
          "price"
        ],
        "type": "object"
      },
      "RfqBody": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PriceBody"
          },
          {
            "properties": {
              "customer": {
                "$ref": "#/components/schemas/Customer"
              },
              "message": {
                "description": "The buyer's notes to the shop, trimmed. Longer is 422 too_long.",
                "maxLength": 2000,
                "type": "string"
              }
            },
            "required": [
              "customer"
            ],
            "type": "object"
          }
        ]
      },
      "RfqCreated": {
        "properties": {
          "id": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "number": {
            "type": "string"
          },
          "status": {
            "const": "rfq"
          }
        },
        "type": "object"
      },
      "SelectionValue": {
        "oneOf": [
          {
            "type": "boolean"
          },
          {
            "type": "number"
          },
          {
            "type": "string"
          }
        ]
      },
      "Selections": {
        "additionalProperties": {
          "$ref": "#/components/schemas/SelectionValue"
        },
        "type": "object"
      },
      "ShareBody": {
        "properties": {
          "email": {
            "description": "Send the link here as well. Omit to be given the address only.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "ShareView": {
        "properties": {
          "emailed": {
            "type": "boolean"
          },
          "pdf_url": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "valid_until": {
            "format": "date",
            "type": "string"
          }
        },
        "required": [
          "url",
          "pdf_url",
          "valid_until",
          "emailed"
        ],
        "type": "object"
      },
      "Text": {
        "type": "string"
      },
      "Totals": {
        "properties": {
          "discounts": {
            "$ref": "#/components/schemas/Money"
          },
          "fees": {
            "$ref": "#/components/schemas/Money"
          },
          "shipping": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ]
          },
          "subtotal": {
            "$ref": "#/components/schemas/Money"
          },
          "tax": {
            "$ref": "#/components/schemas/Money"
          },
          "tax_inclusive": {
            "type": "boolean"
          },
          "total": {
            "$ref": "#/components/schemas/Money"
          }
        },
        "required": [
          "subtotal",
          "fees",
          "discounts",
          "tax",
          "tax_inclusive",
          "total"
        ],
        "type": "object"
      },
      "UploadCreated": {
        "properties": {
          "expires_in": {
            "type": "integer"
          },
          "method": {
            "type": "string"
          },
          "model_id": {
            "type": "string"
          },
          "part_size": {
            "type": [
              "integer",
              "null"
            ]
          },
          "parts": {
            "items": {
              "$ref": "#/components/schemas/PartPlan"
            },
            "type": "array"
          },
          "upload_id": {
            "type": "string"
          },
          "upload_url": {
            "description": "Single PUT for a small file; null when the file is uploaded in parts.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "upload_id",
          "model_id",
          "method",
          "expires_in",
          "parts"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "secretKey": {
        "description": "Secret API key (sk_…), scoped",
        "scheme": "bearer",
        "type": "http"
      },
      "widgetKey": {
        "description": "Publishable widget key; the Origin header must be on the widget's allow-list",
        "in": "header",
        "name": "X-Quotometry-Widget-Key",
        "type": "apiKey"
      }
    }
  },
  "info": {
    "description": "Instant quoting for manufacturing shops: upload → analyse → price → quote → order. Errors are RFC 9457 problem+json with stable codes (docs/agent-docs/api/errors.md). Rate limits per spec §6.9.",
    "title": "Quotometry buyer API",
    "version": "0.1.4"
  },
  "openapi": "3.1.0",
  "paths": {
    "/healthz": {
      "get": {
        "responses": {
          "200": {
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Text"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [],
        "summary": "Liveness",
        "tags": [
          "meta"
        ]
      }
    },
    "/metrics": {
      "get": {
        "responses": {
          "200": {
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Text"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [],
        "summary": "Prometheus scrape (internal; `METRICS_TOKEN` when set)",
        "tags": [
          "meta"
        ]
      }
    },
    "/readyz": {
      "get": {
        "responses": {
          "200": {
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Text"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [],
        "summary": "Readiness (database reachable)",
        "tags": [
          "meta"
        ]
      }
    },
    "/v1/hosted/quotes/{token}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HostedQuote"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [],
        "summary": "A sent quote, as the buyer sees it",
        "tags": [
          "hosted"
        ]
      }
    },
    "/v1/hosted/quotes/{token}/accept": {
      "post": {
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Accept"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HostedAccepted"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [],
        "summary": "Accept a sent quote and order at the quoted price",
        "tags": [
          "hosted"
        ]
      }
    },
    "/v1/hosted/quotes/{token}/pdf": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/pdf": {
                "schema": {
                  "$ref": "#/components/schemas/Pdf"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [],
        "summary": "The sent quote as a PDF",
        "tags": [
          "hosted"
        ]
      }
    },
    "/v1/models/{id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelView"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Model status and parts",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/models/{id}/events": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/EventStream"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Analysis progress as server-sent events",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/models/{id}/preview": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A part id of this model: that body's rendering instead of the whole file's.",
            "in": "query",
            "name": "part",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "model/gltf-binary": {
                "schema": {
                  "$ref": "#/components/schemas/Glb"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "The model's preview mesh (binary glTF), or one body's with `?part=`, for a browser that cannot reach `preview_url`",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/models/{id}/thumbnail": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A part id of this model: that body's rendering instead of the whole file's.",
            "in": "query",
            "name": "part",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {
                "schema": {
                  "$ref": "#/components/schemas/Png"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "The model's thumbnail (PNG), or one body's with `?part=`, for a browser that cannot reach `thumbnail_url`",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/openapi.json": {
      "get": {
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpenApi"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [],
        "summary": "This document",
        "tags": [
          "meta"
        ]
      }
    },
    "/v1/orders": {
      "post": {
        "parameters": [
          {
            "description": "Replays return the first order with created=false",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderView"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Place an order from a quote (idempotent with Idempotency-Key)",
        "tags": [
          "orders"
        ]
      }
    },
    "/v1/price": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PriceBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PriceView"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Price line items (coupon, customer token, e-mail claim honoured)",
        "tags": [
          "pricing"
        ]
      }
    },
    "/v1/quotes": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PriceBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteView"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Save a quote",
        "tags": [
          "quotes"
        ]
      }
    },
    "/v1/quotes/{id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteView"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Read a saved quote",
        "tags": [
          "quotes"
        ]
      }
    },
    "/v1/quotes/{id}/share": {
      "post": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ShareBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShareView"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Give the buyer a link back to their own quote",
        "tags": [
          "quotes"
        ]
      }
    },
    "/v1/rfqs": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RfqBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RfqCreated"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Request a manual quote",
        "tags": [
          "quotes"
        ]
      }
    },
    "/v1/uploads": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateUpload"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UploadCreated"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Presign an upload and create the model",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/uploads/{id}/complete": {
      "post": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteUpload"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelQueued"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Mark an upload complete and queue the analysis",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/uploads/{id}/content": {
      "put": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/octet-stream": {
              "schema": {
                "$ref": "#/components/schemas/Bytes"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "Stored"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Relay a small file's bytes through the API, for a browser that cannot reach the upload URL",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/uploads/{id}/parts": {
      "post": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UploadCreated"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Parts still to upload, for resuming an interrupted multipart upload",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/uploads/{id}/parts/{number}": {
      "put": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "number",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/octet-stream": {
              "schema": {
                "$ref": "#/components/schemas/Bytes"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "Stored"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Relay one part of a multipart upload through the API, for a browser that cannot reach the part URL",
        "tags": [
          "models"
        ]
      }
    },
    "/v1/widgets/{key}/bootstrap": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bootstrap"
                }
              }
            },
            "description": "OK"
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Rate limited (Retry-After)"
          },
          "4XX": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Problem"
          }
        },
        "security": [
          {
            "widgetKey": []
          },
          {
            "secretKey": []
          }
        ],
        "summary": "Widget bootstrap: configurations, options, limits, theme, checkout mode",
        "tags": [
          "widget"
        ]
      }
    }
  },
  "servers": [
    {
      "url": "https://api.quotometry.example"
    }
  ],
  "tags": [
    {
      "name": "widget"
    },
    {
      "name": "models"
    },
    {
      "name": "pricing"
    },
    {
      "name": "quotes"
    },
    {
      "name": "orders"
    },
    {
      "name": "hosted"
    },
    {
      "name": "meta"
    }
  ]
}
