In preparation · sign-up not open yet

Documentation

API reference

Generated from the OpenAPI served by Links (version 2026-09-18, fetched 2026-11-09).

Status

What this reference is and is not

Forklink does not have an open API yet. This is the API of the link product Forklink is built on; Forklink's public address (planned at api.forklink.co) does not exist yet. The route, field and code names below are those of the OpenAPI deployed in staging and may change before launch.

Authentication

Keys, permissions and rate

  • Key: header Authorization: Bearer cl_live_… (cl_test_… in staging). Keys are created in the workspace's Links panel, not through the API: a key cannot create keys (tested: 403).
  • Permissions: full, read (GET only) and track (only /track/*, for your site's backend). Tested: a read key reads (200) and cannot write (403).
  • Rate: the OpenAPI declares 20 requests per second per key with a burst of 40; beyond that, 429 with retry-after. Observed in staging: with 300 parallel requests, 140 received 429 (retry-after 1).
  • New accounts: when the new-account policy is on (it is in staging), keys and custom domains are unavailable until the account is verified (403 ACCOUNT_NOT_VERIFIED).
  • Base server: /api on the API host.

Tested examples

Four calls that work today

Run on 2026-11-09 against Links staging (OpenAPI version 2026-09-18) with a cl_test_… key from a test tenant: 17 of 18 checks passed; the keys and the test link were deleted afterwards.

# List
curl -s "$BASE/links?limit=5" -H "Authorization: Bearer $KEY"

# Create
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"}'

# Analytics for the last 7 days
curl -s "$BASE/links/$ID/analytics?days=7" -H "Authorization: Bearer $KEY"

# Delete
curl -s -X DELETE "$BASE/links/$ID" -H "Authorization: Bearer $KEY"

Replace $BASE with the API server (https://<host>/api), $KEY with your key and $ID with the id returned on create. Verified responses: the list returns {items, limit, page, total}; create returns the link (201) with id, slug, domain, destinationUrl, status, totalClicks…; analytics returns totalClicks, uniqueClicks, timeseries, byCountry, byReferrer…; delete answers 204.

Errors

Codes the API returns

Errors look like {"error": "…", "code": "…"}. Verified in staging: 400 INVALID_BODY (with details), 401 MISSING_API_KEY, 403 FORBIDDEN (insufficient permission) and 429 with retry-after.

402 (plan limits): built, not verified. By the meters design, reaching the active-links or custom-domains cap makes the API answer 402 with COMMERCIAL_LIMIT_REACHED (LINKS_ACTIVE_LIMIT_REACHED or CUSTOM_DOMAINS_LIMIT_REACHED, with limit and current); links already published keep redirecting. That code landed but the service deployed in staging is older (the deployed OpenAPI does not list it): I could not test it. Exceeding the month's clicks produces no 402: redirects continue and the analytics detail for the excess stops being stored. Per-plan caps are not approved for production.

Webhooks

Events and signature

Events: link.created, link.updated, link.archived, link.clicked, link.click_limit_reached, link.expired, conversion.lead, conversion.sale, domain.verified, app.opened, app.installed. Svix-style signature (webhook-id, webhook-timestamp, webhook-signature: v1,<base64 HMAC-SHA256> over {id}.{ts}.{body}), up to 8 retries with growing delay; the endpoint is disabled after 50 consecutive failures. Source: Links' OpenAPI and code; I did not test them end to end in this delivery.

Findings

Differences between the OpenAPI and reality in staging

  • GET /status.json is listed as public under /api, but there it asks for a key (401): the public route is /status.json at the host root.
  • GET /links/{id}/qr answered 500 INTERNAL_ERROR in staging on 2026-11-09: I leave it out of the tested examples. The free QR tool on this site does not depend on the API.

Reference

All operations (73)

Links

MethodPathDescription (from the OpenAPI)Key
GET/linksListar enlacesrequired
POST/linksCrear un enlacerequired
POST/links/bulkCrear hasta 100 enlacesrequired
PATCH/links/bulkEditar en bloquerequired
DELETE/links/bulkArchivar en bloquerequired
POST/links/importImportar CSV (hasta 1.000 filas)required
GET/links/slug/suggestUn slug librerequired
GET/links/{id}Un enlacerequired
PATCH/links/{id}Editar un enlacerequired
DELETE/links/{id}Archivar (borrado lógico)required
POST/links/{id}/archiveArchivarrequired
POST/links/{id}/duplicateDuplicar con reglas, píxeles y UTMrequired
GET/links/{id}/historyHistorial de cambiosrequired

Analytics

MethodPathDescription (from the OpenAPI)Key
GET/links/{id}/analyticsAnalítica de un enlacerequired
GET/links/{id}/analytics/export.csvClicks crudos en CSVrequired
GET/analytics/summaryResumen del workspace (con top de enlaces y conversiones)required
GET/analytics/export.csvTodos los clicks del workspace en CSVrequired

Conversions

MethodPathDescription (from the OpenAPI)Key
GET/links/{id}/conversionsLeads y ventas de un enlacerequired
POST/track/leadRegistrar un leadrequired
POST/track/saleRegistrar una ventarequired

Domains

MethodPathDescription (from the OpenAPI)Key
GET/domainsDominios cortos propiosrequired
POST/domainsRegistrar un dominiorequired
POST/domains/{id}/verifyVolver a comprobarrequired
POST/domains/{id}/defaultHacerlo el dominio por defectorequired
DELETE/domains/{id}Quitarrequired

UTM presets

MethodPathDescription (from the OpenAPI)Key
GET/utm-presetsListarrequired
POST/utm-presetsCrearrequired
PATCH/utm-presets/{id}Editarrequired
DELETE/utm-presets/{id}Borrarrequired

Tags

MethodPathDescription (from the OpenAPI)Key
GET/tagsListarrequired
POST/tagsCrearrequired
PATCH/tags/{id}Renombrarrequired
DELETE/tags/{id}Borrarrequired

Groups

MethodPathDescription (from the OpenAPI)Key
GET/groupsListarrequired
POST/groupsCrearrequired
PATCH/groups/{id}Editarrequired
DELETE/groups/{id}Borrar (los enlaces quedan sin grupo)required

QR

MethodPathDescription (from the OpenAPI)Key
GET/links/{id}/qrImagen QR del enlacerequired
PATCH/links/{id}/qrEstilo del QRrequired
GET/links/{id}/qr/configEstilo guardadorequired

Link-in-bio

MethodPathDescription (from the OpenAPI)Key
GET/bioPáginasrequired
POST/bioCrear (nace en borrador)required
GET/bio/{id}Una página con sus bloquesrequired
PATCH/bio/{id}Editarrequired
DELETE/bio/{id}Borrarrequired
POST/bio/{id}/publishPublicarrequired
POST/bio/{id}/unpublishDespublicarrequired
POST/bio/{id}/itemsAñadir bloquerequired
POST/bio/{id}/items/reorderReordenarrequired
PATCH/bio/{id}/items/{itemId}Editar bloquerequired
DELETE/bio/{id}/items/{itemId}Quitar bloquerequired

Webhooks

MethodPathDescription (from the OpenAPI)Key
GET/webhooksListarrequired
POST/webhooksCrear (devuelve el secreto una vez)required
GET/webhooks/{id}Unorequired
PATCH/webhooks/{id}Editar / activar / desactivarrequired
DELETE/webhooks/{id}Borrarrequired
POST/webhooks/{id}/rotate-secretRotar el secretorequired
POST/webhooks/{id}/testMandar un evento de pruebarequired
GET/webhooks/{id}/deliveriesÚltimas 50 entregasrequired
POST/webhooks/{id}/deliveries/{deliveryId}/retryReintentar una entregarequired

Integrations

MethodPathDescription (from the OpenAPI)Key
GET/integrationsIntegraciones de anuncios del workspacerequired
PUT/integrations/{provider}Crear o cambiar (meta)required
DELETE/integrations/{provider}Quitarrequired
POST/integrations/{provider}/testEnviar un evento de pruebarequired

Mobile apps

MethodPathDescription (from the OpenAPI)Key
GET/appsApps móviles registradasrequired
POST/appsRegistrar una apprequired
GET/apps/{id}Una apprequired
PATCH/apps/{id}Editar (la plataforma no cambia)required
DELETE/apps/{id}Quitarrequired

Status

MethodPathDescription (from the OpenAPI)Key
GET/status.jsonEstado del serviciopublic

Deep links

MethodPathDescription (from the OpenAPI)Key
GET/resolve/{slug}Resolver un enlace desde la apppublic
POST/deferred/claimReclamar el deep link diferido tras instalarpublic
POST/app-eventsEvento de la app (abrió / se instaló)public

Back to the documentation

SDKs, package status and what is still to publish.