Documentation integrateur

Reference complete de l'API Ts-Identity Customer Area.

Authentification

POST/auth/register

Inscription d'un nouvel utilisateur. Restriction de domaine email configurable, metadata libres des l'inscription.

Requete
http
{
  "email": "user@example.com",
  "password": "SecureP@ss123",
  "first_name": "Jean",
  "last_name": "Dupont",
  "metadata": { "source": "landing_page" }
}
Reponse
json
{
  "id": "usr_abc123",
  "email": "user@example.com",
  "first_name": "Jean",
  "last_name": "Dupont",
  "email_verified": false,
  "created_at": "2026-03-25T10:00:00Z"
}
POST/auth/login

Connexion avec JWT RS256 (1h) + refresh token (7j) avec rotation automatique.

Requete
http
{
  "email": "user@example.com",
  "password": "SecureP@ss123"
}
Reponse
json
{
  "access_token": "eyJhbGciOiJSUzI1NiIs...",
  "refresh_token": "d4f8a2b1-e5c6-...",
  "token_type": "Bearer",
  "expires_in": 3600
}
GET/auth/oauth/{provider}/authorize

Social login OAuth2 — Google & GitHub. Flow SPA ou redirect.

Requete
http
GET /auth/oauth/google/authorize?redirect_uri=https://app.example.com/callback
Reponse
json
{
  "authorization_url": "https://accounts.google.com/o/oauth2/auth?..."
}
GET/auth/me

Profil utilisateur complet avec 10+ champs metier et metadata libres.

Requete
http
GET /auth/me
Authorization: Bearer eyJhbGci...
Reponse
json
{
  "id": "usr_abc123",
  "email": "user@example.com",
  "first_name": "Jean",
  "last_name": "Dupont",
  "agency_name": "Immo Plus",
  "phone": "+33 6 12 34 56 78",
  "metadata": { "plan": "pro" }
}
GET/auth/public-key

Cle publique RSA 2048 bits pour validation JWT locale sans appel reseau.

Requete
http
GET /auth/public-key
Reponse
json
{
  "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBg..."
}

Achats & Abonnements

POST/purchases

Creation d'un achat (one-shot, mensuel ou annuel) via Stripe Checkout.

Requete
http
{
  "plan_code": "pro_monthly",
  "billing_mode": "SUBSCRIPTION_MONTHLY",
  "success_url": "https://app.example.com/success",
  "cancel_url": "https://app.example.com/cancel"
}
Reponse
json
{
  "id": "pur_xyz789",
  "checkout_url": "https://checkout.stripe.com/c/pay/...",
  "status": "PENDING"
}
POST/purchases/{id}/addons

Ajout d'items supplementaires sur un abonnement existant, prorata automatique.

Requete
http
{
  "plan_code": "addon_storage",
  "quantity": 1
}
Reponse
json
{
  "id": "pur_xyz789",
  "addons": [{ "plan_code": "addon_storage", "status": "ACTIVE" }]
}
POST/purchases/{id}/subscription/cancel

Annulation en fin de periode avec fenetre de grace 30 jours.

Requete
http
POST /purchases/pur_xyz789/subscription/cancel
Reponse
json
{
  "id": "pur_xyz789",
  "status": "CANCEL_PENDING",
  "cancel_at": "2026-04-25T00:00:00Z",
  "grace_period_end": "2026-05-25T00:00:00Z"
}

Plans

GET/staff/plans

Liste des plans avec support multi-devises (EUR/USD/CAD) et i18n.

Requete
http
GET /staff/plans
Authorization: Bearer eyJhbGci...
Reponse
json
[
  {
    "code": "pro",
    "title": { "fr": "Pro", "en": "Pro" },
    "description": { "fr": "Pour les SaaS en croissance" },
    "price_in_cents": {
      "monthly": { "eur": 14900, "usd": 16900, "cad": 22900 },
      "annual": { "eur": 142800, "usd": 162000 }
    },
    "enabled": true,
    "displayed": true,
    "recommended": true,
    "priority": 10
  }
]

Support

POST/support

Creation d'un ticket de support avec workflow 5 statuts, metadata et pieces jointes.

Requete
http
{
  "scope": "immo",
  "subject": "Probleme de facturation",
  "description": "Ma facture de mars ne correspond pas...",
  "attachment_ids": ["med_abc123"],
  "metadata": { "urgency": "high" }
}
Reponse
json
{
  "id": "sup_abc123",
  "status": "WAITING_FOR_SUPPORT",
  "subject": "Probleme de facturation",
  "created_at": "2026-03-25T10:00:00Z"
}
POST/support/{id}/comments

Ajout de commentaire client ou staff, avec pieces jointes optionnelles.

Requete
http
{
  "content": "Voici la capture d'ecran du probleme",
  "attachment_ids": ["med_xyz789"]
}
Reponse
json
{
  "id": "com_abc123",
  "author_type": "CLIENT",
  "content": "Voici la capture d'ecran du probleme",
  "created_at": "2026-03-25T10:30:00Z"
}

Media / Fichiers

POST/media

Upload multipart jusqu'a 10 Mo avec isolation par utilisateur (cle S3 : {userId}/{uuid}.{ext}).

Requete
http
POST /media
Content-Type: multipart/form-data

file: invoice.pdf
title: "Facture Mars 2026"
Reponse
json
{
  "id": "med_xyz789",
  "title": "Facture Mars 2026",
  "filename": "invoice.pdf",
  "size": 245760,
  "download_url": "/media/med_xyz789/download"
}
GET/media/{id}/download

Telechargement via URL pre-signee S3, valide 1 heure.

Requete
http
GET /media/med_xyz789/download
Authorization: Bearer eyJhbGci...
Reponse
json
// Redirect 302 vers URL pre-signee S3
// Location: https://s3.eu-west-3.amazonaws.com/...?X-Amz-Signature=...

API Tokens

POST/tokens

Creation de token API UUID par scope, avec metadata libres.

Requete
http
{
  "scope": "immo",
  "metadata": { "env": "production", "app": "crm" }
}
Reponse
json
{
  "token": "tsi_a1b2c3d4e5f6g7h8...",
  "scope": "immo",
  "created_at": "2026-03-25T10:00:00Z"
}
POST/oauth2/introspect

Introspection OAuth2 pour validation de token avec claims types.

Requete
http
{
  "token": "tsi_a1b2c3d4e5f6g7h8..."
}
Reponse
json
{
  "active": true,
  "scope": "immo",
  "sub": "usr_abc123",
  "metadata": { "env": "production" }
}

Stripe & Facturation

GET/stripe/invoicing

Liste des factures avec telechargement PDF direct depuis Stripe.

Requete
http
GET /stripe/invoicing
Authorization: Bearer eyJhbGci...
Reponse
json
{
  "invoices": [
    {
      "id": "inv_abc123",
      "amount": 14900,
      "currency": "eur",
      "status": "paid",
      "pdf_url": "https://pay.stripe.com/invoice/...",
      "created_at": "2026-03-01T00:00:00Z"
    }
  ]
}

Administration

GET/admin/users

Liste des utilisateurs avec gestion des scopes, activation/desactivation.

Requete
http
GET /admin/users?page=1&limit=20
Authorization: Bearer <SERVICE_API_KEY>
Reponse
json
{
  "data": [
    {
      "id": "usr_abc123",
      "email": "user@example.com",
      "active": true,
      "scopes": ["immo", "learning"]
    }
  ],
  "total": 156,
  "page": 1
}
POST/admin/migrations

Import depuis PayPal, Mollie ou GoCardless avec fenetre de grace 30 jours.

Requete
http
{
  "source": "paypal",
  "user_id": "usr_abc123",
  "external_subscription_id": "I-1234567890",
  "plan_code": "pro_monthly"
}
Reponse
json
{
  "id": "mig_abc123",
  "status": "PENDING",
  "grace_period_end": "2026-04-25T00:00:00Z"
}

Erreurs & Codes

INFOFormat des erreurs

Toutes les erreurs suivent un format structure avec code, message et details.

Requete
http
// Toute requete invalide retourne :
Reponse
json
{
  "status": 422,
  "error": "VALIDATION_ERROR",
  "message": "Le champ email est requis",
  "details": {
    "field": "email",
    "rule": "required"
  }
}

// Codes HTTP utilises :
// 400 - Bad Request
// 401 - Unauthorized
// 403 - Forbidden
// 404 - Not Found
// 409 - Conflict
// 422 - Validation Error
// 429 - Rate Limited
// 500 - Internal Server Error