Tikra Docs
Volver al sistema
Tikra DocsVolver al sistema
Documentación de Tikra
API del PortalQuick StartAutenticaciónErroresIdempotency, paginación y rate limitsRecetasWebhooksReferencia OpenAPI
API del Portal

Recetas

Ejemplos de código listos para usar con la Tikra Portal API.

Crear pedido + esperar a que sea aprobado

Phase 1/2 no soporta webhooks (eso es Fase 3). Por ahora, polling cada 60s:

const apiKey = process.env.TIKRA_API_KEY;
const headers = { "Authorization": `Bearer ${apiKey}` };

// 1. Crear pedido (idempotent)
const idempotencyKey = crypto.randomUUID();
const created = await fetch("https://app.tikra.com/api/v1/portal/orders", {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json", "Idempotency-Key": idempotencyKey },
  body: JSON.stringify({
    destinatario_id: "00000000-0000-0000-0000-000000000001",
    items: [{ product_id: "00000000-0000-0000-0000-000000000002", quantity: 5 }],
  }),
}).then(r => r.json());

const orderId = created.id;
console.log("Pedido creado:", orderId);

// 2. Polling — checkear status cada 60s hasta que apruebe (o timeout)
const start = Date.now();
const TIMEOUT_MS = 30 * 60 * 1000; // 30 min
while (Date.now() - start < TIMEOUT_MS) {
  const order = await fetch(`https://app.tikra.com/api/v1/portal/orders/${orderId}`, { headers })
    .then(r => r.json());
  if (order.status === "approved") {
    console.log("Aprobado!");
    break;
  }
  if (order.status === "cancelled" || order.status === "rejected") {
    console.error("Pedido cancelado/rechazado");
    break;
  }
  await new Promise(r => setTimeout(r, 60_000));
}

Sincronizar stock cada hora

const apiKey = process.env.TIKRA_API_KEY;
const headers = { "Authorization": `Bearer ${apiKey}` };

async function syncStock() {
  let cursor = null;
  do {
    const url = new URL("https://app.tikra.com/api/v1/portal/stock");
    url.searchParams.set("limit", "100");
    if (cursor) url.searchParams.set("cursor", cursor);
    const page = await fetch(url, { headers }).then(r => r.json());
    for (const row of page.data) {
      // upsert into your local DB
      console.log(row.product_id, row.quantity);
    }
    cursor = page.next_cursor;
  } while (cursor);
}

setInterval(syncStock, 60 * 60 * 1000);

Subir un PDF a un pedido

curl -H "Authorization: Bearer tk_live_..." \
     -F "file=@/path/to/orden.pdf" \
     -X POST https://app.tikra.com/api/v1/portal/orders/{order_id}/attachments

Cancelar un pedido

curl -H "Authorization: Bearer tk_live_..." \
     -H "Content-Type: application/json" \
     -X PATCH https://app.tikra.com/api/v1/portal/orders/{order_id} \
     -d '{"action":"cancel","reason":"cliente cambió de opinión"}'

Listar destinatarios (con paginación)

const all = [];
let cursor = null;
do {
  const url = new URL("https://app.tikra.com/api/v1/portal/destinatarios");
  url.searchParams.set("limit", "100");
  if (cursor) url.searchParams.set("cursor", cursor);
  const page = await fetch(url, { headers }).then(r => r.json());
  all.push(...page.data);
  cursor = page.next_cursor;
} while (cursor);
console.log(`Total destinatarios: ${all.length}`);

Idempotency, paginación y rate limits

Cabeceras de idempotencia, paginación por cursor y límites de velocidad de la API.

Webhooks

Eventos, formato de payload y verificación HMAC-SHA256 para webhooks de Tikra.

On this page

Crear pedido + esperar a que sea aprobadoSincronizar stock cada horaSubir un PDF a un pedidoCancelar un pedidoListar destinatarios (con paginación)