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.
/links
Lista tus enlaces cortos, paginado (per_page entre 1 y 100; por defecto 15).
links:read
/links
Crea un enlace (201) o reutiliza uno existente (200). Lee «Creación y reutilización».
links:write
/links/{id}
Obtiene un enlace.
links:read
/links/{id}
Actualiza un enlace. El slug no se puede cambiar.
links:write
/links/{id}
Elimina un enlace.
links:write
/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.
/qr-codes
Lista tus códigos QR, paginado.
qr:read
/qr-codes
Crea un código QR dinámico.
qr:write
/qr-codes/{id}
Obtiene un código QR.
qr:read
/qr-codes/{id}
Actualiza un código QR, incluido su destino.
qr:write
/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.
/bio-pages
Lista tus páginas bio, paginado.
bio:read
/bio-pages
Crea una página bio.
bio:write
/bio-pages/{id}
Obtiene una página bio.
bio:read
/bio-pages/{id}
Actualiza una página bio.
bio:write
/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í.
/domains
Lista tus dominios propios, paginado.
domains:read
/domains
Da de alta un dominio; queda en estado pending.
domains:write
/domains/{id}
Obtiene un dominio y su token de verificación.
domains:read
/domains/{id}
Actualiza un dominio.
domains:write
/domains/{id}/verify
Lanza la verificación DNS del dominio.
domains:write
/domains/{id}
Elimina un dominio. Devuelve 409 si aún conserva enlaces.
domains:write
Proyectos 5 endpoints
El {id} es el id numérico.
/projects
Lista tus proyectos, paginado.
projects:read
/projects
Crea un proyecto.
projects:write
/projects/{id}
Obtiene un proyecto.
projects:read
/projects/{id}
Actualiza un proyecto.
projects:write
/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.
/pixels
Lista tus píxeles de retargeting.
pixels:read
/pixels
Crea un píxel.
pixels:write
/pixels/{id}
Obtiene un píxel.
pixels:read
/pixels/{id}
Actualiza un píxel.
pixels:write
/pixels/{id}
Elimina un píxel.
pixels:write
/splash-pages
Lista tus páginas de espera.
splash:read
/splash-pages
Crea una página de espera.
splash:write
/splash-pages/{id}
Obtiene una página de espera.
splash:read
/splash-pages/{id}
Actualiza una página de espera.
splash:write
/splash-pages/{id}
Elimina una página de espera.
splash:write
/overlays
Lista tus overlays.
overlays:read
/overlays
Crea un overlay.
overlays:write
/overlays/{id}
Obtiene un overlay.
overlays:read
/overlays/{id}
Actualiza un overlay.
overlays:write
/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.
/data-submissions
Lista los envíos recibidos. Filtro opcional link_id.
data:read
/data-submissions/{id}
Obtiene un envío.
data:read
/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).
https://convo.chat/oauth/authorize
Pantalla de consentimiento.
https://convo.chat/oauth/token
Canje de código y refresh.
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 cuentaRegistrarte es gratis. La API no entra en el plan Free: la activas desde /app/billing cuando quieras.