API de résolution
Le seul endpoint que votre application appelle au runtime pour obtenir le contexte d'un tenant.
Authentification
L'API de résolution est authentifiée par la clé API de votre Application (pas par un JWT utilisateur).
Authorization: Bearer sk_acme_AbCdEf...
SaaSes en déduit l'Application et l'Organisation, et scope automatiquement toutes les requêtes à ce contexte. Une app ne peut pas résoudre un tenant d'une autre app — même par accident.
Trois endpoints, une seule réponse
Tous renvoient le même objet Resolved Tenant. Choisissez celui qui correspond à votre modèle de tenancy.
Par tenant ID
/api/resolve/by-tenant-id?tenantId={id}Pour les modèles TENANT_ID_SINGLE_DB, PATH_PARAM, HEADER.
Par sous-domaine
/api/resolve/by-subdomain?subdomain={sub}Pour les modèles SUBDOMAIN_SINGLE_DB et SUBDOMAIN_MULTI_DB.
Par slug du tenant
/api/resolve/by-slug?slug={slug}Lookup par le slug global du ManagedTenant. Pratique pour de l'outillage admin.
Forme de la réponse (200)
{
"tenantId": "casaride",
"globalTenantId": "uuid",
"tenantName": "Casa Ride SARL",
"status": "ACTIVE",
"subscriptionStatus": "ACTIVE",
"paymentStatus": "PAID",
"plan": { "id": "uuid", "name": "Pro" },
"effectiveQuotas": {
"maxVehicles": 30,
"maxUsers": 4
},
"features": {
"advancedReports": true,
"apiAccess": false
},
"routingConfig": {
"tenantId": "casaride"
}
}Mise en cache : obligatoire
Ne tapez pas SaaSes à chaque requête HTTP
Côté SaaSes, les lookups clé API → Application sont également mis en cache en mémoire pendant 60 secondes pour éviter un round-trip DB à chaque appel.
Erreurs possibles
403 — Tenant ou souscription bloqué
{
"error": "TENANT_SUSPENDED",
"message": "Tenant casaride is suspended"
}Codes possibles : TENANT_SUSPENDED, TENANT_CANCELLED, SUBSCRIPTION_SUSPENDED, SUBSCRIPTION_EXPIRED, SUBSCRIPTION_TRIAL_EXPIRED.
404 — Pas de souscription
Aucune TAS ne correspond à la requête pour cette Application.
429 — Quota d'appels dépassé
{
"error": "API_QUOTA_EXHAUSTED",
"resetAt": "2026-06-01T00:00:00Z"
}Vous avez atteint apiCallsPerMonth de votre plan SaaSes. Upgradez ou attendez le 1er du mois suivant.
Exemple d'intégration côté app
Pseudo-code Java (Spring Boot) côté app downstream :
// Au démarrage de session
ResolvedTenant tenant = saasesClient.resolveByTenantId(jwt.tenantId);
sessionCache.put(sessionId, tenant);
// Avant chaque action métier sensible
ResolvedTenant t = sessionCache.get(sessionId);
int max = (int) t.effectiveQuotas.get("maxVehicles");
if (currentVehicleCount() >= max) {
throw new QuotaExceededException("maxVehicles", max);
}
// À la réception d'un webhook subscription.plan_changed
sessionCache.invalidateByTenant(payload.tenantSlug);Renvoyez routingConfig à votre couche d'accès aux données
SUBDOMAIN_MULTI_DB, le routingConfig contient les credentials de la base. Passez-les à votre DataSource resolver pour activer la bonne connexion par requête.