Generación de imágenes con GPT Image 2.6 Sunburst, la rama de estilo del modelo de imagen de OpenAI de noviembre de 2026 con más grano y trazo, para imágenes que necesitan textura y presencia material. Mismas capacidades que Flare, en trabajos asíncronos; niveles 1K / 2K / 4K y 7 relaciones de aspecto, la imagen original tal como se genera, cobro por imagen y nada si falla.
Probar en el Playground →Inicio rápido
Tres pasos: envía un trabajo, consúltalo y toma el enlace de la imagen. Sustituye YOUR_API_KEY por tu clave y los comandos de abajo funcionan tal cual.
Paso 1 · Envía el trabajo (devuelve al momento un id de trabajo, HTTP 202)
curl https://kovapi.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-image-2.6-sunburst", "prompt": "Una pintura al óleo de un puerto al atardecer, pinceladas visibles, paleta cálida", "size": "16:9", "resolution": "2K"}'Respuesta (HTTP 202)
{
"id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
"object": "image.generation.job",
"status": "queued",
"created": 1791281400,
"model": "gpt-image-2.6-sunburst"
}Paso 2 · Consulta cada 2–3 segundos hasta que status sea succeeded o failed
curl https://kovapi.com/v1/images/jobs/img_7f3c9a1e2b4d6f8a0c1e3b5d \ -H "Authorization: Bearer YOUR_API_KEY"
Respuesta cuando sale bien
{
"id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
"object": "image.generation.job",
"status": "succeeded",
"created": 1791281400,
"model": "gpt-image-2.6-sunburst",
"data": [
{"url": "https://img.kovapi.com/i/2be8cd16d37f3a4b9c0e1f2a3b4c5d6e.png"}
],
"usage": {"images": 1, "resolution": "2K", "model": "gpt-image-2.6-sunburst"}
}Paso 3 · data[0].url es la imagen (PNG). Se guarda 15 días; descárgala en tu propio almacenamiento para conservarla más tiempo.
Ejemplo completo (Python: enviar, esperar y guardar en disco)
import time
import requests
BASE = "https://kovapi.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# 1. enviar el trabajo
job = requests.post(f"{BASE}/images/generations", headers=HEADERS, json={
"model": "gpt-image-2.6-sunburst",
"prompt": "Una pintura al óleo de un puerto al atardecer, pinceladas visibles, paleta cálida",
"size": "16:9",
"resolution": "2K",
}).json()
if "error" in job:
raise SystemExit(job["error"]["message"])
# 2. consultar cada 3 segundos hasta que termine
while job["status"] not in ("succeeded", "failed"):
time.sleep(3)
job = requests.get(f"{BASE}/images/jobs/{job['id']}", headers=HEADERS).json()
# 3. descargar la imagen
if job["status"] == "succeeded":
url = job["data"][0]["url"]
with open("gpt-image-2.6-sunburst.png", "wb") as f:
f.write(requests.get(url).content)
print("saved", url)
else:
print("failed:", job["error"]["code"], job["error"]["message"])Autenticación
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
Crea una clave API en la consola para empezar.
Parámetros de la petición
El cuerpo JSON de POST /v1/images/generations:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| model | string | Sí | El ID del modelo: gpt-image-2.6-sunburst. |
| prompt | string | Sí | Qué dibujar. En imagen a imagen, indica qué cambiar. |
| size | string | No | Proporción, como 16:9 (recomendado), o un tamaño en píxeles, como 1536x1024. Si no lo envías, obtienes un cuadrado 1:1. |
| resolution | string | No | Nivel: 1K (por defecto), 2K o 4K. |
| quality | string | No | Nivel de detalle: low, medium (por defecto) o high, en 1K, 2K y 4K por igual y sin cambiar el precio; auto cuenta como medium. xhigh y max aún no están disponibles: se rechazan al enviar con un 400 y no se cobra nada. |
| image / images | string / array | No | Imágenes de referencia; si envías alguna, el trabajo pasa a ser de imagen a imagen: una en image, varias en images (hasta 8). Cada una puede ser una URL pública de imagen, un data: URI o base64. |
| n | integer | No | Número de imágenes. Mejor no enviarlo: si quieres varias imágenes, envía varios trabajos a la vez. Con n, se retiene de entrada el precio de n imágenes y se cobran las imágenes realmente entregadas. |
| callback_url | string | No | Adónde enviar el resultado cuando termine el trabajo; consulta la sección de webhooks más abajo. |
background puede ser transparent (combínalo con salida PNG o WebP); output_format puede ser png (por defecto), jpeg o webp, y el archivo entregado tiene ese formato. n debe ser 1: para varias imágenes envía varios trabajos a la vez. Otros parámetros (response_format, style y similares) no cambian el precio ni se garantiza que tengan efecto; el resultado llega como url.
Precio
Se cobra por imagen, solo según el nivel: la proporción y que sea texto a imagen o imagen a imagen no cambian nada. El precio del nivel se retiene al enviar y se reembolsa íntegro si el trabajo falla. 1 crédito = $0.005.
| Nivel | Créditos por imagen | USD por imagen |
|---|---|---|
| 1K | 3 | $0.015 |
| 2K | 6 | $0.03 |
| 4K | 10 | $0.05 |
Proporción, resolución y tamaño de salida
Pon la relación de aspecto en size y el nivel en resolution. Recibes la imagen original tal como se genera, sin recortes ni redimensionado, en los tamaños de abajo: ambos lados son múltiplos de 16 y 4K no pasa de 3840 px por lado ni de unos 8,3 megapíxeles.
| Proporción | 1K | 2K | 4K |
|---|---|---|---|
| 1:1 | 1024x1024 | 2048x2048 | 2880x2880 |
| 3:4 | 768x1024 | 1536x2048 | 2480x3312 |
| 2:3 | 672x1024 | 1360x2048 | 2336x3520 |
| 9:16 | 608x1088 | 1152x2048 | 2160x3840 |
| 4:3 | 1024x768 | 2048x1536 | 3312x2480 |
| 3:2 | 1024x672 | 2048x1360 | 3520x2336 |
| 16:9 | 1088x608 | 2048x1152 | 3840x2160 |
- Solo están disponibles las 7 relaciones de la tabla; cualquier otra se rechaza al enviar con un 400 y no se cobra nada. En 1K, 16:9 y 9:16 quedarían por debajo del mínimo de píxeles del modelo, así que salen a 1088×608 y 608×1088.
sizetambién puede ser un tamaño en píxeles (p. ej.1536x1024) en una de las 7 relaciones: ambos lados se redondean hacia abajo a múltiplos de 16, se reducen si superan el límite del nivel y se amplían hasta el mínimo del modelo (unos 655.000 píxeles) si son demasiado pequeños. El nivel lo marcaresolution; sin él decide el lado mayor: hasta 1536 es 1K, hasta 2048 es 2K y más es 4K. Lado mayor permitido: 512–1536 en 1K, 2048–2304 en 2K y 2049–4096 en 4K; lo demás se rechaza al enviar con un 400 y no se cobra nada.
Calidad y resolución nativa
- Sin
qualityla imagen se genera en medium.low,mediumyhighfuncionan en 1K, 2K y 4K, tanto en texto a imagen como en imagen a imagen, y el precio solo depende del nivel de resolución;autocuenta como medium.xhighymaxaún no están disponibles: se rechazan al enviar con un 400 y no se cobra nada. - Si
qualitycontiene1K,2Ko4Ky no envíasresolution, se toma como nivel de resolución (el tamaño y el precio siguen ese nivel). - Los niveles que se dibujan de forma nativa siempre se dibujan de forma nativa: si hay mucha carga, el trabajo espera en la cola, y si aun así no puede dibujarse, falla con reembolso completo; nunca se sustituye por una imagen 1K ampliada.
Imagen a imagen e imágenes de referencia
- Envía
image(una imagen) oimages(varias, hasta 5) y el trabajo será imagen a imagen; indica en el prompt qué cambiar. Más de 5 se rechaza al enviar con un 400 y no se cobra nada.POST /v1/images/editsacepta los mismos parámetros. - Los dos endpoints solo aceptan un cuerpo JSON, no la subida de archivos multipart, así que
images.edit()del SDK de OpenAI no se puede usar tal cual: pasa enlaces o base64 como en el ejemplo de abajo. - Cada referencia puede ser una URL pública de imagen (http o https), un data: URI o base64 simple, de hasta 16MB cada una, en PNG o JPEG; una referencia en otro formato hace que el trabajo falle con reembolso completo.
- La URL tiene que descargar directamente la imagen: no puede ser una página web ni estar detrás de un inicio de sesión o de una protección contra hotlinking. Una referencia que no podemos leer se rechaza al enviar con un 400 que indica cuál es y por qué; no se crea ningún trabajo y no se cobra nada.
- La proporción de salida la marca
size, no la referencia. Para mantener la proporción original, pon esa proporción ensize. - Alojamos las referencias por ti y las guardamos 7 días.
Imagen a imagen con dos referencias
curl https://kovapi.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-image-2.6-sunburst", "prompt": "Mantén a las personas y cambia el fondo por una playa de noche con guirnaldas de luces cálidas", "images": ["https://example.com/people.jpg", "https://example.com/beach.jpg"], "size": "3:4", "resolution": "2K"}'Estado y campos del trabajo
GET /v1/images/jobs/{id} devuelve estos estados; cada campo se describe en Trabajos asíncronos. Consulta cada 2–3 segundos o usa un webhook.
| Estado | Significado |
|---|---|
| queued | En cola. Incluye queue_position (trabajos por delante del tuyo) y eta_seconds (espera estimada). |
| processing | Generándose. |
| succeeded | Terminado. El resultado está en data[0].url y el detalle del cobro en usage. |
| failed | Falló. El motivo está en error; los créditos reservados se devuelven íntegros. |
Cada cuenta ejecuta hasta 50 trabajos a la vez; los demás esperan en orden de envío, y un trabajo que no ha empezado a los 15 minutos falla y se reembolsa íntegro. Los registros de trabajos se guardan 3 días y los enlaces de las imágenes, 15 días.
Cuánto tarda
Normalmente 20–60 segundos desde el envío hasta el resultado; 4K, las ediciones con varias referencias y los momentos de mucha carga tardan más, y algún trabajo puede tardar uno o dos minutos.
Errores y reembolsos
Un error al enviar se devuelve al momento como HTTP 4xx / 5xx: no se crea ningún trabajo y no se cobra nada. Un fallo después de que el trabajo fue aceptado lo informa el endpoint del trabajo, y la retención se reembolsa íntegra. Todos los códigos están en Códigos de error.
Errores al enviar
| HTTP | code | Causa | Qué hacer |
|---|---|---|---|
| 400 | missing_prompt | La petición a /v1/images/generations no lleva prompt. | Añade un prompt. |
| 400 | invalid_request | No se puede leer una imagen de referencia (enlace roto, no es una imagen, supera 16MB...; message indica cuál y por qué), /v1/images/edits no lleva imagen de referencia, el cuerpo no es un objeto JSON o n no es un entero. | Corrige lo que indica message y vuelve a enviar la petición. |
| 400 | model_not_found | El ID del modelo está mal escrito, falta model, o el modelo no se puede usar en este endpoint (por ejemplo, un modelo de chat en el endpoint de imágenes). | Usa un ID de modelo de GET /v1/models o de la referencia de la API. |
| 401 | invalid_api_key | La clave no existe, se eliminó o está desactivada, o la cuenta está desactivada. | Revisa la clave en la página API Keys de la consola. |
| 402 | insufficient_quota | No hay saldo suficiente para retener el importe de esta petición. La pasarela retiene primero el coste máximo posible de la petición, así que una ráfaga de llamadas simultáneas también puede provocarlo. | Si se debe a una ráfaga, espera unos segundos y reintenta; si no, recarga. |
| 429 | rate_limit_exceeded | Se superó el límite de peticiones por minuto configurado en esta clave (contado sobre los últimos 60 segundos). Sin cabecera Retry-After. | Espera unos segundos y reintenta, o sube el límite de la clave en la consola. |
| 503 | model_maintenance | El modelo está en mantenimiento y no acepta peticiones; mientras tanto, ningún otro modelo responde en su lugar. | Reintenta cuando termine el mantenimiento; consulta el estado del servicio. |
| 503 | service_unavailable | Un fallo temporal de nuestro lado, por ejemplo al guardar un archivo de referencia; /v1/responses también responde 503, con Retry-After, cuando no puede atender peticiones por un momento. | Reintenta en breve. |
Trabajos fallidos (status failed)
| code | Cuándo aparece | Qué hacer |
|---|---|---|
| moderation_blocked | Imagen: el sistema de seguridad del proveedor del modelo rechazó el prompt o una imagen de referencia (el código también puede ser content_policy_violation). | Reescribe el prompt o cambia la referencia; si se reenvía sin cambios, normalmente se vuelve a rechazar. |
| upstream_error | Cualquier otro fallo: los reintentos automáticos no bastaron, el trabajo esperó 15 minutos sin empezar, el proveedor lo rechazó sin dar motivo, etc.; message indica cuál. | Volver a enviarlo suele funcionar. |
Webhooks en lugar de consultas
Añade callback_url al enviar y, en cuanto termine el trabajo, con éxito o con error, la pasarela enviará a esa URL exactamente lo mismo que devuelve el endpoint de consulta, firmado y con reintentos si la entrega falla. También puedes configurar una dirección para toda la cuenta en Configuración → Webhook, en la consola. Documentación de webhooks →
curl https://kovapi.com/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-image-2.6-sunburst", "prompt": "Una pintura al óleo de un puerto al atardecer, pinceladas visibles, paleta cálida", "size": "1:1", "callback_url": "https://your-domain.com/webhook"}'