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

Pedidos fuera de la plataforma iFood

Esta sección explica cómo integrar pedidos realizados fuera de la plataforma iFood (no poseen orderId preexistente) al servicio de entrega Bajo Demanda.
ClientAPIPolling de Eventos1. Verificar disponibilidadGET /merchants/{merchantId}/deliveryAvailabilitiesCotización y ventanas de entrega2. Registrar pedidoPOST /merchants/{merchantId}/ordersEvento de código de confirmaciónID del pedido + URL rastreo3. Cancelar pedido (opcional)POST /orders/{orderId}/cancelCANCELLATION_REQUESTED202 AcceptedClientAPIPolling de Eventos
Antes de registrar el pedido, consulte la disponibilidad de entrega para validar la cobertura y obtener estimaciones.
  • Validar área de cobertura
  • Identificar indisponibilidad temporal
  • Obtener estimación de tiempo y costo
  • Evitar errores en el registro
Aunque opcional, esta verificación previene errores y permite una mejor planificación operacional.
GET /shipping/v1.0/merchants/{merchantId}/deliveryAvailabilities?latitude={lat}&longitude={lng}
Parámetros obligatorios:
  • merchantId (path) - ID del merchant
  • latitude (query) - Latitud de la dirección de entrega
  • longitude (query) - Longitud de la dirección de entrega

Campos de la respuesta

CampoTipoDescripción
iduuidID de la cotización
expirationAtdatetimeValidez de la cotización (UTC)
createdAtdatetimeFecha de creación (UTC)
distanceintegerDistancia en metros
preparationTimeintegerTiempo de preparación en segundos
quote.grossValuedecimalValor bruto
quote.discountdecimalDescuento
quote.raisedecimalIncremento
quote.netValuedecimalValor neto
deliveryTime.minintegerTiempo mínimo de entrega (segundos)
deliveryTime.maxintegerTiempo máximo de entrega (segundos)
hasPaymentMethodsbooleanIndica métodos de pago disponibles
paymentMethods[].methodstringCREDIT, DEBIT o CASH

Ejemplo

{
  "id": "57cd1046-2e06-446f-a2dd-18a518212c3c",
  "expirationAt": "2023-08-18T19:49:06Z",
  "createdAt": "2023-08-17T19:49:06Z",
  "distance": 3000,
  "preparationTime": 60,
  "quote": {
    "grossValue": 7.99,
    "discount": 0,
    "raise": 0,
    "netValue": 7.99
  },
  "deliveryTime": {
    "min": 1200,
    "max": 1800
  },
  "hasPaymentMethods": true,
  "paymentMethods": [
    {
      "id": "21c65a8c-f29e-463f-b0bd-240edeb593c4",
      "brand": "Visa",
      "liability": "IFOOD",
      "paymentType": "OFFLINE",
      "method": "CREDIT"
    },
    {
      "id": "93c1c7c7-61f1-4dd9-bb84-62a03254701d",
      "liability": "IFOOD",
      "paymentType": "OFFLINE",
      "method": "CASH"
    }
  ]
}

Códigos de error

CódigoDescripción
BadRequestProblema en la solicitud. Verifique los datos
BadRequestMerchantMerchant no disponible
DeliveryDistanceTooHighDirección fuera del área de cobertura
OffOpeningHoursFuera del horario de funcionamiento
OriginNotFoundTienda fuera del área logística
ServiceAreaMismatchDirección fuera del área de cobertura
HighDemandLogística temporalmente no disponible
MerchantStatusAvailabilityMerchant con pendencia
InvalidPaymentMethodsForma de pago no aceptada
NRELimitExceededLímite de repartidores alcanzado
UnavailableFleetFlota no disponible
Registre el pedido para solicitar automáticamente un repartidor socio.
  • Un repartidor será asignado automáticamente después del registro
  • Si la entrega no es posible, el pedido no será registrado
  • Asegúrese de validar los datos antes de enviar
Por seguridad, se genera automáticamente un código de confirmación (4 últimos dígitos del teléfono).

Cómo funciona

Con código (por defecto):
  • Envíe customer.phone.type="CUSTOMER" con teléfono válido
  • El repartidor solicitará el código en la entrega
  • El cliente debe ser informado previamente
Sin código:
  • Envíe customer.phone.type="STORE"
  • No se solicitará código
Informe al cliente que el repartidor solicitará los 4 últimos dígitos del teléfono. La falla en la validación puede resultar en cancelación.

Para socios sin página de rastreo iFood

Consuma el evento DELIVERY_DROP_CODE_REQUESTED con metadata.CODE para poner el código a disposición del cliente.
POST /shipping/v1.0/merchants/{merchantId}/orders
Campos obligatorios marcados con *

Customer (Cliente)

CampoTipoDescripción
customer.name*stringNombre (máx. 50 caracteres)
customer.phone.typestringCUSTOMER (por defecto) o STORE
customer.phone.countryCode*stringCódigo del país (2 dígitos). Ej: 55
customer.phone.areaCode*stringCódigo de área (2 dígitos). Ej: 11
customer.phone.number*stringTeléfono (7-9 dígitos)
* No obligatorio si customer.phone.type="STORE"

Delivery (Entrega)

CampoTipoDescripción
delivery.merchantFee*floatTarifa del socio
delivery.preparationTimeintegerTiempo de preparación (segundos)
delivery.quoteIduuidID de la cotización
delivery.deliveryAddress.postalCode*stringCódigo postal (8 dígitos)
delivery.deliveryAddress.streetNumber*stringNúmero
delivery.deliveryAddress.streetName*stringCalle (máx. 50 caracteres)
delivery.deliveryAddress.complementstringComplemento (máx. 50 caracteres)
delivery.deliveryAddress.referencestringReferencia (máx. 70 caracteres)
delivery.deliveryAddress.neighborhood*stringBarrio (máx. 50 caracteres)
delivery.deliveryAddress.city*stringCiudad (2-50 caracteres)
delivery.deliveryAddress.state*stringEstado (2 letras). Ej: SP
delivery.deliveryAddress.country*stringPaís (2 letras). Ej: BR
delivery.deliveryAddress.coordinates.latitude*floatLatitud
delivery.deliveryAddress.coordinates.longitude*floatLongitud

Items (Artículos)

CampoTipoDescripción
items[].id*uuidID del artículo
items[].name*stringNombre (máx. 50 caracteres)
items[].externalCodestringCódigo externo
items[].quantity*integerCantidad (> 0)
items[].unitPrice*floatPrecio unitario (≥ 0)
items[].price*floatPrecio total (quantity * unitPrice)
items[].optionsPrice*floatPrecio de los complementos (≥ 0)
items[].totalPrice*floatTotal (price + optionsPrice)

Payments (Pagos)

Pago Offline:
CampoTipoDescripción
payments.methods[].method*stringCREDIT, DEBIT o CASH
payments.methods[].type*stringOFFLINE
payments.methods[].value*floatValor
payments.methods[].card.brand*stringMarca (si CREDIT/DEBIT)
payments.methods[].cash.changeFor*floatCambio (si CASH)
Pago Online: No enviar objeto payments (procesado por el merchant)

Otros campos

CampoTipoDescripción
displayIdstringID amigable (máx. 4 caracteres). Ej: A4BC
metadataobjectInformación adicional (máx. 20 caracteres)
Use delivery.preparationTime para retrasar la asignación del repartidor.
  • No enviado: Asignación inmediata
  • Enviado: Asignación después del tiempo especificado (en segundos)
Informe el tiempo más preciso posible. Tiempos incorrectos pueden resultar en:
  • Retrasos en la entrega
  • Mala experiencia para el cliente
  • Posible cierre por acumulación de repartidores
{
  "id": "522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8",
  "trackingUrl": "https://meupedido.ifood.com.br/522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8"
}
Integración con polling
CódigoDescripción
BadRequestProblema en la solicitud
BadRequestCustomerCliente no disponible
BadRequestMerchantMerchant no disponible
DeliveryDistanceTooHighFuera del área de cobertura
HighDemandLogística no disponible temporalmente
MerchantEasyDeliveryDisabledServicio no habilitado
OffOpeningHoursFuera del horario de funcionamiento
OriginNotFoundTienda fuera del área logística
PaymentMethodNotFoundMétodo de pago no encontrado
PaymentTotalInvalidValor del pago no corresponde al total
ServiceAreaMismatchDirección fuera de la cobertura
NRELimitExceededLímite de repartidores alcanzado
Permite que el cliente confirme o solicite alteración de la dirección de entrega después de la creación del pedido.

Con página de rastreo iFood

El cliente usa la página de iFood para confirmar/alterar la dirección.Requisitos:
  • El pedido NO puede tener customer.phone.type="STORE"
  • Teléfono válido es obligatorio para OTP
Envíe el teléfono correcto usado como WhatsApp para recibir el código OTP de confirmación.

Sin página de rastreo iFood

El merchant implementa su propia experiencia usando los endpoints.Nota: iFood no enviará OTP. La validación es responsabilidad del merchant.
POST /shipping/v1.0/orders/{orderId}/userConfirmAddress
Respuesta: 202 Accepted
Evento: DELIVERY_ADDRESS_CHANGE_USER_CONFIRMED
POST /shipping/v1.0/orders/{orderId}/deliveryAddressChangeRequest
Parámetros obligatorios:
  • streetName, neighborhood, city, state, country
  • coordinates (latitude, longitude)
Plazo para respuestaEl merchant tiene 15 minutos para aceptar/rechazar. Después de eso, rechazo automático.
Límite: Alteración máxima de 500m de la coordenada originalEvento: DELIVERY_ADDRESS_CHANGE_REQUESTED
POST /shipping/v1.0/orders/{orderId}/acceptDeliveryAddressChange
Evento: DELIVERY_ADDRESS_CHANGE_ACCEPTEDError RegionMismatch: Genera evento automático DELIVERY_ADDRESS_CHANGE_DENIED con metadata.action="region-mismatch"
POST /shipping/v1.0/orders/{orderId}/denyDeliveryAddressChange
Evento: DELIVERY_ADDRESS_CHANGE_DENIED
CódigoStatusDescripción
BadRequest400Parámetros inválidos
OrderNotFound404Pedido no encontrado o expirado (>8h)
ChangeAddressOperationConflict409Conflicto con operación existente
ChangeAddressOperationNotStarted409Ninguna alteración pendiente
MaxDistanceHigherThanAllowed400Alteración > 500m
RegionMismatch400Nueva dirección en región diferente
Cancele pedidos con salesChannel="POS".
GET /shipping/v1.0/orders/{orderId}/cancellationReasons
Respuesta 200 OK:
[{
  "cancelCodeId": "817",
  "description": "El cliente canceló el pedido por el restaurante"
}]
Respuesta 204: El pedido ya no puede ser cancelado
POST /shipping/v1.0/orders/{orderId}/cancel
Body:
{
  "reason": "Cliente solicitó cancelación",
  "cancellationCode": "817"
}
Respuesta: 202 AcceptedEventos:
  1. CANCELLATION_REQUESTED
  2. CANCELLED (éxito) o CANCELLATION_REQUEST_FAILED (falla)
Sistema de scoring basado en reglas de validación.
NivelDescripción
LOWConfianza baja
MODERATEConfianza moderada
HIGHConfianza alta
VERY_HIGHConfianza muy alta
ReglaDescripción
customer_phone_validTeléfono válido (no STORE, >11 dígitos)
customer_phone_is_fixedTeléfono fijo (8 dígitos)
customer_address_confirmedDirección confirmada por el cliente
customer_address_change_requestedCliente solicitó alteración
merchant_address_change_approvedMerchant aprobó alteración
merchant_address_change_deniedMerchant rechazó alteración
  • customer_phone_valid:falseLOW
  • customer_phone_is_fixed:trueMODERATE
  • customer_phone_is_fixed:true + customer_address_confirmed:trueVERY_HIGH
  • customer_phone_valid:trueHIGH
  • customer_phone_valid:true + alteración aprobada → VERY_HIGH
  • customer_phone_valid:true + alteración rechazada → LOW
GET /shipping/v1.0/orders/{orderId}/safeDelivery
Respuesta 200 OK:
{
  "rules": {
    "customer_address_change_requested": false,
    "customer_address_confirmed": false,
    "customer_phone_is_fixed": false,
    "customer_phone_valid": true,
    "merchant_address_change_approved": false,
    "merchant_address_change_denied": false
  },
  "score": "HIGH"
}
Errores:
  • 400 OrderWithoutSafeDelivery: Pedido sin reglas de confianza
  • 404 OrderNotFound: Pedido no encontrado
El score puede cambiar después de la creación del pedido basándose en las acciones del cliente y merchant.
¿Esta página fue útil?
Evalúa tu experiencia en el nuevo portal de desarrolladores: