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.
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
Si tu sistema ya tiene su propio número de pedido, mandalo en referencia_externa — vas a poder usarlo en los pasos siguientes en vez del id que te devuelve QORA.
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",
"referencia_externa": "PED-4521"
}'
Respuesta (201):
{
"id": "b77cc267-1fed-42a5-a0fc-87cce878f66c",
"numero_turno": 42,
"estado": "esperando",
"destino": "Caja 3",
"referencia_externa": "PED-4521",
"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). Podés identificar el ticket con el id de QORA o con tu propio referencia_externa — no hace falta que guardes el id que te devolvimos, seguí usando tu propio número de pedido:
curl -X POST https://api.qorapp.com/api/integrations/tickets/PED-4521/notificar \
-H "X-API-Key: qora_live_xxxxxxxxxxxxxxxxxxxxxxxx"
3. Marcar como entregado
curl -X POST https://api.qorapp.com/api/integrations/tickets/PED-4521/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, numeroDePedido) {
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,
referencia_externa: numeroDePedido,
}),
});
if (!res.ok) {
const error = await res.json();
throw new Error(error.error);
}
return res.json();
}
// Más tarde, para notificar o entregar, usá el mismo numeroDePedido:
async function notificarPedido(numeroDePedido) {
await fetch(`https://api.qorapp.com/api/integrations/tickets/${numeroDePedido}/notificar`, {
method: "POST",
headers: { "X-API-Key": QORA_API_KEY },
});
}
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.
:id, podés usar el id que devolvió QORA al crear el ticket, o directamente tu propio referencia_externa — QORA detecta cuál es cuál automáticamente.
| Método | Endpoint | Qué hace |
|---|---|---|
| POST | /tickets | Crea un pedido/turno nuevo |
| GET | /tickets/:id | Consulta el estado actual |
| POST | /tickets/:id/notificar | Avisa al cliente que está listo (WhatsApp + fallback SMS) |
| POST | /tickets/:id/entregar | Marca como entregado |
| POST | /tickets/:id/cancelar | Cancela el pedido/turno |
Estados posibles
esperando → notificado → entregado, 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
| Evento | Cuándo se dispara |
|---|---|
ticket.creado | Al crear el pedido/turno (manual, QR, o por esta misma API) |
ticket.notificado | Al notificar al cliente |
ticket.entregado | Al marcarlo entregado |
ticket.cancelado | Al 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)
);
}
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.
| Plan | Pedidos/turnos por mes | Acceso a la API |
|---|---|---|
| Starter | 900 | — |
| Business | 2.250 | ✓ |
| Pro | 6.000 | ✓ |
| Growth | 15.000 | ✓ |
| Enterprise | A 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.