Referência da API
Schema completo da API REST pública. Disponível nos planos Pro e Max. Gere uma chave em /account/api.
Prefere Postman? Baixe nossa coleção v2.1 — cole sua chave gimg_… na variável apiKey.
Autenticação
Todos os endpoints recebem um token Bearer no header Authorization. Os tokens sempre começam com gimg_.
Authorization: Bearer gimg_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Rate limits
600 requisições / hora / chave, máx. 5 em paralelo. Toda resposta inclui:
X-RateLimit-Limit— fixo em 600X-RateLimit-Remaining— chamadas restantes na janela atualX-RateLimit-Reset— epoch seconds em que a janela é resetadaRetry-After— segundos até a próxima chamada permitida (apenas em 429)
Idempotência
Passe Idempotency-Key em requisições POST. Enviar a mesma chave duas vezes retorna a geração existente em vez de cobrar créditos em dobro.
/api/v1/generateEnvia uma geração text-to-image OU image-edit. Retorna imediatamente com um generationId; consulte /api/v1/generations/:id para o resultado.
Body
promptstring ≤ 4000 charsobrigatórioDescrição em linguagem natural. Terminologia de fotografia (câmera, lente, iluminação) ajuda.
type"text2img" | "edit"Padrão é 'text2img'. 'edit' exige inputImageKeys.
size"1024x1024" | "1024x1536" | "1536x1024"Proporção. Padrão é 1024x1024.
quality"low" | "medium" | "high"Padrão é medium. high = HD 2K. low é Rápido (1cr).
n1–4Número de variações. Padrão é 1.
inputImageKeysstring[] (max 4)Chaves R2 retornadas por /api/v1/upload. Obrigatório quando type=edit.
Respostas
202 Acceptedjson{ "generationId": "...", "status": "queued" }
400 Bad RequestjsonBody inválido. O erro inclui uma mensagem de validação do Zod.
401 UnauthorizedjsonChave Bearer ausente ou inválida.
402 Payment RequiredjsonCréditos insuficientes ou limite mensal de compute atingido.
403 ForbiddenjsonPlano Pro/Max obrigatório.
422 UnprocessablejsonPrompt bloqueado pela política de conteúdo.
429 Too Many RequestsjsonRate limit atingido. Veja Retry-After.
/api/v1/uploadObtém uma URL PUT pré-assinada do R2 para enviar uma imagem de entrada. Em duas etapas: isto retorna a URL, você faz PUT dos bytes diretamente nela.
Body
filenamestring ≤ 200obrigatórioNome de exibição; não é usado para armazenamento.
contentType"image/png" | "image/jpeg" | "image/webp"obrigatórioDeve ser exatamente um destes três.
sizenumber (bytes ≤ 10 MB)obrigatórioTamanho do arquivo que você pretende dar PUT. Usado para validação.
Resposta (200)
urlstringURL PUT pré-assinada, expira em 5 minutos.
keystringChave R2 — passe isto em inputImageKeys ao chamar /api/v1/generate.
/api/v1/generations/:idConsulta o status de uma geração. Retorna imediatamente com o estado atual.
Resposta (200)
idstringO id da geração.
status"queued" | "running" | "succeeded" | "failed" | "blocked"'blocked' = a moderação de conteúdo rejeitou a entrada ou saída (créditos reembolsados).
typestringtext2img | edit | upscale | …
outputsArray<{ png, webp, width, height }>Preenchido quando status=succeeded. As URLs são públicas, imutáveis e cacheadas pela CDN.
errorstring | nullPreenchido quando status=failed ou status=blocked.
costCreditsnumberCréditos cobrados (reembolsados em caso de blocked ou failed).
createdAt / completedAtISO 8601Timestamps.
Webhooks de saída
Pule o polling: registre endpoints HTTPS para receber eventos generation.succeeded e generation.failed em tempo real. Gerencie em /api/account/webhooks.
Registrar
curl -X POST https://gptimage2.plus/api/account/webhooks \
-H "Cookie: <your session cookie>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/hooks/gptimg",
"events": ["generation.succeeded", "generation.failed"],
"label": "Production app"
}'
# → { "id": "...", "secret": "whsec_..." } ← copy this, shown ONCEPayload do evento
POST https://your-app.com/hooks/gptimg
X-Gptimg-Event: generation.succeeded
X-Gptimg-Signature: <hex sha256 hmac of body>
X-Gptimg-Delivery: <uuid for dedup>
Content-Type: application/json
{
"event": "generation.succeeded",
"data": {
"generationId": "...",
"type": "text2img",
"status": "succeeded",
"outputs": [{ "png": "...", "webp": "...", "width": 1024, "height": 1024 }],
"createdAt": "2026-04-26T01:23:45.000Z",
"completedAt": "2026-04-26T01:23:50.000Z"
}
}Verificar a assinatura
// Node example
import crypto from "crypto";
const expected = crypto
.createHmac("sha256", process.env.WEBHOOK_SECRET)
.update(rawBody)
.digest("hex");
const ok = crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(req.headers["x-gptimg-signature"])
);Timeout: 5s por tentativa. Repetimos respostas não-2xx até 3 vezes com backoff exponencial (30s → 2min → 10min). Após 8 falhas consecutivas entre tentativas, o webhook é desativado automaticamente — reative em /account/webhooks.