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.

  1. 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 API
    Shell
    export FREERAP_API_KEY='YOUR_API_KEY'

  2. 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-prices
    curl https://freerapvideo.com/api/template-prices

  3. Crea 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 · cURL
    curl --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"
      }'

  4. 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 · cURL
    curl '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.

HTTP
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

POST/api/v1/templates/{campaign}/generations

Inicia 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

Crear una tarea: Parámetros de ruta
CampoTipoObligatorioDescripción
campaignstringSí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.

Crear una tarea: Cuerpo de la solicitud
CampoTipoObligatorioDescripción
reference_image_urlsstring[]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.
modelstringNobasic | pro | ultra. Por defecto: pro. Debe tener precio para la plantilla y resolución.
resolutionstringNo480p | 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-prices

Respuesta correcta

Los valores son ilustrativos. Los 30 créditos no son una tarifa fija; usa el precio devuelto por tu solicitud.

HTTP 200 · JSON
{
  "code": 0,
  "message": "ok",
  "data": {
    "taskId": "550e8400-e29b-41d4-a716-446655440000",
    "status": "processing",
    "credits_estimate": 30,
    "credits_charged": 30
  }
}

Crear una tarea: Campos de respuesta
CampoTipoObligatorioDescripción
data.taskIdstring (uuid)SíUUID de tarea devuelto al crear.
data.statusstringSíSiempre processing cuando se crea correctamente.
data.credits_estimateintegerSíPrecio de la tarea en créditos, reservado al crear.
data.credits_chargedintegerSí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.

POST · cURL
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"
  }'

Errores · HTTP 400 / 401 / 402 / 403 / 404 / 429 / 500 / 503

Consultar una tarea

GET/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.

Consultar una tarea: Parámetros de ruta
CampoTipoObligatorioDescripción
taskIdstring (uuid)SíUUID de tarea devuelto al crear.

Respuesta correcta

HTTP 200 · JSON
{
  "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"
    ]
  }
}

Consultar una tarea: Campos de respuesta
CampoTipoObligatorioDescripción
data.taskIdstring (uuid)SíUUID de tarea devuelto al crear.
data.statusstringSípending | processing | success | failed | canceled. Consulta los estados abajo.
data.campaignstringNoSlug público de la plantilla. Puede faltar en tareas antiguas.
data.credits_estimateintegerSíPrecio de la tarea en créditos, reservado al crear.
data.credits_chargedintegerSíCréditos reservados mientras se procesa; cargo final retenido tras cualquier devolución al terminar.
data.costCreditsintegerSíCampo de compatibilidad con el mismo valor que credits_charged.
data.createdAtstring (date-time)SíFecha de creación en formato ISO 8601 (UTC).
data.videosstring[]SíURL de videos alojados en FreeRap al completarse; lista vacía en otros estados.
data.errorstringNoDescripción del error si está disponible. Ausente en pending o processing; no es un código de error estable.

Estados de tarea

Estados de tarea
EstadoEstado finalDescripción
pendingNoEn cola. Sigue consultando.
processingNoGenerando. Sigue consultando.
successSíCompletada. Lee videos y deja de consultar.
failedSíFallida. Lee error si existe y deja de consultar.
canceledSí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.

HTTP 200 · JSON
{
  "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 · HTTP 401 / 404 / 429 / 500

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.

HTTP 402 · JSON
{
  "code": -1,
  "message": "Insufficient credits."
}

Errores
Estado HTTPEndpointCausaAcción
400POSTJSON, campos, imagen, modelo, resolución o duración no válidos.Corrige la solicitud antes de reintentar.
401POST / GETClave API ausente o no válida.Comprueba Authorization y la clave.
402POSTSaldo FreeRap insuficiente. No se inicia la tarea.Añade créditos y crea la tarea.
403POSTLa plantilla no tiene precio para este modelo/resolución.Elige una combinación con precio en /api/template-prices.
404POST / GETPlantilla no disponible, o tarea ausente, eliminada, inaccesible o no creada por API.Revisa slug, ID y cuenta. Deja de consultar una tarea no disponible.
429POST / GETSe 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.
500POST / GETError inesperado del servidor.Reintenta las consultas más tarde. La creación puede haberse iniciado; evita duplicarla.
503POSTPrecios, 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.

La creación no admite claves de idempotencia. Si el POST agota el tiempo o devuelve un error del servidor, puede haber creado la tarea. No lo repitas a ciegas: podrías duplicar tareas y cargos.