Crie Grátis

Referência da API da PicassoIA

Execute os modelos de imagem e vídeo da PicassoIA a partir do seu próprio código com uma API HTTP simples: crie uma previsão, consulte-a periodicamente até que ela termine e baixe o resultado.

  • URL basehttps://api.picassoia.com/v1
  • Grátis no plano Infinite
  • Até 5 previsões em andamento ao mesmo tempo

A API da PicassoIA permite executar os modelos de imagem e vídeo da PicassoIA a partir do seu próprio código:

  1. Você cria uma previsão para um modelo.
  2. Você consulta a previsão periodicamente até que ela termine.
  3. Você lê as URLs de saída.
  • URL base: https://api.picassoia.com/v1
  • Formato: requisições e respostas em JSON, UTF-8.
  • Preço: atualmente, as previsões pela API são gratuitas. Elas não consomem créditos.
  • Quem pode usar: contas com o plano Infinite.

Sumário

Autenticação

Toda requisição precisa de uma API key no cabeçalho Authorization:

Authorization: Bearer pia_sk_…
  • Criar uma chave. Crie chaves em picassoia.com, na seção de API keys da sua conta.
    • A chave completa é exibida uma única vez, no momento em que você a cria. Guarde-a em um lugar seguro.
    • Uma conta pode ter 2 chaves ao mesmo tempo. Para abrir espaço, revogue uma delas.
  • Revogar uma chave. Uma chave revogada deixa de funcionar imediatamente.
  • Mantenha as chaves no servidor. Qualquer pessoa com uma chave pode executar previsões na sua conta, então nunca coloque uma chave em uma página web ou em um aplicativo móvel. A API não envia cabeçalhos CORS, portanto os navegadores não podem chamá-la diretamente.
  • Mudanças de plano. As chaves continuam existindo se o seu plano mudar. Sem um plano Infinite, criar previsões retorna 403 plan_required. Ler, listar e cancelar as suas previsões continua funcionando.

Início rápido

1. Crie uma previsão:

bash
curl -s -X POST https://api.picassoia.com/v1/models/picassoia/picassoia-image/predictions \
  -H "Authorization: Bearer $PICASSOIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input": {"prompt": "a lighthouse at sunset, oil painting", "aspect_ratio": "16:9"}}'

A resposta (201 Created) é uma previsão no estado starting:

json
{
  "id": "api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60",
  "model": "picassoia/picassoia-image",
  "input": {
    "prompt": "a lighthouse at sunset, oil painting",
    "aspect_ratio": "16:9",
    "num_outputs": 1,
    "output_format": "jpg",
    "output_quality": 80
  },
  "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": 12, "next_poll_in_seconds": 6 }
}

2. Consulte-a periodicamente (aguarde eta.next_poll_in_seconds entre as chamadas) até que status seja succeeded, failed ou canceled:

bash
curl -s https://api.picassoia.com/v1/predictions/api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60 \
  -H "Authorization: Bearer $PICASSOIA_API_KEY"

3. Leia a saída:

json
{
  "id": "api_3f9c2b7e8d1a4c6f9e0b1a2c3d4e5f60",
  "status": "succeeded",
  "output": ["https://…/lighthouse.jpg"],
  "metrics": { "predict_time": 6.4 },
  "eta": null
}

(Os demais campos foram omitidos aqui.)

Node.js (fetch)

js
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))

async function run(model, input) {
  const created = await fetch(`${API}/models/${model}/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)
  return prediction.output
}

const video = await run('picassoia/seedance-2.5-lite', {
  prompt: 'a paper boat sailing down a rainy street',
  duration: 5,
})
console.log(video) // "https://…/video.mp4"

Python (requests)

python
import os, time, requests

API = "https://api.picassoia.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PICASSOIA_API_KEY']}"}

def run(model, input):
    response = requests.post(f"{API}/models/{model}/predictions", json={"input": input}, 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"])
    return prediction["output"]

images = run("picassoia/picassoia-image-editor-pro", {
    "prompt": "put the cat from image 1 on the sofa from image 2",
    "images": ["https://example.com/cat.png", "https://example.com/sofa.jpg"],
})
print(images)  # ["https://…/result.webp"]

Modelos

ModeloO que fazSaída
picassoia/picassoia-imageTexto para imagem: 1 ou 2 imagens a partir de um promptlista de URLs de imagem
picassoia/picassoia-image-editor-proEdita ou combina de 1 a 4 imagens seguindo um promptlista de URLs de imagem
picassoia/picassoia-videoTexto ou imagem para vídeo: 480p até 20 s, 720p até 10 s, 1080p até 5 suma URL de MP4
picassoia/seedance-2.5-liteTexto ou imagem para vídeo com áudio sincronizado: 5, 10 ou 15 s; quadro final opcionaluma URL de MP4

O esquema exato de cada modelo também é disponibilizado como JSON Schema: GET /v1/models/{owner}/{name} retorna input_schema (com todos os campos, seus limites e valores padrão) e output_schema.

Imagens como entrada. Os campos de imagem aceitam qualquer um destes dois tipos de valor:

  • uma URL https acessível publicamente;
  • uma data URL: data:image/png;base64,…, e também image/jpeg ou image/webp, de até 5 MB cada.

As imagens devem ser PNG, JPEG ou WebP. A PicassoIA armazena uma cópia própria de cada uma, então o input da previsão mostra a URL dessa cópia. Use URLs para qualquer imagem maior que algumas centenas de KB: o corpo inteiro da requisição é limitado a 10 MB.

Campos desconhecidos são recusados, para que um erro de digitação não faça a API recorrer silenciosamente a um valor padrão. A resposta é 422 invalid_input.

picassoia/picassoia-image

CampoTipoPadrãoObservações
promptstring, 1–4000 caracteresobrigatórioO que a imagem deve mostrar.
aspect_ratio1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:31:1
num_outputsinteiro, 1–21Quantas imagens.
output_formatwebp, jpg, pngjpg
output_qualityinteiro, 0–10080Apenas JPG e WebP.
seedinteiroaleatórioDefina-o para reproduzir um resultado.

Saída: uma lista de 1 ou 2 URLs de imagem.

picassoia/picassoia-image-editor-pro

CampoTipoPadrãoObservações
promptstring, 1–4000 caracteresobrigatórioA edição a ser feita. Faça referência às imagens como "image 1", "image 2"…
imageslista de 1–4 imagens (URLs https ou data URLs)obrigatórioA primeira é a imagem principal.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_imagematch_input_image mantém as proporções da primeira imagem.
num_outputsinteiro, 1–21
output_formatwebp, jpg, pngwebp
output_qualityinteiro, 0–10095Apenas JPG e WebP.
seedinteiroaleatório

Saída: uma lista de 1 ou 2 URLs de imagem.

picassoia/picassoia-video

CampoTipoPadrãoObservações
promptstring, 1–4000 caracteresobrigatórioO que acontece no vídeo.
imageimagem (URL https ou data URL)—Quadro inicial (imagem para vídeo).
resolution480p, 720p, 1080p480p
durationinteiro, segundos51–20 em 480p, até 10 em 720p, até 5 em 1080p.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_image com uma image, 16:9 sem ela
save_audiobooleanotrueMantém a faixa de áudio gerada.
seedinteiroaleatório
enhance_promptbooleanotrueA PicassoIA reescreve o prompt para obter um vídeo melhor antes de gerá-lo. O seu prompt original permanece em input.

Saída: uma URL de MP4 (uma string).

picassoia/seedance-2.5-lite

CampoTipoPadrãoObservações
promptstring, 1–4000 caracteresobrigatórioO que acontece no vídeo.
imageimagem (URL https ou data URL)—Quadro inicial.
last_frame_imageimagem (URL https ou data URL)—Quadro final. Também requer image.
resolution480p, 720p480p
duration5, 10 ou 15 (segundos)5Até 15 em 480p, até 10 em 720p.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_image com uma image, 16:9 sem ela
save_audiobooleanotrueMantém o áudio sincronizado.
seedinteiroaleatório
enhance_promptbooleanotrueComo em picassoia/picassoia-video.

Saída: uma URL de MP4 (uma string).

Endpoints

Método e caminhoO que fazSucesso
GET /v1/modelsLista os modelos, com seus esquemas200 { "next": null, "previous": null, "results": [Model] }
GET /v1/models/{owner}/{name}Um modelo200 Modelo
POST /v1/models/{owner}/{name}/predictionsCria uma previsão201 Previsão
GET /v1/predictions/{id}Obtém uma previsão200 Previsão
POST /v1/predictions/{id}/cancelCancela uma previsão200 Previsão
GET /v1/predictionsLista as suas previsões, das mais recentes para as mais antigas200 { "next", "previous", "results": [Prediction] }

Modelo

json
{
  "id": "picassoia/seedance-2.5-lite",
  "owner": "picassoia",
  "name": "seedance-2.5-lite",
  "title": "Seedance 2.5 Lite",
  "description": "Text or image to video with synchronized audio: …",
  "input_schema": { "type": "object", "properties": { "…": {} }, "required": ["prompt"], "additionalProperties": false },
  "output_schema": { "type": "string", "format": "uri" }
}

Criar uma previsão

POST /v1/models/{owner}/{name}/predictions com o corpo { "input": { … } }.

  • A API responde assim que o modelo aceita o trabalho, geralmente em poucos segundos, com a previsão no estado starting. Ela nunca espera pelo resultado.
  • Se a previsão falhar imediatamente, a resposta continua sendo 201, com a previsão no estado failed e o seu error. Isso acontece, por exemplo, quando a entrada é recusada pelo filtro de segurança.
  • Se nenhuma previsão tiver sido criada, a resposta é um erro: entrada inválida, plano, previsões demais em andamento, serviço indisponível.

Listar previsões

GET /v1/predictions retorna as suas previsões da API, 50 por página, das mais recentes para as mais antigas, considerando todas as suas chaves.

  • next é a URL da próxima página (…/v1/predictions?cursor=…), ou null na última página.
  • previous é sempre null.
  • As previsões que você excluiu em picassoia.com não são incluídas.

Uma previsão fica visível por meio de qualquer uma das suas chaves, e nunca para outras pessoas.

O objeto de previsão

CampoTipoObservações
idstringapi_ seguido de 32 caracteres hexadecimais.
modelstringO modelo que ela executa.
inputobjetoA sua entrada, com os valores padrão aplicados. Os campos de imagem apontam para a cópia da PicassoIA.
statusstringstarting, processing, succeeded, failed ou canceled.
outputlista de URLs, uma URL ou nullPreenchido assim que ela chega a succeeded; o seu formato segue o output_schema do modelo.
errorstring ou nullO motivo pelo qual ela terminou em failed.
created_atISO 8601 ou null
started_atISO 8601 ou nullGeralmente null: veja status abaixo.
completed_atISO 8601 ou nullQuando ela terminou.
metrics.predict_timenúmero ou nullSegundos de geração, assim que ela chega a succeeded.
urls.get, urls.cancelURLsOnde consultá-la e onde cancelá-la.
etaobjeto ou nullDurante a execução: seconds, os segundos restantes estimados, e next_poll_in_seconds, quando consultar novamente. null depois que ela termina.

Estados.

EstadoSignificado
startingAceita e aguardando na fila.
processingEm geração.
succeededConcluída. output contém o resultado.
failedConcluída sem resultado. error informa o motivo.
canceledCancelada antes de terminar.

A distinção entre starting e processing é uma estimativa, feita a partir da posição na fila no momento da criação. Uma previsão nova está sempre em starting. Os três últimos estados são finais: uma previsão em um deles nunca mais muda.

Erros de uma previsão com falha. O error de uma previsão com falha é uma destas mensagens:

  • A entrada ou a saída foi recusada pelo filtro de segurança. A mensagem termina em (SAFETY_CHECKER_PICASSO_FILTER_S4).
  • The prediction failed. You can try again.
  • The prediction timed out. You can try again. A previsão não foi concluída em até 3 horas.

Saídas. As URLs de saída são hospedadas pela PicassoIA. Baixe os arquivos que você quiser manter.

Consulta periódica e ETA

eta.next_poll_in_seconds indica quando vale a pena fazer a próxima consulta:

  1. Na metade do tempo estimado.
  2. Quando a estimativa é atingida.
  3. Depois, a cada 2 segundos.

Exemplo com uma estimativa de 10 s: consulte após 5 s, depois após 10 s e, então, a cada 2 s. Consultar com mais frequência não traz o resultado mais cedo.

Cancelamento

POST /v1/predictions/{id}/cancel:

A previsão é…O que acontece
uma imagem, na fila ou em geraçãoCancelada. Responde 200 com status: "canceled".
um vídeo, ainda na filaCancelada. Responde 200 com status: "canceled".
um vídeo, já em geraçãoNão pode ser cancelada: 409 not_cancelable. Consulte-a periodicamente para obter o resultado.
já concluídaResponde 200 com a previsão no estado em que está.

Uma previsão cancelada libera imediatamente o lugar que ocupava entre as suas 5 previsões em andamento.

Erros

Os erros são respostas JSON no formato problem details, acrescidas de um code estável para uso em programas:

json
{
  "title": "Too many predictions in progress",
  "detail": "This account can have up to 5 predictions queued or running at once, shared by its API keys and MCP connections, and 5 are. Wait for one to finish and try again.",
  "status": 429,
  "code": "concurrency_limit",
  "retry_after": 10,
  "limit": 5,
  "running": 5
}
HTTPcodeQuando
400invalid_jsonO corpo não é um JSON válido.
400invalid_cursorO cursor de uma listagem não foi fornecido pela API.
401missing_api_keyFalta o cabeçalho Authorization: Bearer ….
401invalid_api_keyA chave está incorreta ou foi revogada.
403plan_requiredCriar previsões requer um plano Infinite.
404not_foundEsse endpoint não existe.
404model_not_foundA API não disponibiliza esse modelo.
404prediction_not_foundVocê não tem nenhuma previsão com esse id.
405method_not_allowedMétodo incorreto para o endpoint (veja o cabeçalho Allow).
409not_cancelableUm vídeo que já está em geração.
413payload_too_largeO corpo excede 10 MB.
422invalid_inputA entrada não é válida. Veja invalid_fields, abaixo.
429concurrency_limitJá há 5 previsões na fila ou em execução, contando as gerações que a conta executa via MCP. A resposta inclui também limit, running, retry_after e o cabeçalho Retry-After.
500internal_errorAlgo deu errado do nosso lado. Tente novamente.
502bad_gatewayNão foi possível acessar a API. Tente novamente.
503service_unavailable, server_misconfiguredTemporariamente indisponível. Tente novamente mais tarde, depois de Retry-After segundos quando o cabeçalho estiver presente.

invalid_fields. Uma resposta 422 lista todos os campos com problema:

json
{
  "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

LimiteValor
Previsões na fila ou em execução ao mesmo tempo5 por conta, somando todas as suas chaves, limite compartilhado com as gerações que a conta executa via MCP (ChatGPT, Claude, Supercomputer). A 6ª recebe 429.
API keys por conta2
Corpo da requisição10 MB
Imagem enviada como data URL5 MB cada
Prompt4000 caracteres
Imagens para picassoia-image-editor-pro1 a 4
PreçoGratuito: as previsões pela API não consomem créditos