QORA / developers Referencia interactiva ↗

Documentación para desarrolladores

Integrá pedidos y turnos con tu propio sistema

La API de QORA te deja crear, notificar, entregar y cancelar pedidos/turnos desde tu POS, tu e-commerce o cualquier sistema propio — y recibir avisos en tiempo real por webhook cuando cambian de estado.

Autenticación

Todos los endpoints de integración se autentican con una API key en el header X-API-Key — no hace falta ningún login de usuario.

Generar una key

Desde el panel de QORA: Cuenta → Integraciones → API keys → Nueva key. La key completa se muestra una sola vez al crearla — copiala en ese momento, después solo se puede ver un prefijo para identificarla. Si la perdiste, revocá esa key y generá una nueva.

El acceso a la API está disponible desde el plan Business en adelante. Con Starter, estos endpoints devuelven 403.
curl https://api.qorapp.com/api/integrations/tickets \
  -H "X-API-Key: qora_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"telefono": "+5491122334455"}'

Guardá la key como un secreto de tu sistema (variable de entorno, vault, etc.) — nunca la expongas en código de frontend ni en un repositorio público.

Quickstart

Los tres pasos más comunes de una integración: crear un pedido/turno, notificar cuando está listo, y marcarlo entregado.

1. Crear un pedido/turno

curl -X POST https://api.qorapp.com/api/integrations/tickets \
  -H "X-API-Key: qora_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "telefono": "+5491122334455",
    "nombre_cliente": "Juana Pérez",
    "destino": "Caja 3"
  }'

Respuesta (201):

{
  "id": "b77cc267-1fed-42a5-a0fc-87cce878f66c",
  "numero_turno": 42,
  "estado": "esperando",
  "destino": "Caja 3",
  "created_at": "2026-08-14T15:03:00.000Z"
}

2. Notificar que está listo

Le manda un WhatsApp al cliente (con reintento automático por SMS si el WhatsApp no se puede entregar).

curl -X POST https://api.qorapp.com/api/integrations/tickets/b77cc267-1fed-42a5-a0fc-87cce878f66c/notificar \
  -H "X-API-Key: qora_live_xxxxxxxxxxxxxxxxxxxxxxxx"

3. Marcar como entregado

curl -X POST https://api.qorapp.com/api/integrations/tickets/b77cc267-1fed-42a5-a0fc-87cce878f66c/entregar \
  -H "X-API-Key: qora_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Ejemplo en Node.js

const QORA_API_KEY = process.env.QORA_API_KEY;

async function crearPedido(telefono, nombreCliente) {
  const res = await fetch("https://api.qorapp.com/api/integrations/tickets", {
    method: "POST",
    headers: {
      "X-API-Key": QORA_API_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ telefono, nombre_cliente: nombreCliente }),
  });

  if (!res.ok) {
    const error = await res.json();
    throw new Error(error.error);
  }
  return res.json();
}

Endpoints

Todos bajo https://api.qorapp.com/api/integrations. Para el detalle completo de cada campo (requeridos, formatos, todos los códigos de respuesta), usá la referencia interactiva — acá va el resumen.

MétodoEndpointQué hace
POST/ticketsCrea un pedido/turno nuevo
GET/tickets/:idConsulta el estado actual
POST/tickets/:id/notificarAvisa al cliente que está listo (WhatsApp + fallback SMS)
POST/tickets/:id/entregarMarca como entregado
POST/tickets/:id/cancelarCancela el pedido/turno

Estados posibles

esperandonotificadoentregado, o cancelado en cualquier momento antes de entregado.

Webhooks salientes

Configurá una URL en Cuenta → Integraciones → Webhook saliente y QORA le manda un POST cada vez que un pedido/turno cambia de estado — así no hace falta que tu sistema esté consultando el estado todo el tiempo (polling).

Eventos

EventoCuándo se dispara
ticket.creadoAl crear el pedido/turno (manual, QR, o por esta misma API)
ticket.notificadoAl notificar al cliente
ticket.entregadoAl marcarlo entregado
ticket.canceladoAl cancelarlo

Payload

{
  "evento": "ticket.notificado",
  "cuenta_id": "5a056725-61cb-436a-8a14-27665197f575",
  "datos": { "...": "el ticket completo" },
  "enviado_en": "2026-08-14T15:04:12.000Z"
}

Verificar la firma

Cada request incluye el header X-QORA-Signature — un HMAC-SHA256 del body, firmado con el webhook_secret que ves en el panel al configurar la URL. Verificalo antes de confiar en el contenido:

const crypto = require("crypto");

function esFirmaValida(bodyCrudo, firmaRecibida, secret) {
  const esperada = crypto
    .createHmac("sha256", secret)
    .update(bodyCrudo)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(firmaRecibida),
    Buffer.from(esperada)
  );
}
Usá el body crudo (sin parsear a JSON todavía) para calcular el HMAC — si tu framework ya lo parseó, tenés que capturarlo antes con un middleware de body-parser en modo raw.

Si tu endpoint no responde 2xx, QORA loguea el error pero no reintenta — el webhook es "mejor esfuerzo", no un mecanismo garantizado. Para no perderte nada, complementalo con GET /tickets/:id si necesitás certeza absoluta del estado.

Límites y planes

Cada pedido/turno que se crea —sea por acá, por el QR, o cargado a mano en el panel— consume 1 unidad del cupo mensual de tu plan. Notificar, marcar entregado o cancelar un ticket ya creado no consume unidades adicionales.

PlanPedidos/turnos por mesAcceso a la API
Starter900
Business2.250
Pro6.000
Growth15.000
EnterpriseA medida

Si se alcanza el límite

Un POST /tickets más allá del cupo mensual devuelve 403:

{
  "error": "Alcanzaste el límite de 2250 pedidos/turnos de tu plan este período.",
  "codigo": "LIMITE_PLAN_MENSUAL",
  "consumido": 2250,
  "limite": 2250
}

El cupo se renueva automáticamente en cada período mensual de la suscripción — no hay cargos adicionales automáticos por excederlo, la cuenta simplemente no puede crear pedidos/turnos nuevos hasta el próximo período o hasta actualizar el plan.