API reference
https://api.useksar.com · 0.1.0 · x-api-key
Detailed descriptions are in French for now; field names and codes are the same.
/v1/check-emailVérifier une adresse e-mail
Étapes : validation syntaxique, normalisation, whitelist, listes de domaines jetables (sous-domaines compris), vérification MX (timeout 300 ms, résultat en cache), analyse du motif, calcul du score.
Request body application/json
emailrequiredstring | |
eventsignup | check | signup (défaut) enregistre l’inscription (doublons, séries, rapports) et
renvoie un signup_id ; check analyse seulement (validation en direct d’un
formulaire, par exemple).
|
external_idstring | Identifiant côté client (ex. user_123), stocké tel quel. |
offerstring | Profil d’offre (offer_profiles des paramètres), ex. welcome_10. |
{
"email": "Jean.Dupont+promo@gmail.com"
}Responses
- 200Adresse analysée.
- 400
invalid_email: adresse syntaxiquement invalide.invalid_request: body absent, JSON malformé ouemailqui n’est pas une chaîne. - 401Clé API absente ou invalide.
- 403La clé n’a pas le scope
check(insufficient_scope), ou le compte est suspendu (account_suspended). - 413Body supérieur à 4 Ko.
- 415Content-Type autre que application/json.
- 429
rate_limit_exceeded: limite de débit de la clé (fenêtre glissante,Retry-After).quota_exceeded: quota mensuel de vérifications de l’offre atteint (comptes en libre-service), jusqu’au 1er du mois suivant (resets_at) ou à un changement d’offre. Dans les deux cas, laissez passer l’inscription : votre formulaire ne doit jamais tomber à cause de l’API. - 500Erreur interne.
- 503Clé jamais vue et base de données injoignable (impossible de l’authentifier). Côté client : accepter l’inscription (fail-open).
{
"email": "Jean.Dupont+promo@gmail.com",
"normalized_email": "jeandupont@gmail.com",
"domain": "gmail.com",
"risk_score": 0,
"block": false,
"reasons": [],
"checks": {
"disposable": false,
"whitelisted_domain": true,
"mx": "valid",
"website": "present",
"suspicious_pattern": false
}
}/v1/settingsLire les paramètres du client (scope admin)
Paramètres actuels, valeurs par défaut comprises.
Responses
- 200Paramètres du client.
- 401Clé API absente ou invalide.
- 403La clé n’a pas le scope
admin.
/v1/settingsRemplacer les paramètres du client (scope admin)
Remplace l’ensemble des paramètres : un champ absent reprend sa valeur par
défaut. Les domaines des listes sont normalisés ; les adresses e-mail sont
normalisées puis remplacées par leur empreinte hmac:<64 hex> (propre au
client) : elles ne sont jamais stockées ni renvoyées en clair. La prise en
compte est immédiate.
Request body application/json
modeenforce | shadow | |
disposable_actionblock | deny_offer | allow | |
offer_policyscored | grant_all | deny_all | |
block_thresholdinteger | |
offer_thresholdinteger | |
deferred_bandinteger[] | |
privacy_relay_policyallow | defer | deny_offer | block | |
duplicate_policyobject | |
allowlistobject | |
denylistobject | |
offer_profilesobject | Surcharges par profil d’offre (welcome_10, free_trial…). |
economicsobject | |
retention_daysinteger | |
deferred_release_conditionsemail_verified | first_purchase | account_age_24h[] |
{
"disposable_action": "block",
"offer_threshold": 40,
"allowlist": {
"domains": [
"partenaire.fr"
],
"emails": []
},
"denylist": {
"domains": [
"concurrent.example"
],
"emails": [
"fraudeur@example.com"
]
}
}Responses
- 200Paramètres enregistrés (forme normalisée).
- 400Paramètres invalides (
invalid_settings, détail par champ). - 401Clé API absente ou invalide.
- 403La clé n’a pas le scope
admin. - 503Base de données injoignable.
/v1/signups/{signup_id}/eventsRenvoyer un événement d’inscription (scope check)
Mode sas : quand offer.decision vaut defer, renvoyez les preuves (e-mail confirmé,
premier achat…) ; la réponse indique si l’offre peut maintenant être libérée.
account_age_24h se déduit de la date d’inscription. Les événements servent aussi au
rapport des économies (offer_redeemed avec value_eur). Idempotent : un même type
ne compte qu’une fois par inscription.
Parameters
signup_id (path)requiredstring |
Request body application/json
typerequiredemail_verified | first_purchase | offer_redeemed | offer_released | |
value_eurnumber |
{
"type": "email_verified"
}Responses
- 200Événement enregistré.
- 400Type inconnu ou valeur invalide.
- 401Clé API absente ou invalide.
- 403La clé n’a pas le scope
check. - 404Inscription inconnue ou appartenant à un autre client.
- 503Base de données injoignable.
{
"offer_release": true,
"met_conditions": [
"email_verified"
]
}/v1/reports/summaryRapport des économies (scope admin)
Résumé d’une période (jours UTC, 366 jours maximum ; défaut : mois en cours).
estimated_savings_eur est une estimation, dont la méthode est renvoyée :
offres refusées × valeur de l’offre, + offres en attente jamais accordées (aucun
événement offer_released ni offer_redeemed) × valeur de l’offre. Valeur = moyenne
des value_eur réels reçus (offer_redeemed) pour le profil, sinon offer_value_eur
configuré. En mode test, les décisions comptées sont celles qui auraient été prises.
format=html : rapport HTML en français, prêt à être envoyé par e-mail.
Parameters
from (query)string | |
to (query)string | |
format (query)json | html |
Responses
- 200Résumé de la période.
- 400Dates invalides ou période trop longue (
invalid_request). - 401Clé API absente ou invalide.
- 403La clé n’a pas le scope
admin, ou l’offre n’inclut pas le rapport (plan_upgrade_required: Pro et plus). - 503Base de données injoignable.
/v1/batchAnalyser un fichier CSV en asynchrone (scope admin)
Même moteur que npm run audit. Corps text/csv (5 Mo maximum, virgule ou point-virgule
détectés). Réponse immédiate 202 avec job_id ; suivez le statut sur
/v1/batch/{job_id}. Le fichier source n’est jamais stocké ; les résultats (sans
aucune adresse) sont supprimés après 7 jours.
Parameters
email_column (query)string | |
coupon_column (query)string | |
date_column (query)string | |
offer_value (query)string | |
delimiter (query), | ; |
Request body text/csv
"email,code_utilise\njean@example.com,BIENVENUE\n"Responses
- 202Fichier accepté.
- 400Fichier vide ou paramètres invalides.
- 401Clé API absente ou invalide.
- 403La clé n’a pas le scope
admin, ou l’offre n’inclut pas l’audit CSV (plan_upgrade_required: Business et plus). - 413Fichier supérieur à 5 Mo.
- 415Content-Type autre que text/csv.
/v1/batch/{job_id}Statut et résumé d’une analyse (scope admin)
Parameters
job_id (path)requiredstring |
Responses
- 200
status:queued,running,done(avecsummaryetresults_url) oufailed(avecerror, ex. colonne introuvable). - 404Analyse inconnue, expirée ou appartenant à un autre client.
/v1/batch/{job_id}/results.csvRésultats d’une analyse (CSV sans adresse e-mail)
Colonnes : line (numéro de ligne d’origine), status, reasons, duplicate_group.
Parameters
job_id (path)requiredstring |
Responses
- 200CSV de résultats.
- 404Analyse inconnue, non terminée ou expirée.
/v1/subjectsDroit à l’effacement (scope admin)
Supprime toutes les données liées à une adresse pour ce client (inscriptions et
empreintes), variantes équivalentes comprises (Jean.Dupont+x@googlemail.com =
jeandupont@gmail.com). L’adresse n’est ni stockée ni journalisée. Répond 204 même
si rien ne correspondait.
Request body application/json
emailrequiredstring |
Responses
- 204Données effacées.
- 400Adresse invalide.
- 401Clé API absente ou invalide.
- 403La clé n’a pas le scope
admin. - 503Base de données injoignable.
/healthSonde de disponibilité (sans authentification)
Responses
- 200Service opérationnel.