Tenant credential: optional and, when sent, must equal the shop bound to the key. Partner credential: required; it selects an organisation the user previously authorised.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"PRINTOOLS Docs","description":"PRINTOOLS documentation — shop management software for print and garment decoration.","colors":{"primary":"#252220","light":"#FACB37","dark":"#FACB37"},"logo":{"light":"https://mintcdn.com/printools-docs/O0KTj_rIOTsZeahM/images/Group2.png?fit=max\u0026auto=format\u0026n=O0KTj_rIOTsZeahM\u0026q=85\u0026s=c13cad1946e83c89b0c37822757efb9b","dark":"https://mintcdn.com/printools-docs/O0KTj_rIOTsZeahM/images/Group1.png?fit=max\u0026auto=format\u0026n=O0KTj_rIOTsZeahM\u0026q=85\u0026s=88ae571075eba2f4413e8f7686ca3ad0","href":"/"},"favicon":{"light":"https://mintcdn.com/printools-docs/_yDOXnlTxvmdL_Ke/images/favacon_smll.png?fit=max\u0026auto=format\u0026n=_yDOXnlTxvmdL_Ke\u0026q=85\u0026s=1716331eafc0a4e1157c30818e74c979","dark":"https://mintcdn.com/printools-docs/_yDOXnlTxvmdL_Ke/images/favacon_smll.png?fit=max\u0026auto=format\u0026n=_yDOXnlTxvmdL_Ke\u0026q=85\u0026s=1716331eafc0a4e1157c30818e74c979"},"api":{"openapi":"https://d1zl72794e73i2.cloudfront.net/releases/2026-09-08.api-blackbox/openapi.json"},"appearance":{"default":"system","strict":false},"background":{"color":{"light":"#FEFBF8","dark":"#12100E"}},"navbar":{"links":[{"href":"mailto:support@printools.com","label":"Support"}]},"footer":{},"fonts":{"heading":{"family":"Big Shoulders Display","weight":800},"body":{"family":"Geist"}},"styling":{"codeblocks":"dark","latex":false},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"printools-docs","hasAudioNarration":false,"actualSubdomain":"printools-docs","customDomains":["docs.printools.io"],"gitSource":{"type":"github","owner":"mintlify-community","repo":"docs-daysync-7781d365","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6acf4de3b4870666e532b6d8","collectionId":"ea377635-fe58-4b66-a96e-1026a91bd747","liveDeploymentHistoryId":"6acf4de3b4870666e532b6d8","schemaVersion":"v3"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{},"buildId":"6acf4de3b4870666e532b6d8","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"Public API","count":222},{"language":"default","tag":"Endpoints","count":215},{"language":"default","tag":"Jobs","count":27},{"language":"default","tag":"Quotes","count":27},{"language":"default","tag":"Garments \u0026 catalogue","count":23},{"language":"default","tag":"Customers","count":17},{"language":"default","tag":"Proofs \u0026 mocks","count":16},{"language":"default","tag":"Purchase orders","count":16},{"language":"default","tag":"Tasks","count":16},{"language":"default","tag":"Vendors","count":15}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"api/reference/get_v1_quotes_quoteId_data","slug":"/api/reference/get_v1_quotes_quoteId_data","pageMetadata":{"title":"One quote and everything hanging off it, in one call","openapi":"GET /v1/quotes/{quoteId}/data","description":"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.","href":"/api/reference/get_v1_quotes_quoteId_data"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,p:`p`,..._provideComponents(),...props.components};return _jsxs(_components.p,{children:[`Required scopes: `,_jsx(_components.code,{children:`quotes.read`}),`, `,_jsx(_components.code,{children:`customers.read`}),`, `,_jsx(_components.code,{children:`garments.read`}),`, `,_jsx(_components.code,{children:`decorations.read`}),`.`]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"One quote and everything hanging off it, in one call","openapi":"GET /v1/quotes/{quoteId}/data","description":"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.","href":"/api/reference/get_v1_quotes_quoteId_data"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"One quote and everything hanging off it, in one call.","operationId":"get_v1_quotes_quoteId_data","tags":["quotes"],"description":"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.","security":["1e43d338-9ba5-4ebe-b49b-f0514fbe04d8","dac195bb-b586-4cf2-939f-5ab9a2c1f242"],"x-printools-required-scopes":["quotes.read","customers.read","garments.read","decorations.read"],"parameters":["9c3ba931-4d00-4d82-9afe-66b86d090bff","29b2de8c-a7b5-4eda-ab86-e493cd310006"],"responses":{"200":"eb4db073-3c7a-41fc-9916-2238588fb23c","400":"9e4480a3-fbb6-431d-a69e-65f6b05817d3","401":"496f3674-240a-4bc8-b940-c8a815b824b1","403":"77ecae87-4ecc-4e7b-96ee-6904e3f4b5ff","404":"18f922f5-0288-414a-ae4a-196cfe072f4d","409":"f095ee79-2ce6-4b34-bf50-7a5c38efdbaf","413":"43a9964d-49bf-4714-ad3f-0f96587fa2e3","429":"a59b1470-8179-4d1e-a3df-91c156598c51","500":"fd2ea7b6-c898-4a35-b34d-9b0ba4d294af"},"x-codeSamples":[{"lang":"curl","label":"Tenant credential","source":"curl --request GET 'https://api.printools.io/v1/quotes/11111111-2222-3333-4444-555555555555/data' \\\n --header 'X-API-Key: $PRINTOOLS_API_KEY'"}],"method":"get","type":"path","servers":["beaaf7be-9258-41cf-929a-55d51e0689b1"],"path":"/v1/quotes/{quoteId}/data","baseUrlOptions":["https://api.printools.io"],"title":"One quote and everything hanging off it, in one call.","codeSamples":[{"label":"Tenant credential","lang":"curl","source":"curl --request GET 'https://api.printools.io/v1/quotes/11111111-2222-3333-4444-555555555555/data' \\\n --header 'X-API-Key: $PRINTOOLS_API_KEY'"}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{"9c3ba931-4d00-4d82-9afe-66b86d090bff":{"name":"quoteId","in":"path","required":true,"schema":{"type":"string","format":"uuid","example":"11111111-2222-3333-4444-555555555555","isRequired":true,"description":"UUID.","uniqueKey":"","typeLabel":"string\u003cuuid>"},"description":"UUID."},"29b2de8c-a7b5-4eda-ab86-e493cd310006":{"name":"X-PrintTools-Organization-Id","in":"header","required":false,"schema":{"type":"string","format":"uuid","isRequired":false,"description":"Tenant credential: optional and, when sent, must equal the shop bound to the key. Partner credential: required; it selects an organisation the user previously authorised.","uniqueKey":"","typeLabel":"string\u003cuuid>"},"description":"Tenant credential: optional and, when sent, must equal the shop bound to the key. Partner credential: required; it selects an organisation the user previously authorised."}},"responses":{"eb4db073-3c7a-41fc-9916-2238588fb23c":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","description":"Every 2xx response uses this envelope.","required":["status","message","data"],"properties":{"status":{"type":"boolean","description":"The actual resolver result. It can be false when an operation returns false or null without throwing.","isRequired":true,"uniqueKey":"status","typeLabel":"boolean"},"message":{"type":"string","example":"OK","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"data":{"type":"object","required":["quote","customer","mocks","invoices"],"properties":{"quote":{"oneOf":[{"type":"object","required":["id","status","subtotalExGst","gstAmount","totalIncGst","createdAt","updatedAt","groups"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.id","typeLabel":"string"},"status":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.status","typeLabel":"string"},"subtotalExGst":{"type":"number","isRequired":true,"uniqueKey":"data.quote.oneOf.0.subtotalExGst","typeLabel":"number"},"gstAmount":{"type":"number","isRequired":true,"uniqueKey":"data.quote.oneOf.0.gstAmount","typeLabel":"number"},"totalIncGst":{"type":"number","isRequired":true,"uniqueKey":"data.quote.oneOf.0.totalIncGst","typeLabel":"number"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.updatedAt","typeLabel":"string\u003cdate-time>"},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].id","typeLabel":"string"},"quoteId":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].quoteId","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].name","typeLabel":"string"},"totalQuantity":{"type":"integer","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].totalQuantity","typeLabel":"integer"},"sortOrder":{"type":"integer","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].sortOrder","typeLabel":"integer"},"rollUpDecoration":{"type":"boolean","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].rollUpDecoration","typeLabel":"boolean"},"rollUpSetup":{"type":"boolean","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].rollUpSetup","typeLabel":"boolean"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"lines":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].id","typeLabel":"string"},"quoteGroupId":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].quoteGroupId","typeLabel":"string"},"lineType":{"type":"string","enum":["Garment","Decoration","Service","Cost","Discount","Surcharge","Other"],"isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].lineType","typeLabel":"enum\u003cstring>"},"productName":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].productName","typeLabel":"string"},"quantity":{"type":"integer","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].quantity","typeLabel":"integer"},"unitPriceExGst":{"type":"number","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].unitPriceExGst","typeLabel":"number"},"sortOrder":{"type":"integer","description":"Position in the group's row sequence — shared with the group's DECORATIONS\nsince F-26, so a surcharge or discount can sit below a decoration. Omit on\ncreate to append.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].sortOrder","typeLabel":"integer"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"variants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].id","typeLabel":"string"},"quoteLineId":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].quoteLineId","typeLabel":"string"},"quantity":{"type":"integer","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].quantity","typeLabel":"integer"},"unitPriceExGst":{"type":"number","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].unitPriceExGst","typeLabel":"number"},"markupSource":{"type":"string","description":"Whether the markup above belongs to a markup GROUP or to the operator\n(CU-86d46hu37). `group` re-resolves through the group's matrix whenever the\nquantity or the cost moves — on reopen as much as on create — while `manual`\nis left alone and holds its saved sell price through a cost edit.\n\nNever null: rows written before the column existed read `manual`, which is\nprecisely how they behaved.","enum":["group","manual"],"isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].markupSource","typeLabel":"enum\u003cstring>"},"isCustomLine":{"type":"boolean","description":"A cost that belongs to the line but is not per-garment — freight is the\nexample (BE-02 / Q-14). Stored as a variant with no size and no colour; the\nflag is what tells one from a half-filled variant, since the size sort, the\nquote document and the PDF all walk these rows.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].isCustomLine","typeLabel":"boolean"},"showOnDocuments":{"type":"boolean","description":"Whether a CUSTOM variant is itemised on the documents the customer sees —\nquote, invoice, PDF, portal (QU-02).\n\nFalse, the default, folds its money into the garment line's total and draws\nno row anywhere. True prints one row reading `Custom variant`, quantity 1,\nwith size and colour blank. Either way the money is identical: a line's\ntotal already sums every variant beneath it, custom rows included.\n\nIgnored on a real size/colour variant — that row IS the itemisation.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].showOnDocuments","typeLabel":"boolean"},"sortOrder":{"type":"integer","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].sortOrder","typeLabel":"integer"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"size":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].size.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].size.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].size","typeLabel":"string | null"},"colour":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].colour.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].colour.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].colour","typeLabel":"string | null"},"buyPrice":{"type":"number","description":"Present only when the credential includes the costs.read scope.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].buyPrice","typeLabel":"number"},"extraCost":{"type":"number","description":"Present only when the credential includes the costs.read scope.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].extraCost","typeLabel":"number"},"markupType":{"oneOf":[{"type":"string","description":"The markup that connects cost to sell, stored so it survives a reopen\n(BE-01 / Q-16). Cost is `buyPrice + extraCost`; sell is\n`percentage ? cost + cost·value/100 : cost + value`. Null on rows written\nbefore the column existed — read those back by back-solving from cost and\nsell, as the client did for every row previously. `MarkupType` is the enum\ncatalog-service already declares.","enum":["percentage","flat_rate"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].markupType.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The markup that connects cost to sell, stored so it survives a reopen\n(BE-01 / Q-16). Cost is `buyPrice + extraCost`; sell is\n`percentage ? cost + cost·value/100 : cost + value`. Null on rows written\nbefore the column existed — read those back by back-solving from cost and\nsell, as the client did for every row previously. `MarkupType` is the enum\ncatalog-service already declares.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].markupType.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].markupType","typeLabel":"enum\u003cstring> | null"},"markupValue":{"oneOf":[{"type":"number","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].markupValue.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].markupValue.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX].markupValue","typeLabel":"number | null"}},"required":["id","quoteLineId","quantity","unitPriceExGst","markupSource","isCustomLine","showOnDocuments","sortOrder","createdAt","updatedAt"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].variants","typeLabel":"object[]"},"garmentCatalogueItemId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].garmentCatalogueItemId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].garmentCatalogueItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].garmentCatalogueItemId","typeLabel":"string | null"},"productSku":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].productSku.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].productSku.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].productSku","typeLabel":"string | null"},"title":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].title.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].title.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].title","typeLabel":"string | null"},"description":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].description","typeLabel":"string | null"},"valueType":{"oneOf":[{"type":"string","description":"Flat or Percentage. Applies to a Discount AND (F-26) a Surcharge — a rate on\na line, whichever direction it points.","enum":["Flat","Percentage"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].valueType.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Flat or Percentage. Applies to a Discount AND (F-26) a Surcharge — a rate on\na line, whichever direction it points.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].valueType.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].valueType","typeLabel":"enum\u003cstring> | null"},"percentage":{"oneOf":[{"type":"number","description":"The rate, when valueType is Percentage. Null otherwise.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].percentage.oneOf.0","typeLabel":"number"},{"type":"null","description":"The rate, when valueType is Percentage. Null otherwise.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].percentage.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].percentage","typeLabel":"number | null"},"discountValueType":{"oneOf":[{"type":"string","enum":["Flat","Percentage"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].discountValueType.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].discountValueType.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].discountValueType","typeLabel":"enum\u003cstring> | null"},"discountPercentage":{"oneOf":[{"type":"number","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].discountPercentage.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].discountPercentage.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].discountPercentage","typeLabel":"number | null"},"customImageUrl":{"oneOf":[{"type":"string","description":"Per-line image override; null falls back to the catalogue thumbnail.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].customImageUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Per-line image override; null falls back to the catalogue thumbnail.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].customImageUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX].customImageUrl","typeLabel":"string | null"}},"required":["id","quoteGroupId","lineType","productName","quantity","unitPriceExGst","sortOrder","createdAt","updatedAt","variants"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines.items.[INDEX]","typeLabel":"object"},"description":"`lines` and `decorations` are two collections sharing ONE `sortOrder`\nsequence (F-26). To render a group in the operator's order, merge them and\nsort by `sortOrder` — do not concatenate lines-then-decorations, which is\nwhat made a surcharge unable to sit below a decoration. To reorder, renumber\nacross BOTH collections.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].lines","typeLabel":"object[]"},"decorations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].id","typeLabel":"string"},"quoteGroupId":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].quoteGroupId","typeLabel":"string"},"quantity":{"type":"integer","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].quantity","typeLabel":"integer"},"baseUnitCost":{"type":"number","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].baseUnitCost","typeLabel":"number"},"baseSetupCost":{"type":"number","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].baseSetupCost","typeLabel":"number"},"includeSetupCost":{"type":"boolean","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].includeSetupCost","typeLabel":"boolean"},"markupSource":{"type":"string","description":"Who owns the per-unit markup — see `MarkupSource`. `group` re-bands on every\nquantity or cost move; `manual` never does.","enum":["group","manual"],"isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].markupSource","typeLabel":"enum\u003cstring>"},"setupMarkupSource":{"type":"string","description":"WHO owns a markup, and therefore whether it may be re-resolved through its\nmarkup group's matrix (CU-86d46hu37).\n\n`group` — a markup group resolved the number, so it re-bands on every quantity\nor cost change, on create and on reopen alike; the sell price moves with it.\n`manual` — an operator typed the markup, flipped its \\$/% toggle, or overrode\nthe sell price. Never re-banded, and a cost edit back-solves to hold the saved\nsell fixed, which is the edit-lock that stops a live quote repricing itself.\n\nStored `not null default 'manual'`, so every row written before this existed is\noperator-owned and behaves exactly as it did. A create path that means `group`\nmust SAY `group` — relying on the default silently reintroduces the bug the\nenum exists to fix.","enum":["group","manual"],"isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].setupMarkupSource","typeLabel":"enum\u003cstring>"},"rollUp":{"type":"boolean","description":"Fold this decoration's UNIT charge into the garment unit price rather than\npricing it on its own row (CU-86d416yvz).\n\nPER DECORATION. `QuoteGroup.rollUpDecoration` folded every decoration in the\ngroup or none of them, which made the dialog's per-decoration toggle a lie —\nturning it on for the embroidery also folded the screen print. The group\nflags are still readable this release and no longer feed the calculation.\n\nDisplay only: the group subtotal, the quote total and the margin are the\nsame number either way. What changes is where the customer reads the money.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].rollUp","typeLabel":"boolean"},"rollUpSetup":{"type":"boolean","description":"Same for the SETUP charge. Inert unless `includeSetupCost` is true — there is\nnothing to fold when the setup is not being charged, the pairing the group\nflag already had.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].rollUpSetup","typeLabel":"boolean"},"showOnDocuments":{"type":"boolean","description":"Draw this decoration's row on customer-facing documents at all.\n\nDistinct from `rollUp`, and they answer different questions — the quote\ndocument, the PDF and the portal all honour both:\n\n rollUp only the row is listed, its price reads \"Included\"\n rollUp + hidden no row anywhere; the money is inside the garment price\n\nHidden with `rollUp: false` would leave the itemised rows summing to less\nthan the customer pays, so hiding a row implies the fold.\n\nDefaults true — every decoration prints today and this must not change how a\nlive quote reads. Note the opposite default to `QuoteVariant.showOnDocuments`,\nwhich folds by default because a courier fee itemised as a garment variant\nwas the complaint there.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].showOnDocuments","typeLabel":"boolean"},"colours":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].colours.items.[INDEX].name","typeLabel":"string"},"isBase":{"type":"boolean","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].colours.items.[INDEX].isBase","typeLabel":"boolean"}},"required":["name","isBase"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].colours.items.[INDEX]","typeLabel":"object"},"description":"The inks, in the operator's order. At most one is flagged `isBase`, and it renders first.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].colours","typeLabel":"object[]"},"sortOrder":{"type":"integer","description":"Position in the group's row sequence — the SAME sequence as the group's\nLINES since F-26, not a separate one. Omit on create to append.","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].sortOrder","typeLabel":"integer"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"decorationItemId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].decorationItemId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].decorationItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].decorationItemId","typeLabel":"string | null"},"method":{"oneOf":[{"type":"string","description":"The decoration technique. Recorded from the quote stage since CU-86d43a1qr —\nit is agreed with the customer when the price is, not discovered on the floor.\nSame enum as `JobGroupDecoration.method`, and literally the same Postgres\ntype, so conversion copies it.","enum":["ScreenPrinting","Embroidery","DtfTransfer","Dtg","Vinyl","Sublimation","HeatTransfer","Outsourced","Other"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].method.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The decoration technique. Recorded from the quote stage since CU-86d43a1qr —\nit is agreed with the customer when the price is, not discovered on the floor.\nSame enum as `JobGroupDecoration.method`, and literally the same Postgres\ntype, so conversion copies it.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].method.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].method","typeLabel":"enum\u003cstring> | null"},"position":{"oneOf":[{"type":"string","description":"Where the print goes — FREE TEXT (CU-86d4571me).\n\nWas a nine-value enum whose escape hatch was `Other`, which could not carry\nwhat the \"other\" actually was: \"2cm down from neckline\", \"side of caps\",\n\"over pocket\", \"under collar\". An escape hatch that cannot hold the\nexplanation is not one, and the shop floor was reading a bare \"Other\".\n\nIt also ABSORBS the old `placement`, which was a second free-text field for\nthe same fact (\"2cm below collar\", \"centred on pocket\"). Two fields meant two\nplaces to look and two chances to disagree; there is one now.\n\nThe nine former values (Front, Back, Left Sleeve, Right Sleeve, Neck,\nLower Back, Left Chest, Right Chest, Other) are CLIENT-SIDE SUGGESTIONS\nONLY — the server constrains nothing but trims the value and caps its\nlength. Stored as the display label, so the job, the proof, the PDF, the\nportal and the job sheet all show the same string.\n\nNull means no position has been named. Empty is refused rather than stored.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].position.oneOf.0","typeLabel":"string"},{"type":"null","description":"Where the print goes — FREE TEXT (CU-86d4571me).\n\nWas a nine-value enum whose escape hatch was `Other`, which could not carry\nwhat the \"other\" actually was: \"2cm down from neckline\", \"side of caps\",\n\"over pocket\", \"under collar\". An escape hatch that cannot hold the\nexplanation is not one, and the shop floor was reading a bare \"Other\".\n\nIt also ABSORBS the old `placement`, which was a second free-text field for\nthe same fact (\"2cm below collar\", \"centred on pocket\"). Two fields meant two\nplaces to look and two chances to disagree; there is one now.\n\nThe nine former values (Front, Back, Left Sleeve, Right Sleeve, Neck,\nLower Back, Left Chest, Right Chest, Other) are CLIENT-SIDE SUGGESTIONS\nONLY — the server constrains nothing but trims the value and caps its\nlength. Stored as the display label, so the job, the proof, the PDF, the\nportal and the job sheet all show the same string.\n\nNull means no position has been named. Empty is refused rather than stored.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].position.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].position","typeLabel":"string | null"},"setupCost":{"type":"number","description":"Present only when the credential includes the costs.read scope.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].setupCost","typeLabel":"number"},"unitCost":{"type":"number","description":"Present only when the credential includes the costs.read scope.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].unitCost","typeLabel":"number"},"markupType":{"oneOf":[{"type":"string","description":"The markup connecting the per-unit COST to the per-unit CHARGE, stored so it\nsurvives a reopen (CU-86d46hu37).\n\nA decoration used to persist nothing here: the client back-solved a markup\nfrom cost and charge every time the dialog opened, which is why a decoration\nsaved with a PERCENTAGE markup always reopened showing a flat dollar amount —\na back-solved percentage is rarely exact, so the back-solve had to prefer\nflat. Null on rows written before these columns existed; those still\nback-solve, exactly as every row did before.","enum":["percentage","flat_rate"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].markupType.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The markup connecting the per-unit COST to the per-unit CHARGE, stored so it\nsurvives a reopen (CU-86d46hu37).\n\nA decoration used to persist nothing here: the client back-solved a markup\nfrom cost and charge every time the dialog opened, which is why a decoration\nsaved with a PERCENTAGE markup always reopened showing a flat dollar amount —\na back-solved percentage is rarely exact, so the back-solve had to prefer\nflat. Null on rows written before these columns existed; those still\nback-solve, exactly as every row did before.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].markupType.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].markupType","typeLabel":"enum\u003cstring> | null"},"markupValue":{"oneOf":[{"type":"number","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].markupValue.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].markupValue.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].markupValue","typeLabel":"number | null"},"setupMarkupType":{"oneOf":[{"type":"string","description":"The same three facts for the SETUP lane, which is a genuinely separate\nmarkup: a setup markup group is matched by `appliesToSetupCost` (exclusive of\nthe per-unit groups) and bands on the SETUP cost, not the per-unit one. One\nlane can be group-owned while the other is not.\n\nInert unless `includeSetupCost` — there is no charge to mark up when the\nsetup is not being charged.","enum":["percentage","flat_rate"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].setupMarkupType.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The same three facts for the SETUP lane, which is a genuinely separate\nmarkup: a setup markup group is matched by `appliesToSetupCost` (exclusive of\nthe per-unit groups) and bands on the SETUP cost, not the per-unit one. One\nlane can be group-owned while the other is not.\n\nInert unless `includeSetupCost` — there is no charge to mark up when the\nsetup is not being charged.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].setupMarkupType.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].setupMarkupType","typeLabel":"enum\u003cstring> | null"},"setupMarkupValue":{"oneOf":[{"type":"number","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].setupMarkupValue.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].setupMarkupValue.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].setupMarkupValue","typeLabel":"number | null"},"description":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].description","typeLabel":"string | null"},"widthCm":{"oneOf":[{"type":"number","description":"Print dimensions in CENTIMETRES (BE-04 / Q-24 / CU-86d43a1qr). The unit is\nfixed by the schema, not stored per row — renderers print \"30 × 25 cm\"; the\ncolumn only ever holds the number. Nullable: most decorations carry no\ndimensions, and 0 is a measurement, not an absence.\n\nThese were `width`/`height` in millimetres until CU-86d43a1qr, while the proof\nspec describing the same print stored centimetres — so one job printed\n`300 × 250 mm` on the quote and `30 × 25 cm` on the proof. Every stage stores\ncm now and nothing converts.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].widthCm.oneOf.0","typeLabel":"number"},{"type":"null","description":"Print dimensions in CENTIMETRES (BE-04 / Q-24 / CU-86d43a1qr). The unit is\nfixed by the schema, not stored per row — renderers print \"30 × 25 cm\"; the\ncolumn only ever holds the number. Nullable: most decorations carry no\ndimensions, and 0 is a measurement, not an absence.\n\nThese were `width`/`height` in millimetres until CU-86d43a1qr, while the proof\nspec describing the same print stored centimetres — so one job printed\n`300 × 250 mm` on the quote and `30 × 25 cm` on the proof. Every stage stores\ncm now and nothing converts.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].widthCm.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].widthCm","typeLabel":"number | null"},"lengthCm":{"oneOf":[{"type":"number","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].lengthCm.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].lengthCm.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].lengthCm","typeLabel":"number | null"},"necklineDropCm":{"oneOf":[{"type":"number","description":"How far below the collar the print starts, in cm.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].necklineDropCm.oneOf.0","typeLabel":"number"},{"type":"null","description":"How far below the collar the print starts, in cm.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].necklineDropCm.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].necklineDropCm","typeLabel":"number | null"},"screenCount":{"oneOf":[{"type":"integer","description":"Screens to burn — screen printing only. Null when it does not apply.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].screenCount.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Screens to burn — screen printing only. Null when it does not apply.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].screenCount.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].screenCount","typeLabel":"integer | null"},"screenMeshGrade":{"oneOf":[{"type":"string","description":"Mesh grade for those screens, e.g. `156`.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].screenMeshGrade.oneOf.0","typeLabel":"string"},{"type":"null","description":"Mesh grade for those screens, e.g. `156`.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].screenMeshGrade.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].screenMeshGrade","typeLabel":"string | null"},"colourCount":{"oneOf":[{"type":"integer","description":"How many ink colours the print uses. Free of `colours` — an operator can price a 4-colour print before naming the inks.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].colourCount.oneOf.0","typeLabel":"integer"},{"type":"null","description":"How many ink colours the print uses. Free of `colours` — an operator can price a 4-colour print before naming the inks.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].colourCount.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].colourCount","typeLabel":"integer | null"},"specialInstructions":{"oneOf":[{"type":"string","description":"Internal shop notes — **never customer-facing**. Named to match\n`JobGroupDecoration.specialInstructions` so quote and job share one\nvocabulary. `description` is the Title and prints on the quote document, so\nit could not be reused for this. Deliberately absent from\n`PortalQuoteDecoration` and from the PDF renderer — internal by\nconstruction, the way `Mock.layers` is withheld from `PortalMock`.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].specialInstructions.oneOf.0","typeLabel":"string"},{"type":"null","description":"Internal shop notes — **never customer-facing**. Named to match\n`JobGroupDecoration.specialInstructions` so quote and job share one\nvocabulary. `description` is the Title and prints on the quote document, so\nit could not be reused for this. Deliberately absent from\n`PortalQuoteDecoration` and from the PDF renderer — internal by\nconstruction, the way `Mock.layers` is withheld from `PortalMock`.","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].specialInstructions.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].specialInstructions","typeLabel":"string | null"},"artworkFileUrl":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].artworkFileUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].artworkFileUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].artworkFileUrl","typeLabel":"string | null"},"separationFileUrl":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].separationFileUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].separationFileUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX].separationFileUrl","typeLabel":"string | null"}},"required":["id","quoteGroupId","quantity","baseUnitCost","baseSetupCost","includeSetupCost","markupSource","setupMarkupSource","rollUp","rollUpSetup","showOnDocuments","colours","sortOrder","createdAt","updatedAt"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX].decorations","typeLabel":"object[]"}},"required":["id","quoteId","name","totalQuantity","sortOrder","rollUpDecoration","rollUpSetup","createdAt","updatedAt","lines","decorations"],"uniqueKey":"data.quote.oneOf.0.groups.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.quote.oneOf.0.groups","typeLabel":"object[]"},"quoteRef":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.quoteRef.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.quoteRef.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.quoteRef","typeLabel":"string | null"},"reference":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.reference.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.reference","typeLabel":"string | null"},"clientId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.clientId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.clientId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.clientId","typeLabel":"string | null"},"contactId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.contactId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.contactId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.contactId","typeLabel":"string | null"},"shippingAddressId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.shippingAddressId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.shippingAddressId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.shippingAddressId","typeLabel":"string | null"},"salesRepEmail":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.salesRepEmail.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.salesRepEmail.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.salesRepEmail","typeLabel":"string | null"},"deliveryMethod":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.deliveryMethod.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.deliveryMethod.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.deliveryMethod","typeLabel":"string | null"},"deliveryDate":{"oneOf":[{"type":"string","format":"date","uniqueKey":"data.quote.oneOf.0.deliveryDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","uniqueKey":"data.quote.oneOf.0.deliveryDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.deliveryDate","typeLabel":"string\u003cdate> | null"},"productionDeadline":{"oneOf":[{"type":"string","format":"date","uniqueKey":"data.quote.oneOf.0.productionDeadline.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","uniqueKey":"data.quote.oneOf.0.productionDeadline.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.productionDeadline","typeLabel":"string\u003cdate> | null"},"invoiceDueDate":{"oneOf":[{"type":"string","format":"date","uniqueKey":"data.quote.oneOf.0.invoiceDueDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","uniqueKey":"data.quote.oneOf.0.invoiceDueDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.invoiceDueDate","typeLabel":"string\u003cdate> | null"},"notes":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.notes.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.notes.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.notes","typeLabel":"string | null"},"taxRateId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.taxRateId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.taxRateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.taxRateId","typeLabel":"string | null"},"taxName":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.taxName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.taxName.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.taxName","typeLabel":"string | null"},"taxRatePct":{"oneOf":[{"type":"number","uniqueKey":"data.quote.oneOf.0.taxRatePct.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"data.quote.oneOf.0.taxRatePct.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.taxRatePct","typeLabel":"number | null"},"mockId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.mockId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.mockId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.mockId","typeLabel":"string | null"},"jobId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.jobId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.jobId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.jobId","typeLabel":"string | null"},"jobRef":{"oneOf":[{"type":"string","description":"The linked job's own `jobRef` (CB-05), resolved server-side from the job row —\nnever derived from `jobId`. Null when the quote has no job, when `jobId` points\nat a row that no longer exists (these link columns carry no FK) or is not\nvisible to the caller's tenant, and when the linked job's own ref is null.\nRead-only: no mutation input sets it.","uniqueKey":"data.quote.oneOf.0.jobRef.oneOf.0","typeLabel":"string"},{"type":"null","description":"The linked job's own `jobRef` (CB-05), resolved server-side from the job row —\nnever derived from `jobId`. Null when the quote has no job, when `jobId` points\nat a row that no longer exists (these link columns carry no FK) or is not\nvisible to the caller's tenant, and when the linked job's own ref is null.\nRead-only: no mutation input sets it.","uniqueKey":"data.quote.oneOf.0.jobRef.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.jobRef","typeLabel":"string | null"},"invoiceId":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.invoiceId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.invoiceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.invoiceId","typeLabel":"string | null"},"invoiceStatus":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.invoiceStatus.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.invoiceStatus.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.invoiceStatus","typeLabel":"string | null"},"sentToEmail":{"oneOf":[{"type":"string","uniqueKey":"data.quote.oneOf.0.sentToEmail.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.quote.oneOf.0.sentToEmail.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.sentToEmail","typeLabel":"string | null"},"sentAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"data.quote.oneOf.0.sentAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"data.quote.oneOf.0.sentAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.quote.oneOf.0.sentAt","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"data.quote.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"data.quote.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.quote","typeLabel":"object | null"},"customer":{"oneOf":[{"type":"object","required":["id","kind","isActive","createdAt","updatedAt","contacts","addresses"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.customer.oneOf.0.id","typeLabel":"string"},"kind":{"type":"string","enum":["Business","Individual"],"isRequired":true,"uniqueKey":"data.customer.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"isActive":{"type":"boolean","isRequired":true,"uniqueKey":"data.customer.oneOf.0.isActive","typeLabel":"boolean"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.customer.oneOf.0.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.customer.oneOf.0.updatedAt","typeLabel":"string\u003cdate-time>"},"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].id","typeLabel":"string"},"customerId":{"type":"string","isRequired":true,"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].customerId","typeLabel":"string"},"isPrimary":{"type":"boolean","isRequired":true,"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].isPrimary","typeLabel":"boolean"},"fullName":{"type":"string","isRequired":true,"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].fullName","typeLabel":"string"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"includeInAccountingEmails":{"type":"boolean","description":"Copy this person on the accounting provider's outgoing documents. Maps onto\nXero's `ContactPerson.IncludeInEmails` — the only recipient switch Xero\nexposes, and a property of the PERSON on the business record because a Xero\ninvoice has no per-invoice recipient field.\n\nDefaults false: only the business's own address is written to until the shop\ndeliberately opts somebody in.","isRequired":true,"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].includeInAccountingEmails","typeLabel":"boolean"},"roleTitle":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].roleTitle.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].roleTitle.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].roleTitle","typeLabel":"string | null"},"email":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].email.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].email.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].email","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].phone.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].phone","typeLabel":"string | null"},"notes":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].notes.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].notes.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX].notes","typeLabel":"string | null"}},"required":["id","customerId","isPrimary","fullName","createdAt","updatedAt","includeInAccountingEmails"],"uniqueKey":"data.customer.oneOf.0.contacts.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.customer.oneOf.0.contacts","typeLabel":"object[]"},"addresses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].id","typeLabel":"string"},"customerId":{"type":"string","isRequired":true,"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].customerId","typeLabel":"string"},"kind":{"type":"string","enum":["Billing","Shipping","Other"],"isRequired":true,"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"country":{"type":"string","isRequired":true,"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].country","typeLabel":"string"},"isDefault":{"type":"boolean","isRequired":true,"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].isDefault","typeLabel":"boolean"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"fullAddress":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].fullAddress.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].fullAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].fullAddress","typeLabel":"string | null"},"line1":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].line1.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].line1.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].line1","typeLabel":"string | null"},"line2":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].line2.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].line2.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].line2","typeLabel":"string | null"},"suburb":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].suburb.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].suburb.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].suburb","typeLabel":"string | null"},"state":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].state.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].state.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].state","typeLabel":"string | null"},"postcode":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].postcode.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].postcode.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX].postcode","typeLabel":"string | null"}},"required":["id","customerId","kind","country","isDefault","createdAt","updatedAt"],"uniqueKey":"data.customer.oneOf.0.addresses.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.customer.oneOf.0.addresses","typeLabel":"object[]"},"name":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.name","typeLabel":"string | null"},"businessName":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.businessName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.businessName.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.businessName","typeLabel":"string | null"},"firstName":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.firstName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.firstName.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.firstName","typeLabel":"string | null"},"lastName":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.lastName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.lastName.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.lastName","typeLabel":"string | null"},"email":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.email.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.email.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.email","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.phone.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.phone","typeLabel":"string | null"},"abn":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.abn.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.abn.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.abn","typeLabel":"string | null"},"tier":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.tier.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.tier.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.tier","typeLabel":"string | null"},"notes":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.notes.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.notes.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.notes","typeLabel":"string | null"},"portalToken":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.portalToken.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.portalToken.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.portalToken","typeLabel":"string | null"},"defaultBillingAddressId":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.defaultBillingAddressId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.defaultBillingAddressId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.defaultBillingAddressId","typeLabel":"string | null"},"defaultShippingAddressId":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.defaultShippingAddressId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.defaultShippingAddressId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.defaultShippingAddressId","typeLabel":"string | null"},"primaryContactId":{"oneOf":[{"type":"string","uniqueKey":"data.customer.oneOf.0.primaryContactId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.customer.oneOf.0.primaryContactId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.primaryContactId","typeLabel":"string | null"},"archivedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"data.customer.oneOf.0.archivedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"data.customer.oneOf.0.archivedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customer.oneOf.0.archivedAt","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"data.customer.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"data.customer.oneOf.1","typeLabel":"null"},{"type":"null","isRequired":true,"uniqueKey":"data.customer.oneOf.2","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.customer","typeLabel":"object · null · null"},"mocks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.mocks.items.[INDEX].id","typeLabel":"string"},"status":{"type":"string","isRequired":true,"uniqueKey":"data.mocks.items.[INDEX].status","typeLabel":"string"},"version":{"type":"integer","isRequired":true,"uniqueKey":"data.mocks.items.[INDEX].version","typeLabel":"integer"},"layers":{"description":"Arbitrary JSON. Its structure is application-defined and is intentionally not presented as a closed object.","isRequired":true,"uniqueKey":"data.mocks.items.[INDEX].layers","typeLabel":"any"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.mocks.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.mocks.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"jobId":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].jobId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].jobId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].jobId","typeLabel":"string | null"},"quoteId":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].quoteId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].quoteId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].quoteId","typeLabel":"string | null"},"quoteGroupId":{"oneOf":[{"type":"string","description":"The quote group this mock illustrates. Multi-option quotes carry one mock per option; `Quote.mockId` stays the quote-level primary.","uniqueKey":"data.mocks.items.[INDEX].quoteGroupId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The quote group this mock illustrates. Multi-option quotes carry one mock per option; `Quote.mockId` stays the quote-level primary.","uniqueKey":"data.mocks.items.[INDEX].quoteGroupId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].quoteGroupId","typeLabel":"string | null"},"quoteLineId":{"oneOf":[{"type":"string","description":"The quote line this mock's composite mirrors onto (via QuoteLine.customImageUrl), so the mock reaches the quote document and quotePdf.","uniqueKey":"data.mocks.items.[INDEX].quoteLineId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The quote line this mock's composite mirrors onto (via QuoteLine.customImageUrl), so the mock reaches the quote document and quotePdf.","uniqueKey":"data.mocks.items.[INDEX].quoteLineId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].quoteLineId","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].name.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].name","typeLabel":"string | null"},"garmentAssetId":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].garmentAssetId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].garmentAssetId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].garmentAssetId","typeLabel":"string | null"},"baseImageUrl":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].baseImageUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].baseImageUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].baseImageUrl","typeLabel":"string | null"},"parentMockId":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].parentMockId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].parentMockId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].parentMockId","typeLabel":"string | null"},"approvedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"data.mocks.items.[INDEX].approvedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"data.mocks.items.[INDEX].approvedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].approvedAt","typeLabel":"string\u003cdate-time> | null"},"approvedByName":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].approvedByName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].approvedByName.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].approvedByName","typeLabel":"string | null"},"approvedByEmail":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].approvedByEmail.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].approvedByEmail.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].approvedByEmail","typeLabel":"string | null"},"rejectionReason":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].rejectionReason.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].rejectionReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].rejectionReason","typeLabel":"string | null"},"previewUrl":{"oneOf":[{"type":"string","uniqueKey":"data.mocks.items.[INDEX].previewUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.mocks.items.[INDEX].previewUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.mocks.items.[INDEX].previewUrl","typeLabel":"string | null"}},"required":["id","status","version","layers","createdAt","updatedAt"],"uniqueKey":"data.mocks.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.mocks","typeLabel":"object[]"},"invoices":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].id","typeLabel":"string"},"quoteId":{"type":"string","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].quoteId","typeLabel":"string"},"invoiceRef":{"type":"string","description":"INV-YYYY-NNNN, per-org sequence.","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].invoiceRef","typeLabel":"string"},"currency":{"type":"string","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].currency","typeLabel":"string"},"subtotalCents":{"type":"integer","description":"Money in cents (dollars -> cents, round half-up).","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].subtotalCents","typeLabel":"integer"},"gstCents":{"type":"integer","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].gstCents","typeLabel":"integer"},"amountCents":{"type":"integer","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].amountCents","typeLabel":"integer"},"status":{"type":"string","description":"Draft | AwaitingPayment | Pending | Paid | PaymentFailed | Refunded | Void","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].status","typeLabel":"string"},"lineItemsSnapshot":{"description":"Locked copy of the quote tree at generation time.","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].lineItemsSnapshot","typeLabel":"any"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.invoices.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"clientId":{"oneOf":[{"type":"string","uniqueKey":"data.invoices.items.[INDEX].clientId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].clientId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].clientId","typeLabel":"string | null"},"contactId":{"oneOf":[{"type":"string","uniqueKey":"data.invoices.items.[INDEX].contactId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].contactId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].contactId","typeLabel":"string | null"},"dueDate":{"oneOf":[{"type":"string","format":"date","uniqueKey":"data.invoices.items.[INDEX].dueDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","uniqueKey":"data.invoices.items.[INDEX].dueDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].dueDate","typeLabel":"string\u003cdate> | null"},"notes":{"oneOf":[{"type":"string","uniqueKey":"data.invoices.items.[INDEX].notes.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].notes.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].notes","typeLabel":"string | null"},"pinchPaymentLinkUrl":{"oneOf":[{"type":"string","description":"Hosted Pinch payment link; null for manual-payment invoices.\n\nAlso null — for every read and every mutation return — while the org's\n`payments` settings area has `paymentLinksEnabled: false`. The column is left\nintact underneath, so re-enabling the toggle restores the link without\nre-minting it at Pinch.","uniqueKey":"data.invoices.items.[INDEX].pinchPaymentLinkUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Hosted Pinch payment link; null for manual-payment invoices.\n\nAlso null — for every read and every mutation return — while the org's\n`payments` settings area has `paymentLinksEnabled: false`. The column is left\nintact underneath, so re-enabling the toggle restores the link without\nre-minting it at Pinch.","uniqueKey":"data.invoices.items.[INDEX].pinchPaymentLinkUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].pinchPaymentLinkUrl","typeLabel":"string | null"},"pinchPaymentId":{"oneOf":[{"type":"string","description":"Pinch payment id (pmt_...) once a platform payment lands (C3).","uniqueKey":"data.invoices.items.[INDEX].pinchPaymentId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Pinch payment id (pmt_...) once a platform payment lands (C3).","uniqueKey":"data.invoices.items.[INDEX].pinchPaymentId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].pinchPaymentId","typeLabel":"string | null"},"xeroInvoiceId":{"oneOf":[{"type":"string","description":"Accounting-sync receipts (Epic D): set once pushed; null = not synced.","uniqueKey":"data.invoices.items.[INDEX].xeroInvoiceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting-sync receipts (Epic D): set once pushed; null = not synced.","uniqueKey":"data.invoices.items.[INDEX].xeroInvoiceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].xeroInvoiceId","typeLabel":"string | null"},"qboSalesReceiptId":{"oneOf":[{"type":"string","uniqueKey":"data.invoices.items.[INDEX].qboSalesReceiptId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].qboSalesReceiptId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].qboSalesReceiptId","typeLabel":"string | null"},"xeroPaymentId":{"oneOf":[{"type":"string","description":"Xero payment id once the payment is recorded in Xero; null = invoice pushed but payment not synced.","uniqueKey":"data.invoices.items.[INDEX].xeroPaymentId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Xero payment id once the payment is recorded in Xero; null = invoice pushed but payment not synced.","uniqueKey":"data.invoices.items.[INDEX].xeroPaymentId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].xeroPaymentId","typeLabel":"string | null"},"xeroInvoiceUrl":{"oneOf":[{"type":"string","description":"Deep link to this invoice in Xero; null until pushed.","uniqueKey":"data.invoices.items.[INDEX].xeroInvoiceUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Deep link to this invoice in Xero; null until pushed.","uniqueKey":"data.invoices.items.[INDEX].xeroInvoiceUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].xeroInvoiceUrl","typeLabel":"string | null"},"qboInvoiceId":{"oneOf":[{"type":"string","description":"QB-01 — the COLLECTABLE QuickBooks Invoice, set by pushInvoiceToQuickBooks.\nDistinct from qboSalesReceiptId, which is the paid-record document the\ndispatcher writes for a shop that never presses the manual action; an\ninvoice carries one or the other, never both.","uniqueKey":"data.invoices.items.[INDEX].qboInvoiceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"QB-01 — the COLLECTABLE QuickBooks Invoice, set by pushInvoiceToQuickBooks.\nDistinct from qboSalesReceiptId, which is the paid-record document the\ndispatcher writes for a shop that never presses the manual action; an\ninvoice carries one or the other, never both.","uniqueKey":"data.invoices.items.[INDEX].qboInvoiceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].qboInvoiceId","typeLabel":"string | null"},"qboPaymentId":{"oneOf":[{"type":"string","description":"QuickBooks payment id once the payment is booked there; null = invoice pushed but payment not synced.","uniqueKey":"data.invoices.items.[INDEX].qboPaymentId.oneOf.0","typeLabel":"string"},{"type":"null","description":"QuickBooks payment id once the payment is booked there; null = invoice pushed but payment not synced.","uniqueKey":"data.invoices.items.[INDEX].qboPaymentId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].qboPaymentId","typeLabel":"string | null"},"qboInvoiceUrl":{"oneOf":[{"type":"string","description":"Deep link to this invoice in QuickBooks; null until pushed.","uniqueKey":"data.invoices.items.[INDEX].qboInvoiceUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Deep link to this invoice in QuickBooks; null until pushed.","uniqueKey":"data.invoices.items.[INDEX].qboInvoiceUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].qboInvoiceUrl","typeLabel":"string | null"},"paidMethod":{"oneOf":[{"type":"string","description":"pinch | bank_transfer | cash | card | other | xero | quickbooks (how Paid happened).","uniqueKey":"data.invoices.items.[INDEX].paidMethod.oneOf.0","typeLabel":"string"},{"type":"null","description":"pinch | bank_transfer | cash | card | other | xero | quickbooks (how Paid happened).","uniqueKey":"data.invoices.items.[INDEX].paidMethod.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].paidMethod","typeLabel":"string | null"},"paidReference":{"oneOf":[{"type":"string","uniqueKey":"data.invoices.items.[INDEX].paidReference.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].paidReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].paidReference","typeLabel":"string | null"},"paidAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"data.invoices.items.[INDEX].paidAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"data.invoices.items.[INDEX].paidAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].paidAt","typeLabel":"string\u003cdate-time> | null"},"sentAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"data.invoices.items.[INDEX].sentAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"data.invoices.items.[INDEX].sentAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].sentAt","typeLabel":"string\u003cdate-time> | null"},"pinchRefundId":{"oneOf":[{"type":"string","description":"Pinch refund id (rfd_...); null for off-platform refunds.","uniqueKey":"data.invoices.items.[INDEX].pinchRefundId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Pinch refund id (rfd_...); null for off-platform refunds.","uniqueKey":"data.invoices.items.[INDEX].pinchRefundId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].pinchRefundId","typeLabel":"string | null"},"refundedAmountCents":{"oneOf":[{"type":"integer","uniqueKey":"data.invoices.items.[INDEX].refundedAmountCents.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].refundedAmountCents.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].refundedAmountCents","typeLabel":"integer | null"},"refundReason":{"oneOf":[{"type":"string","uniqueKey":"data.invoices.items.[INDEX].refundReason.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].refundReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].refundReason","typeLabel":"string | null"},"refundedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"data.invoices.items.[INDEX].refundedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"data.invoices.items.[INDEX].refundedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].refundedAt","typeLabel":"string\u003cdate-time> | null"},"voidReason":{"oneOf":[{"type":"string","description":"Why the invoice was voided; null unless status is Void.","uniqueKey":"data.invoices.items.[INDEX].voidReason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why the invoice was voided; null unless status is Void.","uniqueKey":"data.invoices.items.[INDEX].voidReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].voidReason","typeLabel":"string | null"},"voidedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"data.invoices.items.[INDEX].voidedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"data.invoices.items.[INDEX].voidedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].voidedAt","typeLabel":"string\u003cdate-time> | null"},"paymentClaimedAt":{"oneOf":[{"type":"string","format":"date-time","description":"Client-declared off-platform payment (\"remittance advice\"), submitted from the portal.\nNOT a payment record — the shop must verify it. Cleared by markInvoicePaid (confirmed),\ndismissPaymentClaim (rejected) and the Pinch webhook `paid` path (a real payment makes\nthe claim moot).","uniqueKey":"data.invoices.items.[INDEX].paymentClaimedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Client-declared off-platform payment (\"remittance advice\"), submitted from the portal.\nNOT a payment record — the shop must verify it. Cleared by markInvoicePaid (confirmed),\ndismissPaymentClaim (rejected) and the Pinch webhook `paid` path (a real payment makes\nthe claim moot).","uniqueKey":"data.invoices.items.[INDEX].paymentClaimedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].paymentClaimedAt","typeLabel":"string\u003cdate-time> | null"},"paymentClaimedMethod":{"oneOf":[{"type":"string","description":"bank_transfer | cash | other — the portal's claim vocabulary.","uniqueKey":"data.invoices.items.[INDEX].paymentClaimedMethod.oneOf.0","typeLabel":"string"},{"type":"null","description":"bank_transfer | cash | other — the portal's claim vocabulary.","uniqueKey":"data.invoices.items.[INDEX].paymentClaimedMethod.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].paymentClaimedMethod","typeLabel":"string | null"},"paymentClaimedReference":{"oneOf":[{"type":"string","uniqueKey":"data.invoices.items.[INDEX].paymentClaimedReference.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].paymentClaimedReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].paymentClaimedReference","typeLabel":"string | null"},"paymentClaimedNote":{"oneOf":[{"type":"string","uniqueKey":"data.invoices.items.[INDEX].paymentClaimedNote.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.invoices.items.[INDEX].paymentClaimedNote.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.invoices.items.[INDEX].paymentClaimedNote","typeLabel":"string | null"}},"required":["id","quoteId","invoiceRef","currency","subtotalCents","gstCents","amountCents","status","lineItemsSnapshot","createdAt","updatedAt"],"uniqueKey":"data.invoices.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.invoices","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":true,"message":"OK","data":{"quote":{"id":"\u003cstring>","status":"\u003cstring>","subtotalExGst":123,"gstAmount":123,"totalIncGst":123,"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","groups":[{"id":"\u003cstring>","quoteId":"\u003cstring>","name":"\u003cstring>","totalQuantity":123,"sortOrder":123,"rollUpDecoration":true,"rollUpSetup":true,"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","lines":[{"id":"\u003cstring>","quoteGroupId":"\u003cstring>","lineType":"Garment","productName":"\u003cstring>","quantity":123,"unitPriceExGst":123,"sortOrder":123,"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","variants":[{"id":"\u003cstring>","quoteLineId":"\u003cstring>","quantity":123,"unitPriceExGst":123,"markupSource":"group","isCustomLine":true,"showOnDocuments":true,"sortOrder":123,"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","size":"\u003cstring>","colour":"\u003cstring>","buyPrice":123,"extraCost":123,"markupType":"percentage","markupValue":123}],"garmentCatalogueItemId":"\u003cstring>","productSku":"\u003cstring>","title":"\u003cstring>","description":"\u003cstring>","valueType":"Flat","percentage":123,"discountValueType":"Flat","discountPercentage":123,"customImageUrl":"\u003cstring>"}],"decorations":[{"id":"\u003cstring>","quoteGroupId":"\u003cstring>","quantity":123,"baseUnitCost":123,"baseSetupCost":123,"includeSetupCost":true,"markupSource":"group","setupMarkupSource":"group","rollUp":true,"rollUpSetup":true,"showOnDocuments":true,"colours":[{"name":"\u003cstring>","isBase":true}],"sortOrder":123,"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","decorationItemId":"\u003cstring>","method":"ScreenPrinting","position":"\u003cstring>","setupCost":123,"unitCost":123,"markupType":"percentage","markupValue":123,"setupMarkupType":"percentage","setupMarkupValue":123,"description":"\u003cstring>","widthCm":123,"lengthCm":123,"necklineDropCm":123,"screenCount":123,"screenMeshGrade":"\u003cstring>","colourCount":123,"specialInstructions":"\u003cstring>","artworkFileUrl":"\u003cstring>","separationFileUrl":"\u003cstring>"}]}],"quoteRef":"\u003cstring>","reference":"\u003cstring>","clientId":"\u003cstring>","contactId":"\u003cstring>","shippingAddressId":"\u003cstring>","salesRepEmail":"\u003cstring>","deliveryMethod":"\u003cstring>","deliveryDate":"2023-12-25","productionDeadline":"2023-12-25","invoiceDueDate":"2023-12-25","notes":"\u003cstring>","taxRateId":"\u003cstring>","taxName":"\u003cstring>","taxRatePct":123,"mockId":"\u003cstring>","jobId":"\u003cstring>","jobRef":"\u003cstring>","invoiceId":"\u003cstring>","invoiceStatus":"\u003cstring>","sentToEmail":"\u003cstring>","sentAt":"2023-11-07T05:31:56Z"},"customer":{"id":"\u003cstring>","kind":"Business","isActive":true,"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","contacts":[{"id":"\u003cstring>","customerId":"\u003cstring>","isPrimary":true,"fullName":"\u003cstring>","createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","includeInAccountingEmails":true,"roleTitle":"\u003cstring>","email":"\u003cstring>","phone":"\u003cstring>","notes":"\u003cstring>"}],"addresses":[{"id":"\u003cstring>","customerId":"\u003cstring>","kind":"Billing","country":"\u003cstring>","isDefault":true,"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","fullAddress":"\u003cstring>","line1":"\u003cstring>","line2":"\u003cstring>","suburb":"\u003cstring>","state":"\u003cstring>","postcode":"\u003cstring>"}],"name":"\u003cstring>","businessName":"\u003cstring>","firstName":"\u003cstring>","lastName":"\u003cstring>","email":"\u003cstring>","phone":"\u003cstring>","abn":"\u003cstring>","tier":"\u003cstring>","notes":"\u003cstring>","portalToken":"\u003cstring>","defaultBillingAddressId":"\u003cstring>","defaultShippingAddressId":"\u003cstring>","primaryContactId":"\u003cstring>","archivedAt":"2023-11-07T05:31:56Z"},"mocks":[{"id":"\u003cstring>","status":"\u003cstring>","version":123,"layers":"\u003cunknown>","createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","jobId":"\u003cstring>","quoteId":"\u003cstring>","quoteGroupId":"\u003cstring>","quoteLineId":"\u003cstring>","name":"\u003cstring>","garmentAssetId":"\u003cstring>","baseImageUrl":"\u003cstring>","parentMockId":"\u003cstring>","approvedAt":"2023-11-07T05:31:56Z","approvedByName":"\u003cstring>","approvedByEmail":"\u003cstring>","rejectionReason":"\u003cstring>","previewUrl":"\u003cstring>"}],"invoices":[{"id":"\u003cstring>","quoteId":"\u003cstring>","invoiceRef":"\u003cstring>","currency":"\u003cstring>","subtotalCents":123,"gstCents":123,"amountCents":123,"status":"\u003cstring>","lineItemsSnapshot":"\u003cunknown>","createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z","clientId":"\u003cstring>","contactId":"\u003cstring>","dueDate":"2023-12-25","notes":"\u003cstring>","pinchPaymentLinkUrl":"\u003cstring>","pinchPaymentId":"\u003cstring>","xeroInvoiceId":"\u003cstring>","qboSalesReceiptId":"\u003cstring>","xeroPaymentId":"\u003cstring>","xeroInvoiceUrl":"\u003cstring>","qboInvoiceId":"\u003cstring>","qboPaymentId":"\u003cstring>","qboInvoiceUrl":"\u003cstring>","paidMethod":"\u003cstring>","paidReference":"\u003cstring>","paidAt":"2023-11-07T05:31:56Z","sentAt":"2023-11-07T05:31:56Z","pinchRefundId":"\u003cstring>","refundedAmountCents":123,"refundReason":"\u003cstring>","refundedAt":"2023-11-07T05:31:56Z","voidReason":"\u003cstring>","voidedAt":"2023-11-07T05:31:56Z","paymentClaimedAt":"2023-11-07T05:31:56Z","paymentClaimedMethod":"\u003cstring>","paymentClaimedReference":"\u003cstring>","paymentClaimedNote":"\u003cstring>"}]}}}},"exampleType":"generated"}},"exampleType":"generated"},"9e4480a3-fbb6-431d-a69e-65f6b05817d3":{"description":"Validation or request-shape error. Correct the request before retrying.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"status":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"status","typeLabel":"boolean"}},"description":"Every non-2xx response uses this envelope.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","status":false}}},"exampleType":"generated"}},"exampleType":"generated"},"496f3674-240a-4bc8-b940-c8a815b824b1":{"description":"Credential authentication failed.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"status":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"status","typeLabel":"boolean"}},"description":"Every non-2xx response uses this envelope.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","status":false}}},"exampleType":"generated"}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"ApiKey"}}},"exampleType":"generated"},"77ecae87-4ecc-4e7b-96ee-6904e3f4b5ff":{"description":"The credential lacks a required scope, or its actor lacks permission.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"status":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"status","typeLabel":"boolean"}},"description":"Every non-2xx response uses this envelope.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","status":false}}},"exampleType":"generated"}},"exampleType":"generated"},"18f922f5-0288-414a-ae4a-196cfe072f4d":{"description":"The resource or endpoint was not found.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"status":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"status","typeLabel":"boolean"}},"description":"Every non-2xx response uses this envelope.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","status":false}}},"exampleType":"generated"}},"exampleType":"generated"},"f095ee79-2ce6-4b34-bf50-7a5c38efdbaf":{"description":"Conflict, including idempotency-key reuse or an in-flight idempotent request.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"status":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"status","typeLabel":"boolean"}},"description":"Every non-2xx response uses this envelope.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","status":false}}},"exampleType":"generated"}},"exampleType":"generated"},"43a9964d-49bf-4714-ad3f-0f96587fa2e3":{"description":"The JSON request body exceeds the published size limit.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"status":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"status","typeLabel":"boolean"}},"description":"Every non-2xx response uses this envelope.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","status":false}}},"exampleType":"generated"}},"exampleType":"generated"},"a59b1470-8179-4d1e-a3df-91c156598c51":{"description":"Rate limited. Retry after the returned delay.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"status":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"status","typeLabel":"boolean"}},"description":"Every non-2xx response uses this envelope.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","status":false}}},"exampleType":"generated"}},"headers":{"Retry-After":{"description":"Whole seconds to wait.","schema":{"type":"integer","minimum":0}}},"exampleType":"generated"},"fd2ea7b6-c898-4a35-b34d-9b0ba4d294af":{"description":"An unexpected server error. A retry can be appropriate.","content":{"application/json":{"schema":{"type":"object","required":["error","message","status"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"status":{"type":"boolean","const":false,"isRequired":true,"uniqueKey":"status","typeLabel":"boolean"}},"description":"Every non-2xx response uses this envelope.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","message":"\u003cstring>","status":false}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"1e43d338-9ba5-4ebe-b49b-f0514fbe04d8":{"tenantApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Tenant credential. This is sufficient by itself.","scopes":[]}},"dac195bb-b586-4cf2-939f-5ab9a2c1f242":{"partnerApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner application client ID.","scopes":[]},"partnerApiSecret":{"type":"apiKey","in":"header","name":"X-API-Secret","description":"Partner application secret.","scopes":[]},"partnerBearer":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Cognito access token obtained through OAuth.","scopes":[]}}},"servers":{"beaaf7be-9258-41cf-929a-55d51e0689b1":{"url":"https://api.printools.io","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Tenant credential. This is sufficient by itself.","scopes":[]},"schema":{"title":"X-API-Key","type":"string","description":"Tenant credential. This is sufficient by itself.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"tenantApiKey","name":"X-API-Key"}],"title":"tenantApiKey"},{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner application client ID.","scopes":[]},"schema":{"title":"X-API-Key","type":"string","description":"Partner application client ID.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"partnerApiKey","name":"X-API-Key"},{"scheme":{"type":"apiKey","in":"header","name":"X-API-Secret","description":"Partner application secret.","scopes":[]},"schema":{"title":"X-API-Secret","type":"string","description":"Partner application secret.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"partnerApiSecret","name":"X-API-Secret"},{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Cognito access token obtained through OAuth.","scopes":[]},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Cognito access token obtained through OAuth.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"partnerBearer","name":"Authorization"}],"title":"partnerApiKey \u0026 partnerApiSecret \u0026 partnerBearer"}]},"originalFileLocation":"https://d1zl72794e73i2.cloudfront.net/releases/2026-09-08.api-blackbox/openapi.json"},"subdomain":"printools-docs","siteName":"PRINTOOLS Docs","title":"One quote and everything hanging off it, in one call - PRINTOOLS Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-08T12:10:22.424Z","originalFileLocation":"api/reference/get_v1_quotes_quoteId_data.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.\">\u003cmeta data-mint-head name=\"application-name\" content=\"PRINTOOLS Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"One quote and everything hanging off it, in one call - PRINTOOLS Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"PRINTOOLS Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://printools-docs.mintlify.app/_mintlify/api/og/v2?division=Quotes\u0026amp;title=One+quote+and+everything+hanging+off+it%2C+in+one+call\u0026amp;description=Requires+ALL+of+the+scopes+quotes.read%2C+customers.read%2C+garments.read%2C+decorations.read.\u0026amp;theme=1264f79c0fa4bc489a663c38\u0026amp;signature=7c290cf8d04be887391d22d2c4bf34ae0250d252fa5dcc1ab4e137ae335a71d7\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"One quote and everything hanging off it, in one call - PRINTOOLS Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://printools-docs.mintlify.app/_mintlify/api/og/v2?division=Quotes\u0026amp;title=One+quote+and+everything+hanging+off+it%2C+in+one+call\u0026amp;description=Requires+ALL+of+the+scopes+quotes.read%2C+customers.read%2C+garments.read%2C+decorations.read.\u0026amp;theme=1264f79c0fa4bc489a663c38\u0026amp;signature=7c290cf8d04be887391d22d2c4bf34ae0250d252fa5dcc1ab4e137ae335a71d7\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/printools-docs/qiRPxJTgwUI6WMAG/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"PRINTOOLS Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#252220\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/reference/get_v1_quotes_quoteId_data.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.printools.io/#organization\",\"name\":\"PRINTOOLS Docs\",\"url\":\"https://docs.printools.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/printools-docs/O0KTj_rIOTsZeahM/images/Group2.png?fit=max\u0026auto=format\u0026n=O0KTj_rIOTsZeahM\u0026q=85\u0026s=c13cad1946e83c89b0c37822757efb9b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.printools.io#website\",\"name\":\"PRINTOOLS Docs\",\"url\":\"https://docs.printools.io\",\"publisher\":{\"@id\":\"https://docs.printools.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data#webpage\",\"url\":\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data\",\"name\":\"One quote and everything hanging off it, in one call\",\"description\":\"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.\",\"dateModified\":\"2026-09-08T12:10:22.424Z\",\"isPartOf\":{\"@id\":\"https://docs.printools.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.printools.io/api/endpoints/account-and-reference\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quotes\",\"item\":\"https://docs.printools.io/api/endpoints/quotes\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"One quote and everything hanging off it, in one call\",\"item\":\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data#apireference\",\"headline\":\"One quote and everything hanging off it, in one call\",\"name\":\"One quote and everything hanging off it, in one call\",\"description\":\"Requires ALL of the scopes quotes.read, customers.read, garments.read, decorations.read.\",\"url\":\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data\",\"mainEntityOfPage\":{\"@id\":\"https://docs.printools.io/api/reference/get_v1_quotes_quoteId_data#webpage\"},\"dateModified\":\"2026-09-08T12:10:22.424Z\",\"publisher\":{\"@id\":\"https://docs.printools.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.printools.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"PRINTOOLS Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"PRINTOOLS Docs","nav":{"global":null,"tabs":[{"tab":"Guides","icon":"magic-wand-sparkles","pages":[{"title":"Guides","href":""}]},{"tab":"Public API","icon":"code","groups":[{"group":"Getting started","icon":"compass","pages":[{"title":"Introduction","icon":"code","href":"/api/introduction"},{"title":"Authentication","icon":"lock","href":"/api/authentication"},{"title":"Scopes","icon":"shield-check","href":"/api/scopes"},{"title":"Responses and errors","icon":"reply","href":"/api/responses"},{"title":"Rate limits","icon":"gauge-high","href":"/api/rate-limits"},{"title":"Pagination","icon":"list-ol","href":"/api/pagination"},{"title":"Writing safely","icon":"fingerprint","href":"/api/idempotency"}]},{"group":"Endpoints","icon":"plug","pages":[{"group":"Account \u0026 reference","pages":[{"title":"Account and reference","icon":"id-card","href":"/api/endpoints/account-and-reference"},{"title":"Get current account","openapi":"GET /v1/me","href":"/api/reference/get_v1_me"},{"title":"The lookup bundle every write endpoint depends on","openapi":"GET /v1/reference/types","href":"/api/reference/get_v1_reference_types"},{"title":"Built-in status vocabularies, including which purchase-order statuses are derived and therefore not settable","openapi":"GET /v1/reference/statuses","href":"/api/reference/get_v1_reference_statuses"},{"title":"Decoration methods, positions and their vocabularies","openapi":"GET /v1/reference/decorations","href":"/api/reference/get_v1_reference_decorations"},{"title":"The scope catalogue, served from its single source","openapi":"GET /v1/reference/scopes","href":"/api/reference/get_v1_reference_scopes"},{"title":"The webhook event catalogue","openapi":"GET /v1/reference/events","href":"/api/reference/get_v1_reference_events"},{"title":"Rate limits, batch ceilings and page size, from the one limits module","openapi":"GET /v1/reference/limits","href":"/api/reference/get_v1_reference_limits"}]},{"group":"Quotes","pages":[{"title":"Quotes","icon":"file-invoice-dollar","href":"/api/endpoints/quotes"},{"title":"List quotes","openapi":"GET /v1/quotes","href":"/api/reference/get_v1_quotes"},{"title":"Create a quote","openapi":"POST /v1/quotes","href":"/api/reference/post_v1_quotes"},{"title":"Filter facets for the quote list","openapi":"GET /v1/quotes/facets","href":"/api/reference/get_v1_quotes_facets"},{"title":"One quote with its groups, lines and decorations","openapi":"GET /v1/quotes/{quoteId}","href":"/api/reference/get_v1_quotes_quoteId"},{"title":"Update a quote","openapi":"PATCH /v1/quotes/{quoteId}","href":"/api/reference/patch_v1_quotes_quoteId"},{"title":"Email a quote to the customer","openapi":"POST /v1/quotes/{quoteId}/send","href":"/api/reference/post_v1_quotes_quoteId_send"},{"title":"Convert a quote into a job","openapi":"POST /v1/quotes/{quoteId}/convert-to-job","href":"/api/reference/post_v1_quotes_quoteId_convert_to_job"},{"title":"Add a group to a quote","openapi":"POST /v1/quotes/{quoteId}/groups","href":"/api/reference/post_v1_quotes_quoteId_groups"},{"title":"Update a quote group","openapi":"PATCH /v1/quote-groups/{groupId}","href":"/api/reference/patch_v1_quote_groups_groupId"},{"title":"Delete a quote group","openapi":"DELETE /v1/quote-groups/{groupId}","href":"/api/reference/delete_v1_quote_groups_groupId"},{"title":"Add a line to a quote group","openapi":"POST /v1/quote-groups/{groupId}/lines","href":"/api/reference/post_v1_quote_groups_groupId_lines"},{"title":"Update a quote line","openapi":"PATCH /v1/quote-lines/{lineId}","href":"/api/reference/patch_v1_quote_lines_lineId"},{"title":"Delete a quote line","openapi":"DELETE /v1/quote-lines/{lineId}","href":"/api/reference/delete_v1_quote_lines_lineId"},{"title":"Attach a decoration to a quote group","openapi":"POST /v1/quote-groups/{groupId}/decorations","href":"/api/reference/post_v1_quote_groups_groupId_decorations"},{"title":"Delete every quote matching a target","openapi":"POST /v1/quotes/bulk/delete","href":"/api/reference/post_v1_quotes_bulk_delete"},{"title":"Duplicate every quote matching a target","openapi":"POST /v1/quotes/bulk/duplicate","href":"/api/reference/post_v1_quotes_bulk_duplicate"},{"title":"Set the status of every quote matching a target","openapi":"POST /v1/quotes/bulk/status","href":"/api/reference/post_v1_quotes_bulk_status"},{"title":"Convert every quote matching a target into a job","openapi":"POST /v1/quotes/bulk/convert-to-jobs","href":"/api/reference/post_v1_quotes_bulk_convert_to_jobs"},{"title":"A presigned link to the quote PDF. Expires in 900 seconds","openapi":"GET /v1/quotes/{quoteId}/pdf","href":"/api/reference/get_v1_quotes_quoteId_pdf"},{"title":"Every invoice raised against a quote","openapi":"GET /v1/quotes/{quoteId}/invoices","href":"/api/reference/get_v1_quotes_quoteId_invoices"},{"title":"Generate an invoice from a quote","openapi":"POST /v1/quotes/{quoteId}/invoice","description":"Requires ALL of the scopes invoices.write, quotes.read.","href":"/api/reference/post_v1_quotes_quoteId_invoice"},{"title":"One quote and everything hanging off it, in one call","openapi":"GET /v1/quotes/{quoteId}/data","href":"/api/reference/get_v1_quotes_quoteId_data"},{"title":"Delete a quote","openapi":"DELETE /v1/quotes/{quoteId}","description":"Requires the scope quotes.write.","href":"/api/reference/delete_v1_quotes_quoteId"},{"title":"Duplicate a quote","openapi":"POST /v1/quotes/{quoteId}/duplicate","href":"/api/reference/post_v1_quotes_quoteId_duplicate"},{"title":"Update a quote-group decoration","openapi":"PATCH /v1/quote-group-decorations/{decorationId}","href":"/api/reference/patch_v1_quote_group_decorations_decorationId"},{"title":"Remove a decoration from a quote group","openapi":"DELETE /v1/quote-group-decorations/{decorationId}","href":"/api/reference/delete_v1_quote_group_decorations_decorationId"}]},{"group":"Jobs","pages":[{"title":"Jobs","icon":"conveyor-belt","href":"/api/endpoints/jobs"},{"title":"List jobs, newest first","openapi":"GET /v1/jobs","href":"/api/reference/get_v1_jobs"},{"title":"Create a job","openapi":"POST /v1/jobs","href":"/api/reference/post_v1_jobs"},{"title":"Filter facets for the job list","openapi":"GET /v1/jobs/facets","href":"/api/reference/get_v1_jobs_facets"},{"title":"One job with its groups, lines and decorations","openapi":"GET /v1/jobs/{jobId}","href":"/api/reference/get_v1_jobs_jobId"},{"title":"Update a job","openapi":"PATCH /v1/jobs/{jobId}","href":"/api/reference/patch_v1_jobs_jobId"},{"title":"Delete a job","openapi":"DELETE /v1/jobs/{jobId}","href":"/api/reference/delete_v1_jobs_jobId"},{"title":"The job activity feed. Names the staff who acted","openapi":"GET /v1/jobs/{jobId}/activity","href":"/api/reference/get_v1_jobs_jobId_activity"},{"title":"Duplicate a job","openapi":"POST /v1/jobs/{jobId}/duplicate","href":"/api/reference/post_v1_jobs_jobId_duplicate"},{"title":"Re-sync a job from the quote it came from","openapi":"POST /v1/jobs/{jobId}/sync-from-quote","href":"/api/reference/post_v1_jobs_jobId_sync_from_quote"},{"title":"Add a group to a job","openapi":"POST /v1/jobs/{jobId}/groups","href":"/api/reference/post_v1_jobs_jobId_groups"},{"title":"Update a job group","openapi":"PATCH /v1/job-groups/{groupId}","href":"/api/reference/patch_v1_job_groups_groupId"},{"title":"Delete a job group","openapi":"DELETE /v1/job-groups/{groupId}","href":"/api/reference/delete_v1_job_groups_groupId"},{"title":"Add a line to a job group","openapi":"POST /v1/job-groups/{groupId}/lines","href":"/api/reference/post_v1_job_groups_groupId_lines"},{"title":"Update a job line","openapi":"PATCH /v1/job-lines/{lineId}","href":"/api/reference/patch_v1_job_lines_lineId"},{"title":"Delete a job line","openapi":"DELETE /v1/job-lines/{lineId}","href":"/api/reference/delete_v1_job_lines_lineId"},{"title":"Attach a decoration to a job group","openapi":"POST /v1/job-groups/{groupId}/decorations","href":"/api/reference/post_v1_job_groups_groupId_decorations"},{"title":"Update a job-group decoration","openapi":"PATCH /v1/job-group-decorations/{decorationId}","href":"/api/reference/patch_v1_job_group_decorations_decorationId"},{"title":"Remove a decoration from a job group","openapi":"DELETE /v1/job-group-decorations/{decorationId}","href":"/api/reference/delete_v1_job_group_decorations_decorationId"},{"title":"Patch every job matching a target","openapi":"POST /v1/jobs/bulk/update","href":"/api/reference/post_v1_jobs_bulk_update"},{"title":"Delete every job matching a target","openapi":"POST /v1/jobs/bulk/delete","href":"/api/reference/post_v1_jobs_bulk_delete"},{"title":"Duplicate every job matching a target","openapi":"POST /v1/jobs/bulk/duplicate","href":"/api/reference/post_v1_jobs_bulk_duplicate"},{"title":"Every purchase order raised for a job","openapi":"GET /v1/jobs/{jobId}/purchase-orders","href":"/api/reference/get_v1_jobs_jobId_purchase_orders"},{"title":"Raise purchase orders for a job, one per vendor","openapi":"POST /v1/jobs/{jobId}/purchase-orders","href":"/api/reference/post_v1_jobs_jobId_purchase_orders"},{"title":"Every proof on a job","openapi":"GET /v1/jobs/{jobId}/proofs","href":"/api/reference/get_v1_jobs_jobId_proofs"},{"title":"Every production task on a job","openapi":"GET /v1/jobs/{jobId}/tasks","href":"/api/reference/get_v1_jobs_jobId_tasks"},{"title":"One job and everything hanging off it, in one call","openapi":"GET /v1/jobs/{jobId}/data","href":"/api/reference/get_v1_jobs_jobId_data"}]},{"group":"Customers","pages":[{"title":"Customers","icon":"users","href":"/api/endpoints/customers"},{"title":"List customers","openapi":"GET /v1/customers","href":"/api/reference/get_v1_customers"},{"title":"Create a customer","openapi":"POST /v1/customers","href":"/api/reference/post_v1_customers"},{"title":"One customer with contacts and addresses","openapi":"GET /v1/customers/{customerId}","href":"/api/reference/get_v1_customers_customerId"},{"title":"Update a customer","openapi":"PATCH /v1/customers/{customerId}","href":"/api/reference/patch_v1_customers_customerId"},{"title":"Archive a customer","openapi":"POST /v1/customers/{customerId}/archive","href":"/api/reference/post_v1_customers_customerId_archive"},{"title":"Restore an archived customer","openapi":"POST /v1/customers/{customerId}/unarchive","href":"/api/reference/post_v1_customers_customerId_unarchive"},{"title":"Add a contact to a customer","openapi":"POST /v1/customers/{customerId}/contacts","href":"/api/reference/post_v1_customers_customerId_contacts"},{"title":"Update a contact","openapi":"PATCH /v1/contacts/{contactId}","href":"/api/reference/patch_v1_contacts_contactId"},{"title":"Delete a contact","openapi":"DELETE /v1/contacts/{contactId}","href":"/api/reference/delete_v1_contacts_contactId"},{"title":"Add an address to a customer","openapi":"POST /v1/customers/{customerId}/addresses","href":"/api/reference/post_v1_customers_customerId_addresses"},{"title":"Update an address","openapi":"PATCH /v1/addresses/{addressId}","href":"/api/reference/patch_v1_addresses_addressId"},{"title":"Delete an address","openapi":"DELETE /v1/addresses/{addressId}","href":"/api/reference/delete_v1_addresses_addressId"},{"title":"Create many customers in one call","openapi":"POST /v1/customers/bulk/create","href":"/api/reference/post_v1_customers_bulk_create"},{"title":"Archive or restore every customer matching a target","openapi":"POST /v1/customers/bulk/archive","href":"/api/reference/post_v1_customers_bulk_archive"},{"title":"Set the tier of every customer matching a target","openapi":"POST /v1/customers/bulk/tier","href":"/api/reference/post_v1_customers_bulk_tier"},{"title":"One customer with their quotes and jobs, in one call","openapi":"GET /v1/customers/{customerId}/data","href":"/api/reference/get_v1_customers_customerId_data"}]},{"group":"Garments \u0026 catalogue","pages":[{"title":"Garments and catalogue","icon":"shirt","href":"/api/endpoints/garments"},{"title":"List garments, the shop's own items and the supplier catalogue","openapi":"GET /v1/garments","href":"/api/reference/get_v1_garments"},{"title":"Create a garment","openapi":"POST /v1/garments","href":"/api/reference/post_v1_garments"},{"title":"Filter facets for the garment list","openapi":"GET /v1/garments/facets","href":"/api/reference/get_v1_garments_facets"},{"title":"Garment assets","openapi":"GET /v1/garments/assets","href":"/api/reference/get_v1_garments_assets"},{"title":"One garment","openapi":"GET /v1/garments/{garmentId}","href":"/api/reference/get_v1_garments_garmentId"},{"title":"Update a garment","openapi":"PATCH /v1/garments/{garmentId}","href":"/api/reference/patch_v1_garments_garmentId"},{"title":"Delete a garment","openapi":"DELETE /v1/garments/{garmentId}","href":"/api/reference/delete_v1_garments_garmentId"},{"title":"Every variant of one style code","openapi":"GET /v1/garment-variants/{styleCode}","href":"/api/reference/get_v1_garment_variants_styleCode"},{"title":"Create a garment variant","openapi":"POST /v1/garment-variants","href":"/api/reference/post_v1_garment_variants"},{"title":"Update a garment variant","openapi":"PATCH /v1/garment-variants/id/{variantId}","href":"/api/reference/patch_v1_garment_variants_id_variantId"},{"title":"Delete a garment variant","openapi":"DELETE /v1/garment-variants/id/{variantId}","href":"/api/reference/delete_v1_garment_variants_id_variantId"},{"title":"Create a garment asset","openapi":"POST /v1/garment-assets","href":"/api/reference/post_v1_garment_assets"},{"title":"Update a garment asset","openapi":"PATCH /v1/garment-assets/{assetId}","href":"/api/reference/patch_v1_garment_assets_assetId"},{"title":"Delete a garment asset","openapi":"DELETE /v1/garment-assets/{assetId}","href":"/api/reference/delete_v1_garment_assets_assetId"},{"title":"Create many garments in one call","openapi":"POST /v1/garments/bulk/create","href":"/api/reference/post_v1_garments_bulk_create"},{"title":"Upsert a catalogue of garments in one set-based call","openapi":"POST /v1/garments/bulk/upsert","href":"/api/reference/post_v1_garments_bulk_upsert"},{"title":"Patch every garment matching a target","openapi":"POST /v1/garments/bulk/update","href":"/api/reference/post_v1_garments_bulk_update"},{"title":"Delete every garment matching a target","openapi":"POST /v1/garments/bulk/delete","href":"/api/reference/post_v1_garments_bulk_delete"},{"title":"Create many garment variants in one call","openapi":"POST /v1/garment-variants/bulk/create","href":"/api/reference/post_v1_garment_variants_bulk_create"},{"title":"Upsert garment variants in one set-based call","openapi":"POST /v1/garment-variants/bulk/upsert","href":"/api/reference/post_v1_garment_variants_bulk_upsert"},{"title":"Set status and stock across an import batch","openapi":"POST /v1/garments/bulk/status-and-stock","href":"/api/reference/post_v1_garments_bulk_status_and_stock"},{"title":"The shop's whole catalogue in one call: their own items and the supplier catalogue, variants inline. Cursor-paged; ?source=manual|ascolour","openapi":"GET /v1/catalogue","href":"/api/reference/get_v1_catalogue"}]},{"group":"Decorations","pages":[{"title":"Decorations","icon":"palette","href":"/api/endpoints/decorations"},{"title":"List decorations","openapi":"GET /v1/decorations","href":"/api/reference/get_v1_decorations"},{"title":"Create a decoration","openapi":"POST /v1/decorations","href":"/api/reference/post_v1_decorations"},{"title":"Filter facets for the decoration list","openapi":"GET /v1/decorations/facets","href":"/api/reference/get_v1_decorations_facets"},{"title":"One decoration","openapi":"GET /v1/decorations/{decorationId}","href":"/api/reference/get_v1_decorations_decorationId"},{"title":"Update a decoration","openapi":"PATCH /v1/decorations/{decorationId}","href":"/api/reference/patch_v1_decorations_decorationId"},{"title":"Delete a decoration","openapi":"DELETE /v1/decorations/{decorationId}","href":"/api/reference/delete_v1_decorations_decorationId"},{"title":"Create many decorations in one call","openapi":"POST /v1/decorations/bulk/create","href":"/api/reference/post_v1_decorations_bulk_create"},{"title":"Patch every decoration matching a target","openapi":"POST /v1/decorations/bulk/update","href":"/api/reference/post_v1_decorations_bulk_update"},{"title":"Delete every decoration matching a target","openapi":"POST /v1/decorations/bulk/delete","href":"/api/reference/post_v1_decorations_bulk_delete"}]},{"group":"Pre-built items","pages":[{"title":"Pre-built items","icon":"box-archive","href":"/api/endpoints/prebuilt-items"},{"title":"List pre-built items","openapi":"GET /v1/prebuilt-items","href":"/api/reference/get_v1_prebuilt_items"},{"title":"Create a pre-built item (server-assigned id)","openapi":"POST /v1/prebuilt-items","href":"/api/reference/post_v1_prebuilt_items"},{"title":"One pre-built item","openapi":"GET /v1/prebuilt-items/{itemId}","href":"/api/reference/get_v1_prebuilt_items_itemId"},{"title":"Create or replace a pre-built item","openapi":"PUT /v1/prebuilt-items/{itemId}","href":"/api/reference/put_v1_prebuilt_items_itemId"},{"title":"Delete a pre-built item","openapi":"DELETE /v1/prebuilt-items/{itemId}","href":"/api/reference/delete_v1_prebuilt_items_itemId"},{"title":"Delete every pre-built item matching a target","openapi":"POST /v1/prebuilt-items/bulk/delete","href":"/api/reference/post_v1_prebuilt_items_bulk_delete"},{"title":"Set the status of every pre-built item matching a target","openapi":"POST /v1/prebuilt-items/bulk/status","href":"/api/reference/post_v1_prebuilt_items_bulk_status"}]},{"group":"Purchase orders","pages":[{"title":"Purchase orders","icon":"truck","href":"/api/endpoints/purchase-orders"},{"title":"List purchase orders","openapi":"GET /v1/purchase-orders","href":"/api/reference/get_v1_purchase_orders"},{"title":"Create a purchase order","openapi":"POST /v1/purchase-orders","href":"/api/reference/post_v1_purchase_orders"},{"title":"One purchase order with its lines","openapi":"GET /v1/purchase-orders/{purchaseOrderId}","href":"/api/reference/get_v1_purchase_orders_purchaseOrderId"},{"title":"Update a purchase order","openapi":"PATCH /v1/purchase-orders/{purchaseOrderId}","href":"/api/reference/patch_v1_purchase_orders_purchaseOrderId"},{"title":"Archive a purchase order","openapi":"POST /v1/purchase-orders/{purchaseOrderId}/archive","href":"/api/reference/post_v1_purchase_orders_purchaseOrderId_archive"},{"title":"Restore an archived purchase order","openapi":"POST /v1/purchase-orders/{purchaseOrderId}/unarchive","href":"/api/reference/post_v1_purchase_orders_purchaseOrderId_unarchive"},{"title":"Add a line to a purchase order","openapi":"POST /v1/purchase-orders/{purchaseOrderId}/lines","href":"/api/reference/post_v1_purchase_orders_purchaseOrderId_lines"},{"title":"Update a purchase-order line","openapi":"PATCH /v1/purchase-order-lines/{lineId}","href":"/api/reference/patch_v1_purchase_order_lines_lineId"},{"title":"Delete a purchase-order line","openapi":"DELETE /v1/purchase-order-lines/{lineId}","href":"/api/reference/delete_v1_purchase_order_lines_lineId"},{"title":"Record a receipt against a purchase-order line","openapi":"POST /v1/purchase-order-lines/{lineId}/receive","href":"/api/reference/post_v1_purchase_order_lines_lineId_receive"},{"title":"Attach a vendor to a purchase order","openapi":"POST /v1/purchase-orders/{purchaseOrderId}/vendors/{vendorId}","href":"/api/reference/post_v1_purchase_orders_purchaseOrderId_vendors_vendorId"},{"title":"Detach a vendor from a purchase order","openapi":"DELETE /v1/purchase-orders/{purchaseOrderId}/vendors/{vendorId}","href":"/api/reference/delete_v1_purchase_orders_purchaseOrderId_vendors_vendorId"},{"title":"Receive every purchase-order line matching a target","openapi":"POST /v1/purchase-orders/bulk/receive","href":"/api/reference/post_v1_purchase_orders_bulk_receive"},{"title":"Set the status of every purchase order matching a target. Derived statuses are refused, see GET /v1/reference/statuses","openapi":"POST /v1/purchase-orders/bulk/status","href":"/api/reference/post_v1_purchase_orders_bulk_status"},{"title":"Archive or restore every purchase order matching a target","openapi":"POST /v1/purchase-orders/bulk/archive","href":"/api/reference/post_v1_purchase_orders_bulk_archive"}]},{"group":"Vendors","pages":[{"title":"Vendors","icon":"building","href":"/api/endpoints/vendors"},{"title":"Every purchase order raised on a vendor","openapi":"GET /v1/vendors/{vendorId}/purchase-orders","href":"/api/reference/get_v1_vendors_vendorId_purchase_orders"},{"title":"List vendors","openapi":"GET /v1/vendors","href":"/api/reference/get_v1_vendors"},{"title":"Create a vendor","openapi":"POST /v1/vendors","href":"/api/reference/post_v1_vendors"},{"title":"One vendor with addresses and contacts","openapi":"GET /v1/vendors/{vendorId}","href":"/api/reference/get_v1_vendors_vendorId"},{"title":"Update a vendor","openapi":"PATCH /v1/vendors/{vendorId}","href":"/api/reference/patch_v1_vendors_vendorId"},{"title":"Archive a vendor","openapi":"POST /v1/vendors/{vendorId}/archive","href":"/api/reference/post_v1_vendors_vendorId_archive"},{"title":"Restore an archived vendor","openapi":"POST /v1/vendors/{vendorId}/unarchive","href":"/api/reference/post_v1_vendors_vendorId_unarchive"},{"title":"Add an address to a vendor","openapi":"POST /v1/vendors/{vendorId}/addresses","href":"/api/reference/post_v1_vendors_vendorId_addresses"},{"title":"Update a vendor address","openapi":"PATCH /v1/vendor-addresses/{addressId}","href":"/api/reference/patch_v1_vendor_addresses_addressId"},{"title":"Delete a vendor address","openapi":"DELETE /v1/vendor-addresses/{addressId}","href":"/api/reference/delete_v1_vendor_addresses_addressId"},{"title":"Add a contact to a vendor","openapi":"POST /v1/vendors/{vendorId}/contacts","href":"/api/reference/post_v1_vendors_vendorId_contacts"},{"title":"Update a vendor contact","openapi":"PATCH /v1/vendor-contacts/{contactId}","href":"/api/reference/patch_v1_vendor_contacts_contactId"},{"title":"Delete a vendor contact","openapi":"DELETE /v1/vendor-contacts/{contactId}","href":"/api/reference/delete_v1_vendor_contacts_contactId"},{"title":"Activate or deactivate every vendor matching a target","openapi":"POST /v1/vendors/bulk/active","href":"/api/reference/post_v1_vendors_bulk_active"}]},{"group":"Proofs \u0026 mocks","pages":[{"title":"Proofs and mocks","icon":"stamp","href":"/api/endpoints/proofs"},{"title":"List mocks, filtered by job, quote or quote group. Not paginated","openapi":"GET /v1/mocks","href":"/api/reference/get_v1_mocks"},{"title":"Create a mock","openapi":"POST /v1/mocks","href":"/api/reference/post_v1_mocks"},{"title":"One mock by id","openapi":"GET /v1/mocks/{mockId}","href":"/api/reference/get_v1_mocks_mockId"},{"title":"Update a mock","openapi":"PATCH /v1/mocks/{mockId}","href":"/api/reference/patch_v1_mocks_mockId"},{"title":"Delete a mock","openapi":"DELETE /v1/mocks/{mockId}","href":"/api/reference/delete_v1_mocks_mockId"},{"title":"One proof with its full revision history","openapi":"GET /v1/proofs/{proofId}/history","href":"/api/reference/get_v1_proofs_proofId_history"},{"title":"Create a proof","openapi":"POST /v1/proofs","href":"/api/reference/post_v1_proofs"},{"title":"Update a proof","openapi":"PATCH /v1/proofs/{proofId}","href":"/api/reference/patch_v1_proofs_proofId"},{"title":"Delete a proof","openapi":"DELETE /v1/proofs/{proofId}","href":"/api/reference/delete_v1_proofs_proofId"},{"title":"Email a proof to the customer","openapi":"POST /v1/proofs/{proofId}/send","href":"/api/reference/post_v1_proofs_proofId_send"},{"title":"Email several proofs in one message","openapi":"POST /v1/proofs/send","href":"/api/reference/post_v1_proofs_send"},{"title":"Open a new revision of a proof","openapi":"POST /v1/proofs/{proofId}/revise","href":"/api/reference/post_v1_proofs_proofId_revise"},{"title":"Set a proof status directly, including approved","openapi":"POST /v1/proofs/{proofId}/status","href":"/api/reference/post_v1_proofs_proofId_status"},{"title":"Record the client’s decision on a proof","openapi":"POST /v1/proofs/{proofId}/client-decision","href":"/api/reference/post_v1_proofs_proofId_client_decision"},{"title":"Confirm the size split on a proof item","openapi":"POST /v1/proof-item-links/{proofItemLinkId}/size-split","href":"/api/reference/post_v1_proof_item_links_proofItemLinkId_size_split"}]},{"group":"Tasks","pages":[{"title":"Tasks","icon":"list-check","href":"/api/endpoints/tasks"},{"title":"Production tasks assigned to one person","openapi":"GET /v1/tasks/by-assignee","href":"/api/reference/get_v1_tasks_by_assignee"},{"title":"A task’s comments, checklist and attachments","openapi":"GET /v1/tasks/{taskId}/extras","href":"/api/reference/get_v1_tasks_taskId_extras"},{"title":"Create a production task","openapi":"POST /v1/tasks","href":"/api/reference/post_v1_tasks"},{"title":"Update a production task","openapi":"PATCH /v1/tasks/{taskId}","href":"/api/reference/patch_v1_tasks_taskId"},{"title":"Delete a production task","openapi":"DELETE /v1/tasks/{taskId}","href":"/api/reference/delete_v1_tasks_taskId"},{"title":"Patch every production task matching a target","openapi":"POST /v1/tasks/bulk/update","href":"/api/reference/post_v1_tasks_bulk_update"},{"title":"Delete every production task matching a target","openapi":"POST /v1/tasks/bulk/delete","href":"/api/reference/post_v1_tasks_bulk_delete"},{"title":"Comment on a production task","openapi":"POST /v1/tasks/{taskId}/comments","href":"/api/reference/post_v1_tasks_taskId_comments"},{"title":"Edit a task comment","openapi":"PATCH /v1/task-comments/{commentId}","href":"/api/reference/patch_v1_task_comments_commentId"},{"title":"Delete a task comment","openapi":"DELETE /v1/task-comments/{commentId}","href":"/api/reference/delete_v1_task_comments_commentId"},{"title":"Add a checklist item to a task","openapi":"POST /v1/tasks/{taskId}/checklist","href":"/api/reference/post_v1_tasks_taskId_checklist"},{"title":"Update a checklist item","openapi":"PATCH /v1/task-checklist-items/{itemId}","href":"/api/reference/patch_v1_task_checklist_items_itemId"},{"title":"Delete a checklist item","openapi":"DELETE /v1/task-checklist-items/{itemId}","href":"/api/reference/delete_v1_task_checklist_items_itemId"},{"title":"Attach a file to a task","openapi":"POST /v1/tasks/{taskId}/attachments","href":"/api/reference/post_v1_tasks_taskId_attachments"},{"title":"Remove a task attachment","openapi":"DELETE /v1/task-attachments/{attachmentId}","href":"/api/reference/delete_v1_task_attachments_attachmentId"}]},{"group":"Invoices","pages":[{"title":"Invoices","icon":"receipt","href":"/api/endpoints/invoices"},{"title":"A presigned link to the invoice PDF. Expires in 900 seconds","openapi":"GET /v1/invoices/{invoiceId}/pdf","href":"/api/reference/get_v1_invoices_invoiceId_pdf"},{"title":"One invoice","openapi":"GET /v1/invoices/{invoiceId}","href":"/api/reference/get_v1_invoices_invoiceId"},{"title":"Email an invoice to the customer","openapi":"POST /v1/invoices/{invoiceId}/send","href":"/api/reference/post_v1_invoices_invoiceId_send"},{"title":"Record an invoice as paid","openapi":"POST /v1/invoices/{invoiceId}/mark-paid","href":"/api/reference/post_v1_invoices_invoiceId_mark_paid"},{"title":"Undo a paid marking","openapi":"POST /v1/invoices/{invoiceId}/unmark-paid","href":"/api/reference/post_v1_invoices_invoiceId_unmark_paid"},{"title":"Void an invoice","openapi":"POST /v1/invoices/{invoiceId}/void","href":"/api/reference/post_v1_invoices_invoiceId_void"},{"title":"Refund an invoice","openapi":"POST /v1/invoices/{invoiceId}/refund","href":"/api/reference/post_v1_invoices_invoiceId_refund"},{"title":"Dismiss a customer’s payment claim","openapi":"POST /v1/invoices/{invoiceId}/dismiss-claim","href":"/api/reference/post_v1_invoices_invoiceId_dismiss_claim"},{"title":"Push an invoice into the shop’s Xero connection","openapi":"POST /v1/invoices/{invoiceId}/push/xero","href":"/api/reference/post_v1_invoices_invoiceId_push_xero"},{"title":"Push an invoice into the shop’s QuickBooks connection","openapi":"POST /v1/invoices/{invoiceId}/push/quickbooks","href":"/api/reference/post_v1_invoices_invoiceId_push_quickbooks"}]},{"group":"Documents \u0026 media","pages":[{"title":"Documents and media","icon":"file-arrow-up","href":"/api/endpoints/documents-and-media"},{"title":"Mint a presigned PUT for an upload. Expires in 900 seconds","openapi":"POST /v1/media/upload-url","href":"/api/reference/post_v1_media_upload_url"}]},{"group":"Custom fields \u0026 statuses","pages":[{"title":"Custom fields and statuses","icon":"sliders","href":"/api/endpoints/custom-fields-and-statuses"},{"title":"Create a custom field definition","openapi":"POST /v1/custom-fields","href":"/api/reference/post_v1_custom_fields"},{"title":"One custom field definition","openapi":"GET /v1/custom-fields/{fieldId}","href":"/api/reference/get_v1_custom_fields_fieldId"},{"title":"Update a custom field definition","openapi":"PATCH /v1/custom-fields/{fieldId}","href":"/api/reference/patch_v1_custom_fields_fieldId"},{"title":"Delete a custom field definition","openapi":"DELETE /v1/custom-fields/{fieldId}","href":"/api/reference/delete_v1_custom_fields_fieldId"},{"title":"List custom status definitions","openapi":"GET /v1/custom-statuses","href":"/api/reference/get_v1_custom_statuses"},{"title":"Create a custom status definition","openapi":"POST /v1/custom-statuses","href":"/api/reference/post_v1_custom_statuses"},{"title":"One custom status definition","openapi":"GET /v1/custom-statuses/{statusId}","href":"/api/reference/get_v1_custom_statuses_statusId"},{"title":"Update a custom status definition","openapi":"PATCH /v1/custom-statuses/{statusId}","href":"/api/reference/patch_v1_custom_statuses_statusId"},{"title":"Delete a custom status definition. Refuses with 409 when an automation rule targets it","openapi":"DELETE /v1/custom-statuses/{statusId}","href":"/api/reference/delete_v1_custom_statuses_statusId"},{"title":"List custom field definitions","openapi":"GET /v1/custom-fields","href":"/api/reference/get_v1_custom_fields"}]},{"group":"Webhooks","pages":[{"title":"Webhooks","icon":"bell","href":"/api/endpoints/webhooks"},{"title":"List this credential’s webhook subscriptions","openapi":"GET /v1/webhooks","href":"/api/reference/get_v1_webhooks"},{"title":"Subscribe to an event. Returns the signing secret ONCE. Re-subscribing the same event and URL is idempotent","openapi":"POST /v1/webhooks","href":"/api/reference/post_v1_webhooks"},{"title":"One webhook subscription","openapi":"GET /v1/webhooks/{webhookId}","href":"/api/reference/get_v1_webhooks_webhookId"},{"title":"Unsubscribe. Idempotent, so deleting an unknown subscription still succeeds","openapi":"DELETE /v1/webhooks/{webhookId}","href":"/api/reference/delete_v1_webhooks_webhookId"},{"title":"Rotate the signing secret. The old one keeps verifying for 48 hours so you can deploy without dropping payloads","openapi":"POST /v1/webhooks/{webhookId}/rotate-secret","href":"/api/reference/post_v1_webhooks_webhookId_rotate_secret"},{"title":"Delivery history for a subscription, with a failure reason you can act on. Never a response body","openapi":"GET /v1/webhooks/{webhookId}/deliveries","href":"/api/reference/get_v1_webhooks_webhookId_deliveries"},{"title":"Replay a failed delivery. Without this, an hour of downtime means those events are gone for good","openapi":"POST /v1/webhooks/{webhookId}/deliveries/{deliveryId}/retry","href":"/api/reference/post_v1_webhooks_webhookId_deliveries_deliveryId_retry"}]}]}]},{"tab":"Integrations","icon":"code-compare","pages":[{"title":"Integrations","href":"/integrations/overview"}]},{"tab":"MCP","icon":"openai","pages":[{"title":"MCP","href":"/mcp/overview"}]},{"tab":"Release Notes","icon":"flag","pages":[{"title":"Release Notes","href":"/release-notes/2026-10-12"}]}]},"title":"One quote and everything hanging off it, in one call - PRINTOOLS Docs","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","Page-D5fEM6aW.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}