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.
Cada servicio recibe una imagen y devuelve datos. Todos comparten el mismo token: cada lectura descuenta de tu saldo, sin importar cuál uses.
INE, licencia y pasaporte → nombre, CURP, fechas, domicilio y recorte del rostro, en JSON.
De una foto del auto → placa, color, marca, modelo, año y tipo de vehículo, en JSON.
Abrir vehículosCámara fija → detecta en vivo qué cajones están libres u ocupados y el total disponible.
Abrir ocupaciónCompra un paquete de lecturas una sola vez y úsalo en cualquier servicio. Consulta tu consumo en tu panel.
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.
Claude Vision interpreta la imagen aunque esté rotada, gastada o con poca luz. No depende de plantillas rígidas.
INE, licencia y pasaporte → nombre, CURP, fechas, domicilio y recorte del rostro, ya estructurados.
De una foto del auto obtiene la placa, color, marca, modelo, año y tipo de vehículo.
Con una cámara fija detecta en tiempo real qué cajones están libres u ocupados y el total disponible.
Compras lecturas una sola vez y las usas en cualquier servicio — cada lectura descuenta del mismo saldo.
Un solo POST con la imagen en Base64. Respuesta JSON limpia, lista para cualquier lenguaje o plataforma.
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.
El usuario fotografía o sube la identificación. La imagen se optimiza y se orienta automáticamente en el navegador.
La imagen viaja en Base64 al endpoint, donde Claude Vision la lee y extrae cada campo del documento.
Recibes un JSON estructurado con nombre, CURP, fechas y más — listo para guardar o validar en tu sistema.
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.
500 lecturas
2,000 lecturas · ~$0.75 c/u
10,000 lecturas · ~$0.50 c/u
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.
Identificaciones: INE, licencia, pasaporte → datos estructurados (nombre, CURP, fechas, domicilio).
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.
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.
| Campo | Tipo | Descripción |
|---|---|---|
imageBase64 req | string | Imagen del documento codificada en Base64 (JPEG o PNG) |
mimeType req | string | "image/jpeg" o "image/png" |
docTypeHint opt | string|null | "INE", "Licencia de Conducir", "Pasaporte Mexicano" o null para auto-detectar |
{ "imageBase64": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgc...", "mimeType": "image/jpeg", "docTypeHint": "INE" }
| Campo | Tipo | Descripción |
|---|---|---|
ok | boolean | true si el análisis fue exitoso |
data.fullName | string | Nombre completo del titular |
data.documentType | string | Tipo de documento detectado |
data.documentNumber | string | Clave de elector, folio o número de documento |
data.birthDate | string | Fecha de nacimiento (formato detectado) |
data.nationality | string | Nacionalidad |
data.address | string | Domicilio registrado |
data.curp | string | CURP (si aplica) |
data.expiryDate | string | Vigencia del documento |
data.rawTextLines | string[] | Líneas de texto OCR detectadas |
data.portraitImage | string | Rostro del titular recortado en Base64 (data URL JPEG); ausente si no hay foto |
# 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); } }
{ "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..." } }
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:
| HTTP | Situación | Mensaje / detalle |
|---|---|---|
400 | Falta la imagen | imageBase64 es requerido |
401 | Sin token | Falta el token de API. Envía el header: Authorization: Bearer <token> |
401 | Token inválido | Token de API inválido |
403 | Token revocado | Token revocado — fue desactivado desde el panel |
429 | Lecturas agotadas | Se acabaron las lecturas disponibles… — incluye limitReached: true |
422 | No es un documento | No es un documento de identidad válido |
500 | Error del servidor | Falla 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.