ReWords.AI API

Imagens

Como enviar imagens para a API da ReWords.AI — URL, base64, data URL ou upload multipart —, os limites de tamanho e formato, o tratamento de EXIF e transparência, os arquivos de resultado e como as caixas viram pixels.

O que você pode enviar

Limite
FormatosJPEG, PNG, WebP. Detectado pelos bytes do arquivo, não pelo nome nem pelo Content-Type.
Tamanho do arquivoAté 20 MB (20 × 1024 × 1024 bytes; o limite de 28 MB do corpo JSON é contado do mesmo jeito).
DimensõesLado maior de até 8000 px; lado menor de pelo menos 32 px.
CorRGB ou tons de cinza. JPEGs CMYK são rejeitados com 400 invalid_image.
AnimaçãoWebP animado: só o primeiro quadro é usado.

Um arquivo que quebra essas regras é rejeitado com 400 invalid_image antes de qualquer cobrança.

Quatro formas de enviar uma imagem

Use exatamente uma por requisição. Não enviar nenhuma, ou enviar mais de uma, retorna 400 invalid_request.

1. image_url

Um link http(s) público. Nós o baixamos uma vez, enquanto atendemos sua requisição, então um link assinado só precisa continuar válido até respondermos. Seguimos até 3 redirecionamentos e desistimos após 15 segundos; se o arquivo não puder ser baixado, a requisição retorna 400 invalid_image. Links que exigem cookies ou login não funcionam, nem endereços de uma rede privada, como localhost, 10.x.x.x ou 192.168.x.x.

{ "image_url": "https://example.com/banner.png" }

2. image_base64

Os bytes do arquivo em base64 padrão (A–Z a–z 0–9 + /, preenchimento opcional), ou o mesmo como data URL com qualquer tipo de mídia, como data:image/png;base64, ou o data:application/octet-stream;base64, que o FileReader de um navegador pode gerar — o formato é detectado pelos bytes. Espaços e quebras de linha são ignorados, então as linhas de 76 caracteres do base64 no Linux ou do base64.encodebytes do Python funcionam. Base64 deixa o arquivo cerca de um terço maior, então o corpo JSON inteiro pode ter até 28 MB; um corpo maior retorna 400 invalid_image. Texto que não é base64 válido retorna 400 invalid_request; base64 válido de um arquivo que não é uma imagem suportada retorna 400 invalid_image.

{ "image_base64": "iVBORw0KGgoAAAANSUhEUgAA..." }
{ "image_base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." }

3. Upload de arquivo multipart

Envie multipart/form-data com o arquivo no campo image. Para POST /edits, coloque o array replacements em um campo do formulário como string JSON; match, language e callback_url são campos de formulário comuns.

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 retorna um image_id. Passe-o para POST /edits em até 24 horas para reutilizar a imagem enviada em vez de mandá-la de novo. Ele só funciona na conta que o criou; um id desconhecido, expirado ou de outra conta retorna 400 invalid_request. Cada chamada de OCR retorna um novo image_id, mesmo para uma imagem que você já enviou — inclusive quando você envia um image_id para POST /ocr, o que lhe dá mais 24 horas.

Como lemos sua imagem

  • A orientação EXIF é aplicada primeiro. Uma foto de celular guardada de lado fica em pé, e todo width, height e caixa se refere à imagem em pé — o que você vê num visualizador de imagens.
  • Áreas transparentes viram branco. A transparência de PNG e WebP é achatada sobre um fundo branco, porque os resultados são JPEG.

Resultados

  • results.A.url, results.B.url e results.C.url são arquivos JPEG em links públicos: baixe-os com um GET simples, sem chave de API. Trate os links como privados — qualquer pessoa que tenha um pode abri-lo.
  • Envie um cabeçalho User-Agent ao baixar. O padrão do Python urllib é recusado com 403; requests, curl, navegadores e fetch do Node funcionam como estão.
  • Os links ficam guardados por pelo menos 7 dias. Baixe o que precisar manter.
  • Os arquivos de resultado são guardados em pé, sem orientação EXIF, então o tamanho no arquivo é o tamanho que você vê.
  • B é a sua imagem original com o novo texto integrado. A é o redesenho da imagem inteira feito pela IA e mantém a proporção da sua imagem. Leia o tamanho em pixels do arquivo em vez de supor que ele é igual ao do seu envio.
  • C (4K) tem até cerca de 8,3 megapixels (o equivalente a 3840 × 2160), lado maior de no máximo 3840 px, mesma proporção. Ele é pulado para imagens mais largas ou mais altas que 3:1.

Caixas e pixels

As caixas são [x, y, width, height], números inteiros numa escala de 0 a 1000 da imagem em pé, medidos a partir do canto superior esquerdo. width e height são pelo menos 1; x + width e y + height nunca passam de 1000.

pixel left   = x      / 1000 * imageWidth
pixel top    = y      / 1000 * imageHeight
pixel width  = width  / 1000 * imageWidth
pixel height = height / 1000 * imageHeight

Exemplo: a caixa [120, 80, 300, 60] numa imagem de 1080 × 1350 é esquerda 130, topo 108, 324 × 81 px (arredondado). Para enviar sua própria caixa, converta no sentido contrário e arredonde para números inteiros.

Nesta página