Buscar en la documentación
ctrl+4K
Módulos
Authentication
Merchant
Catalog
Order
Events
Logistics
Shipping
Review
Financial
Soluciones

Guía de implementación de negociación de órdenes

Ejemplos de flujos completos y procedimientos de prueba para negociación de órdenes. Para referencia API, constantes y entidades, ver Plataforma de negociación de órdenes.

Cancelación total

El cliente recibe la orden y solicita cancelación total. El comerciante puede aceptar, rechazar u ofrecer un reembolso.

Aceptar la negociación de cancelación

  1. Crear una orden
  2. El comerciante debe confirmar y enviar la orden
  3. El cliente debe confirmar recepción de la orden
  4. El cliente debe solicitar cancelación de la ordenPara solicitar cancelación de orden, abra la app del cliente, abra la orden, haga clic en Ayuda > Orden llegó incorrecta > Complete el formulario seleccionando todos los items > Envíe la información > Seleccione la opción "No quiero recibir reembolso en mi saldo de iFood".En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant API.
    {
      "id":"d74ac331-9e5b-467f-96fe-57c143b9177a",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"6211e666-2fec-4369-b261-5a422c5ef350",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T18:02:46.921Z",
      "metadata":{
        "action":"CANCELLATION",
        "alternatives":[
          {
            "id":"9945f8f1-03ff-4762-8cfd-0f20db66741d",
            "metadata":{
              "maxAmount":{
                "currency":"BRL",
                "value":"800"
              }
            },
            "type":"REFUND"
          }
        ],
        "createdAt":"2024-04-25T18:02:46.798698Z",
        "disputeId":"0a2d440f-98f3-4919-ac0b-aa5afe8f4135",
        "expiresAt":"2024-04-25T18:09:46.798698Z",
        "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
        "handshakeType":"AFTER_DELIVERY",
        "message":"Probando probando",
        "metadata":{
          "evidences":[
            {
              "contentType":"image/jpeg",
              "url":"https://merchant-api.ifood.com.br/order/v1.0/orders/6211e666-2fec-4369-b261-5a422c5ef350/cancellationEvidences/4c76b8ea-51db-42d5-806f-1a086753bc4a"
            }
          ]
        },
        "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  5. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la negociación. Ejemplo de imagen del Gestor de órdenesEjemplo de solicitud para merchant-api
    curl --location --request POST \
    'https://merchant-api.ifood.com.br/order/v1.0/disputes/2097e3ef-1e0e-46ad-a083-5b39cd615df7/accept' \
    --header 'Authorization: Bearer jwt-token' \
    --data ''
  6. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"4bf1cd30-e50b-41b8-9827-0ad448d3c700",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"6211e666-2fec-4369-b261-5a422c5ef350",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T18:03:43.186Z",
      "metadata":{
        "createdAt":"2024-04-25T18:03:43.083117651Z",
        "disputeId":"0a2d440f-98f3-4919-ac0b-aa5afe8f4135",
        "status":"ACCEPTED"
      }
    }

Rechazar negociación de cancelación

  1. Crear una orden
  2. El comerciante debe confirmar y enviar la orden
  3. El cliente debe confirmar recepción de la orden
  4. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, haga clic en Ayuda > Orden llegó incorrecta > Complete el formulario seleccionando todos los items > Envíe la información > Seleccione la opción "No quiero recibir reembolso en mi saldo de iFood".
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"41597d87-79f1-4a8b-a66d-d575e0a7ccc2",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"3c5332ee-0616-44de-bff3-37a40b93f834",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:05:24.098Z",
      "metadata":{
        "action":"PARTIAL_CANCELLATION",
        "alternatives":[
          {
            "id":"5154c746-918b-4f85-80b1-3b5a448710bb",
            "metadata":{
              "maxAmount":{
                "currency":"BRL",
                "value":"2080"
              }
            },
            "type":"REFUND"
          }
        ],
        "createdAt":"2024-04-25T19:05:23.953526Z",
        "disputeId":"9eec04a6-5374-4e20-9713-29926924fbc1",
        "expiresAt":"2024-04-25T19:12:23.953526Z",
        "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
        "handshakeType":"AFTER_DELIVERY_PARTIALLY",
        "metadata":{
          "garnishItems":[
            {
              "amount":{
                "currency":"BRL",
                "value":"300"
              },
              "id":"2bb737bf-1b72-419d-a77d-8047f07dd144",
              "index":0,
              "parentUniqueId":"631839cb-05ca-428b-ba1f-ab1ee7ecc57a",
              "quantity":3,
              "reason":"Probando test"
            }
          ]
        },
        "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  5. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenesEjemplo de solicitud para merchant-api
    curl --location --request POST \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/2097e3ef-1e0e-46ad-a083-5b39cd615df7/reject' \
        --header 'Authorization: Bearer jwt-token' \
        --data '{ "reason": "some reason" }'
  6. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"4bf1cd30-e50b-41b8-9827-0ad448d3c700",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"6211e666-2fec-4369-b261-5a422c5ef350",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T18:03:43.186Z",
      "metadata":{
          "createdAt":"2024-04-25T18:03:43.083117651Z",
          "disputeId":"0a2d440f-98f3-4919-ac0b-aa5afe8f4135",
          "reason":"prueba prueba prueba",
          "status":"REJECTED"
      }
    }

Enviar propuesta de reembolso

  1. Crear una orden
  2. El comerciante debe confirmar y enviar la orden
  3. El cliente debe confirmar recepción de la orden
  4. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, haga clic en Ayuda > Orden llegó incorrecta > Complete el formulario seleccionando todos los items > Envíe la información > Seleccione la opción "No quiero recibir reembolso en mi saldo de iFood".
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"d74ac331-9e5b-467f-96fe-57c143b9177a",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"6211e666-2fec-4369-b261-5a422c5ef350",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T18:02:46.921Z",
      "metadata":{
          "action":"CANCELLATION",
          "alternatives":[
            {
                "id":"9945f8f1-03ff-4762-8cfd-0f20db66741d",
                "metadata":{
                  "maxAmount":{
                      "currency":"BRL",
                      "value":"800"
                  }
                },
                "type":"REFUND"
            }
          ],
          "createdAt":"2024-04-25T18:02:46.798698Z",
          "disputeId":"0a2d440f-98f3-4919-ac0b-aa5afe8f4135",
          "expiresAt":"2024-04-25T18:09:46.798698Z",
          "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
          "handshakeType":"AFTER_DELIVERY",
          "message":"Probando probando",
          "metadata":{
            "evidences":[
                {
                  "contentType":"image/jpeg",
                  "url":"https://merchant-api.ifood.com.br/order/v1.0/orders/6211e666-2fec-4369-b261-5a422c5ef350/cancellationEvidences/4c76b8ea-51db-42d5-806f-1a086753bc4a"
                }
            ]
          },
          "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  5. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenesEjemplo de solicitud para merchant-api
    curl --location --request POST \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/2097e3ef-1e0e-46ad-a083-5b39cd615df7/alternatives/9945f8f1-03ff-4762-8cfd-0f20db66741d' \
        --header 'Authorization: Bearer jwt-token' \
        --data '{ \
            "type": "REFUND", \
            "metadata": { \
            "amount": { \
            "currency": "BRL", \
            "value": "200" \
        }}}'
  6. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"3e561c1f-391f-460d-99c1-4858e43f6fa4",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"98403df8-828b-41e3-a3d1-0c9265e854a6",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T18:47:26.185Z",
      "metadata":{
          "createdAt":"2024-04-25T18:47:26.047174208Z",
          "disputeId":"d3d271f4-886c-4c75-b6bf-8ee3d1e7708c",
          "selectedDisputeAlternative":{
            "id":"ec7e0d30-c305-4037-8b82-3dca7d9fb0a3",
            "metadata":{
                "amount":{
                  "currency":"BRL",
                  "value":"200"
                }
            },
            "type":"REFUND"
          },
          "status":"ALTERNATIVE_REPLIED"
      }
    }
  7. Finalmente, el comerciante recibirá otro evento HANDSHAKE_SETTLEMENT vía polling, informándole de la respuesta del cliente—es decir, si el cliente aceptó, rechazó o no respondió la propuesta de reembolso enviada por el comerciante. En este caso, el cliente aceptó el reembolso. Si el cliente no acepta el reembolso, el estado de metadata será REJECTED. Si el cliente no responde la propuesta de reembolso, el mismo metadata será EXPIRED.
    {
      "id":"1cba5e42-fe07-45f4-8eed-b3188de5ffeb",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"98403df8-828b-41e3-a3d1-0c9265e854a6",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T18:50:05.149Z",
      "metadata":{
          "createdAt":"2024-04-25T18:50:05.051587724Z",
          "disputeId":"d145bcc6-b5a3-40a6-b9de-a206ac7b536c",
          "status":"ACCEPTED"
      }
    }
Esta negociación ocurre cuando el cliente recibe la orden y luego solicita cancelar items en la orden. El comerciante recibe la solicitud de cancelación y puede aceptar la cancelación, rechazarla u ofrecer un reembolso al cliente. A continuación están los pasos para simular cada situación.

Aceptar negociación de cancelación

  1. Crear una orden
  2. El comerciante debe confirmar y enviar la orden
  3. El cliente debe confirmar recepción de la orden
  4. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, haga clic en Ayuda > Orden llegó incorrecta > Complete el formulario seleccionando algunos items > Envíe la información > Seleccione la opción "No quiero recibir reembolso en mi saldo de iFood".
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"41597d87-79f1-4a8b-a66d-d575e0a7ccc2",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"3c5332ee-0616-44de-bff3-37a40b93f834",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:05:24.098Z",
      "metadata":{
          "action":"PARTIAL_CANCELLATION",
          "alternatives":[
            {
                "id":"5154c746-918b-4f85-80b1-3b5a448710bb",
                "metadata":{
                  "maxAmount":{
                      "currency":"BRL",
                      "value":"2080"
                  }
                },
                "type":"REFUND"
            }
          ],
          "createdAt":"2024-04-25T19:05:23.953526Z",
          "disputeId":"9eec04a6-5374-4e20-9713-29926924fbc1",
          "expiresAt":"2024-04-25T19:12:23.953526Z",
          "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
          "handshakeType":"AFTER_DELIVERY_PARTIALLY",
          "metadata":{
            "garnishItems":[
                {
                  "amount":{
                      "currency":"BRL",
                      "value":"300"
                  },
                  "id":"2bb737bf-1b72-419d-a77d-8047f07dd144",
                  "index":0,
                  "parentUniqueId":"631839cb-05ca-428b-ba1f-ab1ee7ecc57a",
                  "quantity":3,
                  "reason":"Probando test"
                }
            ]
          },
          "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  5. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenesEjemplo de solicitud para merchant-api
    curl --location --request POST \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/2bb737bf-1b72-419d-a77d-8047f07dd144/accept' \
        --header 'Authorization: Bearer jwt-token' \
        --data ''
  6. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"7fb701a9-0996-4418-a3dc-8afa55786764",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"3c5332ee-0616-44de-bff3-37a40b93f834",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:06:38.788Z",
      "metadata":{
        "createdAt":"2024-04-25T19:06:38.692323486Z",
        "disputeId":"9eec04a6-5374-4e20-9713-29926924fbc1",
        "status":"ACCEPTED"
      }
    }

Rechazar negociación de cancelación

  1. Crear una orden
  2. El comerciante debe confirmar y enviar la orden
  3. El cliente debe confirmar recepción de la orden
  4. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, haga clic en Ayuda > Orden llegó incorrecta > Complete el formulario seleccionando algunos items > Envíe la información > Seleccione la opción "No quiero recibir reembolso en mi saldo de iFood".
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"41597d87-79f1-4a8b-a66d-d575e0a7ccc2",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"3c5332ee-0616-44de-bff3-37a40b93f834",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:05:24.098Z",
      "metadata":{
          "action":"PARTIAL_CANCELLATION",
          "alternatives":[
            {
                "id":"5154c746-918b-4f85-80b1-3b5a448710bb",
                "metadata":{
                  "maxAmount":{
                      "currency":"BRL",
                      "value":"2080"
                  }
                },
                "type":"REFUND"
            }
          ],
          "createdAt":"2024-04-25T19:05:23.953526Z",
          "disputeId":"9eec04a6-5374-4e20-9713-29926924fbc1",
          "expiresAt":"2024-04-25T19:12:23.953526Z",
          "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
          "handshakeType":"AFTER_DELIVERY_PARTIALLY",
          "metadata":{
            "garnishItems":[
                {
                  "amount":{
                      "currency":"BRL",
                      "value":"300"
                  },
                  "id":"2bb737bf-1b72-419d-a77d-8047f07dd144",
                  "index":0,
                  "parentUniqueId":"631839cb-05ca-428b-ba1f-ab1ee7ecc57a",
                  "quantity":3,
                  "reason":"Probando test"
                }
            ]
          },
          "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  5. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenesEjemplo de solicitud para merchant-api
    curl --location --request POST \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/2bb737bf-1b72-419d-a77d-8047f07dd144/reject \
        --header 'Authorization: Bearer jwt-token' \
        --data '{ "reason": "some reason" }'
  6. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"7fb701a9-0996-4418-a3dc-8afa55786764",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"3c5332ee-0616-44de-bff3-37a40b93f834",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:06:38.788Z",
      "metadata":{
          "createdAt":"2024-04-25T19:06:38.692323486Z",
          "disputeId":"9eec04a6-5374-4e20-9713-29926924fbc1",
          "reason":"probando la cancelación parcial",
          "status":"REJECTED"
      }
    }

Enviar propuesta de reembolso

  1. Crear una orden
  2. El comerciante debe confirmar y enviar la orden
  3. El cliente debe confirmar recepción de la orden
  4. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, haga clic en Ayuda > Orden llegó incorrecta > Complete el formulario seleccionando algunos items > Envíe la información > Seleccione la opción "No quiero recibir reembolso en mi saldo de iFood".
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"41597d87-79f1-4a8b-a66d-d575e0a7ccc2",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"3c5332ee-0616-44de-bff3-37a40b93f834",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:05:24.098Z",
      "metadata":{
        "action":"PARTIAL_CANCELLATION",
        "alternatives":[
          {
            "id":"5154c746-918b-4f85-80b1-3b5a448710bb",
            "metadata":{
              "maxAmount":{
                "currency":"BRL",
                "value":"2080"
              }
            },
            "type":"REFUND"
          }
        ],
        "createdAt":"2024-04-25T19:05:23.953526Z",
        "disputeId":"9eec04a6-5374-4e20-9713-29926924fbc1",
        "expiresAt":"2024-04-25T19:12:23.953526Z",
        "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
        "handshakeType":"AFTER_DELIVERY_PARTIALLY",
        "metadata":{
          "garnishItems":[
            {
              "amount":{
                "currency":"BRL",
                "value":"300"
              },
              "id":"2bb737bf-1b72-419d-a77d-8047f07dd144",
              "index":0,
              "parentUniqueId":"631839cb-05ca-428b-ba1f-ab1ee7ecc57a",
              "quantity":3,
              "reason":"Probando test"
            }
          ]
        },
        "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  5. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenesEjemplo de solicitud para merchant-api
    curl --location --request POST \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/2bb737bf-1b72-419d-a77d-8047f07dd144/reject \
        --header 'Authorization: Bearer jwt-token' \
        --data '{ \
            "reason": "some reason" \
        }'
  6. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"4163c287-9855-47a6-a3d9-8712d8b698fe",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"f8b78870-bb5c-4bc9-9de5-bda7dcf3a0ca",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:28:46.065Z",
      "metadata":{
          "createdAt":"2024-04-25T19:28:45.942401249Z",
          "disputeId":"2bb737bf-1b72-419d-a77d-8047f07dd144",
          "selectedDisputeAlternative":{
            "id":"5154c746-918b-4f85-80b1-3b5a448710bb",
            "metadata":{
                "amount":{
                  "currency":"BRL",
                  "value":"300"
                }
            },
            "type":"REFUND"
          },
          "status":"ALTERNATIVE_REPLIED"
      }
    }
  7. Finalmente, el comerciante recibirá otro evento HANDSHAKE_SETTLEMENT vía polling informándole sobre la respuesta del cliente, es decir, si el cliente aceptó, rechazó o no respondió la propuesta de reembolso enviada por el comerciante. En este caso el cliente aceptó el reembolso. Si el cliente no acepta el reembolso el estado de metadata tendrá el valor REJECTED. Si el cliente no responde la propuesta de reembolso, el mismo metadata tendrá el valor EXPIRED.
    {
      "id":"1cba5e42-fe07-45f4-8eed-b3188de5ffeb",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"98403df8-828b-41e3-a3d1-0c9265e854a6",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T18:50:05.149Z",
      "metadata":{
          "createdAt":"2024-04-25T18:50:05.051587724Z",
          "disputeId":"d145bcc6-b5a3-40a6-b9de-a206ac7b536c",
          "status":"ACCEPTED"
      }
    }
Esta negociación ocurre cuando el cliente solicita una cancelación mientras el comerciante está preparando la orden. El comerciante recibirá la solicitud de cancelación y puede aceptar o rechazar la cancelación. A continuación están los pasos para simular cada situación.

Aceptar la negociación de cancelación

  1. Crear una orden
  2. El comerciante debe confirmar la orden
  3. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, haga clic en Ayuda > Compré por accidente > Cancelar orden > Complete el formulario y envíe.
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"1d115926-c439-4cfb-a1df-f8fd4385f2aa",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"f98c70e9-7dc0-4a07-abd1-c8c33e1cd48c",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:46:10.350Z",
      "metadata":{
        "action":"CANCELLATION",
        "createdAt":"2024-04-25T19:46:10.252389Z",
        "disputeId":"b1cab1e3-d4fd-4808-b9eb-5789b04870f2",
        "expiresAt":"2024-04-25T19:51:10.252389Z",
        "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
        "handshakeType":"PREPARATION_TIME",
        "message":"Prueba prueba prueba",
        "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  4. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenesEjemplo de solicitud para merchant-api
    curl --location --request POST \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/b1cab1e3-d4fd-4808-b9eb-5789b04870f2/accept' \
        --header 'Authorization: Bearer jwt-token' \
        --data ''
  5. Después de la respuesta del comerciante estará disponible vía polling en la merchant-api un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió.
    {
      "id":"12060fb5-9ce0-4c60-9bfa-cacc524fe0f3",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"f98c70e9-7dc0-4a07-abd1-c8c33e1cd48c",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:46:47.576Z",
      "metadata":{
          "createdAt":"2024-04-25T19:46:47.474850698Z",
          "disputeId":"b1cab1e3-d4fd-4808-b9eb-5789b04870f2",
          "status":"ACCEPTED"
      }
    }

Rechazar la negociación de cancelación

  1. Crear una orden
  2. El comerciante debe confirmar la orden
  3. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, haga clic en Ayuda > Compré por accidente > Cancelar orden > Complete el formulario y envíe.
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, abrirá una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"1d115926-c439-4cfb-a1df-f8fd4385f2aa",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"f98c70e9-7dc0-4a07-abd1-c8c33e1cd48c",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:46:10.350Z",
      "metadata":{
          "action":"CANCELLATION",
          "createdAt":"2024-04-25T19:46:10.252389Z",
          "disputeId":"b1cab1e3-d4fd-4808-b9eb-5789b04870f2",
          "expiresAt":"2024-04-25T19:51:10.252389Z",
          "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
          "handshakeType":"PREPARATION_TIME",
          "message":"Prueba prueba prueba",
          "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  4. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenesEjemplo de solicitud para merchant-api
    curl --location --request POST \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/b1cab1e3-d4fd-4808-b9eb-5789b04870f2/reject \
        --header 'Authorization: Bearer jwt-token' \
        --data '{ \
            "reason": "some reason" \
        }'
  5. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"12060fb5-9ce0-4c60-9bfa-cacc524fe0f3",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"f98c70e9-7dc0-4a07-abd1-c8c33e1cd48c",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T19:46:47.576Z",
      "metadata":{
          "createdAt":"2024-04-25T19:46:47.474850698Z",
          "disputeId":"b1cab1e3-d4fd-4808-b9eb-5789b04870f2",
          "status":"REJECTED"
      }
    }
Esta negociación ocurre cuando un cliente solicita una cancelación debido a que una orden está retrasada. El comerciante recibirá la solicitud de cancelación y puede aceptar la cancelación o negociar un nuevo tiempo de entrega. A continuación están los pasos para simular cada situación.Esta función está en fase de rollout, por lo que para que el comerciante reciba esta negociación, debe tener la configuración LC_OPS_ORDER_LATE_MARKETPLACE_CHAT_HANDSHAKE_ENABLED establecida como S.

Aceptar la negociación de cancelación

  1. Crear una orden
  2. El comerciante debe confirmar la orden
  3. Esperar a que la orden esté retrasada
  4. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, y haga clic en Necesito ayuda. Se abrirá un chat. El cliente recibirá un mensaje indicando que la orden aún no ha llegado. Posteriormente, el cliente recibirá otro mensaje con un botón "Quiero una estimación nueva". Haga clic en el botón.
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"59c778f3-6e2a-476c-8d44-32c94cc64f6d",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"66a772fb-899e-4b60-9c18-7580d68c8c27",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T20:31:49.529Z",
      "metadata":{
          "action":"CANCELLATION",
          "alternatives":[
            {
                "id":"db7c4043-2bd3-4f0a-aff5-0dc2f3f76bf8",
                "metadata":{
                  "allowedsAdditionalTimeInMinutes":[
                      10,
                      15,
                      20,
                      30
                  ],
                  "allowedsAdditionalTimeReasons":[
                      "HIGH_STORE_DEMAND",
                      "OPERATIONAL_ISSUES",
                      "LACK_OF_DRIVERS",
                      "ORDER_OUT_FOR_DELIVERY",
                      "DRIVER_IS_ALREADY_AT_THE_ADDRESS"
                  ]
                },
                "type":"ADDITIONAL_TIME"
            }
          ],
          "createdAt":"2024-04-25T20:31:49.420595Z",
          "disputeId":"b6a7fe78-34c8-4c11-ac81-060a0de8961f",
          "expiresAt":"2024-04-25T20:36:49.420595Z",
          "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
          "handshakeType":"DELAY",
          "message":"Handshake Order Late",
          "metadata":{
            "acceptCancellationReasons":[
                "HIGH_STORE_DEMAND",
                "STORE_SYSTEM_ISSUES",
                "STORE_INTERNAL_DIFFICULTIES",
                "LACK_OF_DRIVERS",
                "OTHER_REASONS"
            ]
          },
          "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  5. El comerciante debe responder a la solicitud de cancelaciónPara responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenes - Haga clic en "Orden ya no será entregada"Ejemplo: Ingrese la razón usando la casilla de verificación y, si lo desea, puede especificar un poco más sobre por qué la orden ya no será entregada.Ejemplo de solicitud para merchant-apiEn esta transacción específica, al aceptar la cancelación, el comerciante debe indicar por qué está aceptando la cancelación, proporcionando una de las razones listadas en el evento HANDSHAKE_DISPUTE en el metadata acceptCancellationReasons.
    curl --location \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/2097e3ef-1e0e-46ad-a083-5b39cd615df7/accept' \
        --header 'Content-Type: application/json' \
        --header 'Authorization: Bearer jwt-token' \
        --data '{ \
            "reason": "STORE_SYSTEM_ISSUES" \
        }'
  6. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"5d76a147-c7f1-4952-81df-13dd5d1f215d",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"66a772fb-899e-4b60-9c18-7580d68c8c27",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T20:32:39.448Z",
      "metadata":{
          "createdAt":"2024-04-25T20:32:39.335193155Z",
          "disputeId":"b6a7fe78-34c8-4c11-ac81-060a0de8961f",
          "reason":"STORE_SYSTEM_ISSUES",
          "status":"ACCEPTED"
      }
    }

Negociar nuevo tiempo de entrega

  1. Crear una orden
  2. El comerciante debe confirmar la orden
  3. Esperar a que la orden esté retrasada
  4. El cliente debe solicitar cancelación de la orden
    • Para solicitar cancelación de orden, abra la app del cliente, abra la orden, y haga clic en Necesito ayuda. Se abrirá un chat. El cliente recibirá un mensaje indicando que la orden aún no ha llegado. Posteriormente, el cliente recibirá otro mensaje con un botón "Quiero una estimación nueva". Haga clic en el botón.
    • En este punto, la plataforma de cancelación recibirá la solicitud de cancelación y, después de validar las políticas de cancelación, iniciará una negociación con el restaurante. Esta negociación está representada por el evento HANDSHAKE_DISPUTE. Este evento estará disponible para polling vía merchant-api.
    {
      "id":"59c778f3-6e2a-476c-8d44-32c94cc64f6d",
      "code":"HSD",
      "fullCode":"HANDSHAKE_DISPUTE",
      "orderId":"66a772fb-899e-4b60-9c18-7580d68c8c27",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T20:31:49.529Z",
      "metadata":{
          "action":"CANCELLATION",
          "alternatives":[
            {
                "id":"db7c4043-2bd3-4f0a-aff5-0dc2f3f76bf8",
                "metadata":{
                  "allowedsAdditionalTimeInMinutes":[
                      10,
                      15,
                      20,
                      30
                  ],
                  "allowedsAdditionalTimeReasons":[
                      "HIGH_STORE_DEMAND",
                      "OPERATIONAL_ISSUES",
                      "LACK_OF_DRIVERS",
                      "ORDER_OUT_FOR_DELIVERY",
                      "DRIVER_IS_ALREADY_AT_THE_ADDRESS"
                  ]
                },
                "type":"ADDITIONAL_TIME"
            }
          ],
          "createdAt":"2024-04-25T20:31:49.420595Z",
          "disputeId":"b6a7fe78-34c8-4c11-ac81-060a0de8961f",
          "expiresAt":"2024-04-25T20:36:49.420595Z",
          "handshakeGroup":"CUSTOMER_ORDER_SUPPORT",
          "handshakeType":"DELAY",
          "message":"Handshake Order Late",
          "metadata":{
            "acceptCancellationReasons":[
                "HIGH_STORE_DEMAND",
                "STORE_SYSTEM_ISSUES",
                "STORE_INTERNAL_DIFFICULTIES",
                "LACK_OF_DRIVERS",
                "OTHER_REASONS"
            ]
          },
          "timeoutAction":"REJECT_CANCELLATION"
      }
    }
  5. El comerciante debe responder a la solicitud de cancelación.Para responder, el comerciante puede optar por usar el Gestor de órdenes o la merchant-api. Estos son ejemplos de ambas formas de interactuar con la transacción. Ejemplo de imagen del Gestor de órdenes Complete el formulario, seleccionando el tiempo de demora y la razón de la demora. Haga clic en "Actualizar estimación de entrega."Ejemplo de solicitud para merchant-api En esta transacción específica, al proponer un nuevo tiempo de entrega, el comerciante debe indicar el tiempo de demora y la razón de la demora. Las opciones que el comerciante puede elegir para esto se listan en el evento HANDSHAKE_DISPUTE, en el metadata alternatives.metadata.allowedsAdditionalTimeInMinutes y alternatives.metadata.allowedsAdditionalTimeReasons respectivamente.
    curl --location \
        'https://merchant-api.ifood.com.br/order/v1.0/disputes/c95c9885-a0ac-447e-863c-158f97dffd08/alternatives/97c6529f-6d40-4a0a-a6c2-43b64590c81b' \
        --header 'Content-Type: application/json' \
        --header 'Authorization: Bearer jwt-token' \
        --data '{ \
            "type": "ADDITIONAL_TIME", \
            "metadata": { \
                "additionalTimeInMinutes": 30, \
                "additionalTimeReason":"OPERATIONAL_ISSUES" \
            } \
        }'
  6. Después de la respuesta del comerciante, un evento llamado HANDSHAKE_SETTLEMENT que representa la opción que el comerciante eligió estará disponible vía polling en la merchant-api.
    {
      "id":"a803ca50-f452-43c7-bd90-6ba52367a7e9",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"062ea86a-c71e-4285-a991-aad49538bf68",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T20:22:39.298Z",
      "metadata":{
          "createdAt":"2024-04-25T20:22:39.154324166Z",
          "disputeId":"c993fb45-ef7d-495a-9561-b1f03f5712d7",
          "selectedDisputeAlternative":{
            "id":"8052879f-a311-45b3-bf75-78a90b5728ab",
            "metadata":{
                "additionalTimeMinutes":10,
                "additionalTimeReason":"HIGH_STORE_DEMAND"
            },
            "type":"ADDITIONAL_TIME"
          },
          "status":"ALTERNATIVE_REPLIED"
      }
    }
  7. Finalmente, el comerciante recibirá otro evento HANDSHAKE_SETTLEMENT vía polling, informándole de la respuesta del cliente—es decir, si el cliente aceptó, rechazó o no respondió la propuesta de reembolso enviada por el comerciante. En este caso, el cliente aceptó el reembolso. Si el cliente no acepta el reembolso, el estado de metadata será REJECTED. Si el cliente no responde la propuesta de reembolso, el mismo metadata será EXPIRED.
    {
      "id":"dae8bc7e-efbb-473f-b444-9024c5ca9a56",
      "code":"HSS",
      "fullCode":"HANDSHAKE_SETTLEMENT",
      "orderId":"062ea86a-c71e-4285-a991-aad49538bf68",
      "merchantId":"d1a3bc50-6103-49e0-afeb-b619b753fe69",
      "createdAt":"2024-04-25T20:22:49.030Z",
      "metadata":{
          "createdAt":"2024-04-25T20:22:48.923096307Z",
          "disputeId":"6cb058e7-7b17-4415-a957-24038ac522ec",
          "status":"ACCEPTED"
      }
    }
No toda transacción tendrá imágenes de evidencia de cancelación. Cuando hay evidencia de cancelación, simplemente haga una solicitud GET usando el enlace en el campo metadata.evidences[X].url. A continuación hay un ejemplo de código que recupera evidencia de cancelación.
<!DOCTYPE html>
<html lang="es">
   <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Imagen del Servidor</title>
   </head>
   <body>
      <img id="imagenServidor" src="" alt="Imagen del Servidor" style="max-width: 100%; height:
         auto;">
      <script>
         const urlImagen =
         "https://merchant-api.ifood.com.br/order/v1.0/orders/abeff264-bf8b-472d-a6ad-11fea0096253/canc
         ellationEvidences/89422573-3b50-421d-a0f4-051642e75f70";
         const opciones Fetch = {
         method: 'GET',
         headers: {
         'Authorization': 'Bearer jwt-token'
         }
         };
         fetch(urlImagen, opciones Fetch)
         .then(response => {
         if (!response.ok) {
         throw new Error('Falha ao buscar a imagem: ' + response.statusText);
         }
         return response.blob();
         })
         .then(blob => {
         const urlBlob = URL.createObjectURL(blob);
         document.getElementById('imagenServidor').src = urlBlob;
         })
         .catch(error => {
         console.error('Erro:', error);
         });
      </script>
   </body>
</html>
¿Esta página fue útil?
Evalúa tu experiencia en el nuevo portal de desarrolladores: