API de ConvoChat

Una API REST para gestionar enlaces, QR, páginas bio, dominios, proyectos y catálogos de presentación desde tu propio código, y leer sus estadísticas.

La API requiere un plan de pago. El plan Free no la incluye: sin ella toda petición responde 403 api_access_denied, y ni el panel deja emitir API keys.

Autenticación

Crea una API key en /app/api-keys (menú «Desarrollo» → «API keys»), elige sus scopes y envíala en cada petición como cabecera Authorization: Bearer <token>. El token se muestra una sola vez al crearlo; cópialo entonces. Todas las respuestas son JSON.

curl -s https://convo.chat/api/v1/links \
  -H "Authorization: Bearer TU_API_KEY" \
  -H "Accept: application/json"

Scopes

Hay 19 scopes, agrupados por recurso. Cada API key concede solo los que elijas; si a un token le falta el scope de la ruta, esta responde 403 missing_ability.

Enlaces cortos links:read · links:write Listar, crear, actualizar y eliminar enlaces cortos.
Analítica stats:read Leer las estadísticas de un enlace. También destapa clicks y unique_clicks dentro del propio recurso enlace.
Códigos QR qr:read · qr:write Listar, crear, actualizar y eliminar códigos QR dinámicos.
Páginas bio bio:read · bio:write Listar, crear, actualizar y eliminar páginas bio.
Dominios domains:read · domains:write Listar, dar de alta, verificar y eliminar tus dominios de marca.
Proyectos projects:read · projects:write Las carpetas con las que agrupas tus enlaces.
Píxeles pixels:read · pixels:write Píxeles de retargeting.
Páginas de espera splash:read · splash:write Splash pages intersticiales previas al destino.
Overlays overlays:read · overlays:write Barras overlay que se muestran sobre el destino.
Datos capturados data:read · data:write Leer y eliminar los envíos de tus formularios bio. El alta llega desde la página pública, así que data:write solo borra.

Endpoints

Base: https://convo.chat/api/v1. Son 45 endpoints repartidos en 9 recursos; despliega el que te interese. Todas las listas se paginan con per_page (1–100, por defecto 15) y devuelven data, links y meta. Cada DELETE responde 204 sin cuerpo.

Enlaces cortos 6 endpoints

El {id} es el public_id del enlace.

GET /links Lista tus enlaces cortos, paginado (per_page entre 1 y 100; por defecto 15). links:read
POST /links Crea un enlace (201) o reutiliza uno existente (200). Lee «Creación y reutilización». links:write
GET /links/{id} Obtiene un enlace. links:read
PATCH /links/{id} Actualiza un enlace. El slug no se puede cambiar. links:write
DELETE /links/{id} Elimina un enlace. links:write
GET /links/{id}/stats Totales, serie diaria y horaria y desgloses (days: 7, 30 o 90). stats:read
Códigos QR 5 endpoints

El {id} es el public_id del QR.

GET /qr-codes Lista tus códigos QR, paginado. qr:read
POST /qr-codes Crea un código QR dinámico. qr:write
GET /qr-codes/{id} Obtiene un código QR. qr:read
PATCH /qr-codes/{id} Actualiza un código QR, incluido su destino. qr:write
DELETE /qr-codes/{id} Elimina un código QR. qr:write
Páginas bio 5 endpoints

El {id} es el public_id de la página.

GET /bio-pages Lista tus páginas bio, paginado. bio:read
POST /bio-pages Crea una página bio. bio:write
GET /bio-pages/{id} Obtiene una página bio. bio:read
PATCH /bio-pages/{id} Actualiza una página bio. bio:write
DELETE /bio-pages/{id} Elimina una página bio. bio:write
Dominios 6 endpoints

El {id} es el id numérico. Los dominios compartidos del operador no se exponen aquí.

GET /domains Lista tus dominios propios, paginado. domains:read
POST /domains Da de alta un dominio; queda en estado pending. domains:write
GET /domains/{id} Obtiene un dominio y su token de verificación. domains:read
PATCH /domains/{id} Actualiza un dominio. domains:write
POST /domains/{id}/verify Lanza la verificación DNS del dominio. domains:write
DELETE /domains/{id} Elimina un dominio. Devuelve 409 si aún conserva enlaces. domains:write
Proyectos 5 endpoints

El {id} es el id numérico.

GET /projects Lista tus proyectos, paginado. projects:read
POST /projects Crea un proyecto. projects:write
GET /projects/{id} Obtiene un proyecto. projects:read
PATCH /projects/{id} Actualiza un proyecto. projects:write
DELETE /projects/{id} Elimina un proyecto. projects:write
Píxeles, páginas de espera y overlays 15 endpoints

Catálogos de presentación que luego referencias desde un enlace. El {id} es el id numérico.

GET /pixels Lista tus píxeles de retargeting. pixels:read
POST /pixels Crea un píxel. pixels:write
GET /pixels/{id} Obtiene un píxel. pixels:read
PATCH /pixels/{id} Actualiza un píxel. pixels:write
DELETE /pixels/{id} Elimina un píxel. pixels:write
GET /splash-pages Lista tus páginas de espera. splash:read
POST /splash-pages Crea una página de espera. splash:write
GET /splash-pages/{id} Obtiene una página de espera. splash:read
PATCH /splash-pages/{id} Actualiza una página de espera. splash:write
DELETE /splash-pages/{id} Elimina una página de espera. splash:write
GET /overlays Lista tus overlays. overlays:read
POST /overlays Crea un overlay. overlays:write
GET /overlays/{id} Obtiene un overlay. overlays:read
PATCH /overlays/{id} Actualiza un overlay. overlays:write
DELETE /overlays/{id} Elimina un overlay. overlays:write
Datos capturados 3 endpoints

Los envíos entran desde tus páginas bio, no por API. El {id} es el id numérico.

GET /data-submissions Lista los envíos recibidos. Filtro opcional link_id. data:read
GET /data-submissions/{id} Obtiene un envío. data:read
DELETE /data-submissions/{id} Elimina un envío. data:write

Creación y reutilización

POST /links no siempre crea. Si ya tienes un enlace corto con el mismo destination_url y el mismo domain_id, la API te devuelve ese enlace en lugar de crear otro: responde 200 (no 201) y añade "meta": {"reused": true}. En ese caso se descarta todo lo que mandaste —slug, password, status, fechas, click_limit, UTM, expiration_url— y el enlace conserva su configuración original. No consume cupo de tu plan.

Comprueba siempre meta.reused o el código de estado antes de dar por bueno un slug propio. Si necesitas dos enlaces distintos al mismo destino, usa un domain_id diferente.

HTTP/1.1 200 OK
{
  "data": { "id": "...", "slug": "slug-original", "destination_url": "https://ejemplo.com" },
  "meta": { "reused": true }
}

Enlaces que respaldan un QR

Los enlaces cortos que un código QR dinámico usa por dentro no se exponen en esta API: no aparecen en GET /links y cualquier GET, PATCH, DELETE o GET /links/{id}/stats sobre ellos responde 404 resource_not_found, aunque sean tuyos. Gestiónalos por /qr-codes o desde el panel. Tampoco cuenta con ellos si comparas totales con lo que ves en /app.

Límites

60 peticiones por minuto por cuenta, el mismo número para todos los planes de pago (el límite por plan todavía no está diferenciado). El contador es por usuario, no por API key: todas tus keys comparten el mismo cubo. Cada respuesta trae X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset; al excederlo recibes 429 con Retry-After.

Errores

Todo error llega con esta forma. error.code es estable: enrútate por él, no por el mensaje. details solo aparece cuando hay contexto.

{
  "error": {
    "code": "validation_failed",
    "message": "Los datos proporcionados no son válidos.",
    "details": { "destination_url": ["El campo destination url es obligatorio."] }
  }
}
HTTP error.code Cuándo
401 unauthenticated Falta el token, es inválido o fue revocado.
403 api_access_denied Tu plan no incluye acceso a la API.
403 account_unavailable Tu cuenta no está activa.
403 missing_ability La API key no trae el scope que exige la ruta. details.required_abilities lo dice.
403 forbidden No tienes permiso para esa acción.
403 plan_limit_exceeded Alcanzaste un límite de tu plan. details.feature y details.current.
403 feature_not_available Pediste una función que tu plan no incluye. details.feature y details.field.
404 resource_not_found El recurso no existe, no es tuyo, o está oculto a la API.
405 method_not_allowed Ese método HTTP no existe en la ruta.
409 domain_has_links El dominio todavía conserva enlaces; muévelos antes de eliminarlo.
422 validation_failed Datos inválidos. details trae los errores campo por campo.
429 rate_limit_exceeded Superaste el límite por minuto. details.limit y details.retry_after.
500 server_error Error interno.

OAuth 2.0 para apps de terceros

Una API key sirve para tu propio código. Si construyes una app que actúa en nombre de otros usuarios de ConvoChat, registra una app OAuth en /app/oauth-apps y usa el flujo authorization_code con PKCE. Las redirect URIs deben ser https (http solo en 127.0.0.1 o localhost).

GET https://convo.chat/oauth/authorize Pantalla de consentimiento.
POST https://convo.chat/oauth/token Canje de código y refresh.
GET https://convo.chat/api/oauth/v1/user Identidad del usuario que autorizó.

Con el access token llamas a los mismos 45 endpoints, con los mismos 19 scopes, cambiando la base a https://convo.chat/api/oauth/v1. Si no pides scopes, se conceden links:read y stats:read. Solo se acepta un bearer token real: una sesión de navegador no vale. El plan del usuario que autoriza es el que manda: si no incluye API, la llamada responde 403 api_access_denied.

Empieza a construir

Crea tu cuenta, activa un plan con acceso a la API y haz tu primera petición en minutos.

Crear cuenta

Registrarte es gratis. La API no entra en el plan Free: la activas desde /app/billing cuando quieras.