Asigna las ventas de tu tienda a clics en enlaces con los callbacks de venta, y envía datos en vivo de tus herramientas a tu página con «Custom (API)».
LinkHarbor también acepta datos desde fuera. Para dos casos hay endpoints propios con sus propios secretos, y para ellos no necesitas una clave de API: los callbacks de venta comunican las ventas de tu tienda, para que veas en tus estadísticas qué enlace trajo ingresos. La integración «Custom (API)» lleva datos en vivo de tus propias herramientas a tu página como widget y puede disparar notificaciones push.
Callbacks de venta: asignar ventas
Cómo encajan el ID de clic (lt_click_id), la asignación y los informes se explica en Atribuir conversiones y ventas; aquí encontrarás todos los campos y respuestas para desarrolladores. En resumen: cuando LinkHarbor redirige un clic contabilizado a un destino http o https, añade el parámetro lt_click_id; tu tienda lo guarda y lo devuelve después de la compra.
Crear un secreto de callback
- Abre «Callback y API»
- En la tarjeta «Secretos de callback», haz clic en «+ Crear nuevo secreto»
- Si quieres, ponle un nombre, por ejemplo «Callback de la tienda», y haz clic en «Crear secreto»
- Copia el secreto enseguida; solo se muestra una vez
- Quién
- Propietarios y admins, desde Creator Pro. En Creator Free aparece «Los secretos de callback están disponibles desde Creator Pro.»
- Cuántos
- Hasta 5 secretos por espacio de trabajo, por ejemplo uno por tienda.
- «Editar»
- Cambia el nombre y pon el estado en «Activo» o «Inactivo». Con un secreto inactivo, la API rechaza los callbacks.
- «↺ Rotar»
- Genera un secreto nuevo; el anterior deja de funcionar de inmediato.
- «Último callback:»
- Muestra cuándo se usó el secreto con éxito por última vez.
Enviar un callback
curl -X POST https://dock.at-harbor.com/v1/callbacks/sale \
-H "Content-Type: application/json" \
-H "X-Callback-Secret: $LH_CALLBACK_SECRET" \
-d '{
"click_id": "3f1c2a9e-8d4b-4a51-9f0e-6b7c1d2e3f40",
"order_id": "A-10023",
"amount": "49.90",
"currency": "EUR",
"occurred_at": "2026-11-01T10:15:00Z"
}'
# → {"ok":true,"conversion_id":123} | Campo | Obligatorio | Significado |
|---|---|---|
| click_id | Sí | El valor de lt_click_id (10–36 caracteres) |
| order_id | Sí | Tu número de pedido (1–128 caracteres); cada número de pedido solo se cuenta una vez por espacio de trabajo |
| amount | Sí | Importe como número decimal, por ejemplo "49.90"; sin valores negativos |
| currency | Sí | Moneda como código de tres letras, por ejemplo EUR; la API convierte las minúsculas |
| occurred_at | No | Momento de la compra (ISO 8601) |
| amount_base_minor, base_currency, fx_rate | No | Importe convertido en la unidad más pequeña, moneda base y tipo de cambio, si vendes en varias monedas |
| meta | No | Tus propios datos adicionales como objeto plano: hasta 50 claves de 1–64 caracteres; los valores son texto (hasta 500 caracteres), un número, true/false o null; los objetos anidados y las listas se rechazan |
| workspace_id | No | El ID de tu espacio de trabajo; con él, la API indica un click_id desconocido como 404 en lugar de 403 |
| Respuesta | Significado |
|---|---|
| 200 {"ok":true,"conversion_id":…} | Venta guardada, o este order_id ya estaba guardado (entonces, el ID de la conversión existente) |
| 403 forbidden | Secreto o firma incorrectos, o click_id desconocido (sin workspace_id) |
| 403 secret_inactive | El secreto está en «Inactivo» |
| 404 not_found | click_id desconocido (solo con workspace_id y un secreto válido) |
| 413 request_too_large | El cuerpo supera 1 MB |
| 422 validation_failed | Falta un campo o no es válido, por ejemplo un valor en meta demasiado largo o anidado |
| 429 rate_limited | Más de 120 callbacks por minuto desde tu dirección IP |
Firma opcional
Además del secreto, puedes enviar el encabezado X-Callback-Signature. Contiene sha256= y la firma HMAC-SHA256 del cuerpo sin procesar en hexadecimal. La clave no es el secreto en sí, sino su hash SHA-256 en forma binaria. Si envías el encabezado, tiene que ser correcto; si no, el callback se rechaza.
<?php
$body = json_encode($payload);
$key = hash('sha256', getenv('LH_CALLBACK_SECRET'), true); // hash binario del secreto
$sig = 'sha256=' . hash_hmac('sha256', $body, $key);
// Encabezados: X-Callback-Secret y X-Callback-Signature: $sig, cuerpo: $body Dónde ves las ventas
Las ventas comunicadas aparecen como conversiones en tus estadísticas; consulta Atribuir conversiones y ventas. Mediante la API, las lees con read:stats en /v1/stats/…/conversions/breakdown.
Custom (API): tus propios datos en vivo
Con la integración «Custom (API)», cualquier programa capaz de enviar peticiones HTTP (un plugin de servidor de juego, un bot, un script de cron) puede enviar datos a LinkHarbor. Se convierten en un widget en vivo en tu página, y las reglas push pueden avisar a tus seguidores.
Conectar
- Abre «Integraciones» en el espacio de trabajo
- Elige «Custom (API)» y escribe un nombre
- Una vez conectada, el diálogo muestra la «URL de ingesta» y el «Secreto» (con «Mostrar secreto»)
- Guarda ambos en tu herramienta
Las integraciones están disponibles desde Creator Pro. Solo los propietarios y admins ven la URL de ingesta y el secreto, también después en la vista de detalle de la integración. Al desconectar y volver a conectar se crea un secreto nuevo. Cómo se conectan las integraciones en general se explica en Conectar una integración.
Enviar datos
curl -X POST "$INGEST_URL" \
-H "Authorization: Bearer $INGEST_SECRET" \
-H "Content-Type: application/json" \
-d '{
"event": "player.joined",
"event_id": "join-2026-11-01T20:01:02Z-steve",
"data": { "player": "Steve" },
"state": {
"type": "game_server",
"name": "Survival SMP",
"online": true,
"players_online": 3,
"players_max": 20
}
}'
# → {"ok":true,"event_id":4711,"duplicate":false,"event_type":"player.joined"} - event
- Nombre libre del evento, por ejemplo player.joined. Se convierte a minúsculas y es el nombre al que reaccionan las reglas push. Sin event, el evento se llama state.updated.
- event_id
- Clave opcional que evita el procesamiento doble. Si se vuelve a enviar el mismo event_id, LinkHarbor responde con duplicate: true y no hace nada.
- data
- Valores para los marcadores de los textos push, por ejemplo {player}. Hasta 40 claves, solo valores simples.
- state
- El estado completo del widget. Sustituye por completo al anterior. type es game_server (tarjeta de servidor de juego) o status (tarjeta de estado).
En lugar de Authorization: Bearer, también puedes enviar el secreto en el encabezado X-LinkHarbor-Secret. Se permiten 120 llamadas por minuto por dirección IP. Opcionalmente, firmas el cuerpo: el encabezado X-LinkHarbor-Signature contiene sha256= y la firma HMAC-SHA256 del cuerpo sin procesar con el secreto como clave. Si lo envías, tiene que ser correcto.
| Respuesta | Significado |
|---|---|
| 200 {"ok":true,…} | Evento guardado, con duplicate: true para un event_id ya conocido |
| 400 invalid_json | El cuerpo no es un objeto JSON |
| 401 invalid_secret | Secreto incorrecto o URL de ingesta desconocida |
| 401 signature_invalid | X-LinkHarbor-Signature no coincide con el cuerpo |
| 413 request_too_large | El cuerpo supera 64 KB |
| 422 validation_failed | No hay ni event ni state en el cuerpo |
| 429 rate_limited | Más de 120 llamadas por minuto desde tu dirección IP |
También te puede ser útil
¿No has encontrado nada?
Cuéntanos qué necesitas y nuestro equipo de soporte te ayudará personalmente.