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.

1

Créez votre application

Enregistrez votre CRM comme application OAuth2 et recevez vos identifiants client_id / client_secret.

Nous contacter
2

Vos 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 OAuth2
3

Lancez 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 endpoints

Deux 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.

ScopeAccès accordé
profile:readProfil du client (nom, e-mail, téléphone).
wallet:readSolde et historique du portefeuille.
wallet:topupInitier une recharge du portefeuille.
consultations:readLire les consultations.
consultations:writeCréer et annuler des consultations.
notes:readAperçu des notes de consultation.
offline_accessObtenir 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

GET/api/oauth/authorizeÉcran de login + consentement du client.
POST/api/oauth/tokenÉchange code → jetons, ou rafraîchissement.
POST/api/oauth/revokeRévocation d’un refresh token.

Compte & portefeuille

GET/api/v1/meProfil du client connecté.
GET/api/v1/walletSolde du portefeuille.
GET/api/v1/wallet/transactionsHistorique des mouvements.
POST/api/v1/wallet/topup-sessionLien de recharge hébergé.

Catalogue

GET/api/v1/catalog/competencesDomaines de droit.
GET/api/v1/catalog/languagesLangues de consultation.
GET/api/v1/coverageDisponibilité des avocats.

Consultations

POST/api/v1/consultationsLancer une consultation.
GET/api/v1/consultationsLister les consultations.
GET/api/v1/consultations/{id}Détail d’une consultation.
POST/api/v1/consultations/{id}/cancelAnnuler une consultation.
GET/api/v1/consultations/{id}/noteAperç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ée
  • consultation.assignedun avocat a pris la consultation
  • consultation.call_startedl’appel a démarré
  • consultation.completedconsultation terminée, note disponible
  • consultation.pending_callbackaucun avocat sous 30 min — rappel garanti
  • consultation.cancelledconsultation annulée
  • consultation.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.