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, de 1 a 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, de 1 a 21Quantas imagens.
output_formatwebp, jpg, pngjpg
output_qualityinteiro, de 0 a 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, de 1 a 4000 caracteresobrigatórioA edição a ser feita. Faça referência às imagens como "image 1", "image 2"…
imageslista de 1 a 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, de 1 a 21
output_formatwebp, jpg, pngwebp
output_qualityinteiro, de 0 a 10095Apenas JPG e WebP.
seedinteiroaleatório

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

picassoia/picassoia-video

CampoTipoPadrãoObservações
promptstring, de 1 a 4000 caracteresobrigatórioO que acontece no vídeo.
imageimagem (URL https ou data URL)nenhumQuadro inicial (imagem para vídeo).
resolution480p, 720p, 1080p480p
durationinteiro, segundos5De 1 a 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, de 1 a 4000 caracteresobrigatórioO que acontece no vídeo.
imageimagem (URL https ou data URL)nenhumQuadro inicial.
last_frame_imageimagem (URL https ou data URL)nenhumQuadro 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