ReWords.AI API

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
FormatosJPEG, PNG, WebP. Se detecta por los bytes del archivo, no por su nombre ni por Content-Type.
Tamaño del archivoHasta 20 MB (20 × 1024 × 1024 bytes; el límite de 28 MB del cuerpo JSON se cuenta igual).
DimensionesLado mayor de hasta 8000 px; lado menor de al menos 32 px.
ColorRGB o escala de grises. Los JPEG CMYK se rechazan con 400 invalid_image.
AnimaciónWebP 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"}]'
upload.mjs — Node.js 18+
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, height y 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.url y results.C.url son archivos JPEG en enlaces públicos: descárgalos con un GET normal, sin clave de API. Trata los enlaces como privados: cualquiera que tenga uno puede abrirlo.
  • Envía una cabecera User-Agent al descargar. La predeterminada de Python urllib se rechaza con 403; requests, curl, los navegadores y fetch de 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 * imageHeight

Ejemplo: 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.

En esta página