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 | |
|---|---|
| Formatos | JPEG, PNG, WebP. Detectado pelos bytes do arquivo, não pelo nome nem pelo Content-Type. |
| Tamanho do arquivo | Até 20 MB (20 × 1024 × 1024 bytes; o limite de 28 MB do corpo JSON é contado do mesmo jeito). |
| Dimensões | Lado maior de até 8000 px; lado menor de pelo menos 32 px. |
| Cor | RGB ou tons de cinza. JPEGs CMYK são rejeitados com 400 invalid_image. |
| Animação | WebP 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"}]'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,heighte 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.urleresults.C.urlsão arquivos JPEG em links públicos: baixe-os com umGETsimples, sem chave de API. Trate os links como privados — qualquer pessoa que tenha um pode abri-lo.- Envie um cabeçalho
User-Agentao baixar. O padrão do Pythonurllibé recusado com403;requests,curl, navegadores efetchdo 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 * imageHeightExemplo: 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.
Fila e limites
Concorrência da API da ReWords.AI, a fila de 30 jobs, limites de requisições para envios e leituras, polling, limites de imagem, Retry-After e novas tentativas idempotentes.
Webhooks
Receba um webhook assinado da ReWords.AI quando uma edição termina e verifique o HMAC de X-Rewords-Signature em Node.js ou Python.