label.request.issued: the id in the payload is the label request ID. Use
it to create the label with POST /labels, or, if label generation fails on
your end, to report the failure with POST /label-requests/{id}/errors.
label.request.cancelled: for example, a merchant regenerated the label, or
the return itself was cancelled. Stop any work in progress for this id and
void/refund the carrier label if one was already purchased. The id is never
reused: a regenerated label arrives as a brand-new label.request.issued event
with a new id.
Acknowledge every delivery with a 200 response. A non-200 response is not how you
report a label-generation failure — failures are reported with
POST /label-requests/{id}/errors. Reporting an error does not cause Loop to resend
the webhook or issue a new label request: the request remains issued and stays
fulfillable via POST /labels with the same id, so retrying is your integration’s
own responsibility.
Details about the products returned in the parcel.
Show child attributes
Response
200
Return a 200 status to indicate that the data was received successfully.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Loop Returns Documentation","colors":{"primary":"#0672FF","light":"#FFFCF7","dark":"#000000"},"logo":{"light":"https://mintcdn.com/loopreturns/mWP1nZGNp75FiB-l/logo/loop-logo-lapis-charcoal.svg?fit=max\u0026auto=format\u0026n=mWP1nZGNp75FiB-l\u0026q=85\u0026s=5113cc3f8f2d70a65c2c774e471a13c4","dark":"https://mintcdn.com/loopreturns/mWP1nZGNp75FiB-l/logo/loop-logo-lapis-newsprint.svg?fit=max\u0026auto=format\u0026n=mWP1nZGNp75FiB-l\u0026q=85\u0026s=c2197689146b468c5df1b8581f091743"},"favicon":"https://mintcdn.com/loopreturns/mWP1nZGNp75FiB-l/favicon.svg?fit=max\u0026auto=format\u0026n=mWP1nZGNp75FiB-l\u0026q=85\u0026s=93b43e224efe823b43c6d1b9c45799f9","navbar":{"links":[{"href":"https://help.loopreturns.com","label":"Support"}],"primary":{"type":"button","label":"Request Demo","href":"https://www.loopreturns.com/book-a-demo-today/"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/loop-returns","instagram":"https://www.instagram.com/loopreturns"}},"fonts":{"heading":{"family":"ABC Ginto","weight":900,"source":"fonts/ABCGinto-Black.woff2","format":"woff2"},"body":{"family":"Matter","weight":400,"source":"fonts/Matter-Regular.woff2","format":"woff2"}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"System Status","icon":"radar","href":"https://status.loopreturns.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"loopreturns","hasAudioNarration":false,"actualSubdomain":"loopreturns","customDomains":["docs.loopreturns.com"],"gitSource":{"type":"gitlab","owner":"loopreturns/documentation","repo":"public-api-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"projectId":67355043,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeca26621aa22f79f8e3517","collectionId":"dc0f7af0-e5b9-46ae-900e-ed1f575f606c","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeca26621aa22f79f8e3517"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aee02e9b56b944fc2811a93","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API Reference","count":177},{"language":"default","tag":"APIs","count":169},{"language":"default","tag":"Commerce Data","count":69},{"language":"default","tag":"Return Create","count":52},{"language":"default","tag":"Guides","count":30},{"language":"default","tag":"Products","count":17},{"language":"default","tag":"Webhook Reference","count":14},{"language":"default","tag":"Collections","count":12},{"language":"default","tag":"Orders","count":11},{"language":"default","tag":"MCP Server","count":10}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"webhook-reference/topics/label-requests-webhook","slug":"/webhook-reference/topics/label-requests-webhook","pageMetadata":{"title":"Label requests","openapi":"webhook LabelRequests","description":"| Trigger | What it means |\n| -------------------------- | -------------------------------------------------- |\n| `label.request.issued` | Loop needs a label for this return. |\n| `label.request.cancelled` | A previously issued label request was cancelled. |\n\n- **`label.request.issued`**: the `id` in the payload is the label request ID. Use\n it to create the label with `POST /labels`, or, if label generation fails on\n your end, to report the failure with `POST /label-requests/{id}/errors`.\n- **`label.request.cancelled`**: for example, a merchant regenerated the label, or\n the return itself was cancelled. Stop any work in progress for this `id` and\n void/refund the carrier label if one was already purchased. The `id` is never\n reused: a regenerated label arrives as a brand-new `label.request.issued` event\n with a new `id`.\n\nAcknowledge every delivery with a `200` response. A non-200 response is not how you\nreport a label-generation failure — failures are reported with\n`POST /label-requests/{id}/errors`. Reporting an error does not cause Loop to resend\nthe webhook or issue a new label request: the request remains `issued` and stays\nfulfillable via `POST /labels` with the same `id`, so retrying is your integration's\nown responsibility.\n","href":"/webhook-reference/topics/label-requests-webhook"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n table: \"table\",\n tbody: \"tbody\",\n td: \"td\",\n th: \"th\",\n thead: \"thead\",\n tr: \"tr\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.table, {\n children: [_jsx(_components.thead, {\n children: _jsxs(_components.tr, {\n children: [_jsx(_components.th, {\n children: \"Trigger\"\n }), _jsx(_components.th, {\n children: \"What it means\"\n })]\n })\n }), _jsxs(_components.tbody, {\n children: [_jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"label.request.issued\"\n })\n }), _jsx(_components.td, {\n children: \"Loop needs a label for this return.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"label.request.cancelled\"\n })\n }), _jsx(_components.td, {\n children: \"A previously issued label request was cancelled.\"\n })]\n })]\n })]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"label.request.issued\"\n })\n }), \": the \", _jsx(_components.code, {\n children: \"id\"\n }), \" in the payload is the label request ID. Use\\nit to create the label with \", _jsx(_components.code, {\n children: \"POST /labels\"\n }), \", or, if label generation fails on\\nyour end, to report the failure with \", _jsx(_components.code, {\n children: \"POST /label-requests/{id}/errors\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: _jsx(_components.code, {\n children: \"label.request.cancelled\"\n })\n }), \": for example, a merchant regenerated the label, or\\nthe return itself was cancelled. Stop any work in progress for this \", _jsx(_components.code, {\n children: \"id\"\n }), \" and\\nvoid/refund the carrier label if one was already purchased. The \", _jsx(_components.code, {\n children: \"id\"\n }), \" is never\\nreused: a regenerated label arrives as a brand-new \", _jsx(_components.code, {\n children: \"label.request.issued\"\n }), \" event\\nwith a new \", _jsx(_components.code, {\n children: \"id\"\n }), \".\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Acknowledge every delivery with a \", _jsx(_components.code, {\n children: \"200\"\n }), \" response. A non-200 response is not how you\\nreport a label-generation failure — failures are reported with\\n\", _jsx(_components.code, {\n children: \"POST /label-requests/{id}/errors\"\n }), \". Reporting an error does not cause Loop to resend\\nthe webhook or issue a new label request: the request remains \", _jsx(_components.code, {\n children: \"issued\"\n }), \" and stays\\nfulfillable via \", _jsx(_components.code, {\n children: \"POST /labels\"\n }), \" with the same \", _jsx(_components.code, {\n children: \"id\"\n }), \", so retrying is your integration’s\\nown responsibility.\"]\n })]\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{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}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":{"config":{},"pageMetadata":{"title":"Label requests","openapi":"webhook LabelRequests","description":"| Trigger | What it means |\n| -------------------------- | -------------------------------------------------- |\n| `label.request.issued` | Loop needs a label for this return. |\n| `label.request.cancelled` | A previously issued label request was cancelled. |\n\n- **`label.request.issued`**: the `id` in the payload is the label request ID. Use\n it to create the label with `POST /labels`, or, if label generation fails on\n your end, to report the failure with `POST /label-requests/{id}/errors`.\n- **`label.request.cancelled`**: for example, a merchant regenerated the label, or\n the return itself was cancelled. Stop any work in progress for this `id` and\n void/refund the carrier label if one was already purchased. The `id` is never\n reused: a regenerated label arrives as a brand-new `label.request.issued` event\n with a new `id`.\n\nAcknowledge every delivery with a `200` response. A non-200 response is not how you\nreport a label-generation failure — failures are reported with\n`POST /label-requests/{id}/errors`. Reporting an error does not cause Loop to resend\nthe webhook or issue a new label request: the request remains `issued` and stays\nfulfillable via `POST /labels` with the same `id`, so retrying is your integration's\nown responsibility.\n","href":"/webhook-reference/topics/label-requests-webhook"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/loopreturns/d7dc6883aeaefe8b/scripts/generate-unstable-nav.js","/_mintlify/custom/loopreturns/eb155f0b6d2849a4/scripts/update-openapi-servers.js"],"openApiReferenceData":{"operation":{"description":"| Trigger | What it means |\n| -------------------------- | -------------------------------------------------- |\n| `label.request.issued` | Loop needs a label for this return. |\n| `label.request.cancelled` | A previously issued label request was cancelled. |\n\n- **`label.request.issued`**: the `id` in the payload is the label request ID. Use\n it to create the label with `POST /labels`, or, if label generation fails on\n your end, to report the failure with `POST /label-requests/{id}/errors`.\n- **`label.request.cancelled`**: for example, a merchant regenerated the label, or\n the return itself was cancelled. Stop any work in progress for this `id` and\n void/refund the carrier label if one was already purchased. The `id` is never\n reused: a regenerated label arrives as a brand-new `label.request.issued` event\n with a new `id`.\n\nAcknowledge every delivery with a `200` response. A non-200 response is not how you\nreport a label-generation failure — failures are reported with\n`POST /label-requests/{id}/errors`. Reporting an error does not cause Loop to resend\nthe webhook or issue a new label request: the request remains `issued` and stays\nfulfillable via `POST /labels` with the same `id`, so retrying is your integration's\nown responsibility.\n","requestBody":"cf92dd6c-5c31-4904-86ee-49b368f717e9","responses":{"200":"2357ad49-e647-4f0e-a52e-ff0ce038d944"},"method":"post","type":"webhook","servers":[],"security":[],"path":"LabelRequests","baseUrlOptions":[],"title":"","codeSamples":[],"requiredOnlyExamples":false,"requestExamples":[{"language":"json","filename":"Example","code":"{\n \"topic\": \"label.request\",\n \"id\": 6340,\n \"return_id\": 1001,\n \"shop_id\": 50,\n \"created_at\": \"2023-11-07T05:31:56Z\",\n \"addresses\": {\n \"origin\": {\n \"name\": \"Alice Returns\",\n \"address1\": \"123 Example Rd\",\n \"company\": \"Example Co.\",\n \"address2\": \"Apt A\",\n \"city\": \"Columbus\",\n \"state\": \"Ohio\",\n \"zip\": \"43215\",\n \"country\": \"United States\",\n \"country_code\": \"US\",\n \"phone\": \"12345678901\"\n },\n \"destination\": {\n \"name\": \"My Domestic Warehouse\",\n \"address1\": \"123 Commerce St\",\n \"company\": \"Ecommerce Inc.\",\n \"address2\": \"Ste 100\",\n \"city\": \"Columbus\",\n \"state\": \"Ohio\",\n \"zip\": \"43215\",\n \"country\": \"United States\",\n \"country_code\": \"US\",\n \"phone\": \"12345678901\"\n }\n },\n \"parcel\": {\n \"height\": 5,\n \"width\": 10.9,\n \"length\": 20.2,\n \"weight\": 65.9\n },\n \"products\": [\n {\n \"name\": \"Green T-Shirt\",\n \"sku\": \"tshirt-g-2314-L\",\n \"hs_code\": \"61051000\",\n \"country_of_origin\": \"US\",\n \"price\": {\n \"amount\": 100,\n \"currency\": \"USD\"\n }\n }\n ]\n}"}],"requestExampleType":"webhook","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"properties":{"topic":{"type":"string","description":"The webhook topic.","examples":["label.request"],"uniqueKey":"topic","typeLabel":"string"},"trigger":{"type":"string","enum":["label.request.issued","label.request.cancelled"],"description":"The event that triggered the webhook.","uniqueKey":"trigger","typeLabel":"enum\u003cstring>"},"id":{"type":"integer","description":"The Loop label request ID.","examples":[6340],"uniqueKey":"id","typeLabel":"integer"},"return_id":{"type":"integer","description":"The Loop return ID.","examples":[1001],"uniqueKey":"return_id","typeLabel":"integer"},"shop_id":{"type":"integer","description":"The unique identifier of the shop that created the webhook.","examples":[50],"uniqueKey":"shop_id","typeLabel":"integer"},"created_at":{"type":"string","format":"date-time","description":"The date and time at which the request was created, using the ISO 8601 date format.","uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"addresses":{"type":"object","description":"The origin and destination addresses of the label.","properties":{"origin":{"type":"object","description":"The address from which the label is being shipped.","properties":{"name":{"oneOf":[{"type":"string","description":"The origin address name.","examples":["Alice Returns"],"uniqueKey":"addresses.origin.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The origin address name.","examples":["Alice Returns"],"uniqueKey":"addresses.origin.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.origin.name","typeLabel":"string | null"},"address1":{"type":"string","description":"Line 1 of the origin address.","examples":["123 Example Rd"],"uniqueKey":"addresses.origin.address1","typeLabel":"string"},"company":{"oneOf":[{"type":"string","description":"The origin address company.","examples":["Example Co."],"uniqueKey":"addresses.origin.company.oneOf.0","typeLabel":"string"},{"type":"null","description":"The origin address company.","examples":["Example Co."],"uniqueKey":"addresses.origin.company.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.origin.company","typeLabel":"string | null"},"address2":{"oneOf":[{"type":"string","description":"Line 2 of the origin address.","examples":["Apt A"],"uniqueKey":"addresses.origin.address2.oneOf.0","typeLabel":"string"},{"type":"null","description":"Line 2 of the origin address.","examples":["Apt A"],"uniqueKey":"addresses.origin.address2.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.origin.address2","typeLabel":"string | null"},"city":{"type":"string","description":"The origin address city.","examples":["Columbus"],"uniqueKey":"addresses.origin.city","typeLabel":"string"},"state":{"oneOf":[{"type":"string","description":"The origin address state or province.","examples":["Ohio"],"uniqueKey":"addresses.origin.state.oneOf.0","typeLabel":"string"},{"type":"null","description":"The origin address state or province.","examples":["Ohio"],"uniqueKey":"addresses.origin.state.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.origin.state","typeLabel":"string | null"},"zip":{"type":"string","description":"The origin address ZIP or postal code.","examples":["43215"],"uniqueKey":"addresses.origin.zip","typeLabel":"string"},"country":{"type":"string","description":"The origin address country.","examples":["United States"],"uniqueKey":"addresses.origin.country","typeLabel":"string"},"country_code":{"type":"string","description":"The origin address ISO 3166-1 alpha-2 format country code.","examples":["US"],"uniqueKey":"addresses.origin.country_code","typeLabel":"string"},"phone":{"oneOf":[{"type":"string","description":"The origin address phone. Numerical characters only.","examples":["12345678901"],"uniqueKey":"addresses.origin.phone.oneOf.0","typeLabel":"string"},{"type":"null","description":"The origin address phone. Numerical characters only.","examples":["12345678901"],"uniqueKey":"addresses.origin.phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.origin.phone","typeLabel":"string | null"}},"uniqueKey":"addresses.origin","typeLabel":"object"},"destination":{"type":"object","description":"The address to which the label is being shipped.","properties":{"name":{"oneOf":[{"type":"string","description":"The destination address name.","examples":["My Domestic Warehouse"],"uniqueKey":"addresses.destination.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The destination address name.","examples":["My Domestic Warehouse"],"uniqueKey":"addresses.destination.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.destination.name","typeLabel":"string | null"},"address1":{"type":"string","description":"Line 1 of the destination address.","examples":["123 Commerce St"],"uniqueKey":"addresses.destination.address1","typeLabel":"string"},"company":{"oneOf":[{"type":"string","description":"The destination address company.","examples":["Ecommerce Inc."],"uniqueKey":"addresses.destination.company.oneOf.0","typeLabel":"string"},{"type":"null","description":"The destination address company.","examples":["Ecommerce Inc."],"uniqueKey":"addresses.destination.company.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.destination.company","typeLabel":"string | null"},"address2":{"oneOf":[{"type":"string","description":"Line 2 of the destination address.","examples":["Ste 100"],"uniqueKey":"addresses.destination.address2.oneOf.0","typeLabel":"string"},{"type":"null","description":"Line 2 of the destination address.","examples":["Ste 100"],"uniqueKey":"addresses.destination.address2.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.destination.address2","typeLabel":"string | null"},"city":{"type":"string","description":"The destination address city.","examples":["Columbus"],"uniqueKey":"addresses.destination.city","typeLabel":"string"},"state":{"oneOf":[{"type":"string","description":"The destination address state or province.","examples":["Ohio"],"uniqueKey":"addresses.destination.state.oneOf.0","typeLabel":"string"},{"type":"null","description":"The destination address state or province.","examples":["Ohio"],"uniqueKey":"addresses.destination.state.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.destination.state","typeLabel":"string | null"},"zip":{"type":"string","description":"The destination address ZIP or postal code.","examples":["43215"],"uniqueKey":"addresses.destination.zip","typeLabel":"string"},"country":{"type":"string","description":"The destination address country.","examples":["United States"],"uniqueKey":"addresses.destination.country","typeLabel":"string"},"country_code":{"type":"string","description":"The destination address ISO 3166-1 alpha-2 format country code.","examples":["US"],"uniqueKey":"addresses.destination.country_code","typeLabel":"string"},"phone":{"oneOf":[{"type":"string","description":"The destination address phone. Numerical characters only.","examples":["12345678901"],"uniqueKey":"addresses.destination.phone.oneOf.0","typeLabel":"string"},{"type":"null","description":"The destination address phone. Numerical characters only.","examples":["12345678901"],"uniqueKey":"addresses.destination.phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"addresses.destination.phone","typeLabel":"string | null"}},"uniqueKey":"addresses.destination","typeLabel":"object"}},"uniqueKey":"addresses","typeLabel":"object"},"parcel":{"type":"object","description":"The dimensions, weight, and contents of the parcel.","properties":{"height":{"type":"number","format":"double","description":"The height of the parcel in inches.","examples":[5],"uniqueKey":"parcel.height","typeLabel":"number\u003cdouble>"},"width":{"type":"number","format":"double","description":"The width of the parcel in inches.","examples":[10.9],"uniqueKey":"parcel.width","typeLabel":"number\u003cdouble>"},"length":{"type":"number","format":"double","description":"The length of the parcel in inches.","examples":[20.2],"uniqueKey":"parcel.length","typeLabel":"number\u003cdouble>"},"weight":{"type":"number","format":"double","description":"The weight of the parcel in grams.","examples":[65.9],"uniqueKey":"parcel.weight","typeLabel":"number\u003cdouble>"}},"uniqueKey":"parcel","typeLabel":"object"},"products":{"type":"array","description":"Details about the products returned in the parcel.","items":{"type":"object","properties":{"name":{"type":"string","description":"The product's name.","examples":["Green T-Shirt"],"uniqueKey":"products.items.[INDEX].name","typeLabel":"string"},"sku":{"type":"string","description":"The product's SKU.","examples":["tshirt-g-2314-L"],"uniqueKey":"products.items.[INDEX].sku","typeLabel":"string"},"hs_code":{"oneOf":[{"type":"string","description":"The product's HS (Harmonized System) code.","examples":["61051000"],"uniqueKey":"products.items.[INDEX].hs_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"The product's HS (Harmonized System) code.","examples":["61051000"],"uniqueKey":"products.items.[INDEX].hs_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"products.items.[INDEX].hs_code","typeLabel":"string | null"},"country_of_origin":{"oneOf":[{"type":"string","description":"The product's country of origin.","examples":["US"],"uniqueKey":"products.items.[INDEX].country_of_origin.oneOf.0","typeLabel":"string"},{"type":"null","description":"The product's country of origin.","examples":["US"],"uniqueKey":"products.items.[INDEX].country_of_origin.oneOf.1","typeLabel":"null"}],"uniqueKey":"products.items.[INDEX].country_of_origin","typeLabel":"string | null"},"price":{"type":"object","description":"The product's price.","properties":{"amount":{"type":"integer","examples":[100],"uniqueKey":"products.items.[INDEX].price.amount","typeLabel":"integer"},"currency":{"oneOf":[{"type":"string","maxLength":3,"examples":["USD"],"uniqueKey":"products.items.[INDEX].price.currency.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":3,"examples":["USD"],"uniqueKey":"products.items.[INDEX].price.currency.oneOf.1","typeLabel":"null"}],"uniqueKey":"products.items.[INDEX].price.currency","typeLabel":"string | null"}},"uniqueKey":"products.items.[INDEX].price","typeLabel":"object"}},"uniqueKey":"products.items.[INDEX]","typeLabel":"object"},"uniqueKey":"products","typeLabel":"object[]"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"topic":"label.request","id":6340,"return_id":1001,"shop_id":50,"created_at":"2023-11-07T05:31:56Z","addresses":{"origin":{"name":"Alice Returns","address1":"123 Example Rd","company":"Example Co.","address2":"Apt A","city":"Columbus","state":"Ohio","zip":"43215","country":"United States","country_code":"US","phone":"12345678901"},"destination":{"name":"My Domestic Warehouse","address1":"123 Commerce St","company":"Ecommerce Inc.","address2":"Ste 100","city":"Columbus","state":"Ohio","zip":"43215","country":"United States","country_code":"US","phone":"12345678901"}},"parcel":{"height":5,"width":10.9,"length":20.2,"weight":65.9},"products":[{"name":"Green T-Shirt","sku":"tshirt-g-2314-L","hs_code":"61051000","country_of_origin":"US","price":{"amount":100,"currency":"USD"}}]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"2357ad49-e647-4f0e-a52e-ff0ce038d944":{"description":"Return a 200 status to indicate that the data was received successfully.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{},"servers":{}},"originalFileLocation":"openapi/label-requests-webhook.yaml"},"subdomain":"loopreturns","siteName":"Loop Returns Documentation","title":"Label requests - Loop Returns Documentation","navMaps":{"firstHrefInVersion":{"2026-07":{"href":"/webhook-reference/topics/label-requests-webhook","matchLevel":0},"2026-10":{"href":"/webhook-reference/topics/label-requests-webhook","matchLevel":0},"unstable":{"href":"/webhook-reference/topics/label-requests-webhook","matchLevel":0}},"firstHrefInLanguage":{}},"lastModified":"2026-09-03T14:50:09.992Z","originalFileLocation":"webhook-reference/topics/label-requests-webhook.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=\"| Trigger | What it means | | -------------------------- | -------------------------------------------------- | | label.request.issued | Loop needs a label for this return. | | label.request.cancelled | A previously issued label request was cancelled. | - label.request.issued: the id in the payload is the label request ID. Use it to create the label with POST /labels, or, if label generation fails on your end, to report the failure with POST /label-requests/{id}/errors. - label.request.cancelled: for example, a merchant regenerated the label, or the return itself was cancelled. Stop any work in progress for this id and void/refund the carrier label if one was already purchased. The id is never reused: a regenerated label arrives as a brand-new label.request.issued event with a new id. Acknowledge every delivery with a 200 response. A non-200 response is not how you report a label-generation failure — failures are reported with POST /label-requests/{id}/errors. Reporting an error does not cause Loop to resend the webhook or issue a new label request: the request remains issued and stays fulfillable via POST /labels with the same id, so retrying is your integration\u0026#x27;s own responsibility.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Loop Returns Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/loopreturns/X0rUYkP1UIsEaMhI/_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/loopreturns/X0rUYkP1UIsEaMhI/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/loopreturns/X0rUYkP1UIsEaMhI/_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/loopreturns/X0rUYkP1UIsEaMhI/_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/loopreturns/X0rUYkP1UIsEaMhI/_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/loopreturns/X0rUYkP1UIsEaMhI/_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/loopreturns/X0rUYkP1UIsEaMhI/_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/loopreturns/X0rUYkP1UIsEaMhI/_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/loopreturns/X0rUYkP1UIsEaMhI/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Label requests - Loop Returns Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"| Trigger | What it means | | -------------------------- | -------------------------------------------------- | | label.request.issued | Loop needs a label for this return. | | label.request.cancelled | A previously issued label request was cancelled. | - label.request.issued: the id in the payload is the label request ID. Use it to create the label with POST /labels, or, if label generation fails on your end, to report the failure with POST /label-requests/{id}/errors. - label.request.cancelled: for example, a merchant regenerated the label, or the return itself was cancelled. Stop any work in progress for this id and void/refund the carrier label if one was already purchased. The id is never reused: a regenerated label arrives as a brand-new label.request.issued event with a new id. Acknowledge every delivery with a 200 response. A non-200 response is not how you report a label-generation failure — failures are reported with POST /label-requests/{id}/errors. Reporting an error does not cause Loop to resend the webhook or issue a new label request: the request remains issued and stays fulfillable via POST /labels with the same id, so retrying is your integration\u0026#x27;s own responsibility.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Loop Returns Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://loopreturns.mintlify.site/_mintlify/api/og/v2?division=Webhook+Payloads\u0026amp;title=Label+requests\u0026amp;description=%7C+Trigger+++++++++++++++++++%7C+What+it+means+++++++++++++++++++++++++++++++++++++%7C%0A%7C+--------------------------+%7C+-----------------------------------------------\u0026amp;theme=5ccacdea69e246fe33e6ab29\u0026amp;signature=92a9c0363bdb32020f625c213773ad348a0c110dd6a11961708f0b3624a23308\">\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=\"Label requests - Loop Returns Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"| Trigger | What it means | | -------------------------- | -------------------------------------------------- | | label.request.issued | Loop needs a label for this return. | | label.request.cancelled | A previously issued label request was cancelled. | - label.request.issued: the id in the payload is the label request ID. Use it to create the label with POST /labels, or, if label generation fails on your end, to report the failure with POST /label-requests/{id}/errors. - label.request.cancelled: for example, a merchant regenerated the label, or the return itself was cancelled. Stop any work in progress for this id and void/refund the carrier label if one was already purchased. The id is never reused: a regenerated label arrives as a brand-new label.request.issued event with a new id. Acknowledge every delivery with a 200 response. A non-200 response is not how you report a label-generation failure — failures are reported with POST /label-requests/{id}/errors. Reporting an error does not cause Loop to resend the webhook or issue a new label request: the request remains issued and stays fulfillable via POST /labels with the same id, so retrying is your integration\u0026#x27;s own responsibility.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://loopreturns.mintlify.site/_mintlify/api/og/v2?division=Webhook+Payloads\u0026amp;title=Label+requests\u0026amp;description=%7C+Trigger+++++++++++++++++++%7C+What+it+means+++++++++++++++++++++++++++++++++++++%7C%0A%7C+--------------------------+%7C+-----------------------------------------------\u0026amp;theme=5ccacdea69e246fe33e6ab29\u0026amp;signature=92a9c0363bdb32020f625c213773ad348a0c110dd6a11961708f0b3624a23308\">\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/loopreturns/X0rUYkP1UIsEaMhI/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Loop Returns Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0672FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/webhook-reference/topics/label-requests-webhook.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.loopreturns.com/#organization\",\"name\":\"Loop Returns Documentation\",\"url\":\"https://docs.loopreturns.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/loopreturns/mWP1nZGNp75FiB-l/logo/loop-logo-lapis-charcoal.svg?fit=max\u0026auto=format\u0026n=mWP1nZGNp75FiB-l\u0026q=85\u0026s=5113cc3f8f2d70a65c2c774e471a13c4\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.loopreturns.com#website\",\"name\":\"Loop Returns Documentation\",\"url\":\"https://docs.loopreturns.com\",\"publisher\":{\"@id\":\"https://docs.loopreturns.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook#webpage\",\"url\":\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook\",\"name\":\"Label requests\",\"description\":\"| Trigger | What it means | | -------------------------- | -------------------------------------------------- | | label.request.issued | Loop needs a label for this return. | | label.request.cancelled | A previously issued label request was cancelled. | - label.request.issued: the id in the payload is the label request ID. Use it to create the label with POST /labels, or, if label generation fails on your end, to report the failure with POST /label-requests/{id}/errors. - label.request.cancelled: for example, a merchant regenerated the label, or the return itself was cancelled. Stop any work in progress for this id and void/refund the carrier label if one was already purchased. The id is never reused: a regenerated label arrives as a brand-new label.request.issued event with a new id. Acknowledge every delivery with a 200 response. A non-200 response is not how you report a label-generation failure — failures are reported with POST /label-requests/{id}/errors. Reporting an error does not cause Loop to resend the webhook or issue a new label request: the request remains issued and stays fulfillable via POST /labels with the same id, so retrying is your integration's own responsibility.\",\"dateModified\":\"2026-09-03T14:50:09.992Z\",\"isPartOf\":{\"@id\":\"https://docs.loopreturns.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Webhook Payloads\",\"item\":\"https://docs.loopreturns.com/webhook-reference/topics/return-webhook\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Label requests\",\"item\":\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook#apireference\",\"headline\":\"Label requests\",\"name\":\"Label requests\",\"description\":\"| Trigger | What it means | | -------------------------- | -------------------------------------------------- | | label.request.issued | Loop needs a label for this return. | | label.request.cancelled | A previously issued label request was cancelled. | - label.request.issued: the id in the payload is the label request ID. Use it to create the label with POST /labels, or, if label generation fails on your end, to report the failure with POST /label-requests/{id}/errors. - label.request.cancelled: for example, a merchant regenerated the label, or the return itself was cancelled. Stop any work in progress for this id and void/refund the carrier label if one was already purchased. The id is never reused: a regenerated label arrives as a brand-new label.request.issued event with a new id. Acknowledge every delivery with a 200 response. A non-200 response is not how you report a label-generation failure — failures are reported with POST /label-requests/{id}/errors. Reporting an error does not cause Loop to resend the webhook or issue a new label request: the request remains issued and stays fulfillable via POST /labels with the same id, so retrying is your integration's own responsibility.\",\"url\":\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook\",\"mainEntityOfPage\":{\"@id\":\"https://docs.loopreturns.com/webhook-reference/topics/label-requests-webhook#webpage\"},\"dateModified\":\"2026-09-03T14:50:09.992Z\",\"publisher\":{\"@id\":\"https://docs.loopreturns.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.loopreturns.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Loop Returns Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Loop Returns Documentation","nav":{"global":{"anchors":[{"anchor":"System Status","icon":"radar","href":"https://status.loopreturns.com"}]},"versions":[{"version":"2026-07","tabs":[{"tab":"Introduction","pages":[{"title":"Introduction","href":"/welcome"}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/integration-guides/overview"}]},{"tab":"MCP Server","pages":[{"title":"MCP Server","href":"/mcp/overview"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/getting-started"}]},{"tab":"Webhook Reference","groups":[{"group":"Webhook Reference","pages":[{"title":"Getting Started","href":"/webhook-reference/getting-started"},{"title":"Create a webhook subscription","href":"/webhook-reference/setting-up"},{"title":"Validate webhooks from Loop","href":"/webhook-reference/validation"}]},{"group":"Webhook Payloads","pages":[{"title":"Return","openapi":"webhook Return","href":"/webhook-reference/topics/return-webhook"},{"title":"Return processing","openapi":"webhook ReturnProcessing","href":"/webhook-reference/topics/return-processing-webhook"},{"title":"Label","openapi":"webhook Label","description":null,"href":"/webhook-reference/topics/label-webhook"},{"title":"Label requests","openapi":"webhook LabelRequests","href":"/webhook-reference/topics/label-requests-webhook"},{"title":"Happy Returns Shipment","openapi":"webhook HappyReturnsShipmentProcessed","description":null,"href":"/webhook-reference/topics/happy-returns-shipment-webhook"},{"title":"Gift card","openapi":"webhook GiftCardRequested","href":"/webhook-reference/topics/gift-card-webhook"},{"title":"Restock","openapi":"webhook Restocking","href":"/webhook-reference/topics/restock-webhook"}]}]}]},{"version":"2026-10","default":true,"tabs":[{"tab":"Introduction","pages":[{"title":"Introduction","href":"/welcome"}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/integration-guides/overview"}]},{"tab":"MCP Server","pages":[{"title":"MCP Server","href":"/mcp/overview"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/getting-started"}]},{"tab":"Webhook Reference","groups":[{"group":"Webhook Reference","pages":[{"title":"Getting Started","href":"/webhook-reference/getting-started"},{"title":"Create a webhook subscription","href":"/webhook-reference/setting-up"},{"title":"Validate webhooks from Loop","href":"/webhook-reference/validation"}]},{"group":"Webhook Payloads","pages":[{"title":"Return","openapi":"webhook Return","href":"/webhook-reference/topics/return-webhook"},{"title":"Return processing","openapi":"webhook ReturnProcessing","href":"/webhook-reference/topics/return-processing-webhook"},{"title":"Label","openapi":"webhook Label","description":null,"href":"/webhook-reference/topics/label-webhook"},{"title":"Label requests","openapi":"webhook LabelRequests","href":"/webhook-reference/topics/label-requests-webhook"},{"title":"Ship by Loop shipment","openapi":"webhook ShipByLoopShipment","description":"| Trigger | What it means |\n| ------------------------------------- | ------------------------------------------------------- |\n| `ship-by-loop.services.requested` | A shipment was created that this provider can fulfill. |\n| `ship-by-loop.purchase.requested` | Services have been selected and are ready for purchase. |\n| `ship-by-loop.cancellation.requested` | The shipment was cancelled. |\n\n- **`ship-by-loop.services.requested`**: submit the services this provider can\n offer for the shipment's packages with\n `POST /ship-by-loop/shipments/{shipmentId}/services`. The shopper-facing\n portal polls for a response roughly every 5 seconds, up to 12 times\n (roughly 30-60 seconds total). If nothing arrives in that window, the\n shopper falls back to whichever standard (non-carrier-choice) return\n methods were already available — no error is shown. The API still\n accepts a `POST .../services` call after that window, but the\n portal has stopped polling for it by then, so the shopper who already\n fell back will not see it.\n- **`ship-by-loop.purchase.requested`**: record the resulting purchase, including\n tracking and label details, with\n `POST /ship-by-loop/shipments/{shipmentId}/orders`.\n- **`ship-by-loop.cancellation.requested`**: stop any work in progress for this\n shipment and void/refund any carrier label already purchased. Loop does not\n expect a response beyond the `200` acknowledgement.\n\nAcknowledge every delivery with a `200` response.\n\n### Package field state by trigger\n\n`service`, `label_url`, `qr_code_url`, and `tracking_number` on each\n`packages` entry are populated over the lifetime of a shipment rather\nthan all at once:\n\n| Trigger | `service` | `label_url` | `qr_code_url` | `tracking_number` |\n| --------------------------- | ---------- | ------------ | -------------- | ------------------ |\n| `services.requested` | `null` | `null` | `null` | `null` |\n| `purchase.requested` | set | `null` | `null` | `null` |\n| `cancellation.requested` | see below | see below | see below | see below |\n\n`service` is `null` at `services.requested` (nothing has been chosen\nyet) and always set by `purchase.requested` — Loop only asks a\nprovider to purchase once every package has a service selected.\n`label_url` / `qr_code_url` / `tracking_number` stay `null` through\nboth of those triggers; they're populated only once the provider\ncalls `POST .../orders`, which happens after `purchase.requested` is\nreceived. For `cancellation.requested`, every field reflects whatever\nhad already been recorded before the cancellation — `null` for any of\nthem the provider hadn't gotten to yet.\n","href":"/webhook-reference/topics/ship-by-loop-shipment-webhook"},{"title":"Happy Returns Shipment","openapi":"webhook HappyReturnsShipmentProcessed","href":"/webhook-reference/topics/happy-returns-shipment-webhook"},{"title":"Gift card","openapi":"webhook GiftCardRequested","href":"/webhook-reference/topics/gift-card-webhook"},{"title":"Restock","openapi":"webhook Restocking","href":"/webhook-reference/topics/restock-webhook"}]}]}]},{"version":"unstable","tabs":[{"tab":"Introduction","pages":[{"title":"Introduction","href":"/welcome"}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/integration-guides/overview"}]},{"tab":"MCP Server","pages":[{"title":"MCP Server","href":"/mcp/overview"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/unstable/changes"}]},{"tab":"Webhook Reference","groups":[{"group":"Webhook Reference","pages":[{"title":"Getting Started","href":"/webhook-reference/getting-started"},{"title":"Create a webhook subscription","href":"/webhook-reference/setting-up"},{"title":"Validate webhooks from Loop","href":"/webhook-reference/validation"}]},{"group":"Webhook Payloads","pages":[{"title":"Return","openapi":"webhook Return","href":"/webhook-reference/topics/return-webhook"},{"title":"Return processing","openapi":"webhook ReturnProcessing","href":"/webhook-reference/topics/return-processing-webhook"},{"title":"Label","openapi":"webhook Label","description":null,"href":"/webhook-reference/topics/label-webhook"},{"title":"Label requests","openapi":"webhook LabelRequests","href":"/webhook-reference/topics/label-requests-webhook"},{"title":"Ship by Loop shipment","openapi":"webhook ShipByLoopShipment","description":"| Trigger | What it means |\n| ------------------------------------- | ------------------------------------------------------- |\n| `ship-by-loop.services.requested` | A shipment was created that this provider can fulfill. |\n| `ship-by-loop.purchase.requested` | Services have been selected and are ready for purchase. |\n| `ship-by-loop.cancellation.requested` | The shipment was cancelled. |\n\n- **`ship-by-loop.services.requested`**: submit the services this provider can\n offer for the shipment's packages with\n `POST /ship-by-loop/shipments/{shipmentId}/services`. The shopper-facing\n portal polls for a response roughly every 5 seconds, up to 12 times\n (roughly 30-60 seconds total). If nothing arrives in that window, the\n shopper falls back to whichever standard (non-carrier-choice) return\n methods were already available — no error is shown. The API still\n accepts a `POST .../services` call after that window, but the\n portal has stopped polling for it by then, so the shopper who already\n fell back will not see it.\n- **`ship-by-loop.purchase.requested`**: record the resulting purchase, including\n tracking and label details, with\n `POST /ship-by-loop/shipments/{shipmentId}/orders`.\n- **`ship-by-loop.cancellation.requested`**: stop any work in progress for this\n shipment and void/refund any carrier label already purchased. Loop does not\n expect a response beyond the `200` acknowledgement.\n\nAcknowledge every delivery with a `200` response.\n\n### Package field state by trigger\n\n`service`, `label_url`, `qr_code_url`, and `tracking_number` on each\n`packages` entry are populated over the lifetime of a shipment rather\nthan all at once:\n\n| Trigger | `service` | `label_url` | `qr_code_url` | `tracking_number` |\n| --------------------------- | ---------- | ------------ | -------------- | ------------------ |\n| `services.requested` | `null` | `null` | `null` | `null` |\n| `purchase.requested` | set | `null` | `null` | `null` |\n| `cancellation.requested` | see below | see below | see below | see below |\n\n`service` is `null` at `services.requested` (nothing has been chosen\nyet) and always set by `purchase.requested` — Loop only asks a\nprovider to purchase once every package has a service selected.\n`label_url` / `qr_code_url` / `tracking_number` stay `null` through\nboth of those triggers; they're populated only once the provider\ncalls `POST .../orders`, which happens after `purchase.requested` is\nreceived. For `cancellation.requested`, every field reflects whatever\nhad already been recorded before the cancellation — `null` for any of\nthem the provider hadn't gotten to yet.\n","href":"/webhook-reference/topics/ship-by-loop-shipment-webhook"},{"title":"Happy Returns Shipment","openapi":"webhook HappyReturnsShipmentProcessed","href":"/webhook-reference/topics/happy-returns-shipment-webhook"},{"title":"Gift card","openapi":"webhook GiftCardRequested","href":"/webhook-reference/topics/gift-card-webhook"},{"title":"Restock","openapi":"webhook Restocking","href":"/webhook-reference/topics/restock-webhook"}]}]}]}]},"basePath":"","title":"Label requests - Loop Returns Documentation","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}