tano-sdk
La bibliothèque Python officielle de l'API de vérification d'identité Tano.
- Signature des requêtes (HMAC-SHA256, v2) et protection contre le rejeu, prises en charge
- Clé d'idempotence sur chaque écriture, conservée d'un réessai à l'autre
- Réessais automatiques sur coupure réseau,
429et5xx, en respectantRetry-After - Vérification de la signature des webhooks
- Typée (
py.typed), sans dépendance : la bibliothèque standard seulement
Prérequis
Python 3.9 ou plus récent.
Installation
pip install tano-sdk
Démarrage rapide
import os
from tano_sdk import Tano
tano = Tano(os.environ["TANO_API_KEY"]) # tano_sandbox_… ou tano_prod_…
case = tano.cases.create(
flow_name="onboarding_individual_ci",
country="CI",
external_ref="customer-42", # un seul dossier par intention, même rejouée
declared={"surname": "KOUASSI", "given_names": "Awa"},
)
session = tano.sessions.create(
case_id=case["id"],
locale="fr",
return_url="https://votre-site.example/verification/terminee",
)
print(session["url"]) # rendue une seule fois, ne la stockez pas
results = tano.cases.results(case["id"])
if results["state"] == "approved":
...
Configuration
Tano(
api_key, # obligatoire ; l'environnement se lit dans le préfixe de la clé
base_url="https://api.tano.africa",
timeout=30.0, # secondes, par tentative
max_retries=2,
transport=urllib_transport, # remplaçable : tout appelable HttpRequest -> HttpResponse
)
Référence de l'API
| Méthode | Route | Notes |
|---|---|---|
cases.create(flow_name, country, external_ref=None, declared=None, idempotency_key=None) |
POST /v1/cases |
Signée |
cases.retrieve(case_id) |
GET /v1/cases/{id} |
État, étapes et décision |
cases.list(q, external_ref, status, country, created_after, created_before, limit, cursor) |
GET /v1/cases |
Une page : data, has_more, next_cursor |
cases.list_all(**filters) |
toutes les pages | Parcourt toutes les pages |
cases.results(case_id) |
GET /v1/cases/{id}/results |
state, décision, reprise, contrôles, pièces, sans donnée personnelle |
cases.data(case_id) |
GET /v1/cases/{id}/data |
Données personnelles. Permission personal_data ; chaque lecture est journalisée |
cases.image(case_id, piece_id) |
GET /v1/cases/{id}/images/{piece_id} |
(content_type, bytes). Permission personal_data |
cases.decide(case_id, outcome, reason_code, steps=None, comment=None) |
POST /v1/cases/{id}/decision |
approve, reject ou resubmit un dossier en revue. Permission decisions |
cases.erase(case_id) |
POST /v1/cases/{id}/erasure |
Effacer les données personnelles d'un dossier clos. Permission personal_data |
sessions.create(case_id, locale=None, lifetime_minutes=None, return_url=None) |
POST /v1/sessions |
L'url du parcours, rendue une seule fois |
sandbox.submit(case_id) |
POST /v1/sandbox/cases/{id}/submit |
Clés de bac à sable seulement ; le nom de famille déclaré choisit l'issue |
request(method, path, body=None, query=None, idempotency_key=None) |
toute route | Appel brut, avec signature, idempotence et réessais |
results["state"] vaut awaiting_applicant, processing, in_review,
resubmission_requested (pas un refus), approved, rejected (définitif), expired ou
abandoned.
Webhooks
Passez le corps brut (request.get_data(), await request.body()).
from flask import Flask, abort, request
from tano_sdk import WebhookSignatureError, verify_webhook
app = Flask(__name__)
@app.post("/webhooks/tano")
def tano_webhook():
try:
event = verify_webhook(
request.get_data(), request.headers, os.environ["TANO_WEBHOOK_SECRET"]
)
except WebhookSignatureError:
abort(401)
# Écartez les doublons avec event["delivery_id"], mettez en file, répondez vite.
return "", 204
Erreurs
| Exception | Quand | Attributs utiles |
|---|---|---|
TanoApiError |
L'API a répondu une erreur | status, type, code (stable), field, request_id, doc_url |
TanoConnectionError |
Pas de réponse après les réessais | Rejouer avec la même idempotency_key est sans risque |
WebhookSignatureError |
Une livraison n'a pas passé la vérification | Répondez 401 |
TanoError |
Classe de base, par exemple une clé mal formée |
Support
Documentation : https://docs.tano.africa · Support : support@tano.africa · Sécurité : security@tano.africa
Licence
MIT © Qalebasse
Metadata
Release files for tano-sdk 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tano_sdk-0.1.0.tar.gz | 50.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tano_sdk-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 62.4 kB
Release files / tano_sdk-0.1.0.tar.gz
| Download URL | tano_sdk-0.1.0.tar.gz |
|---|---|
| Size | 50.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cbbb9128c1e43c2bea6c148dc6a1d19c0f7be2cc57f2b4eae3b4b851d23a1566
|
|
BLAKE2b-256 checksum How to use checksums |
21eb2aa1c71728d3708b3d9f8d02b30954d3900c6e32038cd1a5a38ef7cacd14
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / tano_sdk-0.1.0-py3-none-any.whl
| Download URL | tano_sdk-0.1.0-py3-none-any.whl |
|---|---|
| Size | 11.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
838109d29544e182a3f23aab0eb07b8ad121a335e5e3d37e77cdb94dc529bbd2
|
|
BLAKE2b-256 checksum How to use checksums |
0fb31f02c7a6b8725f840fbc4712bd86d61519d537206e11d4f303ddf714b18c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency log