Colombia KYC API: cédula, biometrics and records

Colombia KYC API (2026): 10 Checks to Verify Cédula, Background Records and PEP

Tabla of Contents
Share this article

Short answer: A Colombia KYC API flow with Verifik combines the cédula lookup (GET /v2/co/cedula), the Registraduría validity certificate, a face match with liveness and, depending on risk, National Police, Attorney General’s Office, Comptroller and PEP checks. Every call uses a Bearer token and is paid with smartCHECK credits from $49 a month.

If you are looking for a Colombia KYC API, you don’t need a single endpoint but a layered flow. This guide, updated in November 2026, is the map: it brings together the 10 checks Verifik offers to know a Colombian customer, explains which official source each one queries, and links to the detailed guide for each lookup. If you only need to validate the document, start with Colombian ID (CC) verification.

Note: this article summarizes official rules for information only and is not legal advice. Check your case with your compliance officer.

What KYC means in Colombia and why it matters in 2026

KYC (know your customer) is the set of controls you run to know who your customer is before giving them a product. In Colombia those controls rest on three frameworks:

  • Anti-money laundering. Entities supervised by the Financial Superintendence (SFC) apply SARLAFT, which requires identifying and knowing the customer with a risk-based approach. Companies supervised by the Superintendence of Companies have an equivalent regime (SAGRILAFT).
  • Identity theft. Law 2573 of 2026 requires telcos, financial or credit entities and businesses with that competence to adopt “sufficient and reasonable” measures to verify identity. We summarize it on our Law 2573 compliance page.
  • Personal data. If you store cédula data, selfies or background records, Law 1581 of 2012 applies: you need the data subject’s authorization and a clear purpose.

The 10 checks in a Colombian KYC flow

Each check answers a different question. This table summarizes which endpoint to use and what it returns according to Verifik’s official documentation:

QuestionEndpointWhat you sendWhat it returns
Does the cédula exist and who owns it?GET /v2/co/ceduladocumentType (CC or PPT) and documentNumberFull name, first names, last names and a Verifik signature
Is the cédula valid at the National Civil Registry (Registraduría Nacional del Estado Civil)?GET /v2/co/registraduria/certificadodocumentNumber and date (issue date, DD/MM/YYYY)novedad (for example VIGENTE), issue date and place, verification code and PDF
Does the foreign resident hold a valid foreigner ID (CE)?GET /v2/co/foreigner-id/cedocumentNumber and expeditionDate (DD/MM/YYYY)Name, status (for example VIGENTE) and expiration
Is the person on camera the document holder?POST /v2/face-recognition/compare-with-livenessprobe (selfie), gallery and thresholdsComparison score and liveness result
Any pending matters with judicial authorities? (National Police)GET /v2/co/policia/consultardocumentType (CC, CE, PPT, PA, DP) and documentNumberName and the official police record certificate text
Any pending corrective measures? (RNMC)GET /v2/co/policia/rnmcdocumentType, documentNumber and issue dateList of corrective measures with status, municipality and file number
Any disciplinary sanctions? (Attorney General’s Office, Procuraduría)GET /v2/co/procuraduria/antecedentesdocumentType (CC, PEP, CE) and documentNumberhasRecord, legend and sanctions
Any fiscal liability? (Comptroller General, Contraloría)GET /v2/co/contraloria/certificadodocumentType (CC, CE, PA, PEP) and documentNumberSearch date and PDF certificate
Is this a politically exposed person (AML)?GET /v2/co/politically-exposed-personsdocumentType (CC or NIT) and documentNumberDeclarations with entity, position and publication date; 404 when there is no match
Can they drive? (mobility, delivery, rentals)GET /v2/co/runt/conductordocumentType (CC, CE, PA, PPT) and documentNumberDriver status, licenses, categories and expiration dates

Each lookup has its own detailed guide: ID verification with the cédula de ciudadanía, Colombian foreigner IDs, police record checks, RNMC corrective measures, Contraloría certificate, INPEC prison records and driver’s licenses.

Watch the acronyms: “PEP” appears twice. In /v2/co/politically-exposed-persons it means a politically exposed person (AML); as documentType=PEP in the Procuraduría or Contraloría lookups it is the Special Stay Permit (Permiso Especial de Permanencia), an immigration document.

Recommended flow, step by step

This order cuts cost and friction, because each step only runs if the previous one passed:

  1. Data capture and authorization. Ask for document type and number and the issue date, and record the data-processing authorization (Law 1581).
  2. Document. Call /v2/co/cedula and compare fullName with what the customer typed. For foreigners, use /v2/co/foreigner-id/ce.
  3. Validity. Call /v2/co/registraduria/certificado and approve only if novedad is VIGENTE; any other value goes to manual review.
  4. Biometrics. Ask for a selfie and call /v2/face-recognition/compare-with-liveness.
  5. Lists and records by risk. PEP for financial products; Police, RNMC, Procuraduría and Contraloría for hiring, lending or suppliers.
  6. Decision and evidence. Approve, reject or send to review. Store the id and signature of every response: they help with the document check Law 2573 requires.

How to integrate it with the Verifik API

Every call goes to https://api.verifik.co with your token in the Authorization: Bearer header. The samples use dummy data in the response shape of the official documentation.

Step 1: validate the cédula

The Colombia identity documentation asks for documentType (CC or PPT) and documentNumber:

curl -G "https://api.verifik.co/v2/co/cedula" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $VERIFIK_TOKEN" \
  --data-urlencode "documentType=CC" \
  --data-urlencode "documentNumber=123456789"

Sample 200 response:

{
  "data": {
    "arrayName": [
      "JUAN",
      "CARLOS",
      "PEREZ",
      "GOMEZ"
    ],
    "documentNumber": "123456789",
    "documentType": "CC",
    "firstName": "JUAN CARLOS",
    "fullName": "JUAN CARLOS PEREZ GOMEZ",
    "lastName": "PEREZ GOMEZ"
  },
  "signature": {
    "dateTime": "November 3, 2026 9:15 AM",
    "message": "Certified by Verifik.co"
  },
  "id": "CC01A"
}

If you send an unsupported document type, the API returns 409:

{
  "code": "MissingParameter",
  "message": "documentType must be one of: [CC,PPT]"
}

Step 2: Registraduría validity certificate

The certificate endpoint requires the cédula issue date, something usually only the holder has at hand:

import os, requests

url = "https://api.verifik.co/v2/co/registraduria/certificado"
headers = {
    "Accept": "application/json",
    "Authorization": f"Bearer {os.getenv('VERIFIK_TOKEN')}"
}
params = {"documentNumber": "123456789", "date": "10/10/2020"}

r = requests.get(url, headers=headers, params=params)
print(r.status_code, r.json())

Sample 200 response (PDF truncated):

{
  "data": {
    "codigoVerificacion": "ABC123XYZ",
    "novedad": "VIGENTE",
    "pdfBase64": "JVBERi0xLjQK...",
    "documento": {
      "cedula": "123456789",
      "fechaExpedicion": "10/10/2020",
      "lugarExpedicion": "BOGOTA D.C.",
      "nombre": "JUAN CARLOS PEREZ GOMEZ"
    }
  },
  "signature": {
    "dateTime": "November 3, 2026 9:16 AM",
    "message": "Certified by Verifik.co"
  }
}

Step 3: face match with liveness

Compare with liveness matches the selfie against the gallery and, if it clears compare_min_score, runs the liveness check:

import os, requests

url = "https://api.verifik.co/v2/face-recognition/compare-with-liveness"
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {os.getenv('VERIFIK_TOKEN')}"
}
payload = {
    "probe": "<base64>",
    "gallery": ["<base64>"],
    "search_mode": "FAST",
    "liveness_min_score": 0.6,
    "compare_min_score": 0.8
}

r = requests.post(url, json=payload, headers=headers)
print(r.json())

Sample 200 response:

{
  "id": "CWL01",
  "data": {
    "comparison": {
      "score": 0.88
    },
    "liveness": {
      "liveness_score": 0.91,
      "min_score": 0.6,
      "passed": true
    }
  },
  "signature": {
    "message": "Certified by Verifik.co",
    "dateTime": "November 3, 2026 9:25 AM"
  }
}

More context in our guide to liveness to prevent identity fraud.

Step 4: National Police and Procuraduría records

The National Police lookup does not need a date:

curl -G "https://api.verifik.co/v2/co/policia/consultar" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $VERIFIK_TOKEN" \
  --data-urlencode "documentType=CC" \
  --data-urlencode "documentNumber=123456789"

Sample 200 response:

{
  "data": {
    "arrayName": [
      "JUAN",
      "CARLOS",
      "PEREZ",
      "GOMEZ"
    ],
    "documentNumber": "123456789",
    "documentType": "CC",
    "firstName": "JUAN CARLOS",
    "lastName": "PEREZ GOMEZ",
    "fullName": "JUAN CARLOS PEREZ GOMEZ",
    "details": "NO TIENE ASUNTOS PENDIENTES CON LAS AUTORIDADES JUDICIALES"
  },
  "signature": {
    "dateTime": "November 3, 2026 9:20 AM",
    "message": "Certified by Verifik.co"
  },
  "id": "POL01"
}

For the Procuraduría, check hasRecord before reading the sanctions:

import axios from "axios";

const { data } = await axios.get("https://api.verifik.co/v2/co/procuraduria/antecedentes", {
  params: { documentType: "CC", documentNumber: "123456789" },
  headers: {
    Accept: "application/json",
    Authorization: `Bearer ${process.env.VERIFIK_TOKEN}`,
  },
});

console.log(data.data.hasRecord, data.data.legend);

Response codes to handle

CodeWhat it meansWhat to do
200Successful lookup with data and signatureStore id and signature as evidence
404No record found (for PEP, no match)Check the number; for lists, treat it as “no result”
409Missing or invalid parameter (MissingParameter, date format) or source unavailable (Endpoint_out_of_service)Fix the parameter or retry later
500Source or service errorRetry with backoff and send to review if it persists

Verifik - Top Identity Verification Platform

Beyond the person: vehicles and companies

If your product involves vehicles or business customers, the same token covers the complementary lookups: RUNT plate lookup, vehicle owner by plate, SOAT and technical inspection (RTM) and RUES company validation.

No code: smartCHECK

For one-off lookups without code, smartCHECK runs the same checks from the web. Each lookup, by API or web, is deducted from your plan credits, with plans from $49 a month. You can see the per-call cost of each endpoint in your dashboard once you create an account.

Common mistakes in Colombian KYC

  • Validating only the cédula number. It confirms the document exists, not that the person presenting it is the holder. Add a face match with liveness.
  • Mixing up issue date and date of birth. The Registraduría certificate, the CE and RNMC ask for the issue date in DD/MM/YYYY.
  • Sending a CE to /v2/co/cedula. That endpoint only accepts CC and PPT; the CE has its own endpoint.
  • Treating a 409 as a rejection. It may be a source that is out of service. Retry before deciding.
  • Keeping more data than needed. Keep the verification evidence and set retention periods under Law 1581.

Quick answers

What do you need to run KYC in Colombia by API? At minimum, validate the cédula with /v2/co/cedula, confirm it is valid with the Registraduría certificate and run a face match with liveness. Depending on risk, add PEP and background checks.

What does the cédula lookup return? Full name, first names, last names, document number and type, plus a Verifik signature with the date and time of the lookup.

How do I know whether a cédula is valid? With /v2/co/registraduria/certificado, sending the number and the issue date. The novedad field shows the status, for example VIGENTE.

Which background records can I check by API? National Police, corrective measures (RNMC), Procuraduría, Contraloría and INPEC, plus the politically exposed persons list.

How do I verify a foreign resident in Colombia? With /v2/co/foreigner-id/ce for the foreigner ID card, or with /v2/co/cedula and documentType=PPT for the Temporary Protection Permit.

How much does it cost? Each lookup uses smartCHECK credits, with plans from $49 a month.

Build your KYC flow for Colombia

With these lookups you cover citizens, foreign residents, drivers and politically exposed persons, and every response carries a Verifik signature you can keep as evidence. Read the Colombia identity documentation and run your first tests.

Ready to get started? Create your free Verifik account or book a demo to see how to add KYC to your onboarding for Colombian customers.

Johan Castellanos - CEO Verifik

Frequently Asked Questions (FAQs)

➖

What do you need to run KYC in Colombia by API?

At minimum, validate the cédula with /v2/co/cedula, confirm it is valid with the Registraduría certificate and run a face match with liveness. Depending on the product's risk, add the politically exposed persons (PEP) lookup and background checks.

➕

What does Verifik's cédula lookup return?

Full name, first names, last names, document number and type (CC or PPT), plus a Verifik signature with the date and time of the lookup and an id you can store as evidence.

➕

How do I know whether a cédula is valid at the Registraduría?

With GET /v2/co/registraduria/certificado, sending the number and the issue date in DD/MM/YYYY format. The novedad field shows the status, for example VIGENTE, and the response includes the PDF certificate.

➕

Which background records can be checked by API in Colombia?

National Police (/v2/co/policia/consultar), RNMC corrective measures (/v2/co/policia/rnmc), Procuraduría, Contraloría and INPEC, plus the politically exposed persons list.

➕

How do I verify a foreign resident in Colombia?

With GET /v2/co/foreigner-id/ce for the foreigner ID card, sending the number and issue date, or with /v2/co/cedula and documentType=PPT for the Temporary Protection Permit.

➕

How much does KYC by API cost with Verifik?

Each lookup is deducted from your smartCHECK plan credits, with plans from $49 a month. The per-call cost of each endpoint shows in your dashboard once you create an account.