Delivery Hero Callback API

**▶️ READ THIS FIRST ◀️** * Those are NOT actual endpoints. They are callback from ODR to your endpoint * This is used to represent the payload ODR will sent * This is an optional feature and it requires your callback URL to be registered with your ClientID --- **Description** * The Callback URL will need to be HTTPS with a valid SSL certificate. * Body posted by this feature is stripped of any Personally Identifiable Information (PII). * Full Order body can be fetched using the Get Specific Order feature. * If there is an error, we retry sending the request three times. If the response status code is 2xx, it means that there was no error and the callback was successful in sending order status.

Operations 3

POST /callback Order Status callback
POST /callback-location Courier location update
POST /callback-refund Refund callback

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/delivery-hero-callback-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

delivery-hero-callback-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  version: 1.1.1
  title: On Demand Rider Authentication Callback API
  x-logo:
    url: data:image/svg+xml,%3Csvg width='173' height='28' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform='translate(-64 -15)' fill='none' fill-rule='evenodd'%3E%3Cpath d='M0 0h1350v60H0z'%3E%3C/path%3E%3Cpath d='M0 0h1350v60H0z'%3E%3C/path%3E%3Cg transform='translate(64 15)' fill='%23D61F26'%3E%3Cpath d='M32.18 13.383l-.021.012-3.754 1.531-.115.053-.915 4.18c-.061.143-.244.177-.367.058l-2.735-3.234-.013-.01-15.423 6.618a.103.103 0 01-.104-.176l13.333-9.98-1.687-3.852c-.084-.175.071-.362.277-.31h.002l4.086 1.006 3.172-2.823c.137-.107.323-.03.358.14l.31 4.241 3.658 2.141c.157.1.134.332-.062.405zM30.316 1.258C25.582-.6 20.376.795 17.164 4.365L4.63 17.793c-.169.181-.09.408.115.438l3.34.205c.267.017.3.247.166.404L.086 27.646c-.142.152.03.392.224.332l11.656-3.683c.246-.085.436.135.332.328l-1.56 2.756c-.08.157.071.372.267.358l16.804-3.743c4.015-.636 7.6-3.316 9.193-7.374 2.4-6.09-.598-12.967-6.686-15.362z'%3E%3C/path%3E%3Cpath d='M75.362 21.69h-3.829L74.53 7.658l4.176-1.535-3.343 15.565'%3E%3C/path%3E%3Cpath d='M67.138 13.653c-.917 0-1.444.759-1.658 1.638 1.813 0 2.362-.566 2.362-1.036 0-.33-.295-.602-.704-.602m-2.087 4.096c-.02.096-.04.274-.04.37 0 .625.428.84 1.562.84 1.013 0 2.456-.255 3.297-.546v2.868c-1.073.39-2.753.603-4.1.603-3.16 0-4.682-.859-4.682-3.725 0-2.814 1.307-7.201 6.344-7.201 3.198 0 4.153 1.445 4.153 2.968 0 1.97-1.696 3.647-6.534 3.823'%3E%3C/path%3E%3Cpath d='M82.316 10.455c-1.305 0-2.145-.839-2.145-1.99 0-1.503 1.054-2.341 2.359-2.341 1.328 0 2.148.838 2.148 1.97 0 1.522-1.034 2.361-2.362 2.361'%3E%3C/path%3E%3Cpath d='M79.63 11.31h3.94l-1.992 10.224h-3.98L79 14.354'%3E%3C/path%3E%3Cpath d='M94.925 11.31c-1.367 3.435-2.87 6.79-4.78 10.224h-4.88c-.623-3.24-.898-6.654-.818-10.224h3.981a47.373 47.373 0 00.036 4.994c.021.43.061.838.099 1.251h.022c.174-.413.368-.82.545-1.251.682-1.68 1.306-3.51 1.777-4.994h4.018'%3E%3C/path%3E%3Cpath d='M100.252 13.653c-.915 0-1.445.759-1.661 1.638 1.817 0 2.363-.566 2.363-1.036 0-.33-.29-.602-.702-.602m-2.086 4.096a2.33 2.33 0 00-.042.37c0 .625.431.84 1.561.84 1.016 0 2.46-.255 3.299-.546v2.868c-1.074.39-2.752.603-4.097.603-3.163 0-4.684-.859-4.684-3.725 0-2.814 1.306-7.201 6.341-7.201 3.2 0 4.155 1.445 4.155 2.968 0 1.97-1.694 3.647-6.533 3.823'%3E%3C/path%3E%3Cpath d='M112.351 14.92a4.396 4.396 0 00-.957-.12c-.879 0-1.581.88-1.895 2.5l-.816 4.235H104.7l1.993-10.224h2.987l.096 1.363c.916-1.13 1.64-1.716 2.752-1.716.506 0 .78.039.915.078l-1.091 3.883'%3E%3C/path%3E%3Cpath d='M124.799 11.31c-1.758 4.567-3.318 7.902-4.88 10.207-2.262 3.376-4.254 4.157-6.304 4.157-.605 0-1.247-.16-1.561-.314l.626-2.947h1.366c.683 0 .974-.275 1.424-.879-.761-2.75-1.133-6.594-1.094-10.224h4.002a44.95 44.95 0 00.039 4.936c.02.448.056.878.095 1.309h.02c.177-.413.37-.82.547-1.27a50.015 50.015 0 001.736-4.975h3.984'%3E%3C/path%3E%3Cpath d='M140.1 21.534h-4.2l.997-5.153h-3.553l-.997 5.153h-4.192l2.652-13.62h4.197l-.955 4.86h3.551l.957-4.86h4.193l-2.651 13.62'%3E%3C/path%3E%3Cpath d='M148.37 13.653c-.918 0-1.442.759-1.658 1.638 1.815 0 2.364-.566 2.364-1.036 0-.33-.296-.602-.706-.602m-2.088 4.096a2.32 2.32 0 00-.037.37c0 .625.43.84 1.559.84 1.016 0 2.46-.255 3.299-.546v2.868c-1.073.39-2.752.603-4.1.603-3.16 0-4.682-.859-4.682-3.725 0-2.814 1.307-7.201 6.342-7.201 3.2 0 4.158 1.445 4.158 2.968 0 1.97-1.7 3.647-6.539 3.823'%3E%3C/path%3E%3Cpath d='M160.467 14.92a4.333 4.333 0 00-.954-.12c-.877 0-1.581.88-1.893 2.5l-.82 4.235h-3.979l1.988-10.224h2.985l.1 1.363c.916-1.13 1.637-1.716 2.748-1.716.51 0 .782.039.92.078l-1.095 3.883'%3E%3C/path%3E%3Cpath d='M167.006 14.1c-1.6 0-2.03 2.44-2.03 3.533 0 .877.37 1.13 1.095 1.13 1.577 0 1.988-2.44 1.988-3.55 0-.858-.35-1.113-1.053-1.113m-1.485 7.784c-3.102 0-4.622-1.327-4.622-3.98 0-2.947 1.462-6.946 6.615-6.946 3.084 0 4.624 1.366 4.624 3.982 0 3.005-1.464 6.944-6.617 6.944'%3E%3C/path%3E%3Cpath d='M52.543 18.294h-.781l1.404-7.182h1.095c1.657 0 2.262.98 2.262 2.323 0 2.715-1.504 4.86-3.98 4.86m3.719-6.928l2.652-2.545c-1.035-.623-2.455-.908-4.227-.908h-5.073l-2.651 13.621h5.289c6.144 0 8.601-4.293 8.601-8.76 0-1.161-.25-2.09-.732-2.81l-3.86 1.402'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E
    altText: Delivery Hero
    backgroundColor: '#FFFFFF'
  description: "# About\nThe On Demand Rider (ODR) API provides system-to-system integration to facilitate on-demand courier delivery service requests.\nEach integration is scoped as a specific Brand using a ClientID.\nEach delivery request will be called an Order.\nThe ODR API is supporting the following products:\n\n<div style=\"display:flex;flex-wrap:wrap;gap:24px;margin-top:16px;align-items:center;\">\n  <img src=\"https://ondemand-am.glovoapp.com/static/media/glovo.17586205.svg\" alt=\"Glovo On-Demand\" title=\"Glovo On-Demand\" width=\"69\" height=\"32\" style=\"display:block;\"/>\n  <img src=\"https://gostation-hs.com/static/media/hunger_station.f449899a.svg\" alt=\"Gostation\" title=\"Gostation\" width=\"53\" height=\"32\" style=\"display:block;\"/>\n  <img src=\"https://bh.talabatodr.com/static/media/talabat.f5d13720.svg\" alt=\"Talabat Express\" title=\"Talabat Express\" width=\"253\" height=\"32\" style=\"display:block;\"/>\n  <img src=\"https://foodylastmile.com.cy/static/media/foody.7248ff46.png\" alt=\"Foody\" title=\"Foody\" width=\"71\" height=\"32\" style=\"display:block;\"/>\n  <img src=\"https://efoodlastmile.gr/static/media/efood.133fbc82.png\" alt=\"efood\" title=\"efood\" width=\"100\" height=\"32\" style=\"display:block;\"/>\n  <img src=\"https://pandago-bd.com/static/media/pandago_logo_pink.b4f1964c.svg\" alt=\"pandago\" title=\"pandago\" width=\"131\" height=\"32\" style=\"display:block;\"/>\n  <img src=\"https://go.foodora.cz/static/media/foodorago.6c1c557d.png\" alt=\"foodora GO\" title=\"foodora GO\" width=\"60\" height=\"32\" style=\"display:block;\"/>\n</div>\n\n\n## On Demand Concepts\n\n### Client\nA Client represents a **single integration for a specific Brand** and acts as the **\"parent vendor\"**. It contains high-level information such as:\n* Customer's known name of the Brand/Branch\n* General Address of the Brand/Branch that includes Latitude and Longitude.\n\n### Outlets\nOutlets are **the individual branches or vendor locations tied to the Client**. Each outlet represents the specific pickup location for deliveries. In ODR, if a client has **multiple locations**, they **can all be configured under the same parent vendor**.\nOutlet details include:\n* Branch vendor name\n* Address of outlet with latitude and longitude.\n&nbsp;\n\n**Note**: In ODR, **all orders should be sent from an Outlet**. Even if the client has only one location, the order should still originate from the Outlet and not the parent vendor.\n\n## Ordering Steps\n1. The Sender address must be specified when submitting an Order.\n2. The Sender latitude and longitude will be used to find the matching Branch/Outlet.\n\n### Supported Payment Methods\n| Payment Method | Description |\n| - | - |\n| PAID | Order has been fully paid already and courier will not collect any amount from the end customer |\n| CASH_ON_DELIVERY | Courier will collect payment (order amount) from the end customer upon delivery |\n| CARD_ON_DELIVERY | Payment by credit card upon receipt of the order |\n\n## API Endpoints and URLs\n\nBelow are the API endpoints for each brand and country:\n\n- Production URLs use DH-friendly domains when available.\n- Staging URLs always use raw infra domains.\n\n### Talabat\n| Country | Prod API | Stage API |\n| - | - | - |\n| United Arab Emirates | https://talabat-api-euw2.deliveryhero.io/ae | https://api-infra-eu-west-2.stg.ondemandrider.net/ae |\n| Bahrain | https://talabat-api-euw2.deliveryhero.io/bh | https://api-infra-eu-west-2.stg.ondemandrider.net/bh |\n| Egypt | https://talabat-api-euw2.deliveryhero.io/eg | https://api-infra-eu-west-2.stg.ondemandrider.net/eg |\n| Jordan | https://talabat-api-euw2.deliveryhero.io/jo | https://api-infra-eu-west-2.stg.ondemandrider.net/jo |\n| Kuwait | https://talabat-api-euw2.deliveryhero.io/kw | https://api-infra-eu-west-2.stg.ondemandrider.net/kw |\n| Oman | https://talabat-api-euw2.deliveryhero.io/om | https://api-infra-eu-west-2.stg.ondemandrider.net/om |\n| Qatar | https://talabat-api-euw2.deliveryhero.io/qa | https://api-infra-eu-west-2.stg.ondemandrider.net/qa |\n\n---\n\n### Hungerstation\n| Country | Prod API | Stage API |\n| - | - | - |\n| Saudi Arabia | https://talabat-api-euw2.deliveryhero.io/sa | https://api-infra-eu-west-2.stg.ondemandrider.net/sa |\n\n---\n\n### Pandago\n| Country | Prod API | Stage API |\n| - | - | - |\n| Bangladesh | https://pandago-api-apse.deliveryhero.io/bd | https://api-infra-ap-southeast-1.stg.ondemandrider.net/bd |\n| Hong Kong | https://pandago-api-apse.deliveryhero.io/hk | https://api-infra-ap-southeast-1.stg.ondemandrider.net/hk |\n| Cambodia | https://pandago-api-apse.deliveryhero.io/kh | https://api-infra-ap-southeast-1.stg.ondemandrider.net/kh |\n| Laos | https://pandago-api-apse.deliveryhero.io/la | https://api-infra-ap-southeast-1.stg.ondemandrider.net/la |\n| Myanmar | https://pandago-api-apse.deliveryhero.io/mm | https://api-infra-ap-southeast-1.stg.ondemandrider.net/mm |\n| Malaysia | https://pandago-api-apse.deliveryhero.io/my | https://api-infra-ap-southeast-1.stg.ondemandrider.net/my |\n| Philippines | https://pandago-api-apse.deliveryhero.io/ph | https://api-infra-ap-southeast-1.stg.ondemandrider.net/ph |\n| Pakistan (APSO) | https://pandago-api-apso.deliveryhero.io/pk | https://api-infra-ap-south-1.stg.ondemandrider.net/pk |\n| Singapore | https://pandago-api-apse.deliveryhero.io/sg | https://api-infra-ap-southeast-1.stg.ondemandrider.net/sg |\n| Thailand | https://pandago-api-apse.deliveryhero.io/th | https://api-infra-ap-southeast-1.stg.ondemandrider.net/th |\n| Taiwan | https://pandago-api-apse.deliveryhero.io/tw | https://api-infra-ap-southeast-1.stg.ondemandrider.net/tw |\n\n---\n\n### Foodora Go\n| Country | Prod API | Stage API |\n| - | - | - |\n| Czech Republic | https://talabat-api-euw2.deliveryhero.io/cz | https://api-infra-eu-west-2.stg.ondemandrider.net/cz |\n| Finland | https://foodorago-api-eun1.deliveryhero.io/fi | https://api-infra-eu-north-1.stg.ondemandrider.net/fi |\n| Hungary | https://talabat-api-euw2.deliveryhero.io/hu | https://api-infra-eu-west-2.stg.ondemandrider.net/hu |\n| Norway | https://foodorago-api-eun1.deliveryhero.io/no | https://api-infra-eu-north-1.stg.ondemandrider.net/no |\n| Sweden | https://foodorago-api-eun1.deliveryhero.io/se | https://api-infra-eu-north-1.stg.ondemandrider.net/se |\n| Austria | https://api-infra-eu-west-2.ondemandrider.net/at | https://api-infra-eu-west-2.stg.ondemandrider.net/at |\n\n---\n\n### Efood\n| Country | Prod API | Stage API |\n| - | - | - |\n| Greece | https://api-infra-eu-west-2.ondemandrider.net/gr | https://api-infra-eu-west-2.stg.ondemandrider.net/gr |\n\n---\n\n### Foody\n| Country | Prod API | Stage API |\n| - | - | - |\n| Cyprus | https://api-infra-eu-west-2.ondemandrider.net/cy | https://api-infra-eu-west-2.stg.ondemandrider.net/cy |\n\n---\n\n### Glovo\n| Country | Prod API | Stage API |\n| - | - | - |\n| Armenia | https://ondemand-api-glovoapp.deliveryhero.io/am | https://api-infra-eu-central-1.stg.ondemandrider.net/am |\n| Bosnia & Herzegovina | https://ondemand-api-glovoapp.deliveryhero.io/ba | https://api-infra-eu-central-1.stg.ondemandrider.net/ba |\n| Bulgaria | https://ondemand-api-glovoapp.deliveryhero.io/bg | https://api-infra-eu-central-1.stg.ondemandrider.net/bg |\n| Ivory Coast | https://ondemand-api-glovoapp.deliveryhero.io/ci | https://api-infra-eu-central-1.stg.ondemandrider.net/ci |\n| Spain | https://ondemand-api-glovoapp.deliveryhero.io/es | https://api-infra-eu-central-1.stg.ondemandrider.net/es |\n| Georgia | https://ondemand-api-glovoapp.deliveryhero.io/ge | https://api-infra-eu-central-1.stg.ondemandrider.net/ge |\n| Croatia | https://ondemand-api-glovoapp.deliveryhero.io/hr | https://api-infra-eu-central-1.stg.ondemandrider.net/hr |\n| Italy | https://ondemand-api-glovoapp.deliveryhero.io/it | https://api-infra-eu-central-1.stg.ondemandrider.net/it |\n| Kenya | https://ondemand-api-glovoapp.deliveryhero.io/ke | https://api-infra-eu-central-1.stg.ondemandrider.net/ke |\n| Kyrgyzstan | https://ondemand-api-glovoapp.deliveryhero.io/kg | https://api-infra-eu-central-1.stg.ondemandrider.net/kg |\n| Kazakhstan | https://ondemand-api-glovoapp.deliveryhero.io/kz | https://api-infra-eu-central-1.stg.ondemandrider.net/kz |\n| Morocco | https://ondemand-api-glovoapp.deliveryhero.io/ma | https://api-infra-eu-central-1.stg.ondemandrider.net/ma |\n| Moldova | https://ondemand-api-glovoapp.deliveryhero.io/md | https://api-infra-eu-central-1.stg.ondemandrider.net/md |\n| Montenegro | https://ondemand-api-glovoapp.deliveryhero.io/me | https://api-infra-eu-central-1.stg.ondemandrider.net/me |\n| Nigeria | https://ondemand-api-glovoapp.deliveryhero.io/ng | https://api-infra-eu-central-1.stg.ondemandrider.net/ng |\n| Poland | https://ondemand-api-glovoapp.deliveryhero.io/pl | https://api-infra-eu-central-1.stg.ondemandrider.net/pl |\n| Portugal | https://ondemand-api-glovoapp.deliveryhero.io/pt | https://api-infra-eu-central-1.stg.ondemandrider.net/pt |\n| Romania | https://ondemand-api-glovoapp.deliveryhero.io/ro | https://api-infra-eu-central-1.stg.ondemandrider.net/ro |\n| Serbia | https://ondemand-api-glovoapp.deliveryhero.io/rs | https://api-infra-eu-central-1.stg.ondemandrider.net/rs |\n| Tunisia | https://ondemand-api-glovoapp.deliveryhero.io/tn | https://api-infra-eu-central-1.stg.ondemandrider.net/tn |\n| Ukraine | https://ondemand-api-glovoapp.deliveryhero.io/ua | https://api-infra-eu-central-1.stg.ondemandrider.net/ua |\n| Uganda | https://ondemand-api-glovoapp.deliveryhero.io/ug | https://api-infra-eu-central-1.stg.ondemandrider.net/ug |\n\n---\n\n# Getting Started\n\n## 1. Provide a public key\nThese are the steps to start using the ODR API:\n1. Generate Key Pair (Private Key and Public Key) to support secure communication with the ODR API.\n\n   Follow these commands on a terminal:\n   ```bash\n   # Generate private key\n   # output: client.pem file\n   openssl genrsa -out client.pem 2048\n\n   # Generate public key from the generated private one\n   # input: client.pem file\n   # output: client.pub file\n   openssl rsa -in client.pem -pubout > client.pub\n   ```\n   Or, follow these steps:\n   1. Open a browser and access [this Online RSA Generator](https://emn178.github.io/online-tools/rsa/key-generator/)\n   2. Select key length to 2048 bit, and click the Generate Key Pair button.\n   3. Copy and save the Private Key to a file with .pem extension (e.g. client.pem).\n   4. Copy and save the Public Key to a file with .pub extension (e.g. client.pub).\n2. The ODR representative will provide you with `ClientID`, `KeyID` and `Scope` that your service will need to generate an Access Token for the ODR API.\n   | Attribute | Description | Example |\n   | - | - | - |\n   | ClientID | Your service identifier| pandago:sg:00000000-0000-0000-0000-000000000000 |\n   | KeyID | Your public key identifier| 00000000-0000-0000-0000-000000000001 |\n   | Scope | Access scope of your service| `pandago.api.{country code}.*` (ex: `pandago.api.pt.*`) |\n\n\n## 2. Generate signed JWT\nGenerate assertion as a signed token in Javascript Web Token (JWT) format.\n\nThis is the payload structure of the token:\n```\n{\n  \"alg\":\"RS256\",\n  \"typ\":\"JWT\",\n  \"kid\": \"{{KeyID}}\"\n}\n.\n{\n  \"iss\":\"{{ClientID}}\",\n  \"sub\":\"{{ClientID}}\",\n  \"jti\":\"{{random uuid (e.g. caa56777-4e88-4c59-be70-3ae513fd2e00)}}\",\n  \"exp\":{{unix timestamp in the future (e.g. 1894712882)}},\n  \"aud\":\"https://sts.deliveryhero.io\"\n}\n```\nAnd use your Private Key to sign the token.\n\n\uD83D\uDCA1 **Tips** \uD83D\uDCA1\n* Always use `https://sts.deliveryhero.io` for `aud` key, in both testing and prod environments\n* For the `exp` key, just get a future timestamp (ex in 1 year) with [unixtimestamp.com](https://www.unixtimestamp.com/index.php)\n\n## 3. Get a JWT access token\n\nFollow the instructions to call [the auth endpont](#tag/Authentication)\n"
servers:
- url: https://pandago-api-sandbox.deliveryhero.io/sg/api/v1
  description: <b>Sandbox</b> environment
- url: https://api-infra-eu-central-1.stg.ondemandrider.net/{country code}/api/v1
  description: "<b>Stage</b> Glovo generic \uD83D\uDCA1 Find your country URL [here](#section/About/API-Endpoints-and-URLs) \uD83D\uDCA1"
- url: https://ondemand-api-glovoapp.deliveryhero.io/{country code}/api/v1
  description: "<b>Production</b> Glovo generic \uD83D\uDCA1 Find your country URL [here](#section/About/API-Endpoints-and-URLs) \uD83D\uDCA1"
- url: https://ondemand-api-glovoapp.deliveryhero.io/pt/api/v1
  description: <b>Example in production</b> for Glovo Portugal
security:
- Bearer_Token: []
tags:
- name: Callback
  description: '**▶️ READ THIS FIRST ◀️**


    * Those are NOT actual endpoints. They are callback from ODR to your endpoint

    * This is used to represent the payload ODR will sent

    * This is an optional feature and it requires your callback URL to be registered with your ClientID

    ---


    **Description**

    * The Callback URL will need to be HTTPS with a valid SSL certificate.

    * Body posted by this feature is stripped of any Personally Identifiable Information (PII).

    * Full Order body can be fetched using the Get Specific Order feature.

    * If there is an error, we retry sending the request three times. If the response status code is 2xx, it means that there was no error and the callback was successful in sending order status.

    '
paths:
  /callback:
    summary: Order Status callback
    post:
      summary: Order Status callback
      description: "**Order Cancellation Callback**\n* When you cancel an order, if you provided a callback url, ODR will send request to that url.\n* In the payload, there will be Cancellation object which contains reason and source of cancellation\n* __NOTE: Cancellation object__ (seen at the end of the payload below) will be provided __only__ when the order is cancelled. It will not be available if the order is not cancelled.\n\n\n---\n**Verification of Callback**\n  Signature-based verification can be used to secure callback messages to the API vendors.\n  To enable signature verification, please contact with regional/local ops team and provide your secret key.\n\n  * The payload will be signed by the platform, and the `hex-encoded` signature will be added to the header as `X-Signature-SHA256`.\n  * Verification can be done using the provided secret on the client side.\n\n  Example verification codes:\n\n  Golang:\n\n  ```golang\n  const (\n    SignatureHeader string = \"X-Signature-SHA256\"\n    Secret string = \"supersecret\"\n  )\n\n  func handler(w http.ResponseWriter, r *http.Request) {\n    body, err := io.ReadAll(r.Body)\n    if err != nil {\n      // can't read body\n    }\n    defer r.Body.Close()\n\n    ok, err := verify(body, r.Header.Get(SignatureHeader))\n    if err != nil {\n      // can't verify signature\n    } else if !ok {\n      // signature does not match\n    }\n\n    // signature is verified\n  }\n\n  func verify(body []byte, signature string) (bool, error) {\n    sig, err := hex.DecodeString(signature)\n    if err != nil {\n      return false, err\n    }\n\n    mac := hmac.New(sha256.New, []byte(Secret))\n    mac.Write(body)\n\n    return hmac.Equal(sig, mac.Sum(nil)), nil\n  }\n  ```\n"
      tags:
      - Callback
      security: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CallbackRequest'
        description: '__NOTE: Cancellation object__ (seen at the end of the payload below) will be provided __only__ when the order is cancelled. It will not be available if the order is not cancelled.'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              examples:
                response:
                  value: null
  /callback-location:
    summary: Courier location update
    post:
      summary: Courier location update
      description: 'If you provide us a `location_update_callback` then we will call the callback URL *every 15s* for any ongoing orders with the live location of the courier.


        It works exactly like above callback endpint and the body is the same, signature is also supported.

        You can chose to use the same callback URL or have a different one.

        '
      tags:
      - Callback
      security: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CallbackRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              examples:
                response:
                  value: null
  /callback-refund:
    summary: Refund callback
    post:
      summary: Refund callback
      description: 'Whenever a refund or compensation is issued for one of your orders, ODR will POST a refund event to your registered refund callback URL. To enable this callback, please contact your local ops team and provide the URL.


        The payload describes the refund amount, the reason and owner of the refund, and — when the refund targets specific items — the list of affected products with the percentage of each product being refunded.


        ---


        **Refund types**


        | Type | Description |

        | - | - |

        | `FULL_REFUND` | The whole order is being refunded. |

        | `PARTIAL_REFUND` | Only part of the order is being refunded (e.g. specific products or the delivery fee). |

        | `COMPENSATION` | A compensation for which the value is independent of the product amount of the order. |


        **Refund owners**


        | Owner | Description |

        | - | - |

        | `RESTAURANT` | The vendor (restaurant) bears the refund cost. |

        | `DELIVERY_PLATFORM` | The delivery platform bears the refund cost. |


        **Refund reasons**


        | Reason | Description |

        | - | - |

        | `ORDER_MISSING_ITEMS` | The order was delivered but some items were missing. |

        | `ORDER_ITEM_ERROR` | One or more items were incorrect. |

        | `ORDER_DAMAGE_ITEMS` | One or more items were damaged on delivery. |

        | `ORDER_LATE_DELIVERY` | The order was delivered after the promised time. |

        | `ORDER_NEVER_DELIVERED` | The order was never delivered to the customer. |

        | `WRONG_ORDER_DELIVERED_DELIVERY_PLATFORM` | A wrong order was delivered (platform fault). |

        | `WRONG_ORDER_DELIVERED_PARTNER` | A wrong order was delivered (vendor fault). |

        | `BAD_QUALITY` | Items had quality issues. |

        | `AUTOMATIC_CANCELLATION` | Refund issued automatically following an order cancellation. |

        | `OTHER` | Other reason not covered above. |


        ---


        **Notes**


        * Monetary fields (`total_amount.value`, `delivery_fee_details.amount`, `products[].amount`) are integers expressed in the smallest unit of the order''s currency (e.g. cents for `EUR`/`USD`).

        * `delivery_fee_details` is only present when the refund includes a delivery fee component.

        * `products` is only present for refunds that target specific products. The `external_id` matches the `external_id` you supplied for the product when creating the order.

        * Signature verification (`X-Signature-SHA256`) works the same way as for the order status callback — see the [Order Status callback](#operation/Order-Status-callback) section.

        * If the response status code is 2xx, the callback is considered delivered. Otherwise ODR retries the request up to three times.

        '
      tags:
      - Callback
      security: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefundCallbackRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              examples:
                response:
                  value: null
components:
  schemas:
    RefundCallbackRequest:
      title: Refund Callback Request
      description: Payload sent to the registered refund callback URL when a refund or compensation is issued for an order.
      type: object
      required:
      - order_id
      - refund_id
      - type
      - total_amount
      - reason
      - owner
      properties:
        order_id:
          type: string
          description: Identifier of the ODR order this refund relates to.
          example: y0ud-000001
        refund_id:
          type: string
          description: Unique identifier of the refund event.
          example: rfd-000001
        type:
          type: string
          description: Type of refund being issued.
          enum:
          - FULL_REFUND
          - PARTIAL_REFUND
          - COMPENSATION
        total_amount:
          title: Refund Total Amount
          type: object
          required:
          - value
          - currency_code
          description: Total amount of the refund.
          properties:
            value:
              type: integer
              format: int64
              description: Total refund amount in the smallest unit of `currency_code` (e.g. cents for `EUR`/`USD`).
              example: 1500
            currency_code:
              type: string
              description: ISO 4217 three-letter currency code.
              example: EUR
        delivery_fee_details:
          title: Delivery Fee Details
          type: object
          description: Present only when the refund includes a delivery fee component. Describes how much of `total_amount` corresponds to the delivery fee.
          required:
          - amount
          - currency_code
          properties:
            amount:
              type: integer
              format: int64
              description: Delivery fee portion of the refund, in the smallest unit of `currency_code`.
              example: 250
            currency_code:
              type: string
              description: ISO 4217 three-letter currency code.
              example: EUR
        reason:
          type: string
          description: Reason for the refund.
          enum:
          - ORDER_MISSING_ITEMS
          - ORDER_ITEM_ERROR
          - ORDER_DAMAGE_ITEMS
          - ORDER_LATE_DELIVERY
          - ORDER_NEVER_DELIVERED
          - WRONG_ORDER_DELIVERED_DELIVERY_PLATFORM
          - WRONG_ORDER_DELIVERED_PARTNER
          - BAD_QUALITY
          - AUTOMATIC_CANCELLATION
          - OTHER
        owner:
          type: string
          description: Party that bears the cost of the refund.
          enum:
          - RESTAURANT
          - DELIVERY_PLATFORM
        products:
          type: array
          description: Products affected by the refund. Only present when the refund targets specific products. The `external_id` matches the `external_id` provided when the order was created.
          items:
            $ref: '#/components/schemas/RefundCallbackProduct'
      example:
        order_id: y0ud-000001
        refund_id: rfd-000001
        type: PARTIAL_REFUND
        total_amount:
          value: 1500
          currency_code: EUR
        delivery_fee_details:
          amount: 250
          currency_code: EUR
        reason: ORDER_MISSING_ITEMS
        owner: RESTAURANT
        products:
        - id: prod-1
          external_id: '324'
          name: Burger
          percentage: 100
          amount: 1000
        - id: prod-2
          external_id: '2311'
          name: Coca-Cola
          percentage: 50
          amount: 250
    AgeValidationRequired:
      type: boolean
      default: false
      description: 'Setting this attribute to `true` requests age verification of the customer by the rider at the point of delivery.


        Before enabling this feature, please confirm with your account manager that age verification has been activated for your account.


        This feature is currently available in the following countries:

        - **pandago**: Philippines

        - **foodora GO**: Sweden, Norway and Czech Republic

        - **Glovo On-Demand**: All countries'
    CallbackDriver:
      title: Driver
      type: object
      properties:
        id:
          type: number
        name:
          type: number
        phone_number:
          $ref: '#/components/schemas/PhoneNumber'
        location:
          $ref: '#/components/schemas/CallbackDriverLocation'
    CallbackRequest:
      title: Callback Request
      type: object
      properties:
        order_id:
          type: string
        client_order_id:
          type: string
        status:
          $ref: '#/components/schemas/Status'
        timeline:
          $ref: '#/components/schemas/Timeline'
        driver:
          $ref: '#/components/schemas/CallbackDriver'
        created_at:
          $ref: '#/components/schemas/Timestamp'
        updated_at:
          $ref: '#/components/schemas/Timestamp'
        tracking_link:
          type: string
        proof_of_delivery_url:
          type: string
        proof_of_pickup_url:
          type: string
        proof_of_return_url:
          type: string
        distance:
          type: number
          description: Distance of the trip in meters, calculated using the Haversine formula.
        cancellation:
          $ref: '#/components/schemas/Cancellation'
        delivery_tasks:
          title: Delivery Tasks
          type: object
          properties:
            age_validation_required:
              $ref: '#/components/schemas/AgeValidationRequired'
        pickup_tasks:
          $ref: '#/components/schemas/PickupTasks'
      required:
      - order_id
      - status
      - timeline
      - driver
      - created_at
      - updated_at
      example:
        order_id: y0ud-000001
        client_order_id: client-ref-0000001
        status: PICKED_UP
        timeline:
          extimated_pickup_time: '2018-09-13T01:30:52.123Z'
          estimated_delivery_time: '2018-09-13T01:45:52.123Z'
        driver:
          id: '12324'
          name: Panda Go
          phone_number: '+6500000000'
          location:
            latitude: 1.2923742
            longitude: 103.8486029
        created_at: 1536802000
        updated_at: 1536802252
        tracking_link: https://example.com/test_tracking_path
        proof_of_delivery_url: https://pandago-api-sandbox.deliveryhero.io/api/v1/orders/proof_of_delivery/x-1234
        proof_of_pickup_url: https://pandago-api-sandbox.deliveryhero.io/api/v1/orders/proof_of_pickup/x-1234
        proof_of_return_url: https://pandago-api-sandbox.deliveryhero.io/api/v1/orders/proof_of_return/x-1234
        cancellation:
          reason: MISTAKE_ERROR
          source: CLIENT
        delivery_tasks:
          age_validation_required: false
        pickup_tasks:
          pickup_code: Order-4672
        packaging:
          size: small
          weight: 1.2
    Timeline:
      title: Timeline
      type: object
      properties:
        estimated_pickup_time:
          type: string
        estimated_delivery_time:
          type: string
    CallbackDriverLocation:
      title: Location
      type: object
      description: Location information is added only to the statuses where the order has an active driver.
      properties:
        latitude:
          type: string
        longitude:
          type: string
    Timestamp:
      title: Timestamp
      type: integer
    Source:
      type: string
      enum:
      - AUTO_CANCEL
      - CLIENT
      - HELPCENTER
      - INTERNAL_UNKNOWN
      - LOGISTICS
      - ONEVIEW
      description: "Acceptable Sources:\n * `AUTO_CANCEL` - Cancellation was triggered automatically.\n * `CLIENT` - Cancellation was requested by the client (vendor).\n * `HELPCENTER` - Cancellation was triggered by the Help Center.\n * `INTERNAL_UNKNOWN` - Cancellation source is unknown or unrecognized.\n * `LOGISTICS` - Cancellation was requested by Logistics.\n * `ONEVIEW` - Cancellation was triggered by OneView."
    PhoneNumber:
      type: string
      format: e164
      description: '* Phone number in E.164 standard (https://en.wikipedia.org/wiki/E.164)

        * libphonenumber is used for phone number validation

        '
      example: '+6588888888'
    Status:
      type: string
      enum:
      - NEW
      

# --- truncated at 32 KB (38 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/delivery-hero/refs/heads/main/openapi/delivery-hero-callback-api-openapi.yml