Usa la API REST de Clevera
Llama a Clevera desde tus propios scripts: URL base, autenticación con token de portador (bearer-token), endpoints y los permisos que cada uno necesita, el flujo de cotizar y luego iniciar para trabajos de pago, idempotencia, formato de errores y límites de tasa.
La API REST de Clevera permite que tus propios scripts y servicios hagan lo que un agente puede hacer a través de MCP: leer tu biblioteca, solicitar videos y artículos, exportar videos, trabajar en sitios de documentación y seguir los trabajos. Este artículo cubre la URL base, la autenticación, el flujo de solicitud para trabajos de pago, los errores y los límites de tasa.
Conceptos básicos
| URL base | https://app.clevera.ai/api/v1 |
| Autenticación | Authorization: Bearer <token> con un token de API (comienza con clv_agent_) |
| Formato | JSON de entrada y salida. Envía Accept: application/json y, con un cuerpo, Content-Type: application/json. |
| Ids | Ids públicos, como job_… para trabajos. Usa los ids que devuelve la API. |
Verifica un token con GET /docs/me:
curl -H "Authorization: Bearer $CLEVERA_TOKEN" \
-H "Accept: application/json" \
https://app.clevera.ai/api/v1/docs/me
La respuesta indica quién actúa con el token: el nombre y la fecha de caducidad del token, la persona y su rol actual, el espacio de trabajo, los sitios incluidos en el alcance y los permisos que funcionan en este momento (los permisos del token recortados al rol actual de la persona). Llama a esto primero cuando se rechace una llamada.
Endpoints
Cada endpoint necesita el permiso mostrado. Llamar a uno sin él devuelve 403 forbidden_ability. Consulta Permisos del agente.
Biblioteca y materiales
| Método y ruta | Permiso | Qué hace |
|---|---|---|
GET /create/types |
any | Los tipos de video y clip social que puedes solicitar. |
GET /library |
library:read |
Videos, grabaciones y artículos que el propietario del token puede ver. |
GET /recordings |
library:read |
Solo grabaciones. |
GET /library/{item} |
library:read |
Un elemento. |
GET /library/{item}/transcript |
library:read |
Su transcripción. |
GET /library/{item}/article |
library:read |
Su artículo. |
GET /library/{item}/embed |
library:read |
Su código de inserción. |
GET /materials |
library:read |
Imágenes, videos y PDFs subidos. |
POST /materials, POST /materials/import, POST /materials/uploads, POST /materials/uploads/{upload_id}/complete |
materials:write |
Añadir una imagen, video o PDF (directamente, desde una URL o como una subida grande). |
Videos y artículos
| Método y ruta | Permiso | Qué hace |
|---|---|---|
POST /videos/quotes |
videos:create |
Cotizar un video a partir de una grabación (type: how_to, product_demo, cleanup, styled_video), un artículo a partir de una grabación (article) o una traducción (translation). |
POST /videos |
videos:create + credits:spend |
Crear el video cotizado (quote_id). |
POST /articles/from-recording |
videos:create + credits:spend |
Crear el artículo cotizado. |
POST /videos/translations |
videos:create + credits:spend |
Crear la traducción cotizada. |
POST /clips/quotes |
videos:create |
Cotizar un clip social (tipos de GET /create/types). |
POST /clips |
videos:create + credits:spend |
Crear el clip social cotizado. |
POST /videos/{video_id}/exports |
videos:export |
Renderizar un MP4: resolution 1080p (predeterminado), 2k o 4k; siempre a 60 fps. Gratis. |
Trabajos y créditos
| Método y ruta | Permiso | Qué hace |
|---|---|---|
POST /quotes |
el permiso del trabajo | Una cotización para cualquier tipo de trabajo. |
POST /jobs |
el permiso del trabajo (+ credits:spend cuando es de pago) |
Iniciar un trabajo cotizado. |
GET /jobs |
jobs:read |
Listar trabajos. |
GET /jobs/{job} |
jobs:read |
Estado y resultado de un trabajo. |
GET /jobs/{job}/wait |
jobs:read |
Esperar un cambio en lugar de consultar el estado. |
GET /jobs/{job}/events |
jobs:read |
Eventos de progreso del trabajo. |
POST /jobs/{job}/cancel |
jobs:read |
Cancelar un trabajo. Demasiado tarde: "Este trabajo ya no se puede cancelar". |
GET /credits |
credits:spend o jobs:read |
Saldo de créditos del espacio de trabajo. |
Sitios de documentación
| Método y ruta | Permiso | Qué hace |
|---|---|---|
GET /docs/sites, GET /docs/sites/{site}, GET /docs/sites/{site}/tree, GET /docs/sites/{site}/pages |
content:read |
Sitios en el alcance del token y sus páginas. |
GET /docs/sites/{site}/search, GET /docs/pages/{page}, GET /docs/pages/{page}/revisions |
content:read |
Buscar y leer páginas, incluidos borradores. |
POST /docs/sites/{site}/articles, PATCH /docs/pages/{page}/article, POST /docs/pages/{page}/review |
articles:write |
Crear y editar borradores de artículos, enviar para revisión. Los artículos publicados también necesitan site:publish. |
PATCH /docs/pages/{page}, DELETE /docs/pages/{page}, POST /docs/sites/{site}/sections, PATCH /docs/sections/{section} |
structure:write |
Mover, renombrar, ocultar y eliminar páginas; secciones. |
GET/POST /docs/sites/{site}/site-pages, PUT /docs/site-pages/{page}/body |
content:read / site-pages:write |
Páginas de inicio, contacto y legales. |
GET/POST /docs/sites/{site}/changelog, PATCH /docs/changelog/{entry} |
content:read / changelog:write |
Entradas del registro de cambios como borradores. |
POST /docs/media, POST /docs/media/uploads |
media:write |
Subir imágenes. |
POST /docs/sites/{site}/publish, POST /docs/pages/{page}/ready, POST /docs/changelog/{entry}/publish |
site:publish |
Publicar lo que ven los lectores. |
GET /insights/sites/{site}, …/gaps, …/feedback |
insights:read |
Buscar brechas, preguntas sin respuesta, comentarios de página. |
PATCH /docs/sites/{site}/settings, …/appearance, PUT …/navigation, POST …/redirects |
site:configure |
Configuración del sitio. |
POST /docs/sites |
sites:create |
Crear un sitio de documentación. |
Más sobre agentes y sitios de documentación: Conectar agentes de IA a tus sitios de documentación.
Solicitar trabajo de pago
El trabajo que cuesta créditos siempre requiere cotizar primero y luego iniciar:
- Cotízalo.
POST /videos/quotes(o/clips/quotes) con lo que deseas. La respuesta tiene unquote_idy el rango de créditos. Una cotización es válida por 15 minutos y se puede usar una vez. - Opcionalmente, haz una prueba. Envía el inicio con
"dry_run": truepara saber si comenzaría, si necesita aprobación o si está bloqueado. No se escribe nada. - Inícialo.
POST /videosconquote_idy un encabezadoIdempotency-Key. La respuesta es202con un trabajo. - Síguelo.
GET /jobs/{job}/waithasta que elstatusdel trabajo cambie, o escucha los webhooks.
curl -X POST https://app.clevera.ai/api/v1/videos/quotes \
-H "Authorization: Bearer $CLEVERA_TOKEN" -H "Content-Type: application/json" \
-d '{"type": "how_to", "recording_id": "<recording id>", "language": "en-US"}'
curl -X POST https://app.clevera.ai/api/v1/videos \
-H "Authorization: Bearer $CLEVERA_TOKEN" -H "Content-Type: application/json" \
-H "Idempotency-Key: 3f6c1a2e-8d4b-4f7a-9c1e-2b5d7e9f0a13" \
-d '{"quote_id": "<quote id>"}'
Estados del trabajo:
| Estado | Significado |
|---|---|
queued |
Aceptado, a punto de ejecutarse. |
running |
En ejecución. |
needs_input |
Esperando a una persona, generalmente una aprobación en Solicitudes del agente. El trabajo incluye un enlace y una fecha de caducidad. |
succeeded |
Hecho. El trabajo enlaza el nuevo video o artículo. |
failed |
Falló; el trabajo tiene un error_code. |
canceled |
Cancelado, o su aprobación fue denegada. |
expired |
Nadie lo aprobó en 24 horas. |
Si un inicio se ejecuta de inmediato o espera a una persona depende de los límites de gasto del token y su configuración de Aprobar automáticamente por debajo de. Consulta Controlar el gasto y las aprobaciones del agente.
Reintentos e idempotencia
Envía un encabezado Idempotency-Key (un UUID nuevo por acción) en cada creación e inicio. Si la red se cae y reintentas con la misma clave y cuerpo, obtienes la primera respuesta en lugar de un segundo video. Las claves se recuerdan durante 24 horas.
| Código | Significado |
|---|---|
idempotency_key_reused |
La misma clave con un cuerpo diferente. Usa una clave nueva para una solicitud nueva. |
idempotency_in_progress |
La primera solicitud con esta clave aún se está ejecutando. Espera y reintenta. |
idempotency_conflict |
"Esta clave de idempotencia se usó para una solicitud diferente". |
Errores
Cada error tiene la misma forma, con un mensaje que indica qué hacer a continuación:
{
"error": {
"code": "forbidden_ability",
"message": "This token lacks the videos:create ability. Ask the workspace member who owns it for a token that has it.",
"details": { "ability": "videos:create" }
},
"request_id": "req_example"
}
Incluye el request_id cuando contactes a soporte.
| HTTP | Códigos | Causa típica |
|---|---|---|
| 401 | unauthenticated, token_expired, token_revoked |
Sin token, uno incorrecto, o uno que caducó o fue revocado. |
| 402 | insufficient_credits |
El espacio de trabajo no tiene suficientes créditos para la cotización. |
| 403 | forbidden_ability, forbidden_role, forbidden_item, ip_not_allowed, live_content_needs_publish, site_paused, forbidden |
Un permiso faltante, el rol del propietario, acceso a la colección o la lista blanca de IP. |
| 403 | plan_locked |
"La API del agente no está en el plan de este espacio de trabajo. Está en Pro y superior". |
| 404 | not_found, unknown_kind |
"No hay … con ese id en el alcance de este token. Lista o busca primero y usa un id devuelto". |
| 409 | revision_conflict, quote_used, not_cancelable, idempotency_* |
El contenido cambió, la cotización se usó o un conflicto de reintento. |
| 410 | quote_expired |
"Esta cotización ha caducado. Solicita una nueva cotización". |
| 413 | unsupported_media |
El archivo es demasiado grande o no es un tipo compatible. |
| 422 | validation_failed, invalid_input, quote_mismatch, limit_reached |
Un campo es incorrecto; details lo nombra. |
| 429 | rate_limited, cap_exceeded, busy |
Demasiadas solicitudes, un límite de gasto o dos inicios a la vez. |
Cada mensaje, con la solución: Corregir errores del agente y de la API.
Límites de tasa
| Límite | Valor | Mensaje |
|---|---|---|
| Solicitudes por token | 300 por minuto | "Este token ha superado su tasa de solicitudes. Espera y reintenta". |
| Solicitudes por espacio de trabajo | 1,200 por minuto, todos los tokens juntos | "Este espacio de trabajo ha superado su tasa de solicitudes de agente. Espera y reintenta". |
| Escrituras por token | 60 por minuto | "Demasiadas escrituras desde este token. Espera y reintenta". |
| Escrituras por token por día | 2,000 | "Este token alcanzó su límite diario de escritura. Inténtalo de nuevo mañana". |
| Publicaciones por token | 10 por hora | "Este token alcanzó su límite horario de publicación. Inténtalo de nuevo más tarde". |
| Inicios de pago | 20 por hora por token, 100 al día por espacio de trabajo | rate_limited con retry_after |
| Subidas | 30 por minuto; 500 MB al día por token; 25 MB por archivo | "Demasiadas subidas desde este token. Espera y reintenta" / "Este token alcanzó su volumen diario de subida. Inténtalo de nuevo mañana". |
| Llamadas sin un token válido | 60 por minuto por dirección IP | "Demasiadas solicitudes. Espera y reintenta". |
Una respuesta 429 tiene un encabezado Retry-After y retry_after (segundos) en el cuerpo. Espera ese tiempo antes de reintentar. Las lecturas, cotizaciones y comprobaciones de estado no cuestan créditos.