HANDSHAKE_DISPUTE via polling or webhook/accept, /reject, or /alternative before expiresAtHANDSHAKE_SETTLEMENT confirming resolutiontimeoutAction automaticallydisputeId (not reusable)HANDSHAKE_DISPUTE event containing negotiation, requested action, evidence, deadline, and automatic timeout action. Includes DisputeAlternative for refunds and Item/GarnishItem for partial cancellations.Identification and context| Attribute | Description | Type | Required |
|---|---|---|---|
| id | Negotiation ID | uuid | ✓ |
| parentDisputeId | Original negotiation ID (if counteroffer) | uuid | |
| createdAt | Creation timestamp | DateTime | ✓ |
| message | Customer justification | String | ✓ |
| Attribute | Description | Type | Required |
|---|---|---|---|
| action | Negotiation purpose | String | ✓ |
| handshakeType | Negotiation type | String | ✓ |
| handshakeGroup | Classification | String | ✓ |
action:CANCELLATION — Full cancellationPARTIAL_CANCELLATION — Partial cancellationPROPOSED_AMOUNT_REFUND — Proposed refundPROPOSED_ADDITIONAL_TIME — Proposed time extensionVOID — No actionhandshakeType:AFTER_DELIVERY — Cancellation after customer receivesDELAY — Cancellation due to late deliveryPREPARATION_TIME — Cancellation during preparationAFTER_DELIVERY_PARTIALLY — Partial cancellation after delivery| Attribute | Description | Type | Required |
|---|---|---|---|
| expiresAt | Response deadline | DateTime | ✓ |
| timeoutAction | Action if no response | String | ✓ |
timeoutAction:ACCEPT_CANCELLATION — Auto-accept cancellationREJECT_CANCELLATION — Auto-reject cancellationVOID — No automatic action| Attribute | Description | Type | Required |
|---|---|---|---|
| alternatives | Available response options | List of DisputeAlternative | |
| metadata.item | Items for partial cancellation | List of Item | |
| metadata.garnishItems | Sub-items (add-ons) | List of GarnishItem | |
| metadata.evidences | Photos/media from customer | List of Media | |
| metadata.acceptCancellationReasons | Valid reasons to accept | List of String |
HANDSHAKE_SETTLEMENT event containing resolution status and reason. Includes SelectedDisputeAlternative for accepted counteroffers.| Attribute | Description | Type | Required |
|---|---|---|---|
| id | Settlement ID | uuid | ✓ |
| disputeId | Resolved negotiation ID | uuid | ✓ |
| status | Final result | String | ✓ |
| reason | Rejection justification | String | |
| selectedDisputeAlternative | Counteroffer (if status = ALTERNATIVE_REPLIED) | SelectedDisputeAlternative |
status:ACCEPTED — Negotiation acceptedREJECTED — Negotiation rejectedEXPIRED — No response until deadlineALTERNATIVE_REPLIED — Counteroffer sent and acceptedHandshakeDispute. Valid values for type: REFUND, BENEFIT, ADDITIONAL_TIME.| Attribute | Description | Type | Required |
|---|---|---|---|
| id | Alternative ID | uuid | ✓ |
| type | Resolution type | String | ✓ |
| metadata.maxAmount | Maximum amount (REFUND/BENEFIT) | Amount | Cond |
| metadata.allowedsAdditionalTimeInMinutes | Time extension options (minutes) | List of Int | Cond |
| metadata.allowedsAdditionalTimeReasons | Delay reasons | List of String | Cond |
HandshakeSettlement. Valid values for type: REFUND, BENEFIT, ADDITIONAL_TIME.| Attribute | Description | Type | Required |
|---|---|---|---|
| id | Alternative ID | uuid | ✓ |
| type | Resolution type | String | ✓ |
| metadata.amount | Amount (REFUND/BENEFIT) | Amount | Cond |
| metadata.additionalTimeInMinutes | Time extension | int | Cond |
| metadata.reason | Delay reason | String | Cond |
| Attribute | Type |
|---|---|
| url | String (requires authentication) |
| contentType | String (MIME type) |
| Attribute | Type |
|---|---|
| id | uuid |
| uniqueId | uuid |
| externalCode | String |
| quantity | int |
| index | int |
| amount | Amount |
| reason | String |
| Attribute | Type |
|---|---|
| id | uuid |
| parentUniqueId | uuid |
| externalCode | String |
| quantity | int |
| index | int |
| amount | Amount |
| reason | String |
| Attribute | Description | Type |
|---|---|---|
| value | Amount without decimals ($1.00 = 100) | String |
| currency | Currency code (ex: USD) | String |
handshakeType| Value | Description |
|---|---|
AFTER_DELIVERY | Cancellation after customer received |
DELAY | Cancellation for late delivery |
PREPARATION_TIME | Cancellation during preparation |
AFTER_DELIVERY_PARTIALLY | Partial cancellation after delivery |
handshakeGroup| Value | Description |
|---|---|
CUSTOMER_ORDER_SUPPORT | Customer-initiated negotiation |
action| Value | Description |
|---|---|
CANCELLATION | Full cancellation |
PARTIAL_CANCELLATION | Partial cancellation |
PROPOSED_AMOUNT_REFUND | Cancellation with refund option |
timeoutAction| Value | Action |
|---|---|
ACCEPT_CANCELLATION | Cancel automatically |
REJECT_CANCELLATION | Reject cancellation automatically |
VOID | No automatic action |
status| Value | Description |
|---|---|
ACCEPTED | Negotiation accepted |
REJECTED | Negotiation rejected |
EXPIRED | No response before deadline |
ALTERNATIVE_REPLIED | Counteroffer sent and accepted |
type| Value | Description |
|---|---|
REFUND | Money refund |
BENEFIT | Credit/benefit |
ADDITIONAL_TIME | Time extension |
negotiationReasons| Reason | Context |
|---|---|
HIGH_STORE_DEMAND | Store at capacity |
UNKNOWN_ISSUE | Unspecified issue |
CUSTOMER_SATISFACTION | Customer service |
INVENTORY_CHECK | Availability verification |
SYSTEM_ISSUE | Technical issue |
WRONG_ORDER | Incorrect order |
PRODUCT_QUALITY | Quality concern |
LATE_DELIVERY | Late delivery |
CUSTOMER_REQUEST | Customer request |
POST https://merchant-api.ifood.com.br/order/v1.0/disputes/{disputeId}/acceptParameters:| Name | Type | Description |
|---|---|---|
disputeId | uuid | Dispute ID (URL) |
reason | string | Reason from metadata.acceptCancellationReasons |
detailReason | string | Description (250 chars max) |
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": "Refund for courtesy"}'{
"id": "settlement_001",
"status": "ACCEPTED",
"disputeId": "dispute_001",
"createdAt": "2024-04-25T18:05:00Z"
}| Status | Code | Reason |
|---|---|---|
| 401 | - | Invalid token |
| 404 | DISPUTE_NOT_FOUND | Dispute not found |
| 422 | DISPUTE_ALREADY_ANSWERED | Already answered |
| 400 | INVALID_REASON | Invalid reason |
POST https://merchant-api.ifood.com.br/order/v1.0/disputes/{disputeId}/rejectParameters:| Name | Type | Description |
|---|---|---|
disputeId | uuid | Dispute ID (URL) |
reason | string | Reason from 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"
}| Status | Code | Reason |
|---|---|---|
| 401 | - | Invalid token |
| 404 | DISPUTE_NOT_FOUND | Dispute not found |
| 422 | DISPUTE_ALREADY_ANSWERED | Already answered |
| 400 | INVALID_REASON | Invalid reason |
POST https://merchant-api.ifood.com.br/order/v1.0/disputes/{disputeId}/alternativeParameters:| Name | Type | Description |
|---|---|---|
disputeId | uuid | Dispute ID (URL) |
type | string | REFUND, BENEFIT or ADDITIONAL_TIME |
metadata.amount | Amount | Amount (REFUND/BENEFIT) |
metadata.additionalTimeInMinutes | int | Minutes (ADDITIONAL_TIME) |
metadata.reason | string | Delay reason (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"
}| Status | Code | Reason |
|---|---|---|
| 401 | - | Invalid token |
| 404 | DISPUTE_NOT_FOUND | Dispute not found |
| 422 | DISPUTE_ALREADY_ANSWERED | Already answered |
| 400 | INVALID_AMOUNT | Amount out of range |
| Scenario | handshakeType | action | Responses |
|---|---|---|---|
| Full after delivery | AFTER_DELIVERY | CANCELLATION | Accept / Reject / REFUND |
| Full during preparation | PREPARATION_TIME | CANCELLATION | Accept / Reject |
| Full (late) | DELAY | CANCELLATION | Accept / Reject / ADDITIONAL_TIME |
| Partial after delivery | AFTER_DELIVERY_PARTIALLY | PARTIAL_CANCELLATION | Accept / Reject / REFUND |
expiresAt, timeoutAction executes:HANDSHAKE_SETTLEMENT with status: EXPIRED.| Attribute | Type |
|---|---|
| id | string |
| code | string (always "HSD") |
| fullCode | string (always "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": "Food arrived cold",
"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"
}
]
}
}| Attribute | Type |
|---|---|
| id | string |
| code | string (always "HSS") |
| fullCode | string (always "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"
}
}