Imágenes
Cómo enviar imágenes a la API de ReWords.AI —URL, base64, data URL o subida multipart—, los límites de tamaño y formato, el tratamiento de EXIF y transparencia, los archivos de resultado y cómo pasar las cajas a píxeles.
Qué puedes enviar
| Límite | |
|---|---|
| Formatos | JPEG, PNG, WebP. Se detecta por los bytes del archivo, no por su nombre ni por Content-Type. |
| Tamaño del archivo | Hasta 20 MB (20 × 1024 × 1024 bytes; el límite de 28 MB del cuerpo JSON se cuenta igual). |
| Dimensiones | Lado mayor de hasta 8000 px; lado menor de al menos 32 px. |
| Color | RGB o escala de grises. Los JPEG CMYK se rechazan con 400 invalid_image. |
| Animación | WebP animado: solo se usa el primer fotograma. |
Un archivo que incumple estas reglas se rechaza con 400 invalid_image antes de cobrar nada.
Cuatro formas de enviar una imagen
Usa exactamente una por solicitud. No enviar ninguna, o enviar más de una, devuelve 400 invalid_request.
1. image_url
Un enlace http(s) público. Lo descargamos una vez, mientras atendemos tu solicitud, así que un enlace firmado solo tiene
que ser válido hasta que respondamos. Seguimos hasta 3 redirecciones y abandonamos tras 15 segundos; si el archivo no se puede
descargar, la solicitud devuelve 400 invalid_image. No funcionan los enlaces que requieren cookies o inicio de sesión, ni las
direcciones de una red privada, como localhost, 10.x.x.x o 192.168.x.x.
{ "image_url": "https://example.com/banner.png" }2. image_base64
Los bytes del archivo en base64 estándar (A–Z a–z 0–9 + /, relleno opcional), o lo mismo como data URL con cualquier tipo
de medio, como data:image/png;base64, o el data:application/octet-stream;base64, que puede generar el FileReader de un
navegador: el formato se detecta por los bytes. Se ignoran los espacios y saltos de línea, así que funcionan las líneas de 76
caracteres de base64 en Linux o de base64.encodebytes en Python. Base64 hace el archivo un tercio más grande, así que el
cuerpo JSON completo puede ser de hasta 28 MB; un cuerpo mayor devuelve 400 invalid_image. Un texto que no es base64 válido
devuelve 400 invalid_request; un base64 válido de un archivo que no es una imagen compatible devuelve 400 invalid_image.
{ "image_base64": "iVBORw0KGgoAAAANSUhEUgAA..." }
{ "image_base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." }3. Subida de archivo multipart
Envía multipart/form-data con el archivo en el campo image. Para POST /edits, pon el array replacements en un campo
del formulario como cadena JSON; match, language y callback_url son campos de formulario normales.
curl https://api.rewords.ai/v1/edits \
-H "Authorization: Bearer $REWORDS_API_KEY" \
-F [email protected] \
-F 'replacements=[{"from":"SALE","to":"HOT DEAL"}]'import crypto from 'node:crypto';
import fs from 'node:fs';
const form = new FormData();
form.append('image', new Blob([await fs.promises.readFile('banner.png')]), 'banner.png');
form.append('replacements', JSON.stringify([{ from: 'SALE', to: 'HOT DEAL' }]));
const res = await fetch('https://api.rewords.ai/v1/edits', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.REWORDS_API_KEY}`, // let fetch set the multipart Content-Type
'Idempotency-Key': crypto.randomUUID(), // a new key per job; reuse it only to resend this same job
},
body: form,
});
const job = await res.json();
if (!res.ok) throw new Error(`${res.status} ${job.error.code}: ${job.error.message}`);
console.log(job.id, job.status);4. image_id
POST /ocr devuelve un image_id. Pásalo a POST /edits en un plazo de 24 horas para reutilizar la imagen subida en lugar
de enviarla de nuevo. Solo funciona en la cuenta que lo creó; un id desconocido, caducado o de otra cuenta devuelve
400 invalid_request. Cada llamada de OCR devuelve un image_id nuevo, incluso para una imagen que ya enviaste, también cuando
envías un image_id a POST /ocr, lo que te da 24 horas más.
Cómo leemos tu imagen
- Primero se aplica la orientación EXIF. Una foto de móvil guardada de lado se pone derecha, y todos los
width,heighty cajas se refieren a la imagen derecha, la que ves en un visor de imágenes. - Las zonas transparentes pasan a blanco. La transparencia de PNG y WebP se aplana sobre un fondo blanco, porque los resultados son JPEG.
Resultados
results.A.url,results.B.urlyresults.C.urlson archivos JPEG en enlaces públicos: descárgalos con unGETnormal, sin clave de API. Trata los enlaces como privados: cualquiera que tenga uno puede abrirlo.- Envía una cabecera
User-Agental descargar. La predeterminada de Pythonurllibse rechaza con403;requests,curl, los navegadores yfetchde Node funcionan tal cual. - Los enlaces se conservan al menos 7 días. Descarga lo que necesites guardar.
- Los archivos de resultado se guardan derechos y sin orientación EXIF, así que el tamaño del archivo es el que ves.
- B es tu imagen original con el texto nuevo integrado. A es el redibujo de toda la imagen hecho por la IA y mantiene la proporción de tu imagen. Lee el tamaño en píxeles del archivo en lugar de suponer que coincide con tu subida.
- C (4K) tiene hasta unos 8,3 megapíxeles (lo equivalente a 3840 × 2160), lado mayor de como máximo 3840 px, misma proporción. Se omite para imágenes más anchas o más altas que 3:1.
Cajas y píxeles
Las cajas son [x, y, width, height], números enteros en una escala de 0 a 1000 de la imagen derecha, medidos desde la esquina
superior izquierda. width y height valen al menos 1; x + width y y + height nunca superan 1000.
pixel left = x / 1000 * imageWidth
pixel top = y / 1000 * imageHeight
pixel width = width / 1000 * imageWidth
pixel height = height / 1000 * imageHeightEjemplo: la caja [120, 80, 300, 60] en una imagen de 1080 × 1350 es izquierda 130, arriba 108, 324 × 81 px (redondeado).
Para enviar tu propia caja, convierte en sentido contrario y redondea a números enteros.
Cola y límites
Concurrencia de la API de ReWords.AI, la cola de 30 trabajos, límites de frecuencia para envíos y lecturas, sondeo, límites de imagen, Retry-After y reintentos idempotentes.
Webhooks
Recibe un webhook firmado de ReWords.AI cuando termina una edición y verifica el HMAC de X-Rewords-Signature en Node.js o Python.