O Seedance 2.5 Lite usa o ID de modelo picassoia/seedance-2.5-lite. Texto e imagem para vídeo com áudio, clipes de 5, 10 ou 15 segundos e saída em 480p ou 720p.
Como Chamar a API
Envie requisições para https://api.picassoia.com/v1/models/picassoia/seedance-2.5-lite/predictions com um corpo JSON cujo input siga os parâmetros abaixo.
Configuração
Guarde sua API key no seu servidor, em uma variável de ambiente, e envie-a no cabeçalho Authorization de cada requisição.
export PICASSOIA_API_KEY="pia_sk_…"Parâmetros da Requisição
promptstringObrigatório- PadrãoNenhum
- O que a saída deve mostrar. Até 4000 caracteres.
imagestring- PadrãoNenhum
- O quadro inicial ou a imagem a ser usada como base. Uma imagem PNG, JPEG ou WebP, como URL https pública ou como data URL de até 5 MB.
last_frame_imagestring- PadrãoNenhum
- O quadro de encerramento: o clipe termina nele. Requer o campo image. Uma imagem PNG, JPEG ou WebP, como URL https pública ou como data URL de até 5 MB.
resolutionstring- Padrão
"480p" - O tamanho da saída. Opções: 480p e 720p.
durationnumber- Padrão
5 - A duração do clipe, em segundos. Opções: 5, 10 e 15. Até 15 em 480p. Até 10 em 720p.
aspect_ratiostring- Padrão
"match_input_image" / "16:9" - O formato da saída. Quando match_input_image é uma das opções, ela mantém as proporções da imagem de entrada, ou da primeira, se houver várias. Opções: match_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2 e 2:3. Se você não enviar: match_input_image quando image é enviado, 16:9 quando não é.
save_audioboolean- Padrão
true - Mantém a faixa de áudio gerada.
seedinteger- PadrãoNenhum
- Defina-a para reproduzir um resultado; omita-a para usar uma aleatória.
enhance_promptboolean- Padrão
true - A Picasso IA reescreve seu prompt para obter um resultado melhor. O seu prompt original continua na entrada.
Modos
O modo depende dos arquivos que você envia com o prompt, se houver. Todos os modos usam o mesmo endpoint.
Requisição de Exemplo
Texto para 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"])Imagem para 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"])Quadro Inicial e 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"])Autenticação
Toda requisição precisa de uma API key no cabeçalho Authorization, como token Bearer. Crie chaves na sua conta; a chave completa é exibida uma única vez.
Authorization: Bearer $PICASSOIA_API_KEYFila e Consulta Periódica
Toda previsão passa por três etapas: criá-la, consultá-la até que termine e, depois, ler o resultado.
Enviar
A API responde 201, geralmente em poucos segundos, com a previsão no estado starting, uma estimativa em eta e a URL a consultar em urls.get. Se a previsão falhar imediatamente, por exemplo quando o filtro de segurança recusa a entrada, a resposta continua sendo 201, com a previsão no estado failed e o seu erro.
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
}
}Consultar
Consulte urls.get de novo após eta.next_poll_in_seconds: na metade do tempo estimado, quando a estimativa é atingida e, depois, a 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
Quando status é succeeded, output contém o resultado. Uma previsão failed traz o motivo em error, e uma canceled foi interrompida antes de terminar. Os três estados são finais.
# 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
}Cancelar
POST urls.cancel interrompe uma previsão que ainda está na fila (qualquer modelo) ou uma imagem que ainda está sendo gerada; um vídeo que já está em geração retorna 409 not_cancelable.
Os IDs, horários e URLs destas respostas são exemplos: os seus terão valores próprios.
Saída
Quando a previsão termina com sucesso, output é a URL de um vídeo MP4.
Saídas Reais
Erros e Limites
Os erros são respostas JSON no formato problem details, com um code estável, e um 422 indica todos os campos com problema.
{
"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."
}
]
}Limites
- 5 previsões na fila ou em execução ao mesmo tempo por conta
- Corpo da requisição de até 10 MB; imagens como data URLs de até 5 MB cada
- Prompt de até 4000 caracteres
- Campos desconhecidos são recusados com 422 invalid_input
Preços
$0 por requisição com um plano Infinite ativo: as previsões da API não consomem créditos, sejam quais forem as configurações.
Outros provedores cobram a partir de ~$0.2205/s por um modelo comparável (em 1 de outubro de 2026).
Preços da APIJSON Schema
O mesmo esquema que a API disponibiliza em 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)."
}
}