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.

OpenAPI Specification

delivery-hero-callback-api-openapi.yml Raw ↑
openapi: 3.0.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:
    Cancellation:
      title: Cancellation
      type: object
      properties:
        source:
          $ref: '#/components/schemas/Source'
        reason:
          $ref: '#/components/schemas/Reason'
    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."
    Timestamp:
      title: Timestamp
      type: integer
    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
    CallbackDriver:
      title: Driver
      type: object
      properties:
        id:
          type: number
        name:
          type: number
        phone_number:
          $ref: '#/components/schemas/PhoneNumber'
        location:
          $ref: '#/components/schemas/CallbackDriverLocation'
    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'
    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
    Status:
      type: string
      enum:
      - NEW
      - RECEIVED
      - WAITING_FOR_TRANSPORT
      - ASSIGNED_TO_TRANSPORT
      - COURIER_ACCEPTED_DELIVERY
      - NEAR_VENDOR
      - PICKED_UP
      - COURIER_LEFT_VENDOR
      - NEAR_CUSTOMER
      - DELIVERED
      - DELAYED
      - CANCELLED
      - RETURNED_TO_VENDOR
      description: "Available Statuses:\n * `NEW` - Order has been created\n * `RECEIVED` - We've accepted the order and will be assigning it to a courier\n * `WAITING_FOR_TRANSPORT` - Assigning order to a courier\n * `ASSIGNED_TO_TRANSPORT` - Courier has been dispatched to pick up and deliver the order\n * `COURIER_ACCEPTED_DELIVERY` - Courier accepted to pick up and deliver the order\n * `NEAR_VENDOR` - Courier is near the pick-up point\n * `PICKED_UP` - Courier has picked up the order\n * `COURIER_LEFT_VENDOR` - Courier has left from pick-up point\n * `NEAR_CUSTOMER` - Courier is near the drop-off point\n * `DELIVERED` - Courier has delivered the order\n * `DELAYED` - Order delivery has been delayed and estimated delivery time has been updated\n * `CANCELLED` - Order has been cancelled\n * `RETURNED_TO_VENDOR` - Courier has returned the order to the vendor"
    PickupTasks:
      title: Pickup Tasks
      description: The tasks that you expect the rider to perform at the Pickup Point are located under this heading.
      type: object
      properties:
        pickup_code:
          type: string
          maxLength: 30
          description: The code that you expect the rider to mention in order to validate before giving them the order
    Reason:
      type: string
      enum:
      - ADDRESS_INCOMPLETE_MISSTATED
      - BAD_WEATHER
      - CLOSED
      - COURIER_ACCIDENT
      - COURIER_UNREACHABLE
      - DELIVERY_ETA_TOO_LONG
      - DUPLICATE_ORDER
      - FOOD_QUALITY_SPILLAGE
      - ITEM_UNAVAILABLE
      - LATE_DELIVERY
      - MISTAKE_ERROR
      - NO_COURIER
      - OUTSIDE_DELIVERY_AREA
      - OUTSIDE_SERVICE_HOURS
      - REASON_UNKNOWN
      - TECHNICAL_PROBLEM
      - TOO_BUSY
      - UNABLE_TO_FIND
      - UNABLE_TO_PAY
      - UNREACHABLE
      - WRONG_ORDER_ITEMS_DELIVERED
      description: "Acceptable Reasons:\n  * `ADDRESS_INCOMPLETE_MISSTATED` - Customer's address is incomplete OR customer enters incorrect address on purpose in order to be able to proceed with the order with the vendor, with the actual customer address outside the vendor's delivery area.\n  * `BAD_WEATHER` - Vendor/Logistics cannot deliver because of weather conditions.\n  * `CLOSED` - Vendor is closed.\n  * `COURIER_ACCIDENT` - Courier has been involved in an accident and cannot fulfill the order.\n  * `COURIER_UNREACHABLE` - Courier is unreachable/unresponsive and/or uncontactable.\n  * `DELIVERY_ETA_TO

# --- 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