Introduction
KaziTrust is a B2B SaaS Trust Hub that abstracts the complexity of Nokia CAMARA network APIs behind a unified, AI-powered interface. Integrate telecom-grade fraud detection and identity verification into your application in just a few lines of code — no direct operator integration required.
Welcome to the KaziTrust API Documentation
KaziTrust democratizes access to advanced telecom network capabilities across Sub-Saharan Africa. Our platform simultaneously orchestrates multiple Nokia CAMARA signals — SIM Swap, Number Verification, KYC Match, and Location Verification — and returns a clear, actionable business decision in real time.
What you can do with this API
- 🔐 Anti-Fraud & SIM Swap Detection: Detect suspicious SIM card swaps before approving a transaction or loan. Receive a trust score and a precise rejection reason.
- 📍 Location Verification: Silently confirm a user's geographic consistency via the network — no GPS, no intrusive consent required.
- 🪪 KYC & Identity Matching: Verify that a phone number matches the identity declared by the user (name, date of birth, etc.).
- 📲 Number Verification (Silent Auth): Replace costly, vulnerable SMS OTPs with silent phone number verification via the operator's network.
- 📊 Global Trust Score: Our AI agent analyzes all these signals in parallel and returns a unified decision (e.g., "Score 85% — Approved" or "Rejected — SIM Swap detected 2h ago").
Typical Use Cases
| Sector | Use Case |
|---|---|
| Micro-lending / MFIs | Instant loan approval with SIM + location verification |
| E-commerce & Payments | Automatic blocking of high-risk transactions |
| Digital Onboarding | Replacing SMS OTPs with silent authentication |
| Mobile Money | Protecting transfers against identity theft |
Authentication
All requests must include your KaziTrust API key in the Authorization header:
Authorization: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Generate or rotate your keys from your Tenant Dashboard → My API Services → API Keys.
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
Get your API key from the Tenant Dashboard → Management → My API Services → API Keys.
All KaziTrust keys are prefixed with kz_ followed by 32 alphanumeric characters.
Each key is tied to an isolated tenant (your company) and only grants access to your data.
Available environments:
| Environment | Key prefix | Base URL |
|---|---|---|
| Production | kz_live_ | https://kazitrust.digitalconceptcenter.com/ |
Analyse de confiance
Analysez la fiabilité d'un numéro de téléphone mobile via les signaux réseau Nokia CAMARA et l'intelligence artificielle configurée sur votre application.
Analyser un numéro
requires authentication
Lance une analyse complète d'un numéro de téléphone : collecte des signaux réseau Nokia CAMARA (SIM Swap, localisation, statut réseau), puis analyse par le moteur IA configuré sur votre application.
Example request:
curl --request POST \
"https://kazitrust.digitalconceptcenter.com/api/v1/trust/analyze" \
--header "Authorization: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "X-KaziTrust-Version: v1" \
--data "{
\"phone_number\": \"+22961000000\",
\"context\": {
\"transaction_amount\": 150000,
\"transaction_currency\": \"XOF\",
\"ip_address\": \"197.234.10.1\",
\"user_agent\": \"Mozilla\\/5.0...\"
}
}"
const url = new URL(
"https://kazitrust.digitalconceptcenter.com/api/v1/trust/analyze"
);
const headers = {
"Authorization": "Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
"X-KaziTrust-Version": "v1",
};
let body = {
"phone_number": "+22961000000",
"context": {
"transaction_amount": 150000,
"transaction_currency": "XOF",
"ip_address": "197.234.10.1",
"user_agent": "Mozilla\/5.0..."
}
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://kazitrust.digitalconceptcenter.com/api/v1/trust/analyze';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-KaziTrust-Version' => 'v1',
],
'json' => [
'phone_number' => '+22961000000',
'context' => [
'transaction_amount' => 150000.0,
'transaction_currency' => 'XOF',
'ip_address' => '197.234.10.1',
'user_agent' => 'Mozilla/5.0...',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://kazitrust.digitalconceptcenter.com/api/v1/trust/analyze'
payload = {
"phone_number": "+22961000000",
"context": {
"transaction_amount": 150000,
"transaction_currency": "XOF",
"ip_address": "197.234.10.1",
"user_agent": "Mozilla\/5.0..."
}
}
headers = {
'Authorization': 'Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-KaziTrust-Version': 'v1'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (200):
{
"request_id": "uuid-v4",
"phone_number": "+22961000000",
"decision": "approve",
"score": 87,
"reasoning": "Aucun swap SIM détecté. Numéro actif depuis 18 mois...",
"nokia_signals": {
"sim_swap_detected": false,
"sim_change_days_ago": null,
"is_roaming": false,
"network_status": "active",
"location_country": "BJ"
},
"latency_ms": 1243,
"token_count": 387,
"cost_estimate": 0.000193,
"analyzed_at": "2026-05-03T12:00:00Z"
}
Example response (422):
{
"error": "validation_failed",
"message": "Le numéro doit être au format E.164.",
"errors": {
"phone_number": [
"Format invalide."
]
}
}
Example response (429):
{
"error": "quota_exceeded",
"message": "Quota mensuel atteint (500 requêtes).",
"used": 500,
"limit": 500
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Historique des analyses
requires authentication
Retourne les dernières analyses effectuées par cette application (max 100).
Example request:
curl --request GET \
--get "https://kazitrust.digitalconceptcenter.com/api/v1/trust/logs?per_page=20&decision=reject&from=2026-05-01&until=2026-05-31" \
--header "Authorization: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "X-KaziTrust-Version: v1"const url = new URL(
"https://kazitrust.digitalconceptcenter.com/api/v1/trust/logs"
);
const params = {
"per_page": "20",
"decision": "reject",
"from": "2026-05-01",
"until": "2026-05-31",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
"X-KaziTrust-Version": "v1",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://kazitrust.digitalconceptcenter.com/api/v1/trust/logs';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-KaziTrust-Version' => 'v1',
],
'query' => [
'per_page' => '20',
'decision' => 'reject',
'from' => '2026-05-01',
'until' => '2026-05-31',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://kazitrust.digitalconceptcenter.com/api/v1/trust/logs'
params = {
'per_page': '20',
'decision': 'reject',
'from': '2026-05-01',
'until': '2026-05-31',
}
headers = {
'Authorization': 'Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-KaziTrust-Version': 'v1'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"data": [...],
"meta": { "total": 42, "per_page": 20, "current_page": 1 }
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Détail d'une analyse
requires authentication
Example request:
curl --request GET \
--get "https://kazitrust.digitalconceptcenter.com/api/v1/trust/logs/uuid-v4" \
--header "Authorization: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "X-KaziTrust-Version: v1"const url = new URL(
"https://kazitrust.digitalconceptcenter.com/api/v1/trust/logs/uuid-v4"
);
const headers = {
"Authorization": "Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
"X-KaziTrust-Version": "v1",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://kazitrust.digitalconceptcenter.com/api/v1/trust/logs/uuid-v4';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-KaziTrust-Version' => 'v1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://kazitrust.digitalconceptcenter.com/api/v1/trust/logs/uuid-v4'
headers = {
'Authorization': 'Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-KaziTrust-Version': 'v1'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": "unauthorized",
"message": "Clé API introuvable ou révoquée."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Quota de l'application
requires authentication
Retourne le quota mensuel et la consommation actuelle.
Example request:
curl --request GET \
--get "https://kazitrust.digitalconceptcenter.com/api/v1/trust/quota" \
--header "Authorization: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "X-KaziTrust-Version: v1"const url = new URL(
"https://kazitrust.digitalconceptcenter.com/api/v1/trust/quota"
);
const headers = {
"Authorization": "Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
"X-KaziTrust-Version": "v1",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://kazitrust.digitalconceptcenter.com/api/v1/trust/quota';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-KaziTrust-Version' => 'v1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://kazitrust.digitalconceptcenter.com/api/v1/trust/quota'
headers = {
'Authorization': 'Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-KaziTrust-Version': 'v1'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200):
{
"plan": "Starter",
"limit": 2000,
"used": 147,
"remaining": 1853,
"resets_at": "2026-06-01"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Statut
Vérifier l'état opérationnel de l'API.
Statut de l'API
Retourne l'état de l'API et la version courante. Aucune authentification requise.
Example request:
curl --request GET \
--get "https://kazitrust.digitalconceptcenter.com/api/v1/status" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "X-KaziTrust-Version: v1"const url = new URL(
"https://kazitrust.digitalconceptcenter.com/api/v1/status"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"X-KaziTrust-Version": "v1",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://kazitrust.digitalconceptcenter.com/api/v1/status';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-KaziTrust-Version' => 'v1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://kazitrust.digitalconceptcenter.com/api/v1/status'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-KaziTrust-Version': 'v1'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200):
{
"status": "operational",
"version": "1.0.0",
"timestamp": "2026-05-03T12:00:00Z"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.