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.
GET /api/v1/cedulas/{cedula}/nombresEl ejemplo usa un identificador ficticio. Reemplázalo por el dato que necesitas consultar.
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 60const 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
}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.
Preguntas frecuentes
Respuestas rápidas sobre esta guía.