HANDSHAKE_DISPUTE vía polling o webhook/accept, /reject, o /alternative antes de expiresAtHANDSHAKE_SETTLEMENT confirmando resolucióntimeoutAction automáticamentedisputeId (no reutilizable)HANDSHAKE_DISPUTE conteniendo negociación, acción solicitada, evidencia, plazo y acción automática de timeout. Incluye DisputeAlternative para reembolsos e Item/GarnishItem para cancelaciones parciales.Identificación y contexto| Atributo | Descripción | Tipo | Requerido |
|---|---|---|---|
| id | ID de negociación | uuid | ✓ |
| parentDisputeId | ID de negociación original (si contrapropuesta) | uuid | |
| createdAt | Marca de tiempo de creación | DateTime | ✓ |
| message | Justificación del cliente | String | ✓ |
| Atributo | Descripción | Tipo | Requerido |
|---|---|---|---|
| action | Propósito de negociación | String | ✓ |
| handshakeType | Tipo de negociación | String | ✓ |
| handshakeGroup | Clasificación | String | ✓ |
action:CANCELLATION — Cancelación totalPARTIAL_CANCELLATION — Cancelación parcialPROPOSED_AMOUNT_REFUND — Reembolso propuestoPROPOSED_ADDITIONAL_TIME — Extensión de tiempo propuestaVOID — Sin acciónhandshakeType:AFTER_DELIVERY — Cancelación después de que el cliente recibeDELAY — Cancelación por entrega atrasadaPREPARATION_TIME — Cancelación durante preparaciónAFTER_DELIVERY_PARTIALLY — Cancelación parcial después de entrega| Atributo | Descripción | Tipo | Requerido |
|---|---|---|---|
| expiresAt | Plazo para respuesta | DateTime | ✓ |
| timeoutAction | Acción si no responde | String | ✓ |
timeoutAction:ACCEPT_CANCELLATION — Aceptar automáticamente cancelaciónREJECT_CANCELLATION — Rechazar automáticamente cancelaciónVOID — Sin acción automática| Atributo | Descripción | Tipo | Requerido |
|---|---|---|---|
| alternatives | Opciones de respuesta disponibles | List of DisputeAlternative | |
| metadata.item | Items para cancelación parcial | List of Item | |
| metadata.garnishItems | Sub-items (complementos) | List of GarnishItem | |
| metadata.evidences | Fotos/medios del cliente | List of Media | |
| metadata.acceptCancellationReasons | Razones válidas para aceptar | List of String |
HANDSHAKE_SETTLEMENT conteniendo estado de resolución y razón. Incluye SelectedDisputeAlternative para contrapropostas aceptadas.| Atributo | Descripción | Tipo | Requerido |
|---|---|---|---|
| id | ID de liquidación | uuid | ✓ |
| disputeId | ID de negociación resuelta | uuid | ✓ |
| status | Resultado final | String | ✓ |
| reason | Justificación de rechazo | String | |
| selectedDisputeAlternative | Contrapropuesta (si status = ALTERNATIVE_REPLIED) | SelectedDisputeAlternative |
status:ACCEPTED — Negociación aceptadaREJECTED — Negociación rechazadaEXPIRED — Sin respuesta hasta el plazoALTERNATIVE_REPLIED — Contrapropuesta enviada y aceptadaHandshakeDispute. Valores válidos para type: REFUND, BENEFIT, ADDITIONAL_TIME.| Atributo | Descripción | Tipo | Requerido |
|---|---|---|---|
| id | ID de alternativa | uuid | ✓ |
| type | Tipo de resolución | String | ✓ |
| metadata.maxAmount | Cantidad máxima (REFUND/BENEFIT) | Amount | Cond |
| metadata.allowedsAdditionalTimeInMinutes | Opciones de extensión (minutos) | List of Int | Cond |
| metadata.allowedsAdditionalTimeReasons | Razones para demora | List of String | Cond |
HandshakeSettlement. Valores válidos para type: REFUND, BENEFIT, ADDITIONAL_TIME.| Atributo | Descripción | Tipo | Requerido |
|---|---|---|---|
| id | ID de alternativa | uuid | ✓ |
| type | Tipo de resolución | String | ✓ |
| metadata.amount | Cantidad (REFUND/BENEFIT) | Amount | Cond |
| metadata.additionalTimeInMinutes | Extensión de tiempo | int | Cond |
| metadata.reason | Razón de demora | String | Cond |
| Atributo | Tipo |
|---|---|
| url | String (requiere autenticación) |
| contentType | String (tipo MIME) |
| Atributo | Tipo |
|---|---|
| id | uuid |
| uniqueId | uuid |
| externalCode | String |
| quantity | int |
| index | int |
| amount | Amount |
| reason | String |
| Atributo | Tipo |
|---|---|
| id | uuid |
| parentUniqueId | uuid |
| externalCode | String |
| quantity | int |
| index | int |
| amount | Amount |
| reason | String |
| Atributo | Descripción | Tipo |
|---|---|---|
| value | Cantidad sin decimales ($1.00 = 100) | String |
| currency | Código de moneda (ej: USD) | String |
handshakeType| Valor | Descripción |
|---|---|
AFTER_DELIVERY | Cancelación después de recibir |
DELAY | Cancelación por entrega atrasada |
PREPARATION_TIME | Cancelación durante preparación |
AFTER_DELIVERY_PARTIALLY | Cancelación parcial después de entrega |
handshakeGroup| Valor | Descripción |
|---|---|
CUSTOMER_ORDER_SUPPORT | Negociación iniciada por cliente |
action| Valor | Descripción |
|---|---|
CANCELLATION | Cancelación total |
PARTIAL_CANCELLATION | Cancelación parcial |
PROPOSED_AMOUNT_REFUND | Cancelación con opción de reembolso |
timeoutAction| Valor | Acción |
|---|---|
ACCEPT_CANCELLATION | Cancelar automáticamente |
REJECT_CANCELLATION | Rechazar cancelación automáticamente |
VOID | Sin acción automática |
status| Valor | Descripción |
|---|---|
ACCEPTED | Negociación aceptada |
REJECTED | Negociación rechazada |
EXPIRED | Sin respuesta antes de plazo |
ALTERNATIVE_REPLIED | Contrapropuesta enviada y aceptada |
type| Valor | Descripción |
|---|---|
REFUND | Reembolso en dinero |
BENEFIT | Crédito/beneficio |
ADDITIONAL_TIME | Extensión de tiempo |
negotiationReasons| Razón | Contexto |
|---|---|
HIGH_STORE_DEMAND | Tienda en capacidad máxima |
UNKNOWN_ISSUE | Problema no especificado |
CUSTOMER_SATISFACTION | Satisfacción del cliente |
INVENTORY_CHECK | Verificación de disponibilidad |
SYSTEM_ISSUE | Problema técnico |
WRONG_ORDER | Pedido incorrecto |
PRODUCT_QUALITY | Preocupación de calidad |
LATE_DELIVERY | Entrega atrasada |
CUSTOMER_REQUEST | Solicitud del cliente |
POST https://merchant-api.ifood.com.br/order/v1.0/disputes/{disputeId}/acceptParámetros:| Nombre | Tipo | Descripción |
|---|---|---|
disputeId | uuid | ID de disputa (URL) |
reason | string | Razón de metadata.acceptCancellationReasons |
detailReason | string | Descripción (máx 250 caracteres) |
curl -X POST "https://merchant-api.ifood.com.br/order/v1.0/disputes/dispute_001/accept" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"reason": "CUSTOMER_SATISFACTION", "detailReason": "Reembolso por cortesía"}'{
"id": "settlement_001",
"status": "ACCEPTED",
"disputeId": "dispute_001",
"createdAt": "2024-04-25T18:05:00Z"
}| Estado | Código | Razón |
|---|---|---|
| 401 | - | Token inválido |
| 404 | DISPUTE_NOT_FOUND | Disputa no encontrada |
| 422 | DISPUTE_ALREADY_ANSWERED | Ya respondida |
| 400 | INVALID_REASON | Razón inválida |
POST https://merchant-api.ifood.com.br/order/v1.0/disputes/{disputeId}/rejectParámetros:| Nombre | Tipo | Descripción |
|---|---|---|
disputeId | uuid | ID de disputa (URL) |
reason | string | Razón de negotiationReasons |
curl -X POST "https://merchant-api.ifood.com.br/order/v1.0/disputes/dispute_002/reject" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"reason": "INVENTORY_CHECK"}'{
"id": "settlement_002",
"status": "REJECTED",
"disputeId": "dispute_002",
"createdAt": "2024-04-25T18:08:00Z"
}| Estado | Código | Razón |
|---|---|---|
| 401 | - | Token inválido |
| 404 | DISPUTE_NOT_FOUND | Disputa no encontrada |
| 422 | DISPUTE_ALREADY_ANSWERED | Ya respondida |
| 400 | INVALID_REASON | Razón inválida |
POST https://merchant-api.ifood.com.br/order/v1.0/disputes/{disputeId}/alternativeParámetros:| Nombre | Tipo | Descripción |
|---|---|---|
disputeId | uuid | ID de disputa (URL) |
type | string | REFUND, BENEFIT o ADDITIONAL_TIME |
metadata.amount | Amount | Cantidad (REFUND/BENEFIT) |
metadata.additionalTimeInMinutes | int | Minutos (ADDITIONAL_TIME) |
metadata.reason | string | Razón de demora (ADDITIONAL_TIME) |
curl -X POST "https://merchant-api.ifood.com.br/order/v1.0/disputes/dispute_001/alternative" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"type": "REFUND",
"metadata": {
"amount": {
"value": "5000",
"currency": "BRL"
}
}
}'{
"id": "settlement_003",
"status": "ALTERNATIVE_REPLIED",
"disputeId": "dispute_003",
"selectedDisputeAlternative": {
"id": "alt_001",
"type": "ADDITIONAL_TIME",
"metadata": {
"additionalTimeInMinutes": 30,
"reason": "HIGH_STORE_DEMAND"
}
},
"createdAt": "2024-04-25T18:12:00Z"
}| Estado | Código | Razón |
|---|---|---|
| 401 | - | Token inválido |
| 404 | DISPUTE_NOT_FOUND | Disputa no encontrada |
| 422 | DISPUTE_ALREADY_ANSWERED | Ya respondida |
| 400 | INVALID_AMOUNT | Cantidad fuera de rango |
| Escenario | handshakeType | action | Respuestas |
|---|---|---|---|
| Total después de entrega | AFTER_DELIVERY | CANCELLATION | Aceptar / Rechazar / REFUND |
| Total durante preparación | PREPARATION_TIME | CANCELLATION | Aceptar / Rechazar |
| Total (atrasado) | DELAY | CANCELLATION | Aceptar / Rechazar / ADDITIONAL_TIME |
| Parcial después de entrega | AFTER_DELIVERY_PARTIALLY | PARTIAL_CANCELLATION | Aceptar / Rechazar / REFUND |
expiresAt, timeoutAction se ejecuta:HANDSHAKE_SETTLEMENT con status: EXPIRED.| Atributo | Tipo |
|---|---|
| id | string |
| code | string (siempre "HSD") |
| fullCode | string (siempre "HANDSHAKE_DISPUTE") |
| orderId | uuid |
| merchantId | uuid |
| createdAt | DateTime |
| metadata | HandshakeDispute |
{
"id": "evt_001",
"code": "HSD",
"fullCode": "HANDSHAKE_DISPUTE",
"orderId": "ord_12345",
"merchantId": "merchant_001",
"createdAt": "2024-04-25T18:02:46.921Z",
"metadata": {
"id": "dispute_001",
"action": "CANCELLATION",
"handshakeType": "AFTER_DELIVERY",
"handshakeGroup": "CUSTOMER_ORDER_SUPPORT",
"message": "Comida llegó fría",
"expiresAt": "2024-04-25T18:09:46Z",
"timeoutAction": "REJECT_CANCELLATION",
"createdAt": "2024-04-25T18:02:46Z",
"alternatives": [
{
"id": "alt_001",
"type": "REFUND",
"metadata": {
"maxAmount": {
"currency": "BRL",
"value": "5000"
}
}
}
],
"acceptCancellationReasons": ["PRODUCT_QUALITY", "CUSTOMER_SATISFACTION"],
"evidences": [
{
"url": "https://merchant-api.ifood.com.br/orders/ord_12345/evidences/abc123",
"contentType": "image/jpeg"
}
]
}
}| Atributo | Tipo |
|---|---|
| id | string |
| code | string (siempre "HSS") |
| fullCode | string (siempre "HANDSHAKE_SETTLEMENT") |
| orderId | uuid |
| merchantId | uuid |
| createdAt | DateTime |
| metadata | HandshakeSettlement |
{
"id": "evt_settlement_001",
"code": "HSS",
"fullCode": "HANDSHAKE_SETTLEMENT",
"orderId": "ord_12345",
"merchantId": "merchant_001",
"createdAt": "2024-04-25T18:05:00Z",
"metadata": {
"id": "settlement_001",
"disputeId": "dispute_001",
"status": "ACCEPTED",
"reason": "CUSTOMER_SATISFACTION",
"createdAt": "2024-04-25T18:05:00Z"
}
}