Documentación
Referencia de la API
Generada del OpenAPI que sirve Links (versión 2026-09-18, consultado el 2026-11-09).
Estado
Qué es esta referencia y qué no
Forklink todavía no tiene API abierta. Esta es la API del producto de enlaces sobre el que se construye; la dirección pública de Forklink (prevista en api.forklink.co) no existe aún. Los nombres de rutas, campos y códigos de abajo son los del OpenAPI desplegado en staging y pueden cambiar antes del lanzamiento.
Autenticación
Llaves, permisos y ritmo
- Llave: cabecera
Authorization: Bearer cl_live_…(en staging,cl_test_…). Las llaves se crean en el panel de Links del workspace, no por la API: una llave no puede crear llaves (probado: 403). - Permisos:
full,read(solo GET) ytrack(solo/track/*, para el servidor de tu sitio). Probado: una llavereadlee (200) y no escribe (403). - Ritmo: el OpenAPI declara 20 peticiones por segundo por llave con ráfaga de 40; al pasarse, 429 con
retry-after. Observado en staging: con 300 peticiones paralelas, 140 recibieron 429 (retry-after 1). - Cuentas nuevas: si la política de cuentas nuevas está activa (lo está en staging), no se pueden crear llaves ni dominios propios hasta verificar la cuenta (403
ACCOUNT_NOT_VERIFIED). - Servidor base:
/apisobre el host de la API.
Ejemplos probados
Cuatro llamadas que funcionan hoy
Ejecutados el 2026-11-09 contra Links staging (OpenAPI versión 2026-09-18) con una llave cl_test_… de un tenant de pruebas: 17 de 18 comprobaciones correctas; las llaves y el enlace de prueba se borraron al terminar.
# Listar
curl -s "$BASE/links?limit=5" -H "Authorization: Bearer $KEY"
# Crear
curl -s -X POST "$BASE/links" -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"destinationUrl":"https://example.com/launch","slug":"launch","title":"Launch","utmSource":"newsletter","utmMedium":"email","utmCampaign":"launch"}'
# Analítica de los últimos 7 días
curl -s "$BASE/links/$ID/analytics?days=7" -H "Authorization: Bearer $KEY"
# Borrar
curl -s -X DELETE "$BASE/links/$ID" -H "Authorization: Bearer $KEY"Sustituye $BASE por el servidor de la API (https://<host>/api), $KEY por tu llave e $ID por el id devuelto al crear. Respuestas verificadas: el listado devuelve {items, limit, page, total}; crear devuelve el enlace (201) con id, slug, domain, destinationUrl, status, totalClicks…; la analítica devuelve totalClicks, uniqueClicks, timeseries, byCountry, byReferrer…; borrar responde 204.
Errores
Códigos que devuelve la API
Los errores son {"error": "…", "code": "…"}. Verificados en staging: 400 INVALID_BODY (con details), 401 MISSING_API_KEY, 403 FORBIDDEN (permiso insuficiente) y 429 con retry-after.
402 (límites del plan): construido, no verificado. Según el diseño de medidores, al llegar al tope de enlaces activos o dominios propios la API responde 402 con COMMERCIAL_LIMIT_REACHED (LINKS_ACTIVE_LIMIT_REACHED o CUSTOM_DOMAINS_LIMIT_REACHED, con limit y current); los enlaces ya publicados siguen redirigiendo. Ese código aterrizó pero el servicio desplegado en staging es anterior (el OpenAPI desplegado no lo lista): no lo pude probar. Al superar los clics del mes no hay 402: la redirección sigue y el detalle de analítica del exceso deja de guardarse. Los topes por plan no están aprobados para producción.
Webhooks
Eventos y firma
Eventos: link.created, link.updated, link.archived, link.clicked, link.click_limit_reached, link.expired, conversion.lead, conversion.sale, domain.verified, app.opened, app.installed. Firma estilo Svix (webhook-id, webhook-timestamp, webhook-signature: v1,<base64 HMAC-SHA256> sobre {id}.{ts}.{body}), hasta 8 reintentos con espera creciente; el endpoint se desactiva tras 50 fallos seguidos. Fuente: OpenAPI y código de Links; no los probé de extremo a extremo en esta entrega.
Hallazgos
Diferencias entre el OpenAPI y la realidad en staging
GET /status.jsonfigura como pública bajo/api, pero allí pide llave (401): la ruta pública es/status.jsonen la raíz del host.GET /links/{id}/qrrespondió 500 INTERNAL_ERROR en staging el 2026-11-09: no lo incluyo en los ejemplos probados. El QR de la herramienta gratuita de este sitio no depende de la API.
Referencia
Todas las operaciones (73)
Links
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /links | Listar enlaces | requerida |
| POST | /links | Crear un enlace | requerida |
| POST | /links/bulk | Crear hasta 100 enlaces | requerida |
| PATCH | /links/bulk | Editar en bloque | requerida |
| DELETE | /links/bulk | Archivar en bloque | requerida |
| POST | /links/import | Importar CSV (hasta 1.000 filas) | requerida |
| GET | /links/slug/suggest | Un slug libre | requerida |
| GET | /links/{id} | Un enlace | requerida |
| PATCH | /links/{id} | Editar un enlace | requerida |
| DELETE | /links/{id} | Archivar (borrado lógico) | requerida |
| POST | /links/{id}/archive | Archivar | requerida |
| POST | /links/{id}/duplicate | Duplicar con reglas, píxeles y UTM | requerida |
| GET | /links/{id}/history | Historial de cambios | requerida |
Analytics
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /links/{id}/analytics | Analítica de un enlace | requerida |
| GET | /links/{id}/analytics/export.csv | Clicks crudos en CSV | requerida |
| GET | /analytics/summary | Resumen del workspace (con top de enlaces y conversiones) | requerida |
| GET | /analytics/export.csv | Todos los clicks del workspace en CSV | requerida |
Conversions
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /links/{id}/conversions | Leads y ventas de un enlace | requerida |
| POST | /track/lead | Registrar un lead | requerida |
| POST | /track/sale | Registrar una venta | requerida |
Domains
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /domains | Dominios cortos propios | requerida |
| POST | /domains | Registrar un dominio | requerida |
| POST | /domains/{id}/verify | Volver a comprobar | requerida |
| POST | /domains/{id}/default | Hacerlo el dominio por defecto | requerida |
| DELETE | /domains/{id} | Quitar | requerida |
UTM presets
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /utm-presets | Listar | requerida |
| POST | /utm-presets | Crear | requerida |
| PATCH | /utm-presets/{id} | Editar | requerida |
| DELETE | /utm-presets/{id} | Borrar | requerida |
Tags
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /tags | Listar | requerida |
| POST | /tags | Crear | requerida |
| PATCH | /tags/{id} | Renombrar | requerida |
| DELETE | /tags/{id} | Borrar | requerida |
Groups
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /groups | Listar | requerida |
| POST | /groups | Crear | requerida |
| PATCH | /groups/{id} | Editar | requerida |
| DELETE | /groups/{id} | Borrar (los enlaces quedan sin grupo) | requerida |
QR
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /links/{id}/qr | Imagen QR del enlace | requerida |
| PATCH | /links/{id}/qr | Estilo del QR | requerida |
| GET | /links/{id}/qr/config | Estilo guardado | requerida |
Link-in-bio
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /bio | Páginas | requerida |
| POST | /bio | Crear (nace en borrador) | requerida |
| GET | /bio/{id} | Una página con sus bloques | requerida |
| PATCH | /bio/{id} | Editar | requerida |
| DELETE | /bio/{id} | Borrar | requerida |
| POST | /bio/{id}/publish | Publicar | requerida |
| POST | /bio/{id}/unpublish | Despublicar | requerida |
| POST | /bio/{id}/items | Añadir bloque | requerida |
| POST | /bio/{id}/items/reorder | Reordenar | requerida |
| PATCH | /bio/{id}/items/{itemId} | Editar bloque | requerida |
| DELETE | /bio/{id}/items/{itemId} | Quitar bloque | requerida |
Webhooks
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /webhooks | Listar | requerida |
| POST | /webhooks | Crear (devuelve el secreto una vez) | requerida |
| GET | /webhooks/{id} | Uno | requerida |
| PATCH | /webhooks/{id} | Editar / activar / desactivar | requerida |
| DELETE | /webhooks/{id} | Borrar | requerida |
| POST | /webhooks/{id}/rotate-secret | Rotar el secreto | requerida |
| POST | /webhooks/{id}/test | Mandar un evento de prueba | requerida |
| GET | /webhooks/{id}/deliveries | Últimas 50 entregas | requerida |
| POST | /webhooks/{id}/deliveries/{deliveryId}/retry | Reintentar una entrega | requerida |
Integrations
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /integrations | Integraciones de anuncios del workspace | requerida |
| PUT | /integrations/{provider} | Crear o cambiar (meta) | requerida |
| DELETE | /integrations/{provider} | Quitar | requerida |
| POST | /integrations/{provider}/test | Enviar un evento de prueba | requerida |
Mobile apps
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /apps | Apps móviles registradas | requerida |
| POST | /apps | Registrar una app | requerida |
| GET | /apps/{id} | Una app | requerida |
| PATCH | /apps/{id} | Editar (la plataforma no cambia) | requerida |
| DELETE | /apps/{id} | Quitar | requerida |
Status
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /status.json | Estado del servicio | pública |
Deep links
| Método | Ruta | Descripción (del OpenAPI) | Llave |
|---|---|---|---|
| GET | /resolve/{slug} | Resolver un enlace desde la app | pública |
| POST | /deferred/claim | Reclamar el deep link diferido tras instalar | pública |
| POST | /app-events | Evento de la app (abrió / se instaló) | pública |
Volver a la documentación
SDK, estado de los paquetes y lo que falta publicar.