Crea Gratis

Referencia de la API de PicassoIA

Usa los modelos de imagen y vídeo de PicassoIA desde tu propio código con una API HTTP sencilla: crea una predicción, consúltala hasta que termine y descarga el resultado.

  • URL basehttps://api.picassoia.com/v1
  • Gratis con el plan Infinite
  • Hasta 5 predicciones en curso a la vez

La API de PicassoIA te permite ejecutar los modelos de imagen y vídeo de PicassoIA desde tu propio código:

  1. Creas una predicción para un modelo.
  2. Consultas la predicción periódicamente hasta que termina.
  3. Lees las URL de salida.
  • URL base: https://api.picassoia.com/v1
  • Formato: peticiones y respuestas en JSON, UTF-8.
  • Precio: por ahora, las predicciones de la API son gratuitas. No consumen créditos.
  • Quién puede usarla: las cuentas con el plan Infinite.

Contenido

Autenticación

Cada petición necesita una API key en la cabecera Authorization:

Authorization: Bearer pia_sk_…
  • Crear una API key. Crea tus API keys en picassoia.com, en la sección API keys de tu cuenta.
    • La API key completa se muestra una sola vez, al crearla. Guárdala en un lugar seguro.
    • Una cuenta puede tener 2 API keys a la vez. Para hacer sitio, revoca una.
  • Revocar una API key. Una API key revocada deja de funcionar al instante.
  • Usa las API keys solo en el servidor. Cualquiera que tenga una API key puede ejecutar predicciones con tu cuenta, así que nunca la incluyas en una página web ni en una app móvil. La API no envía cabeceras CORS, por lo que los navegadores no pueden llamarla directamente.
  • Cambios de plan. Tus API keys se conservan aunque cambie tu plan. Sin un plan Infinite, al crear una predicción la respuesta es 403 plan_required. Podrás seguir consultando, listando y cancelando tus predicciones.

Inicio rápido

1. Crea una predicción:

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"}}'

La respuesta (201 Created) es una predicción en el 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. Consúltala periódicamente (espera eta.next_poll_in_seconds entre llamadas) hasta que status sea succeeded, failed o canceled:

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

3. Lee la salida:

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

(Aquí se omiten los demás campos.)

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

ModeloQué haceSalida
picassoia/picassoia-imageTexto a imagen: 1 o 2 imágenes a partir de un promptlista de URL de imágenes
picassoia/picassoia-image-editor-proEdita o combina de 1 a 4 imágenes siguiendo un promptlista de URL de imágenes
picassoia/picassoia-videoTexto o imagen a vídeo: a 480p hasta 20 s, a 720p hasta 10 s, a 1080p hasta 5 suna URL de MP4
picassoia/seedance-2.5-liteTexto o imagen a vídeo con audio sincronizado: 5, 10 o 15 s; fotograma final opcionaluna URL de MP4

El esquema exacto de cada modelo también se sirve como JSON Schema: GET /v1/models/{owner}/{name} devuelve input_schema (con todos los campos, sus límites y sus valores por defecto) y output_schema.

Imágenes como entrada. Los campos de imagen aceptan cualquiera de estos dos tipos de valor:

  • una URL https accesible públicamente;
  • una data URL: data:image/png;base64,…, también image/jpeg o image/webp, de hasta 5 MB cada una.

Las imágenes deben ser PNG, JPEG o WebP. PicassoIA guarda su propia copia de cada una, así que el input de la predicción muestra la URL de esa copia. Usa URL para cualquier imagen de más de unos cientos de KB: el cuerpo completo de la petición está limitado a 10 MB.

Los campos desconocidos se rechazan, para que una errata no acabe usando en silencio un valor por defecto. La respuesta es 422 invalid_input.

picassoia/picassoia-image

CampoTipoPor defectoNotas
promptcadena, 1–4000 caracteresobligatorioLo que debe mostrar la imagen.
aspect_ratio1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:31:1
num_outputsentero, 1–21Cuántas imágenes generar.
output_formatwebp, jpg, pngjpg
output_qualityentero, 0–10080Solo para JPG y WebP.
seedenteroaleatorioFíjalo para reproducir un resultado.

Salida: una lista de 1 o 2 URL de imágenes.

picassoia/picassoia-image-editor-pro

CampoTipoPor defectoNotas
promptcadena, 1–4000 caracteresobligatorioLa edición que quieres hacer. Refiérete a las imágenes como "image 1", "image 2"…
imageslista de 1–4 imágenes (URL https o data URL)obligatorioLa primera es la imagen principal.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_imagematch_input_image conserva las proporciones de la primera imagen.
num_outputsentero, 1–21
output_formatwebp, jpg, pngwebp
output_qualityentero, 0–10095Solo para JPG y WebP.
seedenteroaleatorio

Salida: una lista de 1 o 2 URL de imágenes.

picassoia/picassoia-video

CampoTipoPor defectoNotas
promptcadena, 1–4000 caracteresobligatorioLo que ocurre en el vídeo.
imageimagen (URL https o data URL)—Fotograma inicial (imagen a vídeo).
resolution480p, 720p, 1080p480p
durationentero, en segundos5Entre 1 y 20 a 480p, hasta 10 a 720p, hasta 5 a 1080p.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_image con una image, 16:9 sin ella
save_audiobooleanotrueConserva la pista de audio generada.
seedenteroaleatorio
enhance_promptbooleanotruePicassoIA reescribe el prompt para obtener un vídeo mejor antes de generarlo. Tu prompt original se conserva en input.

Salida: una URL de MP4 (una cadena).

picassoia/seedance-2.5-lite

CampoTipoPor defectoNotas
promptcadena, 1–4000 caracteresobligatorioLo que ocurre en el vídeo.
imageimagen (URL https o data URL)—Fotograma inicial.
last_frame_imageimagen (URL https o data URL)—Fotograma final. Requiere también image.
resolution480p, 720p480p
duration5, 10 o 15 (segundos)5Hasta 15 a 480p, hasta 10 a 720p.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_image con una image, 16:9 sin ella
save_audiobooleanotrueConserva el audio sincronizado.
seedenteroaleatorio
enhance_promptbooleanotrueIgual que en picassoia/picassoia-video.

Salida: una URL de MP4 (una cadena).

Endpoints

Método y rutaQué haceRespuesta correcta
GET /v1/modelsLista los modelos, con sus esquemas200 { "next": null, "previous": null, "results": [Model] }
GET /v1/models/{owner}/{name}Devuelve un modelo200 Modelo
POST /v1/models/{owner}/{name}/predictionsCrea una predicción201 Predicción
GET /v1/predictions/{id}Obtiene una predicción200 Predicción
POST /v1/predictions/{id}/cancelCancela una predicción200 Predicción
GET /v1/predictionsLista tus predicciones, de la más reciente a la más antigua200 { "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" }
}

Crear una predicción

POST /v1/models/{owner}/{name}/predictions con el cuerpo { "input": { … } }.

  • La API responde en cuanto el modelo acepta el trabajo, normalmente en pocos segundos, con la predicción en el estado starting. Nunca espera al resultado.
  • Si la predicción falla de inmediato, la respuesta sigue siendo 201, con la predicción en el estado failed y su error. Esto ocurre, por ejemplo, cuando el filtro de seguridad rechaza la entrada.
  • Si no se ha creado ninguna predicción, la respuesta es un error: entrada no válida, plan insuficiente, demasiadas predicciones en curso, servicio no disponible.

Listar predicciones

GET /v1/predictions devuelve tus predicciones de la API, 50 por página, de la más reciente a la más antigua, incluidas las de todas tus API keys.

  • next es la URL de la página siguiente (…/v1/predictions?cursor=…), o null en la última página.
  • previous siempre es null.
  • Las predicciones que hayas eliminado en picassoia.com no aparecen.

Una predicción es visible desde cualquiera de tus API keys, y nunca para nadie más.

El objeto de predicción

CampoTipoNotas
idcadenaapi_ seguido de 32 caracteres hexadecimales.
modelcadenaEl modelo que ejecuta.
inputobjetoTu entrada, con los valores por defecto aplicados. Los campos de imagen apuntan a la copia de PicassoIA.
statuscadenastarting, processing, succeeded, failed o canceled.
outputlista de URL, una URL o nullTiene valor una vez que está en succeeded; su forma es la que indica el output_schema del modelo.
errorcadena o nullEl motivo por el que está en failed.
created_atISO 8601 o null
started_atISO 8601 o nullNormalmente null: consulta status más abajo.
completed_atISO 8601 o nullCuándo terminó.
metrics.predict_timenúmero o nullSegundos de generación, una vez que está en succeeded.
urls.get, urls.cancelURLDónde consultarla y dónde cancelarla.
etaobjeto o nullMientras se ejecuta: seconds, los segundos restantes estimados, y next_poll_in_seconds, cuándo volver a consultar. null cuando ya ha terminado.

Estados.

EstadoSignificado
startingAceptada y en espera en la cola.
processingGenerándose.
succeededTerminada. output contiene el resultado.
failedTerminada sin resultado. error indica el motivo.
canceledCancelada antes de terminar.

La distinción entre starting y processing es una estimación, calculada a partir de la posición en la cola en el momento de la creación. Una predicción nueva siempre está en starting. Los tres últimos estados son definitivos: una predicción que está en uno de ellos ya no vuelve a cambiar.

Errores de una predicción fallida. El error de una predicción fallida es uno de estos mensajes:

  • El filtro de seguridad ha rechazado la entrada o la salida. El mensaje termina en (SAFETY_CHECKER_PICASSO_FILTER_S4).
  • The prediction failed. You can try again.
  • The prediction timed out. You can try again. La predicción no terminó en un plazo de 3 horas.

Salidas. Las URL de salida están alojadas en PicassoIA. Descarga los archivos que quieras conservar.

Sondeo y ETA

eta.next_poll_in_seconds te indica cuándo merece la pena hacer la siguiente consulta:

  1. A la mitad del tiempo estimado.
  2. Cuando se alcanza el tiempo estimado.
  3. Después, cada 2 segundos.

Ejemplo con una estimación de 10 s: consulta a los 5 s, luego a los 10 s y, a partir de ahí, cada 2 s. Consultar con más frecuencia no te dará el resultado antes.

Cancelación

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

La predicción es…Qué ocurre
una imagen, en cola o generándoseSe cancela. Responde 200 con status: "canceled".
un vídeo, todavía en colaSe cancela. Responde 200 con status: "canceled".
un vídeo que ya se está generandoNo se puede cancelar: 409 not_cancelable. Sigue consultándola hasta obtener su resultado.
una predicción ya terminadaResponde 200 con la predicción tal como está.

Una predicción cancelada libera al instante su plaza entre tus 5 predicciones en curso.

Errores

Los errores se devuelven como problem details en JSON, con un code estable añadido para uso programático:

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
}
HTTPcodeCuándo
400invalid_jsonEl cuerpo no es un JSON válido.
400invalid_cursorEl cursor de un listado no es uno que te haya dado la API.
401missing_api_keyFalta la cabecera Authorization: Bearer ….
401invalid_api_keyLa API key es incorrecta o se ha revocado.
403plan_requiredPara crear predicciones se necesita un plan Infinite.
404not_foundNo existe ese endpoint.
404model_not_foundLa API no ofrece ese modelo.
404prediction_not_foundNo tienes ninguna predicción con ese id.
405method_not_allowedMétodo incorrecto para el endpoint (consulta la cabecera Allow).
409not_cancelableUn vídeo que ya se está generando.
413payload_too_largeEl cuerpo supera los 10 MB.
422invalid_inputLa entrada no es válida. Consulta invalid_fields, más abajo.
429concurrency_limitYa hay 5 predicciones en cola o en ejecución, contando las generaciones que la cuenta ejecuta a través de MCP. Incluye además limit, running, retry_after y la cabecera Retry-After.
500internal_errorAlgo ha fallado por nuestra parte. Inténtalo de nuevo.
502bad_gatewayNo se ha podido contactar con la API. Inténtalo de nuevo.
503service_unavailable, server_misconfiguredNo disponible temporalmente. Inténtalo de nuevo más tarde, pasados los segundos que indique Retry-After si la respuesta incluye esa cabecera.

invalid_fields. Una respuesta 422 enumera todos los campos con errores:

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." }
  ]
}

Límites

LímiteValor
Predicciones en cola o en ejecución a la vez5 por cuenta, entre todas sus API keys, compartidas con las generaciones que la cuenta ejecuta a través de MCP (ChatGPT, Claude, Supercomputer). La sexta recibe 429.
API keys por cuenta2
Cuerpo de la petición10 MB
Imagen enviada como data URL5 MB cada una
Prompt4000 caracteres
Imágenes para picassoia-image-editor-proDe 1 a 4
PrecioGratis: las predicciones de la API no consumen créditos