Seedance 2.5 Lite usa el ID de modelo picassoia/seedance-2.5-lite. Texto e imagen a vídeo con audio, clips de 5, 10 o 15 segundos y salida en 480p o 720p.
Cómo Llamar a la API
Envía las peticiones a https://api.picassoia.com/v1/models/picassoia/seedance-2.5-lite/predictions con un cuerpo JSON cuyo input coincida con los parámetros de abajo.
Configuración
Guarda tu API key en tu servidor, en una variable de entorno, y envíala en la cabecera Authorization de cada petición.
export PICASSOIA_API_KEY="pia_sk_…"Parámetros de la Petición
promptstringObligatorio- Por DefectoNinguno
- Lo que debe mostrar el resultado. Hasta 4000 caracteres.
imagestring- Por DefectoNinguno
- El fotograma inicial, o la imagen de la que partir. Una imagen PNG, JPEG o WebP, como URL https pública o como data URL de hasta 5 MB.
last_frame_imagestring- Por DefectoNinguno
- El fotograma de cierre: el clip termina en él. Requiere el campo image. Una imagen PNG, JPEG o WebP, como URL https pública o como data URL de hasta 5 MB.
resolutionstring- Por Defecto
"480p" - El tamaño del resultado. Opciones: 480p y 720p.
durationnumber- Por Defecto
5 - La duración del clip, en segundos. Opciones: 5, 10 y 15. Hasta 15 a 480p. Hasta 10 a 720p.
aspect_ratiostring- Por Defecto
"match_input_image" / "16:9" - La forma del resultado. Cuando match_input_image es una de las opciones, conserva las proporciones de la imagen de entrada, o de la primera si hay varias. Opciones: match_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2 y 2:3. Si no lo envías: match_input_image cuando envías image, 16:9 cuando no.
save_audioboolean- Por Defecto
true - Conserva la pista de audio generada.
seedinteger- Por DefectoNinguno
- Fíjala para reproducir un resultado; omítela para obtener uno aleatorio.
enhance_promptboolean- Por Defecto
true - Picasso IA reescribe tu prompt para conseguir un mejor resultado. Tu prompt original se conserva en la entrada.
Modos
El modo depende de los archivos que envíes con el prompt, si envías alguno. Todos los modos usan el mismo endpoint.
Petición de Ejemplo
Texto a Vídeo
curl -s -X POST https://api.picassoia.com/v1/models/picassoia/seedance-2.5-lite/predictions \
-H "Authorization: Bearer $PICASSOIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"prompt":"a paper boat sailing down a rainy street"}}'const API = 'https://api.picassoia.com/v1'
const headers = {
Authorization: `Bearer ${process.env.PICASSOIA_API_KEY}`,
'Content-Type': 'application/json',
}
const sleep = (s) => new Promise((resolve) => setTimeout(resolve, s * 1000))
const input = {
prompt: "a paper boat sailing down a rainy street"
}
const created = await fetch(`${API}/models/picassoia/seedance-2.5-lite/predictions`, {
method: 'POST',
headers,
body: JSON.stringify({ input }),
})
let prediction = await created.json()
if (!created.ok) throw new Error(`${prediction.code}: ${prediction.detail}`)
while (!['succeeded', 'failed', 'canceled'].includes(prediction.status)) {
await sleep(prediction.eta?.next_poll_in_seconds ?? 2)
prediction = await (await fetch(prediction.urls.get, { headers })).json()
}
if (prediction.status !== 'succeeded') throw new Error(prediction.error ?? prediction.status)
console.log(prediction.output)import os, time, requests
API = "https://api.picassoia.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PICASSOIA_API_KEY']}"}
payload = {"input": {
"prompt": "a paper boat sailing down a rainy street",
}}
response = requests.post(f"{API}/models/picassoia/seedance-2.5-lite/predictions", json=payload, headers=HEADERS)
prediction = response.json()
if not response.ok:
raise RuntimeError(f"{prediction['code']}: {prediction['detail']}")
while prediction["status"] not in ("succeeded", "failed", "canceled"):
time.sleep((prediction.get("eta") or {}).get("next_poll_in_seconds", 2))
prediction = requests.get(prediction["urls"]["get"], headers=HEADERS).json()
if prediction["status"] != "succeeded":
raise RuntimeError(prediction["error"] or prediction["status"])
print(prediction["output"])Imagen a Vídeo
curl -s -X POST https://api.picassoia.com/v1/models/picassoia/seedance-2.5-lite/predictions \
-H "Authorization: Bearer $PICASSOIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"prompt":"the camera slowly pushes in as she turns and smiles","image":"https://example.com/first-frame.jpg"}}'const API = 'https://api.picassoia.com/v1'
const headers = {
Authorization: `Bearer ${process.env.PICASSOIA_API_KEY}`,
'Content-Type': 'application/json',
}
const sleep = (s) => new Promise((resolve) => setTimeout(resolve, s * 1000))
const input = {
prompt: "the camera slowly pushes in as she turns and smiles",
image: "https://example.com/first-frame.jpg"
}
const created = await fetch(`${API}/models/picassoia/seedance-2.5-lite/predictions`, {
method: 'POST',
headers,
body: JSON.stringify({ input }),
})
let prediction = await created.json()
if (!created.ok) throw new Error(`${prediction.code}: ${prediction.detail}`)
while (!['succeeded', 'failed', 'canceled'].includes(prediction.status)) {
await sleep(prediction.eta?.next_poll_in_seconds ?? 2)
prediction = await (await fetch(prediction.urls.get, { headers })).json()
}
if (prediction.status !== 'succeeded') throw new Error(prediction.error ?? prediction.status)
console.log(prediction.output)import os, time, requests
API = "https://api.picassoia.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PICASSOIA_API_KEY']}"}
payload = {"input": {
"prompt": "the camera slowly pushes in as she turns and smiles",
"image": "https://example.com/first-frame.jpg",
}}
response = requests.post(f"{API}/models/picassoia/seedance-2.5-lite/predictions", json=payload, headers=HEADERS)
prediction = response.json()
if not response.ok:
raise RuntimeError(f"{prediction['code']}: {prediction['detail']}")
while prediction["status"] not in ("succeeded", "failed", "canceled"):
time.sleep((prediction.get("eta") or {}).get("next_poll_in_seconds", 2))
prediction = requests.get(prediction["urls"]["get"], headers=HEADERS).json()
if prediction["status"] != "succeeded":
raise RuntimeError(prediction["error"] or prediction["status"])
print(prediction["output"])Fotograma Inicial y Final
curl -s -X POST https://api.picassoia.com/v1/models/picassoia/seedance-2.5-lite/predictions \
-H "Authorization: Bearer $PICASSOIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"prompt":"a smooth transition from day to night over the city","image":"https://example.com/first-frame.jpg","last_frame_image":"https://example.com/last-frame.jpg"}}'const API = 'https://api.picassoia.com/v1'
const headers = {
Authorization: `Bearer ${process.env.PICASSOIA_API_KEY}`,
'Content-Type': 'application/json',
}
const sleep = (s) => new Promise((resolve) => setTimeout(resolve, s * 1000))
const input = {
prompt: "a smooth transition from day to night over the city",
image: "https://example.com/first-frame.jpg",
last_frame_image: "https://example.com/last-frame.jpg"
}
const created = await fetch(`${API}/models/picassoia/seedance-2.5-lite/predictions`, {
method: 'POST',
headers,
body: JSON.stringify({ input }),
})
let prediction = await created.json()
if (!created.ok) throw new Error(`${prediction.code}: ${prediction.detail}`)
while (!['succeeded', 'failed', 'canceled'].includes(prediction.status)) {
await sleep(prediction.eta?.next_poll_in_seconds ?? 2)
prediction = await (await fetch(prediction.urls.get, { headers })).json()
}
if (prediction.status !== 'succeeded') throw new Error(prediction.error ?? prediction.status)
console.log(prediction.output)import os, time, requests
API = "https://api.picassoia.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PICASSOIA_API_KEY']}"}
payload = {"input": {
"prompt": "a smooth transition from day to night over the city",
"image": "https://example.com/first-frame.jpg",
"last_frame_image": "https://example.com/last-frame.jpg",
}}
response = requests.post(f"{API}/models/picassoia/seedance-2.5-lite/predictions", json=payload, headers=HEADERS)
prediction = response.json()
if not response.ok:
raise RuntimeError(f"{prediction['code']}: {prediction['detail']}")
while prediction["status"] not in ("succeeded", "failed", "canceled"):
time.sleep((prediction.get("eta") or {}).get("next_poll_in_seconds", 2))
prediction = requests.get(prediction["urls"]["get"], headers=HEADERS).json()
if prediction["status"] != "succeeded":
raise RuntimeError(prediction["error"] or prediction["status"])
print(prediction["output"])Autenticación
Cada petición necesita una API key en la cabecera Authorization, como token Bearer. Crea las keys en tu cuenta; la key completa se muestra una sola vez.
Authorization: Bearer $PICASSOIA_API_KEYCola y Sondeo
Cada predicción tiene tres pasos: crearla, consultarla hasta que termine y leer el resultado.
Envío
La API responde 201, normalmente en pocos segundos, con la predicción en el estado starting, una estimación en eta y la URL que hay que consultar en urls.get. Si la predicción falla de inmediato, por ejemplo cuando el filtro de seguridad rechaza la entrada, la respuesta sigue siendo 201, con la predicción en el estado failed y su error.
curl -s -X POST https://api.picassoia.com/v1/models/picassoia/seedance-2.5-lite/predictions \
-H "Authorization: Bearer $PICASSOIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"prompt":"a paper boat sailing down a rainy street"}}'const API = 'https://api.picassoia.com/v1'
const headers = {
Authorization: `Bearer ${process.env.PICASSOIA_API_KEY}`,
'Content-Type': 'application/json',
}
const input = {
prompt: "a paper boat sailing down a rainy street"
}
const created = await fetch(`${API}/models/picassoia/seedance-2.5-lite/predictions`, {
method: 'POST',
headers,
body: JSON.stringify({ input }),
})
let prediction = await created.json()
if (!created.ok) throw new Error(`${prediction.code}: ${prediction.detail}`)
console.log(prediction.id, prediction.status) // api_…, startingimport os, requests
API = "https://api.picassoia.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PICASSOIA_API_KEY']}"}
payload = {"input": {
"prompt": "a paper boat sailing down a rainy street",
}}
response = requests.post(f"{API}/models/picassoia/seedance-2.5-lite/predictions", json=payload, headers=HEADERS)
prediction = response.json()
if not response.ok:
raise RuntimeError(f"{prediction['code']}: {prediction['detail']}")
print(prediction["id"], prediction["status"]) # api_…, starting{
"id": "api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60",
"model": "picassoia/seedance-2.5-lite",
"input": {
"prompt": "a paper boat sailing down a rainy street",
"resolution": "480p",
"duration": 5,
"aspect_ratio": "16:9",
"save_audio": true,
"enhance_prompt": true
},
"output": null,
"error": null,
"status": "starting",
"created_at": "2026-10-01T09:30:00.000Z",
"started_at": null,
"completed_at": null,
"metrics": {
"predict_time": null
},
"urls": {
"get": "https://api.picassoia.com/v1/predictions/api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60",
"cancel": "https://api.picassoia.com/v1/predictions/api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60/cancel"
},
"eta": {
"seconds": 60,
"next_poll_in_seconds": 30
}
}Sondeo
Vuelve a consultar urls.get pasados los segundos de eta.next_poll_in_seconds: a la mitad del tiempo estimado, al cumplirse la estimación y después cada 2 segundos.
# Repeat after eta.next_poll_in_seconds until status is
# succeeded, failed or canceled.
curl -s https://api.picassoia.com/v1/predictions/api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60 \
-H "Authorization: Bearer $PICASSOIA_API_KEY"const sleep = (s) => new Promise((resolve) => setTimeout(resolve, s * 1000))
while (!['succeeded', 'failed', 'canceled'].includes(prediction.status)) {
await sleep(prediction.eta?.next_poll_in_seconds ?? 2)
prediction = await (await fetch(prediction.urls.get, { headers })).json()
}import time
while prediction["status"] not in ("succeeded", "failed", "canceled"):
time.sleep((prediction.get("eta") or {}).get("next_poll_in_seconds", 2))
prediction = requests.get(prediction["urls"]["get"], headers=HEADERS).json(){
"id": "api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60",
"status": "processing",
"output": null,
"eta": {
"seconds": 30,
"next_poll_in_seconds": 30
}
}Resultado
Cuando status es succeeded, output contiene el resultado. Una predicción en failed indica el motivo en error, y una en canceled se detuvo antes de terminar. Los tres estados son definitivos.
# The last poll holds the result: "output" when "status" is succeeded,
# "error" when it is failed. With jq, just those three fields:
curl -s https://api.picassoia.com/v1/predictions/api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60 \
-H "Authorization: Bearer $PICASSOIA_API_KEY" | jq '.status, .output, .error'if (prediction.status !== 'succeeded') throw new Error(prediction.error ?? prediction.status)
console.log(prediction.output)if prediction["status"] != "succeeded":
raise RuntimeError(prediction["error"] or prediction["status"])
print(prediction["output"]){
"id": "api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60",
"status": "succeeded",
"output": "https://…/output.mp4",
"error": null,
"completed_at": "2026-10-01T09:30:54.000Z",
"metrics": {
"predict_time": 52.8
},
"eta": null
}Cancelación
POST urls.cancel detiene una predicción que sigue en cola (de cualquier modelo) o una imagen que aún se está generando; un vídeo que ya se está generando responde 409 not_cancelable.
Los ID, tiempos y URL de estas respuestas son de ejemplo: tus respuestas traerán los suyos.
Salida
Cuando la predicción termina con éxito, output es la URL de un vídeo MP4.
Resultados Reales
Errores y Límites
Los errores llegan como problem details en JSON con un code estable, y un 422 enumera todos los campos con errores.
{
"title": "Input validation failed",
"status": 422,
"code": "invalid_input",
"detail": "input.duration: At 720p the longest clip is 10 seconds.",
"invalid_fields": [
{
"type": "invalid_value",
"field": "input.duration",
"description": "At 720p the longest clip is 10 seconds."
}
]
}Límites
- 5 predicciones en cola o en ejecución a la vez por cuenta
- Cuerpo de la petición de hasta 10 MB; imágenes como data URL de hasta 5 MB cada una
- Prompt de hasta 4000 caracteres
- Los campos desconocidos se rechazan con 422 invalid_input
Precios
$0 por petición con un plan Infinite activo: las predicciones de la API no consumen créditos, sean cuales sean los ajustes.
Otros proveedores cobran desde ~$0.2205/s por un modelo comparable (consultado el 1 de octubre de 2026).
Precios de la APIJSON Schema
El mismo esquema que sirve la API en GET /v1/models/picassoia/seedance-2.5-lite.
{
"input_schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "What happens in the video."
},
"image": {
"type": "string",
"description": "Opening frame (image-to-video): an https URL or a data URL."
},
"last_frame_image": {
"type": "string",
"description": "Closing frame: an https URL or a data URL. Needs image as well."
},
"resolution": {
"default": "480p",
"description": "480p (up to 15 s) or 720p (up to 10 s).",
"type": "string",
"enum": [
"480p",
"720p"
]
},
"duration": {
"default": 5,
"description": "Length in seconds: 5, 10 or 15.",
"type": "number",
"enum": [
5,
10,
15
]
},
"aspect_ratio": {
"description": "Default: match_input_image when there is an image, 16:9 without one.",
"type": "string",
"enum": [
"match_input_image",
"1:1",
"16:9",
"9:16",
"4:3",
"3:4",
"3:2",
"2:3"
]
},
"save_audio": {
"default": true,
"description": "Keep the generated audio track.",
"type": "boolean"
},
"seed": {
"description": "Random seed. Set it to reproduce a result.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"enhance_prompt": {
"default": true,
"description": "Let PicassoIA rewrite the prompt for a better video before generating it.",
"type": "boolean"
}
},
"required": [
"prompt"
],
"additionalProperties": false
},
"output_schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "string",
"format": "uri",
"description": "URL of the generated video (MP4)."
}
}