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}/attachmentsCancelar 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}`);