Solicitar demo

Orders API

Crear pedido

Crea pedidos desde una cuenta dispatcher para un restaurante ya dado de alta o para un restaurante externo enviado en la petición.

Volver a todos los endpoints

Orders API

Crear pedido

Este endpoint cubre el flujo público inicial para integraciones dispatcher. Permite crear un pedido para un restaurante existente o para un restaurante externo enviado en el payload.

POST /api/orders 201 Created
Auth requerida Perfil: dispatcher

Requisitos para restaurante existente

  • Enviar restaurantId.
  • Enviar destino con deliveryAddress, deliveryLat y deliveryLng.
  • Los datos de recogida pueden omitirse si el restaurante ya tiene ubicación configurada.

Requisitos para restaurante externo

  • Enviar externalRestaurant con source, externalId, displayName y location.
  • Opcionalmente enviar photoUrl y logoUrl como URLs públicas del restaurante.
  • Enviar recogida completa: pickupAddress, pickupLat y pickupLng.
  • Enviar destino con deliveryAddress, deliveryLat y deliveryLng.

Campos principales

Resumen de los campos relevantes para este endpoint.

Campo Tipo Uso Descripción
dispatchOrderId string Opcional Referencia de tu sistema para localizar el pedido en listados, logs o soporte.
restaurantId string Restaurante existente Identificador de restaurante facilitado durante el alta de la integración.
externalRestaurant object Restaurante externo Datos del restaurante cuando aún no existe en Operio, incluyendo foto o logo públicos si están disponibles.
customerInfo object Opcional Datos del cliente final: nombre, teléfono, email y notas.
deliveryInfo object Obligatorio Dirección y coordenadas de entrega. En restaurantes externos también incluye datos de recogida.
paymentInfo object Opcional Método de pago, estado del cobro, importe total, moneda e importe esperado en efectivo.

Request JSON

{
  "dispatchOrderId": "POS-93442",
  "restaurantId": "rest_12345",
  "customerInfo": {
    "customerName": "Ana Perez",
    "customerPhone": "+34 600 000 000",
    "customerEmail": "ana@example.com",
    "customerNotes": "Llamar si no responde"
  },
  "deliveryInfo": {
    "deliveryAddress": "C. Cisne, 21-17, 03006 Alicante",
    "deliveryLat": 38.346158,
    "deliveryLng": -0.510089,
    "deliveryNotes": "Piso 7, puerta 13"
  },
  "paymentInfo": {
    "method": "cash",
    "status": "pending",
    "totalAmount": "18.50",
    "currency": "EUR",
    "cashExpectedAmount": "20.00"
  }
}

Respuesta 201

{
  "data": {
    "orderId": "ord_7G9K2Q",
    "dispatchOrderId": "EXT-1001",
    "currentStatus": "dispatcher_accepted",
    "createdAt": "2026-06-16T10:30:00.000Z",
    "updatedAt": "2026-06-16T10:30:00.000Z",
    "customerInfo": {
      "customerName": "Ana Perez",
      "customerPhone": "+34 600 000 000",
      "customerEmail": null,
      "customerNotes": null
    },
    "deliveryInfo": {
      "pickupAddress": "Av. de Orihuela, 27, 03007 Alicante",
      "pickupLat": 38.344498,
      "pickupLng": -0.509259,
      "deliveryAddress": "C. Cisne, 21-17, 03006 Alicante",
      "deliveryLat": 38.346158,
      "deliveryLng": -0.510089,
      "deliveryNotes": "Piso 7, puerta 13"
    },
    "paymentInfo": {
      "method": "cash",
      "status": "pending",
      "totalAmount": "18.50",
      "currency": "EUR",
      "cashExpectedAmount": "20.00"
    }
  }
}

Consola de prueba

Envía una petición de creación

Ajusta la URL base, pega tu token de dispatcher y prueba el payload seleccionado. También puedes copiar el ejemplo como cURL o JavaScript.

La respuesta aparecerá aquí.

Errores esperados

Respuestas habituales que debe contemplar la integración.

400
ORDER_CREATE_INVALID_PAYLOAD

Payload inválido

Body inválido no cubierto por una regla más específica.

400
ORDER_CREATE_RESTAURANT_ID_REQUIRED_FOR_DISPATCHER

Falta restaurante

Dispatcher crea pedido para restaurante registrado sin restaurantId.

400
ORDER_CREATE_DISPATCHER_ID_REQUIRED_FOR_RESTAURANT

Falta dispatcher

Restaurante crea pedido y no se puede resolver dispatcherId.

400
ORDER_CREATE_RESTAURANT_AND_EXTERNAL_MUTUALLY_EXCLUSIVE

Restaurante duplicado

Se envían restaurantId y externalRestaurant a la vez.

400
ORDER_CREATE_DELIVERY_INFO_REQUIRED

Falta deliveryInfo

La petición no incluye el bloque deliveryInfo.

400
ORDER_CREATE_DELIVERY_COORDINATES_REQUIRED

Destino incompleto

Faltan deliveryAddress, deliveryLat o deliveryLng.

400
ORDER_CREATE_EXTERNAL_RESTAURANT_IDENTITY_REQUIRED

Restaurante externo incompleto

externalRestaurant no trae source, externalId o displayName.

400
ORDER_CREATE_EXTERNAL_RESTAURANT_PICKUP_REQUIRED

Recogida incompleta

Pedido externo sin pickupAddress, pickupLat o pickupLng.

400
ORDER_CREATE_PICKUP_COORDINATES_REQUIRED

Recogida no resoluble

Pedido registrado sin pickup completo y restaurante sin ubicación completa configurada.

403
ORDER_CREATE_EXTERNAL_RESTAURANT_REQUIRES_DISPATCHER

Perfil incorrecto

Token no dispatcher intenta crear externalRestaurant.

403
ORDER_CREATE_RESTAURANT_MEMBERSHIP_REQUIRED

Membresía requerida

Usuario restaurante sin membresía válida.

403
ORDER_CREATE_RESTAURANT_ID_MISMATCH

Restaurante no coincide

Restaurante autenticado intenta usar otro restaurantId.

403
ORDER_CREATE_DISPATCHER_RESTAURANT_RELATION_REQUIRED

Relación no permitida

Dispatcher no vinculado con el restaurante registrado.

404
ORDER_CREATE_RESTAURANT_NOT_FOUND

Restaurante no encontrado

restaurantId no existe.

500
ORDER_CREATE_ATOMIC_MISSING_ORDER_ID

Creación incompleta

La operación de creación no devuelve orderId.

500
ORDER_CREATE_ATOMIC_FAILED

Creación fallida

Error no clasificado durante la creación atómica del pedido.

Ejemplo de error

{
  "error": {
    "code": "ORDER_CREATE_EXTERNAL_RESTAURANT_PICKUP_REQUIRED",
    "message": "pickupAddress, pickupLat and pickupLng are required for external restaurant orders"
  }
}