πŸ’» Ejemplos de CΓ³digo

Snippets listos para integrar la API en tu stack. Reemplaza TU_TOKEN_IDVC y http://localhost:8000 con los valores de tu entorno.

πŸ“¦ Estructura de respuesta rΓ‘pida

CampoTipoQuΓ© usar
fields.run.candidatostring RUT resuelto β€” usar siempre este
fields.run.run_validbool βœ“ dΓ­gito verificador mΓ³dulo-11 correcto
fields.nombres.candidatostring Nombre(s) en mayΓΊsculas
fields.apellidos.candidatostring Apellido(s) en mayΓΊsculas
fields.fecha_nacimiento.candidatostring ISO 8601 YYYY-MM-DD cuando viene del MRZ
fields.sexo.candidatostring M o F
quality.case_classstring ok aceptar Β· corrected aceptar con log Β· disagreement revisiΓ³n manual
quality.mrz_checksums_okbool Checksums MRZ vΓ‘lidos β€” indica confiabilidad del reverso
portrait.b64string JPEG del rostro en base64 β€” decodificar con base64.b64decode()
validation.run.scorefloat 0–100 Solo si se enviΓ³ run_esperado. β‰₯ 90 β†’ aceptar automΓ‘ticamente
$ pip install requests
import requests, base64, json

BASE_URL  = "http://localhost:8000"
TOKEN     = "TU_TOKEN_IDVC"

def procesar_cedula(anverso_path, reverso_path, run_esperado=None):
    with open(anverso_path, "rb") as fa, open(reverso_path, "rb") as fr:
        files = {
            "anverso": ("anverso.jpg", fa, "image/jpeg"),
            "reverso": ("reverso.jpg", fr, "image/jpeg"),
        }
        data = {"idvc_token": TOKEN}
        if run_esperado:
            data["run_esperado"] = run_esperado

        resp = requests.post(f"{BASE_URL}/v1/cedula", files=files, data=data)
        resp.raise_for_status()
        return resp.json()

resultado = procesar_cedula("frente.jpg", "reverso.jpg", run_esperado="15.601.984-4")

# Campos principales
run    = resultado["fields"]["run"]["candidato"]
nombre = resultado["fields"]["nombres"]["candidato"]
apell  = resultado["fields"]["apellidos"]["candidato"]
calidad = resultado["quality"]["case_class"]   # "ok" | "corrected" | "disagreement"

print(f"RUN:      {run}")
print(f"Nombre:   {nombre} {apell}")
print(f"Calidad:  {calidad}")

# Guardar retrato
portrait_b64 = resultado["portrait"]["b64"]
if portrait_b64:
    with open("retrato.jpg", "wb") as f:
        f.write(base64.b64decode(portrait_b64))

# VerificaciΓ³n con RUT conocido
if "validation" in resultado:
    score = resultado["validation"]["run"]["score"]
    print(f"Score RUT: {score}/100")
$ Node.js 18+ (fetch nativo) Β· Browser compatible
const BASE_URL = "http://localhost:8000";
const TOKEN    = "TU_TOKEN_IDVC";

async function procesarCedula(anversoFile, reversoFile, runEsperado = null) {
  const form = new FormData();
  form.append("anverso",    anversoFile);        // File | Blob
  form.append("reverso",    reversoFile);
  form.append("idvc_token", TOKEN);
  if (runEsperado) form.append("run_esperado", runEsperado);

  const resp = await fetch(`${BASE_URL}/v1/cedula`, {
    method: "POST",
    body: form,
  });
  if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
  return resp.json();
}

// ── Uso desde navegador (input[type=file]) ───────────────────────────────────
document.getElementById("btn-procesar").addEventListener("click", async () => {
  const anverso = document.getElementById("input-anverso").files[0];
  const reverso = document.getElementById("input-reverso").files[0];

  try {
    const resultado = await procesarCedula(anverso, reverso, "15.601.984-4");

    const { run, nombres, apellidos } = resultado.fields;
    console.log("RUN:    ", run.candidato);
    console.log("Nombre: ", `${nombres.candidato} ${apellidos.candidato}`);
    console.log("Clase:  ", resultado.quality.case_class);

    // Mostrar retrato
    if (resultado.portrait.b64) {
      const img = document.createElement("img");
      img.src = `data:image/jpeg;base64,${resultado.portrait.b64}`;
      document.body.appendChild(img);
    }
  } catch (err) {
    console.error("Error:", err.message);
  }
});

// ── Uso desde Node.js (con form-data) ───────────────────────────────────────
// import FormData from "form-data";
// import fs from "fs";
// const form = new FormData();
// form.append("anverso", fs.createReadStream("frente.jpg"));
// form.append("reverso", fs.createReadStream("reverso.jpg"));
// form.append("idvc_token", TOKEN);
// const resp = await fetch(`${BASE_URL}/v1/cedula`, { method:"POST", body:form });
$ curl 7.68+
BASE="http://localhost:8000"
TOKEN="TU_TOKEN_IDVC"

# ── Llamada bΓ‘sica ────────────────────────────────────────────────────────────
curl -s \
  -F "anverso=@frente.jpg;type=image/jpeg" \
  -F "reverso=@reverso.jpg;type=image/jpeg" \
  -F "idvc_token=${TOKEN}" \
  "${BASE}/v1/cedula" | jq

# ── Con verificaciΓ³n de RUT conocido ─────────────────────────────────────────
curl -s \
  -F "anverso=@frente.jpg;type=image/jpeg" \
  -F "reverso=@reverso.jpg;type=image/jpeg" \
  -F "idvc_token=${TOKEN}" \
  -F "run_esperado=15.601.984-4" \
  "${BASE}/v1/cedula" | jq ".fields.run, .validation.run"

# ── Extraer solo el candidato de cada campo ───────────────────────────────────
curl -s \
  -F "anverso=@frente.jpg;type=image/jpeg" \
  -F "reverso=@reverso.jpg;type=image/jpeg" \
  -F "idvc_token=${TOKEN}" \
  "${BASE}/v1/cedula" | jq "{
    run:              .fields.run.candidato,
    nombres:          .fields.nombres.candidato,
    apellidos:        .fields.apellidos.candidato,
    fecha_nacimiento: .fields.fecha_nacimiento.candidato,
    calidad:          .quality.case_class
  }"

# ── Guardar el retrato en disco ───────────────────────────────────────────────
curl -s \
  -F "anverso=@frente.jpg;type=image/jpeg" \
  -F "reverso=@reverso.jpg;type=image/jpeg" \
  -F "idvc_token=${TOKEN}" \
  "${BASE}/v1/cedula" | jq -r ".portrait.b64" | base64 -d > retrato.jpg

# ── Verificar liveness del servicio ──────────────────────────────────────────
curl -s "${BASE}/health"
$ PHP 8.0+ Β· extensiΓ³n curl habilitada
<?php

class="kw">const BASE_URL = class="str">"http:class="cmt">//localhost:8000";
class="kw">const TOKEN    = class="str">"TU_TOKEN_IDVC";

class="cmt">/**
 * Procesa una cΓ©dula chilena y retorna el class="kw">array de resultado.
 */
class="kw">function procesarCedula(string $anversoPath, string $reversoPath, ?string $runEsperado = class="kw">null): class="kw">array
{
    $fields = [
        class="str">"anverso"    => class="kw">new CURLFile($anversoPath, class="str">"image/jpeg", class="str">"anverso.jpg"),
        class="str">"reverso"    => class="kw">new CURLFile($reversoPath,  class="str">"image/jpeg", class="str">"reverso.jpg"),
        class="str">"idvc_token" => TOKEN,
    ];
    class="kw">if ($runEsperado !== class="kw">null) {
        $fields[class="str">"run_esperado"] = $runEsperado;
    }

    $ch = curl_init(BASE_URL . class="str">"/v1/cedula");
    curl_setopt_array($ch, [
        CURLOPT_POST           => class="kw">true,
        CURLOPT_POSTFIELDS     => $fields,
        CURLOPT_RETURNTRANSFER => class="kw">true,
        CURLOPT_TIMEOUT        => 30,
    ]);

    $body       = curl_exec($ch);
    $httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    class="kw">if ($httpStatus !== 200) {
        class="kw">throw class="kw">new RuntimeException(class="str">"HTTP $httpStatus: $body");
    }

    class="kw">return json_decode($body, associative: class="kw">true, flags: JSON_THROW_ON_ERROR);
}

class="cmt">// ── Uso ───────────────────────────────────────────────────────────────────────
$resultado = procesarCedula(class="str">"frente.jpg", class="str">"reverso.jpg", class="str">"15.601.984-4");

$run       = $resultado[class="str">"fields"][class="str">"run"][class="str">"candidato"];
$nombres   = $resultado[class="str">"fields"][class="str">"nombres"][class="str">"candidato"];
$apellidos = $resultado[class="str">"fields"][class="str">"apellidos"][class="str">"candidato"];
$clase     = $resultado[class="str">"quality"][class="str">"case_class"];  class="cmt">// class="str">"ok" | class="str">"corrected" | class="str">"disagreement"

class="kw">echo class="str">"RUN:      $run\n";
class="kw">echo class="str">"Nombre:   $nombres $apellidos\n";
class="kw">echo class="str">"Calidad:  $clase\n";

class="cmt">// Guardar retrato
$b64 = $resultado[class="str">"portrait"][class="str">"b64"] ?? class="kw">null;
class="kw">if ($b64) {
    file_put_contents(class="str">"retrato.jpg", base64_decode($b64));
    class="kw">echo class="str">"Retrato guardado en retrato.jpg\n";
}

class="cmt">// Score RUT
class="kw">if (isset($resultado[class="str">"validation"][class="str">"run"])) {
    $score = $resultado[class="str">"validation"][class="str">"run"][class="str">"score"];
    class="kw">echo class="str">"Score RUT: {$score}/100\n";
}