Acesse os melhores modelos de geração de imagens por meio de uma API unificada: texto para imagem, edição de imagens, inpainting com máscara e fusão de várias imagens.
Adicione o cabeçalho Authorization a todas as solicitações:
Authorization: Bearer YOUR_API_KEY
/api/v1/images/generationsCrie uma tarefa de geração de imagens
/api/v1/images/generations?task_id=xxxConsulte o status da tarefa e obtenha a URL da imagem
Selecione um provedor para ver seus parâmetros e exemplos
OpenAI GPT Image 2 por meio de um canal beta alternativo — uma rota de backup para o nosso endpoint principal gpt-image-2. Um único endpoint lida com texto para imagem e edição multi-imagem (até 16 referências), aspect_ratio define a composição e a filtragem NSFW vem ativada por padrão. Assíncrono, latência típica de 15–40s.
gpt-image-2-beta# ─── 1. Text-to-image ──────────────────────────────────────
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-beta",
"prompt": "A cinematic night-city poster with neon reflections on a rainy street",
"aspect_ratio": "16:9"
}'
# ─── 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-beta",
"prompt": "Transform this product shot into a premium e-commerce poster style",
"image_url": "https://example.com/product.jpg",
"aspect_ratio": "4:3"
}'
# ─── 3. Multi-image fusion (up to 16 references) ──────────
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-beta",
"prompt": "Dress the model from image 1 in the outfit from image 2",
"image_urls": [
"https://example.com/model.jpg",
"https://example.com/outfit.jpg"
],
"aspect_ratio": "3:4"
}'
# ─── 4. Poll task status ───────────────────────────────────
curl "https://apimodels.app/api/v1/images/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# ─── 5. Webhook (recommended for production) ──────────────
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-beta",
"prompt": "Studio photo of a ceramic mug on a marble counter",
"aspect_ratio": "1:1",
"callback_url": "https://your-domain.com/webhook/image"
}'{
"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"
}
}Inclua callback_url na solicitação de criação. Quando a tarefa atinge o estado terminal completed ou failed, nosso servidor envia um único HTTP POST para essa URL com Content-Type: application/json (sem cabeçalho de assinatura). A entrega é repetida até 3 vezes (recuo exponencial 1s/2s/4s, 10s por tentativa); se ainda não tiver êxito, um job em segundo plano continua tentando por até 30 minutos até que seu endpoint retorne 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
}
}Observação: data.param e data.resultJson são ambas strings JSON; chame JSON.parse uma vez em cada uma para obter o objeto subjacente.
{
"resultUrls": [
"https://r2.apimodels.app/images/xxx.png"
]
}resultUrls é um array de URLs de imagens hospedadas no Cloudflare R2. Os modelos de várias imagens (SparkPix Image Edit, GPT Image 2 Lite com n>1) retornam mais de uma. Quando state=failed, resultJson normalmente é null ou {"resultUrls":[]}; não presuma que há um link 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
})pendingNa fila, aguardando para iniciarprocessingA imagem está sendo geradacompletedConcluído: URLs de imagens disponíveisfailedA geração falhou400Bad Request: parâmetros inválidos ou ausentes401Unauthorized: chave de API inválida402Payment Required: créditos insuficientes404Not Found -- ID da tarefa não encontrado500Erro interno do servidor