Перейти к содержимому
Новое VERI*FACTU — с 2027 года, а elpizzero уже готов. Узнайте как Поговорим?Partners: para agencias
API Export Только чтение · api@elpizzero.com

API Export

REST API только для чтения для экспорта данных вашего аккаунта elpizzero — заказов, меню, зон, ресторана и метрик — в ваши собственные системы (CRM, BI, бухгалтерия, экраны и т. д.). Включает живой стрим (SSE) и исходящие webhooks для реакции на изменения в реальном времени.

Область действия. Этот API не создаёт и не изменяет заказы. Приём заказов в elpizzero не является публичным и здесь не документируется: он включается для отдельного аккаунта после проверки. Если вам нужно что-то подобное, напишите нам на api@elpizzero.com.

Аутентификация

Bearer token в заголовке. Токены имеют формат elp_live_<32hex> или elp_test_<32hex>.

Authorization: Bearer elp_live_3b8f0c2a1d4e5f6079a8b7c6d5e4f3a2

Создавайте и отзывайте токены в разделе Панель → Интеграции → API-ключи, выбирая их разрешения. Токен показывается полностью только один раз.

Разрешения

ScopeРазрешает
pedidos.leer/pedidos, /pedidos/{id}, /pedidos/{id}/historial, /resumen
carta.leer/carta
restaurante.leer/restaurante, /zonas
stream.escuchar/stream (SSE)
webhook.recibir/webhooks (добавление/удаление/список)

Токен без необходимого scope → 403 alcance_insuficiente.

Окружения

elp_live_ и elp_test_ читают одни и те же реальные данные; песочницы с тестовыми данными нет. Префикс — это лишь метка, чтобы вы могли различать свои токены.

Rate limit

60 запросов/мин на токен. Заголовки в каждом ответе: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. При превышении → 429 + Retry-After.

Соглашения

Ошибки

Единое тело ответа + согласованный HTTP-код:

{
  "ok": false,
  "error": "Esta llave no tiene el alcance necesario: pedidos.leer",
  "codigo": "alcance_insuficiente",
  "doc": "https://elpizzero.com/docs/api/export#auth"
}
HTTPcodigo
401llave_ausente · llave_invalida · llave_revocada · llave_expirada
403alcance_insuficiente · restaurante_inactivo
400parametro_invalido (включает valores_validos)
404no_encontrado
405 / 429metodo_invalido · limite_alcanzado

Список заказов

GET /pedidos

Заказы ресторана, порядок по id по убыванию, пагинация по курсору.

QueryTipoОписание
estadocsvpendienteconfirmadoen_preparacionlistoen_repartoentregadocancelado
tipoenumrepartorecogidamesa
desde / hastaISOДиапазон по creado_en (desde ≤ x < hasta).
limiteint1–100, по умолчанию 25.
cursorstringЗначение paginacion.siguiente с предыдущей страницы.
curl "https://elpizzero.com/api/export/pedidos?estado=entregado&desde=2026-05-01&limite=50" \
  -H "Authorization: Bearer elp_live_..."
{
  "datos": [ /* Objeto Pedido */ ],
  "paginacion": { "limite":50, "siguiente":"ni", "anterior":null, "total_aprox":494 }
}
Итерируйте с cursor = paginacion.siguiente, пока значение не станет null, чтобы выгрузить всю историю.

Получение заказа

GET /pedidos/{id}

Возвращает Объект «Заказ». {id} с префиксом, например ped_ni. 404 no_encontrado, если заказ не ваш.

История заказа

GET /pedidos/{id}/historial
{
  "pedido_id": "ped_ni",
  "eventos": [
    { "momento":"2026-05-31T20:42:15Z", "accion":"order_created",
      "origen":"sistema", // sistema|panel|tpv|apk_recepcion|api
      "usuario":null, "detalle":{} }
  ]
}

Меню

GET /carta

Полное дерево: категории → товары → размеры → группы опций → опции. ?solo_disponibles=true исключает скрытое/закончившееся.

{
  "restaurante_id":"rest_1", "restaurante_slug":"tu-restaurante",
  "moneda":"EUR", "idioma_origen":"es", "generado_en":"2026-06-01T18:41:27Z",
  "categorias": [{
    "id":"cat_v", "nombre":"Pizzas", "activa":true,
    "visible_dias":["lun","mar","mie","jue","vie","sab","dom"], "visible_horario":null,
    "productos": [{
      "id":"prod_3J", "nombre":"Margarita", "precio_cents":680,
      "disponible":true, "destacado":false, "alergenos":["gluten","lacteos"],
      "tamaños":[{ "id":"tam_11", "nombre":"mediana", "precio_cents":680, "predeterminado":true }],
      "grupos_opcion":[{ "id":"grp_73", "nombre":"Extras", "requerido":false,
        "min_seleccion":0, "max_seleccion":5,
        "opciones":[{ "id":"opt_8", "nombre":"Extra queso", "precio_cents":120 }] }]
    }]
  }]
}

Зоны доставки

GET /zonas

Зоны с полигоном в формате GeoJSON (координаты [lng, lat], замкнутое кольцо).

{ "datos": [{
  "id":"zon_8", "nombre":"Albatera", "slug":"albatera",
  "color":"#44c3e5", "tarifa_cents":250, "pedido_minimo_cents":2000,
  "minutos_estimados":40, "activa":true,
  "poligono":{ "tipo":"Polygon", "coordenadas":[[[-0.872,38.186], /* … */]] }
}] }

Ресторан

GET /restaurante

Карточка ресторана: контакты, местоположение, расписание по дням, брендинг, языки по каналам, репутация. Без чувствительных налоговых данных.

{
  "id":"rest_1", "slug":"tu-restaurante", "nombre":"Tu Restaurante",
  "moneda":"EUR", "zona_horaria":"Europe/Madrid",
  "acepta_pedidos":true, "pedido_minimo_cents":500,
  "horario":{ "viernes":[{"desde":"18:45","hasta":"23:30"}] /* … */ },
  "contacto":{ "email":"…", "telefono":"…", "web":"…" },
  "ubicacion":{ "direccion":"…", "ciudad":"…", "lat":38.14, "lng":-0.88 },
  "branding":{ "logo_url":"…", "color_primario":"…", "galeria":[] },
  "reputacion":{ "puntuacion":4.7, "votos":128 }
}

Сводка / метрики

GET /resumen?periodo=30d

periodo ∈ hoyayer7d30dmes_actual. Рассчитывается в часовом поясе ресторана; исключает отменённые/отклонённые.

{
  "periodo":"30d", "desde":"2026-05-03T00:00:00+02:00", "hasta":"2026-06-02T00:00:00+02:00",
  "zona_horaria":"Europe/Madrid",
  "kpis":{ "pedidos_total":442, "pedidos_cancelados":52, "clientes_distintos":413,
    "ventas_cents":893435, "ticket_medio_cents":2021, "moneda":"EUR" },
  "mix_tipo":{ "reparto":268, "recogida":171, "mesa":3 },
  "top_productos":[{ "producto_id":"prod_3K", "nombre":"Margarita", "unidades":150, "ventas_cents":113845 }]
}

Живой стрим (SSE)

GET /stream

Server-Sent Events. Отправляет события мгновенно. Аутентификация через query (EventSource не поддерживает заголовки). Нативное переподключение каждые 5 мин через Last-Event-ID; conexion.ping каждые ~25 с.

const es = new EventSource("https://elpizzero.com/api/export/stream?llave=elp_live_...");
es.addEventListener("pedido.nuevo", e => {
  const ev = JSON.parse(e.data);   // ev.datos.pedido = Objeto Pedido
  console.log(ev.datos.pedido.numero);
});

Необязательный фильтр ?eventos=pedido.nuevo,pedido.aceptado. Типы событий:

pedido.nuevopedido.aceptadopedido.rechazadopedido.estado_cambiadopedido.item_modificadopedido.entregadopedido.cancelado

Исходящие webhooks

Альтернатива pull → push: мы отправляем POST на ваш URL при изменении заказа. Только исходящие.

POST /webhooks
curl -X POST "https://elpizzero.com/api/export/webhooks" \
  -H "Authorization: Bearer elp_live_..." -H "Content-Type: application/json" \
  -d '{"url":"https://tu-sistema.com/hook","nombre":"Mi CRM","eventos":["pedido.aceptado","pedido.entregado"]}'
{ "id":"wh_3", "url":"https://tu-sistema.com/hook",
  "eventos":["pedido.aceptado","pedido.entregado"],
  "secreto_firma":"a1b2…(64 hex, se muestra UNA vez)", "activo":true }

События: из стрима + подстановочные pedido.* и *.  GET /webhooks список · DEL /webhooks/{id} удаляет.

Доставка и подпись

Каждая отправка содержит эти заголовки; тело — тот же объект, что и в стриме:

X-Elp-Evento: pedido.aceptado
X-Elp-Id: 84213            # úsalo como clave de idempotencia
X-Elp-Firma: <hmac_sha256_hex(secreto, cuerpo_crudo)>
X-Elp-Intento: 1
// Verificación (Node)
const firma = crypto.createHmac("sha256", SECRETO).update(rawBody).digest("hex");
if (firma !== req.headers["x-elp-firma"]) return res.sendStatus(401);
При сбое мы повторяем отправку (X-Elp-Intento растёт). Дедуплицируйте по X-Elp-Id.

Объект «Заказ»

Структура, возвращаемая /pedidos, /pedidos/{id}, стримом и webhooks. Данные клиента в примере анонимизированы. direccion/mesa/entrega/fiscal равны null, когда не применимы.

{
  "id":"ped_ni", "numero":"20260531-095",
  "tipo":"reparto",          // reparto|recogida|mesa
  "estado":"en_preparacion",
  "fuente":"web_publica",    // web_publica|tpv|manual|admin
  "creado_en":"2026-05-31T20:42:15Z", "aceptado_en":"…Z",
  "entregado_en":null, "programado_para":null,

  "restaurante":{ "id":"rest_1", "slug":"tu-restaurante", "nombre":"Tu Restaurante" },
  "cliente":{ "nombre":"Juan Pérez", "telefono":"+34 600 000 000",
    "email":"cliente@ejemplo.com", "consintio_marketing":false },
  "direccion":{ "linea":"Calle Mayor 22", "codigo_postal":null, "pais":"ES", "lat":38.154, "lng":-0.880 },
  "mesa":null,

  "items":[{ "id":"itm_A3", "producto_id":"prod_3K", "nombre":"Margarita",
    "tamaño":"mediana", "cantidad":1,
    "precio_unitario_cents":720, "opciones_total_cents":120, "total_cents":840,
    "estado_cocina":"pendiente",
    "opciones":[{ "id":"opc_5", "grupo":"Extras", "nombre":"Extra queso", "cantidad":1, "precio_cents":120 }] }],

  "totales":{ "moneda":"EUR", "subtotal_cents":840, "descuento_cents":0, "propina_cents":0,
    "tarifa_reparto_cents":100, "impuestos_cents":85, "total_cents":1025,
    "iva_desglose":[{ "tipo_porcentaje":10, "base_cents":940, "iva_cents":85 }] },
  "pago":{ "metodo":"online", "estado":"pagado", "proveedor":"stripe",
    "referencia_externa":"pi_3Td…", "pagos":[] },
  "entrega":{ "repartidor_nombre":null, "zona_id":"zon_a", "zona_nombre":"Granja de Rocamora", "tarifa_cents":100 },
  "fiscal":{ "factura_numero":"FA-1132/2026", "factura_fecha":"…Z", "factura_pdf":"https://…/factura.pdf" },
  "instrucciones":null
}

Пример: ТВ-экран на кухне

Автономный HTML+JS (только чтение): вставьте свой токен, откройте на телевизоре, и заказы будут поступать в реальном времени через стрим.

→ Открыть пример ТВ на кухне