PicassoIA Image Editor Pro utilise l'identifiant de modèle picassoia/picassoia-image-editor-pro. Édition d'images par IA avec jusqu'à 4 images d'entrée, 1 ou 2 images par requête et 7 rapports d'aspect.
Appeler l'API
Envoyez vos requêtes à https://api.picassoia.com/v1/models/picassoia/picassoia-image-editor-pro/predictions avec un corps JSON dont l'objet input correspond aux paramètres ci-dessous.
Configuration
Gardez votre API key sur votre serveur, dans une variable d'environnement, et envoyez-la dans l'en-tête Authorization de chaque requête.
export PICASSOIA_API_KEY="pia_sk_…"Paramètres de la Requête
promptstringObligatoire- Par DéfautAucun
- Ce que la sortie doit montrer. Jusqu'à 4000 caractères.
imagesarrayObligatoire- Par DéfautAucun
- Les images à modifier ou à combiner. Désignez-les dans le prompt par image 1, image 2, etc. De 1 à 4 images. Une image PNG, JPEG ou WebP, sous forme d'URL https publique ou d'URL de données de 5 Mo maximum.
aspect_ratiostring- Par Défaut
"match_input_image" - La forme de la sortie. Quand match_input_image est proposé, il conserve les proportions de l'image d'entrée, ou de la première s'il y en a plusieurs. Options : match_input_image, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2 et 2:3.
num_outputsinteger- Par Défaut
1 - Le nombre de résultats à générer. De 1 à 2.
output_formatstring- Par Défaut
"webp" - Le format de fichier du résultat. Options : webp, jpg et png.
output_qualityinteger- Par Défaut
95 - Qualité de compression, pour JPG et WebP. De 0 à 100.
seedinteger- Par DéfautAucun
- Définissez-la pour reproduire un résultat ; omettez-la pour un résultat aléatoire.
Modes
Le mode dépend des fichiers que vous envoyez avec le prompt, le cas échéant. Tous les modes utilisent le même point de terminaison.
Exemple de Requête
Édition d'Images
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"])Authentification
Chaque requête doit comporter une API key dans l'en-tête Authorization, sous forme de jeton Bearer. Créez vos clés dans votre compte ; la clé complète n'est affichée qu'une seule fois.
Authorization: Bearer $PICASSOIA_API_KEYFile d'Attente et Interrogation
Chaque prédiction se déroule en trois étapes : la créer, l'interroger jusqu'à ce qu'elle soit terminée, puis lire le résultat.
Envoi
L'API répond 201, généralement en quelques secondes, avec la prédiction à l'état starting, une estimation dans eta et l'URL à interroger dans urls.get. Si la prédiction échoue immédiatement, par exemple quand le filtre de sécurité refuse l'entrée, la réponse reste 201, avec la prédiction à l'état failed et son champ error.
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
}
}Interrogation
Interrogez de nouveau urls.get après eta.next_poll_in_seconds : à la moitié du temps estimé, lorsque le temps estimé est atteint, puis toutes les 2 secondes.
# 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
}
}Résultat
Quand status vaut succeeded, output contient le résultat. Une prédiction échouée indique sa raison dans error, et une prédiction annulée a été arrêtée avant la fin. Ces trois états sont définitifs.
# 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
}Annulation
POST urls.cancel arrête une prédiction encore en file d'attente (tout modèle) ou une image encore en cours de génération ; pour une vidéo déjà en cours de génération, la réponse est 409 not_cancelable.
Les identifiants, horodatages et URL de ces réponses sont des exemples : les vôtres auront leurs propres valeurs.
Sortie
Quand la prédiction réussit, output est une liste de 1 ou 2 URL d'images.
Résultats Réels
Erreurs et Limites
Les erreurs sont des « problem details » JSON avec un code stable, et une erreur 422 nomme chaque champ en cause.
Limites
- 5 prédictions en file d'attente ou en cours d'exécution à la fois par compte
- Corps de requête jusqu'à 10 Mo ; images en URL de données jusqu'à 5 Mo chacune
- Prompt jusqu'à 4000 caractères
- Les champs inconnus sont refusés avec 422 invalid_input
Tarifs
$0 par requête avec un forfait Infinite actif : les prédictions de l'API ne consomment aucun crédit, quels que soient les paramètres.
D'autres fournisseurs facturent $0.03/MP pour un modèle comparable (au 1er octobre 2026).
Tarifs de l'APIJSON Schema
Le même schéma que celui que l'API renvoie via 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."
}
}