API de procesamiento del lado del servidor de FormRead

Oscar Munoz Oscar Munoz · · 7 min de lectura

Procesamiento de formularios del lado del servidor

La API del lado del servidor de FormRead te permite enviar una imagen de formulario escaneado y recibir resultados estructurados (OMR, OCR, BCR) directamente como JSON. Sin navegador, sin iframe, solo una simple solicitud HTTP de tu backend al nuestro.

  • Envía una imagen y recibe resultados como JSON en una sola solicitud
  • Admite OMR (detección de burbujas), OCR (extracción de texto) y BCR (lectura de códigos de barras/QR)
  • La configuración del formulario se carga automáticamente desde el formulario que configuraste en el panel de control

Cuándo usar esta API

Usa la API del lado del servidor cuando necesites procesamiento automatizado de servidor a servidor sin interfaz de usuario, por ejemplo, procesar lotes de formularios escaneados desde una carpeta, integrarte con tu pipeline de backend existente o construir sistemas de calificación automatizados.

Si necesitas una interfaz visual donde los usuarios puedan configurar formularios, revisar resultados y hacer control de calidad, usa la API de integración con iframe en su lugar.

Autenticación

Para usos empresariales, la API se puede usar generando un token de autenticación "Bearer".

Inicie sesión en el panel de FormRead, y acceda a la opción API Token:

Menú del panel de FormRead con la opción Tokens de API resaltada

Cree los tokens de API para permitir que los servicios de terceros se autentiquen con nuestra aplicación en su nombre:

Creación de un nuevo token de API de FormRead con casillas de verificación de permisos

Procesar una imagen de formulario

Envía una imagen de formulario escaneado para procesarla. El formulario debe estar configurado previamente con áreas de lectura (OMR, OCR, BCR) a través del panel de control o iframe. La API usa la configuración guardada del formulario para procesar la imagen.

POST /api/forms/{form_id}/process

Encabezados

Nombre Valor
Authorization Bearer YOUR_API_TOKEN
Accept application/json
Content-Type application/json or multipart/form-data

Con carga de archivo:

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"'

Con URL de imagen:

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"}'

Respuesta

{
  "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 de respuesta

Campo Tipo Descripción
success boolean Si el procesamiento se completó con éxito
results object Pares clave-valor de resultados de áreas. Las claves son nombres de áreas (por ejemplo, OMR-0-0, OCR-1, BCR-2)
omr_details object Datos detallados a nivel de burbuja para áreas OMR, incluyendo posiciones y proporciones de relleno
anchor_error boolean Verdadero si la hoja del formulario no pudo alinearse (por ejemplo, esquinas no detectadas)
processing_time_ms integer Tiempo de procesamiento en milisegundos

Opciones de entrada de imagen

Puedes proporcionar la imagen de tres maneras. Usa exactamente una:

Parámetro Tipo Descripción
image file Carga de archivo (multipart/form-data)
image_url string URL pública de la imagen
image_base64 string Datos de imagen codificados en base64

Nota

La configuración del formulario (áreas de lectura, umbrales, anclas) se carga automáticamente desde el formulario que configuraste en el panel de control de FormRead. No necesitas enviar ninguna configuración en la solicitud.

Procesamiento por lotes

Para procesar múltiples imágenes del mismo formulario en una sola solicitud, pase una lista de URLs separadas por comas en el campo image_url. Los resultados se devuelven como un arreglo en el mismo orden.

Solicitud

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"}'

Respuesta

{
  "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 del lote

Parámetro Tipo Predeterminado Descripción
image_url string — Una o más URLs de imágenes públicas. Separadas por comas para modo lote.
details boolean false Incluir omr_details (posiciones de burbuja y proporciones de relleno) en cada resultado del lote. Omitido por defecto para mantener las respuestas pequeñas.

Comportamiento del lote

  • El modo lote solo está disponible con image_url. Las cargas de archivos y image_base64 son solo de imagen única.
  • Una URL fallida no hace fallar todo el lote: ese elemento recibe "success": false y un campo error; el resto continúa.
  • Los resultados preservan el orden enviado mediante id (indexado desde 0).
  • omr_details siempre se devuelve en modo de imagen única; en modo lote requiere "details": true.

Lote con 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
  }'

Límites

Límite Valor Comportamiento
Solicitudes por minuto 60 Por token de API. Exceder devuelve HTTP 429.
Tiempo de espera por solicitud 60s Las solicitudes que excedan 60 segundos se terminan con un error.

Una respuesta 429 se ve así:

{
  "message": "Too Many Attempts."
}

Una solicitud por lotes cuenta como una llamada sin importar cuántas URLs contenga.

Dimensionamiento de lotes

  • Por lote: mida processing_time_ms en una respuesta de muestra de imagen única, luego empaque un lote que termine cómodamente en menos de 60 segundos.
  • Entre lotes: espacie las solicitudes para mantenerse por debajo de 60 por minuto.
  • Tamaño de imagen: reduzca el tamaño en el cliente a las dimensiones más pequeñas que aún produzcan resultados correctos. Este es el mayor factor en el tiempo por imagen.

Tipos de áreas admitidos

Tipo Descripción Formato de resultado
OMR Reconocimiento Óptico de Marcas: detecta burbujas rellenas en hojas de respuestas "A", "B,C"
OCR Reconocimiento Óptico de Caracteres: extrae texto impreso o escrito a mano "John Smith"
BCR Reconocimiento de Códigos de Barras/QR: lee códigos de barras y códigos QR "1234567890"

Ejemplos de código

Aquí hay ejemplos completos en Python y JavaScript para procesar una imagen de formulario:

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' }

Preguntas frecuentes

¿Qué hace la API de procesamiento del lado del servidor?

Envías una imagen de un formulario escaneado con un solo HTTP POST y recibes los resultados estructurados OMR (burbujas), OCR (texto) y BCR (códigos de barras/QR) en JSON - sin navegador ni iframe.

¿Cómo autentico las peticiones?

Pasa tu token de acceso personal como token Bearer en el header Authorization: Authorization: Bearer TU_TOKEN_API. Genera el token desde la sección de tokens de API de tu panel de FormRead.

¿Puedo procesar varias imágenes en una sola petición?

Sí. Pasa una lista de URLs públicas separadas por comas en el campo image_url. Los resultados vuelven en un arreglo respetando el orden de envío, y una URL fallida solo falla su propio elemento - el resto continúa.

¿Cuáles son los límites de tasa y tamaño?

Hasta 60 peticiones por minuto por token de API, con un timeout de procesamiento de 60 segundos por petición. Una petición por lotes cuenta como una sola llamada sin importar cuántas URLs contenga.

¿Necesito enviar la configuración del formulario en cada petición?

No. La configuración del formulario - áreas de lectura, umbrales y anclas - se carga automáticamente desde el formulario que configuraste en el panel de FormRead. Tu petición solo necesita la imagen y el id del formulario en la URL.

Deje de calificar formularios a mano.

Ponga FormRead a trabajar ahora: cree su formulario, escanee su primera hoja y obtenga resultados estructurados en minutos.

Empiece ahora — no necesita tarjeta de crédito