Guía · API de cédulas

Cómo integrar una API de cédulas de Ecuador

Publicado el

Una API de cédulas permite incorporar una consulta de nombres asociada a una identificación ecuatoriana en un formulario, un proceso de registro o una operación interna sin pedir al usuario que abandone tu aplicación.

Este tutorial usa el endpoint de nombres como primera integración. Verás la autenticación, solicitudes listas para cURL, JavaScript, Python y PHP, la respuesta JSON y las precauciones necesarias para llevarla a producción.

Qué endpoint usar para consultar una cédula

Para obtener los nombres asociados a una cédula usa GET /api/v1/cedulas/{cedula}/nombres. Cuando están disponibles, la respuesta separa nombres y apellidos, además de incluir el nombre completo y el identificador consultado.

Los demás datos disponibles tienen endpoints independientes. Así puedes solicitar únicamente lo que tu aplicación necesita y revisar el contrato exacto de cada campo en la documentación.

Antes de hacer la primera solicitud

  • Crea una cuenta y genera una API key desde el panel.
  • Guarda ECUADORAPI_KEY como variable de entorno en tu servidor; nunca la incluyas en JavaScript que se ejecute en el navegador.
  • Valida que la cédula tenga 10 dígitos y un dígito verificador válido antes de enviarla.
  • Define una finalidad legítima y solicita solo los datos necesarios para tu proceso.

Ejemplos para consultar una cédula desde código

Elige el lenguaje, copia el ejemplo y sustituye la cédula ficticia. Todos los ejemplos envían la API key con autenticación Bearer y leen el mismo formato de respuesta.

EndpointGET /api/v1/cedulas/{cedula}/nombres

El ejemplo usa un identificador ficticio. Reemplázalo por el dato que necesitas consultar.

Solicitud
curl --request GET "https://api.ecuadorapi.com/api/v1/cedulas/1700000000/nombres" \
  --header "Authorization: Bearer $ECUADORAPI_KEY" \
  --header "Accept: application/json" \
  --fail-with-body \
  --max-time 60
const response = await fetch("https://api.ecuadorapi.com/api/v1/cedulas/1700000000/nombres", {
  headers: {
    Authorization: "Bearer " + process.env.ECUADORAPI_KEY,
    Accept: "application/json",
  },
  signal: AbortSignal.timeout(60_000),
})
const contentType = response.headers.get("content-type") ?? ""
const body = contentType.includes("json")
  ? await response.json().catch(() => null)
  : null

if (!response.ok || body?.error) {
  throw new Error(body?.message ?? "Request failed: " + response.status)
}

if (!body || !("data" in body)) {
  throw new Error("API returned an invalid response")
}

const result = body.data
// Use result in your server-side flow. Avoid logging personal responses.
import os, requests

response = requests.get(
    "https://api.ecuadorapi.com/api/v1/cedulas/1700000000/nombres",
    headers={
        "Authorization": f"Bearer {os.environ['ECUADORAPI_KEY']}",
        "Accept": "application/json",
    },
    timeout=60,
)
content_type = response.headers.get("content-type", "")

try:
    body = response.json() if "json" in content_type else None
except requests.exceptions.JSONDecodeError:
    body = None

if not response.ok or (isinstance(body, dict) and body.get("error")):
    message = body.get("message") if isinstance(body, dict) else None
    raise RuntimeError(message or f"Request failed: {response.status_code}")

if not isinstance(body, dict) or "data" not in body:
    raise RuntimeError("API returned an invalid response")

data = body["data"]
# Use data in your server-side flow. Avoid logging personal responses.
$ch = curl_init("https://api.ecuadorapi.com/api/v1/cedulas/1700000000/nombres");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer " . getenv("ECUADORAPI_KEY"),
    "Accept: application/json",
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$rawBody = curl_exec($ch);

if ($rawBody === false) {
    $transportError = curl_error($ch);
    curl_close($ch);
    throw new RuntimeException("Request transport failed: " . $transportError);
}

$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$body = json_decode($rawBody, true);

if (!is_array($body)) {
    throw new RuntimeException("API returned invalid JSON");
}

if ($statusCode >= 400 || ($body["error"] ?? false)) {
    throw new RuntimeException(
        ($body["message"] ?? null) ?: "Request failed: " . $statusCode
    );
}

if (!array_key_exists("data", $body)) {
    throw new RuntimeException("API returned an invalid response");
}

$data = $body["data"];
// Use $data in your server-side flow. Avoid logging personal responses.

Respuesta de ejemplo · 200 OK

JSON ficticio con la misma estructura que devuelve la API. Verlo o copiarlo no consume saldo.

{
  "data": {
    "id": "1700000000",
    "full_name": "PÉREZ GARCÍA JUAN ANDRÉS",
    "first_name": "JUAN ANDRÉS",
    "last_name": "PÉREZ GARCÍA"
  },
  "error": null,
  "message": null
}
Ver campos, precio vigente y referencia del endpoint

Cómo interpretar la respuesta JSON

  • data.id contiene la cédula que enviaste.
  • data.full_name devuelve nombres y apellidos completos cuando están disponibles; tu integración debe tolerar null.
  • data.first_name y data.last_name permiten llenar campos separados sin dividir el texto por tu cuenta cuando están disponibles; también pueden ser null.
  • error y message indican si la solicitud pudo completarse; en una respuesta exitosa llegan como null.

Errores que tu integración debe manejar

  • 400: la cédula o la solicitud no tiene el formato esperado.
  • 401 o 403: revisa la API key y el estado de verificación de la cuenta.
  • 402: revisa el saldo y el mensaje incluido en la respuesta.
  • 404: no se encontraron datos para el identificador enviado; no lo conviertas automáticamente en una afirmación sobre la persona.
  • 429: espera el tiempo indicado en Retry-After antes de reintentar.
  • 502 o 503: aplica espera progresiva y vuelve a intentar más tarde.

Checklist para producción

  • Haz la solicitud desde tu backend y entrega al navegador solo la información necesaria.
  • Configura un timeout y limita los reintentos para evitar solicitudes duplicadas.
  • No guardes cédulas, respuestas completas ni API keys en logs innecesarios.
  • Revisa el precio vigente en la ficha del endpoint; los errores y las consultas sin resultados no descuentan saldo.
Continúa con la integración
Revisa los campos, el precio vigente y el ejemplo actualizado en la referencia técnica.

Preguntas frecuentes

Respuestas rápidas sobre esta guía.

Más guías

Continúa explorando otros temas relacionados.

Ver todas las guías