O PicassoIA Image Editor Pro usa o ID de modelo picassoia/picassoia-image-editor-pro. Edição de imagens por IA com até 4 imagens de entrada, 1 ou 2 imagens por requisição e 7 proporções.
Como Chamar a API
Envie requisições para https://api.picassoia.com/v1/models/picassoia/picassoia-image-editor-pro/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.
imagesarrayObrigatório- PadrãoNenhum
- As imagens a editar ou combinar. No prompt, refira-se a elas como image 1, image 2 e assim por diante. De 1 a 4 imagens. Uma imagem PNG, JPEG ou WebP, como URL https pública ou como data URL de até 5 MB.
aspect_ratiostring- Padrão
"match_input_image" - 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.
num_outputsinteger- Padrão
1 - Quantos resultados gerar. De 1 a 2.
output_formatstring- Padrão
"webp" - O formato de arquivo do resultado. Opções: webp, jpg e png.
output_qualityinteger- Padrão
95 - Qualidade de compressão, para JPG e WebP. De 0 a 100.
seedinteger- PadrãoNenhum
- Defina-a para reproduzir um resultado; omita-a para usar uma aleatória.
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
Edição de Imagens
curl -s -X POST https://api.picassoia.com/v1/models/picassoia/picassoia-image-editor-pro/predictions \
-H "Authorization: Bearer $PICASSOIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"prompt":"put the cat from image 1 on the sofa from image 2","images":["https://example.com/cat.png","https://example.com/sofa.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: "put the cat from image 1 on the sofa from image 2",
images: [
"https://example.com/cat.png",
"https://example.com/sofa.jpg"
]
}
const created = await fetch(`${API}/models/picassoia/picassoia-image-editor-pro/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": "put the cat from image 1 on the sofa from image 2",
"images": [
"https://example.com/cat.png",
"https://example.com/sofa.jpg",
],
}}
response = requests.post(f"{API}/models/picassoia/picassoia-image-editor-pro/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/picassoia-image-editor-pro/predictions \
-H "Authorization: Bearer $PICASSOIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":{"prompt":"put the cat from image 1 on the sofa from image 2","images":["https://example.com/cat.png","https://example.com/sofa.jpg"]}}'const API = 'https://api.picassoia.com/v1'
const headers = {
Authorization: `Bearer ${process.env.PICASSOIA_API_KEY}`,
'Content-Type': 'application/json',
}
const input = {
prompt: "put the cat from image 1 on the sofa from image 2",
images: [
"https://example.com/cat.png",
"https://example.com/sofa.jpg"
]
}
const created = await fetch(`${API}/models/picassoia/picassoia-image-editor-pro/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": "put the cat from image 1 on the sofa from image 2",
"images": [
"https://example.com/cat.png",
"https://example.com/sofa.jpg",
],
}}
response = requests.post(f"{API}/models/picassoia/picassoia-image-editor-pro/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/picassoia-image-editor-pro",
"input": {
"prompt": "put the cat from image 1 on the sofa from image 2",
"images": [
"https://example.com/cat.png",
"https://example.com/sofa.jpg"
],
"aspect_ratio": "match_input_image",
"num_outputs": 1,
"output_format": "webp",
"output_quality": 95
},
"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
}
}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": 6,
"next_poll_in_seconds": 6
}
}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-1.webp"
],
"error": null,
"completed_at": "2026-10-01T09:30:08.000Z",
"metrics": {
"predict_time": 6.4
},
"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 é uma lista de 1 ou 2 URLs de imagem.
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.
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 $0.03/MP 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/picassoia-image-editor-pro.
{
"input_schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "The edit to make. Refer to the images as \"image 1\", \"image 2\"…"
},
"images": {
"minItems": 1,
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"description": "An image: an https URL or a data URL."
},
"description": "1 to 4 images to edit or combine; the first one is the main image."
},
"aspect_ratio": {
"default": "match_input_image",
"description": "Aspect ratio of the result; match_input_image keeps the first image's.",
"type": "string",
"enum": [
"match_input_image",
"1:1",
"16:9",
"9:16",
"4:3",
"3:4",
"3:2",
"2:3"
]
},
"num_outputs": {
"default": 1,
"description": "How many images to create: 1 or 2.",
"type": "integer",
"minimum": 1,
"maximum": 2
},
"output_format": {
"default": "webp",
"description": "File format of the images.",
"type": "string",
"enum": [
"webp",
"jpg",
"png"
]
},
"output_quality": {
"default": 95,
"description": "Quality of JPG and WebP images, from 0 to 100.",
"type": "integer",
"minimum": 0,
"maximum": 100
},
"seed": {
"description": "Random seed. Set it to reproduce a result.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"prompt",
"images"
],
"additionalProperties": false
},
"output_schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"minItems": 1,
"maxItems": 2,
"description": "URLs of the edited images, in the requested output_format."
}
}