API de plantillas de FreeRap
Genera un video de plantilla a partir de una imagen. Crea una tarea y consulta su estado para obtener el video.
URL basehttps://freerapvideo.com
Inicio rápido
Haz tu primera solicitud en cuatro pasos. Ejecuta los comandos en tu terminal o servidor.
Crea una clave API
Abre Ajustes → API, crea una clave y guarda el secreto sk_ completo en una variable de entorno. Consérvalo en el servidor.
Crear una clave APIShellexport FREERAP_API_KEY='YOUR_API_KEY'Elige plantilla y parámetros
Consulta el catálogo público. Elige un slug y una combinación model/resolution de rows. Revisa name, imageSlots y defaultDurationSec. Este catálogo no requiere clave API.
GET /api/template-pricescurl https://freerapvideo.com/api/template-pricesCrea una tarea de video
El ejemplo usa bulin, una imagen y pro / 720p. Confirma que la combinación tenga precio, sustituye la imagen por tu URL HTTPS pública y guarda data.taskId.
POST · cURLcurl --request POST \ 'https://freerapvideo.com/api/v1/templates/bulin/generations' \ --header "Authorization: Bearer $FREERAP_API_KEY" \ --header 'Content-Type: application/json' \ --data '{ "reference_image_urls": ["https://cdn.example.com/face.jpg"], "model": "pro", "resolution": "720p" }'Obtén el resultado
Sustituye TASK_ID por data.taskId. Consulta cada 30 segundos aproximadamente hasta success, failed o canceled. Si tiene éxito, lee data.videos.
GET · cURLcurl 'https://freerapvideo.com/api/v1/generations/TASK_ID' \ --header "Authorization: Bearer $FREERAP_API_KEY"
Autenticación
Envía Authorization en ambos endpoints de tareas con la clave sk_ completa de Ajustes → API. Una clave ausente o no válida devuelve HTTP 401. No la expongas en código del navegador.
Authorization: Bearer <API_KEY>Convenciones de la API
La plantilla proporciona el prompt, el video de referencia y la banda sonora. El cliente envía la imagen y los parámetros. No hay callbacks; consulta la tarea.
Las solicitudes correctas devuelven HTTP 200, code 0, message ok y data. Los errores usan code -1 y message. Una consulta correcta puede indicar una generación fallida en data.status.
Crear una tarea
/api/v1/templates/{campaign}/generationsInicia una generación asíncrona para una plantilla activa. HTTP 200 confirma la creación de la tarea; el video sigue procesándose.
Cabeceras obligatorias: Authorization: Bearer <API_KEY> y Content-Type: application/json.
Parámetros de ruta
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
campaign | string | Sí | Slug de una plantilla activa, por ejemplo bulin. Consúltalo en GET /api/template-prices. |
Cuerpo de la solicitud
Las nuevas integraciones usan reference_image_urls, model y resolution. Los campos siguientes son comunes a todas las plantillas.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
reference_image_urls | string[] | Sí | Exactamente N URL HTTPS públicas no vacías, según imageSlots de la plantilla. El primer elemento corresponde a @Image1, el segundo a @Image2, etc. Se conserva el orden y todos son obligatorios. |
model | string | No | basic | pro | ultra. Por defecto: pro. Debe tener precio para la plantilla y resolución. |
resolution | string | No | 480p | 720p | 1080p. Por defecto: 720p. basic admite 480p y 720p. pro y ultra también admiten 1080p. Debe tener precio para el modelo. |
Requisitos de la imagen
reference_image_urls debe contener exactamente N URL HTTPS públicas, donde N es imageSlots de la plantilla en GET /api/template-prices (1–5). Cada imagen debe ser JPEG, PNG o WebP, de hasta 10 MB por defecto, en el puerto 443. Las cadenas vacías, null, los elementos ausentes y los adicionales devuelven HTTP 400. El servidor descarga y almacena las imágenes en orden. No se admiten archivos locales, direcciones privadas ni URL que requieran autenticación.
Parámetros de la plantilla
basic admite 480p y 720p; pro y ultra también admiten 1080p. Solo están disponibles las combinaciones con precio de la plantilla. GET /api/template-prices devuelve las combinaciones y los metadatos. La plantilla controla la duración y la relación: omite duration y aspect_ratio. image_url, effect, slots, prompt, reference_video_urls, callBackUrl y los campos desconocidos devuelven HTTP 400.
La plantilla configura 9:16, 16:9 o adaptive. Adaptive sigue la relación del vídeo de referencia de la plantilla. No envíes aspect_ratio (HTTP 400). El prompt guardado, los medios, la duración y el número de imágenes definen un efecto fijo.
GET /api/template-pricesRespuesta correcta
Los valores son ilustrativos. Los 30 créditos no son una tarifa fija; usa el precio devuelto por tu solicitud.
{
"code": 0,
"message": "ok",
"data": {
"taskId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"credits_estimate": 30,
"credits_charged": 30
}
}| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
data.taskId | string (uuid) | Sí | UUID de tarea devuelto al crear. |
data.status | string | Sí | Siempre processing cuando se crea correctamente. |
data.credits_estimate | integer | Sí | Precio de la tarea en créditos, reservado al crear. |
data.credits_charged | integer | Sí | Créditos reservados mientras se procesa; cargo final retenido tras cualquier devolución al terminar. |
Varias imágenes de referencia
Si la plantilla tiene imageSlots = 3, envía exactamente tres URL en el orden del prompt. Sustituye YOUR_TEMPLATE_SLUG por su slug. El ejemplo no indica que Bulin o Dame Hombro requieran tres imágenes. No hay parámetros de posición, effect ni slots.
curl --request POST \
'https://freerapvideo.com/api/v1/templates/YOUR_TEMPLATE_SLUG/generations' \
--header "Authorization: Bearer $FREERAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"reference_image_urls": ["https://cdn.example.com/image-1.jpg", "https://cdn.example.com/image-2.jpg", "https://cdn.example.com/image-3.jpg"],
"model": "pro",
"resolution": "720p"
}'Consultar una tarea
/api/v1/generations/{taskId}Devuelve el estado de una tarea creada por API y perteneciente al usuario de la clave. Sin cuerpo. Usa la clave de creación u otra válida del mismo usuario.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
taskId | string (uuid) | Sí | UUID de tarea devuelto al crear. |
Respuesta correcta
{
"code": 0,
"message": "ok",
"data": {
"taskId": "550e8400-e29b-41d4-a716-446655440000",
"status": "success",
"campaign": "bulin",
"costCredits": 30,
"credits_estimate": 30,
"credits_charged": 30,
"createdAt": "2026-10-31T00:00:00.000Z",
"videos": [
"https://media.example.com/generated/video.mp4"
]
}
}| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
data.taskId | string (uuid) | Sí | UUID de tarea devuelto al crear. |
data.status | string | Sí | pending | processing | success | failed | canceled. Consulta los estados abajo. |
data.campaign | string | No | Slug público de la plantilla. Puede faltar en tareas antiguas. |
data.credits_estimate | integer | Sí | Precio de la tarea en créditos, reservado al crear. |
data.credits_charged | integer | Sí | Créditos reservados mientras se procesa; cargo final retenido tras cualquier devolución al terminar. |
data.costCredits | integer | Sí | Campo de compatibilidad con el mismo valor que credits_charged. |
data.createdAt | string (date-time) | Sí | Fecha de creación en formato ISO 8601 (UTC). |
data.videos | string[] | Sí | URL de videos alojados en FreeRap al completarse; lista vacía en otros estados. |
data.error | string | No | Descripción del error si está disponible. Ausente en pending o processing; no es un código de error estable. |
Estados de tarea
| Estado | Estado final | Descripción |
|---|---|---|
pending | No | En cola. Sigue consultando. |
processing | No | Generando. Sigue consultando. |
success | Sí | Completada. Lee videos y deja de consultar. |
failed | Sí | Fallida. Lee error si existe y deja de consultar. |
canceled | Sí | Cancelada. Deja de consultar. |
Consulta cada 30 segundos aproximadamente y detente en un estado final. Un timeout de consulta no significa que la generación haya fallado; consulta la misma tarea.
Respuesta de generación fallida
HTTP 200 y code 0 indican que la consulta tuvo éxito. La generación puede haber fallado: comprueba data.status. Una tarea fallida devuelve videos vacío y puede incluir error.
{
"code": 0,
"message": "ok",
"data": {
"taskId": "550e8400-e29b-41d4-a716-446655440000",
"status": "failed",
"campaign": "bulin",
"costCredits": 0,
"credits_estimate": 30,
"credits_charged": 0,
"createdAt": "2026-10-31T00:00:00.000Z",
"videos": [],
"error": "Video generation failed."
}
}Errores
Los errores de solicitud usan un estado HTTP no 2xx y el cuerpo siguiente. code siempre es -1; distingue las categorías por estado HTTP. message es texto explicativo, no un identificador estable de error.
{
"code": -1,
"message": "Insufficient credits."
}| Estado HTTP | Endpoint | Causa | Acción |
|---|---|---|---|
400 | POST | JSON, campos, imagen, modelo, resolución o duración no válidos. | Corrige la solicitud antes de reintentar. |
401 | POST / GET | Clave API ausente o no válida. | Comprueba Authorization y la clave. |
402 | POST | Saldo FreeRap insuficiente. No se inicia la tarea. | Añade créditos y crea la tarea. |
403 | POST | La plantilla no tiene precio para este modelo/resolución. | Elige una combinación con precio en /api/template-prices. |
404 | POST / GET | Plantilla no disponible, o tarea ausente, eliminada, inaccesible o no creada por API. | Revisa slug, ID y cuenta. Deja de consultar una tarea no disponible. |
429 | POST / GET | Se excedió la frecuencia o el límite de 30 tareas en curso. | Respeta Retry-After si existe o espera a que terminen las tareas en curso. |
500 | POST / GET | Error inesperado del servidor. | Reintenta las consultas más tarde. La creación puede haberse iniciado; evita duplicarla. |
503 | POST | Precios, almacenamiento o servicio de generación no disponibles. | Reintenta más tarde; contacta con soporte si persiste. |
Créditos y límites
Los créditos se reservan al crear. Mientras la tarea está pending o processing, credits_charged equivale a credits_estimate. El éxito conserva el cargo; el fallo o cancelación libera la reserva menos la tarifa de fallo configurada (0 por defecto). El estado final indica el cargo definitivo.
Cada clave permite hasta 30 tareas pending o processing. Por instancia, cada clave admite una creación y cinco consultas por segundo. HTTP 429 puede incluir Retry-After en segundos; si falta, espera antes de reintentar.
