An order’s status changes — processing, delivered, returned and everything between.
Keeping your own system, and your customer, current. This is the default.
shipmentError
A shipment fails to be created with the carrier.
Catching the orders that would otherwise sit still. Carries the carrier’s own message.
newOrders
An order arrives in OTO.
Pushing orders onward into a different WMS.
Subscribe to shipmentError even if you subscribe to nothing elseA failed booking is silent by nature: the order does not move, and no status change fires because nothing changed.The payload names the cause — an errorCode, and the carrier’s own words in deliveryCompanyResponse, typically something like a missing city or postcode. Those are fixable in seconds if someone knows, and invisible for days if nobody does.
An orderStatus payload carries the order and its new state, the carrier and driver where there is one, the tracking number and URL, a link to the AWB, and a timestamp in UTC.A shipmentError payload carries the orderId, an errorCode, OTO’s errorMessage and the carrier’s raw deliveryCompanyResponse.A newOrders payload carries the whole order — address, items, weight, totals, payment method, sales channel and warehouse.
Every payload carries a signature: an HMAC-SHA256 over a colon-joined string, base64 encoded, using the secretKey you registered.
Event type
Signed string
orderStatus
orderId:status:timestamp
shipmentError
orderId:errorCode:timestamp
Verify the signature, and reject stale timestampsYour webhook URL is reachable by anyone who learns it. Without verification, anyone who does can tell your system an order was delivered.Recompute the HMAC over the signed string and compare it with a constant-time comparison. Then check the timestamp is recent — a valid signature on an old payload is a replay, and marking yesterday’s order delivered again is the mildest thing it can do.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"OTO Docs","description":"Product documentation for OTO, the ecommerce operations platform and shipping gateway for merchants in Saudi Arabia, the UAE and Türkiye.","colors":{"primary":"#506EFE","light":"#3D5FFF","dark":"#506EFE"},"logo":{"light":"https://mintcdn.com/oto/50MvmFcOsjmCy_H4/images/docs-logo.png?fit=max\u0026auto=format\u0026n=50MvmFcOsjmCy_H4\u0026q=85\u0026s=e77cede9643d5290bd5ff9ef3cd62084","dark":"https://mintcdn.com/oto/CC-n0HhbZXZkyIOY/images/docs-logo-dark.png?fit=max\u0026auto=format\u0026n=CC-n0HhbZXZkyIOY\u0026q=85\u0026s=0eaa761eda10edc1248ec73a7a464915"},"favicon":{"light":"https://mintcdn.com/oto/jqSnxa8fmU8MbKy9/images/oto-logo-51232.png?fit=max\u0026auto=format\u0026n=jqSnxa8fmU8MbKy9\u0026q=85\u0026s=40c563a4988902b756905551f7dfa08e","dark":"https://mintcdn.com/oto/jqSnxa8fmU8MbKy9/images/oto-logo-51232.png?fit=max\u0026auto=format\u0026n=jqSnxa8fmU8MbKy9\u0026q=85\u0026s=40c563a4988902b756905551f7dfa08e"},"background":{"color":{"light":"#F5F7F9","dark":"#111111"}},"navbar":{"links":[{"href":"https://tryoto.com","label":"Home"},{"href":"https://support.tryoto.com","label":"Help center"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.tryoto.com"}},"seo":{"organization":{"id":"https://tryoto.com/#organization","name":"OTO","url":"https://tryoto.com","logo":"https://docs.tryoto.com/images/oto-logo-51232.png","sameAs":["https://www.linkedin.com/company/tryotocom","https://x.com/tryotocom","https://www.instagram.com/tryotocom","https://www.facebook.com/tryotocom","https://www.youtube.com/@tryotocom"]}},"fonts":{"family":"Ping ARLT Regular","source":"https://storage.googleapis.com/tryoto-public/public/assets/fonts/PingARLT-Regular.woff2","format":"woff2"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","href":""},{"language":"ar","navbar":{"links":[{"href":"https://tryoto.com","label":"الرئيسية"},{"href":"https://support.tryoto.com/ar","label":"مركز المساعدة"}],"primary":{"type":"button","label":"لوحة التحكم","href":"https://app.tryoto.com"}},"href":"ar"},{"language":"tr","navbar":{"links":[{"href":"https://tryoto.com","label":"Anasayfa"},{"href":"https://support.tryoto.com/tr","label":"Yardım Merkezi"}],"primary":{"type":"button","label":"Gösterge Paneli","href":"https://app.tryoto.com"}},"href":"tr"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"oto","hasAudioNarration":false,"actualSubdomain":"oto","customDomains":["docs.tryoto.com"],"gitSource":{"type":"github","owner":"otoglobal","repo":"oto-docs","deployBranch":"master","contentDirectory":"","isPrivate":true,"mountPath":"","label":"","_id":"6ad8ce8fad82cbcc460c882d"},"chroma":{"latestBuiltDeploymentHistoryId":"6addbb84b128bc39b5e5b942","collectionId":"d72dffa9-51ec-43cf-8cd6-cc0c06f5df60","liveDeploymentHistoryId":"6addbb84b128bc39b5e5b942","schemaVersion":"v3"},"feedback":{"thumbs":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6addbb84b128bc39b5e5b942","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"ar","tag":"الأنظمة","count":43},{"language":"en","tag":"Modules","count":43},{"language":"tr","tag":"Modüller","count":43},{"language":"ar","tag":"عمليات الربط","count":8},{"language":"en","tag":"Integrations","count":8},{"language":"tr","tag":"Entegrasyonlar","count":8},{"language":"ar","tag":"المطورون","count":6},{"language":"ar","tag":"البدء","count":6},{"language":"ar","tag":"إشعارات العملاء","count":6},{"language":"ar","tag":"إدارة المخزون","count":6},{"language":"ar","tag":"OMS متعدد القنوات","count":6},{"language":"en","tag":"Developers","count":6},{"language":"en","tag":"Get started","count":6},{"language":"en","tag":"Customer Notification","count":6},{"language":"en","tag":"Inventory Management","count":6},{"language":"en","tag":"Omnichannel OMS","count":6},{"language":"tr","tag":"Geliştiriciler","count":6},{"language":"tr","tag":"Başlarken","count":6},{"language":"tr","tag":"Müşteri Bildirimleri","count":6},{"language":"tr","tag":"Envanter Yönetimi","count":6},{"language":"tr","tag":"Omnichannel OMS","count":6},{"language":"ar","tag":"OTO FLEX","count":5},{"language":"ar","tag":"إدارة الشحن","count":5},{"language":"ar","tag":"إدارة المستودعات","count":5},{"language":"en","tag":"OTO FLEX","count":5},{"language":"en","tag":"Shipping Management","count":5},{"language":"en","tag":"Warehouse Management","count":5},{"language":"tr","tag":"OTO FLEX","count":5},{"language":"tr","tag":"Kargo Yönetimi","count":5},{"language":"tr","tag":"Depo Yönetimi","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"rtl.css","content":":is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #navbar button.lg\\:hidden>div+div,:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#content-area, #page-title, #header, #table-of-contents, #sidebar-content, #mobile-nav, #pagination, #footer),:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=menu]{direction:rtl;text-align:right}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area ul{padding-left:0;padding-right:0}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area ul>li{padding-left:0;padding-right:2rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area ul>li::before{left:auto;right:.5rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area blockquote{border-left:0;border-right:.25rem solid currentColor;padding-left:0;padding-right:1em}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area :is(table, th, td){text-align:right}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area :is(pre, code, .code-block, .code-group, .frame svg, [data-badge]){direction:ltr;unicode-bidi:isolate;text-align:left}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #mobile-nav #localization-select-trigger svg,:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #page-context-menu.ml-auto,:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #pagination [data-component-part=pagination-next]{margin-left:0;margin-right:auto}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #page-context-menu-button{border-radius:0 var(--radius-xl, 0.75rem) var(--radius-xl, 0.75rem) 0;border-left-width:0;border-right-width:1px}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #page-context-menu-button+button{border-radius:var(--radius-xl, 0.75rem) 0 0 var(--radius-xl, 0.75rem)}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #navbar button.lg\\:hidden>div+div svg,:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=menuitem] .font-medium>svg{scale:-1 1}@media (min-width:1024px){:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]):has(#page-context-menu button[aria-expanded=true]) [role=menu][data-align=end]{translate:calc(100% - var(--anchor-width, 0px)) 0;transform-origin:0 -4px}}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area em{unicode-bidi:plaintext}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area :is(h1, h2, h3, h4, h5, h6)>.absolute>a{display:none}@media (min-width:1024px){:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area :is(h1, h2, h3, h4, h5, h6)>.absolute>a{display:flex;margin-left:0;translate:2.5rem 0}}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #sidebar-content>div{padding-right:0;padding-left:2rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) .sidebar-group-header{padding-left:0;padding-right:1rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) :is(a, button)[style*=padding-left]{padding-left:.75rem!important;text-align:right}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) :is(a, button):is([style*=\"padding-left:1rem\"], [style*=\"padding-left: 1rem\"]){padding-right:1rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) :is(a, button):is([style*=\"padding-left:1.75rem\"], [style*=\"padding-left: 1.75rem\"]){padding-right:1.75rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) :is(a, button):is([style*=\"padding-left:2.5rem\"], [style*=\"padding-left: 2.5rem\"]){padding-right:2.5rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) button[aria-expanded]:not([aria-haspopup]) svg{margin-right:0;margin-left:-.125rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) :is(#sidebar-content, #mobile-nav) button[aria-expanded=false]:not([aria-haspopup]) svg{scale:-1 1}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #table-of-contents a{padding-left:0;padding-right:calc(var(--toc-padding-left, 0rem) + var(--toc-focus-padding, 0rem))}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #pagination [data-component-part=pagination-prev] svg{rotate:180deg}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #pagination [data-component-part=pagination-next] svg{rotate:none}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=dialog]:has(#topbar-cta-button){direction:rtl;text-align:right}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=dialog]:has(#topbar-cta-button)>button{right:auto;left:.375rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) [role=dialog]:has(#topbar-cta-button) li:first-child>a{padding-left:30px;padding-right:.75rem}@media (min-width:1024px){:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #navbar{direction:rtl}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #topbar-cta-button svg{scale:-1 1}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) div:has(>#sidebar){flex-direction:row-reverse}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-container>div:has(>#content-area){flex-direction:row}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #content-area{padding-left:.25rem;padding-right:5.7rem;margin-left:0;margin-right:-3rem}:is(html[data-current-path=\"/ar\"], html[data-current-path^=\"/ar/\"]) #table-of-contents-layout{padding-left:0;padding-right:2.5rem}}"}],"page":{"pagePath":"developers/webhook-events","slug":"/developers/webhook-events","pageMetadata":{"title":"Webhook events and payloads","sidebarTitle":"Webhook events","description":"Register a webhook with the OTO API, see what each of the three event types sends, verify HMAC-SHA256 signatures, and build an endpoint that holds up.","href":"/developers/webhook-events"},"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: \"Register a webhook with the OTO API, see what each of the three event types sends, verify HMAC-SHA256 signatures, and build an endpoint that holds up.\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Badge,Heading,Table,Tip,Warning}=_components;if(!Badge)_missingMdxReference(`Badge`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`A webhook turns the integration around. Instead of asking OTO what happened every few minutes, you host a URL and OTO tells you.`}),`\n`,_jsx(Heading,{level:`2`,id:`the-three-event-types`,children:`The three event types`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Fires when`}),_jsx(_components.th,{children:`Use it for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`orderStatus`})}),_jsx(_components.td,{children:`An order’s status changes — processing, delivered, returned and everything between.`}),_jsx(_components.td,{children:`Keeping your own system, and your customer, current. This is the default.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`shipmentError`})}),_jsx(_components.td,{children:`A shipment fails to be created with the carrier.`}),_jsx(_components.td,{children:`Catching the orders that would otherwise sit still. Carries the carrier’s own message.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`newOrders`})}),_jsx(_components.td,{children:`An order arrives in OTO.`}),_jsx(_components.td,{children:`Pushing orders onward into a different WMS.`})]})]})]}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Subscribe to shipmentError even if you subscribe to nothing else`})}),_jsx(_components.p,{children:`A failed booking is silent by nature: the order does not move, and no status change fires because nothing changed.`}),_jsxs(_components.p,{children:[`The payload names the cause — an `,_jsx(_components.code,{children:`errorCode`}),`, and the carrier’s own words in `,_jsx(_components.code,{children:`deliveryCompanyResponse`}),`, typically something like a missing city or postcode. Those are fixable in seconds if someone knows, and invisible for days if nobody does.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`registering-one`,children:`Registering one`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /rest/v2/webhook`}),` `,_jsx(Badge,{children:`Starter+`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`url`})}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Your endpoint.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`method`})}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`POST`}),` or `,_jsx(_components.code,{children:`PUT`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`webhookType`})}),_jsx(_components.td,{children:`No`}),_jsxs(_components.td,{children:[`One of the three above. Defaults to `,_jsx(_components.code,{children:`orderStatus`}),` and `,_jsx(_components.code,{children:`newOrders`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`secretKey`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`The shared secret the payload signature is computed with.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`authorizationKey`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`A token sent with the request so your endpoint can reject anything else.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`timestampFormat`})}),_jsx(_components.td,{children:`No`}),_jsxs(_components.td,{children:[`The timestamp format you want, e.g. `,_jsx(_components.code,{children:`yyyy-MM-dd HH:mm:ss`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`orderPrefix`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`A prefix to strip from order IDs before sending, if OTO’s IDs carry one your system does not expect.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GET`}),` lists your subscriptions, `,_jsx(_components.code,{children:`PUT`}),` updates one by `,_jsx(_components.code,{children:`id`}),`, and `,_jsx(_components.code,{children:`DELETE`}),` removes it. All at the same path.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-arrives`,children:`What arrives`}),`\n`,_jsxs(_components.p,{children:[`An `,_jsx(_components.code,{children:`orderStatus`}),` payload carries the order and its new state, the carrier and driver where there is one, the tracking number and URL, a link to the AWB, and a `,_jsx(_components.code,{children:`timestamp`}),` in `,_jsx(_components.strong,{children:`UTC`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.code,{children:`shipmentError`}),` payload carries the `,_jsx(_components.code,{children:`orderId`}),`, an `,_jsx(_components.code,{children:`errorCode`}),`, OTO’s `,_jsx(_components.code,{children:`errorMessage`}),` and the carrier’s raw `,_jsx(_components.code,{children:`deliveryCompanyResponse`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.code,{children:`newOrders`}),` payload carries the whole order — address, items, weight, totals, payment method, sales channel and warehouse.`]}),`\n`,_jsx(Heading,{level:`2`,id:`verifying-that-it-came-from-oto`,children:`Verifying that it came from OTO`}),`\n`,_jsxs(_components.p,{children:[`Every payload carries a `,_jsx(_components.code,{children:`signature`}),`: an `,_jsx(_components.strong,{children:`HMAC-SHA256`}),` over a colon-joined string, base64 encoded, using the `,_jsx(_components.code,{children:`secretKey`}),` you registered.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event type`}),_jsx(_components.th,{children:`Signed string`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`orderStatus`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`orderId:status:timestamp`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`shipmentError`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`orderId:errorCode:timestamp`})})]})]})]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Verify the signature, and reject stale timestamps`})}),_jsx(_components.p,{children:`Your webhook URL is reachable by anyone who learns it. Without verification, anyone who does can tell your system an order was delivered.`}),_jsx(_components.p,{children:`Recompute the HMAC over the signed string and compare it with a constant-time comparison. Then check the timestamp is recent — a valid signature on an old payload is a replay, and marking yesterday’s order delivered again is the mildest thing it can do.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`building-an-endpoint-that-holds-up`,children:`Building an endpoint that holds up`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Answer immediately.`}),` Return 200 as soon as you have the payload, and do the work afterwards. A slow endpoint looks like a broken one.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Expect duplicates.`}),` Deliveries can repeat. Key on `,_jsx(_components.code,{children:`orderId`}),` plus status plus timestamp and make reprocessing harmless.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Expect them out of order.`}),` Network timing does not respect your state machine. Never move an order backwards because an older event arrived late.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Log the raw body before parsing it.`}),` When an integration misbehaves at 2am, the payload you did not keep is the one you needed.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`related`,children:`Related`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/developers/authentication`,children:`Authentication`}),` — tokens and the sandbox.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/modules/sales-channels/updates`,children:`Status and tracking updates`}),` — the same events, pushed to a sales channel instead.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/developers/rest-api-reference`,children:`Endpoint index`}),` — everything else.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Webhook events and payloads","sidebarTitle":"Webhook events","description":"Register a webhook with the OTO API, see what each of the three event types sends, verify HMAC-SHA256 signatures, and build an endpoint that holds up.","href":"/developers/webhook-events"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"The three event types","slug":"the-three-event-types","depth":2,"children":[]},{"title":"Registering one","slug":"registering-one","depth":2,"children":[]},{"title":"What arrives","slug":"what-arrives","depth":2,"children":[]},{"title":"Verifying that it came from OTO","slug":"verifying-that-it-came-from-oto","depth":2,"children":[]},{"title":"Building an endpoint that holds up","slug":"building-an-endpoint-that-holds-up","depth":2,"children":[]},{"title":"Related","slug":"related","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/oto/5e4908087dc78be6/adsping.js"],"subdomain":"oto","siteName":"OTO Docs","title":"Webhook events and payloads - OTO Docs","relatedPagesConfig":{"enabled":true,"limit":3,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/developers/webhook-events","matchLevel":0},"ar":{"href":"/ar/developers/webhook-events","matchLevel":1},"tr":{"href":"/tr/developers/webhook-events","matchLevel":1}}},"lastModified":"2026-10-22T15:40:13.905Z","originalFileLocation":"developers/webhook-events.mdx","locale":"en"},"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=\"Register a webhook with the OTO API, see what each of the three event types sends, verify HMAC-SHA256 signatures, and build an endpoint that holds up.\">\u003cmeta data-mint-head name=\"application-name\" content=\"OTO 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/oto/S_K-Ar2SQPcQI6e_/_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/oto/S_K-Ar2SQPcQI6e_/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/oto/S_K-Ar2SQPcQI6e_/_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/oto/S_K-Ar2SQPcQI6e_/_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/oto/S_K-Ar2SQPcQI6e_/_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/oto/S_K-Ar2SQPcQI6e_/_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/oto/S_K-Ar2SQPcQI6e_/_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/oto/S_K-Ar2SQPcQI6e_/_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/oto/S_K-Ar2SQPcQI6e_/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Webhook events and payloads - OTO Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Register a webhook with the OTO API, see what each of the three event types sends, verify HMAC-SHA256 signatures, and build an endpoint that holds up.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OTO Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tryoto.com/developers/webhook-events\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://oto.mintlify.app/_mintlify/api/og/v2?division=Developers\u0026amp;title=Webhook+events+and+payloads\u0026amp;description=Register+a+webhook+with+the+OTO+API%2C+see+what+each+of+the+three+event+types+sends%2C+verify+HMAC-SHA256+signatures%2C+and+build+an+endpoint+that+holds+up.\u0026amp;theme=fb0540dacc0ff6c761581805\u0026amp;signature=b8ab9e9ab7f63f7a2abdd147d73b80c79a8f3b758043cad381b95fe51ef70e80\">\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=\"Webhook events and payloads - OTO Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Register a webhook with the OTO API, see what each of the three event types sends, verify HMAC-SHA256 signatures, and build an endpoint that holds up.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://oto.mintlify.app/_mintlify/api/og/v2?division=Developers\u0026amp;title=Webhook+events+and+payloads\u0026amp;description=Register+a+webhook+with+the+OTO+API%2C+see+what+each+of+the+three+event+types+sends%2C+verify+HMAC-SHA256+signatures%2C+and+build+an+endpoint+that+holds+up.\u0026amp;theme=fb0540dacc0ff6c761581805\u0026amp;signature=b8ab9e9ab7f63f7a2abdd147d73b80c79a8f3b758043cad381b95fe51ef70e80\">\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/oto/S_K-Ar2SQPcQI6e_/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OTO Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#506EFE\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tryoto.com/developers/webhook-events\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/developers/webhook-events.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.tryoto.com/developers/webhook-events\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ar\" href=\"https://docs.tryoto.com/ar/developers/webhook-events\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"tr\" href=\"https://docs.tryoto.com/tr/developers/webhook-events\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.tryoto.com/developers/webhook-events\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://tryoto.com/#organization\",\"name\":\"OTO\",\"url\":\"https://tryoto.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs.tryoto.com/images/oto-logo-51232.png\"},\"sameAs\":[\"https://www.linkedin.com/company/tryotocom\",\"https://x.com/tryotocom\",\"https://www.instagram.com/tryotocom\",\"https://www.facebook.com/tryotocom\",\"https://www.youtube.com/@tryotocom\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tryoto.com#website\",\"name\":\"OTO Docs\",\"url\":\"https://docs.tryoto.com\",\"publisher\":{\"@id\":\"https://tryoto.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tryoto.com/developers/webhook-events#webpage\",\"url\":\"https://docs.tryoto.com/developers/webhook-events\",\"name\":\"Webhook events and payloads\",\"description\":\"Register a webhook with the OTO API, see what each of the three event types sends, verify HMAC-SHA256 signatures, and build an endpoint that holds up.\",\"dateModified\":\"2026-10-22T15:40:13.905Z\",\"isPartOf\":{\"@id\":\"https://docs.tryoto.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tryoto.com/developers/webhook-events#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tryoto.com/developers/webhook-events#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Developers\",\"item\":\"https://docs.tryoto.com/developers/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webhook events and payloads\",\"item\":\"https://docs.tryoto.com/developers/webhook-events\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.tryoto.com/developers/webhook-events#article\",\"headline\":\"Webhook events and payloads\",\"name\":\"Webhook events and payloads\",\"description\":\"Register a webhook with the OTO API, see what each of the three event types sends, verify HMAC-SHA256 signatures, and build an endpoint that holds up.\",\"url\":\"https://docs.tryoto.com/developers/webhook-events\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tryoto.com/developers/webhook-events#webpage\"},\"dateModified\":\"2026-10-22T15:40:13.905Z\",\"publisher\":{\"@id\":\"https://tryoto.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tryoto.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OTO Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OTO Docs","nav":{"global":null,"languages":[{"language":"en","pages":[{"group":"Get started","pages":[{"title":"Ecommerce operations platform and shipping gateway","sidebarTitle":"Home","href":""},{"title":"What is OTO","href":"/get-started/what-is-oto"},{"title":"Core concepts: orders, shipments, stock and hubs","sidebarTitle":"Core concepts","href":"/get-started/core-concepts"},{"title":"Platform architecture","href":"/get-started/architecture"},{"title":"Quick start: ship your first order with OTO","sidebarTitle":"Quick start","href":"/get-started/quickstart"},{"title":"Glossary of OTO terms","sidebarTitle":"Glossary","href":"/get-started/glossary"}]},{"group":"Modules","pages":[{"group":"Omnichannel OMS","pages":[{"title":"Omnichannel OMS","sidebarTitle":"Overview","href":"/modules/omnichannel-oms/overview"},{"title":"Order sync: how orders get into OTO","sidebarTitle":"Order Sync","href":"/modules/omnichannel-oms/order-sync"},{"title":"Order routing across warehouses and stores","sidebarTitle":"Order Routing","href":"/modules/omnichannel-oms/order-routing"},{"title":"Address and data correction","href":"/modules/omnichannel-oms/order-data-correction"},{"title":"Pre-fulfillment checks","href":"/modules/omnichannel-oms/prefulfillment"},{"title":"Order fulfillment in warehouses and stores","sidebarTitle":"Order Fulfillment","href":"/modules/omnichannel-oms/order-fulfillment"}]},{"group":"Sales Channels","pages":[{"title":"Sales Channels","sidebarTitle":"Overview","href":"/modules/sales-channels/overview"},{"title":"Connect and sync a sales channel","sidebarTitle":"Channel sync","href":"/modules/sales-channels/sync"},{"title":"Sync order status and tracking to your store","sidebarTitle":"Status and tracking updates","href":"/modules/sales-channels/updates"},{"title":"Checkout API for live shipping rates","sidebarTitle":"Checkout API","href":"/modules/sales-channels/checkout-api"}]},{"group":"Shipping Management","pages":[{"title":"Shipping Management","sidebarTitle":"Overview","href":"/modules/shipping-management/overview"},{"title":"Carrier integration and configuration","sidebarTitle":"Carrier Integration","href":"/modules/shipping-management/carrier-integration"},{"title":"Create shipments, print labels and track parcels","sidebarTitle":"Shipping \u0026 Tracking","href":"/modules/shipping-management/shipping-and-tracking"},{"title":"Shipping automation and carrier selection rules","sidebarTitle":"Shipping Automation","href":"/modules/shipping-management/shipping-automation"},{"title":"Shipping Invoices Reconciliation","href":"/modules/shipping-management/shipping-invoices-reconciliation"}]},{"group":"Return Management","pages":[{"title":"Return Management","sidebarTitle":"Overview","href":"/modules/return-management/overview"},{"title":"Return portal and customer return requests","sidebarTitle":"Customer returns","href":"/modules/return-management/customer-returns"},{"title":"Receiving and inspecting returns","sidebarTitle":"Returns receiving","href":"/modules/return-management/returns-receiving"},{"title":"Return automation rules","sidebarTitle":"Return automation","href":"/modules/return-management/return-automation"}]},{"group":"Hubs Management","pages":[{"title":"Hubs Management","sidebarTitle":"Overview","href":"/modules/hubs-management/overview"},{"title":"Add and configure warehouses and branches","sidebarTitle":"Hub configuration","href":"/modules/hubs-management/hubs-management"}]},{"group":"Customer Notification","pages":[{"title":"Customer Notification","sidebarTitle":"Overview","href":"/modules/customer-notification/overview"},{"title":"Branded tracking and confirmation pages","sidebarTitle":"Branded pages","href":"/modules/customer-notification/branded-pages"},{"title":"SMS notifications","sidebarTitle":"SMS","href":"/modules/customer-notification/sms"},{"title":"Email notifications","sidebarTitle":"Email","href":"/modules/customer-notification/email"},{"title":"WhatsApp notifications","sidebarTitle":"WhatsApp","href":"/modules/customer-notification/whatsapp"},{"title":"Custom notification workflows","sidebarTitle":"Custom workflows","href":"/modules/customer-notification/custom-workflows"}]},{"group":"Warehouse Management","pages":[{"title":"Warehouse Management","sidebarTitle":"Overview","href":"/modules/warehouse-management/overview"},{"title":"OTO PACK mobile app for warehouse staff","sidebarTitle":"The OTO PACK app","href":"/modules/warehouse-management/ops"},{"title":"Warehouse picking methods and waves","sidebarTitle":"Picking methods","href":"/modules/warehouse-management/picking-methods"},{"title":"Packing and dispatch","href":"/modules/warehouse-management/packing-dispatch"},{"title":"Inbound and putaway","href":"/modules/warehouse-management/inbound-putaway"}]},{"group":"Inventory Management","pages":[{"title":"Inventory Management","sidebarTitle":"Overview","href":"/modules/inventory-management/overview"},{"title":"Inventory tracking","href":"/modules/inventory-management/inventory-tracking"},{"title":"Inbound inventory","href":"/modules/inventory-management/inbound-inventory"},{"title":"Sync inventory to your sales channels","sidebarTitle":"Inventory sync","href":"/modules/inventory-management/inventory-sync"},{"title":"Product catalog and SKU configuration","sidebarTitle":"Product configuration","href":"/modules/inventory-management/product-configuration"},{"title":"Inventory counts in the OTO PACK app","sidebarTitle":"Inventory counts","href":"/modules/inventory-management/inventory-count"}]},{"group":"OTO FLEX","pages":[{"title":"OTO FLEX: delivery with your own drivers","sidebarTitle":"Overview","href":"/modules/oto-flex/overview"},{"title":"Driver and fleet management","sidebarTitle":"Fleet Management","href":"/modules/oto-flex/fleet-management"},{"title":"Delivery planning and driver assignment","sidebarTitle":"Planning","href":"/modules/oto-flex/planning"},{"title":"Driver pickup in OTO FLEX","sidebarTitle":"Pickup","href":"/modules/oto-flex/pickup"},{"title":"Last-mile delivery in OTO FLEX","sidebarTitle":"Delivery","href":"/modules/oto-flex/delivery"}]}]},{"group":"Integrations","pages":[{"title":"Integrations overview","href":"/integrations/overview"},{"title":"Sales channel integrations","sidebarTitle":"Sales channels","href":"/integrations/sales-channels"},{"title":"Marketplace integrations","sidebarTitle":"Marketplaces","href":"/integrations/marketplaces"},{"title":"ERP integrations","sidebarTitle":"ERP systems","href":"/integrations/erp-systems"},{"title":"POS integrations","sidebarTitle":"POS systems","href":"/integrations/pos-systems"},{"title":"Carrier integrations","sidebarTitle":"Carriers","href":"/integrations/carriers"},{"title":"SMS, email and WhatsApp providers","sidebarTitle":"Messaging providers","href":"/integrations/messaging-providers"},{"title":"Webhooks for real-time updates","sidebarTitle":"Webhooks","href":"/integrations/webhooks"}]},{"group":"Developers","pages":[{"title":"OTO API overview","sidebarTitle":"Developers overview","href":"/developers/overview"},{"title":"API authentication","sidebarTitle":"Authentication","href":"/developers/authentication"},{"title":"REST API reference","description":"All 76 OTO REST API endpoints in 20 groups, with what each one does and the lowest plan that includes it. Full schemas are on apis.tryoto.com.","href":"/developers/rest-api-reference"},{"title":"Webhook events and payloads","sidebarTitle":"Webhook events","href":"/developers/webhook-events"},{"title":"OTO API Postman collection","sidebarTitle":"Postman collection","description":"Call the OTO API from Postman against the sandbox before you write code, with a ten-minute first run from access token to first request.","href":"/developers/postman-collection"},{"title":"API errors and rate limits","sidebarTitle":"Errors \u0026 rate limits","href":"/developers/errors-and-rate-limits"}]},{"group":"Platform","pages":[{"title":"Security \u0026 compliance","href":"/platform/security-and-compliance"},{"title":"Users, roles \u0026 permissions","href":"/platform/users-roles-and-permissions"},{"title":"Localization: languages, currency and time zones","sidebarTitle":"Localization","href":"/platform/localization"},{"title":"Collaboration \u0026 notifications","href":"/platform/collaboration-and-notifications"},{"title":"Platform announcements","sidebarTitle":"Announcements","href":"/platform/announcements"}]},{"group":"Pricing","pages":[{"title":"Plans, pricing and add-ons","sidebarTitle":"Plans \u0026 packaging","href":"/pricing/plans-and-packaging"}]}]},{"language":"ar","navbar":{"links":[{"href":"https://tryoto.com","label":"الرئيسية"},{"href":"https://support.tryoto.com/ar","label":"مركز المساعدة"}],"primary":{"type":"button","label":"لوحة التحكم","href":"https://app.tryoto.com"}},"pages":[{"title":"ar","href":"/ar/developers/webhook-events"}]},{"language":"tr","navbar":{"links":[{"href":"https://tryoto.com","label":"Anasayfa"},{"href":"https://support.tryoto.com/tr","label":"Yardım Merkezi"}],"primary":{"type":"button","label":"Gösterge Paneli","href":"https://app.tryoto.com"}},"pages":[{"title":"tr","href":"/tr/developers/webhook-events"}]}]},"title":"Webhook events and payloads - OTO Docs","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":[],"chunks":[]}