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

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.

En todos los endpoints que reciben :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é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

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

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.