Short answer: To vet a driver in Colombia before dispatching a load, check six things by API: identity with face match and liveness, licence status and category in RUNT (/v2/co/runt/conductor), SIMIT fines and suspensions, SISCONMP training if they haul dangerous goods, the National Police record, and the vehicle’s SOAT and RTM.
If you run a carrier, a 3PL, a last-mile fleet or a delivery app, the question is not only “who is this person?”. It also matters whether their licence covers that vehicle, whether it has expired or been suspended, and whether the truck is allowed on the road. This guide builds that flow with Verifik’s APIs, step by step, with code samples, the fields to read and a decision table your operations team can use the same day.
Checklist: what to verify before dispatching a driver
These are the six checks, in the order that makes sense:
- Identity: the cédula exists and the person in front of you is its holder (a live selfie with liveness compared against the ID photo).
- RUNT licence: status
ACTIVA, the right category for the vehicle, expiry date and any recorded suspension. - SIMIT: outstanding fines by ID number and licence suspensions or cancellations.
- SISCONMP: valid training if the driver hauls dangerous goods.
- Police record: a National Police background check.
- Vehicle: valid SOAT insurance and technical inspection (RTM) for the plate on the trip.
None of these lookups replaces your security review or your judgement, but they turn a manual check across several government portals into calls to a single API, with signed responses you can keep as evidence.
If the use case is clear, create an account and test the endpoint from your own code.
Why now: peak season, fake carriers and licence changes
The last quarter puts pressure on operations. In its 15 October 2026 guide, the theft experts at Satrack explain that peak season multiplies trips, inventory on the move, urgent deliveries and exceptions. Their calendar flags dates such as Black Friday (27 November) and the long holiday weekends, and recommends reviewing the third parties and temporary vehicles that come in during order peaks.

The other risk needs no weapons. Fenix describes fake carriers (21 October 2026): someone poses as a real carrier, gets the job assigned and drives off with the goods with the paperwork in order. According to the IUMI and TAPA EMEA warnings it cites, these groups use front companies, identities of legitimate firms, stolen credentials and forged documents, and in Germany cases rose from 80 in 2022 to 266 in 2024. There are no public reports of this scheme in Colombia yet, but hiring trucks through digital freight platforms creates the same conditions. The weak point is before the vehicle leaves, when you decide who gets the load. That is where a quick driver and vehicle check makes a difference.
Delivery platforms also have a legal reason: article 26 of Law 2466 of 2025 requires them to set up a full identity recognition mechanism that individualises each digital delivery worker, while respecting habeas data.
Step 1: identity with the cédula and face match with liveness
Start by confirming that the person signing up is the holder of the document. POST /v2/face-recognition/compare-with-liveness compares a live selfie (probe) with the ID photo (gallery) and, if the match clears the threshold, runs liveness on the selfie. According to the documentation, compare_min_score accepts values from 0.67 to 0.95 and liveness_min_score defaults to 0.6.
curl -X POST "https://api.verifik.co/v2/face-recognition/compare-with-liveness" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $VERIFIK_TOKEN" \
-d '{
"probe": "<selfie_base64>",
"gallery": ["<id_photo_base64>"],
"search_mode": "ACCURATE",
"liveness_min_score": 0.6,
"compare_min_score": 0.8
}'The response includes comparison.score and liveness.passed. To also validate the cédula against the Registraduría and screen lists, see our Colombia KYC API guide.
Step 2: RUNT licence (status, category, expiry and suspensions)
GET https://api.verifik.co/v2/co/runt/conductor queries RUNT with the driver’s document type and number. It accepts CC, CE, PA (passport) and PPT; for passports, primerApellido (first surname) is required. The documentation describes two billing modes since 1 September 2026:
- Premium: you omit
primerApellidoand Verifik resolves the surname internally. - Basic: you send
primerApellidoand the name lookup is skipped. It is the same rate as the v3 route, where the surname is required.
Premium lookup (no surname):
curl -G "https://api.verifik.co/v2/co/runt/conductor" \
-H "Accept: application/json" \
-H "Authorization: Bearer $VERIFIK_TOKEN" \
--data-urlencode "documentType=CC" \
--data-urlencode "documentNumber=123456789"Basic lookup (with surname, same URL):
curl -G "https://api.verifik.co/v2/co/runt/conductor" \
-H "Accept: application/json" \
-H "Authorization: Bearer $VERIFIK_TOKEN" \
--data-urlencode "documentType=CC" \
--data-urlencode "documentNumber=123456789" \
--data-urlencode "primerApellido=GARCIA"The same call in Python:
import os, requests
url = "https://api.verifik.co/v2/co/runt/conductor"
headers = {
"Accept": "application/json",
"Authorization": f"Bearer {os.getenv('VERIFIK_TOKEN')}",
}
params = {"documentType": "CC", "documentNumber": "123456789"}
r = requests.get(url, headers=headers, params=params, timeout=60)
print(r.json())Sample 200 response from the documentation, trimmed to the fields you will use to decide:
{
"data": {
"citizenStatus": "ACTIVA",
"documentNumber": "63535709",
"documentType": "CC",
"driverStatus": "ACTIVO",
"infractions": {
"nroPazYSalvo": "840377030067",
"tieneMultas": "NO"
},
"licenses": [
{
"category": "B1",
"dueDate": "19/09/2034",
"endDateSuspension": null,
"expeditionDate": "19/09/2024",
"otExpide": "SECRETARIA DISTRITAL DE MOVILIDAD DE BOGOTA ",
"restrictions": null,
"startDateSuspension": null,
"status": "ACTIVA"
}
],
"medicalCertificates": [],
"totalLicenses": "1"
},
"signature": {
"dateTime": "October 10, 2025 7:29 PM",
"message": "Certified by Verifik.co"
},
"id": "3R2V0"
}What to read in each response:
driverStatusandcitizenStatus: the driver’s and the document’s status in RUNT.licenses[]: one entry per licence, withcategory,status(for exampleACTIVA),dueDate,restrictions,otExpide(issuing transit office) and thestartDateSuspension/endDateSuspensiondates.infractions.tieneMultas: an early flag for fines, which you then expand in SIMIT.medicalCertificatesandaptitudeCertificates: certificates linked to the driver.
The most common operational mistake is approving an ACTIVA licence in a category that does not match the vehicle. A driver can hold several categories, so compare each one with the categories your policy requires for that vehicle type. This function does the basic check:
// Turns "19/09/2034" (RUNT format) into a date
const parseRunt = (s) => {
const [d, m, y] = s.split("/").map(Number);
return new Date(y, m - 1, d);
};
// requiredCategories: the categories YOUR policy requires for that vehicle
function isFitToDrive(runtData, requiredCategories, today = new Date()) {
if (runtData.driverStatus !== "ACTIVO") return false;
return runtData.licenses.some((lic) =>
requiredCategories.includes(lic.category) &&
lic.status === "ACTIVA" &&
parseRunt(lic.dueDate) > today &&
!lic.startDateSuspension // no suspension recorded on that licence
);
}If the document is mistyped or a parameter is missing, the API returns 409; if RUNT has no record, 404 NotFound:
{
"code": "MissingParameter",
"message": "documentType must be one of: [CC, CE, PPT, PA, NIT]"
}For the endpoint on its own, read our guide to driver’s licence verification in Colombia.
Step 3: SIMIT fines and suspensions by ID number
SIMIT adds two signals that RUNT does not always show in full. GET /v2/co/simit/consultar returns a person’s multas[] (amount, plate, infractions and estadoComparendo), cursos and acuerdosPago, with amounts in Colombian pesos (documentation). GET /v2/co/simit/suspensiones focuses on licence suspensions or cancellations (documentation):
curl -G "https://api.verifik.co/v2/co/simit/suspensiones" \
-H "Accept: application/json" \
-H "Authorization: Bearer $VERIFIK_TOKEN" \
--data-urlencode "documentType=CC" \
--data-urlencode "documentNumber=123456789"Sample response from the documentation (trimmed):
{
"data": {
"documentType": "CC",
"documentNumber": "123456789",
"suspensiones": [
{
"numeroResolucion": "RES-2024-000123",
"fechaSuspension": "2024/03/15",
"estado": "VIGENTE"
}
]
},
"signature": {
"message": "Certified by Verifik.co",
"dateTime": "April 8, 2026 11:00 PM"
}
}Field names come from SIMIT and may differ from the sample, so parse the list defensively. An empty suspensiones list can mean no suspensions were found for that identity.
Step 4: SISCONMP training for dangerous goods
If the driver hauls dangerous goods, check their training in SISCONMP, the system that tracks personnel who transport hazardous materials. GET /v2/co/sisconmp/trainings takes documentType (CC, CE or PA) and documentNumber:
curl -G "https://api.verifik.co/v2/co/sisconmp/trainings" \
-H "Accept: application/json" \
-H "Authorization: Bearer $VERIFIK_TOKEN" \
--data-urlencode "documentType=CC" \
--data-urlencode "documentNumber=123456789"According to the documentation, the response includes the course (nameTraining, for example “CURSO BASICO”), the training centre, the course expirationDate, expirationDateLicense and inactive (“No” means the record is active). Block dangerous-goods dispatch if the course has expired. More detail in our SISCONMP verification guide.
Step 5: National Police record check
GET /v2/co/policia/consultar (POST also works) checks whether the person has pending matters with the judicial authorities and returns the official wording in data.details. It accepts CC, CE, PPT, PA and DP (documentation).
Two practical details: when the Police portal cannot generate the certificate online, the API still returns 200 with the in-person-service wording, and temporary source failures come back as 409 Endpoint_out_of_service. Treat both as “pending review”, not as approved. We cover this in our police record check API guide.
Step 6: the vehicle, valid SOAT and RTM
The driver can be fine while the truck is not. GET /v2/co/runt/vehiculo takes the plate and the owner’s document and returns soat and techReview objects, each with valid and dueDate (documentation). We cover it in depth in our SOAT and RTM verification API guide.
If the vehicle belongs to a third party and you don’t have the owner’s document, the RUNT plate lookup starts from the plate alone and includes the SOAT and technical inspection blocks when they exist.
How to combine the steps at onboarding and before each dispatch
Not every check repeats at the same pace. Identity and biometrics are validated at onboarding (and again if the phone or account changes). The licence, SIMIT, police record and vehicle change over time, so re-run them on a schedule, for example monthly, and before each trip when the load is high value.

This JavaScript example runs biometrics at onboarding and fires the four dispatch checks in parallel. It reuses the isFitToDrive function from step 2:
import axios from "axios";
const api = axios.create({
baseURL: "https://api.verifik.co",
headers: { Authorization: `Bearer ${process.env.VERIFIK_TOKEN}` },
timeout: 60000,
});
const doc = { documentType: "CC", documentNumber: driver.cedula };
// Onboarding: identity + biometrics (once, and again if the phone or account changes)
const { data: face } = await api.post("/v2/face-recognition/compare-with-liveness", {
probe: selfieBase64,
gallery: [idPhotoBase64],
search_mode: "ACCURATE",
});
// Before each dispatch (or monthly): licence, SIMIT, police record and vehicle in parallel
const [runt, susp, police, vehicle] = await Promise.all([
api.get("/v2/co/runt/conductor", { params: doc }),
api.get("/v2/co/simit/suspensiones", { params: doc }),
api.get("/v2/co/policia/consultar", { params: doc }),
api.get("/v2/co/runt/vehiculo", {
params: { documentType: "CC", documentNumber: owner.cedula, plate: trip.plate },
}),
]);
const fit =
isFitToDrive(runt.data.data, trip.requiredCategories) &&
vehicle.data.data.soat.valid &&
vehicle.data.data.techReview.valid;
// Store every response with its id and signature as dispatch evidenceStore the id and signature (“Certified by Verifik.co”) of each response with the transport order. If something goes wrong, you will have evidence of what you checked, when and with what result.
Decision table: from result to action
| Result | Suggested action |
|---|---|
Biometrics passed, ACTIVA licence in the required category and a future dueDate | Approve and continue with SIMIT, police record and vehicle |
Licence expired, suspended or with a startDateSuspension recorded | Block the dispatch |
| Active licence but a different category | Reassign to a compatible vehicle or block |
| SIMIT suspension, or outstanding fines above your policy limit | Manual review before assigning |
| SISCONMP course expired or inactive (dangerous goods) | Block for dangerous goods |
| Police: pending matters, in-person-service wording or 409 | Manual review; never auto-approve |
SOAT or RTM with valid set to false | The vehicle stays until renewed |
404 NotFound in RUNT | Ask for the original document and retry |
What’s next: mandatory theory exam and a points-based licence
The licence regime is changing, which strengthens the case for checking the source instead of trusting a copy of the document:
- Theory exam: under External Circular 20261010000277 from the Vice Ministry of Transport, since Monday 14 September 2026 first licences and recategorisations require passing the theory exam nationwide.
- Points-based licence: on 2 November 2026 the Ministry of Transport presented a proposal under which each driver would have a points balance that drops with each offence, and could lose the licence once it runs out. It is a proposal within the reform of the National Traffic Code and is not in force yet.
How to choose a driver vetting provider
Colombia has local vehicle-data APIs and international identity platforms. Before choosing, compare these criteria:
| Criterion | What to ask | Verifik |
|---|---|---|
| Official source | Does it query RUNT, SIMIT and the Police, or only read the document image? | Queries the official sources |
| Category and suspensions | Does it return each category with status, expiry and suspension dates? | Yes, in licenses[] |
| Dangerous goods | Does it include SISCONMP? | Yes, /v2/co/sisconmp/trainings |
| Biometrics | Does it bind the person to the document with face match and liveness? | Yes, compare-with-liveness |
| Evidence | Is every response signed and given an id? | Yes, signature and id |
| Coverage | Does it work for other countries in the region? | Several LATAM countries on the same account |
If you run logistics operations, also see our logistics solutions page.
Pricing and how to start
Lookups are paid with credits. smartCHECK plans run from $49 a month (Starter) to $129 (Basic), $299 (Plus) and $649 (Business); on the annual plan, Starter costs $490 and gives $588 in credits. You see each endpoint’s cost in your dashboard, and on /v2/co/runt/conductor the rate depends on whether you send the first surname (Basic) or not (Premium). If your team doesn’t code, smartCHECK lets you pick the service, see results in a no-code view and run bulk lookups from a CSV.
You can create your account and test the flow with your own drivers, or read the RUNT driver documentation to start integrating.




