L'API TAAMA expose, à un site web externe, le même moteur de réservation que l'application TAAMA : recherche d'itinéraires, réservation, paiement et suivi — pour la billetterie voyageurs (bus, train, vols locaux), les colis et le fret. Elle est faite pour être appelée serveur à serveur, depuis le backend du site qui l'intègre (jamais directement depuis le navigateur d'un visiteur).
Chaque requête vers public_api.php doit porter deux en-têtes HTTP, obtenus depuis l'onglet API TAAMA de ton tableau de bord :
| En-tête | Rôle |
|---|---|
X-Taama-Api-Key | Identifiant public de ton abonnement (commence par ak_live_). |
X-Taama-Api-Secret | Secret privé, affiché une seule fois à la génération ou régénération — ne doit jamais apparaître dans du code exécuté côté navigateur. |
public_api.php n'envoie volontairement aucun en-tête CORS : un navigateur ne peut pas l'appeler directement, ce qui protège ton secret même en cas d'erreur d'intégration.Une authentification absente ou invalide renvoie HTTP 401 ; une licence expirée ou désactivée renvoie HTTP 403 avec un message explicite.
URL de base : https://api.taama.vip/public_api.php
Chaque action se passe dans le paramètre action. Deux formats acceptés :
Content-Type: application/json) — recommandé.Toute réponse est un JSON {"ok": true|false, "data": ..., "error": "..."}, en HTTP 200 dans la plupart des cas (le champ ok porte le résultat réel) — sauf pour un problème d'authentification (401) ou de licence (403).
Chaque abonné a un périmètre fixé à l'activation, non modifiable par l'API elle-même :
| Scope | Qui | Effet |
|---|---|---|
own_company | Compagnie de transport | Ne voit et ne peut vendre que ses propres itinéraires/convois/services colis/fret. |
global | Agent de voyage | Voit et peut vendre pour toutes les compagnies actives sur TAAMA. |
De plus, chaque réservation/colis/fret créé via l'API est marqué avec l'identifiant de l'abonné qui l'a créé : un abonné ne peut ensuite consulter, payer ou annuler que ce qu'il a lui-même créé — isolation totale, y compris entre deux sites d'une même compagnie.
metaPoint de départ de toute intégration : villes desservies, compagnies visibles pour cet abonné, devise, disponibilité de Paystack.
Aucun paramètre requis. Réponse : currency, platformName, scope, companies[], cities[], vehicleTypes, paystackEnabled, paystackPublicKey, cancellationCashFeePct, parcelCollectionFlatFee, freightCollectionFlatFee, freightDeliveryFlatFee, freightRateTypes.
routes.search| Paramètre | Requis | Description |
|---|---|---|
originCity | Oui | Ville de départ. |
destinationCity | Oui | Ville d'arrivée. |
type | Non | bus (défaut) · train · avion · fret. |
Renvoie les itinéraires actifs correspondants, avec routeId, reversed (si le trajet retour a été trouvé), company et classes[] (tarifs).
routes.convois| Paramètre | Requis | Description |
|---|---|---|
routeId | Oui | Identifiant renvoyé par routes.search. |
reversed | Non | Sens du trajet (voir routes.search). |
date | Oui | Date du voyage, AAAA-MM-JJ. |
Renvoie les départs (convois) disponibles à cette date, avec places restantes déjà calculées.
routes.seatmap| Paramètre | Requis | Description |
|---|---|---|
convoiId | Oui | Identifiant renvoyé par routes.convois. |
date | Oui | Date du voyage. |
classId | Non | Pour renvoyer le prix par siège si la classe est connue. |
Renvoie seatMap.enabled (le plan de sièges est-il activé pour ce convoi ?) et seatMap.seats[] le cas échéant.
bookings.createCrée une réservation en aller simple (voir limitations pour l'aller-retour). Un convoiId précis est obligatoire.
| Paramètre | Requis | Description |
|---|---|---|
routeId, classId, convoiId, travelDate | Oui | Résultat de routes.search/routes.convois. |
quantity | Non | Nombre de passagers (1 à 20, défaut 1). |
seatNumbers | Selon plan de sièges | Tableau d'un numéro de siège par passager — obligatoire si seatMap.enabled. |
contactName, contactPhone | Oui | Acheteur — sert à créer/retrouver son compte TAAMA. Téléphone au format +225xxxxxxxxx ou chiffres seuls (8 à 15 caractères). |
contactEmail | Non | Si absent, un code PIN est généré (voir la réponse, champ newPin) — à transmettre toi-même au client. |
emergencyContactPhone | Non | Défaut : contactPhone. |
passengerNames | Non | Tableau d'un nom par passager (défaut : contactName). |
passengerCivility[], passengerPieceType[], passengerPieceNumber[], passengerFirstName[], passengerLastName[] | Non | Un tableau par champ, indexé comme quantity (ex. passengerFirstName: ["Awa","Yao"]). |
boardingSalePointId | Non | Point d'embarquement alternatif, parmi les arrêts de l'itinéraire. |
Réponse : bookings[] (une entrée par passager, chacune avec ref, status: "en_attente_paiement", price) et contact (dont newPin si généré).
scope: global), la commission de parrainage habituelle est créditée automatiquement dès le paiement confirmé — rien à faire de spécial côté intégration.bookings.getParamètre : id. Renvoie le récapitulatif du billet (uniquement s'il a été créé par ton abonnement).
bookings.pay| Paramètre | Requis | Description |
|---|---|---|
ids (ou id) | Oui | Un ou plusieurs identifiants de réservation (billets d'un même groupe). |
method | Oui | paystack ou wave. |
reference | Oui | Référence de la transaction à vérifier. |
paystack : la référence est revérifiée serveur à serveur directement auprès de Paystack (statut ET montant) — jamais sur la seule foi du navigateur. wave (ou tout paiement direct) : la référence est enregistrée comme preuve à vérifier, le billet passe preuve_a_verifier et la compagnie la confirme depuis son tableau de bord existant.
bookings.cancelParamètre : id. Applique exactement la politique d'annulation configurée par la compagnie (remboursement en crédit ou en espèces, selon ses réglages) — aucun moyen de la contourner via l'API.
parcels.servicesParamètres : originCity, destinationCity (requis). Renvoie les services de livraison disponibles, chacun avec ses categories[] et tarifs.
parcels.create| Paramètre | Requis | Description |
|---|---|---|
serviceId, originCity, destinationCity | Oui | Résultat de parcels.services. |
categoryId | Non | Sinon le tarif de base du service s'applique (forfait ou au kg selon weight). |
senderName, senderPhone | Oui | Expéditeur. |
senderEmail | Non | — |
recipientName, recipientPhone | Oui | Destinataire. |
description, weight | Non | Utile si tarification au kg. |
declaredValue | Non | Déclenche une assurance calculée automatiquement. |
collectionRequested, collectionAddress | Non | Enlèvement à domicile (adresse requise si demandé). |
parcels.payParamètres : id, method (paystack|wave), reference — même logique de vérification que bookings.pay.
parcels.getParamètre : id. Renvoie le colis avec son historique de suivi (trackingEvents).
freight.create| Paramètre | Requis | Description |
|---|---|---|
convoiId | Oui | Convoi de type fret (résultat de routes.convois pour un itinéraire type=fret). |
rateType, quantity | Oui | Type de tarif proposé par le convoi (poids, volume...) et quantité correspondante. |
goodsDescription, travelDate | Oui | — |
goodsCategory, packageCount | Non | — |
contactName, contactPhone, recipientName, recipientPhone | Oui | Expéditeur et destinataire. |
collectionRequested/collectionAddress, deliveryRequested/deliveryAddress | Non | Enlèvement et/ou livraison à domicile (adresse requise si demandé). |
declaredValue | Non | Assurance calculée automatiquement. |
freight.payMêmes paramètres et logique que bookings.pay/parcels.pay.
freight.getParamètre : id.
| Code HTTP | Signification |
|---|---|
200 | Requête traitée — regarder le champ ok du JSON pour le résultat réel. |
401 | En-têtes d'authentification absents ou clé/secret invalides. |
403 | Authentification valide mais licence inactive, expirée ou suspendue. |
Les tentatives d'authentification invalides répétées sont limitées en débit (anti brute-force) par clé publique et par IP — une intégration normale ne les rencontrera jamais.
Recherche d'itinéraires en curl :
curl -X POST "https://api.taama.vip/public_api.php?action=routes.search" \
-H "X-Taama-Api-Key: ak_live_xxxxxxxxxxxx" \
-H "X-Taama-Api-Secret: sk_live_xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"originCity":"Abidjan","destinationCity":"Bouaké","type":"bus"}'
Le site modèle fourni encapsule tout appel dans une seule fonction (lib/ApiClient.php) :
function taamaApi($action, $params = []) {
$ch = curl_init(TAAMA_API_URL . '?action=' . urlencode($action));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($params),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Taama-Api-Key: ' . TAAMA_API_KEY,
'X-Taama-Api-Secret: ' . TAAMA_API_SECRET,
],
]);
$raw = curl_exec($ch);
curl_close($ch);
return json_decode($raw, true) ?: ['ok' => false, 'error' => 'Réponse invalide.'];
}
bookings.create (un par sens), avec le même contact.convoiId précis (donc un horaire) est toujours requis, contrairement à l'application TAAMA elle-même.