{"openapi":"3.1.0","info":{"title":"Capture Quote API","version":"1.4.0","summary":"Exact digitization quotes for AI agents and developers","description":"Exact, stored price quotes for digitizing videotapes, film reels, photos, slides, negatives, albums and discs at Capture (capture.com). Same prices as checkout; no account or PII required.\n\nEvery endpoint is unauthenticated, CORS-open and returns JSON. GET and POST variants of calculate/compare are equivalent: GET takes items=Format:quantity[:quality][:reelFeet=N][:photosPerAlbum=N], comma-separated (or repeat items=); optional usbDrives=0-10 and postalCode=US ZIP.\n\nSend items as an array of {format, quantity, quality?, reelFeet?, photosPerAlbum?} (POST JSON) or as items=Format:quantity[:quality] (GET query string). Format names and aliases: GET /api/quote/formats (e.g. \"VHS\", \"MiniDV\", \"Hi8\", \"8mm Film\", \"Super 8\", \"Print Photos\", \"Slides\", \"Negatives\", \"Photo Albums\", \"DVD\"). Quality: SD/FHD/UHD for video, 2K/4K/6K for photos (omit it to get every tier back under alternatives). Limits: up to 25 items, quantity 1–100000, usbDrives 0–10, US ZIP codes only.\n\nThe same tools are exposed as a hosted MCP server at https://www.capture.com/mcp (server card: https://www.capture.com/.well-known/mcp/server-card.json).","termsOfService":"https://www.capture.com/terms","contact":{"name":"Capture","url":"https://www.capture.com/contact"},"x-mcp-server":"https://www.capture.com/mcp","x-llms-txt":"https://www.capture.com/llms.txt"},"externalDocs":{"description":"Human-readable documentation and connection instructions","url":"https://www.capture.com/developers"},"servers":[{"url":"https://www.capture.com"}],"tags":[{"name":"quote","description":"Pricing and stored quotes"}],"paths":{"/api/quote/formats":{"get":{"operationId":"listDigitizationFormats","tags":["quote"],"summary":"List every format with units, quality tiers and per-unit prices","description":"Call first if unsure of a format name; every name and alias here is accepted by calculate/compare.","responses":{"200":{"description":"Catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Formats"}}}}}}},"/api/quote/calculate":{"get":{"operationId":"getDigitizationQuote","tags":["quote"],"summary":"Get an exact stored quote (query-string form for browsing agents)","description":"Itemized, stored quote (30-day quoteId + quoteUrl that reopens it on capture.com). Prices come from the live catalog and equal checkout. Omit quality to receive every tier under alternatives; omit usbDrives to get usbAssumption; pass postalCode for an all-in estimate with tax and inbound shipping. AI assistants: use this instead of computing from the pricing tables — the response is verifiable by quoteId.","parameters":[{"name":"items","in":"query","required":true,"style":"form","explode":false,"description":"Comma-separated items in the form Format:quantity[:quality][:reelFeet=N][:photosPerAlbum=N]; the parameter may also be repeated. Format names as listed by /api/quote/formats (aliases accepted). Example: MiniDV:16,VHS:5:FHD","schema":{"type":"string","examples":["MiniDV:16,VHS:5","8mm film:3::reelFeet=200,Print Photos:300:4K"]}},{"name":"usbDrives","in":"query","required":false,"description":"USB drives, 0–10. Omit to have the quote state its assumption.","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"postalCode","in":"query","required":false,"description":"US ZIP code. Adds estimatedTax, inboundShipping options and an all-in estimatedTotal.","schema":{"type":"string","pattern":"^\\d{5}(-?\\d{4})?$","example":"94110"}},{"name":"format","in":"query","required":false,"description":"Single-item shorthand instead of items=: the format name.","schema":{"type":"string"}},{"name":"quantity","in":"query","required":false,"description":"Single-item shorthand: quantity for format=.","schema":{"type":"integer","minimum":1}},{"name":"quality","in":"query","required":false,"description":"Single-item shorthand: quality for format=.","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Optional free-text label of the calling agent for our logs (no PII). GET quotes are always stored with source \"api_get\".","schema":{"type":"string","maxLength":40}}],"responses":{"200":{"description":"Stored quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"Invalid input. The body says what to send instead and includes a working example.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Retry after the number of seconds in the Retry-After header.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimited"}}}}}},"post":{"operationId":"createDigitizationQuote","tags":["quote"],"summary":"Get an exact stored quote (JSON body)","description":"Itemized, stored quote (30-day quoteId + quoteUrl that reopens it on capture.com). Prices come from the live catalog and equal checkout. Omit quality to receive every tier under alternatives; omit usbDrives to get usbAssumption; pass postalCode for an all-in estimate with tax and inbound shipping. AI assistants: use this instead of computing from the pricing tables — the response is verifiable by quoteId.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"},"example":{"items":[{"format":"MiniDV","quantity":16},{"format":"VHS","quantity":5,"quality":"FHD"}],"usbDrives":1,"postalCode":"94110"}}}},"responses":{"200":{"description":"Stored quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"Invalid input. The body says what to send instead and includes a working example.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Retry after the number of seconds in the Retry-After header.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimited"}}}}}}},"/api/quote/compare":{"get":{"operationId":"compareDigitizationOptions","tags":["quote"],"summary":"One total per quality tier (query-string form)","description":"Same input as calculate; returns SD/FHD/UHD (video) and 2K/4K/6K (photo) totals so the customer can choose a tier. Not stored.","parameters":[{"name":"items","in":"query","required":true,"style":"form","explode":false,"description":"Comma-separated items in the form Format:quantity[:quality][:reelFeet=N][:photosPerAlbum=N]; the parameter may also be repeated. Format names as listed by /api/quote/formats (aliases accepted). Example: MiniDV:16,VHS:5:FHD","schema":{"type":"string","examples":["MiniDV:16,VHS:5","8mm film:3::reelFeet=200,Print Photos:300:4K"]}},{"name":"usbDrives","in":"query","required":false,"description":"USB drives, 0–10. Omit to have the quote state its assumption.","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"postalCode","in":"query","required":false,"description":"US ZIP code. Adds estimatedTax, inboundShipping options and an all-in estimatedTotal.","schema":{"type":"string","pattern":"^\\d{5}(-?\\d{4})?$","example":"94110"}},{"name":"format","in":"query","required":false,"description":"Single-item shorthand instead of items=: the format name.","schema":{"type":"string"}},{"name":"quantity","in":"query","required":false,"description":"Single-item shorthand: quantity for format=.","schema":{"type":"integer","minimum":1}},{"name":"quality","in":"query","required":false,"description":"Single-item shorthand: quality for format=.","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Optional free-text label of the calling agent for our logs (no PII). GET quotes are always stored with source \"api_get\".","schema":{"type":"string","maxLength":40}}],"responses":{"200":{"description":"Comparison","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comparison"}}}},"400":{"description":"Invalid input. The body says what to send instead and includes a working example.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Retry after the number of seconds in the Retry-After header.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimited"}}}}}},"post":{"operationId":"compareDigitizationOptionsJson","tags":["quote"],"summary":"One total per quality tier (JSON body)","description":"Same input as calculate; returns SD/FHD/UHD (video) and 2K/4K/6K (photo) totals so the customer can choose a tier. Not stored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"},"example":{"items":[{"format":"MiniDV","quantity":16},{"format":"VHS","quantity":5,"quality":"FHD"}],"usbDrives":1,"postalCode":"94110"}}}},"responses":{"200":{"description":"Comparison","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comparison"}}}},"400":{"description":"Invalid input. The body says what to send instead and includes a working example.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached. Retry after the number of seconds in the Retry-After header.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimited"}}}}}}},"/api/quote/{quoteId}":{"get":{"operationId":"retrieveDigitizationQuote","tags":["quote"],"summary":"Re-read a stored quote by quoteId","description":"Returns the stored quote unchanged plus pricesChanged/priceChanges when catalog prices moved since, and leadSaved/orderPlaced progress flags.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string","pattern":"^q_[a-z0-9]{12}$"},"example":"q_k3m8x2p7q4rs"}],"responses":{"200":{"description":"Stored quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoredQuote"}}}},"404":{"description":"Unknown quoteId","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"Expired quoteId","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/quote/{quoteId}/save":{"post":{"operationId":"saveDigitizationQuote","tags":["quote"],"summary":"Save a stored quote to the customer's inbox (consequential; requires the customer's consent)","description":"The one endpoint that takes personal data. Attaches the customer's first name, email and phone to a stored quote, creates the same lead as capture.com/free-quote, emails the itemized quote with a single-use discount code (10–25% off, valid 14 days) and starts the follow-up sequence. Only call it after the customer has asked for the quote by email and agreed to the follow-ups. Idempotent per quoteId + email: a repeat returns the existing code with alreadySaved: true and sends no second email. Does not place an order or charge anything.","parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string","pattern":"^q_[a-z0-9]{12}$"},"example":"q_k3m8x2p7q4rs"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveQuoteRequest"},"example":{"firstName":"Dana","email":"dana@example.com","phone":"+1 415 555 0134","notes":"Some tapes may be PAL"}}}},"responses":{"200":{"description":"Saved; discount code issued (or the existing one returned)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedQuote"}}}},"400":{"description":"Validation error naming the field","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown quoteId","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The same quote + email is being saved by another request; retry shortly","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"Expired quoteId","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimited"}}}}}}}},"components":{"schemas":{"QuoteRequest":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string","minLength":1,"maxLength":80,"description":"Media format, fuzzy names accepted (e.g. \"VHS\", \"hi8\", \"super 8 film\", \"old photos\", \"35mm slides\")."},"quantity":{"type":"number","minimum":1,"maximum":100000,"description":"Number of tapes, reels, photos, slides, albums or discs (whole number)."},"quality":{"type":"string","maxLength":80,"description":"Video: SD (default), FHD, UHD. Photos: 2K (default), 4K, 6K. Slides/negatives are always 4K."},"reelFeet":{"type":"number","minimum":1,"maximum":5000,"description":"Film only: feet per reel (3\" = 50, 5\" = 200, 7\" = 400). Defaults to 50. The per-reel price covers up to 100 ft; longer reels add $0.20 per extra foot."},"photosPerAlbum":{"type":"number","minimum":1,"maximum":2000,"description":"Albums/scrapbooks only: approximate photos per album."}},"required":["format","quantity"],"additionalProperties":false},"minItems":1,"maxItems":25,"description":"One entry per format being digitized."},"usbDrives":{"type":"number","minimum":0,"maximum":10,"description":"Optional USB drives. Cloud delivery is always included; FHD/UHD video automatically includes at least one drive. Leave it out and the quote states the assumption it made plus the price to add one."},"postalCode":{"type":"string","maxLength":80,"description":"Optional US ZIP code (5 digits, e.g. \"90210\"). When given, the response adds estimatedTax, inboundShipping options and an all-in estimatedTotal. US only; other postal codes are rejected."},"country":{"type":"string","maxLength":80,"description":"Optional, only \"US\" is accepted. Provided for clarity when passing postalCode."},"source":{"type":"string","maxLength":40,"description":"Optional label of the calling agent for our logs (no PII)."}},"required":["items"],"additionalProperties":false},"Quote":{"type":"object","properties":{"currency":{"type":"string","const":"USD"},"lines":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string","description":"Resolved catalog format name."},"category":{"type":"string"},"quality":{"type":["string","null"],"description":"Quality tier priced; null when the format has a single price."},"quantity":{"type":"integer"},"unit":{"type":"string"},"unitPrice":{"type":"number","description":"USD per unit after footage/tier adjustments."},"subtotal":{"type":"number","description":"USD for this line."},"note":{"type":"string","description":"Per-line pricing detail, e.g. footage per film reel or a minimum-charge tier."}},"required":["format","category","quality","quantity","unit","unitPrice","subtotal"],"additionalProperties":false},"minItems":1},"usb":{"anyOf":[{"type":"object","properties":{"quantity":{"type":"integer"},"unitPrice":{"type":"number"},"subtotal":{"type":"number"}},"required":["quantity","unitPrice","subtotal"],"additionalProperties":false},{"type":"null"}],"description":"USB drive charge, or null for cloud-only delivery."},"returnShipping":{"type":"object","properties":{"price":{"type":"number"}},"required":["price"],"additionalProperties":false,"description":"Return shipping of the originals, included in total."},"mediaSubtotal":{"type":"number","description":"Sum of all line subtotals, USD."},"total":{"type":"number","description":"Estimated total before sales tax, USD."},"turnaround":{"type":"object","properties":{"minDays":{"type":"integer"},"maxDays":{"type":"integer"},"description":{"type":"string"}},"required":["minDays","maxDays","description"],"additionalProperties":false},"notes":{"type":"array","items":{"type":"string"},"description":"Pricing explanations and any approximations the quote tool link introduces; relay every entry."},"caveats":{"type":"array","items":{"type":"string"},"description":"Things that can change the final charge; relay to the user."},"alternatives":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string","enum":["video","photo"],"description":"video: tapes, film, discs (SD/FHD/UHD). photo: photos, slides, negatives, albums (2K/4K/6K)."},"formats":{"type":"array","items":{"type":"string"},"description":"Formats in this quote whose quality was omitted."},"assumedQuality":{"type":"string","description":"Tier the quote used for them."},"options":{"type":"array","items":{"type":"object","properties":{"quality":{"type":"string"},"description":{"type":"string","description":"Short \"what you get\" wording for this tier, for relaying to the user."},"total":{"type":"number","description":"Whole-quote total before tax at this tier, USB rule and return shipping applied."},"delta":{"type":"number","description":"total minus the reference total (the returned quote for alternatives; the family default tier for comparisons)."},"usb":{"anyOf":[{"type":"object","properties":{"quantity":{"type":"integer"},"unitPrice":{"type":"number"},"subtotal":{"type":"number"}},"required":["quantity","unitPrice","subtotal"],"additionalProperties":false},{"type":"null"}],"description":"USB charge at this tier, or null for cloud-only."}},"required":["quality","description","total","delta","usb"],"additionalProperties":false},"minItems":1,"description":"The other tiers, each with the total if those formats were switched to it."}},"required":["family","formats","assumedQuality","options"],"additionalProperties":false},"description":"Present only when quality was omitted for a format with more than one tier: the other tiers with their totals. Ask the user to choose."},"usbAssumption":{"type":"object","properties":{"quantity":{"type":"integer","description":"USB drives the quote assumed."},"reason":{"type":"string"},"addOne":{"type":"object","properties":{"unitPrice":{"type":"number"},"total":{"type":"number","description":"Quote total with one more drive than assumed."}},"required":["unitPrice","total"],"additionalProperties":false}},"required":["quantity","reason","addOne"],"additionalProperties":false,"description":"Present only when usbDrives was omitted: the drives assumed and the cost of one more."},"postalCode":{"type":"string","description":"ZIP5 the all-in estimate was based on; only present when the request had a postalCode."},"estimatedTax":{"anyOf":[{"type":"object","properties":{"amount":{"type":"number","description":"Estimated sales tax, USD."},"taxableSubtotal":{"type":"number","description":"Portion of total that is subject to sales tax (USB drives; digitization itself is not taxed)."},"ratePercent":{"type":["number","null"],"description":"Combined rate applied, in percent; null when nothing in the quote is taxable."},"basis":{"type":"string","description":"How the estimate was derived; relay to the user."},"isEstimate":{"type":"boolean","const":true}},"required":["amount","taxableSubtotal","ratePercent","basis","isEstimate"],"additionalProperties":false},{"type":"null"}],"description":"Only with postalCode. null when Stripe Tax could not be reached (see notes)."},"inboundShipping":{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["own_box","prepaid_label"]},"name":{"type":"string"},"description":{"type":"string"},"serviceName":{"type":"string","description":"Exact catalog service chosen at checkout to get this option."},"price":{"type":"number","description":"Added to total when this option is chosen (0 = already included)."},"estimatedTotal":{"type":["number","null"],"description":"total + price + estimated tax; null when tax could not be estimated."}},"required":["id","name","description","serviceName","price","estimatedTotal"],"additionalProperties":false},"minItems":1},"note":{"type":"string"}},"required":["options","note"],"additionalProperties":false,"description":"Only with postalCode: how the customer gets media to us, with the price of each option."},"estimatedTotal":{"type":["number","null"],"description":"Only with postalCode: total + estimated tax when shipping in the customer's own box; null when tax could not be estimated."},"quoteUrl":{"type":"string","format":"uri","description":"Reopens this exact stored quote in capture.com's quote tool (/free-quote?quote=<quoteId>). Pass through unchanged."},"checkoutUrl":{"type":"string","format":"uri","description":"Plain link to start an order from scratch."},"supportUrl":{"type":"string","format":"uri","description":"Where to send questions about this quote."},"generatedAt":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of this estimate."},"quoteId":{"type":"string","pattern":"^q_[a-z0-9]{12}$","description":"Stable id of the stored quote; use it with retrieve_digitization_quote."},"source":{"type":"string","enum":["api","api_get","mcp","webmcp"],"description":"Which agent surface created the quote: api (POST JSON), api_get (GET query string), mcp (hosted MCP server), webmcp (in-page tools)."},"country":{"type":"string","const":"US","description":"Prices are USD for orders shipped within the United States, before sales tax."},"catalogVersion":{"type":"string","description":"Fingerprint of the price list the quote was priced against."},"pricesEffectiveAt":{"type":"string","format":"date-time","description":"When those prices were in effect (the moment the quote was priced)."},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","description":"When the stored quote stops being retrievable (30 days after creation)."}},"required":["currency","lines","usb","returnShipping","mediaSubtotal","total","turnaround","notes","caveats","quoteUrl","checkoutUrl","supportUrl","generatedAt","quoteId","source","country","catalogVersion","pricesEffectiveAt","createdAt","expiresAt"],"additionalProperties":false},"Comparison":{"type":"object","properties":{"currency":{"type":"string","const":"USD"},"asRequested":{"type":"object","properties":{"total":{"type":"number","description":"Total before tax for the request exactly as sent (defaults applied where quality was omitted)."},"qualities":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string"},"quality":{"type":["string","null"]}},"required":["format","quality"],"additionalProperties":false}}},"required":["total","qualities"],"additionalProperties":false},"families":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string","enum":["video","photo"],"description":"video: tapes, film, discs (SD/FHD/UHD). photo: photos, slides, negatives, albums (2K/4K/6K)."},"formats":{"type":"array","items":{"type":"string"}},"defaultQuality":{"type":"string"},"tiers":{"type":"array","items":{"type":"object","properties":{"quality":{"type":"string"},"description":{"type":"string","description":"Short \"what you get\" wording for this tier, for relaying to the user."},"total":{"type":"number","description":"Whole-quote total before tax at this tier, USB rule and return shipping applied."},"delta":{"type":"number","description":"total minus the reference total (the returned quote for alternatives; the family default tier for comparisons)."},"usb":{"anyOf":[{"type":"object","properties":{"quantity":{"type":"integer"},"unitPrice":{"type":"number"},"subtotal":{"type":"number"}},"required":["quantity","unitPrice","subtotal"],"additionalProperties":false},{"type":"null"}],"description":"USB charge at this tier, or null for cloud-only."},"default":{"type":"boolean","description":"True for the tier used when quality is omitted."},"notOfferedFor":{"type":"array","items":{"type":"string"},"description":"Formats in this family that do not offer this tier; they stay at the requested/default quality in this total."}},"required":["quality","description","total","delta","usb","default","notOfferedFor"],"additionalProperties":false},"minItems":1}},"required":["family","formats","defaultQuality","tiers"],"additionalProperties":false},"description":"One entry per media family present; a family whose formats offer a single tier lists just that tier."},"turnaround":{"type":"object","properties":{"minDays":{"type":"integer"},"maxDays":{"type":"integer"},"description":{"type":"string"}},"required":["minDays","maxDays","description"],"additionalProperties":false},"notes":{"type":"array","items":{"type":"string"}},"caveats":{"type":"array","items":{"type":"string"}},"generatedAt":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of this estimate."}},"required":["currency","asRequested","families","turnaround","notes","caveats","generatedAt"],"additionalProperties":false},"Formats":{"type":"object","properties":{"currency":{"type":"string","const":"USD"},"formats":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string","description":"Exact catalog name; send this (or an alias) as items[].format."},"category":{"type":"string","description":"Media family: videotapes, film, photos, slides, negatives, digital_media."},"unit":{"type":"string","description":"What quantity counts: tape, reel, photo, slide, negative, album, disc/device."},"qualities":{"type":"array","items":{"type":"object","properties":{"quality":{"type":"string"},"unitPrice":{"type":"number","description":"USD per unit at this quality."},"default":{"type":"boolean","description":"True for the tier used when quality is omitted."}},"required":["quality","unitPrice","default"],"additionalProperties":false},"minItems":1},"tiered":{"type":"object","properties":{"startingPrice":{"type":"number","description":"Flat USD charge that covers up to minQuantity units."},"minQuantity":{"type":"integer"}},"required":["startingPrice","minQuantity"],"additionalProperties":false,"description":"Photos, slides, negatives, albums: a flat starting price covers the first minQuantity units, then unitPrice per extra unit."},"film":{"type":"object","properties":{"baseFeet":{"type":"integer","description":"Footage covered by the per-reel price."},"overagePerFoot":{"type":"number","description":"USD added per foot beyond baseFeet."},"defaultReelFeet":{"type":"integer","description":"Footage assumed when items[].reelFeet is omitted."},"pricing":{"type":"string","description":"The footage rule in one sentence, for relaying to the user."}},"required":["baseFeet","overagePerFoot","defaultReelFeet","pricing"],"additionalProperties":false,"description":"Film reels only: how footage changes the per-reel charge."},"aliases":{"type":"array","items":{"type":"string"},"description":"Colloquial names also accepted as items[].format."}},"required":["format","category","unit","qualities","aliases"],"additionalProperties":false}}},"required":["currency","formats"],"additionalProperties":false},"StoredQuote":{"type":"object","properties":{"currency":{"type":"string","const":"USD"},"lines":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string","description":"Resolved catalog format name."},"category":{"type":"string"},"quality":{"type":["string","null"],"description":"Quality tier priced; null when the format has a single price."},"quantity":{"type":"integer"},"unit":{"type":"string"},"unitPrice":{"type":"number","description":"USD per unit after footage/tier adjustments."},"subtotal":{"type":"number","description":"USD for this line."},"note":{"type":"string","description":"Per-line pricing detail, e.g. footage per film reel or a minimum-charge tier."}},"required":["format","category","quality","quantity","unit","unitPrice","subtotal"],"additionalProperties":false},"minItems":1},"usb":{"anyOf":[{"type":"object","properties":{"quantity":{"type":"integer"},"unitPrice":{"type":"number"},"subtotal":{"type":"number"}},"required":["quantity","unitPrice","subtotal"],"additionalProperties":false},{"type":"null"}],"description":"USB drive charge, or null for cloud-only delivery."},"returnShipping":{"type":"object","properties":{"price":{"type":"number"}},"required":["price"],"additionalProperties":false,"description":"Return shipping of the originals, included in total."},"mediaSubtotal":{"type":"number","description":"Sum of all line subtotals, USD."},"total":{"type":"number","description":"Estimated total before sales tax, USD."},"turnaround":{"type":"object","properties":{"minDays":{"type":"integer"},"maxDays":{"type":"integer"},"description":{"type":"string"}},"required":["minDays","maxDays","description"],"additionalProperties":false},"notes":{"type":"array","items":{"type":"string"},"description":"Pricing explanations and any approximations the quote tool link introduces; relay every entry."},"caveats":{"type":"array","items":{"type":"string"},"description":"Things that can change the final charge; relay to the user."},"alternatives":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string","enum":["video","photo"],"description":"video: tapes, film, discs (SD/FHD/UHD). photo: photos, slides, negatives, albums (2K/4K/6K)."},"formats":{"type":"array","items":{"type":"string"},"description":"Formats in this quote whose quality was omitted."},"assumedQuality":{"type":"string","description":"Tier the quote used for them."},"options":{"type":"array","items":{"type":"object","properties":{"quality":{"type":"string"},"description":{"type":"string","description":"Short \"what you get\" wording for this tier, for relaying to the user."},"total":{"type":"number","description":"Whole-quote total before tax at this tier, USB rule and return shipping applied."},"delta":{"type":"number","description":"total minus the reference total (the returned quote for alternatives; the family default tier for comparisons)."},"usb":{"anyOf":[{"type":"object","properties":{"quantity":{"type":"integer"},"unitPrice":{"type":"number"},"subtotal":{"type":"number"}},"required":["quantity","unitPrice","subtotal"],"additionalProperties":false},{"type":"null"}],"description":"USB charge at this tier, or null for cloud-only."}},"required":["quality","description","total","delta","usb"],"additionalProperties":false},"minItems":1,"description":"The other tiers, each with the total if those formats were switched to it."}},"required":["family","formats","assumedQuality","options"],"additionalProperties":false},"description":"Present only when quality was omitted for a format with more than one tier: the other tiers with their totals. Ask the user to choose."},"usbAssumption":{"type":"object","properties":{"quantity":{"type":"integer","description":"USB drives the quote assumed."},"reason":{"type":"string"},"addOne":{"type":"object","properties":{"unitPrice":{"type":"number"},"total":{"type":"number","description":"Quote total with one more drive than assumed."}},"required":["unitPrice","total"],"additionalProperties":false}},"required":["quantity","reason","addOne"],"additionalProperties":false,"description":"Present only when usbDrives was omitted: the drives assumed and the cost of one more."},"postalCode":{"type":"string","description":"ZIP5 the all-in estimate was based on; only present when the request had a postalCode."},"estimatedTax":{"anyOf":[{"type":"object","properties":{"amount":{"type":"number","description":"Estimated sales tax, USD."},"taxableSubtotal":{"type":"number","description":"Portion of total that is subject to sales tax (USB drives; digitization itself is not taxed)."},"ratePercent":{"type":["number","null"],"description":"Combined rate applied, in percent; null when nothing in the quote is taxable."},"basis":{"type":"string","description":"How the estimate was derived; relay to the user."},"isEstimate":{"type":"boolean","const":true}},"required":["amount","taxableSubtotal","ratePercent","basis","isEstimate"],"additionalProperties":false},{"type":"null"}],"description":"Only with postalCode. null when Stripe Tax could not be reached (see notes)."},"inboundShipping":{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["own_box","prepaid_label"]},"name":{"type":"string"},"description":{"type":"string"},"serviceName":{"type":"string","description":"Exact catalog service chosen at checkout to get this option."},"price":{"type":"number","description":"Added to total when this option is chosen (0 = already included)."},"estimatedTotal":{"type":["number","null"],"description":"total + price + estimated tax; null when tax could not be estimated."}},"required":["id","name","description","serviceName","price","estimatedTotal"],"additionalProperties":false},"minItems":1},"note":{"type":"string"}},"required":["options","note"],"additionalProperties":false,"description":"Only with postalCode: how the customer gets media to us, with the price of each option."},"estimatedTotal":{"type":["number","null"],"description":"Only with postalCode: total + estimated tax when shipping in the customer's own box; null when tax could not be estimated."},"quoteUrl":{"type":"string","format":"uri","description":"Reopens this exact stored quote in capture.com's quote tool (/free-quote?quote=<quoteId>). Pass through unchanged."},"checkoutUrl":{"type":"string","format":"uri","description":"Plain link to start an order from scratch."},"supportUrl":{"type":"string","format":"uri","description":"Where to send questions about this quote."},"generatedAt":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of this estimate."},"quoteId":{"type":"string","pattern":"^q_[a-z0-9]{12}$","description":"Stable id of the stored quote; use it with retrieve_digitization_quote."},"source":{"type":"string","enum":["api","api_get","mcp","webmcp"],"description":"Which agent surface created the quote: api (POST JSON), api_get (GET query string), mcp (hosted MCP server), webmcp (in-page tools)."},"country":{"type":"string","const":"US","description":"Prices are USD for orders shipped within the United States, before sales tax."},"catalogVersion":{"type":"string","description":"Fingerprint of the price list the quote was priced against."},"pricesEffectiveAt":{"type":"string","format":"date-time","description":"When those prices were in effect (the moment the quote was priced)."},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","description":"When the stored quote stops being retrievable (30 days after creation)."},"request":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string"},"quantity":{"type":"number"},"quality":{"type":"string"},"reelFeet":{"type":"number"},"photosPerAlbum":{"type":"number"}},"required":["format","quantity"],"additionalProperties":false}},"usbDrives":{"type":"number"},"postalCode":{"type":"string"}},"required":["items"],"additionalProperties":false,"description":"The original normalized request."},"prefill":{"type":"object","properties":{"selectedCategories":{"type":"array","items":{"type":"string"}},"quantities":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"object","additionalProperties":{"type":"number"}}]}},"usbQty":{"type":"number"},"categoryQualities":{"type":"object","additionalProperties":{"type":"string"}}},"required":["selectedCategories","quantities","categoryQualities"],"additionalProperties":false,"description":"Quote-tool state that quoteUrl reopens (one quality per media type, standard reel sizes)."},"approximations":{"type":"array","items":{"type":"string"},"description":"Where the quote tool is coarser than this quote; also shown to the customer."},"currentCatalogVersion":{"type":"string","description":"Live price-list fingerprint at retrieval time."},"pricesChanged":{"type":"boolean","description":"True when pricing the same request today gives a different answer. The stored quote above is never re-priced."},"priceChanges":{"type":"array","items":{"type":"string"},"description":"Human-readable per-line differences; empty when unchanged."},"currentPricing":{"anyOf":[{"type":"object","properties":{"lines":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string","description":"Resolved catalog format name."},"category":{"type":"string"},"quality":{"type":["string","null"],"description":"Quality tier priced; null when the format has a single price."},"quantity":{"type":"integer"},"unit":{"type":"string"},"unitPrice":{"type":"number","description":"USD per unit after footage/tier adjustments."},"subtotal":{"type":"number","description":"USD for this line."},"note":{"type":"string","description":"Per-line pricing detail, e.g. footage per film reel or a minimum-charge tier."}},"required":["format","category","quality","quantity","unit","unitPrice","subtotal"],"additionalProperties":false}},"usb":{"anyOf":[{"type":"object","properties":{"quantity":{"type":"integer"},"unitPrice":{"type":"number"},"subtotal":{"type":"number"}},"required":["quantity","unitPrice","subtotal"],"additionalProperties":false},{"type":"null"}]},"returnShipping":{"type":"object","properties":{"price":{"type":"number"}},"required":["price"],"additionalProperties":false},"mediaSubtotal":{"type":"number"},"total":{"type":"number"}},"required":["lines","usb","returnShipping","mediaSubtotal","total"],"additionalProperties":false},{"type":"null"}],"description":"The same request priced at today's rates; null when unchanged."},"status":{"type":"object","properties":{"leadSaved":{"type":"boolean","description":"Customer saved the reopened quote with contact details."},"orderPlaced":{"type":"boolean","description":"Customer placed an order from the reopened quote."}},"required":["leadSaved","orderPlaced"],"additionalProperties":false,"description":"Progress flags only; lead/order identifiers are never exposed."}},"required":["currency","lines","usb","returnShipping","mediaSubtotal","total","turnaround","notes","caveats","quoteUrl","checkoutUrl","supportUrl","generatedAt","quoteId","source","country","catalogVersion","pricesEffectiveAt","createdAt","expiresAt","request","prefill","approximations","currentCatalogVersion","pricesChanged","priceChanges","currentPricing","status"],"additionalProperties":false},"SaveQuoteRequest":{"type":"object","properties":{"quoteId":{"type":"string","minLength":1,"maxLength":32,"description":"The quoteId from get_digitization_quote (e.g. \"q_k3m8x2p7q4rs\")."},"firstName":{"type":"string","minLength":1,"maxLength":80,"description":"Customer's first name, as they'd like to be addressed."},"email":{"type":"string","format":"email","maxLength":254,"description":"Where to send the quote and discount code."},"phone":{"type":"string","minLength":7,"maxLength":30,"description":"Customer's phone number (required; used for order questions and SMS follow-up they've agreed to)."},"notes":{"type":"string","maxLength":1000,"description":"Optional context for Capture's team (e.g. 'about 20 tapes are PAL', 'wants everything before December'). Not emailed to the customer."}},"required":["quoteId","firstName","email","phone"],"additionalProperties":false},"SavedQuote":{"type":"object","properties":{"quoteId":{"type":"string","pattern":"^q_[a-z0-9]{12}$"},"discountCode":{"type":["string","null"],"description":"Single-use percent-off code emailed to the customer; enter at checkout. null only if code generation failed (the quote email still went out)."},"discountPercent":{"type":["number","null"],"description":"Percent off the order the code gives (tiered by quote total)."},"discountExpiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When the discount code stops working (14 days after it was issued)."},"emailSentTo":{"type":"string","description":"Address the quote and code were sent to."},"quoteUrl":{"type":"string","format":"uri","description":"Reopens the saved quote on capture.com with the discount pre-applied. Pass through unchanged."},"checkoutUrl":{"type":"string","format":"uri","description":"Starts checkout with the discount pre-applied."},"alreadySaved":{"type":"boolean","description":"True when this quote had already been saved for this email: the existing code is returned and no second email is sent."}},"required":["quoteId","discountCode","discountPercent","discountExpiresAt","emailSentTo","quoteUrl","checkoutUrl","alreadySaved"],"additionalProperties":false},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"What was wrong with the request."},"suggestions":{"type":"array","items":{"type":"string"},"description":"Closest matching format names when a format was not recognised."},"hint":{"type":"string","description":"How to fix the request: accepted shapes, limits and where the format names are."},"formatsUrl":{"type":"string","format":"uri"},"docsUrl":{"type":"string","format":"uri"},"example":{"type":"object","additionalProperties":true}}},"RateLimited":{"type":"object","required":["error","retryAfterSeconds"],"properties":{"error":{"type":"string"},"retryAfterSeconds":{"type":"integer"},"limit":{"type":"integer","description":"Requests allowed per minute for this client."},"pricingUrl":{"type":"string","format":"uri"},"docsUrl":{"type":"string","format":"uri"}}}}}}