07Fundamentos de la API
Imágenes de referencia
Muestra tu imagen al modelo y dile qué hacer con ella: conservar el producto, cambiar el fondo, continuar el estilo. La imagen de referencia se puede subir como archivo o pasar con un enlace.
Este modelo no genera todas las resoluciones ni todas las relaciones de aspecto: los ejemplos usan las que tiene disponibles.
Cómo pasar una imagen de referencia
Las imágenes de referencia son opcionales: sin ellas, el modelo dibuja solo a partir del texto. Si las necesitas, elige una familia de campos: un archivo que hayas subido de antemano o la dirección de una imagen.
| Forma | Campo de la solicitud | Cuándo elegirla |
|---|---|---|
| Sin imágenes de referencia | no lo envíes | Generamos desde cero a partir de la descripción |
| Archivo subido | image_file_ids (hasta 14) o image_file_id | El archivo está en tu disco; necesitas la misma imagen de referencia en varias solicitudes |
| Dirección de la imagen | image_urls (hasta 14) | La imagen ya está disponible en un enlace público |
{
"model": "nano-banana-pro",
"prompt": "Conserva la lámpara y colócala en un alféizar claro",
"resolution": "2K",
"image_file_ids": ["ea7b3c89972d3657"]
}{
"model": "nano-banana-pro",
"prompt": "Conserva la lámpara y colócala en un alféizar claro",
"resolution": "2K",
"image_urls": ["https:// cdn.example.com/ products/ lamp.png"]
}No mezcles las formas. Si una misma solicitud lleva image_urls y file_id, la API responde 400 ERR_INVALID_REQUEST antes del cargo. Los campos image, image_url, image_input y input_urls no se aceptan.
Carga de un archivo
/uploadsEnvía el archivo como multipart/form-data: el campo file es el archivo en sí, y el campo kind lleva el valor image. La respuesta trae file_id: ese es el valor que debes poner en la solicitud de generación.
curl --fail-with-body --connect-timeout 10 --max-time 120 \ -X POST https://api.rendergrid.io/ api/ public/ v1/ uploads \ -H "Authorization: Bearer $RENDERGRID_API_KEY" \ -F "file=@lamp.png;type=image/png" \ -F "kind=image"
import os import requests key = os.environ["RENDERGRID_API_KEY"] with open("lamp.png", "rb") as image: response = requests.post( "https://api.rendergrid.io/ api/ public/ v1/ uploads", headers={"Authorization": f"Bearer {key}"}, files={"file": ("lamp.png", image, "image/png")}, data={"kind": "image"}, timeout=(10, 120), ) response.raise_for_status() upload = response.json() print(upload["file_id"], upload["expires_at"])
// Node.js 22+, archivo .mjs import { readFile } from "node:fs/promises"; const bytes = await readFile("lamp.png"); const file = new Blob([bytes], { type: "image/png" }); const form = new FormData(); form.append("file", file, "lamp.png"); form.append("kind", "image"); const API = "https://api.rendergrid.io/ api/ public/ v1"; const key = process.env.RENDERGRID_API_KEY; const response = await fetch(`${API}/uploads`, { method: "POST", headers: { Authorization: `Bearer ${key}` }, body: form, signal: AbortSignal.timeout(120_000), }); if (!response.ok) { const body = await response.text(); throw new Error(`HTTP ${response.status}: ${body}`); } const upload = await response.json(); console.log(upload.file_id, upload.expires_at);
{
"file_id": "ea7b3c89972d3657",
"url": "https:// cdn.rendergrid.io/ user_uploads/ example.png",
"expires_at": "2026-10-14T12:00:00+00:00"
}- file_id
- El identificador del archivo. Pertenece a la cuenta que lo subió.
- url
- La dirección de la copia del archivo. No es un almacenamiento permanente: después de
expires_atno se puede usar. - expires_at
- Cuándo
file_iddeja de funcionar: 24 horas después de la carga.
| Qué | Regla |
|---|---|
| Formatos | PNG, JPEG y WebP. No se aceptan GIF ni BMP |
| Tamaño | hasta 25 MiB (26 214 400 bytes) por archivo |
| Plazo | file_id vale 24 horas. Usarlo en una solicitud no prolonga el plazo |
| Subir otra vez | El mismo archivo subido de nuevo recibe un file_id nuevo por otras 24 horas |
| Dinero | Por la carga no se hace ningún cargo en el saldo |
| Límite diario | Una cuenta que se registró por sí sola y todavía no ha recargado el saldo usa como máximo 100 imágenes de referencia al día en UTC: los archivos subidos y las direcciones de image_urls cuentan juntos. Después de la primera recarga no hay límite |
Comprueba el archivo antes de enviarlo
Así responderá la API a los archivos más habituales. Todos los rechazos llegan al instante, antes de la generación.
Dirección en lugar de archivo
Si la imagen ya está en internet, no la subas: pasa el enlace en image_urls. La imagen la descarga nuestro servidor, así que el enlace debe abrirse desde fuera sin iniciar sesión.
- Una dirección pública
http://ohttps://en el puerto 80 o 443. No sirven las direcciones de redes internas ni los enlaces con usuario y contraseña incluidos. - No se siguen las redirecciones: indica la dirección final de la imagen.
- La respuesta debe ser una imagen PNG, JPEG o WebP de no más de 25 MiB.
- La fuente debe responder rápido: el tiempo de descarga está limitado. Si la fuente es lenta o está protegida con contraseña, descarga el archivo por tu parte y súbelo con
POST /uploads.
Cómo preparar las imágenes de referencia
- Describe en
promptqué conservar y qué cambiar. El modelo ve la imagen de referencia, pero no sabe qué quieres hacer con ella. - En una solicitud caben hasta 14 imágenes de referencia.
- Una imagen de referencia de más de 7 MiB o de más de 4 096 píxeles en el lado largo puede reducirse o comprimirse antes de trabajar con ella. En las imágenes grandes con fondo transparente, el fondo puede volverse blanco.
- Guarda los originales por tu parte:
file_idvale 24 horas desde la carga, y el archivo en sí se elimina 48 horas después de la última carga. - Las máscaras (inpainting) no se admiten. Envía la imagen original como imagen de referencia y describe la edición con palabras.
Qué puede salir mal
Estos rechazos llegan antes del cargo: el saldo no cambia.
| Qué pasó | Respuesta de la API | Qué hacer |
|---|---|---|
| El archivo pesa más de 25 MiB | 400 ERR_INVALID_REQUEST, «File exceeds the maximum allowed size», details.max_bytes | Comprime el archivo o reduce la imagen |
| GIF, BMP u otro formato | 400 ERR_INVALID_REQUEST, «Unsupported image format. Supported formats: PNG, JPEG, WebP.» | Guarda la imagen como PNG, JPEG o WebP |
| El archivo está vacío o no es una imagen | 400 ERR_INVALID_REQUEST, «Uploaded file is empty» o «File content does not match the declared media kind» | Comprueba el archivo: la extensión .png no lo convierte en una imagen |
file_id caducado o no disponible | 400 ERR_INVALID_REQUEST, details.reason: reference_unavailable, details.input_index, details.retryable: false | Sube el archivo de nuevo y pon el file_id nuevo |
| No se pudo descargar el enlace | 422 ERR_INPUT_FETCH_FAILED, details.retryable, details.input_index | Repite solo si retryable: true. Si no, corrige el enlace o sube tú el archivo |
| Más de 14 imágenes de referencia o dos formas a la vez | 400 ERR_INVALID_REQUEST, details.errors | Deja hasta 14 imágenes de referencia y una sola familia de campos |
| La solicitud lleva una máscara | 400 ERR_INVALID_REQUEST, details.fields: ["mask_file_id"] | Quita la máscara, envía la imagen original como imagen de referencia y describe la edición con palabras |
| Se agotó el límite diario de cargas | 429 ERR_RATE_LIMIT, «Daily upload limit reached. Add funds to your account to lift it.», details.limit, details.window = "1d", details.retry_after y el encabezado Retry-After | Recarga el saldo (el límite se levanta) o espera al día siguiente en UTC |
Si la imagen de referencia deja de estar disponible ya después de aceptar la solicitud, la tarea termina con el estado failed y failure.code: reference_unavailable o reference_fetch_failed. Más información en «Códigos de error».
Una solicitud fallida es gratis: el importe vuelve de inmediato al saldo.
Preguntas frecuentes
¿Cuántas imágenes de referencia se pueden enviar?
image_file_ids y en image_urls, de 1 a 14 valores.¿Se puede usar el mismo file_id en varias solicitudes?
file_id nuevo.¿Se aceptan GIF?
image_urls.¿Por qué la carga de una imagen de referencia responde 429?
image_urls. Recarga el saldo y el límite desaparece; si no, espera al día siguiente. Más información en «Límites».