Plataforma de Visión IA · Claude

Convierte imágenes en datos en segundos.

Identificaciones, vehículos y placas, y ocupación de estacionamiento — todo desde una foto, en JSON estructurado. Un mismo token funciona para todos los servicios.

Ver servicios
Identificaciones Vehículos y placas Ocupación en vivo
INE · Mexicana
PEREZ LOPEZ JUAN
15/03/1985
CURPPELJ850315HDFRZN08
DomicilioAV. REFORMA 123, COL. CENTRO, CDMX 06000
Identificación
Vehículo
Placa detectada
16H-542
MarcaBYD
ModeloYuan Pro
ColorBlanco
Año2024
Ocupación
7
Libres
5
Ocupados
12
Total
~2spor lectura
4tipos de documento
10+campos extraídos
RESTintegración directa
Servicios

Una plataforma, varios lectores

Cada servicio recibe una imagen y devuelve datos. Todos comparten el mismo token: cada lectura descuenta de tu saldo, sin importar cuál uses.

Identificaciones

INE, licencia y pasaporte → nombre, CURP, fechas, domicilio y recorte del rostro, en JSON.

Vehículos y placas

De una foto del auto → placa, color, marca, modelo, año y tipo de vehículo, en JSON.

Abrir vehículos

Ocupación / aforo

Cámara fija → detecta en vivo qué cajones están libres u ocupados y el total disponible.

Abrir ocupación

Compra un paquete de lecturas una sola vez y úsalo en cualquier servicio. Consulta tu consumo en tu panel.

Características

Un motor de visión, varios usos

La misma IA que lee identificaciones también reconoce vehículos y placas y mide la ocupación — y lo devuelve listo para tu sistema.

Lectura con IA real

Claude Vision interpreta la imagen aunque esté rotada, gastada o con poca luz. No depende de plantillas rígidas.

Identificaciones

INE, licencia y pasaporte → nombre, CURP, fechas, domicilio y recorte del rostro, ya estructurados.

Vehículos y placas

De una foto del auto obtiene la placa, color, marca, modelo, año y tipo de vehículo.

Ocupación en vivo

Con una cámara fija detecta en tiempo real qué cajones están libres u ocupados y el total disponible.

Un token para todo

Compras lecturas una sola vez y las usas en cualquier servicio — cada lectura descuenta del mismo saldo.

API REST simple

Un solo POST con la imagen en Base64. Respuesta JSON limpia, lista para cualquier lenguaje o plataforma.

Demo en vivo

Pruébalo ahora mismo

Escanea una credencial real con tu cámara o sube una foto. La IA extrae los datos al instante — esto es el producto funcionando, no una simulación.

Ninguna credencial escaneada

Toca el botón de arriba, elige el tipo de documento
y apunta la cámara o sube una foto.

Cómo funciona

De la foto al dato en 3 pasos

1

Captura

El usuario fotografía o sube la identificación. La imagen se optimiza y se orienta automáticamente en el navegador.

2

Análisis IA

La imagen viaja en Base64 al endpoint, donde Claude Vision la lee y extrae cada campo del documento.

3

Datos listos

Recibes un JSON estructurado con nombre, CURP, fechas y más — listo para guardar o validar en tu sistema.

Documentos soportados

Reconoce los documentos oficiales

INECredencial para votar
LicenciaDe conducir
PasaporteMexicano
OtrosDocumentos oficiales
Precios

Planes que escalan contigo

Paga solo por las lecturas que necesitas. Un mismo token sirve para todos los servicios (identificaciones, vehículos/placas y ocupación) — cada lectura descuenta de tu saldo. Sin contratos ni mensualidades.

Inicial

$499MXN

500 lecturas

  • 500 lecturas de identificación
  • Token de API al instante
  • Sin vencimiento
  • Soporte por correo

Empresa

$4,999MXN

10,000 lecturas · ~$0.50 c/u

  • 10,000 lecturas de identificación
  • Todo lo del plan Pro
  • Menor costo por lectura
  • Facturación disponible

Para desarrolladores

Integra la API en minutos

Endpoints REST: mandas la imagen en Base64 y recibes JSON. Todos usan el mismo token y cada lectura descuenta del mismo saldo. Abajo el detalle del lector de identificaciones; el de vehículos funciona igual.

Endpoints

POST https://us-central1-apb-identificaciones.cloudfunctions.net/scanDocument

Identificaciones: INE, licencia, pasaporte → datos estructurados (nombre, CURP, fechas, domicilio).

POST https://us-central1-apb-identificaciones.cloudfunctions.net/scanVehicle

Vehículos y placas → placa, color, marca, modelo, año y tipo. Mismo formato (Base64 + token), misma cuota.
La ocupación / aforo corre en el navegador con la cámara — no requiere llamadas a la API.

Autenticación

HEADER Authorization: Bearer <tu_token>

Todas las peticiones requieren un token de API en el header Authorization. Cada token se asigna a un proyecto y puede revocarse en cualquier momento. Sin un token válido la API responde 401. Cada token puede tener un límite de lecturas; al agotarse responde 429 con el mensaje de lecturas agotadas. Solicita el tuyo al administrador.

Request body application/json

CampoTipoDescripción
imageBase64 reqstringImagen del documento codificada en Base64 (JPEG o PNG)
mimeType reqstring"image/jpeg" o "image/png"
docTypeHint optstring|null"INE", "Licencia de Conducir", "Pasaporte Mexicano" o null para auto-detectar
{
  "imageBase64": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgc...",
  "mimeType":    "image/jpeg",
  "docTypeHint": "INE"
}

Response body

CampoTipoDescripción
okbooleantrue si el análisis fue exitoso
data.fullNamestringNombre completo del titular
data.documentTypestringTipo de documento detectado
data.documentNumberstringClave de elector, folio o número de documento
data.birthDatestringFecha de nacimiento (formato detectado)
data.nationalitystringNacionalidad
data.addressstringDomicilio registrado
data.curpstringCURP (si aplica)
data.expiryDatestringVigencia del documento
data.rawTextLinesstring[]Líneas de texto OCR detectadas
data.portraitImagestringRostro del titular recortado en Base64 (data URL JPEG); ausente si no hay foto

Ejemplos de código

# Codifica la imagen en base64 y envía al endpoint
curl -X POST \
  https://us-central1-apb-identificaciones.cloudfunctions.net/scanDocument \
  -H "Authorization: Bearer <tu_token>" \
  -H "Content-Type: application/json" \
  -d "{
    \"imageBase64\": \"$(base64 -i credencial.jpg | tr -d '\n')\",
    \"mimeType\": \"image/jpeg\",
    \"docTypeHint\": \"INE\"
  }"
import requests, base64

# 1. Leer imagen y codificar
with open("credencial.jpg", "rb") as f:
    b64 = base64.b64encode(f.read()).decode()

# 2. Llamar al endpoint
resp = requests.post(
    "https://us-central1-apb-identificaciones.cloudfunctions.net/scanDocument",
    headers={"Authorization": "Bearer <tu_token>"},
    json={
        "imageBase64": b64,
        "mimeType": "image/jpeg",
        "docTypeHint": "INE"  # o None para auto-detectar
    }
)

data = resp.json()["data"]
print(f"Nombre: {data['fullName']}")
print(f"CURP:   {data['curp']}")
print(f"Nacimiento: {data['birthDate']}")
// Node.js (con fs) o navegador (con FileReader)
import fs from 'fs';

const imageBuffer = fs.readFileSync('credencial.jpg');
const b64 = imageBuffer.toString('base64');

const resp = await fetch(
  'https://us-central1-apb-identificaciones.cloudfunctions.net/scanDocument',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer <tu_token>',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      imageBase64: b64,
      mimeType: 'image/jpeg',
      docTypeHint: 'INE'
    })
  }
);

const { data } = await resp.json();
console.log('Nombre:', data.fullName);
console.log('CURP:', data.curp);
// Requiere: libcurl + una lib base64 (ej. Botan, OpenSSL o la tuya)
#include <curl/curl.h>
#include <fstream>
#include <string>
#include <vector>

std::string fileToBase64(const std::string& path) {
    std::ifstream file(path, std::ios::binary);
    std::vector<unsigned char> bytes(
        (std::istreambuf_iterator<char>(file)), {});
    // Implementar Base64 encoding aquí (o usar OpenSSL BIO)
    return base64Encode(bytes);
}

int main() {
    std::string b64  = fileToBase64("credencial.jpg");
    std::string body = R"({"imageBase64":")" + b64 +
                       R"(","mimeType":"image/jpeg","docTypeHint":"INE"})";

    CURL* curl = curl_easy_init();
    if (!curl) return 1;

    curl_easy_setopt(curl, CURLOPT_URL,
        "https://us-central1-apb-identificaciones.cloudfunctions.net/scanDocument");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());

    struct curl_slist* headers = nullptr;
    headers = curl_slist_append(headers, "Authorization: Bearer <tu_token>");
    headers = curl_slist_append(headers, "Content-Type: application/json");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    // Configurar CURLOPT_WRITEFUNCTION para capturar la respuesta JSON
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    curl_slist_free_all(headers);
    return 0;
}
<?php

// 1. Codificar imagen
$b64 = base64_encode(file_get_contents('credencial.jpg'));

// 2. Preparar payload
$payload = json_encode([
    'imageBase64' => $b64,
    'mimeType'    => 'image/jpeg',
    'docTypeHint' => 'INE',
]);

// 3. Llamar con cURL
$ch = curl_init('https://us-central1-apb-identificaciones.cloudfunctions.net/scanDocument');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer <tu_token>', 'Content-Type: application/json'],
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);

echo "Nombre: " . $response['data']['fullName'] . PHP_EOL;
echo "CURP: "   . $response['data']['curp']     . PHP_EOL;
import java.net.http.*;
import java.net.URI;
import java.nio.file.*;
import java.util.Base64;

public class ScanDocument {
    public static void main(String[] args) throws Exception {

        // 1. Codificar imagen
        byte[] bytes = Files.readAllBytes(Path.of("credencial.jpg"));
        String b64 = Base64.getEncoder().encodeToString(bytes);

        // 2. Construir JSON
        String body = String.format(
            "{\"imageBase64\":\"%s\",\"mimeType\":\"image/jpeg\",\"docTypeHint\":\"INE\"}",
            b64
        );

        // 3. Enviar request
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest req = HttpRequest.newBuilder()
            .uri(URI.create("https://us-central1-apb-identificaciones.cloudfunctions.net/scanDocument"))
            .header("Authorization", "Bearer <tu_token>")
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();

        HttpResponse<String> resp = client.send(req,
            HttpResponse.BodyHandlers.ofString());
        System.out.println(resp.body());
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class ScanDocument {
    static async Task Main() {

        // 1. Codificar imagen
        var bytes = File.ReadAllBytes("credencial.jpg");
        var b64   = Convert.ToBase64String(bytes);

        // 2. Construir payload
        var payload = JsonSerializer.Serialize(new {
            imageBase64 = b64,
            mimeType    = "image/jpeg",
            docTypeHint = "INE"
        });

        // 3. POST al endpoint
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization =
            new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "<tu_token>");
        var content  = new StringContent(payload, Encoding.UTF8, "application/json");
        var response = await client.PostAsync(
            "https://us-central1-apb-identificaciones.cloudfunctions.net/scanDocument",
            content
        );
        var json = await response.Content.ReadAsStringAsync();
        Console.WriteLine(json);
    }
}

Respuesta de ejemplo

{
  "ok": true,
  "data": {
    "fullName":       "GARCIA MENDOZA CARLOS ALBERTO",
    "documentType":   "INE",
    "documentNumber": "GAMC901105HDFRNR07",
    "birthDate":      "05/11/1990",
    "nationality":    "Mexicana",
    "address":        "AV INSURGENTES SUR 1234 COL DEL VALLE 03100 BENITO JUAREZ CDMX",
    "curp":           "GAMC901105HDFRNR07",
    "expiryDate":     "2029",
    "rawTextLines":   ["INSTITUTO NACIONAL ELECTORAL", "CREDENCIAL PARA VOTAR", "..."],
    "portraitImage":  "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
  }
}

Manejo de errores

Ante cualquier error la API responde con ok: false y un campo error con el mensaje. El código HTTP indica el tipo de problema:

HTTPSituaciónMensaje / detalle
400Falta la imagenimageBase64 es requerido
401Sin tokenFalta el token de API. Envía el header: Authorization: Bearer <token>
401Token inválidoToken de API inválido
403Token revocadoToken revocado — fue desactivado desde el panel
429Lecturas agotadasSe acabaron las lecturas disponibles… — incluye limitReached: true
422No es un documentoNo es un documento de identidad válido
500Error del servidorFalla temporal al analizar — reintenta
// 401 — token faltante o inválido
{ "ok": false, "error": "Token de API inválido" }

// 429 — se agotó el límite de lecturas del token
{
  "ok": false,
  "limitReached": true,
  "error": "Se acabaron las lecturas disponibles para este token (500/500). Contacta al administrador para ampliar el límite."
}

Manejo recomendado: revisa siempre resp.ok antes de usar data. Trata 401/403 como problema de credenciales (token), 429 como cuota agotada (avisa al usuario o solicita ampliación) y reintenta los 500 con espera breve.