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":[],"isAtlas":false,"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"api/reference/patch_v1_quote_lines_lineId","slug":"/api/reference/patch_v1_quote_lines_lineId","pageMetadata":{"title":"Update a quote line","openapi":"PATCH /v1/quote-lines/{lineId}","description":"Requires the scope quotes.write.","href":"/api/reference/patch_v1_quote_lines_lineId"},"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 the scope quotes.write.\"\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.write`}),`.`]})}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":"Update a quote line","openapi":"PATCH /v1/quote-lines/{lineId}","description":"Requires the scope quotes.write.","href":"/api/reference/patch_v1_quote_lines_lineId"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Update a quote line.","operationId":"patch_v1_quote_lines_lineId","tags":["quote-lines"],"description":"Requires the scope quotes.write.","security":["8def5520-5096-4806-a931-df8319ee1b9c","b5e2fa8b-2faf-48d6-ae9a-b9aa34040982"],"x-printools-required-scopes":["quotes.write"],"parameters":["d079314f-8286-40fb-880d-a693011c9a53","afef19e4-27bf-4918-b0c8-0984e31477fd","5af34a1f-a5a7-4b7c-8921-76111db238d7"],"requestBody":"b65a4357-2a6e-4c67-b5c7-40cc7d609e8f","responses":{"200":"a4578588-5547-4857-899e-2f2227741ed7","400":"27371566-c9d6-4e82-939d-42c025283ddd","401":"f2868287-7ead-4c7b-a885-b700aa699777","403":"d522140f-2e6a-4d89-bc85-fb79d15cf792","404":"ca18a0c3-8704-46a8-b13c-8eeffe3dca66","409":"f177c952-2224-4694-ad8e-0981714f24d9","413":"ed988378-6cd2-47dd-8c02-8a84c6168667","429":"a74a254b-b85d-4674-bea1-3861186b86cd","500":"e335c11b-51d1-45ec-ab2b-8773a3a948b0"},"x-codeSamples":[{"lang":"curl","label":"Tenant credential","source":"curl --request PATCH 'https://api.printools.io/v1/quote-lines/11111111-2222-3333-4444-555555555555' \\\n --header 'X-API-Key: $PRINTOOLS_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\"lineType\":\"Garment\",\"garmentCatalogueItemId\":\"example\",\"productName\":\"example\",\"productSku\":\"example\",\"title\":\"example\"}'"}],"method":"patch","type":"path","servers":["beaaf7be-9258-41cf-929a-55d51e0689b1"],"path":"/v1/quote-lines/{lineId}","baseUrlOptions":["https://api.printools.io"],"title":"Update a quote line.","codeSamples":[{"label":"Tenant credential","lang":"curl","source":"curl --request PATCH 'https://api.printools.io/v1/quote-lines/11111111-2222-3333-4444-555555555555' \\\n --header 'X-API-Key: $PRINTOOLS_API_KEY' \\\n --header 'Content-Type: application/json' \\\n --data '{\"lineType\":\"Garment\",\"garmentCatalogueItemId\":\"example\",\"productName\":\"example\",\"productSku\":\"example\",\"title\":\"example\"}'"}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{"d079314f-8286-40fb-880d-a693011c9a53":{"name":"lineId","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."},"afef19e4-27bf-4918-b0c8-0984e31477fd":{"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."},"5af34a1f-a5a7-4b7c-8921-76111db238d7":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":200,"isRequired":false,"description":"Optional client-generated key for write retries. Reusing it with a different request returns 409; a replay includes Idempotency-Replayed: true.","uniqueKey":"","typeLabel":"string"},"description":"Optional client-generated key for write retries. Reusing it with a different request returns 409; a replay includes Idempotency-Replayed: true."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lineType":{"type":"string","enum":["Garment","Decoration","Service","Cost","Discount","Surcharge","Other"],"uniqueKey":"lineType","typeLabel":"enum\u003cstring>"},"garmentCatalogueItemId":{"type":"string","uniqueKey":"garmentCatalogueItemId","typeLabel":"string"},"productName":{"type":"string","uniqueKey":"productName","typeLabel":"string"},"productSku":{"type":"string","uniqueKey":"productSku","typeLabel":"string"},"title":{"type":"string","uniqueKey":"title","typeLabel":"string"},"description":{"type":"string","uniqueKey":"description","typeLabel":"string"},"quantity":{"type":"integer","uniqueKey":"quantity","typeLabel":"integer"},"unitPriceExGst":{"type":"number","uniqueKey":"unitPriceExGst","typeLabel":"number"},"valueType":{"type":"string","enum":["Flat","Percentage"],"uniqueKey":"valueType","typeLabel":"enum\u003cstring>"},"percentage":{"type":"number","uniqueKey":"percentage","typeLabel":"number"},"discountValueType":{"type":"string","enum":["Flat","Percentage"],"description":"Deprecated alias of valueType (F-26). valueType wins when both are sent.","uniqueKey":"discountValueType","typeLabel":"enum\u003cstring>"},"discountPercentage":{"type":"number","description":"Deprecated alias of percentage (F-26). percentage wins when both are sent.","uniqueKey":"discountPercentage","typeLabel":"number"},"sortOrder":{"type":"integer","uniqueKey":"sortOrder","typeLabel":"integer"},"customImageUrl":{"type":"string","uniqueKey":"customImageUrl","typeLabel":"string"},"variants":{"type":"array","items":{"type":"object","properties":{"quantity":{"type":"integer","isRequired":true,"uniqueKey":"variants.items.[INDEX].quantity","typeLabel":"integer"},"size":{"type":"string","uniqueKey":"variants.items.[INDEX].size","typeLabel":"string"},"colour":{"type":"string","uniqueKey":"variants.items.[INDEX].colour","typeLabel":"string"},"unitPriceExGst":{"type":"number","uniqueKey":"variants.items.[INDEX].unitPriceExGst","typeLabel":"number"},"buyPrice":{"type":"number","uniqueKey":"variants.items.[INDEX].buyPrice","typeLabel":"number"},"extraCost":{"type":"number","uniqueKey":"variants.items.[INDEX].extraCost","typeLabel":"number"},"markupType":{"type":"string","enum":["percentage","flat_rate"],"uniqueKey":"variants.items.[INDEX].markupType","typeLabel":"enum\u003cstring>"},"markupValue":{"type":"number","uniqueKey":"variants.items.[INDEX].markupValue","typeLabel":"number"},"markupSource":{"type":"string","description":"Omitted → `manual`, the safe answer for any client that does not know about\nownership yet. A client that let a group resolve the markup must send\n`group` EXPLICITLY (CU-86d46hu37 AC 12).","enum":["group","manual"],"uniqueKey":"variants.items.[INDEX].markupSource","typeLabel":"enum\u003cstring>"},"isCustomLine":{"type":"boolean","uniqueKey":"variants.items.[INDEX].isCustomLine","typeLabel":"boolean"},"showOnDocuments":{"type":"boolean","description":"Omitted → rolled up, the default for every custom variant (QU-02).","uniqueKey":"variants.items.[INDEX].showOnDocuments","typeLabel":"boolean"},"sortOrder":{"type":"integer","uniqueKey":"variants.items.[INDEX].sortOrder","typeLabel":"integer"}},"required":["quantity"],"uniqueKey":"variants.items.[INDEX]","typeLabel":"object"},"uniqueKey":"variants","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"example":{"title":"example","value":{"lineType":"Garment","garmentCatalogueItemId":"example","productName":"example","productSku":"example","title":"example"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"a4578588-5547-4857-899e-2f2227741ed7":{"description":"Successful response.","headers":{"Idempotency-Replayed":{"description":"Present and true when this response was replayed from a prior Idempotency-Key request.","schema":{"type":"string","enum":["true"]}}},"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":["id","quoteGroupId","lineType","productName","quantity","unitPriceExGst","sortOrder","createdAt","updatedAt","variants"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.id","typeLabel":"string"},"quoteGroupId":{"type":"string","isRequired":true,"uniqueKey":"data.quoteGroupId","typeLabel":"string"},"lineType":{"type":"string","enum":["Garment","Decoration","Service","Cost","Discount","Surcharge","Other"],"isRequired":true,"uniqueKey":"data.lineType","typeLabel":"enum\u003cstring>"},"productName":{"type":"string","isRequired":true,"uniqueKey":"data.productName","typeLabel":"string"},"quantity":{"type":"integer","isRequired":true,"uniqueKey":"data.quantity","typeLabel":"integer"},"unitPriceExGst":{"type":"number","isRequired":true,"uniqueKey":"data.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.sortOrder","typeLabel":"integer"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.updatedAt","typeLabel":"string\u003cdate-time>"},"variants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.variants.items.[INDEX].id","typeLabel":"string"},"quoteLineId":{"type":"string","isRequired":true,"uniqueKey":"data.variants.items.[INDEX].quoteLineId","typeLabel":"string"},"quantity":{"type":"integer","isRequired":true,"uniqueKey":"data.variants.items.[INDEX].quantity","typeLabel":"integer"},"unitPriceExGst":{"type":"number","isRequired":true,"uniqueKey":"data.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.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.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.variants.items.[INDEX].showOnDocuments","typeLabel":"boolean"},"sortOrder":{"type":"integer","isRequired":true,"uniqueKey":"data.variants.items.[INDEX].sortOrder","typeLabel":"integer"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.variants.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.variants.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"size":{"oneOf":[{"type":"string","uniqueKey":"data.variants.items.[INDEX].size.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.variants.items.[INDEX].size.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.variants.items.[INDEX].size","typeLabel":"string | null"},"colour":{"oneOf":[{"type":"string","uniqueKey":"data.variants.items.[INDEX].colour.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.variants.items.[INDEX].colour.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.variants.items.[INDEX].colour","typeLabel":"string | null"},"buyPrice":{"type":"number","description":"Present only when the credential includes the costs.read scope.","uniqueKey":"data.variants.items.[INDEX].buyPrice","typeLabel":"number"},"extraCost":{"type":"number","description":"Present only when the credential includes the costs.read scope.","uniqueKey":"data.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.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.variants.items.[INDEX].markupType.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.variants.items.[INDEX].markupType","typeLabel":"enum\u003cstring> | null"},"markupValue":{"oneOf":[{"type":"number","uniqueKey":"data.variants.items.[INDEX].markupValue.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"data.variants.items.[INDEX].markupValue.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.variants.items.[INDEX].markupValue","typeLabel":"number | null"}},"required":["id","quoteLineId","quantity","unitPriceExGst","markupSource","isCustomLine","showOnDocuments","sortOrder","createdAt","updatedAt"],"uniqueKey":"data.variants.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.variants","typeLabel":"object[]"},"garmentCatalogueItemId":{"oneOf":[{"type":"string","uniqueKey":"data.garmentCatalogueItemId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.garmentCatalogueItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.garmentCatalogueItemId","typeLabel":"string | null"},"productSku":{"oneOf":[{"type":"string","uniqueKey":"data.productSku.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.productSku.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.productSku","typeLabel":"string | null"},"title":{"oneOf":[{"type":"string","uniqueKey":"data.title.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.title.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.title","typeLabel":"string | null"},"description":{"oneOf":[{"type":"string","uniqueKey":"data.description.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.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.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.valueType.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.valueType","typeLabel":"enum\u003cstring> | null"},"percentage":{"oneOf":[{"type":"number","description":"The rate, when valueType is Percentage. Null otherwise.","uniqueKey":"data.percentage.oneOf.0","typeLabel":"number"},{"type":"null","description":"The rate, when valueType is Percentage. Null otherwise.","uniqueKey":"data.percentage.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.percentage","typeLabel":"number | null"},"discountValueType":{"oneOf":[{"type":"string","enum":["Flat","Percentage"],"uniqueKey":"data.discountValueType.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"data.discountValueType.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.discountValueType","typeLabel":"enum\u003cstring> | null"},"discountPercentage":{"oneOf":[{"type":"number","uniqueKey":"data.discountPercentage.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"data.discountPercentage.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.discountPercentage","typeLabel":"number | null"},"customImageUrl":{"oneOf":[{"type":"string","description":"Per-line image override; null falls back to the catalogue thumbnail.","uniqueKey":"data.customImageUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Per-line image override; null falls back to the catalogue thumbnail.","uniqueKey":"data.customImageUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.customImageUrl","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":true,"message":"OK","data":{"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>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"27371566-c9d6-4e82-939d-42c025283ddd":{"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"},"f2868287-7ead-4c7b-a885-b700aa699777":{"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"},"d522140f-2e6a-4d89-bc85-fb79d15cf792":{"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"},"ca18a0c3-8704-46a8-b13c-8eeffe3dca66":{"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"},"f177c952-2224-4694-ad8e-0981714f24d9":{"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"},"ed988378-6cd2-47dd-8c02-8a84c6168667":{"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"},"a74a254b-b85d-4674-bea1-3861186b86cd":{"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"},"e335c11b-51d1-45ec-ab2b-8773a3a948b0":{"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":{"8def5520-5096-4806-a931-df8319ee1b9c":{"tenantApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Tenant credential. This is sufficient by itself.","scopes":[]}},"b5e2fa8b-2faf-48d6-ae9a-b9aa34040982":{"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":"Update a quote line - PRINTOOLS Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-08T12:10:21.536Z","originalFileLocation":"api/reference/patch_v1_quote_lines_lineId.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 the scope quotes.write.\">\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=\"Update a quote line - PRINTOOLS Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Requires the scope quotes.write.\">\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/patch_v1_quote_lines_lineId\">\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=Update+a+quote+line\u0026amp;description=Requires+the+scope+quotes.write.\u0026amp;theme=1264f79c0fa4bc489a663c38\u0026amp;signature=df9963d79f4f3074d2378ef14c93882d78d2beb56a8ea399e6d7b56a4bb2f958\">\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=\"Update a quote line - PRINTOOLS Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Requires the scope quotes.write.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://printools-docs.mintlify.app/_mintlify/api/og/v2?division=Quotes\u0026amp;title=Update+a+quote+line\u0026amp;description=Requires+the+scope+quotes.write.\u0026amp;theme=1264f79c0fa4bc489a663c38\u0026amp;signature=df9963d79f4f3074d2378ef14c93882d78d2beb56a8ea399e6d7b56a4bb2f958\">\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/patch_v1_quote_lines_lineId\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/reference/patch_v1_quote_lines_lineId.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/patch_v1_quote_lines_lineId#webpage\",\"url\":\"https://docs.printools.io/api/reference/patch_v1_quote_lines_lineId\",\"name\":\"Update a quote line\",\"description\":\"Requires the scope quotes.write.\",\"dateModified\":\"2026-09-08T12:10:21.536Z\",\"isPartOf\":{\"@id\":\"https://docs.printools.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.printools.io/api/reference/patch_v1_quote_lines_lineId#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.printools.io/api/reference/patch_v1_quote_lines_lineId#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\":\"Update a quote line\",\"item\":\"https://docs.printools.io/api/reference/patch_v1_quote_lines_lineId\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.printools.io/api/reference/patch_v1_quote_lines_lineId#apireference\",\"headline\":\"Update a quote line\",\"name\":\"Update a quote line\",\"description\":\"Requires the scope quotes.write.\",\"url\":\"https://docs.printools.io/api/reference/patch_v1_quote_lines_lineId\",\"mainEntityOfPage\":{\"@id\":\"https://docs.printools.io/api/reference/patch_v1_quote_lines_lineId#webpage\"},\"dateModified\":\"2026-09-08T12:10:21.536Z\",\"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","description":"Requires the scope quotes.write.","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}","description":"Requires the scope quotes.write.","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","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}","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":"Update a quote line - 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"]}