KovAPIKovAPI
POST https://kovapi.com/v1/images/generations

Generación de imágenes con Seedream 5.0 Pro, el modelo de imagen insignia de la serie Seedream 5.0 de ByteDance: un mismo modelo para texto a imagen, edición y fusión de varias imágenes, como trabajo asíncrono. Al enviar recibes al momento un id de trabajo (HTTP 202) y luego consultas el resultado o dejas que un webhook te lo envíe. 1K y 2K en 8 proporciones, se entrega el JPEG original; se cobra por imagen y no se cobra 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
curl https://kovapi.com/v1/images/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "seedream-5.0-pro", "prompt": "La puerta de un café en un callejón al atardecer, una pizarra que dice «Hoy: latte de osmanto 4 €», un gato atigrado al lado, fotorrealista", "size": "16:9", "resolution": "2K"}'

Respuesta (HTTP 202)

JSON
{
  "id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
  "object": "image.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "seedream-5.0-pro"
}

Paso 2 · Consulta cada 2–3 segundos hasta que status sea succeeded o failed

curl
curl https://kovapi.com/v1/images/jobs/img_7f3c9a1e2b4d6f8a0c1e3b5d \
  -H "Authorization: Bearer YOUR_API_KEY"

Respuesta cuando sale bien

JSON
{
  "id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
  "object": "image.generation.job",
  "status": "succeeded",
  "created": 1791281400,
  "model": "seedream-5.0-pro",
  "data": [
    {"url": "https://img.kovapi.com/i/2be8cd16d37f3a4b9c0e1f2a3b4c5d6e.jpg"}
  ],
  "usage": {"images": 1, "resolution": "2K", "model": "seedream-5.0-pro"}
}

Paso 3 · data[0].url es la imagen (el JPEG original). Se guarda 7 días; descárgala en tu propio almacenamiento para conservarla más tiempo.

Ejemplo completo (Python: enviar, esperar y guardar en disco)

Python
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": "seedream-5.0-pro",
    "prompt": "La puerta de un café en un callejón al atardecer, una pizarra que dice «Hoy: latte de osmanto 4 €», un gato atigrado al lado, fotorrealista",
    "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("seedream-5.0-pro.jpg", "wb") as f:
        f.write(requests.get(url).content)
    print("saved", url)
else:
    print("failed:", job["error"]["code"], job["error"]["message"])

Autenticación

Header
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ámetroTipoObligatorioDescripción
modelstringSíEl ID del modelo: seedream-5.0-pro.
promptstringSíQué dibujar. En imagen a imagen, indica qué cambiar.
sizestringNoProporción: 1:1 (por defecto), 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9. También vale un tamaño en píxeles (p. ej. 2560x1440), que se asigna por su proporción a una de estas 8; cualquier otra proporción devuelve 400 al enviar y no se cobra nada. Recibes el original en esa proporción, como mínimo del tamaño indicado en la tabla de tamaños.
resolutionstringNoNivel: 1K (por defecto) o 2K. No hay 4K.
image / imagesstring / arrayNoImágenes de referencia; si envías alguna, es una edición o una fusión: una en image, varias en images (hasta 8). Cada una puede ser una URL pública, un data: URI o base64. Con varias, di en el prompt para qué sirve cada una, en orden, p. ej. «la persona de la imagen 1 sentada en la cafetería de la imagen 2».
nintegerNoSiempre 1: una imagen por solicitud. Para varias, envía varios trabajos a la vez; cualquier otro valor devuelve 400 al enviar y no se cobra nada.
callback_urlstringNoAdónde enviar el resultado cuando termine el trabajo; consulta la sección de webhooks más abajo.

Los demás parámetros de OpenAI (quality, background, output_format, style y similares) no se admiten: no tienen efecto ni cambian el precio. El resultado es siempre el JPEG original, devuelto como url; con response_format: "b64_json" el resultado incluye además una copia en base64.

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.

NivelCréditos por imagenUSD por imagen
1K5$0.025
2K9$0.045

Proporción, resolución y tamaño de salida

Pon la proporción en size y el nivel en resolution. Recibes el original que el modelo dibuja en esa proporción, sin recortes ni redimensionado; su tamaño es como mínimo el de la tabla y algunas proporciones salen más grandes (1K 16:9 es ahora 1536×864).

Proporción1K2K
1:11024x10242048x2048
16:91280x7202560x1440
9:16720x12801440x2560
4:31104x8482352x1776
3:4848x11041776x2352
3:21168x8002496x1680
2:3800x11681680x2496
21:91472x6402560x1104
  • Solo se admiten las 8 proporciones de la tabla; cualquier otra (5:4, 2:1...) devuelve 400 unsupported_size al enviar y no se cobra nada. Algunos tamaños nativos difieren un 1–3% de la proporción nominal (1K 4:3 es 1104×848): es el tamaño que dibuja el propio modelo. Antes de entregar se comprueban la proporción y el modelo que figura en la credencial C2PA, y que el tamaño sea como mínimo el de la tabla; si algo no coincide, la imagen no se entrega, el trabajo falla y no se cobra nada.
  • size también puede ser un tamaño en píxeles (p. ej. 2560x1440): solo fija la proporción (a menos de un 1,5% de una de las 8) y recibes igualmente el original en esa proporción (como mínimo del tamaño de la tabla). El nivel lo da resolution; sin él decide el lado más largo: hasta 1536 es 1K, de 1537 a 2600 es 2K.
  • Este modelo solo tiene 1K y 2K: pedir 4K (resolution: "4K", o un size con el lado largo mayor de 2600) se rechaza al momento con 400 unsupported_resolution y no se cobra nada. Para 2K, envía resolution: "2K".

Imagen a imagen e imágenes de referencia

  • Envía image (una imagen) o images (varias, hasta 8; las que pasen de 8 no se usan) y el trabajo será de imagen a imagen; indica en el prompt qué cambiar. POST /v1/images/edits acepta 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 puro, de hasta 16MB cada una, en un formato habitual como JPEG, PNG o WebP.
  • 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.
  • En ediciones y fusiones la proporción de salida sigue a size (1:1 si falta), no a la imagen de referencia; para mantener la proporción del original, pon esa proporción en size. Recibes el original del modelo, sin recortes ni redimensionado.
  • Alojamos las referencias por ti y las guardamos 7 días.

Imagen a imagen con dos referencias

curl
curl https://kovapi.com/v1/images/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "seedream-5.0-pro", "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.

EstadoSignificado
queuedEn cola. Incluye queue_position (trabajos por delante del tuyo) y eta_seconds (espera estimada).
processingGenerándose.
succeededTerminado. El resultado está en data[0].url y el detalle del cobro en usage.
failedFalló. 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, 7 días.

Cuánto tarda

Normalmente 40–90 segundos desde el envío hasta el resultado; 2K y varias referencias tardan algo más y a veces pasan de 2 minutos.

Llamadas reales de los últimos 7 días: mediana 88 s; el 90% termina en 2.5 min o menos.

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

HTTPcodeCausaQué hacer
400missing_promptLa petición a /v1/images/generations no lleva prompt.Añade un prompt.
400invalid_requestNo 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.
400unsupported_resolutionEl modelo no ofrece el nivel de resolución elegido (por ejemplo, la generación de imágenes de Grok no tiene 4K).Elige otro nivel; la documentación de cada modelo indica sus niveles.
400model_not_foundEl 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.
401invalid_api_keyLa 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.
402insufficient_quotaNo 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.
429rate_limit_exceededSe 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.
503model_maintenanceEl 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.
503service_unavailableUn 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)

codeCuándo apareceQué hacer
moderation_blockedImagen: 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_errorCualquier 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 · callback_url
curl https://kovapi.com/v1/images/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "seedream-5.0-pro", "prompt": "La puerta de un café en un callejón al atardecer, una pizarra que dice «Hoy: latte de osmanto 4 €», un gato atigrado al lado, fotorrealista", "size": "1:1", "callback_url": "https://your-domain.com/webhook"}'