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
\n \"Glovo\n \"Gostation\"\n \"Talabat\n \"Foody\"\n \"efood\"\n \"pandago\"\n \"foodora\n
\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 \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: Sandbox environment - url: https://api-infra-eu-central-1.stg.ondemandrider.net/{country code}/api/v1 description: "Stage 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: "Production 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: Example in production 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_TOO_LONG` - Before promised delivery time, customer believes that the ETA is too long.\n * `DUPLICATE_ORDER` - Duplicate order.\n * `FOOD_QUALITY_SPILLAGE` - Customer has an issue with the food quality (cold, inedible, etc.) OR order spillage occurred during transport (VD/OD).\n * `ITEM_UNAVAILABLE` - The product is not available or another rider has already picked up the order.\n * `LATE_DELIVERY` - Customer has received delivery but (excessively) passed promised delivery time.\n * `MISTAKE_ERROR` - Customer placed order in error/accidentally or with incorrect specifications (i.e. preorder, incorrect payment type).\n * `NO_COURIER` - Vendor: Vendor has no courier (drivers/riders/walkers/etc.) available to fulfill the order. Logistics: Order is pending in Logistics/Hurrier without assigned courier and customer no longer wishes to wait.\n * `OUTSIDE_DELIVERY_AREA` - Vendor: Vendor does not deliver to the customer's address/area. Logistics: Logistics does not deliver to the customer's address/area.\n * `OUTSIDE_SERVICE_HOURS` - Order has been placed outside of our Logistic service hours.\n * `REASON_UNKNOWN` - Reason for failure is not available. VENDOR: Vendor initiated, CUSTOMER: Customer initiated, PLATFORM: Unknown who initiated.\n * `TECHNICAL_PROBLEM` - Vendor: Vendor cannot fulfill an order due to technical issues, e.g. order can not be printed, etc. Where a vendor cannot be contacted and order could not be delivered to their transmission/reception device or order was delivered to the device and it timed-out/expired, reasons UNREACHABLE and NO_RESPONSE should be used respectively rather than TECHNICAL_PROBLEM. Logistics: Logistics is having general technical issues (i.e. Hurrier is down, etc.). Platform: Platform is experiencing some technical issue whereby orders cannot be placed with the Logistics/Vendor and/or have been pending too long. As a result, orders have been failed by the platform.\n * `TOO_BUSY` - Vendor is too busy to fulfill the order.\n * `UNABLE_TO_FIND` - Customer cannot be located to complete pick-up/delivery or order items.\n * `UNABLE_TO_PAY` - Customer cannot pay for the order, e.g. insufficient cash (COD) or card doesn't work for card on delivery, etc.\n * `UNREACHABLE` - Technical issues on the partner's side.\n * `WRONG_ORDER_ITEMS_DELIVERED` - Customer has received wrong order items or is missing significant item(s)." 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 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' RefundCallbackProduct: title: Refund Callback Product description: A product affected by a refund. type: object required: - id - external_id - name - percentage - amount properties: id: type: string description: ODR-side identifier of the product within the order. example: prod-1 external_id: type: string description: Identifier of the product in the vendor's external system, as provided when creating the order. example: '324' name: type: string description: Name of the product. example: Burger percentage: type: integer minimum: 1 maximum: 100 description: Percentage of this product being refunded (1-100). example: 100 amount: type: integer format: int64 description: Refund amount attributed to this product, in the smallest unit of the parent `total_amount.currency_code`. example: 1000 securitySchemes: Bearer_Token: type: apiKey name: Authorization in: header description: 'Provide the access token in the format: `Bearer {access-token}`. You can obtain the access token from the [Authentication endpoint](#tag/Authentication). ' x-tagGroups: - name: Authentication tags: - Authentication - name: Orders tags: - OrdersManagement - OrdersEstimation - RiderPosition - Proofs - name: Outlets tags: - Outlets - name: Callback tags: - Callback