MENU navbar-image

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.

🌐 Lire en Français

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

Typical Use Cases

🧪 Nokia Sandbox Test Matrix
🔴 Reject (Score 2)
+99999901000
Recent SIM Swap detected (< 24h)
🔴 Reject (Score 2)
+99999992000
Inactive or Ported phone number
🟠 Manual Review
+99999991000
International Roaming (Hungary / Non-ECOWAS)
🟢 Approved
+99999991001
Clean history (Stable device signals)
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
}
 

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