Essai Gratuit

Référence de l’API PicassoIA

Exécutez les modèles d’image et de vidéo de PicassoIA depuis votre propre code grâce à une API HTTP simple : créez une prédiction, interrogez-la jusqu’à ce qu’elle soit terminée et téléchargez le résultat.

  • URL de basehttps://api.picassoia.com/v1
  • Gratuit avec le forfait Infinite
  • Jusqu’à 5 prédictions en cours simultanément

L’API PicassoIA vous permet d’exécuter les modèles d’image et de vidéo de PicassoIA depuis votre propre code :

  1. Vous créez une prédiction pour un modèle.
  2. Vous interrogez la prédiction jusqu’à ce qu’elle soit terminée.
  3. Vous lisez les URL de sortie.
  • URL de base : https://api.picassoia.com/v1
  • Format : requêtes et réponses en JSON, encodées en UTF-8.
  • Prix : les prédictions effectuées via l’API sont actuellement gratuites. Elles ne consomment aucun crédit.
  • Qui peut l’utiliser : les comptes disposant du forfait Infinite.

Sommaire

Authentification

Chaque requête doit comporter une API key dans l’en-tête Authorization :

Authorization: Bearer pia_sk_…
  • Créer une clé. Vous créez vos clés sur picassoia.com, dans la section API keys de votre compte.
    • La clé complète n’est affichée qu’une seule fois, au moment de sa création. Conservez-la en lieu sûr.
    • Un compte peut détenir 2 clés à la fois. Pour libérer une place, révoquez-en une.
  • Révoquer une clé. Une clé révoquée cesse immédiatement de fonctionner.
  • Gardez vos clés côté serveur. Toute personne qui détient une clé peut lancer des prédictions sur votre compte : n’en placez donc jamais dans une page web ni dans une application mobile. L’API n’envoie aucun en-tête CORS, si bien que les navigateurs ne peuvent pas l’appeler directement.
  • Changement de forfait. Vos clés sont conservées si votre forfait change. Sans forfait Infinite, la création de prédictions renvoie 403 plan_required. Vous pouvez toujours consulter, lister et annuler vos prédictions.

Démarrage rapide

1. Créez une prédiction :

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 réponse (201 Created) est une prédiction à l’état 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. Interrogez-la (attendez eta.next_poll_in_seconds entre deux appels) jusqu’à ce que status vaille succeeded, failed ou canceled :

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

3. Lisez la sortie :

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

(Les autres champs sont omis ici.)

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

Modèles

ModèleCe qu’il faitSortie
picassoia/picassoia-imageTexte vers image : 1 ou 2 images à partir d’un promptliste d’URL d’images
picassoia/picassoia-image-editor-proModifie ou combine de 1 à 4 images en suivant un promptliste d’URL d’images
picassoia/picassoia-videoTexte ou image vers vidéo : 480p jusqu’à 20 s, 720p jusqu’à 10 s, 1080p jusqu’à 5 sune URL MP4
picassoia/seedance-2.5-liteTexte ou image vers vidéo avec audio synchronisé : 5, 10 ou 15 s ; image de fin facultativeune URL MP4

Le schéma exact de chaque modèle est également disponible au format JSON Schema : GET /v1/models/{owner}/{name} renvoie input_schema (avec chaque champ, ses limites et ses valeurs par défaut) et output_schema.

Images en entrée. Les champs d’image acceptent deux types de valeur :

  • une URL https accessible publiquement ;
  • une URL de données : data:image/png;base64,…, ou encore image/jpeg ou image/webp, jusqu’à 5 Mo chacune.

Les images doivent être au format PNG, JPEG ou WebP. PicassoIA conserve sa propre copie de chacune d’elles : dans la prédiction, input affiche donc l’URL de cette copie. Utilisez des URL pour tout fichier de plus de quelques centaines de Ko : le corps de la requête est limité à 10 Mo au total.

Les champs inconnus sont refusés, afin qu’une faute de frappe n’entraîne pas silencieusement l’utilisation d’une valeur par défaut. La réponse est 422 invalid_input.

picassoia/picassoia-image

ChampTypePar défautRemarques
promptchaîne, de 1 à 4000 caractèresobligatoireCe que l’image doit montrer.
aspect_ratio1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:31:1
num_outputsentier, de 1 à 21Nombre d’images.
output_formatwebp, jpg, pngjpg
output_qualityentier, de 0 à 10080JPG et WebP uniquement.
seedentieraléatoireDéfinissez-le pour reproduire un résultat.

Sortie : une liste de 1 ou 2 URL d’images.

picassoia/picassoia-image-editor-pro

ChampTypePar défautRemarques
promptchaîne, de 1 à 4000 caractèresobligatoireLa modification à effectuer. Désignez les images par « image 1 », « image 2 »…
imagesliste de 1 à 4 images (URL https ou URL de données)obligatoireLa première est l’image principale.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_imagematch_input_image conserve les proportions de la première image.
num_outputsentier, de 1 à 21
output_formatwebp, jpg, pngwebp
output_qualityentier, de 0 à 10095JPG et WebP uniquement.
seedentieraléatoire

Sortie : une liste de 1 ou 2 URL d’images.

picassoia/picassoia-video

ChampTypePar défautRemarques
promptchaîne, de 1 à 4000 caractèresobligatoireCe qui se passe dans la vidéo.
imageimage (URL https ou URL de données)—Image de départ (image vers vidéo).
resolution480p, 720p, 1080p480p
durationentier, en secondes5De 1 à 20 en 480p, jusqu’à 10 en 720p, jusqu’à 5 en 1080p.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_image avec une image, 16:9 sans
save_audiobooléentrueConserve la piste audio générée.
seedentieraléatoire
enhance_promptbooléentruePicassoIA réécrit le prompt pour obtenir une meilleure vidéo avant de la générer. Votre prompt d’origine reste dans input.

Sortie : une URL MP4 (une chaîne).

picassoia/seedance-2.5-lite

ChampTypePar défautRemarques
promptchaîne, de 1 à 4000 caractèresobligatoireCe qui se passe dans la vidéo.
imageimage (URL https ou URL de données)—Image de départ.
last_frame_imageimage (URL https ou URL de données)—Image de fin. Nécessite également image.
resolution480p, 720p480p
duration5, 10 ou 15 (secondes)5Jusqu’à 15 en 480p, jusqu’à 10 en 720p.
aspect_ratiomatch_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3match_input_image avec une image, 16:9 sans
save_audiobooléentrueConserve l’audio synchronisé.
seedentieraléatoire
enhance_promptbooléentrueComme pour picassoia/picassoia-video.

Sortie : une URL MP4 (une chaîne).

Points de terminaison

Méthode et cheminActionSuccès
GET /v1/modelsListe les modèles, avec leurs schémas200 { "next": null, "previous": null, "results": [Model] }
GET /v1/models/{owner}/{name}Renvoie un modèle200 Modèle
POST /v1/models/{owner}/{name}/predictionsCrée une prédiction201 Prédiction
GET /v1/predictions/{id}Renvoie une prédiction200 Prédiction
POST /v1/predictions/{id}/cancelAnnule une prédiction200 Prédiction
GET /v1/predictionsListe vos prédictions, de la plus récente à la plus ancienne200 { "next", "previous", "results": [Prediction] }

Modèle

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

Créer une prédiction

POST /v1/models/{owner}/{name}/predictions avec le corps { "input": { … } }.

  • L’API répond dès que le modèle a accepté la tâche, généralement en quelques secondes, avec la prédiction à l’état starting. Elle n’attend jamais le résultat.
  • Si la prédiction échoue immédiatement, la réponse reste 201, avec la prédiction à l’état failed et son error. C’est le cas, par exemple, lorsque l’entrée est refusée par le filtre de sécurité.
  • Si aucune prédiction n’a été créée, la réponse est une erreur : entrée non valide, forfait, trop de prédictions en cours, service indisponible.

Lister les prédictions

GET /v1/predictions renvoie vos prédictions effectuées via l’API, 50 par page, de la plus récente à la plus ancienne, toutes clés confondues.

  • next est l’URL de la page suivante (…/v1/predictions?cursor=…), ou null sur la dernière page.
  • previous vaut toujours null.
  • Les prédictions que vous avez supprimées sur picassoia.com sont exclues.

Une prédiction est accessible avec n’importe laquelle de vos clés, et n’est jamais visible par quelqu’un d’autre.

L’objet prédiction

ChampTypeRemarques
idchaîneapi_ suivi de 32 caractères hexadécimaux.
modelchaîneLe modèle exécuté.
inputobjetVotre entrée, avec les valeurs par défaut appliquées. Les champs d’image pointent vers la copie de PicassoIA.
statuschaînestarting, processing, succeeded, failed ou canceled.
outputliste d’URL, une URL ou nullRenseigné une fois la prédiction réussie (succeeded) ; sa forme est celle de l’output_schema du modèle.
errorchaîne ou nullLa raison de l’échec (failed).
created_atISO 8601 ou null
started_atISO 8601 ou nullGénéralement null : voir status ci-dessous.
completed_atISO 8601 ou nullLe moment où elle s’est terminée.
metrics.predict_timenombre ou nullDurée de génération en secondes, une fois la prédiction réussie (succeeded).
urls.get, urls.cancelURLLes adresses où l’interroger et où l’annuler.
etaobjet ou nullPendant l’exécution : seconds, le nombre estimé de secondes restantes, et next_poll_in_seconds, le délai avant la prochaine interrogation. null une fois la prédiction terminée.

États.

ÉtatSignification
startingAcceptée et en attente dans la file.
processingEn cours de génération.
succeededTerminée. output contient le résultat.
failedTerminée sans résultat. error en indique la raison.
canceledAnnulée avant la fin.

La distinction entre starting et processing est une estimation, établie à partir de la position dans la file au moment de la création. Une nouvelle prédiction est toujours à l’état starting. Les trois derniers états sont définitifs : une prédiction qui a atteint l’un d’eux ne change plus jamais.

Erreurs d’une prédiction échouée. Le champ error d’une prédiction échouée contient l’un des messages suivants :

  • L’entrée ou la sortie a été refusée par le filtre de sécurité. Le message se termine par (SAFETY_CHECKER_PICASSO_FILTER_S4).
  • The prediction failed. You can try again.
  • The prediction timed out. You can try again. La prédiction ne s’est pas terminée dans un délai de 3 heures.

Sorties. Les URL de sortie sont hébergées par PicassoIA. Téléchargez les fichiers que vous souhaitez conserver.

Interrogation périodique et ETA

eta.next_poll_in_seconds vous indique quand la prochaine interrogation sera utile :

  1. À la moitié du temps estimé.
  2. Lorsque le temps estimé est atteint.
  3. Puis toutes les 2 secondes.

Exemple avec une estimation de 10 s : interrogez au bout de 5 s, puis de 10 s, puis toutes les 2 s. Interroger plus souvent ne vous donnera pas le résultat plus tôt.

Annulation

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

La prédiction est…Ce qui se passe
une image, en file d’attente ou en cours de générationAnnulée. Réponse 200 avec status: "canceled".
une vidéo, encore en file d’attenteAnnulée. Réponse 200 avec status: "canceled".
une vidéo, déjà en cours de générationNon annulable : 409 not_cancelable. Interrogez-la pour obtenir son résultat.
déjà terminéeRéponse 200 avec la prédiction telle quelle.

Une prédiction annulée libère immédiatement sa place parmi vos 5 prédictions en cours.

Erreurs

Les erreurs sont renvoyées sous forme de « problem details » JSON, avec en plus un code stable destiné aux programmes :

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
}
HTTPcodeQuand
400invalid_jsonLe corps n’est pas un JSON valide.
400invalid_cursorLe cursor d’une liste ne fait pas partie de ceux fournis par l’API.
401missing_api_keyAucun en-tête Authorization: Bearer ….
401invalid_api_keyLa clé est incorrecte ou a été révoquée.
403plan_requiredLa création de prédictions nécessite un forfait Infinite.
404not_foundCe point de terminaison n’existe pas.
404model_not_foundL’API ne propose pas ce modèle.
404prediction_not_foundVous n’avez aucune prédiction avec cet identifiant.
405method_not_allowedMéthode incorrecte pour ce point de terminaison (voir l’en-tête Allow).
409not_cancelableUne vidéo déjà en cours de génération.
413payload_too_largeLe corps dépasse 10 Mo.
422invalid_inputL’entrée n’est pas valide. Voir invalid_fields ci-dessous.
429concurrency_limit5 prédictions sont déjà en file d’attente ou en cours d’exécution, y compris les générations que le compte lance via MCP. La réponse inclut aussi limit, running, retry_after et l’en-tête Retry-After.
500internal_errorUn problème est survenu de notre côté. Réessayez.
502bad_gatewayL’API n’a pas pu être jointe. Réessayez.
503service_unavailable, server_misconfiguredService temporairement indisponible. Réessayez plus tard, après Retry-After secondes si cet en-tête est présent.

invalid_fields. Une réponse 422 liste chaque champ en cause :

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

LimiteValeur
Prédictions simultanément en file d’attente ou en cours d’exécution5 par compte, toutes clés confondues, partagées avec les générations que le compte lance via MCP (ChatGPT, Claude, Supercomputer). La 6e est refusée avec 429.
API keys par compte2
Corps de la requête10 Mo
Image envoyée sous forme d’URL de données5 Mo chacune
Prompt4000 caractères
Images pour picassoia-image-editor-proDe 1 à 4
PrixGratuit : les prédictions effectuées via l’API ne consomment aucun crédit