API de processamento do lado do servidor do FormRead

Oscar Munoz Oscar Munoz · · 7 min de leitura

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:

Menu do painel do FormRead com a opção Tokens de API destacada

Crie os tokens de API para permitir que serviços de terceiros se autentiquem com nosso aplicativo em seu nome:

Criando um novo token de API do FormRead com caixas de seleção de permissões

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.

POST /api/forms/{form_id}/process

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 e image_base64 são somente para imagem única.
  • Uma URL com falha não falha todo o lote — esse item recebe "success": false e um campo error; 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_ms em 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.

Pare de corrigir formulários à mão.

Coloque o FormRead para trabalhar agora: crie seu formulário, digitalize sua primeira folha e obtenha resultados estruturados em minutos.

Comece agora — sem necessidade de cartão de crédito