API de processamento do lado do servidor do FormRead
Processamento de Formulários no Lado do Servidor
A API do lado do servidor do FormRead permite enviar uma imagem de formulário escaneado e receber resultados estruturados (OMR, OCR, BCR) diretamente como JSON. Sem navegador, sem iframe - apenas uma simples solicitação HTTP do seu backend para o nosso.
- Envie uma imagem e receba os resultados como JSON em uma única solicitação
- Suporta OMR (detecção de bolhas), OCR (extração de texto) e BCR (leitura de código de barras/QR)
- A configuração do formulário é carregada automaticamente a partir do formulário que você configurou no painel
Quando Usar Esta API
Use a API do lado do servidor quando precisar de processamento automatizado servidor-a-servidor sem qualquer interface de usuário - por exemplo, processando lotes de formulários escaneados de uma pasta, integrando com seu pipeline de backend existente ou construindo sistemas de correção automatizados.
Se você precisa de uma interface visual onde os usuários possam configurar formulários, revisar resultados e fazer QA - use a API de Integração com Iframe em vez disso.
Autenticação
Para usos corporativos, a API pode ser usada gerando um token Bearer Auth.
Faça login no FormRead painel e acesse a opção API Token:
Crie os tokens de API para permitir que serviços de terceiros se autentiquem com nosso aplicativo em seu nome:
Processar uma Imagem de Formulário
Envie uma imagem de formulário escaneado para ser processada. O formulário já deve estar configurado com áreas de leitura (OMR, OCR, BCR) via painel ou iframe. A API usa a configuração de formulário salva para processar a imagem.
Cabeçalhos
| Nome | Valor |
|---|---|
Authorization |
Bearer YOUR_API_TOKEN |
Accept |
application/json |
Content-Type |
application/json or multipart/form-data |
Com upload de arquivo:
curl --location 'https://formread.org/api/forms/123/process' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--form 'image=@"/path/to/scanned-form.jpg"'
Com URL da imagem:
curl --location 'https://formread.org/api/forms/123/process' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"image_url": "https://example.com/scanned-form.jpg"}'
Resposta
{
"success": true,
"results": {
"OMR-0-0": "A",
"OMR-0-1": "C",
"OMR-0-2": "B,D",
"OCR-1": "John Smith",
"BCR-2": "1234567890"
},
"omr_details": {
"OMR-0": {
"questions": [
[
{"left": 0.12, "top": 0.22, "width": 0.02, "height": 0.02, "blackPixelsRatio": 0.72},
{"left": 0.15, "top": 0.22, "width": 0.02, "height": 0.02, "blackPixelsRatio": 0.15}
]
]
}
},
"anchor_error": false,
"processing_time_ms": 450
}
Campos da Resposta
| Campo | Tipo | Descrição |
|---|---|---|
success |
boolean | Se o processamento foi concluído com sucesso |
results |
object | Pares chave-valor dos resultados das áreas. As chaves são nomes de áreas (ex.: OMR-0-0, OCR-1, BCR-2) |
omr_details |
object | Dados detalhados de nível de bolha para áreas OMR, incluindo posições e taxas de preenchimento |
anchor_error |
boolean | Verdadeiro se a folha do formulário não pôde ser alinhada (ex.: cantos não detectados) |
processing_time_ms |
integer | Tempo de processamento em milissegundos |
Opções de Entrada de Imagem
Você pode fornecer a imagem de três maneiras. Use exatamente uma:
| Parâmetro | Tipo | Descrição |
|---|---|---|
image |
file | Upload de arquivo (multipart/form-data) |
image_url |
string | URL pública da imagem |
image_base64 |
string | Dados de imagem codificados em Base64 |
Nota
A configuração do formulário (áreas de leitura, limites, âncoras) é carregada automaticamente a partir do formulário que você configurou no painel do FormRead. Você não precisa enviar nenhuma configuração na solicitação.
Processamento em lote
Para processar várias imagens do mesmo formulário em uma única solicitação, passe uma lista de URLs separadas por vírgulas no campo image_url. Os resultados são retornados como uma matriz na mesma ordem.
Solicitação
curl --location 'https://formread.org/api/forms/123/process' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"image_url": "https://example.com/a.jpg,https://example.com/b.jpg,https://example.com/c.jpg"}'
Resposta
{
"results": [
{
"id": "0",
"image_url": "https://example.com/a.jpg",
"success": true,
"results": { "OMR-0-0": "A", "OCR-1": "John Smith" },
"anchor_error": false,
"processing_time_ms": 430
},
{
"id": "1",
"image_url": "https://example.com/b.jpg",
"success": true,
"results": { "OMR-0-0": "B", "OCR-1": "Jane Doe" }
},
{
"id": "2",
"image_url": "https://example.com/c.jpg",
"success": false,
"error": "Failed to fetch image from URL: 404"
}
],
"total": 3
}
Parâmetros do lote
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
image_url |
string | — | Uma ou mais URLs de imagem públicas. Separadas por vírgulas para o modo lote. |
details |
boolean | false | Incluir omr_details (posições de cada bolha e taxas de preenchimento) em cada resultado do lote. Omitido por padrão para manter as respostas pequenas. |
Comportamento do lote
- O modo lote está disponível apenas com
image_url. Uploads de arquivos eimage_base64são somente para imagem única. - Uma URL com falha não falha todo o lote — esse item recebe
"success": falsee um campoerror; o restante continua. - Os resultados preservam a ordem enviada via
id(indexado a partir de 0). omr_detailsé sempre retornado no modo de imagem única; no modo lote, requer"details": true.
Lote com omr_details
curl --location 'https://formread.org/api/forms/123/process' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"image_url": "https://example.com/a.jpg,https://example.com/b.jpg",
"details": true
}'
Limites
| Limite | Valor | Comportamento |
|---|---|---|
| Solicitações por minuto | 60 |
Por token de API. Exceder retorna HTTP 429. |
| Tempo limite por solicitação | 60s |
Solicitações que excedem 60 segundos são encerradas com um erro. |
Uma resposta 429 tem esta aparência:
{
"message": "Too Many Attempts."
}
Uma solicitação em lote conta como uma chamada, independentemente de quantas URLs contém.
Dimensionando lotes
- Por lote: meça
processing_time_msem uma resposta de amostra de imagem única e monte um lote que termine confortavelmente em menos de 60 segundos. - Entre lotes: distribua as solicitações para permanecer abaixo de 60 por minuto.
- Tamanho da imagem: reduza o tamanho no lado do cliente para as menores dimensões que ainda produzam resultados corretos. Este é o maior fator no tempo por imagem.
Tipos de Área Suportados
| Tipo | Descrição | Formato do Resultado |
|---|---|---|
| OMR | Reconhecimento Óptico de Marcas - detecta bolhas preenchidas em folhas de respostas | "A", "B,C" |
| OCR | Reconhecimento Óptico de Caracteres - extrai texto impresso ou manuscrito | "John Smith" |
| BCR | Reconhecimento de Código de Barras/QR - lê códigos de barras e códigos QR | "1234567890" |
Exemplos de Código
Aqui estão exemplos completos em Python e JavaScript para processar uma imagem de formulário:
Python
import requests
API_URL = "https://formread.org/api/forms/{form_id}/process"
TOKEN = "YOUR_API_TOKEN"
with open("scanned-form.jpg", "rb") as f:
response = requests.post(
API_URL.format(form_id=123),
headers={
"Accept": "application/json",
"Authorization": f"Bearer {TOKEN}",
},
files={"image": f},
)
data = response.json()
print(data["results"])
# {"OMR-0-0": "A", "OMR-0-1": "C", "OCR-1": "John Smith"}
Node.js
const FormData = require('form-data');
const fs = require('fs');
const axios = require('axios');
const form = new FormData();
form.append('image', fs.createReadStream('scanned-form.jpg'));
const response = await axios.post(
'https://formread.org/api/forms/123/process',
form,
{
headers: {
...form.getHeaders(),
'Accept': 'application/json',
'Authorization': 'Bearer YOUR_API_TOKEN',
},
}
);
console.log(response.data.results);
// { 'OMR-0-0': 'A', 'OMR-0-1': 'C', 'OCR-1': 'John Smith' }
Perguntas frequentes
O que faz a API de processamento do lado do servidor?
Você envia uma imagem de formulário digitalizada com um único HTTP POST e recebe resultados estruturados OMR (bolhas), OCR (texto) e BCR (códigos de barras/QR) em JSON - sem navegador nem iframe.
Como autentico as requisições?
Envie seu token de acesso pessoal como token Bearer no header Authorization: Authorization: Bearer SEU_TOKEN_API. Gere o token na seção de tokens de API do seu painel do FormRead.
Posso processar várias imagens numa mesma requisição?
Sim. Passe uma lista de URLs públicas separadas por vírgula no campo image_url. Os resultados voltam num array respeitando a ordem de envio, e uma URL que falha só afeta seu próprio item - as demais continuam.
Quais são os limites de taxa e tamanho?
Até 60 requisições por minuto por token de API, com um timeout de 60 segundos por requisição. Uma requisição em lote conta como uma única chamada, independentemente de quantas URLs contenha.
Preciso enviar a configuração do formulário em toda requisição?
Não. A configuração do formulário - áreas de leitura, limiares e âncoras - é carregada automaticamente a partir do formulário configurado no painel do FormRead. Sua requisição só precisa da imagem e do id do formulário na URL.