CazaTCG
CazaTCG
Developers · v1
Envía el stock de tu tienda en lotes JSON. Cada lote se firma, se valida fila a fila y puede reenviarse sin duplicar nada.
Última actualización: 25 de agosto de 2026POST /v1/inventory-feed/v1/import en https://cazatcg.com, con content-type: application/json. No hay credenciales en la URL: la petición se autentica solo con la firma.
Formato t=<segundos unix>,n=<nonce>,v1=<firma>. La firma es el HMAC-SHA256 en hexadecimal, con la clave de firma de tu tienda, de t + "." + n + "." + cuerpo usando los bytes exactos del cuerpo enviado. Se rechaza (401) si t se desvía más de 5 minutos, si el nonce ya se ha usado o si la clave no es la del store_id del lote.
Cada tienda firma con su propia clave. El titular la ve en el panel Pro, en Inventario → Feed de inventario, junto al ID de la tienda. Solo sirve para el store_id de esa tienda. Con «Generar clave nueva» la anterior deja de funcionar al momento: actualízala en tu sistema.
POST https://cazatcg.com/v1/inventory-feed/v1/import
content-type: application/json
x-caza-signature: t=1787652000,n=6f0c2a5e-9d1b-4c7e-8f3a-2b5d7e9c1a40,v1=<hex>
{
"store_id": "8d3f6b2a-1c4e-4f7a-9b2d-5e6c7a8b9c0d",
"idempotency_key": "feed-2026-08-25T10:00",
"schema_version": "1.0",
"rows": [
{
"external_sku": "sku-123",
"catalog_product_id": "0b7e3c1d-2f4a-4b6c-8d9e-1a2b3c4d5e6f",
"quantity": 2,
"price": 12.99
},
{
"external_sku": "sku-124",
"name": "Charizard ex 199/165",
"quantity": 1
}
]
}store_id (UUID de tu tienda) e idempotency_key (8–128 caracteres) son obligatorios. schema_version es opcional (por defecto «1.0»). rows lleva entre 1 y 10.000 filas. Cualquier campo no documentado hace que se rechace la petición completa (400).
external_sku (tu referencia, hasta 200 caracteres) y quantity (entero de 0 a 1.000.000) son obligatorios. Identifica el producto con catalog_product_id (UUID del catálogo); si solo envías name, la fila queda como ambigua y no se publica. price es opcional, en euros (por ejemplo, 12.99).
import { createHmac, randomUUID } from 'node:crypto';
const body = JSON.stringify(payload); // mismos bytes que envías; incluye store_id
const t = Math.floor(Date.now() / 1000);
const n = randomUUID();
// Clave de firma de tu tienda (panel Pro → Inventario → Feed de inventario)
const v1 = createHmac('sha256', CLAVE_DE_TU_TIENDA)
.update(`${t}.${n}.${body}`)
.digest('hex');
await fetch('https://cazatcg.com/v1/inventory-feed/v1/import', {
method: 'POST',
headers: {
'content-type': 'application/json',
'x-caza-signature': `t=${t},n=${n},v1=${v1}`,
},
body,
});Reenviar un lote con la misma idempotency_key devuelve el resultado original con replayed: true sin volver a procesarlo. Usa una idempotency_key nueva para cada lote distinto y una firma (con nonce nuevo) en cada envío.
Las filas válidas se publican al momento: con cantidad mayor que 0 quedan disponibles y con 0, sin confirmar. La disponibilidad caduca a las 36 horas si no vuelves a enviarla. Los errores se devuelven por fila (external_sku_missing, catalog_reference_missing) sin anular el resto.
{
"data": {
"id": "uuid",
"idempotency_key": "feed-2026-08-25T10:00",
"status": "completed_with_errors",
"processed_rows": 2,
"valid_rows": 1,
"ambiguous_rows": 1,
"error_rows": 0,
"rows": [ … ],
"errors": [ … ]
},
"replayed": false
}No envíes datos de clientes ni imágenes: el feed solo admite los campos de inventario descritos aquí.