BEIA Image Processing API

Documentación oficial de la API para procesamiento de imágenes del servidor BEIA.

1. Descripción General

La API permite enviar una imagen junto con las credenciales de acceso (licenseId y apiKey) para su procesamiento. Como resultado, el servicio puede devolver una única imagen procesada en formato PNG o, dependiendo de los parámetros de entrada, un conjunto de imágenes en una respuesta de tipo multipart/mixed.

Por motivos de seguridad, todas las solicitudes deben originarse desde una dirección IP estática previamente autorizada. Las peticiones realizadas desde direcciones no registradas serán rechazadas.

2. Endpoint

POST https://aws.beiatechnology.com/beia-api/v1/image

3. Requisitos de Red

Todas las peticiones deben realizarse desde una IP estática previamente autorizada. Solicitudes desde otras IP serán rechazadas.

4. Parámetros de Solicitud (multipart/form-data)

NombreTipoUbicaciónDescripciónValor por defecto
licenseIdstringHeader / FormID de licencia del cliente.Requerido
apiKeystringFormClave de autenticación.Requerido
imagefileFormImagen a procesar.Requerido
includeCroppedImageboolFormIndica si se debe incluir la imagen recortada en la respuesta. Este parámetro modifica el formato de la respuesta devuelta por la API.false

Headers Requeridos

HeaderDescripciónRequerido
License-IdDebe coincidir con el licenseId enviado.
Content-Typemultipart/form-data

5. Respuesta

La API puede devolver dos formatos de respuesta distintos, en función de los parámetros enviados en la solicitud.

Respuesta de imagen simple:

Cuando no se solicitan imágenes adicionales, la respuesta consiste en una única imagen procesada en formato PNG, con tipo MIME image/png.

Respuesta multipart/mixed:

Cuando se solicitan resultados adicionales (por ejemplo, la imagen recortada), la API devuelve una respuesta de tipo multipart/mixed, que puede contener los siguientes elementos:

  • result: imagen procesada principal.
  • cropped: imagen recortada (si se solicitó).
  • credits: número de créditos restantes.

Adicionalmente, en todas las respuestas se incluye el encabezado HTTP Credits-Remaining, que indica la cantidad de créditos disponibles tras procesar la solicitud.

Códigos de Estado

CódigoDescripción
200 OKSolicitud procesada correctamente.
400 Bad RequestParámetros faltantes o inválidos.
401 UnauthorizedLicencia no válida.
402 Payment RequiredNo quedan créditos disponibles.
403 ForbiddenIP no autorizada.
415 Unsupported Media TypeArchivo no válido.
429 Too Many RequestsDemasiadas imágenes en proceso, reintente más tarde.
500 Internal Server ErrorError interno del servidor.

6. Ejemplos

Solicitud cURL

curl -X POST "https://aws.beiatechnology.com/beia-api/v1/image" \
	-H "License-Id: 1234" \
	-F "image=@d:\eco\001.jpg;filename=001.jpg" \
	-F "apiKey=5678" \
	-F "licenseId=1234" \
	-o result.png

Python

Descargar ejemplo de conexión API

Ver código
"""
Beia API Sample - Python Version
Minimal error checking for clarity.
"""

import os
import requests

# Configuration
IMAGE_PATH = "./001.jpg"
LICENSE_ID = ""
API_KEY = ""
ENDPOINT_URL = "https://aws.beiatechnology.com/beia-api/v1/image"


def validate_inputs():
    """Validates that all required inputs are present."""
    if not os.path.exists(IMAGE_PATH):
        print(f"Image file '{IMAGE_PATH}' not found")
        return False
    
    if not LICENSE_ID or not LICENSE_ID.strip():
        print("License ID is not set")
        return False
    
    if not API_KEY or not API_KEY.strip():
        print("API key is not set")
        return False
    
    return True

def main():
    """Main function - sends image to Beia API and processes response."""
    
    if not validate_inputs():
        return
    
    # Read image file
    with open(IMAGE_PATH, 'rb') as f:
        image_bytes = f.read()
    
    # Prepare headers
    # License ID header is recommended for load balancing purposes
    headers = {
        'License-Id': LICENSE_ID
    }
    
    # Build the multipart/form-data request body
    # Each part is: (form-field name, (filename, content, content-type))
    # Field names ("apiKey", "licenseId", "image") are required
    files = {
        'apiKey': (None, API_KEY),
        'licenseId': (None, LICENSE_ID),
        'image': (IMAGE_PATH, image_bytes, 'application/octet-stream')
    }
    
    try:
        # Send the request. Server-side processing can take a few seconds.
        print("Sending request to Beia API...")
        response = requests.post(ENDPOINT_URL, headers=headers, files=files)
        
        # HTTP-level failure
        if not response.ok:
            if response.status_code == 403:
                print("This IP is not authorized to use the API. Please contact Beia support.")
                return
            
            print(f"Response code: {response.status_code}")
            return
        
        result_bytes = response.content
        print(f"Received {len(result_bytes)} bytes")
        
        with open("result.png", "wb") as f:
            f.write(result_bytes)
        print("Result image saved to 'result.png'")
        
    except Exception as ex:
        print(f"Exception: {ex}")


if __name__ == "__main__":
    main()

Node.js

Descargar ejemplo de conexión API

Ver código
/**
 * Beia API Sample - Node.js Version
 * Minimal error checking for clarity.
 * 
 * Requirements: npm install axios form-data
 */

const fs = require('fs').promises;
const fsSync = require('fs');
const path = require('path');
const axios = require('axios');
const FormData = require('form-data');

// Configuration
const IMAGE_PATH = './001.jpg';
const LICENSE_ID = '';
const API_KEY = '';
const ENDPOINT_URL = 'https://aws.beiatechnology.com/beia-api/v1/image';

/**
 * Validates that all required inputs are present.
 */
function validateInputs()
{
    if (!fsSync.existsSync(IMAGE_PATH))
    {
        console.log(`Image file '${IMAGE_PATH}' not found`);
        return false;
    }
    
    if (!LICENSE_ID || !LICENSE_ID.trim())
    {
        console.log('License ID is not set');
        return false;
    }
    
    if (!API_KEY || !API_KEY.trim())
    {
        console.log('API key is not set');
        return false;
    }
    
    return true;
}

/**
 * Main function - sends image to Beia API and processes response.
 */
async function main()
{
    if (!validateInputs())
    {
        return;
    }
    
    try
    {
        // Read image file
        const imageBuffer = await fs.readFile(IMAGE_PATH);
        
        // Build the multipart/form-data request body
        // Field names ("apiKey", "licenseId", "image") are required
        const formData = new FormData();
        formData.append('apiKey', API_KEY);
        formData.append('licenseId', LICENSE_ID);
        formData.append('image', imageBuffer,
        {
            filename: path.basename(IMAGE_PATH),
            contentType: 'application/octet-stream'
        });
        
        // Prepare headers
        // License ID header is recommended for load balancing purposes
        const headers =
        {
            ...formData.getHeaders(),
            'License-Id': LICENSE_ID
        };
        
        // Send the request. Server-side processing can take a few seconds.
        console.log('Sending request to Beia API...');
        const response = await axios.post(ENDPOINT_URL, formData,
        {
            headers: headers,
            responseType: 'arraybuffer' // Get raw binary data
        });
        
        // HTTP-level failure is handled by axios throwing an error
        
        const resultBytes = Buffer.from(response.data);
        console.log(`Received ${resultBytes.length} bytes`);
        
        await fs.writeFile('result.png', resultBytes);
        console.log("Result image saved to 'result.png'");
        
    }
    catch (error)
    {
        if (error.response)
        {
            if (error.response.status === 403)
            {
                console.log('This IP is not authorized to use the API. Please contact Beia support.');
                return;
            }
            
            console.log(`Response code: ${error.response.status}`);
        }
        else
        {
            console.log(`Exception: ${error.message}`);
        }
    }
}

// Run the main function
main();

C#

Descargar ejemplo de conexión API

Ver código
using System;
using System.ComponentModel;
using System.Net.Http.Headers;

class Program
{
	const string ImagePath = "./001.jpg";
	const string LicenseId = "";
	const string ApiKey = "";
	const string EndpointUrl = "https://aws.beiatechnology.com/beia-api/v1/image";

	//=============================================================================
	/// <summary>Beia API sample, minimal error checking for clarity.</summary>
	static async Task Main (string[] args)
	{
		if (!ValidateInputs ()) return;

		byte[] imageBytes = File.ReadAllBytes (ImagePath);

		using HttpClient client = new HttpClient ();

		// License ID header is recommended for load balancing purposes
		client.DefaultRequestHeaders.Add ("License-Id", LicenseId);

		// Build the multipart/form-data request body.
		// Each part is: (content, form-field name, optional filename).
		// Field names ("apiKey", "licenseId", "image") are required.
		MultipartFormDataContent formData = new MultipartFormDataContent ();
		formData.Add (new StringContent (ApiKey), "apiKey");
		formData.Add (new StringContent (LicenseId), "licenseId");
		formData.Add (new ByteArrayContent (imageBytes), "image", ImagePath);


		try
		{
			// Send the request. Server-side processing can take a few seconds.
			Console.WriteLine ("Sending request to Beia API...");
			HttpResponseMessage response = await client.PostAsync (EndpointUrl, formData);

			// HTTP-level failure. (In a real app, you may also want to read the error body for details.)
			if (!response.IsSuccessStatusCode)
			{
				if (response.StatusCode  == System.Net.HttpStatusCode.Forbidden)
				{
					Console.WriteLine ("This IP is not authorized to use the API. Please contact Beia support.");
					return;
				}

				Console.WriteLine ($"Response code: {(int)response.StatusCode}");
				return;
			}

			byte []resultBytes = await response.Content.ReadAsByteArrayAsync();
			Console.WriteLine ($"Received {resultBytes.Length} bytes");

			File.WriteAllBytes ("result.png", resultBytes);
			Console.WriteLine ("Result image saved to 'result.png'");
		}
		catch (Exception ex)
		{
			Console.WriteLine ("Exception: " + ex.Message);
		}
	}

	//=============================================================================
	/// <summary></summary>
	static bool ValidateInputs ()
	{
		if (!File.Exists (ImagePath))
		{
			Console.WriteLine ($"Image file '{ImagePath}' not found");
			return false;
		}

		if (string.IsNullOrWhiteSpace (LicenseId))
		{
			Console.WriteLine ("License ID is not set");
			return false;
		}

		if (string.IsNullOrWhiteSpace (ApiKey))
		{
			Console.WriteLine ("API key is not set");
			return false;
		}

		return true;
	}


}