Introduction
KaziTrust est un Hub de Confiance SaaS B2B qui abstrait la complexité des API réseau Nokia CAMARA derrière une interface unifiée, propulsée par des agents IA. Permettez à votre application de détecter la fraude mobile (SIM Swap, usurpation d'identité) et de vérifier l'identité de vos utilisateurs en quelques lignes de code, sans jamais gérer directement les opérateurs télécoms.
Bienvenue sur la documentation de l'API KaziTrust
KaziTrust démocratise l'accès aux capacités avancées des réseaux télécoms en Afrique subsaharienne. Notre plateforme orchestre simultanément plusieurs signaux CAMARA de Nokia — SIM Swap, Number Verification, KYC Match et Location Verification — et vous renvoie une décision métier claire et actionnable en temps réel.
Ce que vous pouvez faire avec cette API
- 🔐 Anti-Fraude & SIM Swap : Détectez les échanges de carte SIM suspects avant d'approuver une transaction ou un prêt. Recevez un score de confiance et un motif de rejet précis.
- 📍 Vérification de Localisation : Confirmez silencieusement la cohérence géographique d'un utilisateur via le réseau, sans GPS ni consentement intrusif.
- 🪪 KYC & Correspondance d'Identité : Vérifiez qu'un numéro de téléphone correspond bien à l'identité déclarée par l'utilisateur (nom, date de naissance, etc.).
- 📲 Vérification de Numéro (Silent Auth) : Remplacez vos SMS OTP coûteux et vulnérables par une vérification silencieuse du numéro via le réseau de l'opérateur.
- 📊 Score de Confiance Global : Notre agent IA analyse tous ces signaux en parallèle et renvoie une décision unifiée (ex: "Score 85 % — Approuvé" ou "Rejeté — SIM Swap détecté il y a 2 h").
Cas d'usage typiques
| Secteur | Cas d'usage |
|---|---|
| Micro-crédit / IMF | Approbation de prêt instantanée avec vérification SIM + localisation |
| E-commerce & Paiements | Blocage automatique des transactions à haut risque |
| Onboarding digital | Remplacement des OTP SMS par une auth silencieuse |
| Mobile Money | Protection des transferts contre l'usurpation d'identité |
Authentification
Toutes les requêtes doivent inclure votre clé API KaziTrust dans le header Authorization :
Authorization: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Obtenez ou régénérez vos clés depuis votre Tableau de Bord Tenant → Mes Services API → Clés API.
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.
Obtenez votre clé API depuis le Tableau de Bord Tenant → Management → Mes Services API → Clés API.
Toutes les clés KaziTrust sont préfixées kz_ suivi de 32 caractères alphanumériques.
Chaque clé est liée à un tenant isolé (votre entreprise) et ne donne accès qu'à vos données.
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.