🇾🇳REPUBLIQUE DU SENEGAL
senDemarches
Guide
Développeur

API Reference

Documentation technique de l'API REST de senDemarches. Tous les endpoints utilisent JSON et nécessitent une authentification par session JWT.

URL de base

Base URL
https://www.sendemarches.com/api

Toutes les requĂȘtes doivent inclure le header Content-Type: application/json. L'authentification est gĂ©rĂ©e par NextAuth via cookies de session JWT.

Authentification

L'API utilise NextAuth 4 avec le provider Credentials. La connexion retourne un token JWT stocké dans un cookie httpOnly sécurisé.

Connexion

POST /api/auth/callback/credentials
// Corps de la requĂȘte
{
  "email": "usager@exemple.com",    // ou numéro de téléphone
  "password": "votreMotDePasse"
}

// Réponse : cookie de session JWT (automatique)

Session JWT

Le token JWT contient : id, email, name, role. Il est automatiquement inclus dans les requĂȘtes suivantes via le cookie. DurĂ©e de validitĂ© : 30 jours.

Procédures (Démarches)

Lister les procédures

GET /api/procedures
// Réponse 200
[
  {
    "id": "clx...",
    "title": "Demande d'acte de naissance",
    "description": "Obtenir une copie d'acte de naissance...",
    "category": "ETAT_CIVIL",
    "fee": 500,
    "estimatedDays": 3,
    "published": true,
    "createdAt": "2026-01-15T10:30:00Z",
    "_count": { "fields": 8, "dossiers": 142 }
  }
]

Détail d'une procédure

GET /api/procedures/:id
// Réponse 200
{
  "id": "clx...",
  "title": "Demande d'acte de naissance",
  "description": "...",
  "category": "ETAT_CIVIL",
  "fee": 500,
  "published": true,
  "fields": [
    {
      "id": "clx...",
      "label": "Nom complet",
      "type": "TEXT",
      "required": true,
      "order": 1
    }
  ]
}

Créer une procédure

POST /api/procedures (ADMIN)
// Corps de la requĂȘte
{
  "title": "Certificat de résidence",
  "description": "Demande de certificat de résidence...",
  "category": "ETAT_CIVIL",
  "fee": 1000
}

// RĂ©ponse 201 — ProcĂ©dure créée

Dossiers

Soumettre un dossier

POST /api/dossiers (USAGER)
// Corps de la requĂȘte
{
  "procedureId": "clx...",
  "data": {
    "nom_complet": "Amadou Diallo",
    "date_naissance": "1990-05-15",
    "lieu_naissance": "Dakar",
    "motif": "Inscription universitaire"
  }
}

// Réponse 201
{
  "id": "clx...",
  "reference": "SD-2026-0042",
  "status": "SUBMITTED",
  "createdAt": "2026-03-13T14:30:00Z"
}

Lister les dossiers

GET /api/dossiers
// ParamĂštres optionnels
?status=SUBMITTED&procedureId=clx...&page=1&limit=20

// USAGER : retourne ses propres dossiers
// AGENT/ADMIN : retourne les dossiers de ses démarches assignées

// Réponse 200
{
  "dossiers": [...],
  "total": 42,
  "page": 1,
  "totalPages": 3
}

Détail d'un dossier

GET /api/dossiers/:id
// Réponse 200
{
  "id": "clx...",
  "reference": "SD-2026-0042",
  "status": "IN_REVIEW",
  "data": { ... },
  "procedure": { "title": "..." },
  "user": { "name": "Amadou Diallo", "email": "..." },
  "statusHistory": [
    {
      "status": "SUBMITTED",
      "comment": null,
      "createdAt": "2026-03-13T14:30:00Z",
      "user": { "name": "Amadou Diallo" }
    }
  ],
  "createdAt": "2026-03-13T14:30:00Z"
}

Changement de statut

PATCH /api/dossiers/:id/status (AGENT/ADMIN)
// Corps de la requĂȘte
{
  "status": "APPROVED",       // APPROVED, REJECTED, PENDING_INFO, IN_REVIEW
  "comment": "Dossier complet et conforme. Attestation générée."
}

// Réponse 200
{
  "id": "clx...",
  "status": "APPROVED",
  "updatedAt": "2026-03-14T09:15:00Z"
}

Statuts possibles

StatutCodeTransitions autorisées
DéposéSUBMITTEDIN_REVIEW
En instructionIN_REVIEWAPPROVED, REJECTED, PENDING_INFO
En attentePENDING_INFOIN_REVIEW (aprÚs complément usager)
AcceptéAPPROVEDCOMPLETED
RefusĂ©REJECTED— (terminal)
TerminĂ©COMPLETED— (terminal)

Assignation d'expert

POST /api/dossiers/:id/experts (AGENT/ADMIN)
// Corps de la requĂȘte
{
  "expertId": "clx...",
  "note": "Merci de vérifier la conformité urbanistique"
}

// Réponse 200
{
  "id": "clx...",
  "expert": { "name": "Dr. Ndiaye" },
  "note": "..."
}

Documents

Récépissé de dépÎt

GET /api/dossiers/:id/receipt
// Réponse : PDF (application/pdf)
// Headers: Content-Disposition: attachment; filename="recepisse-SD-2026-0042.pdf"

Attestation

GET /api/dossiers/:id/attestation
// Disponible uniquement si status = APPROVED
// Réponse : PDF (application/pdf)
// Headers: Content-Disposition: attachment; filename="attestation-SD-2026-0042.pdf"

Vérification

GET /api/attestations/:code
// Code = code de vérification à 8 caractÚres
// Réponse 200
{
  "valid": true,
  "type": "ATTESTATION",
  "reference": "SD-2026-0042",
  "procedure": "Demande d'acte de naissance",
  "beneficiary": "Amadou Diallo",
  "issuedAt": "2026-03-14T09:15:00Z"
}

// Réponse 404
{ "valid": false, "error": "Document non trouvé" }

Invitations

POST /api/invitations (ADMIN)
// Corps de la requĂȘte
{
  "email": "agent@exemple.com",
  "role": "AGENT"              // AGENT, EXPERT, ADMIN
}

// Réponse 201
{
  "id": "clx...",
  "email": "agent@exemple.com",
  "role": "AGENT",
  "token": "abc123...",
  "expiresAt": "2026-03-20T14:30:00Z"
}
GET /api/invitations/:token
// Valider et accepter une invitation
// Réponse 200
{
  "valid": true,
  "email": "agent@exemple.com",
  "role": "AGENT",
  "organization": "MinistÚre de l'Intérieur"
}

Endpoints administrateur

Notifications

POST /api/admin/notifications (ADMIN)
// Envoyer une notification manuelle
{
  "userId": "clx...",
  "channel": "EMAIL",          // EMAIL, SMS, WHATSAPP
  "template": "CUSTOM",
  "message": "Votre dossier nécessite une action..."
}

Super-admin

GET /api/super-admin/stats
// Réponse 200
{
  "users": { "total": 1250, "byRole": { "USAGER": 1200, "AGENT": 35, ... } },
  "dossiers": { "total": 3420, "byStatus": { "SUBMITTED": 120, ... } },
  "organizations": 8,
  "procedures": 24
}

Codes d'erreur

Code HTTPSignificationAction
200Succùs—
201Ressource créée—
400RequĂȘte invalideVĂ©rifiez le corps de la requĂȘte
401Non authentifiéConnectez-vous ou renouvelez votre session
403AccĂšs interditVotre rĂŽle ne permet pas cette action
404Ressource introuvableVérifiez l'identifiant
409ConflitLa ressource existe déjà
422Données invalidesVérifiez les champs obligatoires et les formats
500Erreur serveurContactez l'administrateur
Format d'erreur standard
{
  "error": "Description de l'erreur",
  "details": {
    "field": "email",
    "message": "Format d'e-mail invalide"
  }
}

Limites

ParamĂštreValeur
Taille max. corps de requĂȘte10 Mo
Taille max. fichier upload10 Mo
Formats fichier acceptésPDF, JPG, JPEG, PNG
Pagination par défaut20 éléments par page
Pagination maximale100 éléments par page