Accede a los mejores modelos de generación de imágenes a través de una API unificada: texto a imagen, edición de imágenes, inpainting con máscara y fusión de varias imágenes.
Añade el encabezado Authorization a todas las solicitudes:
Authorization: Bearer YOUR_API_KEY
/api/v1/images/generationsCrea una tarea de generación de imágenes
/api/v1/images/generations?task_id=xxxConsulta el estado de la tarea y obtén la URL de la imagen
Selecciona un proveedor para ver sus parámetros y ejemplos
OpenAI gpt-image-2 a través del canal más económico. API síncrona: un único endpoint enruta automáticamente a /v1/images/generations (texto a imagen) o /v1/images/edits (edición de imagen + máscara). Admite salida 1K / 2K / 4K con control de calidad, moderation=low integrado y un precio fijo de $0.03 por imagen.
gpt-image-2-lite# ─── 1. Text-to-image (1024x1024, low quality, jpeg) ──────
curl -X POST https://apimodels.app/api/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2-lite",
"prompt": "A children'"'"'s book drawing of a veterinarian using a stethoscope to listen to the heartbeat of a baby otter.",
"size": "1024x1024",
"quality": "low",
"output_format": "jpeg"
}'
# Response (sync — image URL returned directly):
# { "code": 200, "msg": "success", "data": { "taskId": "clxxx", "state": "completed", "resultUrls": ["https://r2.apimodels.app/..."] } }
# ─── 2. Image editing with a reference URL ────────────────
curl -X POST https://apimodels.app/api/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2-lite",
"prompt": "Change the season to winter with snow",
"image_url": "https://example.com/landscape.jpg",
"size": "1536x1024"
}'
# ─── 3. Multi-image fusion via base64 ─────────────────────
curl -X POST https://apimodels.app/api/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2-lite",
"prompt": "Combine the model from image 1 with the outfit from image 2",
"image_base64": "BASE64_IMAGE_1",
"image_urls": ["https://example.com/outfit.jpg"],
"size": "1024x1536"
}'
# ─── 4. Mask inpainting (regenerate masked region only) ───
curl -X POST https://apimodels.app/api/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2-lite",
"prompt": "Replace the logo on the box",
"image_base64": "BASE64_IMAGE",
"mask_base64": "BASE64_MASK_PNG",
"size": "1024x1024"
}'
# ─── 5. Poll status (lite is sync, this returns completed) ─
curl "https://apimodels.app/api/v1/images/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"{
"code": 200,
"msg": "success",
"data": {
"taskId": "clxxx...",
"state": "pending"
}
}{
"code": 200,
"msg": "success",
"data": {
"taskId": "clxxx...",
"state": "completed",
"resultUrls": ["https://r2.apimodels.app/images/xxx.jpeg"],
"createTime": 1705123450000,
"completeTime": 1705123465000
}
}{
"code": 200,
"msg": "success",
"data": {
"taskId": "clxxx...",
"state": "failed",
"failMsg": "Content policy violation"
}
}Incluye callback_url en la solicitud de creación. Cuando la tarea alcanza el estado terminal completed o failed, nuestro servidor envía un único HTTP POST a esa URL con Content-Type: application/json (sin encabezado de firma). La entrega se reintenta hasta 3 veces (retroceso exponencial 1s/2s/4s, 10s por intento); si aún no tiene éxito, un trabajo en segundo plano sigue reintentando durante hasta 30 minutos hasta que tu endpoint devuelva 2xx.
POST {your callback_url}
Content-Type: application/json
{
"code": 200,
"msg": "success",
"data": {
"taskId": "clxxx...",
"model": "<provider>/<model_name>",
"state": "completed" | "failed",
"param": "<JSON string>", // request params, JSON.parse once
"resultJson": "<JSON string> | null", // result object, JSON.parse once
"failCode": null | "CONTENT_MODERATION | INVALID_INPUT | INSUFFICIENT_BALANCE | UPSTREAM_BUSY | UPSTREAM_FAILED | TIMEOUT | INTERNAL_ERROR | OTHER",
"failMsg": null | "string",
"retryable": true | false, // present when state=failed: safe to retry/fallback
"costTime": 12345, // duration in ms
"completeTime": 1705123465000, // ms epoch
"createTime": 1705123450000 // ms epoch
}
}Nota: data.param y data.resultJson son ambas cadenas JSON; llama a JSON.parse una vez en cada una para obtener el objeto subyacente.
{
"resultUrls": [
"https://r2.apimodels.app/images/xxx.png"
]
}resultUrls es un array de URLs de imágenes alojadas en Cloudflare R2. Los modelos de varias imágenes (SparkPix Image Edit, GPT Image 2 Lite con n>1) devuelven más de una. Cuando state=failed, resultJson suele ser null o {"resultUrls":[]}; no asumas que hay un enlace presente.
app.post('/webhook/image', express.json(), (req, res) => {
const { taskId, state, param, resultJson, failMsg } = req.body.data
if (state === 'completed') {
const { resultUrls } = JSON.parse(resultJson)
console.log('image ready', taskId, resultUrls[0])
} else {
console.warn('image failed', taskId, failMsg)
}
res.status(200).end() // must be 2xx, otherwise we retry
})pendingEn cola, esperando para iniciarprocessingLa imagen se está generandocompletedListo: URLs de imágenes disponiblesfailedLa generación falló400Bad Request: parámetros inválidos o faltantes401Unauthorized: clave de API inválida402Payment Required: créditos insuficientes404Not Found -- ID de tarea no encontrado500Error interno del servidor