Documentation complète de l'API REST Ackify.
https://votre-domaine.com/api/v1
La plupart des endpoints requièrent une authentification via cookie de session (OAuth2 ou MagicLink).
Headers :
X-CSRF-Token- Requis pour les requêtes POST/PUT/DELETE
Obtenir un token CSRF :
GET /api/v1/csrfGET /api/v1/healthRéponse (200 OK) :
{
"status": "healthy",
"database": "connected"
}POST /api/v1/auth/startBody :
{
"redirect": "/?doc=policy_2025"
}POST /api/v1/auth/magic-link/requestBody :
{
"email": "user@example.com",
"redirect": "/?doc=policy_2025"
}GET /api/v1/auth/magic-link/verify?token=xxxGET /api/v1/auth/logoutGET /api/v1/users/meRéponse (200 OK) :
{
"data": {
"sub": "google-oauth2|123456",
"email": "user@example.com",
"name": "John Doe",
"isAdmin": false,
"canCreateDocuments": true
}
}GET /api/v1/documents/find-or-create?doc=policy_2025Réponse (200 OK) :
{
"data": {
"docId": "policy_2025",
"title": "Politique de Sécurité 2025",
"url": "https://example.com/policy.pdf",
"checksum": "sha256:abc123...",
"checksumAlgorithm": "SHA-256",
"signatureCount": 42,
"isNew": false
}
}Champs :
signatureCount- Nombre total de signatures (visible par tous)isNew- Indique si le document vient d'être créé
GET /api/v1/documents/{docId}GET /api/v1/documents/{docId}/signaturesContrôle d'Accès :
| Type d'utilisateur | Résultat |
|---|---|
| Propriétaire du document ou Admin | Toutes les signatures avec emails |
| Utilisateur authentifié (non propriétaire) | Uniquement sa propre signature (s'il a signé) |
| Non authentifié | Liste vide |
Note : Le compteur de signatures est toujours disponible via
signatureCountdans la réponse du document. Cet endpoint retourne la liste détaillée avec les adresses email.
Réponse (200 OK) :
{
"data": [
{
"id": 1,
"docId": "policy_2025",
"userEmail": "alice@example.com",
"userName": "Alice Smith",
"signedAt": "2025-01-15T14:30:00Z",
"payloadHash": "sha256:e3b0c44...",
"signature": "ed25519:3045022100..."
}
]
}GET /api/v1/documents/{docId}/expected-signersContrôle d'Accès : Identique à l'endpoint /signatures (propriétaire/admin uniquement).
Réponse (200 OK) :
{
"data": [
{
"email": "bob@example.com",
"addedAt": "2025-01-10T10:00:00Z",
"hasSigned": false
}
]
}POST /api/v1/signatures
X-CSRF-Token: xxxBody :
{
"docId": "policy_2025"
}Réponse (201 Created) :
{
"data": {
"id": 123,
"docId": "policy_2025",
"userEmail": "user@example.com",
"signedAt": "2025-01-15T14:30:00Z",
"payloadHash": "sha256:...",
"signature": "ed25519:..."
}
}Erreurs :
409 Conflict- L'utilisateur a déjà signé ce document
GET /api/v1/signaturesRetourne toutes les signatures de l'utilisateur authentifié courant.
GET /api/v1/documents/{docId}/signatures/statusRetourne si l'utilisateur courant a signé le document.
Tous les endpoints admin requièrent que l'utilisateur soit dans ACKIFY_ADMIN_EMAILS.
GET /api/v1/admin/documentsGET /api/v1/admin/documents/{docId}/signersPOST /api/v1/admin/documents/{docId}/signers
X-CSRF-Token: xxxBody :
{
"email": "newuser@example.com",
"notes": "Note optionnelle"
}DELETE /api/v1/admin/documents/{docId}/signers/{email}
X-CSRF-Token: xxxPOST /api/v1/admin/documents/{docId}/reminders
X-CSRF-Token: xxxDELETE /api/v1/admin/documents/{docId}
X-CSRF-Token: xxxToutes les erreurs suivent ce format :
{
"error": {
"code": "ERROR_CODE",
"message": "Message lisible",
"details": {}
}
}Codes d'Erreur Courants :
UNAUTHORIZED(401) - Authentification requiseFORBIDDEN(403) - Permissions insuffisantesNOT_FOUND(404) - Ressource non trouvéeCONFLICT(409) - Ressource existe déjà (ex: signature dupliquée)RATE_LIMITED(429) - Trop de requêtesVALIDATION_ERROR(400) - Corps de requête invalide
| Catégorie d'Endpoint | Limite |
|---|---|
| Authentification | 5 requêtes/minute |
| Signatures | 100 requêtes/minute |
| API Générale | 100 requêtes/minute |
La spécification OpenAPI 3.0 complète est disponible à :
GET /api/v1/openapi.json