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
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é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.