API publique · v1 · OAuth2 · OpenAPI 3.1
La consultation juridique depuis votre CRM
Une API REST pour lancer des consultations d’avocat de 20 minutes au nom de vos clients. Délégation OAuth2, facturation par portefeuille, statut en temps réel via webhooks.
Démarrage en 3 étapes
De l’enregistrement de votre application à la première consultation.
Créez votre application
Enregistrez votre CRM comme application OAuth2 et recevez vos identifiants client_id / client_secret.
Nous contacterVos clients connectent leur compte
Chaque client autorise votre CRM via le flux OAuth2 (Authorization Code + PKCE). Vous obtenez un refresh token par client.
Voir le flux OAuth2Lancez des consultations
Vérifiez le solde, appelez POST /api/v1/consultations. Le portefeuille du client est débité de 20 €, l’avocat le rappelle.
Voir les endpointsDeux appels pour lancer une consultation
Rafraîchissez l’access token du client, puis créez la consultation. Le portefeuille est débité, un avocat disponible rappelle le client sur son téléphone.
- Pas de paiement par carte à chaque appel — le portefeuille du client est débité.
- Idempotence native via l’en-tête Idempotency-Key.
- Référence externalRef renvoyée dans tous les webhooks pour le rapprochement.
- Le secret professionnel de l’avocat est préservé : seul un aperçu de note est exposé.
# 1. Rafraîchir l'access token du client connecté
curl -X POST https://avocat20min.be/api/oauth/token \
-d grant_type=refresh_token \
-d refresh_token=$REFRESH_TOKEN \
-d client_id=$AV20_CLIENT_ID \
-d client_secret=$AV20_CLIENT_SECRET
# 2. Lancer une consultation — débite 20 € du portefeuille du client
curl -X POST https://avocat20min.be/api/v1/consultations \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"competence": "LABOR_LAW",
"language": "FR",
"subject": "Rupture de contrat — calcul du préavis",
"recordingConsent": false,
"withdrawalWaiverAcknowledged": true,
"externalRef": "TICKET-4821"
}'Délégation OAuth2
Votre CRM est une application OAuth2. Le client relie son compte Avocat20min une fois, via le flux Authorization Code + PKCE ; vous stockez le refresh token sur sa fiche. Chaque consultation est ensuite lancée avec son access token — il garde la maîtrise et peut révoquer l’accès depuis son compte.
| Scope | Accès accordé |
|---|---|
profile:read | Profil du client (nom, e-mail, téléphone). |
wallet:read | Solde et historique du portefeuille. |
wallet:topup | Initier une recharge du portefeuille. |
consultations:read | Lire les consultations. |
consultations:write | Créer et annuler des consultations. |
notes:read | Aperçu des notes de consultation. |
offline_access | Obtenir un refresh token. |
Ce qui est inclus
Délégation OAuth2
Authorization Code + PKCE. Votre CRM agit au nom du client, jamais à sa place — accès révocable à tout moment.
Portefeuille
Le client recharge son portefeuille Avocat20min. Chaque consultation y est débitée — aucun paiement par carte à chaque appel.
Webhooks signés
Chaque transition de statut déclenche un POST signé HMAC-SHA256 sur votre URL. Suivi en temps réel.
Idempotence
En-tête Idempotency-Key sur les POST — un rejeu renvoie la réponse mémorisée, jamais de double consultation.
Endpoints
Base : https://avocat20min.be · tous les appels /api/v1 exigent un access token Bearer.
OAuth2
/api/oauth/authorize— Écran de login + consentement du client./api/oauth/token— Échange code → jetons, ou rafraîchissement./api/oauth/revoke— Révocation d’un refresh token.Compte & portefeuille
/api/v1/me— Profil du client connecté./api/v1/wallet— Solde du portefeuille./api/v1/wallet/transactions— Historique des mouvements./api/v1/wallet/topup-session— Lien de recharge hébergé.Catalogue
/api/v1/catalog/competences— Domaines de droit./api/v1/catalog/languages— Langues de consultation./api/v1/coverage— Disponibilité des avocats.Consultations
/api/v1/consultations— Lancer une consultation./api/v1/consultations— Lister les consultations./api/v1/consultations/{id}— Détail d’une consultation./api/v1/consultations/{id}/cancel— Annuler une consultation./api/v1/consultations/{id}/note— Aperçu de la note.Webhooks signés
Chaque transition de statut déclenche un POST sur l’URL de votre application. Le corps est signé en HMAC-SHA256 — vérifiez la signature et l’horodatage avant de traiter l’événement.
Événements
consultation.payment_authorizedportefeuille débité, recherche d’avocat lancéeconsultation.assignedun avocat a pris la consultationconsultation.call_startedl’appel a démarréconsultation.completedconsultation terminée, note disponibleconsultation.pending_callbackaucun avocat sous 30 min — rappel garanticonsultation.cancelledconsultation annuléeconsultation.refundedportefeuille recrédité
Vérification de la signature (Node.js)
import crypto from 'node:crypto'
export function verifyAvocat20min(req, secret) {
// En-tête : t=<timestamp>,v1=<hmac-sha256-hex>
const header = req.headers['x-avocat20min-signature'] ?? ''
const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')))
const expected = crypto
.createHmac('sha256', secret)
.update(`${parts.t}.${req.rawBody}`)
.digest('hex')
const ok = crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(parts.v1 ?? ''),
)
// Rejeter les livraisons de plus de 5 minutes (anti-rejeu)
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300
if (!ok || !fresh) throw new Error('Signature invalide')
}Prêt à intégrer ?
Contactez-nous pour obtenir vos identifiants OAuth2 et configurer votre endpoint webhook.