MENU navbar-image

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.

🌐 Read in English

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

Cas d'usage typiques

🧪 Matrice de tests sandbox Nokia
🔴 Rejet (Score 2)
+99999901000
SIM Swap récent < 24h
🔴 Rejet (Score 2)
+99999992000
Numéro inactif ou porté
🟠 Analyse IA
+99999991000
Roaming hors zone CEDEAO (Hongrie)
🟢 Approuvé
+99999991001
Usage normal (Signaux stables)
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
}
 

Request      

POST api/v1/trust/analyze

Headers

Authorization        

Example: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

X-KaziTrust-Version        

Example: v1

Body Parameters

phone_number   string     

Le numéro au format E.164. Example: +22961000000

context   object  optional    

Contexte métier optionnel pour affiner l'analyse.

transaction_amount   number  optional    

Montant de la transaction en cours. Example: 150000

transaction_currency   string  optional    

Devise. Example: XOF

ip_address   string  optional    

IP de l'utilisateur final. Example: 197.234.10.1

user_agent   string  optional    

User-Agent du device. Example: Mozilla/5.0...

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 }
}
 

Request      

GET api/v1/trust/logs

Headers

Authorization        

Example: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

X-KaziTrust-Version        

Example: v1

Query Parameters

per_page   integer  optional    

Résultats par page (max 100). Example: 20

decision   string  optional    

Filtrer par décision (approve/reject/manual_review). Example: reject

from   string  optional    

Date de début (Y-m-d). Example: 2026-05-01

until   string  optional    

Date de fin (Y-m-d). Example: 2026-05-31

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."
}
 

Request      

GET api/v1/trust/logs/{requestId}

Headers

Authorization        

Example: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

X-KaziTrust-Version        

Example: v1

URL Parameters

requestId   string     

UUID de la requête. Example: uuid-v4

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"
}
 

Request      

GET api/v1/trust/quota

Headers

Authorization        

Example: Bearer kz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

X-KaziTrust-Version        

Example: v1

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"
}
 

Request      

GET api/v1/status

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

X-KaziTrust-Version        

Example: v1