Documentation Mailzero
L'API derrière Today : connectez une boîte de réception, lisez le résumé et les faits, confiez les types d'affaires que vous choisissez à vos agents sous délégations permanentes, et laissez-les agir dans les limites des autorisations avec un reçu pour chaque effet. Les domaines, DNS et le reste de la plateforme gardent leur référence plus bas.
Support : support@mailzero.run
Authentification
Tous les endpoints authentifiés nécessitent un jeton Bearer dans l’en-tête Authorization.
curl https://domani.run/api/domains/search?q=example.com \ -H "Authorization: Bearer domani_sk_xxx"
Obtenez une clé API en créer un compte ou du Réglages. Certains points de terminaison (recherche, TLD, WHOIS) sont publics mais ont des limites de débit inférieures sans authentification.
Portées des jetons
Les jetons peuvent être limités à des étendues d’autorisation spécifiques. Utiliser * pour un accès complet (par défaut). Créez des jetons étendus via `POST /api/tokens` avec un `scopes` tableau.
| Portée | Donne accès à |
|---|---|
| domains:read | GET /api/domains, GET /api/domains/{domain}, GET /api/domains/{domain}/dns, /dnssec, /status, /email/check, /auth-code, /transfer-away, /transfer-status, /analytics |
| domains:write | PUT /api/domains/{domain}/dns, POST/DELETE /api/domains/{domain}/dnssec, POST /connect, POST /verify, PUT /settings, PUT /parking, PUT/DELETE /api/domains/{domain}/for-sale, POST /api/domains/import, POST /import/verify |
| domains:transfer | POST /api/domains/buy, POST /transfer, POST /renew (implique le paiement, inclut les achats sur le marché) |
| tokens:read | GET /api/tokens |
| tokens:write | POST /api/tokens, DELETE /api/tokens/{id} |
| webhooks:read | GET /api/webhooks, GET /api/webhooks/{id}/deliveries |
| webhooks:write | POST /api/webhooks, PATCH /api/webhooks/{id}, DELETE /api/webhooks/{id} |
| email:read | GET /api/emails, /api/emails/{address}, /api/emails/{address}/messages, /api/emails/{address}/aliases, /api/email/changes, /api/domains/{domain}/email/status, /api/domains/{domain}/email/deliverability, /api/suppressions, GET /api/contacts |
| email:write | POST /api/emails, POST /api/emails/{address}/send, POST /api/domains/{domain}/email/setup, aliases + catch-all, POST/DELETE /api/suppressions, POST/DELETE /api/contacts |
| email:delete | Supprimez définitivement les messages déjà dans la corbeille. Le déplacement des messages vers la corbeille nécessite uniquement email:write. Accordez cette portée uniquement aux agents autorisés à effacer de manière irréversible le contenu des e-mails |
| email:manage_mailboxes | Crée des boîtes aux lettres (POST /api/emails) et rien d’autre. Cette portée d’administration restreinte permet aux agents de créer des adresses pour de nouveaux projets (partners@, launch@) sans pouvoir lire ou envoyer des e-mails, gérer des domaines ou manipuler des jetons |
| email:auth_secrets | Lisez les messages classés comme courrier d'authentification (codes OTP/vérification, réinitialisations de mot de passe, liens magiques). Sans cela, email:read les répertorie toujours, mais le sujet et le corps sont masqués - donc un jeton d'agent volé ne peut pas récolter les codes 2FA. Accordez-le uniquement aux agents qui ont réellement besoin de se connecter |
| account:read | GET /api/me, GET /api/agents/identity |
| account:write | DELETE /api/me, POST /api/billing/setup, POST /api/billing/subscribe, POST /api/billing/cancel, POST /api/me/resend-verification, POST/PATCH/DELETE /api/agents/identity |
| billing:read | GET /api/billing/invoices |
| search | GET /api/domains/search, /suggest, /whois, /dns-check, GET /api/tlds |
| deals:read | GET /api/deals, GET /api/deals/{id} |
| deals:write | POST /api/domains/sell, PATCH /api/deals/{id} |
| notifications:read | GET /api/notifications, GET /api/notifications/count |
| backorders:read | GET /api/backorders, GET /api/backorders/{id} |
| backorders:write | POST /api/backorders, DELETE /api/backorders/{id} |
| assistant:read | Read Mailzero assistant settings, the Today queue, Work items, exact action previews, history-import progress, and content-minimized Activity |
| assistant:write | Change Mailzero assistant settings, record consent and start history imports, record human Decisions on Work items, retry imports, and export or delete derived assistant data. Never sends mail |
Atténuation de la portée : un jeton ne peut créer que des jetons enfants avec des portées égales ou inférieures - jamais plus.
Retours de portée manquante 403 avec code `INSUFFICIENT_SCOPE` et un indice nommant la portée requise.
Démarrage rapide des agents : la boucle de tâches
Donnez à un agent une identité et un jeton, confiez-lui un type d'affaire avec une délégation permanente en observation, puis laissez-le lire l'enveloppe de chaque affaire, demander des effets et faire un rapport. Le niveau et les autorisations approuvent, vous transmettent pour escalade ou refusent ; chaque effet laisse un reçu ; augmentez le niveau quand les reçus le justifient.
# The owner, once
curl -X POST https://domani.run/api/agents/identity -H "Authorization: Bearer $OWNER_KEY" -H "Content-Type: application/json" -d '{"slug":"finance-helper","name":"Finance helper"}'
curl -X POST https://domani.run/api/tokens -H "Authorization: Bearer $OWNER_KEY" -H "Content-Type: application/json" -d '{"name":"finance helper","scopes":["assistant:read","assistant:write"],"agent_identity_id":"agt_123"}'
curl -X POST https://domani.run/api/assistant/rules -H "Authorization: Bearer $OWNER_KEY" -H "Content-Type: application/json" -d '{"name":"Acme","match":{"senderDomain":"acme.com"},"assignee_type":"agent","assignee_ref":"finance-helper","level":"observe"}'
# The agent, for every matter
curl https://domani.run/api/assistant/today -H "Authorization: Bearer $AGENT_KEY"
curl https://domani.run/api/assistant/tasks/wi_789 -H "Authorization: Bearer $AGENT_KEY"
curl -X POST https://domani.run/api/assistant/tasks/wi_789/effects -H "Authorization: Bearer $AGENT_KEY" -H "Content-Type: application/json" -d '{"effects":[{"kind":"label","mailbox_id":"mbx_123","add":["finance"]}],"idempotency_key":"label-wi_789-1"}'
curl -X POST https://domani.run/api/assistant/tasks/wi_789/report -H "Authorization: Bearer $AGENT_KEY" -H "Content-Type: application/json" -d '{"outcome":"done","summary":"Labelled finance; the invoice matches the order."}'Assistant Mailzero
Les points de terminaison de l’assistant Mailzero transforment les mails d’un utilisateur en Décisions fondées : une file Aujourd’hui versionnée, un élément de travail par fil qui demande un jugement, et un plan d’action exact préparé seulement après le choix de l’utilisateur. Rien sous /api/assistant n’envoie, ne supprime ni ne modifie de mail ; la sortie du modèle est toujours une proposition que le serveur valide.
Deux portées le couvrent : assistant:read pour les réglages, Aujourd’hui, les éléments de travail, les plans d’action, la progression de l’import et l’Activité ; assistant:write pour les modifications de réglages, le consentement et les imports d’historique, les Décisions humaines sur les éléments de travail, ainsi que l’export ou la suppression des données dérivées.
Le traitement ne démarre qu’après un consentement explicite : POST /api/assistant/preview enregistre la version du consentement, délimite les boîtes possédées et lance un import en arrière-plan qui peut reprendre. Interrogez GET /api/assistant/backfill pour suivre la progression.
curl -X POST https://domani.run/api/assistant/work-items/wi_789/interactions -H "Authorization: Bearer domani_sk_xxx" -H "Content-Type: application/json" -d '{"type":"choose","work_item_version":3,"decision_id":"dec_1","decision_version":1,"option_id":"opt_send","idempotency_key":"choose-wi_789-opt_send-1"}'Un choix prépare un plan exact. Lisez-le avec GET /api/assistant/action-plans/{id}, montrez-le à l’utilisateur, puis envoyez via le point de terminaison de réponse habituel POST /api/emails/{address}/messages/{id}/reply avec assistant_plan_id. Le serveur refuse les plans obsolètes ou incohérents, enregistre un reçu par envoi et fait passer l’élément de travail en En attente ou Traité.
Webhooks de boîte aux lettres authentifiés
Dans le tableau de bord, ouvrez l'onglet E-mail d'un domaine, choisissez une boîte aux lettres, puis sélectionnez Authorization ou X-API-Key. Domani crypte la valeur et l'envoie avec des tests de webhook et des envois d'e-mails entrants. Les distributions entrantes en direct sont durables et réessayées jusqu'à trois fois ; `X-Domani-Delivery-Attempt`.
read -rsp 'Sender credential: ' WEBHOOK_SENDER_AUTH; echo export WEBHOOK_SENDER_AUTH jq -n --arg url 'https://agent.example/webhook' --arg auth "$WEBHOOK_SENDER_AUTH" '{url:$url,headers:'{Authorization:$auth}} | \ curl --fail-with-body -X PUT "https://domani.run/api/emails/agent%40example.com/webhook" \ -H "Authorization: Bearer $DOMANI_API_KEY" \ -H "Content-Type: application/json" --data-binary @- unset WEBHOOK_SENDER_AUTHLes valeurs d'en-tête ne sont jamais renvoyées. Les réponses exposent uniquement `header_names`. Omettre `headers` pour conserver la valeur stockée, envoyez un objet vide pour l'effacer et utilisez `POST /api/emails/`'{address}'`/webhook/test` pour vérifier la distribution.
Repartir de zéro ? Inclure `webhook_headers` dans `POST /api/agents/provision` pour acheter le domaine, créer sa boîte aux lettres et joindre le webhook d'événement authentifié en un seul appel idempotent. Domani valide l'URL et les noms d'en-tête avant tout frais.
Erreurs
Toutes les erreurs renvoient une enveloppe JSON cohérente. Utiliser `code` pour la gestion programmatique et `hint` pour des conseils de récupération.
{
"error": "Missing API key",
"code": "MISSING_API_KEY",
"hint": "Include 'Authorization: Bearer domani_sk_xxx' header",
"documentation_url": "https://domani.run/llms.txt"
}| Coder | HTTP |
|---|---|
| MISSING_API_KEY | 401 |
| INVALID_API_KEY | 401 |
| EXPIRED_API_KEY | 401 |
| MISSING_PARAMETER | 400 |
| INVALID_DOMAIN | 400 |
| PAYMENT_REQUIRED | 402 |
| DOMAIN_UNAVAILABLE | 409 |
| RATE_LIMIT_EXCEEDED | 429 |
| USER_EXISTS | 409 |
| NOT_FOUND | 404 |
| UNKNOWN_PROVIDER | 400 |
| UNKNOWN_METHOD | 400 |
| TARGET_REQUIRED | 400 |
| INVALID_PARAMETER | 400 |
| CONTACT_REQUIRED | 400 |
| INVALID_CONTACT | 400 |
| INSUFFICIENT_SCOPE | 403 |
| SCOPE_ESCALATION | 400 |
| MAILBOX_CONFINED | 400 |
| DOMAIN_EXISTS | 400 |
| DOMAIN_NOT_ACTIVE | 400 |
| UNSUPPORTED_TLD | 400 |
| TLD_NOT_IN_PUBLIC_DNS | 400 |
| NOT_AVAILABLE | 400 |
| ALREADY_REGISTERED | 400 |
| TRANSFER_NOT_ELIGIBLE | 400 |
| RENEWAL_NOT_ELIGIBLE | 400 |
| ALREADY_LISTED | 400 |
| LISTING_SOLD | 400 |
| SELF_PURCHASE | 400 |
| DESCRIPTION_TOO_LONG | 400 |
| DEAL_NOT_FOUND | 400 |
| INVALID_DEAL_STATE | 400 |
| EPP_ATTEMPTS_EXCEEDED | 400 |
| ACTIVE_DEAL_EXISTS | 400 |
| AGENT_IDENTITY_NOT_FOUND | 400 |
| AGENT_IDENTITY_ESCALATION | 400 |
| AGENT_MAILBOXES_REQUIRED | 400 |
| CREDENTIAL_REVOKE_FAILED | 400 |
| INVALID_IDEMPOTENCY_KEY | 400 |
| IDEMPOTENCY_KEY_MISMATCH | 400 |
| IDEMPOTENCY_KEY_REUSED | 400 |
| OPERATION_IN_PROGRESS | 400 |
| OPERATION_SUPERSEDED | 400 |
| INVALID_OPERATION_RECEIPT | 400 |
| WORKSPACE_ADMIN_REQUIRED | 400 |
| WORKSPACE_OWNER_REQUIRED | 400 |
| PRINCIPAL_NOT_IN_WORKSPACE | 400 |
| MAILBOX_NOT_IN_WORKSPACE | 400 |
| GROUP_NOT_IN_WORKSPACE | 400 |
| COLLECTION_NOT_IN_WORKSPACE | 400 |
| ACCESS_VERSION_CONFLICT | 400 |
| ACCESS_OFFER_INVALID | 400 |
| ACCESS_OFFER_EMAIL_MISMATCH | 400 |
| MAIL_DOMAIN_CAPACITY_EXHAUSTED | 400 |
| MAIL_PROVIDER_ERROR | 400 |
| INVALID_HTTP_ROUTE_HOSTNAME | 400 |
| INVALID_HTTP_ROUTE_UPSTREAM | 400 |
| INVALID_HTTP_ROUTE_UPSTREAM_HEADERS | 400 |
| INVALID_HTTP_ROUTE_LEASE | 400 |
| INVALID_HTTP_ROUTE_POLICY | 400 |
| INVALID_HOSTNAME_BINDING | 400 |
| HTTP_ROUTE_HOSTNAME_NOT_ALLOWED | 400 |
| HTTP_ROUTE_HOSTNAME_REQUIRED | 400 |
| HTTP_ROUTE_HOSTNAME_RESERVED | 400 |
| HTTP_ROUTE_HOSTNAME_UNAVAILABLE | 400 |
| HTTP_ROUTE_CONCURRENCY_LIMIT | 400 |
| HTTP_ROUTE_WORKSPACE_LIMIT | 400 |
| HTTP_ROUTE_DOMAIN_NOT_OWNED | 400 |
| HTTP_ROUTE_TERMINAL | 400 |
| HTTP_ROUTE_VERIFICATION_NOT_ENABLED | 400 |
| HTTP_ROUTE_VERIFICATION_REQUIRES_HTTPS | 400 |
| HTTP_ROUTE_POLICY_WITHOUT_SCOPE | 400 |
| HTTP_ROUTE_POLICY_REQUIRED | 400 |
| HTTP_ROUTE_AGENT_IDENTITY_REQUIRED | 400 |
| HTTP_ROUTE_POLICY_ESCALATION | 400 |
| HOSTNAME_BINDING_NOT_ACTIVE | 400 |
| HOSTNAME_BINDING_DNS_CONFLICT | 400 |
| HOSTNAME_BINDING_ACK_REQUIRED | 400 |
| HOSTNAME_BINDING_BROWSER_MODE_MISMATCH | 400 |
| HOSTNAME_DNS_CONFLICT | 400 |
| ZONE_READ_FAILED | 400 |
| DNS_VERSION_CONFLICT | 400 |
| UNAUTHORIZED | 400 |
| APEX_WEB_MODE_CONFLICT | 400 |
| APEX_DELEGATION_ACK_REQUIRED | 400 |
| VERIFICATION_COOLDOWN | 400 |
| VERIFICATION_SEND_FAILED | 400 |
| UPGRADE_REQUIRED | 400 |
| FREE_LIMIT_EXCEEDED | 400 |
Limites de taux
Chaque réponse inclut des en-têtes de limite de débit :
`X-RateLimit-Limit`- nombre maximum de requêtes par fenêtre`X-RateLimit-Remaining`- demandes restantes`X-RateLimit-Reset`- horodatage Unix lors de la réinitialisation de la fenêtre
Lorsque le débit est limité (HTTP 429), vérifiez le `Retry-After` en-tête pendant quelques secondes à attendre.
Assistant Mailzero
/api/assistant/rulesLister les délégations permanentes
Les règles de délégation permanente du propriétaire dans l'ordre : nom, le prédicat de correspondance, le destinataire (une identité d'agent ou un membre de l'espace de travail), le niveau d'autonomie, combien de fois chacune a correspondu. Nécessite assistant:read ; un jeton d'agent est refusé.
Réponse 200
| rules | AssistantRule[] |
/api/assistant/rulesCréer une délégation permanente
Transmettre un type d'affaire à un agent ou une personne une fois. match est un prédicat explicite, jamais un appel de modèle : l'un de senderAddress, senderDomain, organisation, workKeyPrefix, senderKind, mailboxIds, labels, subjectPattern (ancré, insensible à la casse), minOccurrences, minConfidence (la probabilité du classifieur calibré sur un label category:, de 0,5 à 1) ; chaque condition énoncée doit être remplie. Les règles sont ordonnées et la première correspondance l'emporte ; le niveau est observe sauf indication contraire. Une règle correspondante transmet le prochain élément correspondant au destinataire, l'en informe par l'avis de délégation, et Today montre pourquoi. Nécessite assistant:write ; un jeton d'agent est refusé.
Réponse 201
| id | string | |
| name | string | |
| enabled | boolean | |
| position | integer | |
| match | AssistantRuleMatch | |
| assignee | object | |
| level | string | |
| grants | AssistantGrants | |
| match_count | integer | |
| last_matched_at | string (date-time) | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/api/assistant/rules/{id}Modifier une délégation permanente
Renommer, activer ou désactiver, réordonner, changer la correspondance, le destinataire, le niveau ou les autorisations. Abaisser le niveau à observe est l'interrupteur d'arrêt d'urgence d'une règle. Nécessite assistant:write ; un jeton d'agent est refusé.
Paramètres
| id* | string |
Réponse 200
| id | string | |
| name | string | |
| enabled | boolean | |
| position | integer | |
| match | AssistantRuleMatch | |
| assignee | object | |
| level | string | |
| grants | AssistantGrants | |
| match_count | integer | |
| last_matched_at | string (date-time) | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/api/assistant/rules/{id}Supprimer une délégation permanente
Supprime la règle ; les éléments qu'elle a transmis reviennent au propriétaire, les reçus de ce que le destinataire a fait restent. Nécessite assistant:write ; un jeton d'agent est refusé.
Paramètres
| id* | string |
Réponse 200
| deleted | boolean | |
| released_items | integer |
/api/assistant/rules/testEssayer les délégations permanentes sur des faits d'exemple
Un essai à blanc : quelle règle s'appliquerait à un message avec ces faits (boîte mail, clé, expéditeur, objet, étiquettes, occurrences), et pourquoi. Rien ne change. Nécessite assistant:write, un jeton d'agent est refusé.
Corps de la demande
| mailbox_id* | string | |
| key* | string | La clé de l'élément de travail, par exemple org:tucows:invoice |
| sender_address | string | null | |
| sender_kind | string(human | automated) | |
| subject | string | null | |
| labels | string[] | |
| occurrences | integer | |
| confidence | object | La probabilité du classifieur par label, pour une règle avec minConfidence |
Réponse 200
| matched | boolean | |
| rule | AssistantRule | |
| why | string[] | |
| considered | integer |
/api/assistant/rules/{id}/checkTester un effet contre le niveau et les grants d'une délégation permanente
Un essai à blanc de l'ordre de validation pour un effet demandé sous la règle aujourd'hui : le niveau autorise le type ; les grants autorisent les destinataires, le volume (compte des effets exécutés aujourd'hui), l'horaire, la dépense, les classes de risque lues sur l'affaire ; l'approbateur requis a approuvé. Répond le statut qu'un plan prendrait (proposed, approved, escalated ou rejected) avec chaque vérification et pourquoi. Rien ne change. Requiert assistant:write ; un jeton d'agent est refusé.
Paramètres
| id* | string |
Corps de la demande
| effect* | object | |
| matter | object | |
| at | string (date-time) | L'instant auquel vérifier l'horaire ; maintenant par défaut |
| approved_by | string[] | Ids de membres qui ont déjà approuvé |
Réponse 200
| rule | object | |
| allowed_kinds | string[] | |
| effective_grants | AssistantGrants | |
| outcome | string | |
| check | AssistantGrantCheck | |
| hint | string |
/api/assistant/metricsLire les métriques de tâches
Les sept nombres de la couche de tâches sur une fenêtre glissante (trente jours par défaut, window_days de 1 à 90), pour le compte et pour chaque délégation permanente : affaires clôturées sans le propriétaire, le temps de l'arrivée à la clôture, les plans exécutés comme proposés, édités et rejetés, les escalations par affaire, les corrections après exécution, les collisions, le coût du modèle par affaire. Lu depuis les receipts, les plans, les escalations et le ledger ; rien n'est estimé. Requiert assistant:read.
Paramètres
| window_days | integer |
Réponse 200
| type | string | |
| as_of | string (date-time) | |
| window_days | integer | |
| account | AssistantTaskNumbers | |
| rules | object[] |
/api/assistant/approvalsLister la file d'attente des approbations
Les plans en attente du propriétaire (proposés au brouillon, ou retenus par une permission) et les questions posées par les assignés, parmi les dossiers que le lecteur peut voir. Répondre via les interactions de l'élément de travail : approuver ou rejeter un plan, choisir une option ou donner des instructions sur une question. Nécessite assistant:read. Un dossier issu d'un courrier d'authentification avant que ce courrier soit tenu à l'écart de l'assistant s'affiche avec son titre, son résumé, sa demande et les effets de son plan retenus pour un lecteur sans email:auth_secrets.
Réponse 200
| type | string | |
| as_of | string (date-time) | |
| plans | object[] | |
| escalations | object[] |
/api/assistant/suggestionsÉnumérer les suggestions de délégation
Les délégations permanentes que l'assistant propose : un sujet qui s'est répété au moins trois fois en quatre-vingt-dix jours (la même organisation ou expéditeur) et a été traité de la même manière à chaque fois (ignoré, répondu, fermé, confié à un agent), avec la règle préremplie. Ouvertes par défaut. Rien n'est créé tant que le propriétaire n'accepte pas. Nécessite assistant:read ; un jeton d'agent est refusé.
Paramètres
| status | string(open | accepted | dismissed) |
Réponse 200
| suggestions | AssistantSuggestion[] |
/api/assistant/suggestions/{id}Accepter ou rejeter une suggestion de délégation
Accepter : la suggestion se ferme et la règle préremplie revient pour que le client la crée (POST /api/assistant/rules). Rejeter : elle se ferme et ne revient jamais pour les mêmes sujets et traitement. Nécessite assistant:write ; un jeton d'agent est refusé.
Paramètres
| id* | string |
Corps de la demande
| action* | string(accept | dismiss) |
Réponse 200
| suggestion | AssistantSuggestion | |
| rule | AssistantRuleInput |
/api/assistant/grantsLister les grants attachés aux assignés
Les grants attachés aux agents et membres du propriétaire, en plus de chaque règle qui leur confie des affaires ; le plus strict de la règle et de l'assigné s'applique. Requiert assistant:read ; un jeton d'agent est refusé.
Réponse 200
| grants | AssistantAssigneeGrants[] |
/api/assistant/grantsDéfinir les grants d'un assigné
Attacher des grants à une identité d'agent ou un membre de workspace ; ils remplacent les grants précédents de l'assigné et plafonnent chaque règle qui leur confie des affaires. Requiert assistant:write ; un jeton d'agent est refusé.
Corps de la demande
| assignee_type* | string(agent | member) | |
| assignee_ref* | string | Le slug d'identité de l'agent, ou l'identifiant utilisateur du membre |
| grants* | AssistantGrants |
Réponse 200
| assignee | object | |
| grants | AssistantGrants | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/api/assistant/grants/{type}/{ref}Retirer les grants d'un assigné
L'assigné ne garde que ce que chaque règle accorde. Requiert assistant:write ; un jeton d'agent est refusé.
Paramètres
| type* | string(agent | member) | |
| ref* | string |
Réponse 200
| deleted | boolean |
/api/assistant/tasks/{id}Lire une enveloppe de tâche
L'affaire transmise, telle que l'assigné en a besoin : le résumé avec les preuves, les faits, la délégation (assigné, règle, niveau, les types d'effet autorisés, les grants effectifs), les plans ouverts et récents, le lease. Un token agent lit les affaires qui lui sont transmises et celles des boîtes mail qu'il opère ; le propriétaire lit les siennes. Requiert assistant:read. Un dossier issu d'un courrier d'authentification avant que ce courrier soit tenu à l'écart de l'assistant s'affiche avec son titre, son résumé, sa demande et les effets de son plan retenus pour un lecteur sans email:auth_secrets.
Paramètres
| id* | string | L'id de l'élément de travail |
Réponse 200
| id | string | L'id de l'élément de travail |
| version | integer | |
| status | string | |
| deadline | string (date-time) | null | |
| you | object | |
| delegation | object | |
| lease | AssistantTaskLease | |
| brief | object | null | Le résumé de l'affaire, tel que GET /api/assistant/work-items/{id}/brief y répond |
| facts | object | null | Les faits de l'affaire, tels que GET /api/assistant/work-items/{id}/facts y répond |
| plans | object | |
| escalations | object[] | Les questions posées sur la tâche, les plus récentes en premier, avec leurs réponses |
/api/assistant/tasks/{id}/leasePrendre ou renouveler le lease sur une tâche
Deux assignés ne travaillent jamais une affaire : le lease nomme qui la travaille jusqu'à quand (quinze minutes par défaut, jusqu'à une heure). Le reprendre le renouvelle ; un autre détenteur est refusé avec TASK_LEASED jusqu'à l'expiration. Une demande d'effets prend le lease d'elle-même. Requiert assistant:write.
Paramètres
| id* | string |
Corps de la demande
| ttl_seconds | integer |
Réponse 200
| task_id | string | |
| lease | AssistantTaskLease |
/api/assistant/tasks/{id}/leaseRendre le lease
Libère le lease que l'appelant détient ; un lease détenu par un autre assigné est laissé tranquille. Requiert assistant:write.
Paramètres
| id* | string |
Réponse 200
| task_id | string | |
| released | boolean | |
| lease | AssistantTaskLease |
/api/assistant/tasks/{id}/effectsDemander des effets sur une tâche
L'assigné demande un ou plusieurs effets (reply, forward, label, snooze, resolve, note, request). Le niveau de la délégation décide des types autorisés et les grants les plafonnent : dans les grants à guarded_send ou operate (et les types entrants à triage) les effets s'exécutent immédiatement avec leurs reçus ; à draft ils attendent l'approbation du propriétaire ; un grant échoué escalade au propriétaire ; un type que le niveau n'autorise pas est refusé. La propre demande du propriétaire s'exécute immédiatement. La même clé d'idempotence répond à nouveau avec le premier plan. Requiert assistant:write.
Paramètres
| id* | string |
Corps de la demande
| effects* | AssistantEffect[] | |
| idempotency_key* | string | |
| note | string | Ce que l'assigné veut que le propriétaire sache à propos de cette demande |
Réponse 200
| task_id | string | |
| replayed | boolean | |
| plan | AssistantPlan | |
| execution | object | null | |
| lease | AssistantTaskLease | |
| hint | string |
/api/assistant/tasks/{id}/escalateArrêter et demander au propriétaire
L'assigné pose une question avec les preuves et, lorsque c'est utile, les options qu'il voit. Le propriétaire répond avec les interactions ordinaires de choix ou d'instruction sur la décision que cela crée; l'affaire apparaît dans Today comme nécessitant le propriétaire, le bail est libéré, la tâche attend. Nécessite assistant:write.
Paramètres
| id* | string |
Corps de la demande
| question* | string | |
| options | object[] | |
| evidence_refs | string[] |
Réponse 200
| task_id | string | |
| escalation_id | string | |
| decision_id | string | |
| status | string | |
| version | integer | |
| hint | string |
/api/assistant/tasks/{id}/reportRapporter sur une tâche
Ce que l'assigné a fait et comment cela s'est terminé: done (l'affaire se résout, ou attend lorsqu'une réponse est encore attendue), blocked (le propriétaire est sollicité), ou handed back (le propriétaire reprend la main et la règle reste hors de cette affaire). Les réclamations sont réconciliées avec les reçus que la plateforme a écrits: une réclamation sans reçu est enregistrée comme une réclamation, jamais comme un fait. Le bail est libéré. Nécessite assistant:write.
Paramètres
| id* | string |
Corps de la demande
| outcome* | string(done | blocked | handed_back) | |
| summary* | string | |
| evidence_refs | string[] | |
| claims | object[] |
Réponse 200
| task_id | string | |
| outcome | string | |
| status | string | |
| reconciliation | object | |
| receipt_id | string | |
| hint | string |
/api/emails/{address}/messages/{id}/factsLire ce que l'assistant a établi à propos d'un message
Les connaissances que les analyses de ce message ont produites : affirmations (sujet, prédicat, valeur avec type et devise, base, confiance, validité, preuves), entités, engagements et attentes. Rien n'est calculé en cours de route : un message que le pipeline n'a jamais analysé répond analysed: false avec reason (not_enabled quand la boîte mail n'est pas dans l'assistant, not_analysed quand l'analyse n'a pas encore eu lieu). Nécessite assistant:read.
Paramètres
| address* | string | |
| id* | string | Identifiant du message |
Réponse 200
| message_id | string | |
| thread_id | string | |
| analysed | boolean | |
| reason | string | Seulement quand analysed est false |
| analysis | object | |
| facts | Fact[] | |
| entities | object[] | |
| commitments | object[] | |
| expectations | object[] |
/api/emails/{address}/messages/{id}/extractExtraire les champs dont vous avez besoin d'un message avec votre propre schéma
Un appel de modèle sur le texte du message (objet, expéditeur, corps) avec un schéma JSON de l'appelant d'objets et de primitives (jusqu'à 8 Ko, pas de références) : répond data dans cette forme, confidence (0 à 1) et evidence_quotes (extraits textuels). Mis en cache par (message, schéma, instructions) donc la même question coûte un appel (cached: true après). Limité par le budget de modèle du compte (429 quand épuisé, 503 quand la route de modèle est désactivée). Les mails de code de connexion répondent 403 AUTH_MESSAGE. Les corps de plus de 60 000 caractères répondent 413.
Paramètres
| address* | string | |
| id* | string | Identifiant du message |
Corps de la demande
| schema* | object | Schéma JSON des champs à extraire : un objet de primitives, tableaux et objets imbriqués, moins de 8 Ko, pas de $ref |
| instructions | string | Guidance optionnelle, par exemple montants en EUR |
Réponse 200
| message_id | string | |
| data | object | |
| confidence | number | |
| evidence_quotes | string[] | |
| model | string | |
| cached | boolean | |
| generated_at | string (date-time) | |
| usage | object |
/api/assistant/settingsObtenir les paramètres de l'assistant Mailzero
Renvoie l'état d'activation de l'assistant, les indicateurs shadow/pause, la version du consentement, la route de confidentialité, la portée des boîtes mail et toutes les boîtes mail que vous possédez. Nécessite l'autorisation assistant:read.
Réponse 200
| enabled | boolean | |
| shadow_enabled | boolean | |
| paused | boolean | |
| mailbox_ids | string[] | |
| agent_mailbox_ids | string[] | Boîtes opérées par vos agents. Leurs éléments apparaissent dans la section agents de Today au lieu de Needs you. |
| agents | object[] | Vos identités d'agents, pour la délégation. |
| search_opt_out_mailbox_ids | string[] | Boîtes aux lettres dont le courrier est recherché uniquement par mots : leurs messages ne sont jamais envoyés au modèle d'embedding. |
| brief_opt_out_mailbox_ids | string[] | Boîtes mail dont les résumés restent déterministes : aucun extrait de preuve n'est envoyé au modèle pour le résumé et la prochaine action (l'analyse du courrier entrant reste inchangée) |
| history_window_days | integer | |
| privacy_route | string | |
| attachment_vision | boolean | |
| community_signals | boolean | Vos signalements de phishing contribuent aux empreintes de la communauté (un domaine, la forme d'un objet, jamais un texte ou une adresse) et les comptages de la communauté alimentent vos signaux de confiance. Activé par défaut ; désactivé garde les deux locaux. |
| pipeline_version | string | |
| consent | object | |
| mailboxes | object[] |
Exemple de réponse
{
"enabled": false,
"shadow_enabled": true,
"paused": false,
"mailbox_ids": [
"mbx_123"
],
"history_window_days": 30,
"privacy_route": "private_cloud",
"attachment_vision": false,
"pipeline_version": "communication-analysis.v1",
"consent": {
"required_version": "mailzero-personal-ai.v1",
"accepted_version": "mailzero-personal-ai.v1",
"accepted_at": "2026-09-02T09:12:00.000Z"
},
"mailboxes": [
{
"id": "mbx_123",
"slug": "hello",
"domain": "example.com",
"name": "Hello",
"kind": "api",
"address": "hello@example.com"
}
]
}/api/assistant/settingsMettre à jour les paramètres de l'assistant Mailzero
Active, met en pause, reprend ou délimite explicitement le traitement de l'assistant. Envoyer mailbox_ids: [] désactive toutes les boîtes mail et annule un import d'historique en cours. La reprise nécessite la version actuelle du consentement. La réception du courrier reste indépendante. Nécessite l'étendue assistant:write.
Corps de la demande
| enabled | boolean | Afficher les Decisions dans Today et générer des brouillons à la demande |
| shadow_enabled | boolean | Analyser le courrier sans afficher les Decisions |
| paused | boolean | |
| mailbox_ids | string[] | IDs des boîtes mail possédées à traiter; un tableau vide désactive tout |
| agent_mailbox_ids | string[] | Boîtes opérées par vos agents. Leurs éléments apparaissent dans la section agents de Today au lieu de Needs you. |
| history_window_days | integer | |
| attachment_vision | boolean |
Réponse 200
| ok | boolean | |
| enabled | boolean | |
| shadow_enabled | boolean | |
| paused | boolean | |
| mailbox_ids | string[] |
Exemple de réponse
{
"ok": true,
"enabled": true,
"shadow_enabled": true,
"paused": false,
"mailbox_ids": [
"mbx_123"
]
}/api/assistant/previewConsentir et démarrer un import d'historique en arrière-plan
Enregistre le consentement IA explicite actuel, active le traitement en arrière-plan sur les boîtes mail sélectionnées appartenant à l'utilisateur et crée un import d'historique récent reprenables. Le client peut se fermer immédiatement et interroger GET /api/assistant/backfill. Nécessite l'étendue assistant:write.
Corps de la demande
| mailbox_ids* | string[] | |
| history_window_days | integer | |
| consent* | boolean(true) | |
| consent_version* | string(mailzero-personal-ai.v1) |
Réponse 200
| ok | boolean | |
| preview | object |
Exemple de réponse
{
"ok": true,
"preview": {
"mailbox_ids": [
"mbx_123"
],
"history_window_days": 30,
"scanned": 0,
"enqueued": 0,
"capped": false,
"background": true,
"backfill_id": "bf_456"
}
}/api/assistant/backfillObtenir la progression de l'import d'historique en arrière-plan
Renvoie la phase de scan/analyse, les messages traités et totaux, le pourcentage, l'ETA adaptatif, l'état de pause et si l'application peut se fermer. Nécessite l'autorisation assistant:read.
Réponse 200
| backfill | object | null |
Exemple de réponse
{
"backfill": {
"id": "bf_456",
"status": "processing",
"phase": "analysis",
"paused": false,
"processed": 12,
"total": 40,
"failed": 0,
"percent": 30,
"estimated_seconds_remaining": 240,
"estimated_completion_at": "2026-09-02T09:20:00.000Z",
"can_close_app": true,
"started_at": "2026-09-02T09:12:00.000Z",
"completed_at": null
}
}/api/assistant/backfillRéessayer les messages d'import d'historique échoués
Remet en file d'attente les échecs terminaux de l'import le plus récent pour les boîtes mail qui restent activées pour l'IA. Les tentatives automatiques ont déjà été épuisées avant qu'un message n'apparaisse ici. Nécessite l'étendue assistant:write.
Réponse 200
| ok | boolean | |
| retried | integer |
Exemple de réponse
{
"ok": true,
"retried": 2
}/api/assistant/todayObtenir la file de décisions ancrées de Today
Renvoie les projections versionnées Now, Needs you, Waiting, Upcoming et Handled récentes avec as_of, lag, coverage et warnings. Chaque élément pointe vers son message source ; rien ici n'envoie de courrier. Nécessite l'autorisation assistant:read. Le courrier d'authentification (codes de connexion, réinitialisations de mot de passe, liens magiques) ne devient jamais un dossier et n'atteint jamais un modèle. Un dossier issu d'un courrier d'authentification avant que ce courrier soit tenu à l'écart de l'assistant s'affiche avec son titre, son résumé, sa demande et les effets de son plan retenus pour un lecteur sans email:auth_secrets.
Paramètres
| agent | string | Vue d'un seul agent : les éléments des boîtes mail qu'il gère et les éléments qui lui sont confiés. Un jeton lié à une identité d'agent obtient toujours la vue de cet agent ; nommer un autre agent renvoie 403 AGENT_SCOPE. |
| category | string | Un seul type de sujet (invoice, meeting_request, newsletter...) ; le champ categories de la réponse liste chaque type présent dans la vue avec son nombre. Un type inconnu répond 400 INVALID_CATEGORY. |
| tag | string | Seulement les dossiers qui portent cette étiquette (l'une des étiquettes de la personne) ; le champ tags de la réponse liste chaque étiquette de la vue avec son nombre. |
Réponse 200
| type | string | |
| as_of | string | |
| projection_lag_ms | integer | |
| category | string | null | Le type de sujet auquel la vue est restreinte (le paramètre category), ou null pour tous les types. |
| categories | object | Chaque type de sujet présent dans la vue, avant le filtre, avec le nombre d'éléments qu'il contient. |
| tag | string | null | L'étiquette à laquelle la vue est restreinte (le paramètre tag), ou null pour tous les dossiers. |
| tags | object | Chaque étiquette de la personne dans la vue, avant le filtre, avec le nombre de dossiers qui la portent. |
| sections | object |
Exemple de réponse
{
"type": "today",
"as_of": "2026-09-02T09:15:00.000Z",
"projection_lag_ms": 4200,
"category": null,
"categories": {
"partner_inquiry": 1
},
"tag": null,
"tags": {
"lumenworks": 1
},
"sections": {
"now": [
{
"id": "wi_789",
"version": 3,
"status": "needs_judgment",
"title": "Investor update",
"summary": "Paul needs the August metrics before his 16:00 partner call.",
"category": "partner_inquiry",
"tags": [
"lumenworks"
],
"proposed_tags": [],
"mailbox": {
"id": "mbx_123",
"address": "hello@example.com",
"name": "Hello"
},
"source": {
"type": "domani-postgres",
"conversation_id": "conv_1",
"event_id": "msg_1",
"revision": 1
},
"attention": {
"level": "now",
"reason": "Deadline today from a known investor",
"confidence": "high",
"deadline": "2026-09-02T16:00:00.000Z"
},
"decision": {
"id": "dec_1",
"version": 1,
"status": "open",
"question": "How do you want to answer Paul?",
"options": [
{
"id": "opt_send",
"label": "Send current metrics",
"recommended": true
},
{
"id": "opt_tomorrow",
"label": "Ask for tomorrow"
}
]
}
}
],
"needs_you": [],
"waiting": [],
"upcoming": [],
"handled": []
}
}/api/assistant/work-items/{id}Récupérer un élément Work de l'assistant et le plan actuel exact
Renvoie l'élément Work ancré, sa Decision ouverte et ses options, le plan Action actuel exact, les engagements et attentes ouverts, les interactions et les reçus. Nécessite l'autorisation assistant:read. Un dossier issu d'un courrier d'authentification avant que ce courrier soit tenu à l'écart de l'assistant s'affiche avec son titre, son résumé, sa demande et les effets de son plan retenus pour un lecteur sans email:auth_secrets.
Paramètres
| id* | string | ID de l'élément Work de la file Today |
Réponse 200
| id | string | |
| version | integer | |
| status | string | |
| title | string | |
| summary | string | |
| ask | string | null | La seule chose que le propriétaire doit faire ou décider, ou null. |
| category | string | null | Le type de sujet trouvé par l'analyse (une facture, une demande de réunion, une lettre d'information...), ou null quand aucune analyse ne l'a dit. Les règles le reconnaissent sous le libellé category:<kind>. |
| tags | string[] | Les étiquettes de la personne sur le dossier (CT-01b) : confirmées une fois ou posées à la main, chacune est un libellé sur le fil chez le fournisseur. Les règles les reconnaissent comme le libellé tag:<name>. |
| proposed_tags | string[] | Les étiquettes que le moteur propose pour le dossier (une par projet qu'il a nommé), pas encore confirmées. Confirmez-en une avec l'interaction tag ; elle s'applique ensuite au prochain dossier du même projet sans question. |
| suspect | boolean | Les signaux de confiance ont trouvé l'expéditeur suspect : l'affaire se trouve dans la section Suspect, n'est jamais Now, ne porte aucune décision, et aucun effet ne s'exécute dessus jusqu'à ce que la personne la signale comme légitime. |
| suspect_reasons | string[] | Pourquoi cela semble suspect, une phrase par signal (une authentification échouée, un Reply-To divergent, un domaine sosie, un nom emprunté, un premier contact à propos d'argent, une instruction à l'assistant, un secret demandé par retour de courrier). |
| sender | object | null | |
| recurrence | object | Combien de fois cette même situation est revenue : un élément, N messages. |
| mailbox | object | |
| opened_at | string | null | |
| delegated_to | string | null | Le slug de l'agent à qui le propriétaire a confié cet élément, ou null. |
| delegation_rule | object | null | La délégation permanente qui a transmis cet élément, et pourquoi elle correspondait ; suspendue une fois que le propriétaire a repris l'élément. |
| unread | boolean | Vrai tant que le propriétaire n'a pas ouvert l'élément après sa dernière modification. |
| messages | object[] | Les messages sources à l'origine de cet élément, du plus récent au plus ancien. |
| history | object[] | Ce qui s'est déjà passé dans ce dossier, du plus ancien au plus récent : une ligne par message antérieur. |
| source | object | |
| attention | object | |
| analysis | object | |
| evidence_refs | string[] | |
| entity_refs | string[] | |
| snoozed_until | string | null | |
| decision | object | null | |
| plan | object | null |
/api/assistant/work-items/{id}/briefLire le résumé de situation d'un élément de travail
Un document qu'un agent lit avant d'agir : la situation (statut, attention, récurrence, expéditeur), l'historique jusqu'à présent (chaque courrier, analysé ou non), les faits établis par les analyses (affirmations avec valeur, base et validité, et les entités), les engagements et attentes ouverts avec ce qui est attendu de qui et depuis quand, ce qui est déjà réglé (boucles fermées et accusés de réception), la Décision actuelle avec ses options, une prochaine étape suggérée (l'option recommandée de la Décision quand il y en a une, sinon une règle : une promesse en retard, une attente en retard à relancer, la demande de l'expéditeur à laquelle répondre), et les messages de preuve. Déterministe et peu coûteux : aucun appel de modèle. Les tokens d'agent lisent les éléments des boîtes aux lettres qu'ils opèrent et les éléments qui leur sont remis.
Paramètres
| id* | string | ID de l'élément Work |
| synthesis | boolean | Définir sur false pour ignorer la lecture du modèle (résumé, action suivante concrète, questions ouvertes) et lire uniquement le brief déterministe; la lecture est mise en cache par état des preuves |
Réponse 200
| id | string | |
| version | integer | |
| generated_at | string (date-time) | |
| title | string | |
| summary | string | |
| ask | string | null | |
| mailbox | object | |
| delegated_to | string | null | |
| situation | object | |
| story | object[] | Chaque courrier de la situation, du plus ancien au plus récent, avec le titre d'une ligne que l'analyse lui a donné |
| facts | object[] | |
| entities | object[] | |
| commitments | object[] | Promesses ouvertes faites par le côté du propriétaire |
| expectations | object[] | Choses ouvertes attendues des autres |
| settled | object[] | Boucles fermées et accusés de réception, du plus récent au plus ancien |
| awaiting | object[] | |
| decision | object | null | La Décision préparée actuelle avec ses options |
| summary_source | string | Si le résumé est la lecture du modèle des preuves ou la propre phrase du pipeline |
| suggested_next | object | null | |
| open_questions | string[] | Ce que seul le propriétaire peut décider avant l'action suivante, au maximum trois questions |
| synthesis | object | null | L'appel du modèle qui a écrit le résumé et l'action suivante, null lorsque le brief est uniquement déterministe |
| evidence | object[] | |
| owner_replies | object[] | |
| evidence_refs | string[] |
/api/assistant/briefLire le résumé de situation pour un correspondant
Ce qu'il faut savoir avant de répondre à une personne : le résumé de leur élément de travail actif le plus récent parmi les boîtes aux lettres que vous pouvez lire (ou une boîte aux lettres), les autres éléments dont ils sont responsables, et leurs dix derniers courriers. brief est null quand rien n'a encore été analysé de leur part.
Paramètres
| correspondent* | string | L'adresse email de la personne |
| mailbox | string | Restreindre à une adresse de boîte aux lettres (slug@domain) |
Réponse 200
| correspondent | string | |
| mailboxes | string[] | |
| brief | any | |
| related | object[] | |
| recent_mail | object[] | |
| generated_at | string (date-time) |
/api/assistant/work-items/{id}/factsLire les faits derrière un élément Work
Les affirmations et entités fusionnées de chaque analyse de l'élément (le plus récent gagne en premier), plus ses engagements et attentes stockés avec leur statut. Les jetons d'agent lisent les éléments des boîtes mail qu'ils opèrent et les éléments qui leur sont remis.
Paramètres
| id* | string | ID de l'élément Work |
Réponse 200
| work_item_id | string | |
| version | integer | |
| analysed | boolean | |
| analyses | object[] | |
| facts | Fact[] | |
| entities | object[] | |
| commitments | object[] | |
| expectations | object[] | |
| evidence_refs | string[] |
/api/assistant/work-items/{id}/openMarquer un élément Work comme ouvert
Enregistre que le propriétaire a ouvert cet élément Work dans sa version actuelle, ce qui retire son marqueur non lu jusqu'à ce que l'élément change à nouveau. Nécessite l'étendue assistant:write.
Paramètres
| id* | string |
Réponse 200
| ok | boolean | |
| opened_at | string | |
| unread | boolean |
/api/assistant/learnedCe que l'assistant a appris sur vous
Les règles de silence que l'assistant propose après que le même expéditeur ou la même organisation a été ignoré à chaque retour, les mises en sourdine en vigueur (un expéditeur, un domaine ou une situation que l'assistant tient hors d'Aujourd'hui), chacune avec sa raison, et les étiquettes confirmées une fois, chacune appliquée au prochain dossier du même projet sans question. Acceptez une règle de silence via l'endpoint suggestions ; oubliez une mise en sourdine avec l'endpoint mutes, une étiquette avec l'endpoint tags.
Réponse 200
| mutes | object[] | Les mises en sourdine en vigueur, les plus récentes en premier. |
| suggestions | AssistantSuggestion[] | Les règles de silence ouvertes : acceptez-en une via l'endpoint suggestions pour définir la mise en sourdine qu'elle porte. |
| tags | object[] | Les étiquettes confirmées une fois (CT-01b), les plus récentes d'abord : chacune s'applique au prochain dossier du même projet sans question jusqu'à ce qu'elle soit oubliée. |
/api/assistant/learned/mutesOublier une mise en sourdine
Le prochain mail de cet expéditeur, domaine ou situation redevient un item.
Corps de la demande
| kind* | string(sender | sender_domain | situation) | |
| value* | string | L'adresse, le domaine ou la clé de situation, comme la vue learned le liste. |
Réponse 200
| ok | boolean | |
| kind | string | |
| value | string |
/api/assistant/learned/tagsOublier une étiquette
Plus rien n'est appliqué sans question : le prochain dossier de ce projet propose à nouveau l'étiquette. Les dossiers qui la portent la gardent.
Corps de la demande
| name* | string | L'étiquette, telle que la vue learned la liste. |
Réponse 200
| ok | boolean | |
| name | string |
/api/assistant/work-items/{id}/investigateEnquêter sur une affaire : ce que disent le registre et les liens
Lit, à cet instant, les faits que l'infrastructure publique détient sur le domaine de l'expéditeur (sa date d'enregistrement et son registraire, sa posture SPF et DMARC, s'il reçoit du courrier), où chaque lien du message source va réellement (les redirections suivies un saut à la fois, l'hôte final et les faits du domaine de celui-ci), et ce que chaque pièce jointe est réellement (ses premiers octets par rapport au nom et au type déclaré). Répond le dossier avec les signaux que les faits ajoutent (un domaine enregistré il y a quelques jours, un lien qui atterrit ailleurs, un domaine d'expéditeur qui ne protège rien, un programme nommé comme un document). Aucun fournisseur, aucun compte, rien de stocké; une recherche qui échoue est un fait en soi.
Paramètres
| id* | string |
Réponse 200
| work_item_id | string | |
| source | string | Si le message source a été lu, ou seulement l'adresse de l'expéditeur. |
| checked_at | string | |
| sender | object | |
| links | object[] | |
| attachments | object[] | Ce que chaque pièce jointe est réellement, lu depuis ses premiers octets par rapport à ce que son nom et son type déclaré promettent. |
| signals | object[] | Ce que les faits ajoutent à l'évaluation, une phrase chacun. |
/api/assistant/work-items/{id}/senderQui est derrière une affaire : l'organisation, les personnes impliquées, l'historique
Répond la fiche expéditeur d'une affaire : l'organisation de l'expéditeur telle que le profil de domaine stocké la connaît (nom, raison sociale, catégorie, site web, date d'enregistrement, posture de messagerie ; null pour un domaine de messagerie partagé comme gmail.com ou un domaine jamais analysé, et jamais une analyse en direct), les personnes que les messages de l'histoire portent dans from, to et cc avec leurs rôles et si elles appartiennent à la même organisation (les propres boîtes du lecteur exclues), et la relation : combien de courrier est venu de cette adresse à travers les boîtes du lecteur (compté jusqu'à 50), quand pour la première et la dernière fois, les autres affaires de l'expéditeur et les affaires soulevées par des collègues du même domaine. Requiert le scope assistant:read.
Paramètres
| id* | string |
Réponse 200
| work_item_id | string | |
| sender | object | null | |
| organisation | object | null | Null pour un domaine de messagerie partagé ou un domaine jamais analysé. |
| participants | object[] | |
| relationship | object | |
| generated_at | string (date-time) |
/api/assistant/work-items/{id}/interactionsEnregistrer une Decision humaine verrouillée par version
Choisir une option, donner une instruction, prendre le contrôle, mettre en veille, ignorer, corriger, signaler le verdict de confiance (phishing ou légitime), ou approuver ou rejeter un plan en attente (un plan approuvé s'exécute immédiatement, avec ses reçus dans la réponse). L'appel est clôturé par work_item_version et rejoué de manière idempotente par idempotency_key. Choisir ou instruire prépare un brouillon exact qui passe toujours par le flux de réponse normal ; ce endpoint n'envoie jamais de courrier. Nécessite le scope assistant:write.
Paramètres
| id* | string |
Corps de la demande
| scope | string(item | sender | sender_domain | situation) | Avec le type ignore : masquer également l'expéditeur, son domaine ou cette situation récurrente pour qu'elle ne revienne jamais. |
| verdict | string(phishing | legitimate) | Avec type report : le verdict de la personne sur les signaux de confiance. Phishing ferme l'affaire, met l'expéditeur en sourdine et ferme ses autres affaires actives ; legitimate efface le verdict suspect et ses raisons. |
| plan_id | string | Avec type approve ou reject : le plan d'action en attente (proposé ou escaladé). |
| reason | string | Avec type reject : pourquoi, conservé sur le plan. |
| type* | string(choose | instruct | take_over | snooze | ignore | correct | delegate | approve | reject | report | tag) | |
| add | string[] | Avec type tag : les étiquettes à poser sur le dossier (une proposée confirmée, ou une à la main ; minuscules, lettres, chiffres et tirets). Une étiquette ajoutée une fois est apprise : le prochain dossier du même projet la reçoit sans question. |
| remove | string[] | Avec type tag : les étiquettes à retirer du dossier (une proposition nommée ici est refusée). La page learned oublie une étiquette pour de bon. |
| agent_slug | string | null | Avec le type delegate : le slug de votre agent à qui confier l'élément, ou null pour le reprendre. |
| member_id | string | null | Avec type delegate : l'id utilisateur d'un membre de votre espace de travail à qui transmettre l'élément au lieu d'un agent ; il le trouve sous handed_to_you dans son Today et le traite via les endpoints tasks sous son propre accès. |
| work_item_version* | integer | |
| decision_id | string | |
| decision_version | integer | |
| option_id | string | |
| instruction | string | |
| until | string (date-time) | |
| remind_at | string (date-time) | |
| field | string | |
| correction | string | |
| idempotency_key* | string |
Réponse 200
| ok | boolean | |
| work_item | AssistantWorkItem | |
| plan_id | string | null |
/api/assistant/action-plans/{id}Obtenir l'aperçu exact de l'action par ID opaque
Renvoie l'identité de réponse exacte, les destinataires, le corps, les engagements et les effets secondaires d'un plan d'action préparé, ainsi que son expiration et sa révision source, afin qu'un client puisse montrer ce qui se passera avant que l'utilisateur n'envoie via le endpoint de réponse existant avec assistant_plan_id. Nécessite l'étendue assistant:read.
Paramètres
| id* | string | ID de plan d'action opaque |
Réponse 200
| id | string | |
| status | string | |
| expires_at | string | |
| source_revision | integer | |
| effects | object[] |
/api/assistant/activityObtenir l'activité de l'assistant avec contenu minimisé
Liste les interactions et reçus récents attribués à l'appelant sans les corps de message. Nécessite l'étendue assistant:read.
Paramètres
| limit | integer |
Réponse 200
| type | string | |
| as_of | string | |
| events | object[] |
/api/assistant/dataExporter les données dérivées de l'assistant
Exporte les analyses, faits acceptés, décisions, interactions, reçus et utilisation du modèle sous forme de pièce jointe JSON. N'inclut jamais les corps d'email source ni les octets des pièces jointes. Nécessite le scope assistant:write. Il faut aussi email:auth_secrets (403 INSUFFICIENT_SCOPE sinon) : l'état dérivé peut contenir ce que l'assistant a tiré du courrier d'authentification avant que ce courrier n'en soit écarté.
Réponse 200
| format | string | |
| exported_at | string | |
| note | string |
/api/assistant/dataSupprimer les données dérivées de l'assistant
Supprime de manière idempotente l'intelligence dérivée, les tâches, l'utilisation du modèle, les appareils, les importations et les paramètres tout en préservant le courrier source. Nécessite l'étendue assistant:write.
Réponse 200
| ok | boolean | |
| deleted | object | |
| source_mail_deleted | boolean |
Exemple de réponse
{
"ok": true,
"deleted": {
"work_items": 12,
"claims": 40,
"entities": 9,
"jobs": 52
},
"source_mail_deleted": false
}/api/assistant/devicesEnregistrer un appareil pour les alertes Now masquées
Enregistre ou fait pivoter un jeton push chiffré pour une installation d'application et un environnement. Seule l'application native appelle ceci; nécessite un assistant actif et l'autorisation assistant:write.
Corps de la demande
| installation_id* | string | |
| platform* | string(ios | android) | |
| environment* | string(development | preview | production) | |
| push_token* | string | |
| locale* | string | |
| lock_screen_detail | string(redacted | sender_only) |
Réponse 200
| ok | boolean | |
| device | object |
/api/assistant/devicesRévoquer un enregistrement d'appareil
Révoque tous les enregistrements push d'une installation, par exemple lors de la déconnexion. Nécessite l'étendue assistant:write.
Paramètres
| installation_id* | string |
Réponse 200
| ok | boolean |
/api/domains/{domain}/email/checkVérifier l'état du DNS des e-mails (MX, SPF, DMARC, DKIM)
Vérifie la configuration DNS de la messagerie pour un domaine : enregistrements MX, SPF, DMARC et DKIM. Détecte automatiquement le fournisseur de messagerie à partir des enregistrements MX (Google Workspace, Proton, Fastmail).
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| provider | string | null | Fournisseur de messagerie détecté automatiquement (google-workspace, proton, fastmail) ou null |
| mx | object | |
| spf | object | |
| dmarc | object | |
| dkim | object |
Exemple de réponse
{
"domain": "mysite.com",
"provider": "google-workspace",
"mx": {
"configured": true,
"records": [
"1 aspmx.l.google.com",
"5 alt1.aspmx.l.google.com"
]
},
"spf": {
"configured": true,
"value": "v=spf1 include:_spf.google.com ~all"
},
"dmarc": {
"configured": true,
"value": "v=DMARC1; p=quarantine; rua=mailto:dmarc@mysite.com"
},
"dkim": {
"configured": true,
"selectors": [
"google"
]
}
}Exemple
curl https://domani.run/api/domains/mysite.com/email/check \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/email/deliverabilityObtenez l’état de la délivrabilité des e-mails à l’échelle du propriétaire
Sépare la préparation à l’authentification déterministe, les résultats d’acheminement pondérés par destinataire sur 30 jours, l’état de sécurité du compte et le placement mesuré par fournisseur. Le score de préparation n’est pas une probabilité d’arrivée en boîte de réception, et un placement non mesuré est renvoyé comme not_tested.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| status | string | |
| confidence | string | |
| checked_at | string (date-time) | |
| window_days | integer | |
| readiness | object | Préparation à la configuration DNS déterministe. Le score n’est pas une probabilité dans la boîte de réception. |
| sending_health | object | |
| placement | object | |
| actions | object[] | |
| caveats | string[] |
Exemple
curl https://domani.run/api/domains/mysite.com/email/deliverability \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/email/setupConfigurer la messagerie sur un domaine
Préconfigurez le DNS de messagerie sur un domaine (facultatif). Ceci est appelé automatiquement par create_mailbox en cas de besoin. Passez force=true pour remplacer le fournisseur de messagerie existant (Google Workspace, Fastmail, Proton).
Paramètres
| domain* | string | Nom de domaine |
Corps de la demande
| force | boolean | Remplacez le fournisseur de messagerie existant (Google Workspace, Fastmail, Proton). Par défaut : faux |
Réponse 200
| domain | string | |
| status | string | |
| verified_at | string | null | |
| receiving_verified | boolean | Vrai quand le MX du domaine pointe vers le récepteur de la plateforme, donc les e-mails de ses adresses sont acceptés. |
| sending_configured | boolean | |
| sending_verified | boolean | |
| records | DnsRecord[] | |
| hint | string |
/api/domains/{domain}/email/setupSupprimer l'e-mail d'un domaine
Supprimez le courrier électronique d'un domaine, supprimez toutes les boîtes aux lettres et tous les messages, puis définissez emailEnabled sur false. Cela modifie le courrier de tout le domaine : un jeton confiné à des boîtes aux lettres reçoit donc 403 MAILBOX_CONFINED.
Paramètres
| domain* | string | Nom de domaine |
/api/domains/{domain}/email/statusVérifier l'état DNS du courrier électronique
Vérifiez l'état de vérification DNS des e-mails pour un domaine. Indique si le domaine est vérifié et prêt, les détails de l'enregistrement DNS et le nombre de boîtes aux lettres.
Paramètres
| domain* | string | Nom de domaine |
Réponse 200
| domain | string | |
| enabled | boolean | |
| verified | boolean | Vrai uniquement lorsque la réception et l'envoi sortant sont vérifiés |
| receiving_verified | boolean | Vrai quand le MX du domaine pointe vers le récepteur de la plateforme, donc les e-mails de ses adresses sont acceptés. |
| sending_configured | boolean | |
| sending_verified | boolean | |
| records | DnsRecord[] | |
| mailbox_count | integer | |
| dns_managed | boolean | Vrai quand Domani écrit lui-même la zone du domaine : les enregistrements en attente sont publiés et réparés par un audit horaire, rien à ajouter à la main. Faux pour une zone externe, où les enregistrements en attente doivent être ajoutés chez le fournisseur DNS. |
| unreachable_addresses | string[] | Adresses du domaine que son MX de réception refuse (boîtes api sur un domaine hébergé pas encore enregistrées sur l'hôte de messagerie). Vide lorsque chaque adresse peut recevoir ; l'enregistrement est retenté automatiquement. |
| provider_status | string | |
| mailbox_plan_key | string | La clé du plan de l’espace de travail qui régit ici les boîtes mail sur domaine personnalisé (l’abonnement propre à l’espace de travail, pas forcément le plan personnel de l’utilisateur connecté). |
| mailbox_limit | integer | null | Nombre de boîtes mail sur domaine personnalisé que le plan autorise dans tout l’espace de travail. null signifie illimité. |
| mailbox_limit_reached | boolean | Vrai dès que l’espace de travail atteint la limite de boîtes mail de son plan : une autre boîte mail sur ce domaine demande d’abord de changer de plan. |
| mailbox_upgrade_plan | object | null | Le plan le moins cher qui laisserait de la place pour une autre boîte mail. null si c’est déjà illimité. |
| hint | string |
/api/emailCréer une boîte mail sur domani.run
Créez une adresse e-mail gratuite sur domani.run (par exemple hello@domani.run). Aucune propriété de domaine requise. Limité à 1 boîte mail @domani.run gratuite par utilisateur. De nombreuses limaces communes sont réservées.
Corps de la demande
| slug* | string | Partie locale de l’adresse e-mail (par exemple 'hello' pour hello@domani.run) |
| name | string | Nom d'affichage (par défaut, slug en majuscule) |
Réponse 201
| id | string | |
| address | string | |
| name | string | null | |
| slug | string | |
| domain | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| collaboration_enabled | boolean | |
| shared | boolean | Indique si au moins une personne autre que l’appelant peut lire cette boîte aux lettres |
| message_count | integer | |
| webhook_url | string | null | |
| header_names | string[] | Noms d'en-tête d'authentification de webhook configurés ; les valeurs ne sont jamais renvoyées |
| forward_to | string | null | |
| signing_secret | string | null | |
| created_at | string (date-time) | |
| hint | string |
/api/emailLister toutes les boîtes aux lettres
Répertorier toutes les boîtes aux lettres auxquelles l’identité appelante peut accéder sur l’ensemble des domaines, y compris grâce aux autorisations de l’espace de travail.
Paramètres
| domain | string | Filtrer par domaine |
Réponse 200
| mailboxes | object[] |
/api/emailsCréer une boîte aux lettres
Créez une adresse e-mail (boîte aux lettres). Fournissez une adresse complète telle que "hello@mysite.com". Le DNS de messagerie est automatiquement configuré lors de la première utilisation. Passez force=true pour remplacer un fournisseur de messagerie existant. La capacité de la boîte aux lettres du domaine personnalisé est déterminée par le compte actif ou le plan d'espace de travail. Chaque compte peut créer une boîte aux lettres @domani.run gratuite séparément avec POST /api/email. Transmettez workspace_id pour créer la boîte aux lettres dans un espace de travail que vous possédez. Pour un domaine personnalisé, cela adopte explicitement et atomiquement le domaine et toutes ses boîtes aux lettres sœurs non délimitées dans cet espace de travail ; un domaine ne peut jamais être divisé en plusieurs espaces de travail. Passez kind="hosted" pour créer une véritable boîte aux lettres IMAP/SMTP sur votre propre domaine (connectez Apple Mail, Thunderbird ou n'importe quel client) au lieu de la boîte aux lettres API par défaut (envoyer/recevoir via API + webhooks). Les boîtes aux lettres hébergées renvoient des enregistrements DNS à publier, les paramètres du client de messagerie et un mot de passe d'application à usage unique. Nécessite un domaine que vous possédez.
Corps de la demande
| address* | string | Adresse e-mail complète, par ex. hello@mysite.com |
| name | string | Nom d'affichage pour les e-mails sortants (par exemple "John Doe") |
| force | boolean | Remplacez les enregistrements MX existants. Par défaut : faux |
| kind | string(api | hosted) | "api" (par défaut : envoyer/recevoir via API + webhooks) ou "hosted" (véritable boîte mail IMAP/SMTP sur votre domaine) |
| workspace_id | string | Espace de travail pour posséder la boîte aux lettres. Seul le propriétaire de l'espace de travail peut adopter des ressources. |
Réponse 201
| id | string | |
| address | string | |
| name | string | null | |
| domain | string | |
| slug | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| collaboration_enabled | boolean | |
| shared | boolean | Indique si au moins une personne autre que l’appelant peut lire cette boîte aux lettres |
| message_count | integer | |
| webhook_url | string | null | |
| header_names | string[] | Noms d'en-tête d'authentification de webhook configurés ; les valeurs ne sont jamais renvoyées |
| forward_to | string | null | |
| signing_secret | string | null | Secret HMAC pour vérifier les charges utiles des webhooks entrants (affiché une fois lors de la création) |
| host_id | string | ID principal de l'hôte de messagerie pour une boîte aux lettres hébergée |
| dns_records | DnsRecord[] | |
| dns_status | string | |
| receiving_status | string | |
| sending_status | string | |
| sending_error | object | |
| client_settings | object | |
| credential | object | |
| storage_quota_bytes | integer | |
| created_at | string (date-time) | |
| hint | string |
/api/emailsLister toutes les boîtes aux lettres
Répertorier toutes les boîtes aux lettres auxquelles l’identité appelante peut accéder, y compris grâce aux autorisations de l’espace de travail. Identique à GET /api/email.
Paramètres
| domain | string | Filtrer par domaine |
Réponse 200
| mailboxes | object[] |
/api/emails/{address}Obtenir les détails de la boîte aux lettres
Obtenez des détails sur une boîte aux lettres spécifique grâce à son adresse e-mail complète (codée en URL, par exemple hello%40mysite.com).
Paramètres
| address* | string | Adresse e-mail complète (codée en URL, par exemple hello%40mysite.com) |
Réponse 200
| id | string | |
| address | string | |
| slug | string | |
| domain | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| webhook_url | string | null | |
| forward_to | string | null | |
| signing_secret | string | null | Secret HMAC pour les managers ; null pour les téléspectateurs/répondeurs |
| message_count | integer | |
| storage_quota_bytes | integer | null | |
| storage_used_bytes | integer | null | |
| storage_measured_at | string (date-time) | null | |
| created_at | string (date-time) |
/api/emails/{address}Mettre à jour la boîte aux lettres
Mettez à jour le nom d’affichage d’une boîte aux lettres, l’URL du webhook ou l’adresse e-mail de transfert par son adresse e-mail complète. Définissez sur null pour désactiver/effacer.
Paramètres
| address* | string | Adresse e-mail complète (codée en URL) |
Corps de la demande
| name | string | null | Nom d'affichage de la boîte aux lettres. Définissez sur null pour effacer. |
| webhook_url | string | null | URL HTTPS pour le webhook de courrier électronique entrant, ou null pour effacer |
| forward_to | string | null | Adresse e-mail vers laquelle transférer les e-mails entrants, ou null pour effacer |
| drop_spam | boolean | Supprimer (ne pas stocker ni webhook) les messages entrants signalés comme spam |
| tone_notes | string | null | Indications de voix que les agents lisent avant de rédiger depuis cette boîte aux lettres (ton, signature, formulations à adopter et à éviter). Définir sur null pour effacer. |
Réponse 200
| id | string | |
| address | string | |
| slug | string | |
| domain | string | |
| name | string | null | |
| webhook_url | string | null | |
| forward_to | string | null | |
| tone_notes | string | null | |
| signing_secret | string | Secret HMAC pour vérifier les charges utiles des webhooks entrants |
/api/emails/{address}Supprimer une boîte aux lettres
Supprimez une boîte aux lettres par son adresse e-mail complète. Nécessite confirm=true dans le corps. Sans confirmation, renvoie un aperçu avec message_count.
Paramètres
| address* | string | Adresse e-mail complète (codée en URL) |
Corps de la demande
| confirm | boolean | Doit être vrai pour être réellement supprimé. Omettre l'aperçu. |
/api/emails/{address}/sendEnvoyer un email
Envoyez un e-mail depuis une boîte identifiée par son adresse complète. Le serveur exécute d’abord une politique versionnée obligatoire : les échecs objectifs de sécurité sont refusés, tandis que les problèmes de réputation et de qualité du contenu sont renvoyés comme avertissements. Pour une réponse collaborative dans un fil, transmettez le bail de composition, la valeur reply_version observée et une clé d’idempotence stable ; le serveur rejette atomiquement les réponses périmées ou doubles juste avant l’envoi. Maximum 20 destinataires uniques par message. Limite : 100 destinataires par heure et par boîte.
Paramètres
| address* | string | Adresse e-mail de l'expéditeur (codée en URL) |
Corps de la demande
| to* | any | Adresse(s) e-mail du destinataire |
| cc | any | Destinataire(s) CC |
| bcc | any | Destinataire(s) BCC |
| subject | string | |
| text | string | Corps de texte brut |
| html | string | Corps HTML |
| reply_to | string | Adresse de réponse |
| in_reply_to | string | ID de message de l'e-mail auquel on répond (pour le fil de discussion) |
| references | string | Chaîne d'ID de message séparée par des espaces (pour le threading) |
| idempotency_key | string | Clé stable qui empêche les envois en double |
| send_at | string (date-time) | Planifier l’envoi (ISO 8601, de 30 secondes à 30 jours à l’avance). Le message est stocké avec le statut 'scheduled' et expédié côté serveur ; déplacez-le vers la corbeille avant l’échéance pour annuler. Les pièces jointes ne sont pas encore prises en charge avec send_at. |
| coordination | object | Requis pour une réponse collaborative gardée. |
| allow_risky_content | boolean | Champ de compatibilité obsolète. Les liens d'authentification tiers HTTPS publics sont autorisés avec un avertissement ; les blocs de sécurité objectifs ne peuvent pas être annulés. |
| attachments | object[] | Pièces jointes (max 10, max 40 Mo au total). Le contenu doit être codé en base64. |
Réponse 200
| id | string | |
| message_id | string | ID de message RFC 5322 |
| from | string | |
| to | string | |
| bcc | string | null | Destinataire(s) Bcc de votre envoi, renvoyés uniquement sur votre propre message sortant ; jamais transmis comme en-tête et jamais présents sur un message reçu. |
| status | string | |
| attachments_count | integer | |
| suppressed | string[] | |
| deliverability | object | Rapport de stratégie versionné appliqué à cet envoi ; Décision d'inspection et contrôles catégorisés |
/api/emails/{address}/deliverability-checkContrôler en amont un e-mail sortant
Exécutez la stratégie côté serveur versionnée exacte utilisée par le point de terminaison d’envoi sans envoyer ni consommer de quota de courrier électronique. Les liens d'authentification HTTPS publics sur des domaines tiers sont autorisés avec un avertissement de réputation. Les URL locales/privées, les liens d'authentification non HTTPS et les pièces jointes exécutables sont bloqués ; les corps au-dessus de 102 Ko produisent un avertissement d'écrêtage.
Paramètres
| address* | string | Adresse e-mail de l'expéditeur (codée en URL) |
Corps de la demande
| subject | string | |
| text | string | |
| html | string | |
| idempotency_key | string | |
| allow_risky_content | boolean | Champ de compatibilité obsolète ; les blocs de sécurité objectifs ne peuvent pas être annulés. |
| attachments | object[] |
Réponse 200
| policy_version | string | |
| decision | string | |
| safe_to_send | boolean | Équivalent booléen rétrocompatible à décision != refuser |
| risk | string | |
| score | integer | |
| authentication_message | boolean | |
| checks | object[] | |
| blocked_reasons | string[] | |
| warnings | string[] | |
| override_used | boolean |
/api/emails/{address}/messagesListe des e-mails
Répertoriez les e-mails dans un dossier canonique ou une vue virtuelle. La valeur par défaut est Boîte de réception. L'emplacement du dossier est indépendant de la direction du message et du verdict de spam. Le courrier d'authentification (OTP/codes de vérification, réinitialisations de mot de passe, liens magiques) est étiqueté security: "auth" ». Les jetons sans portée email:auth_secrets voient les messages avec le sujet et le corps MASQUÉS (redacted: true) - les métadonnées (de, date) restent visibles. Les filtres subject, q et attachments portent sur ce que l'appelant peut lire : sans la portée, un tel message ne correspond que par son sujet et son corps masqués, et une recherche du code qu'il contient ne trouve donc rien.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| cursor | string | Curseur de pagination de la réponse précédente |
| limit | integer | Max de messages à renvoyer |
| direction | string(in | out | all) | Filtrer par direction (par défaut : toutes) |
| folder | string(inbox | archive | sent | spam | trash) | Dossier système. Mutuellement exclusif avec vue. La valeur par défaut est la boîte de réception. |
| label | string | Étiquettes séparées par des virgules : seulement les messages portant l'une d'entre elles |
| view | string(starred | all | needs_human | scheduled) | Vue virtuelle. Mutuellement exclusif avec dossier. |
| since | string | Horodatage ISO - renvoie uniquement les messages créés après cette date |
| until | string | Horodatage ISO - renvoie uniquement les messages créés avant cette date |
| from | string | Filtrer par adresse d'expéditeur |
| to | string | Filtrer par adresse du destinataire |
| subject | string | Filtrer par sujet |
| q | string | Recherche étendue, insensible à la casse, parmi l'expéditeur, les destinataires, le sujet et le corps du texte brut |
| unread | boolean | Renvoie uniquement les messages non lus |
| attachments | boolean | Renvoie les messages contenant uniquement des pièces jointes |
| spam | boolean | Filtrer par indicateur de spam (passez false pour masquer les spams entrants signalés) |
Réponse 200
| messages | object[] | |
| next_cursor | string | null |
/api/emails/searchRechercher des emails par sens et par mots
Recherche dans les boîtes mail que vous pouvez lire, ou dans une boîte mail avec mailbox. Hybride par défaut : l'embedding du message (pgvector, cosine) et l'index de mots pondérés sont fusionnés par rang réciproque avec un léger boost de récence, en une seule instruction ; why indique quelle branche a correspondu. Opérateurs Gmail dans q : from: to: cc: subject: label: filename: mailbox: is:unread|read|starred|unstarred has:attachment in:inbox|archive|sent|spam|trash|anywhere after:2026/08/01 before: newer_than:7d older_than:2w (h/d/w/m/y), "a phrase", -word ou -from: pour exclure, a OR b. Une requête faite uniquement d'opérateurs liste les messages correspondants du plus récent au plus ancien (why: filter). Les codes et liens de connexion, le spam et les emails système ne sont jamais indexés ; les boîtes mail listées dans search_opt_out_mailbox_ids de l'assistant sont recherchées par mots uniquement. Un token lié à une identité d'agent recherche uniquement dans les boîtes mail que son agent exploite. Nécessite email:read. Sans email:auth_secrets, le courrier d'authentification entrant est écarté avant le classement : aucun mot, opérateur ou filtre ne le trouve, et la recherche d'un code de connexion ne trouve donc rien.
Paramètres
| mailbox | string | Restreindre à une seule adresse de boîte mail (slug@domain). |
| q* | string | Ce que vous recherchez, dans n'importe quelle langue : un nom, une référence ou une description de l'email, plus les opérateurs Gmail (`from:dave is:unread newer_than:7d -invoice "exact phrase"`). |
| mode | string(hybrid | semantic | keyword) | hybrid fusionne l'embedding et les mots par rang ; semantic utilise uniquement le sens ; keyword uniquement les mots. |
| limit | integer | Résultats à retourner. |
| since | string | Uniquement les emails reçus après cet horodatage ISO. |
| until | string | Uniquement les emails reçus avant cet horodatage ISO. |
| folder | string(inbox | archive | sent | spam | trash | anywhere) | Un dossier. Trash est exclu sauf s'il est nommé ou avec `anywhere`. |
| from | string | L'adresse de l'expéditeur contient. |
| label | string | Étiquettes séparées par des virgules : seulement les messages portant l'une d'entre elles |
Réponse 200
| results | object[] | |
| mode | string | |
| query | string | |
| took_ms | integer | |
| hint | string |
Exemple
curl "https://domani.run/api/emails/search?q=facture+tucows+ao%C3%BBt&limit=5" \ -H "Authorization: Bearer domani_sk_xxx"
/api/emails/connect/gmailCommencer à connecter une boîte de réception Gmail
Retourne l'URL de consentement Google liée à votre compte et à la limite d'importation. Ouvrez-la dans un navigateur ; après consentement la boîte de réception devient une boîte mail connectée à sa propre adresse, le courrier reçu après la limite est importé (par défaut : les dernières 24 heures), et le nouveau courrier suit au fur et à mesure qu'il arrive. Jamais toute la boîte de réception : élargissez plus tard avec POST /api/emails/{address}/import. Nécessite email:write. Google OAuth doit être configuré sur le serveur.
Corps de la demande
| access | string(read | write) | read (par défaut) lit la boîte de réception ; write permet également à la plateforme de modifier les libellés et l'état de lecture et d'envoyer en tant que la personne, pour les effets d'une délégation permanente. Reconnectez-vous avec write pour élargir une autorisation en lecture seule. |
| since | string (date-time) | Importer le courrier reçu après cet instant |
| window | string(24h | 7d | 30d | 1y) | Un préréglage au lieu de since ; par défaut 24h |
| workspace_id | string | Espace de travail auquel appartient la boîte mail ; votre espace de travail personnel par défaut |
| login_hint | string | Le compte Google à présélectionner |
| return_to | string | Chemin d'application vers lequel envoyer le navigateur après consentement |
Réponse 200
| auth_url | string | |
| state | string | |
| import_since | string (date-time) | |
| expires_in | integer | |
| access | string |
/api/emails/connect/outlookCommencer à connecter une boîte de réception Outlook
Renvoie l'URL de consentement Microsoft liée à votre compte et à la borne d'importation. Ouvrez-la dans un navigateur ; après consentement, la boîte de réception devient une boîte mail connectée à sa propre adresse, le courrier reçu après la borne est importé (par défaut : les dernières 24 heures), et le nouveau courrier suit au fur et à mesure qu'il arrive. Jamais la boîte de réception entière : élargissez plus tard avec POST /api/emails/{address}/import. Nécessite email:write. Microsoft OAuth doit être configuré sur le serveur.
Corps de la demande
| access | string(read | write) | read (par défaut) lit la boîte de réception ; write permet également à la plateforme de modifier les libellés et l'état de lecture et d'envoyer en tant que la personne, pour les effets d'une délégation permanente. Reconnectez-vous avec write pour élargir une autorisation en lecture seule. |
| since | string (date-time) | Importer le courrier reçu après cet instant |
| window | string(24h | 7d | 30d | 1y) | Un préréglage au lieu de since ; par défaut 24h |
| workspace_id | string | Espace de travail auquel appartient la boîte mail ; votre espace de travail personnel par défaut |
| login_hint | string | Le compte Microsoft à présélectionner |
| return_to | string | Chemin d'application vers lequel envoyer le navigateur après consentement |
Réponse 200
| auth_url | string | |
| state | string | |
| import_since | string (date-time) | |
| expires_in | integer | |
| access | string |
/api/emails/connect/providersÉnumérer les façons dont une boîte de réception peut être connectée
Une ligne par fournisseur (Gmail, Outlook, toute boîte de réception par transfert, une adresse hébergée ici) : comment la connexion démarre (un écran de consentement, une règle de transfert, une adresse créée), ce que la connexion peut faire (lire, ou lire et écrire), si elle importe les anciens mails, et si ce serveur est configuré pour cela. Afficher un bouton de connexion uniquement quand configured est true ; reason nomme la variable manquante pour l'opérateur. Nécessite email:read.
Réponse 200
| providers | MailProvider[] |
/api/emails/connect/forwardingConnecter une boîte de réception par transfert
Crée une boîte mail connectée à l'adresse propre de la boîte de réception et répond avec une adresse de transfert sur le domaine de transfert de la plateforme, avec les étapes pour Gmail, Outlook et d'autres fournisseurs. Ajoutez une règle de transfert chez le fournisseur ; ce qui arrive à cette adresse est déballé (expéditeur original, date, objet) et stocké sous la boîte mail connectée. Gmail demande à l'adresse de transfert de confirmer : le code et le lien apparaissent sur la connexion. Le premier mail qui revient, ou une sonde (POST /api/emails/{address}/connector/verify), rend la connexion active. Seul le nouveau courrier arrive de cette façon ; l'ancien courrier ne peut pas être importé. Nécessite email:write. Le domaine de transfert doit être configuré sur le serveur.
Corps de la demande
| address* | string | La boîte de réception à connecter, par exemple someone@gmail.com |
| workspace_id | string | Espace de travail auquel appartient la boîte mail ; votre espace de travail personnel par défaut |
Réponse 200
| address | string | |
| mailbox_id | string | |
| status | string | |
| forwarding_address | string | |
| instructions | object | |
| guide | ForwardingGuide |
/api/emails/{address}/connector/verifyEnvoyer une sonde à travers la règle de transfert
Envoie un mail à la boîte de réception connectée ; lorsque la règle de transfert le ramène à l'adresse de transfert, la connexion devient active. Uniquement pour une connexion par transfert. Nécessite email:write.
Paramètres
| address* | string | L'adresse connectée, par exemple someone@gmail.com |
Réponse 200
| sent_to | string | |
| forwarding_address | string |
/api/emails/{address}/connectorLire la connexion d'une boîte mail connectée
Type, statut, la limite d'importation, la phase de synchronisation (l'analyse d'importation, puis historique), la progression de l'importation (analysés, copiés, à analyser, analysés), la dernière synchronisation et la dernière erreur. Nécessite email:read. La confirmation de transfert (le code et le lien de Gmail) est du courrier d'authentification : sans email:auth_secrets, son code et son url valent null et elle porte redacted: true. Un jeton confiné à des boîtes aux lettres ne trouve que ses propres boîtes aux lettres (404 sinon).
Paramètres
| address* | string | L'adresse connectée, par exemple someone@gmail.com |
Réponse 200
| address | string | |
| mailbox_id | string | |
| kind | string | |
| status | string | |
| import_since | string (date-time) | null | La limite de la première importation : aucun mail reçu avant elle n'est copié |
| phase | string | liste pendant que l'analyse d'importation parcourt le courrier après la limite, historique une fois que le nouveau courrier suit l'historique de la source |
| paused_reason | string | null | |
| import_run | object | null | L'exécution d'importation actuelle ou dernière de cette boîte mail |
| source_messages_total | integer | null | Ce que la source rapporte pour toute la boîte de réception, pour l'échelle |
| last_sync_at | string (date-time) | null | |
| last_error | string | null | |
| backoff_until | string (date-time) | null | |
| verified_at | string (date-time) | null | |
| connected_at | string (date-time) | |
| cost_cap_usd | number | Le montant de dépense du modèle autorisé par exécution d'importation, en USD |
| access | string | null | Pour une connexion Gmail : ce que l'autorisation permet ; write signifie les libellés dans les deux sens et l'envoi en tant que la personne |
| forwarding | object | null | Pour une connexion par transfert : l'adresse de transfert, ce qui est arrivé, la confirmation de Gmail, la sonde, les étapes |
/api/emails/{address}/connectorDéconnecter une boîte mail connectée
Supprime les propres copies de la personne (messages, pièces jointes, lignes de recherche, tâches en attente) et le credential ; conserve la ligne de boîte mail, le lien marqué déconnecté, et ce que les agents ont fait (receipts). Seule une boîte mail connectée peut être déconnectée. Nécessite email:write.
Paramètres
| address* | string |
Réponse 200
| disconnected | boolean | |
| address | string | |
| removed_messages | integer | |
| removed_attachments | integer |
/api/emails/{address}/importImporter du courrier plus ancien d'une boîte mail connectée
Élargit l'importation à une date antérieure : une nouvelle exécution d'importation copie le courrier entre la nouvelle limite et l'actuelle, dans l'ordre d'arrivée, sous son propre plafond de coût. Refusé pendant qu'une analyse d'importation est encore en cours. Nécessite email:write.
Paramètres
| address* | string |
Corps de la demande
| since* | string (date-time) | La nouvelle limite, antérieure à l'actuelle |
Réponse 200
| import_run_id | string | |
| import_since | string (date-time) | |
| import_until | string (date-time) |
/api/emails/{address}/searchRechercher dans une boîte mail par sens et par mots
La même recherche que GET /api/emails/search, restreinte à cette boîte mail. Nécessite email:read. Sans email:auth_secrets, le courrier d'authentification entrant est écarté avant le classement : aucun mot, opérateur ou filtre ne le trouve, et la recherche d'un code de connexion ne trouve donc rien.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| q* | string | Ce que vous recherchez, dans n'importe quelle langue : un nom, une référence ou une description de l'email, plus les opérateurs Gmail (`from:dave is:unread newer_than:7d -invoice "exact phrase"`). |
| mode | string(hybrid | semantic | keyword) | hybrid fusionne l'embedding et les mots par rang ; semantic utilise uniquement le sens ; keyword uniquement les mots. |
| limit | integer | Résultats à retourner. |
| since | string | Uniquement les emails reçus après cet horodatage ISO. |
| until | string | Uniquement les emails reçus avant cet horodatage ISO. |
| folder | string(inbox | archive | sent | spam | trash | anywhere) | Un dossier. Trash est exclu sauf s'il est nommé ou avec `anywhere`. |
| from | string | L'adresse de l'expéditeur contient. |
| label | string | Étiquettes séparées par des virgules : seulement les messages portant l'une d'entre elles |
Réponse 200
| results | object[] | |
| mode | string | |
| query | string | |
| took_ms | integer | |
| hint | string |
/api/emails/{address}/threadsLister les conversations d'une boîte mail
Messages regroupés comme les clients mail les regroupent : une réponse rejoint le fil du message auquel elle répond (In-Reply-To, puis la chaîne References), un mail sans en-têtes utilisables rejoint le fil le plus récent avec le même sujet et un correspondant en commun dans les trente jours, tout le reste démarre un fil dont l'id est l'id de son premier message. Les fils sont ordonnés par dernière activité ; la corbeille et le spam ne participent jamais sauf s'ils sont nommés comme dossier. folder=inbox|archive|sent garde les fils qui ont un message là mais compte toujours la conversation entière.
Paramètres
| address* | string | |
| folder | string(all | inbox | archive | sent | spam | trash) | |
| since | string | Seulement les fils avec activité après cette heure |
| limit | integer | |
| cursor | string | next_cursor de la page précédente |
| label | string | Étiquettes séparées par des virgules : seulement les fils avec un message portant l'une d'entre elles |
Réponse 200
| threads | EmailThread[] | |
| next_cursor | string | null | |
| has_more | boolean |
/api/emails/{address}/threads/{id}Lire une conversation, message le plus ancien en premier
Tous les messages du fil (corbeille incluse, donc rien ne manque de l'histoire) avec leur texte, le plus ancien en premier, plus les participants et le nombre de non lus. Le mail d'authentification est caviardé comme le sont les lectures de messages.
Paramètres
| address* | string | |
| id* | string | Id du fil (le thread_id de n'importe lequel de ses messages) |
Réponse 200
| id | string | |
| subject | string | null | |
| participants | string[] | |
| message_count | integer | |
| unread_count | integer | |
| first_message_at | string (date-time) | |
| last_message_at | string (date-time) | |
| messages | object[] |
/api/emails/{address}/eventsDiffuser les événements de la boîte mail (server-sent events)
Répond text/event-stream. Sans curseur, le flux démarre au présent ; avec since (un curseur provenant de /api/email/changes ou l'id de n'importe quel événement antérieur), il rejoue d'abord chaque changement après ce point, puis suit le journal de la boîte mail en direct : chaque trame porte le type du changement comme nom d'événement (message.received, message.updated, message.deleted, message.moved, message.status, mailbox.resync_required, assistant.item.delegated, assistant.item.recalled, ...), le changement comme données JSON avec son cursor reprennable, et ce même curseur comme id de trame. La première trame est ready avec le curseur à partir duquel reprendre ; un commentaire keep-alive arrive toutes les 20 secondes ; la connexion se ferme après environ 5 minutes avec une trame close et un indice retry:. Reconnectez avec Last-Event-ID (ou since) pour reprendre sans écart et sans doublon. Les jetons d'agent sont confinés aux boîtes mail que l'agent opère. Une entrée concernant un élément de travail issu d'un courrier d'authentification porte son title et son ask masqués pour un jeton sans email:auth_secrets.
Paramètres
| address* | string | |
| since | string | Curseur à partir duquel rejouer ; le `cursor` de n'importe quel événement antérieur ou un next_cursor provenant de /api/email/changes |
/api/emails/{address}/foldersRépertorier les dossiers de courrier électronique et les comptes
Renvoie les décomptes dérivés du serveur pour les dossiers système et les vues virtuelles, ainsi que les fonctionnalités de cycle de vie pour le backend de la boîte aux lettres.
Paramètres
| address* | string |
Réponse 200
| folders | object[] | |
| views | object[] | |
| capabilities | object |
/api/emails/{address}/messages/actionsAppliquer une action de cycle de vie aux messages
Déplacez, restaurez, marquez comme lu, ajoutez une étoile ou supprimez définitivement jusqu'à 100 ID de message explicites. Le déplacement vers la corbeille est réversible. La suppression permanente nécessite email:delete et n'accepte que les messages déjà dans la corbeille. Chaque réponse est un reçu d'opération durable avec un résultat par ID demandé. Fournissez une clé stable dans l'en-tête standard Idempotency-Key ou dans le champ JSON hérité idempotency_key et réutilisez-la après les délais d'attente ; une nouvelle tentative exacte renvoie le reçu stocké sans autre mutation. Si les deux formulaires sont fournis, ils doivent correspondre. La réutilisation d'une clé avec une requête différente renvoie 409. En cas d'omission, le serveur crée une clé et la renvoie dans le corps et l'en-tête Idempotency-Key. Renvoie 207 lorsque seule une partie du lot réussit.
Paramètres
| address* | string |
Corps de la demande
| message_ids* | string[] | |
| action* | string(move | mark_read | star | restore | delete_permanently | label) | |
| destination | string(inbox | archive | sent | spam | trash) | |
| read | boolean | |
| starred | boolean | |
| add | string[] | label : étiquettes à ajouter |
| remove | string[] | label : étiquettes à retirer |
| set | string[] | label : remplacer chaque étiquette (prioritaire sur ajouter et retirer) |
| idempotency_key | string | Clé stable pour ce lot logique exact. Réutiliser après un délai d'attente. |
Réponse 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Vrai lorsque cette réponse a réutilisé le reçu complété immuable et n’a effectué aucune nouvelle mutation. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null |
/api/emails/{address}/messages/readMarquer les messages comme lus ou non lus
Point de terminaison de compatibilité pour les mises à jour de l’état de lecture sécurisées et réessayées. Renvoie le reçu canonique d’opération durable par article plus le nombre hérité. Fournissez et réutilisez l'en-tête Idempotency-Key ou le champ de compatibilité idempotency_key après les délais d'attente.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Corps de la demande
| message_ids* | string[] | ID des messages à marquer |
| read* | boolean | true pour marquer comme lu, false pour marquer comme non lu |
| idempotency_key | string |
Réponse 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Vrai lorsque cette réponse a réutilisé le reçu complété immuable et n’a effectué aucune nouvelle mutation. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null | |
| count | integer |
/api/emails/{address}/messages/deleteSupprimer des messages en masse
Point de terminaison de compatibilité qui déplace les messages en toute sécurité vers la corbeille. Renvoie le reçu canonique d’opération durable par article plus le nombre hérité. Fournissez et réutilisez l'en-tête Idempotency-Key ou le champ de compatibilité idempotency_key après les délais d'attente.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Corps de la demande
| message_ids* | string[] | ID des messages à supprimer |
| idempotency_key | string |
Réponse 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Vrai lorsque cette réponse a réutilisé le reçu complété immuable et n’a effectué aucune nouvelle mutation. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null | |
| count | integer |
/api/emails/{address}/messages/{id}Recevoir un message
Récupérez un seul message par identifiant à partir d'une boîte aux lettres identifiée par son adresse e-mail complète. Les messages classés comme courrier d'authentification (OTP, réinitialisation du mot de passe, lien magique) reviennent avec le sujet/corps masqué, sauf si le jeton a la portée email:auth_secrets.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| id* | string | Identifiant du message |
Réponse 200
| id | string | |
| thread_id | string | Id de conversation partagé par tous les messages du fil (l'id du message racine) |
| labels | string[] | Chaque étiquette sur le message ; `label` est la première |
| thread_key | string | Clé de conversation canonique avec espace de noms du backend |
| thread_aliases | string[] | Clés de workflow héritées à transmettre lors de la mutation de l'état de la conversation |
| message_id | string | null | |
| direction | string | |
| from | string | Le nom d'affichage et l'adresse de l'expéditeur tirés de l'en-tête From (p. ex. 'Alice <alice@example.com>'), ou l'adresse seule quand le courrier ne portait pas de nom. |
| avatar_url | string (uri) | null | URL proxy Domani préservant la confidentialité pour l'avatar de l'expéditeur |
| to | string | Tous les destinataires To de l'en-tête, avec leurs noms d'affichage, dans l'ordre où l'expéditeur les a écrits (pas seulement l'adresse d'enveloppe qui a acheminé ce courrier vers la boîte). |
| cc | string | null | Tous les destinataires Cc de l'en-tête, avec leurs noms d'affichage, ou null quand le courrier ne portait pas de Cc. |
| bcc | string | null | Destinataires Bcc, présents uniquement sur votre propre message sortant (jamais sur un message reçu, et jamais transmis comme en-tête). |
| reply_to | string | null | |
| subject | string | |
| text | string | null | |
| html | string | null | |
| in_reply_to | string | null | |
| references | string | null | |
| attachments | object[] | |
| status | string | |
| is_read | boolean | |
| read_at | string | null | |
| events | object[] | |
| created_at | string (date-time) |
/api/emails/{address}/messages/{id}Supprimer un message
Déplacez un message vers la corbeille. Ceci est réversible. Utilisez l'action de cycle de vie avec delete_permanently et un jeton email:delete pour effacer un message déjà dans la corbeille.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| id* | string | Identifiant du message |
Réponse 200
| id | string | |
| deleted | boolean |
/api/emails/{address}/messages/{id}/replyRépondre à un message
Répondez à un message dans une boîte identifiée par son adresse complète. Les en-têtes de fil sont renseignés automatiquement, et l’original est cité sous la réponse comme le font les clients de messagerie (ligne d’attribution dans la langue du compte, lignes > dans le texte, bloc gmail_quote dans le HTML), sauf si quote vaut false. Les clients collaboratifs doivent transmettre le bail de composition, la valeur reply_version observée et une clé d’idempotence stable ; le serveur rejette atomiquement une réponse périmée ou double juste avant l’envoi.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| id* | string | ID du message auquel répondre |
Corps de la demande
| text | string | Corps de réponse en texte brut |
| html | string | Corps de réponse HTML |
| cc | any | Destinataire(s) CC supplémentaire(s) |
| all | boolean | Répondre à tous : remplir automatiquement le CC à partir du To/CC d'origine |
| quote | boolean | Cite l’original sous la réponse ; false n’envoie que le texte ou le HTML fourni |
| idempotency_key | string | Forme de compatibilité corporelle de Idempotency-Key |
| coordination | object |
Réponse 200
| id | string | |
| message_id | string | |
| from | string | |
| to | string | |
| status | string | |
| reply_version | integer | Génération réservée pour une réponse réservée |
/api/emails/{address}/messages/{id}/forwardTransférer un message
Transférer un message d'une boîte aux lettres identifiée par son adresse e-mail complète vers un autre destinataire. Le transfert du courrier d'authentification (OTP, réinitialisation du mot de passe, lien magique) nécessite la portée email:auth_secrets - cela exfiltrerait le secret.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| id* | string | ID du message à transférer |
Corps de la demande
| to* | string | Adresse e-mail du destinataire |
| text | string | Note facultative à ajouter au début |
Réponse 200
| id | string | |
| message_id | string | |
| from | string | |
| to | string | |
| status | string |
/api/emails/{address}/avatarObtenir des informations sur l'avatar de la boîte aux lettres
Renvoie l'URL Gravatar (si définie) et le lien d'inscription pour une boîte aux lettres identifiée par son adresse e-mail complète.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Réponse 200
| address | string | |
| gravatar_url | string | null | |
| gravatar_signup | string | |
| has_avatar | boolean | |
| hint | string |
/api/emails/{address}/webhookObtenir la configuration du webhook de la boîte aux lettres
Renvoie l'URL du webhook, le secret de signature, les noms d'en-tête d'authentification configurés et l'état d'une boîte aux lettres. Les valeurs d'en-tête ne sont jamais renvoyées.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Réponse 200
| address | string | |
| webhook_url | string | null | |
| signing_secret | string | null | |
| has_webhook | boolean | |
| events | string[] | Événements transportés par ce webhook : email.received, tout verdict de distribution sur le courrier sortant (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) et les notifications de transfert à l'agent (assistant.item.delegated, assistant.item.recalled) ; vide sans webhook |
| header_names | string[] | Noms d'en-tête d'authentification configurés ; les valeurs ne sont jamais renvoyées |
| hint | string |
/api/emails/{address}/webhookDéfinir un webhook de boîte aux lettres
Configurez la destination HTTPS des événements de boîte aux lettres signés HMAC : le courrier entrant par défaut, plus (sur abonnement via events) le verdict de distribution du courrier envoyé DEPUIS la boîte aux lettres - un rebond atteint l'expéditeur quelques secondes après l'acceptation de l'envoi, au lieu de ne vivre que dans l'historique du message. Les distributions entrantes en direct sont stockées de manière durable, tentées immédiatement et réessayées jusqu'à trois fois. Chaque tentative inclut X-Domani-Delivery-Attempt commençant à 1. Les valeurs facultatives d'autorisation ou de X-API-Key sont chiffrées et ne sont jamais renvoyées ; les opérateurs humains doivent les soumettre en dehors du contexte du modèle via les options de variable d'environnement CLI.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Corps de la demande
| url* | string | URL du webhook HTTPS |
| events | string[] | Événements à envoyer (assistant.item.delegated et assistant.item.recalled informent un agent que le propriétaire lui a confié un élément Today ou l'a repris ; le webhook de chaque boîte mail que l'agent opère les reçoit). Omis conserve l'abonnement actuel (entrant uniquement pour un nouveau webhook). Les verdicts de distribution sur le courrier envoyé DEPUIS la boîte mail sont opt-in et arrivent à la même URL avec la même signature : {event, mailbox, email, message: {id, message_id, to, subject, status, detail}}. |
| headers | object | En-têtes d’authentification chiffrés facultatifs. Seules l'autorisation et la X-API-Key sont acceptées ; envoyez {} pour effacer. Ne transmettez pas de valeurs via le contexte du modèle ; la CLI prend en charge --authorization-env et --api-key-env. |
Réponse 200
| address | string | |
| webhook_url | string | |
| signing_secret | string | |
| has_webhook | boolean | |
| events | string[] | Événements transportés par ce webhook : email.received, tout verdict de distribution sur le courrier sortant (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) et les notifications de transfert à l'agent (assistant.item.delegated, assistant.item.recalled) ; vide sans webhook |
| header_names | string[] | Noms d'en-tête d'authentification configurés ; les valeurs ne sont jamais renvoyées |
| hint | string |
Exemple
curl -X PUT https://domani.run/api/emails/agent%40example.com/webhook \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"url":"https://agent.example/webhook","events":["email.received","email.bounced","email.delivered"]}'/api/emails/{address}/webhookSupprimer le webhook de la boîte aux lettres
Supprimez l'URL du webhook et le secret de signature d'une boîte aux lettres. Les e-mails entrants seront uniquement stockés.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Réponse 200
| address | string | |
| webhook_url | string | null | |
| signing_secret | string | null | |
| has_webhook | boolean | |
| events | string[] | Événements transportés par ce webhook : email.received, tout verdict de distribution sur le courrier sortant (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) et les notifications de transfert à l'agent (assistant.item.delegated, assistant.item.recalled) ; vide sans webhook |
| header_names | string[] | |
| hint | string |
/api/emails/{address}/webhook/rotateFaire pivoter le secret de signature du webhook
Régénérez le secret de signature HMAC-SHA256 pour un webhook de boîte aux lettres. Le vieux secret est immédiatement invalidé.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Réponse 200
| address | string | |
| webhook_url | string | |
| signing_secret | string | |
| has_webhook | boolean | |
| hint | string |
/api/emails/{address}/webhook/testTester le webhook de la boîte aux lettres
Envoyez une charge utile de test signée à l’URL du webhook de la boîte aux lettres. Renvoie l'état HTTP et si la distribution a réussi. Les tests ne sont pas retentés ; les distributions entrantes en direct sont réessayées jusqu'à trois fois.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Réponse 200
| address | string | |
| webhook_url | string | |
| status | integer | |
| success | boolean | |
| hint | string |
/api/emails/{address}/aliasesRépertorier les alias de boîtes aux lettres
Répertoriez toutes les adresses alias qui acheminent les messages vers une boîte aux lettres. Les alias permettent à plusieurs adresses (sales@, hello@, contact@) de partager une boîte de réception sans utiliser d'emplacement de boîte aux lettres.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Réponse 200
| mailbox | string | |
| aliases | object[] | |
| hint | string |
/api/emails/{address}/aliasesAjouter un alias de boîte aux lettres
Ajoutez une adresse alias qui livre dans cette boîte aux lettres sans utiliser d’emplacement supplémentaire. L’alias doit appartenir au même domaine que la boîte aux lettres. Fournissez un simple slug ('sales') ou une adresse complète ('sales@mysite.com').
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Corps de la demande
| alias* | string | Adresse d'alias - un slug nu ou un slug@domain complet sur le même domaine |
Réponse 201
| address | string | |
| mailbox | string | |
| created_at | string (date-time) | |
| hint | string |
/api/emails/{address}/aliases/{alias}Supprimer un alias de boîte aux lettres
Supprimez un alias d'une boîte aux lettres. Les e-mails envoyés à cette adresse ne sont plus envoyés.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| alias* | string | Adresse d'alias à supprimer (codée en URL ou simple slug) |
Réponse 200
| address | string | |
| deleted | boolean | |
| hint | string |
/api/emails/{address}/client-settingsObtenir les paramètres du client de messagerie (hébergé)
Obtenez les paramètres de connexion IMAP/SMTP pour une boîte aux lettres hébergée, pour configurer Apple Mail, Thunderbird ou tout autre client de messagerie. Le nom d'utilisateur est l'adresse complète ; le mot de passe est un mot de passe d'application (créez-en un avec POST /api/emails/{address}/credentials). Boîtes aux lettres hébergées uniquement.
Paramètres
| address* | string | Adresse de la boîte aux lettres hébergée (codée en URL) |
Réponse 200
| mailbox | string | |
| username | string | |
| imap | object | |
| smtp | object | |
| hint | string |
/api/emails/{address}/credentialsRépertorier les mots de passe des applications (hébergées)
Répertoriez les mots de passe d'application pour une boîte aux lettres hébergée. Les secrets ne sont affichés qu'une seule fois lors de la création ; cela renvoie uniquement les étiquettes et les métadonnées. Boîtes aux lettres hébergées uniquement.
Paramètres
| address* | string | Adresse de la boîte aux lettres hébergée (codée en URL) |
Réponse 200
| mailbox | string | |
| credentials | object[] | |
| hint | string |
/api/emails/{address}/credentialsCréer un mot de passe d'application (hébergé)
Créez un mot de passe d'application pour une boîte aux lettres hébergée, utilisé comme mot de passe dans un client de messagerie (IMAP/SMTP). Le secret est renvoyé une fois - stockez-le maintenant. Boîtes aux lettres hébergées uniquement.
Paramètres
| address* | string | Adresse de la boîte aux lettres hébergée (codée en URL) |
Corps de la demande
| label | string | Étiquette pour identifier le mot de passe de cette application, par ex. "Courrier sur ordinateur portable" |
Réponse 201
| id | string | |
| label | string | |
| password | string | Le mot de passe de l'application : affiché une fois, stockez-le maintenant |
| client_settings | object | |
| hint | string |
/api/emails/{address}/credentials/{id}Révoquer le mot de passe d'une application (hébergée)
Révoquer le mot de passe d'une application. Tout client de messagerie qui l'utilise cesse immédiatement de se connecter. Boîtes aux lettres hébergées uniquement.
Paramètres
| address* | string | Adresse de la boîte aux lettres hébergée (codée en URL) |
| id* | string | Identifiant du mot de passe de l'application (à partir du point de terminaison de la liste) |
Réponse 200
| id | string | |
| revoked | boolean | |
| hint | string |
/api/emails/{address}/messages/{id}/escalateSignaler un message à un humain
Escalader un message vers l’humain du compte (ou retirer le signalement avec clear=true). Définit needs_human sur le message, maintient sa conversation dans le statut needs_human et déclenche le webhook email.escalated + une notification dans l’application. La primitive produit derrière 'answer the easy ones, stop on the one the human must decide'.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| id* | string | Identifiant du message à signaler |
Corps de la demande
| reason | string | Pourquoi l’humain est nécessaire - affiché dans la notification |
| clear | boolean | Retirer le signalement au lieu de le poser (l’humain a pris le relais) |
Réponse 200
| id | string | |
| needs_human | boolean | |
| escalation_reason | string | null | |
| thread_key | string |
/api/emails/{address}/messages/{id}/remindDéfinir un rappel de relance
Définir (ou effacer avec clear=true) un rappel de relance unique sur un message. Lorsque remind_at arrive et que le message est toujours sans réponse (entrant : aucune réponse envoyée ; sortant : aucune réponse entrante reçue), email.reminder_due se déclenche sous forme de webhook + notification dans l’application et le rappel s’efface de lui-même.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| id* | string | Identifiant du message à surveiller |
Corps de la demande
| remind_at | string (date-time) | Heure ISO 8601 du rappel (de 1 minute à 90 jours à l’avance) |
| note | string | Contexte affiché lorsque le rappel se déclenche |
| clear | boolean | Effacer un rappel en attente |
Réponse 200
| id | string | |
| remind_at | string | null | |
| reminder_note | string | null |
/api/contactsRépertorier les contacts
Le carnet d’adresses du compte, alimenté automatiquement par le trafic de courrier : correspondants, nombre de messages, dernière activité et notes. Par défaut, les plus récemment actifs en premier (order=recent), pour l’affichage : un contact qui reçoit un nouveau courrier pendant un parcours paginé passe devant le curseur, et ce parcours peut donc le manquer. Pour synchroniser tout le carnet, passez order=created : les plus anciens en premier par date de création puis par id, une clé qui ne change jamais ; chaque contact présent pendant tout le parcours revient donc exactement une fois, et les contacts créés entre-temps arrivent à la fin. Un curseur ne poursuit que l’ordre dont il provient (400 INVALID_CURSOR sinon). Agrège les données de toutes les boîtes aux lettres ; les jetons confinés à une boîte aux lettres sont donc refusés (400 MAILBOX_CONFINED).
Paramètres
| q | string | Filtrer par sous-chaîne d’adresse ou de nom |
| limit | integer | Contacts à renvoyer (50 par défaut) |
| cursor | string | Curseur de pagination d'une réponse précédente |
| order | string(recent | created) | Ordre de tri. recent (par défaut) : les plus récemment actifs en premier, pour l’affichage. created : les plus anciens en premier par date de création puis par id, stable pour un parcours complet. Toute autre valeur renvoie 400 INVALID_ORDER. |
Réponse 200
| contacts | object[] | |
| next_cursor | string | null |
/api/contactsCréer ou mettre à jour un contact
Enregistrer un contact : définir un nom d’affichage et joindre des notes ('prefers short emails', 'decision maker at Acme'). Le trafic de courrier continue d’alimenter le nombre de messages dans tous les cas.
Corps de la demande
| address* | string | L’adresse e-mail du contact |
| name | string | null | Nom d’affichage (null l’efface) |
| notes | string | null | Notes que les agents et les humains lisent pour le contexte (null les efface) |
/api/contacts/{address}Supprimer un contact
Supprimer un contact du carnet d’adresses. Le trafic de courrier le recréera comme contact automatique s’il écrit à nouveau.
Paramètres
| address* | string | L’adresse e-mail du contact (encodée en URL) |
/api/emails/{address}/rulesRépertorier les règles de courrier entrant
Répertoriez les règles de filtrage entrant d'une boîte aux lettres, dans l'ordre de priorité dans lequel elles sont appliquées (la première correspondance gagne).
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Réponse 200
| mailbox | string | |
| rules | MailRule[] | |
| hint | string |
/api/emails/{address}/rulesAjouter une règle de courrier entrant
Ajoutez une règle exécutée sur les messages entrants correspondant à un champ (from/to/subject/body). Actions : drop, mark_read, forward (action_arg = adresse), webhook_only (ignorer le transfert) et label (action_arg = libellé). Les règles s’appliquent par priorité croissante ; la première correspondance l’emporte.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
Corps de la demande
| match_field* | string(from | to | subject | body) | |
| match_op* | string(contains | equals | regex) | |
| match_value* | string | |
| action* | string(drop | mark_read | forward | webhook_only | label | escalate) | |
| action_arg | string | Adresse de transfert (pour forward), valeur d’étiquette (pour label) ou raison affichée à l’humain (pour escalate) |
| priority | integer | Les exécutions inférieures en premier (0 par défaut) |
| enabled | boolean | Vrai par défaut |
Réponse 201
| id | string | |
| priority | integer | Abaisser les pistes en premier |
| match_field | string | |
| match_op | string | |
| match_value | string | |
| action | string | |
| action_arg | string | null | |
| enabled | boolean | |
| created_at | string (date-time) |
/api/emails/{address}/rules/{ruleId}Supprimer une règle de courrier entrant
Supprimez une règle de filtrage entrant d’une boîte aux lettres.
Paramètres
| address* | string | Adresse e-mail de la boîte aux lettres (codée en URL) |
| ruleId* | string | L'identifiant de la règle |
Réponse 200
| id | string | |
| deleted | boolean | |
| hint | string |
/api/domains/{domain}/email/catch-allDéfinir un domaine fourre-tout
Acheminez chaque e-mail envoyé à une adresse sans correspondance sur le domaine vers une boîte aux lettres désignée. Tout ce qui ne correspond pas à une boîte aux lettres, une sous-adresse ou un alias se retrouve dans le fourre-tout. La boîte aux lettres doit déjà exister sur le domaine. Cela modifie le courrier de tout le domaine : un jeton confiné à des boîtes aux lettres reçoit donc 403 MAILBOX_CONFINED.
Paramètres
| domain* | string | Nom de domaine |
Corps de la demande
| mailbox* | string | Boîte aux lettres fourre-tout - un simple slug ou une adresse complète sur ce domaine |
Réponse 200
| domain | string | |
| catch_all | string | null | |
| hint | string |
/api/domains/{domain}/email/catch-allEffacer le domaine fourre-tout
Supprimez le fourre-tout sur un domaine. Les e-mails adressés à des adresses sans correspondance seront à nouveau supprimés. Cela modifie le courrier de tout le domaine : un jeton confiné à des boîtes aux lettres reçoit donc 403 MAILBOX_CONFINED.
Paramètres
| domain* | string | Nom de domaine |
Réponse 200
| domain | string | |
| catch_all | string | null | |
| hint | string |
/api/email/changesSynchroniser progressivement une boîte aux lettres
Appelez sans curseur pour capturer une ligne de base avant un instantané complet délimité. Passez ensuite next_cursor pour rejouer les mutations qui se sont produites pendant et après cet instantané. Les curseurs sont opaques, signés, liés à une boîte aux lettres et expirent après 30 jours. Les notifications push ne sont que des indices d'invalidation ; ce journal est la source de récupération durable. Une entrée concernant un élément de travail issu d'un courrier d'authentification porte son title et son ask masqués pour un jeton sans email:auth_secrets.
Paramètres
| mailbox_id* | string | |
| cursor | string | next_cursor opaque à partir d'une réponse précédente |
| limit | integer |
Réponse 200
| changes | MailboxChange[] | |
| next_cursor | string | |
| has_more | boolean | |
| requires_full_sync | boolean | |
| reason | string |
/api/suppressionsListe des adresses supprimées
Répertoriez les adresses de votre liste de suppression : rebonds définitifs et plaintes (intégrés automatiquement à partir des événements d’acheminement), ainsi que les entrées manuelles. Les envois à ces adresses sont ignorés. Pagination par curseur.
Paramètres
| cursor | string | Curseur de pagination d'une réponse précédente |
| limit | integer | Nombre maximum d'entrées (50 par défaut, 100 maximum) |
Réponse 200
| suppressions | object[] | |
| next_cursor | string | null | |
| hint | string |
/api/suppressionsAjouter une suppression
Ajoutez manuellement une adresse à votre liste de suppression afin que les futurs envois l'ignorent. Les rebonds durs et les plaintes sont ajoutés automatiquement ; utilisez-le pour les adresses auxquelles vous ne souhaitez plus envoyer d'e-mails. Idempotent.
Corps de la demande
| address* | string | Adresse e-mail à supprimer |
| reason | string(manual | hard_bounce | complaint) | Raison (par défaut : manuel) |
Réponse 201
| address | string | |
| reason | string | |
| source | string | |
| created_at | string (date-time) | |
| hint | string |
/api/suppressions/{address}Supprimer une suppression
Supprimez une adresse de votre liste de suppression afin de pouvoir l'envoyer à nouveau par e-mail (par exemple après que le destinataire ait corrigé sa boîte aux lettres).
Paramètres
| address* | string | Adresse e-mail supprimée (codée en URL) |
Réponse 200
| address | string | |
| deleted | boolean | |
| hint | string |
Collaboration
/api/workspaces/{id}/ownership-transferDemander un transfert de propriété d'un espace de travail
Propriétaire uniquement. Envoie un lien d’acceptation de 48 heures à un membre existant. Rien ne bouge jusqu'à ce que ce membre authentifié accepte.
Paramètres
| id* | string |
Corps de la demande
| membership_id* | string |
/api/workspaces/{id}/ownership-transfer/{transferId}Révoquer un transfert de propriété en attente
Paramètres
| id* | string | |
| transferId* | string |
/api/workspaces/ownership-transfers/acceptAccepter la propriété de l'espace de travail
Cible uniquement. Transfère atomiquement l’espace de travail, les domaines étendus et les boîtes aux lettres ; l'ancien propriétaire devient administrateur et le payeur existant reste inchangé.
Corps de la demande
| token* | string |
Authentification
/api/auth/registerPubliqueCréer un nouveau compte
Commence la création d'un nouveau compte (ou connecte un compte existant) en envoyant un lien de connexion par e-mail ; aucune clé d'API n'est renvoyée ici. Une personne qui clique sur ce lien dans un navigateur arrive sur le tableau de bord déjà connectée. Une CLI ou un agent sans session de navigateur doit utiliser à la place le flux de connexion par appareil (POST /api/auth/cli puis interroger GET /api/auth/cli/poll), qui envoie par e-mail la même approbation et renvoie une clé d'API une fois approuvée - la réponse l'indique dans next_steps. Passer un code ref lie de façon permanente le nouvel utilisateur à un parrain - le parrain gagne une commission sur tous les futurs achats de domaines de cet utilisateur.
Corps de la demande
| email* | string (email) | |
| ref | string | Code de parrainage - relie en permanence cet utilisateur au référent. Le parrain gagne une commission sur chaque achat de domaine. |
Réponse 202
| ok | boolean | |
| verification_required | boolean | |
| message | string | |
| hint | string | |
| next_steps | string[] |
Exemple de réponse
{
"ok": true,
"verification_required": true,
"message": "Check your email for a sign-in link to finish creating your account.",
"hint": "A human must open that email and click the link in a browser to finish verification; no API key is issued yet.",
"next_steps": [
"If a person can click the email link, nothing else to do: they land on the dashboard already signed in.",
"If you are a CLI or agent without a browser session, start a device-login flow instead: POST /api/auth/cli, then poll GET /api/auth/cli/poll?code=... until status is \"complete\" - the same email approves it and hands back an API key, no browser needed on your side."
]
}Exemple
curl -X POST https://domani.run/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "dev@example.com"}'/api/auth/loginPubliqueEnvoyer un e-mail de connexion avec un lien magique
Envoie un lien de connexion à l’e-mail fourni. Si l'utilisateur n'existe pas, crée d'abord un compte. Le lien magique redirige vers le tableau de bord avec les informations d'authentification. Pour l'accès à l'API par programmation, utilisez POST /api/auth/register pour obtenir directement une clé API.
Corps de la demande
| email* | string (email) |
Réponse 200
| ok | boolean | |
| message | string |
Exemple de réponse
{
"ok": true,
"message": "Check your email for a sign-in link."
}Exemple
curl -X POST https://domani.run/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "dev@example.com"}'/api/auth/verifyPubliqueVérifier un jeton de lien magique
Valide le jeton de lien magique et redirige vers le tableau de bord avec les informations d'identification d'authentification. Utilisé par l'e-mail de lien magique - généralement non appelé directement par les agents. Les agents doivent plutôt utiliser POST /api/auth/register.
Paramètres
| token* | string | Jeton de lien magique provenant d'un e-mail (codé en base64url) |
/api/auth/handoffGénérer un code de connexion à usage unique entre hôtes
Navigateur uniquement : permet à une personne connectée sur domani.run ou mailzero.run de reprendre sa session sur l’autre hôte sans second lien magique. Renvoie une URL dont le fragment porte un code à usage unique, valable 60 secondes et lié à l’hôte ; ce code n’est jamais journalisé ni envoyé dans une chaîne de requête. Inutile hors d’une session de navigateur, il n’est donc pas exposé comme outil d’agent.
Corps de la demande
| target* | string(mail | domani) | |
| path* | string |
Réponse 200
| url | string |
Exemple de réponse
{
"url": "https://mailzero.run/auth/handoff#code=xxx&next=%2Finbox"
}/api/auth/handoff/redeemPubliqueÉchanger un code de connexion à usage unique entre hôtes
Navigateur uniquement : appelé par la page /auth/handoff sur l’hôte cible pour échanger le code du fragment d’URL contre une session, exactement comme GET /api/auth/verify le fait pour un lien magique. Le code doit correspondre au Host sur lequel cette requête est arrivée. Ce n’est pas un outil d’agent.
Corps de la demande
| code* | string |
Réponse 200
| ok | boolean | |
| next | string |
Exemple de réponse
{
"ok": true,
"next": "/inbox"
}Compte
/api/meObtenir les détails du compte courant
Renvoie les informations du compte de l'utilisateur authentifié, notamment l'e-mail, l'état du paiement, l'état des informations de contact, le code de référence et le nombre d'utilisations. Les agents doivent appeler ceci après l'authentification pour vérifier has_payment_method et has_contact avant de tenter des achats.
Réponse 200
| id | string | |
| string (email) | ||
| plan | string | Clé du plan Domani personnel actif |
| workspace_plans | string[] | Clés actives distinctes du plan Mailzero sur les espaces de travail auxquels l'utilisateur peut accéder |
| has_payment_method | boolean | Si l'utilisateur a une carte enregistrée (obligatoire avant d'acheter des domaines) |
| preferred_payment_method | string | null | |
| preferred_locale | string | Paramètres régionaux utilisés par les interfaces Domani et les communications transactionnelles |
| has_contact | boolean | Indique si l'utilisateur a renseigné ses coordonnées WHOIS. Facultatives pour un achat (tant qu'elles manquent, le contact de Domani détient les nouveaux domaines pour le compte de l'utilisateur), obligatoires pour un transfert entrant. |
| contact | RegistrantContact | Coordonnées du titulaire (nulles si non définies) |
| referral_code | string | Votre code de parrainage unique |
| referral_rate | integer | Pourcentage de commission sur les achats référés |
| balance | number | Solde créditeur du marché en USD (revenu des ventes) |
| domain_count | integer | Nombre de domaines possédés |
| token_count | integer | Nombre de jetons API actifs |
| features | string[] | Indicateurs de fonctionnalités activés pour ce compte (fonctionnalités GA plus les fonctionnalités en avant-première accordées à l’utilisateur), par exemple mailzero_assistant |
| can_manage_assistant | boolean | Indique si le jeton appelant dispose de la portée assistant:read. Indépendant de `features` : un indicateur de fonctionnalité dit que le compte est éligible à l'assistant, ceci indique si ce jeton précis (accès complet, ou un jeton CLI/OAuth/délégué à étendue restreinte) peut lire ou modifier ses réglages. |
| is_admin | boolean | |
| mailbox_entitlement | object | Place pour des boîtes mail sur domaine personnalisé dans l’espace de travail personnel du compte. Son propre plan, pas `plan` ci-dessus : un espace de travail peut avoir son propre abonnement Mailzero alors que le plan de l’utilisateur reste gratuit. |
| created_at | string (date-time) |
Exemple de réponse
{
"id": "cm5abc123",
"email": "dev@example.com",
"plan": "agent",
"workspace_plans": [
"mail_pro"
],
"has_payment_method": true,
"has_contact": true,
"referral_code": "x7k9m2",
"referral_rate": 20,
"domain_count": 3,
"token_count": 2,
"created_at": "2025-01-15T10:30:00.000Z"
}Exemple
curl https://domani.run/api/me \ -H "Authorization: Bearer domani_sk_xxx"
/api/meMettre à jour les préférences du compte
Mettez à jour le mode de paiement préféré de l'utilisateur authentifié et/ou les paramètres régionaux BCP 47. Les réponses de l'API restent structurées et ne sont pas traduites.
Corps de la demande
| preferred_payment_method | string | null(card | usdc) | Mode de paiement par défaut pour les achats (card, usdc ou null pour la sélection automatique) |
| preferred_locale | string(en | fr | es | pt-BR | ja | zh-Hans | it) | Paramètres régionaux utilisés par les interfaces Domani et les communications transactionnelles |
Réponse 200
| preferred_payment_method | string | null | |
| preferred_locale | string | |
| hint | string |
/api/meSupprimer le compte (bloqué pendant que les domaines sont détenus)
Supprimez définitivement le compte, les jetons, les webhooks, les boîtes aux lettres et autres données d'application de l'utilisateur authentifié. Les domaines enregistrés ne sont PAS supprimés avec le compte : la demande échoue avec 409 HAS_DOMAINS jusqu'à ce que chaque domaine soit transféré. Cette action ne peut pas être annulée.
Réponse 200
| deleted | boolean | |
| hint | string |
/api/me/activationObtenez un état d'activation véridique et les prochaines actions recommandées
Renvoie les jalons du produit dérivé du serveur et les prochaines actions tenant compte des capacités. La création de jetons, l'utilisation de jetons, les pages vues et l'état de la liste de contrôle du client sont délibérément exclus.
Réponse 200
| version | integer | |
| account_created_at | string (date-time) | |
| entry | object | |
| milestones | object | |
| status | string | |
| recommended_actions | object[] | |
| available_paths | string[] | |
| dismissed_version | integer | |
| pending_claim | object | null |
Exemple
curl https://domani.run/api/me/activation \ -H "Authorization: Bearer domani_sk_xxx"
/api/me/activationIgnorer ou restaurer le guidage de première exécution
Enregistre uniquement les préférences de présentation. Il ne peut pas franchir une étape de produit.
Corps de la demande
| dismissed_version* | integer |
Réponse 200
| dismissed_version | integer | |
| hint | string |
/api/me/contactObtenir les coordonnées des inscrits
Renvoie les coordonnées WHOIS du titulaire pour l'utilisateur authentifié. Facultatives pour un achat (tant qu'elles manquent, le contact de Domani détient les nouveaux domaines pour le compte de l'utilisateur), obligatoires pour un transfert entrant.
Réponse 200
| has_contact | boolean | |
| contact | RegistrantContact |
Exemple de réponse
{
"has_contact": true,
"contact": {
"first_name": "Jane",
"last_name": "Doe",
"address1": "123 Main St",
"city": "New York",
"state": "NY",
"postal_code": "10001",
"country": "US",
"phone": "+1.2125551234",
"email": "jane@example.com"
}
}Exemple
curl https://domani.run/api/me/contact \ -H "Authorization: Bearer domani_sk_xxx"
/api/me/contactDéfinir les coordonnées du inscrit
Définit ou met à jour vos coordonnées WHOIS de titulaire. Facultatives pour un achat, obligatoires pour un transfert entrant. Elles deviennent le contact titulaire et de facturation de vos domaines : tant qu'elles manquent, le contact de Domani les détient pour votre compte. À chaque mise à jour, les nouvelles coordonnées sont envoyées à tous vos domaines actifs chez les bureaux d'enregistrement qui acceptent les changements de contact, ce qui fait de vous leur titulaire ; le bureau d'enregistrement peut vous demander par e-mail de les confirmer sous 15 jours.
Réponse 200
| contact | RegistrantContact |
Exemple
curl -X PUT https://domani.run/api/me/contact \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"first_name":"Jane","last_name":"Doe","address1":"123 Main St","city":"New York","state":"NY","postal_code":"10001","country":"US","phone":"+1.2125551234","email":"jane@example.com"}'/api/me/resend-verificationRenvoyer la vérification de l'e-mail du contact
Renvoyez l’e-mail de vérification à l’adresse de contact du compte. Limité à un envoi toutes les 15 minutes par adresse.
Corps de la demande
| string (email) | Adresse e-mail à vérifier (par défaut, l'adresse e-mail de contact du compte) |
Réponse 200
| sent | boolean | |
| already_verified | boolean | |
| hint | string |
/api/sessionsLister les appareils connectés
Chaque navigateur, application mobile et terminal connecté au compte, la session de l'appelant en premier (current). Chaque connexion ouvre sa propre session : se connecter sur un nouvel appareil ne déconnecte donc jamais les autres. La localisation est l'endroit d'où l'appareil s'est connecté (pays et ville d'après son IP), absente si elle est inconnue. Les clés API ne sont pas des sessions : listez-les avec GET /api/tokens.
Réponse 200
| sessions | object[] | |
| hint | string |
Exemple de réponse
{
"sessions": [
{
"id": "cm5ses123",
"current": true,
"kind": "web",
"product": "domani",
"device": {
"type": "desktop",
"os": "macOS",
"browser": "Chrome"
},
"location": {
"country": "FR",
"city": "Paris"
},
"signed_in_at": "2026-10-01T10:00:00.000Z",
"last_active_at": "2026-10-18T09:12:00.000Z"
},
{
"id": "cm5ses456",
"current": false,
"kind": "mobile",
"product": null,
"device": {
"type": "mobile",
"os": "iOS",
"browser": null
},
"location": {
"country": "FR",
"city": "Lyon"
},
"signed_in_at": "2026-09-20T18:30:00.000Z",
"last_active_at": "2026-10-17T21:04:00.000Z"
}
],
"hint": "Sign a device out with DELETE /api/sessions/{id}, or every device but this one with DELETE /api/sessions."
}Exemple
curl https://domani.run/api/sessions \ -H "Authorization: Bearer domani_sk_xxx"
/api/sessionsDéconnecter tous les autres appareils
Déconnecte toutes les sessions du compte sauf celle qui fait la requête. Ces appareils devront se reconnecter à leur prochaine requête. Les clés API ne changent pas.
Réponse 200
| revoked | integer | |
| hint | string |
Exemple de réponse
{
"revoked": 2,
"hint": "Every other device is signed out. API keys are unchanged."
}Exemple
curl -X DELETE https://domani.run/api/sessions \ -H "Authorization: Bearer domani_sk_xxx"
/api/sessions/{id}Déconnecter un appareil
Déconnecte une session. current désigne la session qui fait la requête (se déconnecter ne nécessite aucune portée) ; toute autre session nécessite tokens:write.
Paramètres
| id* | string | Identifiant de la session (issu de GET /api/sessions), ou `current` |
Réponse 200
| success | boolean | |
| current | boolean | Vrai lorsque l'appelant s'est lui-même déconnecté : sa clé ne fonctionne plus |
| hint | string |
Exemple de réponse
{
"success": true,
"current": false,
"hint": "That device is signed out and will be asked to sign in again."
}Exemple
curl -X DELETE https://domani.run/api/sessions/cm5ses456 \ -H "Authorization: Bearer domani_sk_xxx"
Jetons API
/api/agents/identity/{slug}/tokensLister les jetons API d'une identité agent
Les jetons liés à cette identité agent (clés masquées, scopes, confinement aux boîtes mail, dernière utilisation). Un jeton lié à un agent est la vue de cet agent sur chaque assistant et surface mail.
Paramètres
| slug* | string | L'identifiant de l'identité agent. |
/api/agents/identity/{slug}/tokensDonner à un agent sa propre clé API en un seul appel
Crée un jeton lié à cette identité agent, confiné aux boîtes mail que l'agent opère, avec les scopes minimaux dont un agent a besoin (assistant:read, assistant:write, email:read, email:write). Avec cette clé, l'agent lit uniquement son propre Today, ses boîtes mail et les éléments qui lui sont confiés; nommer un autre agent répond 403 et les routes réservées au propriétaire (settings, backfill, export) le refusent. La clé complète est retournée uniquement dans cette réponse. Requiert tokens:write. Un agent qui n'opère aucune boîte aux lettres ne reçoit aucune portée de courrier par défaut, et les demander répond 400 AGENT_MAILBOXES_REQUIRED : une clé sans boîte aux lettres atteindrait toutes les boîtes aux lettres du compte.
Paramètres
| slug* | string | L'identifiant de l'identité agent. |
Corps de la demande
| name | string | Par défaut '<slug> agent'. |
| scopes | string[] | Par défaut assistant:read, assistant:write, email:read, email:write. Ne peut pas dépasser les scopes de l'appelant. |
| mailboxes | string[] | Adresses de boîtes mail auxquelles le jeton est confiné. Par défaut les boîtes mail que l'agent opère. |
| expires_in | integer | Secondes jusqu'à expiration (max un an). |
Réponse 201
| success | boolean | |
| token | object | |
| agent | object | |
| hint | string |
Exemple
curl -X POST https://domani.run/api/agents/identity/dave/tokens \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"name": "Dave on the laptop"}'/api/agents/identity/{slug}/tokens/{id}Révoquer le jeton API d'un agent
Révoque un jeton lié à cette identité agent. Il cesse de fonctionner immédiatement. Requiert tokens:write.
Paramètres
| slug* | string | |
| id* | string |
Réponse 200
| success | boolean | |
| hint | string |
/api/tokensListez vos jetons API
Renvoie tous les jetons API pour l'utilisateur authentifié. Les clés sont masquées pour des raisons de sécurité (12 premiers + 4 derniers caractères visibles). Utilisez-le pour auditer les jetons actifs.
Réponse 200
| tokens | TokenInfo[] |
Exemple de réponse
{
"tokens": [
{
"id": "cm5abc123",
"name": "Default",
"key": "domani_sk_a...wxyz",
"lastUsed": "2025-02-18T10:30:00.000Z",
"expiresAt": null,
"expired": false,
"scopes": [
"*"
],
"createdAt": "2025-01-15T10:30:00.000Z",
"max_per_tx": null,
"max_per_month": null,
"spent_this_month": 0,
"parent_token_id": null,
"agent_identity": null
},
{
"id": "cm5def456",
"name": "CI/CD",
"key": "domani_sk_b...vwxy",
"lastUsed": null,
"expiresAt": "2025-05-01T14:00:00.000Z",
"expired": false,
"scopes": [
"domains:read",
"domains:write"
],
"createdAt": "2025-02-01T14:00:00.000Z"
}
]
}Exemple
curl https://domani.run/api/tokens \ -H "Authorization: Bearer domani_sk_xxx"
/api/tokensCréer un nouveau jeton API
Crée un nouveau jeton API. La clé complète est renvoyée uniquement dans cette réponse : stockez-la en toute sécurité. Vous pouvez créer plusieurs jetons pour séparer l'accès de différentes applications.
Corps de la demande
| name | string | Nom lisible par l'homme pour identifier ce jeton |
| expires_in | integer | Durée de vie du jeton en secondes (min 3600 = 1h, max 31536000 = 1an). Omettre pour aucune expiration. |
| expires_at | string (date-time) | Date de péremption absolue (ISO 8601). Alternative à expires_in. |
| scopes | string[] | Étendues d’autorisation pour ce jeton. Utilisez ['*'] pour un accès complet (par défaut). Un jeton ne peut accorder que les étendues qu’il possède déjà (atténuation de l’étendue). Étendues : domains:read (GET /api/domains, GET /api/domains/{domain}, GET /api/domains/{domain}/dns, /dnssec, /status, /email/check, /auth-code, /transfer-away, /transfer-status, /analytics), domains:write (PUT /api/domains/{domain}/dns, POST/DELETE /api/domains/{domain}/dnssec, POST /connect, POST /verify, PUT /settings, PUT /parking, PUT/DELETE /api/domains/{domain}/for-sale, POST /api/domains/import, POST /import/verify), domains:transfer (POST /api/domains/buy, POST /transfer, POST /renew (implique un paiement, inclut les achats sur la place de marché)), tokens:read (GET /api/tokens), tokens:write (POST /api/tokens, DELETE /api/tokens/{id}), webhooks:read (GET /api/webhooks, GET /api/webhooks/{id}/deliveries), webhooks:write (POST /api/webhooks, PATCH /api/webhooks/{id}, DELETE /api/webhooks/{id}), email:read (GET /api/emails, /api/emails/{address}, /api/emails/{address}/messages, /api/emails/{address}/aliases, /api/email/changes, /api/domains/{domain}/email/status, /api/domains/{domain}/email/deliverability, /api/suppressions, GET /api/contacts), email:write (POST /api/emails, POST /api/emails/{address}/send, POST /api/domains/{domain}/email/setup, alias + catch-all, POST/DELETE /api/suppressions, POST/DELETE /api/contacts), email:delete (Supprimer définitivement les messages déjà dans la corbeille. Le déplacement des messages vers la corbeille nécessite uniquement email:write. N’accordez cette portée qu’aux agents autorisés à effacer de manière irréversible le contenu des e-mails), email:manage_mailboxes (Créer des boîtes aux lettres (POST /api/emails) et rien d’autre. L’étendue d’administration restreinte pour les agents qui peuvent créer des adresses pour de nouveaux projets (partners@, launch@) sans pouvoir lire ni envoyer de courrier, gérer des domaines ou toucher aux jetons), email:auth_secrets (Lire les messages classés comme courrier d’authentification (OTP / codes de vérification, réinitialisations de mot de passe, liens magiques). Sans elle, email:read les répertorie toujours, mais le sujet et le corps sont renvoyés masqués - ainsi un jeton d’agent volé ne peut pas récolter de codes 2FA. Ne l’accordez qu’aux agents qui ont réellement besoin de finaliser des connexions), account:read (GET /api/me, GET /api/agents/identity), account:write (DELETE /api/me, POST /api/billing/setup, POST /api/billing/subscribe, POST /api/billing/cancel, POST /api/me/resend-verification, POST/PATCH/DELETE /api/agents/identity), billing:read (GET /api/billing/invoices), search (GET /api/domains/search, /suggest, /whois, /dns-check, GET /api/tlds), deals:read (GET /api/deals, GET /api/deals/{id}), deals:write (POST /api/domains/sell, PATCH /api/deals/{id}), notifications:read (GET /api/notifications, GET /api/notifications/count), backorders:read (GET /api/backorders, GET /api/backorders/{id}), backorders:write (POST /api/backorders, DELETE /api/backorders/{id}), assistant:read (Lire les paramètres de l'assistant Mailzero, la file Today, les éléments Work, les aperçus d'actions exacts, la progression d'importation de l'historique et l'Activity avec contenu minimisé), assistant:write (Modifier les paramètres de l'assistant Mailzero, enregistrer le consentement et démarrer les importations d'historique, enregistrer les Decisions humaines sur les éléments Work, réessayer les importations et exporter ou supprimer les données dérivées de l'assistant. N'envoie jamais de courrier). |
| max_per_tx | number | Plafond de dépenses par transaction en USD. Toute charge unique supérieure à ce montant échoue avec 403 SPEND_CAP_EXCEEDED. Un jeton ne peut accorder que des plafonds égaux ou inférieurs au sien (dans le cas contraire, CAP_ESCALATION). |
| max_per_month | number | Plafond de dépenses mensuel glissant en USD pour toutes les opérations payantes effectuées avec ce jeton. |
| agent_identity_id | string | ID facultatif d’une identité d’agent appartenant à ce compte. Les actions de courrier effectuées avec le jeton sont attribuées à cet agent. |
| http_route_policy | object | Autorité structurée requise pour un jeton à étendue restreinte disposant de http-routes:read ou http-routes:write. |
| mailboxes | string[] | Confiner le jeton à ces adresses de boîtes aux lettres (slug@domain). Un jeton confiné ne voit et n’agit que sur ces boîtes aux lettres ; un appelant confiné ne peut déléguer qu’un sous-ensemble des siennes (400 MAILBOX_ESCALATION dans le cas contraire). |
Réponse 201
| id | string | |
| name | string | |
| key | string | Clé API complète : enregistrez-la, elle ne s'affichera plus |
| expiresAt | string (date-time) | null | Quand ce jeton expire (null = jamais) |
| scopes | string[] | Étendues d'autorisation accordées à ce jeton |
| createdAt | string (date-time) | |
| max_per_tx | number | null | Plafond de dépenses par transaction en USD (nul = non plafonné) |
| max_per_month | number | null | Plafond de dépenses mensuelles en USD (nul = non plafonné) |
| mailbox_ids | string[] | Identifiants de boîtes aux lettres auxquels ce jeton est confiné |
| http_route_policy | HttpRoutePolicy | |
| agent_identity | object | null |
Exemple de réponse
{
"id": "cm5ghi789",
"name": "CI/CD Pipeline",
"key": "domani_sk_x1Y2z3A4b5C6d7E8f9G0hIjK",
"expiresAt": "2025-03-20T10:30:00.000Z",
"scopes": [
"domains:read",
"domains:write"
],
"createdAt": "2025-02-18T10:30:00.000Z",
"max_per_tx": 25,
"max_per_month": 100,
"mailbox_ids": [],
"http_route_policy": null
}Exemple
curl -X POST https://domani.run/api/tokens \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"name": "CI/CD Pipeline"}'/api/tokens/{id}Révoquer un jeton API
Révoque définitivement un jeton API. Toutes les applications utilisant ce jeton perdront immédiatement l'accès. Cette action ne peut pas être annulée.
Paramètres
| id* | string | ID de jeton (à partir de la réponse GET /api/tokens) |
Réponse 200
| success | boolean |
Exemple de réponse
{
"success": true
}Exemple
curl -X DELETE https://domani.run/api/tokens/cm5abc123 \ -H "Authorization: Bearer domani_sk_xxx"
/api/auditRépertorier les événements d'audit de sécurité
Renvoie la piste d’audit de sécurité du compte, la plus récente en premier : cycle de vie du jeton (création, révocation, tentatives d’escalade), refus liés au plafond de dépenses et à max_price, frais, demandes de paiement et suppressions de compte bloquées. Utilisez-la pour surveiller l’activité des jetons de vos agents.
Paramètres
| limit | integer | Événements par page |
| cursor | string | Curseur de pagination (next_cursor de la page précédente) |
| type | string | Filtrer par type d'événement (par exemple token.created, Purchase.charged, Purchase.denied_cap) |
Réponse 200
| events | object[] | |
| next_cursor | string | null | |
| hint | string |
Exemple de réponse
{
"events": [
{
"id": "evt1",
"tokenId": "cm5abc123",
"type": "purchase.charged",
"targetType": "domain",
"targetId": "mysite.com",
"metadata": {
"amountCents": 1450,
"operation": "buy",
"method": "card"
},
"createdAt": "2026-07-11T10:00:00.000Z"
},
{
"id": "evt2",
"tokenId": "cm5abc123",
"type": "purchase.denied_cap",
"targetType": "domain",
"targetId": "expensive.ai",
"metadata": {
"amountCents": 8470
},
"createdAt": "2026-07-11T09:58:00.000Z"
}
],
"next_cursor": null,
"hint": "Security-relevant events for this account."
}Exemple
curl "https://domani.run/api/audit?limit=50" \ -H "Authorization: Bearer domani_sk_xxx"
Webhooks
/api/webhooksRépertorier les webhooks
Répertoriez tous les points de terminaison de webhook configurés pour votre compte. Renvoie l'URL, les événements souscrits et l'état actif pour chaque webhook. Les secrets ne sont jamais restitués après la création. Un jeton confiné à des boîtes aux lettres ne voit que les webhooks confinés à ses propres boîtes aux lettres.
Réponse 200
| webhooks | object[] | |
| hint | string |
Exemple de réponse
{
"webhooks": [
{
"id": "cm5wh001",
"url": "https://example.com/webhooks/domani",
"events": [
"domain.purchased",
"dns.updated"
],
"active": true,
"created_at": "2026-02-25T10:00:00.000Z"
}
],
"hint": "1 webhook(s)."
}Exemple
curl https://domani.run/api/webhooks \ -H "Authorization: Bearer domani_sk_xxx"
/api/webhooksCréer un webhook
Enregistrez un nouveau point de terminaison de webhook HTTPS. Les valeurs facultatives d’autorisation ou de X-API-Key sont chiffrées au repos et incluses dans chaque distribution. Le secret de signature n'est renvoyé qu'une seule fois. Maximum 5 webhooks par compte. Un webhook créé par un jeton confiné à des boîtes aux lettres est confiné aux mêmes boîtes aux lettres : il ne reçoit aucun événement de courrier d'une autre boîte aux lettres.
Corps de la demande
| url* | string (uri) | URL HTTPS qui recevra les requêtes POST du webhook |
| events* | string[] | Types d'événements auxquels s'abonner. Utilisez GET /api/webhooks/events pour répertorier les types disponibles. |
| headers | object | En-têtes d’authentification chiffrés facultatifs. Seules l'autorisation et la X-API-Key sont acceptées. |
Réponse 200
| id | string | |
| url | string (uri) | |
| events | string[] | |
| secret | string | Secret de signature HMAC-SHA256 (affiché une fois) |
| active | boolean | |
| header_names | string[] | Noms d'en-tête d'authentification configurés ; les valeurs ne sont jamais renvoyées |
| created_at | string (date-time) | |
| hint | string |
Exemple de réponse
{
"id": "cm5wh001",
"url": "https://example.com/webhooks/domani",
"events": [
"domain.purchased",
"dns.updated"
],
"secret": "whsec_aBcDeFgHiJkLmNoPqRsTuVwXyZ012345",
"active": true,
"created_at": "2026-02-25T10:00:00.000Z",
"hint": "Webhook created. Save the secret - it won't be shown again. Use it to verify incoming payloads with HMAC-SHA256."
}Exemple
curl -X POST https://domani.run/api/webhooks \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hook","events":["domain.purchased","dns.updated"],"headers":{"Authorization":"Bearer sender_key_xxx"}}'/api/webhooks/{id}Mettre à jour le webhook
Mettez à jour l'URL d'un webhook, les événements souscrits, le statut actif ou les en-têtes d'authentification chiffrés. Envoyez uniquement les champs que vous souhaitez modifier. Un jeton confiné à des boîtes aux lettres n'atteint que les webhooks confinés à ses propres boîtes aux lettres (404 sinon).
Paramètres
| id* | string | Identifiant du webhook |
Corps de la demande
| url | string (uri) | Nouvelle URL HTTPS |
| events | string[] | Nouvelle liste de types d'événements |
| active | boolean | Définir false pour mettre en pause, true pour reprendre |
| headers | object | Remplacez les en-têtes d'authentification chiffrés ; envoyez {} pour effacer. Seules l'autorisation et la X-API-Key sont acceptées. |
Réponse 200
| id | string | |
| url | string (uri) | |
| events | string[] | |
| active | boolean | |
| header_names | string[] | Noms d'en-tête d'authentification configurés ; les valeurs ne sont jamais renvoyées |
| hint | string |
/api/webhooks/{id}Supprimer le webhook
Supprimez un point de terminaison de webhook. Toutes les distributions en attente seront annulées. Cela ne peut pas être annulé. Un jeton confiné à des boîtes aux lettres n'atteint que les webhooks confinés à ses propres boîtes aux lettres (404 sinon).
Paramètres
| id* | string | Identifiant du webhook |
Réponse 200
| success | boolean | |
| hint | string |
/api/webhooks/{id}/deliveriesLister les diffusions de webhooks
Obtenez les tentatives de distribution récentes pour un webhook. Affiche le type d'événement, l'état HTTP, le nombre de tentatives et les erreurs éventuelles. Utile pour déboguer les distributions ayant échoué. Un jeton confiné à des boîtes aux lettres n'atteint que les webhooks confinés à ses propres boîtes aux lettres (404 sinon).
Paramètres
| id* | string | Identifiant du webhook |
| limit | integer | Nombre maximal de transmissions à renvoyer |
Réponse 200
| deliveries | object[] | |
| hint | string |
Exemple de réponse
{
"deliveries": [
{
"id": "cm5del001",
"replay_of_id": null,
"event_type": "domain.purchased",
"status": "delivered",
"http_status": 200,
"attempts": 1,
"last_error": null,
"created_at": "2026-02-25T10:05:00.000Z"
}
],
"hint": "1 delivery(ies) for this webhook."
}/api/webhooks/{id}/deliveries/{deliveryId}/replayRejouer une diffusion de webhook
Clonez et restituez immédiatement un événement webhook immuable. La charge utile de l'événement et l'ID de l'événement restent identiques ; la signature HMAC reçoit un nouvel horodatage. Une clé d'idempotence requise garantit que les tentatives de l'appelant ne seront jamais envoyées deux fois. Un jeton confiné à des boîtes aux lettres n'atteint que les webhooks confinés à ses propres boîtes aux lettres (404 sinon). Une exception à la charge utile identique : un sujet copié d'un courrier d'authentification est envoyé masqué, car l'URL du webhook peut avoir changé depuis le premier envoi.
Paramètres
| id* | string | Identifiant du webhook |
| deliveryId* | string | ID de la transmission d’origine |
Corps de la demande
| idempotency_key* | string |
Réponse 200
| delivery_id | string | |
| original_delivery_id | string | |
| event_type | string | |
| status | string | |
| http_status | integer | null | |
| attempts | integer | |
| idempotency_key | string | |
| idempotent_replay | boolean | |
| created_at | string (date-time) | |
| hint | string |
/api/webhooks/eventsRépertorier les types d'événements de webhook
Répertoriez tous les types d’événements webhook disponibles avec des descriptions. Aucune authentification requise.
Réponse 200
| events | object[] |
Exemple de réponse
{
"events": [
{
"type": "domain.purchased",
"description": "A new domain was successfully registered"
},
{
"type": "dns.updated",
"description": "DNS records were changed for a domain"
},
{
"type": "transfer.completed",
"description": "A domain transfer completed successfully"
}
]
}Exemple
curl https://domani.run/api/webhooks/events
Notifications
/api/notificationsListe des notifications
Listez vos notifications dans l’application avec une pagination par curseur. Inclut les événements de transaction, les mises à jour d’annonce et les alertes système. Nécessite la portée notifications:read. Une notification écrite avant que les sujets de courrier soient masqués à l'écriture se lit avec le sujet du courrier d'authentification masqué, dans body et data.subject, pour un jeton sans email:auth_secrets.
Paramètres
| limit | integer | Nombre maximum de notifications à retourner |
| cursor | string | Curseur de pagination (à partir du next_cursor de la réponse précédente) |
Réponse 200
| notifications | object[] | |
| has_more | boolean | |
| next_cursor | string | null |
/api/notifications/countObtenez le nombre de notifications non lues
Point de terminaison léger pour interroger le nombre de notifications non lues. Nécessite la portée notifications:read.
Réponse 200
| unread_count | integer |
Exemple de réponse
{
"unread_count": 3
}/api/notifications/{id}Marquer la notification comme lue
Marquer une seule notification comme lue. Nécessite la portée notifications:read.
Paramètres
| id* | string | ID de notification |
Corps de la demande
| read* | boolean | Définir sur true pour marquer comme lu |
Réponse 200
| ok | boolean |
/api/notifications/read-allMarquer toutes les notifications comme lues
Marquez toutes les notifications non lues comme lues. Nécessite la portée notifications:read.
Réponse 200
| ok | boolean | |
| count | integer | Nombre de notifications marquées comme lues |
/api/notifications/preferencesObtenir les préférences de notification
Renvoie les préférences de notification de l'utilisateur pour chaque catégorie et canal (in_app, email). Les préférences manquantes sont activées par défaut. Nécessite la portée notifications:read.
Réponse 200
| preferences | object[] | |
| expiry_alert_days | integer[] | Quelques jours avant l'expiration, l'utilisateur reçoit des rappels de renouvellement (30/7/1 par défaut). Vide = pas de rappel d'expiration. |
/api/notifications/preferencesMettre à jour les préférences de notification
Mettez à jour les préférences de notification pour des catégories et des canaux spécifiques. Nécessite la portée notifications:read.
Corps de la demande
| preferences | object[] | |
| expiry_alert_days | integer[] | Quelques jours avant l'expiration pour recevoir des rappels de renouvellement. Tableau vide = aucun rappel d'expiration. |
Réponse 200
| ok | boolean |
TLD
/api/tldsPubliqueObtenir les TLD vendus par Domani, avec leurs tarifs
Renvoie les TLD vendus par Domani, avec les prix d'enregistrement, de renouvellement et de transfert. C'est le catalogue de nos bureaux d'enregistrement, pas tous les TLD qui existent : certains TLD de la zone racine, comme gov ou edu, ne peuvent pas être enregistrés via Domani. Chaque entrée a un kind : tld (un TLD de la zone racine de l'IANA), second_level (une offre sous l'un d'eux, comme co.uk) ou alt_root (un nom hors de la zone racine, qui ne se résout pas dans le DNS public). Les entrées alt_root sont exclues sauf si le paramètre kind les demande. Prend en charge le filtrage par gamme de prix, la recherche par nom de TLD, le tri et la pagination via limit/offset. Lorsqu'il est paginé, inclut un en-tête Link avec l'URL de la page suivante. Point de terminaison public - aucune authentification requise. Les requêtes authentifiées bénéficient de limites de débit plus élevées (60/min contre 30/min).
Paramètres
| max_price | number | Prix d'inscription maximum en USD |
| min_price | number | Prix minimum d'inscription en USD |
| sort | string(tld | price | renewal) | Champ de tri - « tld » (alphabétique), «price» (inscription) ou «renewal» |
| order | string(asc | desc) | Ordre de tri |
| search | string | Filtrer les noms de TLD contenant cette chaîne |
| limit | integer | Nombre maximum de résultats par page |
| offset | integer | Nombre de résultats à ignorer |
| kind | string | Types à renvoyer, séparés par des virgules : `tld`, `second_level`, `alt_root`. Par défaut : `tld,second_level`, les entrées qui se résolvent dans le DNS public. Les entrées `alt_root` (hors de la zone racine de l'IANA) ne sont renvoyées que sur demande. |
Réponse 200
| tlds | TldInfo[] | |
| total | integer | Total de TLD correspondants (avant pagination) |
| offset | integer | |
| limit | integer | null |
Exemple de réponse
{
"tlds": [
{
"tld": "xyz",
"registration": 4.04,
"renewal": 4.04,
"transfer": 4.04,
"kind": "tld"
},
{
"tld": "com",
"registration": 10.88,
"renewal": 13.08,
"transfer": 13.08,
"kind": "tld"
},
{
"tld": "co.uk",
"registration": 10.75,
"renewal": 10.75,
"transfer": 10.75,
"kind": "second_level"
}
],
"total": 743,
"offset": 0,
"limit": null
}Exemple
curl https://domani.run/api/tlds?max_price=10&sort=price
Recherche de domaine
/api/domains/searchPubliqueVérifier la disponibilité et les prix des domaines
Vérifie la disponibilité et les prix d'un ou plusieurs domaines via RDAP + prix de détail. Un nom que RDAP considère comme non enregistré est ensuite vérifié auprès du bureau d'enregistrement : un nom premium ou réservé par le registre revient avec available: false, registry_status et une reason. Utilisez q pour un seul domaine (renvoie un objet plat) ou domains pour plusieurs (renvoie un tableau). Prend en charge le streaming SSE via l'en-tête Accept: text/event-stream - la fermeture de la connexion annule toutes les recherches RDAP en vol côté serveur. Max 200 domaines par demande. Point de terminaison public - aucune authentification requise. Les requêtes authentifiées bénéficient de limites de débit plus élevées (60/min contre 20/min).
Paramètres
| q | string | Domaine unique incluant TLD (abréviation : renvoie un objet plat). Mutuellement exclusif avec les `domains`. |
| domains | string | Liste de noms de domaine complets à vérifier, séparés par des virgules (max 200). Renvoie le résultat du tableau. |
| max_price | number | Inclure uniquement les domaines inférieurs à ce prix (USD) |
| sort | string(price | tld) | Trier les résultats par prix ou nom de TLD |
| source | string(all | primary | secondary) | Filtrer les résultats par source : 'primary' (disponibilité du bureau d’enregistrement uniquement), 'secondary' (annonces de la marketplace Domani uniquement) ou 'all' (les deux) |
| order | string(asc | desc) |
Réponse 200
| available | boolean | Si le domaine est disponible pour l'enregistrement |
| domain | string | Nom de domaine complet incluant TLD |
| price | number | Prix d'inscription dans la devise spécifiée |
| currency | string | Code de devise ISO 4217 (toujours USD) |
| error | boolean | Vrai si la recherche RDAP a échoué (disponibilité inconnue) |
| for_sale | object | Présent lorsque le domaine est mis en vente (soit sur la place de marché Domani, soit détecté sur un marché secondaire externe) |
| tld_kind | string | Type, selon la zone racine, du suffixe du domaine : `tld`, `second_level` ou `alt_root`. Un domaine `alt_root` est hors de la zone racine de l'IANA et ne se résout pas dans le DNS public : il n'est pas vérifié, et `reason` explique pourquoi. |
| registry_status | string | Présent quand le registre retient un nom que RDAP considère comme non enregistré : `premium` (le registre fixe son propre prix, voir `registry_price`) ou `reserved` (il ne peut pas être enregistré). Un tel résultat vaut `available: false`, car `POST /api/domains/buy` ne peut pas l'enregistrer, et `reason` explique pourquoi. |
| registry_price | number | Présent sur les résultats `premium` quand le bureau d'enregistrement l'a indiqué : le prix de la première année fixé par le registre, en USD. `price` reste le prix standard du TLD, qui ne s'applique pas à ce nom. |
| renewal_price | number | Le coût de chaque année après la première, en USD, chez le bureau d'enregistrement qui enregistrerait le nom : ce que son renouvellement est facturé. Absent quand il est inconnu. Sur un résultat `premium`, c'est, comme `price`, le prix standard du TLD. |
| reason | string | Pourquoi le domaine n'est pas proposé : un nom hors du DNS public (`tld_kind` `alt_root`), ou un nom que le registre retient (`registry_status`). |
Exemple
curl "https://domani.run/api/domains/search?q=mysite.com"
/api/domains/suggestPubliqueSuggestions de domaines basées sur l'IA avec disponibilité
À partir d'une description de projet, génère des noms de domaine complets avec des TLD créatifs (par exemple codebuddy.dev, wavify.fm), vérifie la disponibilité et renvoie uniquement les domaines disponibles avec tarification. Utilise une boucle agent qui réessaye jusqu'à ce que suffisamment de domaines disponibles soient trouvés. Prend en charge le streaming SSE via Accept: text/event-stream - la fermeture de la connexion annule la génération LLM en vol et les recherches RDAP côté serveur. Point de terminaison public - aucune authentification requise.
Paramètres
| prompt* | string | Description du projet ou mots-clés à partir desquels générer des suggestions de domaines (min 3 caractères) |
| count | integer | Nombre de domaines disponibles à renvoyer (10 par défaut) |
| exclude | string | Liste de domaines séparés par des virgules à exclure des suggestions (par exemple, d'un lot précédent) |
| tlds | string | TLD préférés séparés par des virgules (sans points). Les résultats favoriseront fortement ces TLD. |
| style | string(single | creative | short | brandable | keyword) | Préférence de style de nom : «single» (un mot), «creative» (évocateur/métaphorique), «short» (3 à 6 caractères), «brandable» (inventé), «keyword» (descriptif). |
| lang | string(japanese | spanish | french | italian | latin | nordic | arabic | sanskrit) | Inspiration linguistique/culturelle pour les noms. Les noms s'inspireront des mots, de l'esthétique et de la culture de cette langue. |
Réponse 200
| suggestions | object[] | Noms de domaine disponibles avec tarification |
| checked | integer | Total des domaines vérifiés |
| iterations | integer | Nombre de cycles de LLM |
Exemple de réponse
{
"suggestions": [
{
"domain": "codebuddy.dev",
"price": 13,
"currency": "USD",
"renewal_price": 13
},
{
"domain": "aiforge.sh",
"price": 33,
"currency": "USD"
},
{
"domain": "devcraft.app",
"price": 13,
"currency": "USD"
}
],
"checked": 42,
"iterations": 2
}Exemple
curl "https://domani.run/api/domains/suggest?prompt=AI+coding+assistant"
/api/domains/dns-checkPubliqueVérification rapide de l'existence d'un domaine basée sur DNS
Teste par requêtes DNS si un domaine est déjà enregistré simultanément sur de nombreux TLD (plus rapide que la recherche, sans tarification). Renvoie les tableaux techniques 'taken' (enregistrement certain) et 'candidates' (disponibilité potentielle). Utilisez ce résultat pour cibler les recherches tarifées. Point de terminaison public - aucune authentification requise.
Paramètres
| name* | string | Nom de domaine sans TLD, par ex. 'myapp' |
| tlds* | string | TLD séparés par des virgules à vérifier, par ex. 'com,dev,ai,io' |
Réponse 200
| name | string | |
| taken | string[] | TLD définitivement enregistrés |
| candidates | string[] | TLD potentiellement disponibles |
Domaines
/api/domainsListez tous vos domaines enregistrés
Renvoie tous les domaines appartenant à l'utilisateur authentifié, classés par date d'achat (le plus récent en premier). Comprend le nom de domaine, le statut, la date d'achat et la date d'expiration.
Réponse 200
| domains | DomainRecord[] |
Exemple de réponse
{
"domains": [
{
"domain": "mysite.com",
"status": "active",
"purchasedAt": "2025-01-15T10:30:00.000Z",
"expiresAt": "2026-01-15T10:30:00.000Z",
"emailEnabled": true,
"emailVerified": true,
"emailVerifiedAt": "2025-01-15T10:35:00.000Z",
"mailboxCount": 2
},
{
"domain": "myapp.dev",
"status": "active",
"purchasedAt": "2025-02-01T14:00:00.000Z",
"expiresAt": "2026-02-01T14:00:00.000Z",
"emailEnabled": false,
"emailVerified": false,
"emailVerifiedAt": null,
"mailboxCount": 0
}
]
}Exemple
curl https://domani.run/api/domains \ -H "Authorization: Bearer domani_sk_xxx"
/api/agents/identityRéclamez une identité d'agent libre (<handle>.domani.run)
Donne à un agent une identité gratuite sur <slug>.domani.run - une page de profil en direct, sans achat de domaine, instantanément. La façon simple de commencer ; passez à un domaine réel plus tard. Nécessite account:write.
Corps de la demande
| slug* | string | Le handle - devient <slug>.domani.run |
| name | string | Nom d'affichage |
| bio | string | |
| emoji | string | Emoji avatar |
| string (email) | Contact public (par exemple, votre boîte de réception gratuite @domani.run) | |
| links | object[] |
Réponse 200
| id | string | ID d'identité stable utilisé pour lier les jetons d'API étendus |
| slug | string | |
| url | string | Le sous-domaine identité (canonique) |
| page_url | string | Chemin de secours qui fonctionne toujours |
| name | string | null | |
| bio | string | null | |
| emoji | string | null | |
| string | null | ||
| links | object[] | |
| views | integer | |
| created_at | string (date-time) |
Exemple de réponse
{
"success": true,
"id": "agent_abc123",
"slug": "myagent",
"url": "https://myagent.domani.run",
"page_url": "https://domani.run/agents/myagent",
"name": "My Agent",
"bio": "I broker domains.",
"emoji": "🤖",
"email": null,
"links": [],
"views": 0,
"created_at": "2026-07-11T00:00:00.000Z"
}Exemple
curl -X POST https://domani.run/api/agents/identity \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"slug": "myagent", "name": "My Agent", "bio": "I broker domains.", "emoji": "🤖"}'/api/agents/identityRépertoriez les identités de vos agents
Répertorie les identités gratuites (<handle>.domani.run) que vous avez réclamées. Nécessite account:read.
Réponse 200
| identities | AgentIdentity[] |
/api/agents/identity/{slug}Mettre à jour l'identité d'un agent
Mettez à jour les champs name/bio/emoji/email/links d’une identité gratuite. Nécessite account:write.
Paramètres
| slug* | string | Le handle à mettre à jour |
Corps de la demande
| name | string | |
| bio | string | |
| emoji | string | |
| string | ||
| links | object[] |
Réponse 200
| id | string | ID d'identité stable utilisé pour lier les jetons d'API étendus |
| slug | string | |
| url | string | Le sous-domaine identité (canonique) |
| page_url | string | Chemin de secours qui fonctionne toujours |
| name | string | null | |
| bio | string | null | |
| emoji | string | null | |
| string | null | ||
| links | object[] | |
| views | integer | |
| created_at | string (date-time) |
/api/agents/identity/{slug}Libérer l'identité d'un agent
Libère un identifiant d’identité gratuit afin qu’il soit à nouveau disponible. Nécessite account:write.
Paramètres
| slug* | string | La poignée pour libérer |
Réponse 200
| success | boolean | |
| slug | string | |
| released | boolean |
/api/agents/provisionFournir une identité d’agent complète en un seul appel
Donne à un agent IA une identité Internet complète en une seule requête : achète le domaine (s'il n'est pas déjà détenu), configure le DNS de messagerie, crée une boîte aux lettres et enregistre éventuellement un webhook authentifié pour les e-mails entrants et les événements de domaine. webhook_headers accepte uniquement Authorization et X-API-Key ; les valeurs sont chiffrées au repos et ne sont jamais renvoyées. La répétition du même domaine, du même slug de boîte aux lettres et de l'URL du webhook réutilise ces ressources. Chaque entrée de webhook est validée avant l'achat ou le paiement d'un domaine. L'achat du domaine est la seule étape qui peut être payante et la seule condition préalable : s'il échoue, l'ensemble de l'appel échoue (402 pour le paiement, 409 s'il est pris par un autre compte). La configuration de la messagerie électronique, la création de boîtes aux lettres et l'enregistrement de webhooks font l'objet de tous les efforts possibles : les problèmes transitoires (par exemple, le DNS qui se propage toujours) sont renvoyés dans des warnings plutôt que d'échouer l'appel, de sorte que l'agent obtient toujours son domaine. Le paiement fonctionne exactement comme POST /api/domains/buy (carte, solde du marché ou USDC via l'en-tête PAYMENT-SIGNATURE / flux en deux étapes).
Corps de la demande
| domain* | string | Domaine à donner à l'agent. Acheté s'il n'est pas déjà possédé. |
| slug | string | Partie locale de la boîte aux lettres (hi@domain). Valeur par défaut : 'hi'. |
| name | string | Nom d’affichage du courrier électronique sortant. |
| webhook_url | string (uri) | URL HTTPS facultative pour recevoir les e-mails entrants + les événements de domaine. |
| webhook_headers | object | Authentification d’acheminement facultative. Les valeurs sont chiffrées au repos et ne sont jamais renvoyées ; les réponses exposent uniquement header_names. |
| webhook_events | string[] | Types d’événements Webhook. La valeur par défaut est email.received/delivered/bounced. |
| payment_method | string(card | usdc | balance) | Comment payer le domaine. |
| payment_tx | string | Hachage USDC tx (flux en deux étapes). |
| payment_chain | string(base | ethereum) | |
| years | integer | |
| max_price | number | Plafond en USD pour le débit du domaine. Si le prix réel le dépasse, la demande échoue avec 400 PRICE_ABOVE_MAX et rien n'est facturé. Le champ `price` de l'erreur est le total à accepter ; confirmez-le avec l'utilisateur avant de réessayer avec ce max_price. |
Réponse 200
| domain | string | |
| domain_status | string | |
| mailbox | object | null | |
| webhook | object | null | |
| warnings | string[] | |
| hint | string | |
| next_steps | string[] |
Exemple
curl -X POST https://domani.run/api/agents/provision \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain":"myagent.run","slug":"hi","webhook_url":"https://my-agent.example.com/inbox","webhook_headers":{"Authorization":"Bearer sender-key"}}'/api/domains/buyAcheter un ou plusieurs domaines
Achète un ou plusieurs domaines et les enregistre immédiatement. Envoyez {"domain": "..."} pour un domaine ou {"domains": ["...", "..."]} pour un lot de 10 domaines maximum. Si le domaine est mis en vente sur la Marketplace Domani, ce point de terminaison déclenche automatiquement un achat sur la Marketplace au lieu d’un nouvel enregistrement. La réponse inclut years: 0 et marketplace_purchase: true pour distinguer cet achat d’un enregistrement. Les achats sur la Marketplace sont limités à un seul domaine. L’acheteur paie la totalité du prix affiché ; le vendeur reçoit ce prix moins la commission de plateforme (10 % par défaut). Lors d’un achat groupé, chaque domaine est traité indépendamment : un échec ne bloque pas les autres achats. La réponse inclut results (réussites), errors (échecs) et summary avec les totaux. Accepte trois modes de paiement : 1. Carte (par défaut) : nécessite une carte enregistrée via POST /api/billing/setup. Chaque domaine est débité séparément. 2. USDC (deux étapes) : effectuez un premier appel sans paiement pour recevoir une réponse 402 avec payment_options.crypto (adresse du portefeuille, montant et réseaux). Envoyez les USDC sur la blockchain, puis recommencez avec payment_tx et payment_chain dans le corps de la requête. 3. USDC x402 (atomique) : incluez un en-tête PAYMENT-SIGNATURE contenant un paiement USDC signé sur Base. Les achats groupés nécessitent une carte enregistrée (USDC n’est pas pris en charge pour plusieurs domaines). Si aucun paiement n’est fourni pour un domaine unique, renvoie HTTP 402 avec les instructions de paiement.
Corps de la demande
| domain | string | Domaine unique à acheter (par exemple monsite.com) |
| domains | string[] | Gamme de domaines à acheter (max 10, nécessite une carte au dossier) |
| payment_method | string(card | usdc | balance) | Mode de paiement : «card» (par défaut), « usdc » (x402 - le premier appel renvoie 402 avec les instructions de paiement) ou «balance» (dépenser du crédit sur le marché). |
| payment_tx | string | Hachage de transaction d'un paiement USDC déjà envoyé en chaîne. Requis lors du deuxième appel du flux USDC en deux étapes. |
| payment_chain | string(base | ethereum) | Chaîne sur laquelle le paiement USDC a été envoyé (par exemple « base » ou « ethereum »). |
| years | integer | Nombre d'années pour s'inscrire (1-10, par défaut 1). Le prix est multiplié par années. |
| max_price | number | Plafond en USD pour le montant total. Si le prix réel le dépasse, la requête échoue avec 400 PRICE_ABOVE_MAX et rien n'est débité : une ceinture de sécurité pour les agents autonomes. Sans max_price, le plafond est le prix affiché par la recherche : quand seul un bureau d'enregistrement plus cher peut prendre le nom, l'achat échoue de la même façon. Le `price` de l'erreur est le total à accepter, avec `listed_price` et `renewal_price` à côté ; confirmez-les avec l'utilisateur avant de réessayer avec ce max_price. |
| ref | string | Code de parrainage (facultatif) - le parrain gagne une commission |
Exemple
curl -X POST https://domani.run/api/domains/buy \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain": "mysite.com"}'/api/domains/{domain}Obtenez des informations détaillées sur un domaine que vous possédez
Renvoie des informations complètes sur un domaine : statut, date d'achat, expiration, mode de paiement, verrouillage de sécurité, confidentialité WHOIS, statut de renouvellement automatique et dates d'enregistrement. L'objet registrar peut être null si les données étendues ne sont pas disponibles.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| status | string | |
| auto_renew | boolean | Si le renouvellement automatique est activé |
| purchased_at | string (date-time) | |
| expires_at | string (date-time) | |
| days_until_expiry | integer | Jours avant l'expiration du domaine |
| renewal_price | number | null | Le coût d'une année de renouvellement en USD chez le bureau d'enregistrement qui détient le domaine ; renouveler N années coûte N fois ce montant. Null quand domani ne peut pas renouveler le domaine ou que son prix est inconnu. |
| payment_method | string | Comment le domaine a été payé |
| payment_tx | string | null | Hachage d'émission en chaîne (paiements USDC) |
| registrant | string | Qui le registre indique comme titulaire du domaine. `customer` : vos propres coordonnées (fournies via set_contact). `domani` : le contact par défaut de Domani, qui détient le domaine pour votre compte jusqu'à ce que vous ajoutiez les vôtres avec set_contact, ce qui fait de vous le titulaire. `unknown` : pas encore vérifié. La confidentialité WHOIS masque ces informations dans les deux cas. |
| transfer_out | object | Transfert du domaine vers un autre bureau d'enregistrement. `mode` `api` : get_auth_code renvoie le code. `manual` : le bureau d'enregistrement n'a pas d'API pour ce code, l'équipe Domani l'obtient donc à la main sous 1 jour ouvré. null : indisponible pour ce domaine. |
| registrar_status | string | Si les données du bureau d'enregistrement en direct ont été actualisées ou sont gérées en externe |
| registrar_checked_at | string (date-time) | Lorsque l'actualisation du bureau d'enregistrement a été tentée |
| registrar | object | null | Détails d'enregistrement du domaine (nul si indisponible) |
Exemple de réponse
{
"domain": "mysite.com",
"status": "active",
"auto_renew": true,
"purchased_at": "2025-06-01T12:00:00.000Z",
"expires_at": "2026-06-01T12:00:00.000Z",
"days_until_expiry": 365,
"payment_method": "card",
"registrant": "customer",
"transfer_out": {
"mode": "api",
"locked_until": null,
"request": null
},
"registrar_status": "connected",
"registrar_checked_at": "2025-06-01T12:00:00.000Z",
"registrar": {
"security_lock": true,
"whois_privacy": true,
"auto_renew": true,
"create_date": "2025-06-01T12:00:00Z",
"expire_date": "2026-06-01T12:00:00Z"
}
}Exemple
curl https://domani.run/api/domains/mysite.com \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/settingsMettre à jour les paramètres du domaine
Mettez à jour les paramètres d'un domaine que vous possédez. Prend en charge auto_renew, whois_privacy et security_lock. Au moins un champ doit être renseigné.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| auto_renew | boolean | S'il faut activer le renouvellement automatique pour ce domaine |
| whois_privacy | boolean | S'il faut activer la protection de la confidentialité WHOIS |
| security_lock | boolean | S'il faut verrouiller le domaine contre les transferts |
Réponse 200
| domain | string | |
| auto_renew | boolean | |
| whois_privacy | boolean | |
| security_lock | boolean | |
| hint | string |
Exemple
curl -X PUT https://domani.run/api/domains/mysite.com/settings \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"auto_renew": false}'/api/domains/{domain}/parkingMettre à jour les paramètres de parking
Mettez à jour les paramètres de parking et de référencement pour un domaine que vous possédez. Activez/désactivez la page de parking et définissez un prix d'inscription « À vendre ». Lorsque le parking est activé, les visiteurs du domaine voient une page de marque. Lorsqu'un prix d'inscription est fixé, les visiteurs voient une page « À vendre » avec un formulaire de contact.
Paramètres
| domain* | string | Nom de domaine |
Corps de la demande
| enabled | boolean | S'il faut activer la page de parking |
| listing_price | number | null | Prix de vente en USD, ou nul pour supprimer l'annonce |
Réponse 200
| domain | string | |
| parking_enabled | boolean | |
| listing_price | number | null | |
| hint | string |
/api/domains/{domain}/redirectTransférer un domaine vers une URL
Transférez un domaine que vous possédez vers une autre URL (par exemple brand.com -> https://brand.dev) - utile pour les marques multi-TLD. Le domaine doit pointer vers les serveurs de noms/IP de parking de domani pour que la redirection soit servie. Permanent (308) par défaut ou temporaire (307). Nécessite la portée domains:write.
Paramètres
| domain* | string | Nom de domaine |
Corps de la demande
| url* | string | URL cible (ou domaine nu) vers laquelle transférer, par ex. https://brand.dev |
| permanent | boolean | vrai = permanent (308, par défaut), faux = temporaire (307) |
Réponse 200
| domain | string | |
| redirect_url | string | null | |
| permanent | boolean |
/api/domains/{domain}/redirectArrêter de transférer un domaine
Supprimez la redirection d'un domaine pour qu'il revienne à la page de parking. Nécessite la portée domains:write.
Paramètres
| domain* | string | Nom de domaine |
Réponse 200
| domain | string | |
| redirect_url | string | null |
/api/domains/{domain}/for-saleMettre un domaine à vendre
Mettez en vente un domaine que vous possédez sur le marché Domani. Les acheteurs peuvent l'acheter directement via l'API. Le domaine doit être actif et ne pas être déjà mis en vente. Frais : Domani facture une commission de plateforme (10 % par défaut) sur les ventes réussies. Le vendeur reçoit le prix indiqué moins la commission. L'acheteur paie la totalité du prix indiqué. Nécessite la portée domains:write.
Paramètres
| domain* | string | Nom de domaine à mettre en vente |
Corps de la demande
| price* | number | Prix de vente en USD |
| description | string | Description de l'annonce facultative |
Réponse 200
| listing | object | |
| hint | string |
Exemple de réponse
{
"listing": {
"id": "lst_abc123",
"domain": "example.com",
"price": 5000,
"currency": "USD",
"description": null,
"status": "active",
"created_at": "2026-03-14T12:00:00.000Z"
},
"hint": "example.com listed for sale at $5,000. Buyers can purchase it on the marketplace."
}/api/domains/{domain}/for-saleMettre à jour une annonce de domaines
Mettez à jour le prix et/ou la description d’une annonce active sur le Marketplace. Au moins un champ doit être renseigné. Nécessite la portée domains:write.
Paramètres
| domain* | string | Nom de domaine avec mise en vente active |
Corps de la demande
| price | number | Nouveau prix de vente en USD |
| description | string | null | Nouvelle description (nul à effacer) |
Réponse 200
| listing | object | |
| hint | string |
Exemple de réponse
{
"listing": {
"id": "lst_abc123",
"domain": "example.com",
"price": 7000,
"currency": "USD",
"description": "Premium domain",
"status": "active",
"created_at": "2026-03-14T12:00:00.000Z"
},
"hint": "Listing for example.com has been updated. New price: $7,000."
}/api/domains/{domain}/for-saleAnnuler une annonce de domaines
Supprimez une annonce de vente active pour un domaine que vous possédez. Le domaine reste dans votre compte mais n'est plus disponible à l'achat sur la Marketplace. Nécessite la portée domains:write.
Paramètres
| domain* | string | Nom de domaine à délister |
Réponse 200
| domain | string | |
| status | string | |
| hint | string |
Exemple de réponse
{
"domain": "example.com",
"status": "cancelled",
"hint": "Listing for example.com has been cancelled."
}/api/domains/{domain}/analyticsObtenez des analyses de parking
Obtenez des analyses des visiteurs pour un domaine parqué : pages vues, demandes de renseignements, taux de conversion, répartition quotidienne sur 30 jours et demandes récentes.
Paramètres
| domain* | string | Nom de domaine |
Réponse 200
| domain | string | |
| views_7d | integer | Nombre total de pages vues au cours des 7 derniers jours |
| views_30d | integer | Nombre total de pages vues au cours des 30 derniers jours |
| inquiries_30d | integer | Nombre total de demandes au cours des 30 derniers jours |
| conversion_rate | number | Taux de requêtes/vues en pourcentage |
| daily_views | object[] | Nombre de vues quotidiennes au cours des 30 derniers jours |
| recent_inquiries | object[] | 5 demandes les plus récentes |
| hint | string |
Exemple de réponse
{
"domain": "example.com",
"views_7d": 42,
"views_30d": 156,
"inquiries_30d": 3,
"conversion_rate": 1.92,
"daily_views": [
{
"date": "2026-02-25",
"views": 7
}
],
"recent_inquiries": [
{
"email": "buyer@example.com",
"offer": 500,
"date": "2026-02-25T10:00:00Z"
}
],
"hint": "example.com received 156 views and 3 inquiries in the last 30 days (1.92% conversion)."
}/api/domains/{domain}/auth-codeObtenir le code d'authentification EPP
Obtenez le code EPP/auth nécessaire pour transférer un domaine vers un autre bureau d'enregistrement. Déverrouille automatiquement le domaine s'il est verrouillé. Qui détient le code d'autorisation peut emporter le domaine, et son courrier avec : le lire nécessite la portée email:auth_secrets et un jeton non confiné à des boîtes aux lettres (403 INSUFFICIENT_SCOPE ou 403 MAILBOX_CONFINED sinon), et chaque lecture est consignée dans le journal d'audit. Certains bureaux d'enregistrement n'ont pas d'API pour ce code : le premier appel répond alors 202 avec status: "requested" pendant que l'équipe Domani déverrouille le domaine et obtient le code à la main (sous 1 jour ouvré, expected_by) ; l'utilisateur reçoit un e-mail dès qu'il est prêt, et un appel ultérieur répond 200 avec status: "ready" et le code. Dans les 60 jours suivant un enregistrement ou un transfert entrant, un tel domaine répond 409 TRANSFER_LOCKED avec available_at.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| status | string | `ready` : le code est dans auth_code. `requested` : l'équipe Domani l'obtient auprès du bureau d'enregistrement ; l'utilisateur reçoit un e-mail dès qu'il est prêt. |
| auth_code | string | null | Code d'authentification EPP à donner au nouveau bureau d'enregistrement. null tant que le statut est requested. |
| was_unlocked | boolean | Si le domaine a été déverrouillé pour permettre le transfert |
| requested_at | string (date-time) | Date de la demande du code (bureaux d'enregistrement sans API pour ce code) |
| expected_by | string (date-time) | Date à laquelle l'équipe Domani aura le code au plus tard (statut requested) |
| hint | string | |
| next_steps | string[] |
/api/domains/{domain}/transfer-awayObtenir le statut du transfert sortant
Vérifiez l'état d'un transfert de domaine sortant. À utiliser après avoir obtenu un code d'authentification et lancé le transfert auprès du nouveau bureau d'enregistrement. Indisponible pour un domaine dont transfer_out.mode vaut manual.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| status | string | |
| gaining_registrar | string | |
| request_date | string (date-time) | |
| hint | string |
/api/domains/{domain}/transfer-statusVérifier l'état du transfert entrant
Vérifiez l'état d'un transfert de domaine entrant. Renvoie un statut détaillé avec des conseils exploitables. À utiliser après avoir lancé un transfert avec POST /api/domains/transfer.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| status | string | |
| timestamp | string | Horodatage de la dernière mise à jour du statut |
| hint | string | Conseils exploitables basés sur l’état actuel |
| continuity | object | Délégation capturée et vérification post-transfert pour des transferts sécurisés. |
/api/domains/importImporter un domaine externe
Importez un domaine que vous possédez chez un autre registraire (GoDaddy, Namecheap, Cloudflare, etc.) pour le gérer via domani.run. Gratuit, aucun transfert requis. Renvoie un enregistrement TXT pour la vérification de la propriété basée sur DNS.
Corps de la demande
| domain* | string | Domaine à importer |
Réponse 200
| domain | string | |
| status | string | |
| token | string | |
| txt_record | object | |
| hint | string |
/api/domains/import/verifyVérifier et terminer l'importation du domaine
Vérifiez l'enregistrement DNS TXT et terminez l'importation du domaine. Appelez après avoir ajouté l'enregistrement TXT renvoyé par POST /api/domains/import. Utilise Cloudflare DNS-over-HTTPS pour vérifier la propagation.
Corps de la demande
| domain* | string | Domaine à vérifier |
Réponse 201
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| registrar | string | |
| payment_method | string | |
| hint | string |
/api/domains/adoption-planPlanifier comment adopter un domaine existant
Inspection en lecture seule d'un domaine existant avant de le connecter ou de le transférer. Renvoie le bureau d'enregistrement actuel, les serveurs de noms faisant autorité, le fournisseur DNS, l'état DNSSEC, l'état du compte, le prix de transfert, les invariants de sécurité et les prochaines actions API exactes. Appelez ceci avant de demander un code EPP. La connexion laisse le registraire et le DNS inchangés. Le transfert préserve les serveurs de noms et ne migre pas le DNS.
Paramètres
| domain* | string | Domaine existant à inspecter, par ex. monsite.com |
Réponse 200
| version | integer | |
| domain | string | |
| registered | boolean | |
| account_state | string | |
| recommended_action | string | |
| current | object | |
| options | object | |
| invariants | string[] | |
| warnings | string[] |
/api/domains/transfer-checkVérifier à l'avance l'éligibilité au transfert
Vérifiez si un domaine est éligible au transfert avant de le lancer. Renvoie le prix de transfert, le statut d'éligibilité et tous les bloqueurs (TLD non pris en charge, période d'attente ICANN, domaine verrouillé). Appelez ceci avant POST /api/domains/transfer.
Paramètres
| domain* | string | Domaine à vérifier, par ex. monsite.com |
Réponse 200
| domain | string | |
| tld | string | |
| eligible | boolean | |
| price | number | null | Prix de transfert en USD (nul si TLD non pris en charge) |
| currency | string | |
| renewal_price | number | Uniquement si éligible : le coût de chaque année après le transfert, en USD, chez le bureau d'enregistrement vers lequel il part. Absent quand il est inconnu. |
| reason | string | Raison lisible par l'homme si non éligible |
| code | string | |
| eligible_at | string (date) | Date ISO à laquelle le domaine devient éligible (délai d'attente ICANN) |
| hint | string |
/api/domains/transfer-watchSurveiller un domaine pour vérifier son éligibilité au transfert
Surveillez un domaine et recevez une notification (e-mail + webhook transfer.eligible) lorsqu’il devient transférable. Utilise RDAP pour vérifier les codes d’état EPP et les périodes de verrouillage ICANN de 60 jours. S’il est déjà transférable, répond immédiatement sans créer de surveillance.
Corps de la demande
| domain* | string | Domaine à surveiller, par ex. monsite.com |
Réponse 200
| domain | string | |
| eligible | boolean | Si le domaine est actuellement éligible au transfert |
| eligible_at | string (date) | Date ISO à laquelle le domaine devient éligible (s'il n'est pas encore éligible) |
| hint | string | Des conseils pratiques |
| watching | boolean | Si une notification a été configurée |
/api/domains/transferTransférer le domaine d'un autre fournisseur
Initiez un transfert de domaine après planDomainAdoption et confirmation explicite du prix. Nécessite l’autorisation/le code EPP du fournisseur actuel. Les serveurs de noms faisant autorité existants sont préservés et vérifiés. La migration DNS n'est jamais implicite. Le transfert prend généralement 1 à 5 jours. Le paiement est facturé à l’avance par carte ou USDC.
Corps de la demande
| domain* | string | Domaine à transférer, par ex. monsite.com |
| auth_code* | string | Code d'autorisation/EPP du fournisseur actuel |
| payment_method | string(card | usdc | balance) | Mode de paiement : «card» (par défaut), «usdc» ou «balance» (crédit du marché). |
| payment_tx | string | Hachage de transaction d'un paiement USDC déjà envoyé en chaîne. |
| payment_chain | string(base | ethereum) | Chaînez le paiement USDC a été envoyé. |
| extra_subdomains | string[] | Sous-domaines supplémentaires à inclure dans l'instantané DNS de pré-transfert. Nous découvrons automatiquement les sous-domaines via les journaux CT, SPF, l'inférence MX/DKIM et une liste de mots commune - utilisez-la pour tous les sous-domaines personnalisés que nous pourrions manquer. |
| max_price | number | Plafond en USD pour le montant du transfert. Si le prix réel le dépasse, la requête échoue avec 400 PRICE_ABOVE_MAX et rien n'est débité. Sans max_price, le plafond est le prix de transfert affiché : quand seul un bureau d'enregistrement plus cher peut le prendre, le transfert échoue de la même façon. Le `price` de l'erreur est le total à accepter ; confirmez-le avec l'utilisateur avant de réessayer avec ce max_price. |
Réponse 202
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string | |
| auto_renew | boolean | |
| hint | string | |
| dns_snapshot | object | Résumé de la sauvegarde de récupération capturé avant le transfert. Il n'est appliqué que si une opération de récupération explicite est nécessaire. |
| nameservers_preserved | boolean | |
| dns_migration | string | |
| continuity | object |
Exemple
curl -X POST https://domani.run/api/domains/transfer \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain": "mysite.com", "auth_code": "EPP-AUTH-CODE"}'/api/domains/{domain}/renewRenouveler un domaine
Renouvelez un domaine que vous possédez pour des années supplémentaires (1 à 10). Le paiement est facturé d’avance. La nouvelle date d'expiration est renvoyée dans la réponse. Quand le bureau d'enregistrement du domaine refuse le renouvellement (renouvelé dans les 30 derniers jours, ou une durée qu'il ne vend pas), la demande échoue avec 400 RENEWAL_NOT_ELIGIBLE avant tout débit. Le prix est renewal_price de GET /api/domains/{domain} multiplié par years : envoyez ce total comme max_price pour qu'un changement de prix échoue avant tout débit.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| years | integer | Nombre d'années à renouveler (par défaut 1) |
| payment_method | string(card | usdc | balance) | Mode de paiement : «card» (par défaut), «usdc» ou «balance» (crédit du marché). |
| payment_tx | string | Hachage de transaction d'un paiement USDC déjà envoyé en chaîne. |
| payment_chain | string(base | ethereum) | Chaînez le paiement USDC a été envoyé. |
| max_price | number | Plafond en USD pour les frais de renouvellement. Si le prix réel le dépasse, la demande échoue avec 400 PRICE_ABOVE_MAX et rien n'est facturé. Le champ `price` de l'erreur est le total à accepter ; confirmez-le avec l'utilisateur avant de réessayer avec ce max_price. |
Réponse 200
| domain | string | |
| renewed_years | integer | |
| new_expiry | string (date-time) | |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string |
Exemple
curl -X POST https://domani.run/api/domains/mysite.com/renew \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"years": 1}'/api/domains/{domain}/buy-aftermarketAcheter un domaine secondaire
Achetez via Domani, à son prix d’achat immédiat, un domaine déjà enregistré et mis en vente sur un marché secondaire (Afternic / Sedo). Le prix de l’annonce est revérifié en temps réel avant le débit ; utilisez max_price pour plafonner votre paiement. Les annonces ouvertes uniquement aux offres ne peuvent pas être achetées ici : utilisez le courtier (POST /api/broker) pour négocier. Le paiement fonctionne comme pour un enregistrement : carte, USDC sur Base (x402) ou solde de la Marketplace. Nécessite la portée domains:transfer. En cas de succès, le domaine rejoint votre compte (status: active, ou provisioning pendant la finalisation d’un transfert par étapes).
Paramètres
| domain* | string | Le domaine du marché secondaire à acheter |
Corps de la demande
| max_price | number | Plafond de prix ferme en USD. La valeur par défaut est le prix d'achat immédiat de l'annonce ; l'achat est rejeté si le prix en direct dépasse ce montant. |
| payment_method | string(card | usdc | balance) | Mode de paiement : «card» (par défaut), «usdc» ou «balance» (crédit du marché). |
| payment_tx | string | Hachage de transaction d'un paiement USDC déjà envoyé en chaîne. |
| payment_chain | string(base | ethereum) | Chaînez le paiement USDC a été envoyé. |
Réponse 201
| domain | string | |
| status | string | 'active' lorsque l’achat est terminé, ou 'provisioning' pendant la finalisation d’un transfert par étapes. |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string | |
| marketplace | string | Marché secondaire sur lequel le domaine a été acheté (par exemple « Afternic », « Sedo »). |
| hint | string | |
| next_steps | string[] |
Exemple
curl -X POST https://domani.run/api/domains/coolname.com/buy-aftermarket \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{}'DNS
/api/domains/{domain}/dnsObtenez des enregistrements DNS pour un domaine que vous possédez
Renvoie tous les enregistrements DNS configurés pour un domaine que vous possédez (A, AAAA, CNAME, MX, TXT, NS, ...), chacun avec un id stable, plus un jeton zone_version (également envoyé comme en-tête ETag). Remettez zone_version sur PUT pour détecter les changements de zone simultanés.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| records | DnsRecord[] | |
| zone_version | string | Jeton de concurrence optimiste pour toute la zone. Renvoyez-le sur PUT (body zone_version ou en-tête If-Match) pour échouer avec 409 DNS_VERSION_CONFLICT au lieu d'entraver une modification simultanée. |
Exemple de réponse
{
"domain": "mysite.com",
"records": [
{
"id": "rec_1a2b3c4d5e6f",
"type": "A",
"name": "@",
"value": "76.76.21.21",
"ttl": 3600
},
{
"id": "rec_2b3c4d5e6f7a",
"type": "CNAME",
"name": "www",
"value": "mysite.com",
"ttl": 3600
},
{
"id": "rec_3c4d5e6f7a8b",
"type": "MX",
"name": "@",
"value": "mail.example.com",
"ttl": 3600,
"priority": 10
}
],
"zone_version": "zv_9f8e7d6c5b4a3f2e"
}Exemple
curl https://domani.run/api/domains/mysite.com/dns \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dnsDéfinir des enregistrements DNS pour un domaine que vous possédez
Upsert les enregistrements DNS au niveau rrset : pour chaque (type, nom) présent dans la charge utile, les enregistrements existants à ce (type, nom) sont remplacés par ceux que vous envoyez ; Les rrsets NON mentionnés dans la charge utile sont préservés et les enregistrements NS ne sont jamais touchés. Une sauvegarde automatique côté serveur de la zone est effectuée avant chaque écriture. Concurrence : transmettez la zone_version d'un GET précédent (champ corps ou en-tête If-Match). Si la zone a changé depuis, l'écriture échoue avec 409 DNS_VERSION_CONFLICT et renvoie les enregistrements actuels + la version afin que vous puissiez fusionner à nouveau et réessayer. Routage du courrier : un changement de la destination du courrier du domaine (ses enregistrements MX ou NS, les enregistrements d'adresse par lesquels se résout un hôte MX situé dans la zone, ou ceux d'un hôte qui reçoit du courrier Domani et ne publie aucun MX) nécessite la portée email:auth_secrets, car qui reçoit le courrier reçoit ses codes de connexion. Sans elle, la requête répond 403 INSUFFICIENT_SCOPE avant tout changement, et un jeton confiné à des boîtes aux lettres répond 403 MAILBOX_CONFINED même avec elle. Les autres enregistrements ne demandent que domains:write. Chaque changement de routage est consigné dans le journal d'audit.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| records* | DnsRecord[] | |
| zone_version | string | La zone_version d’un GET précédent. En cas de non-concordance, l'écriture est rejetée avec 409 DNS_VERSION_CONFLICT (rien d'écrit). Recommandé chaque fois qu'un autre acteur peut modifier la même zone. |
Réponse 200
| success | boolean | |
| domain | string | |
| records | DnsRecord[] |
Exemple de réponse
{
"success": true,
"domain": "mysite.com",
"records": [
{
"type": "A",
"name": "@",
"value": "76.76.21.21",
"ttl": 3600
},
{
"type": "CNAME",
"name": "www",
"value": "cname.vercel-dns.com",
"ttl": 3600
}
]
}Exemple
curl -X PUT https://domani.run/api/domains/mysite.com/dns \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"records": [
{"type": "A", "name": "@", "value": "76.76.21.21", "ttl": 3600},
{"type": "CNAME", "name": "www", "value": "cname.vercel-dns.com", "ttl": 3600}
]}'/api/domains/{domain}/dnssecRépertoriez les enregistrements DNSSEC DS pour un domaine que vous possédez
Renvoie les enregistrements de signataire de délégation DNSSEC (DS) publiés dans le registre pour un domaine que vous possédez et indique si DNSSEC est activé. S'associe aux enregistrements TLSA (définis via le point de terminaison DNS) pour DANE.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| enabled | boolean | Vrai lorsqu'au moins un enregistrement DS est publié |
| records | DsRecord[] |
Exemple de réponse
{
"domain": "mysite.com",
"enabled": true,
"records": [
{
"keyTag": "12345",
"algorithm": "13",
"digestType": "2",
"digest": "A1B2C3..."
}
]
}Exemple
curl https://domani.run/api/domains/mysite.com/dnssec \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dnssecPublier un enregistrement DNSSEC DS (activer DNSSEC)
Publie un enregistrement de signataire de délégation (DS) dans le registre, activant DNSSEC pour le domaine. Obtenez les valeurs DS auprès de votre fournisseur DNS/zone après avoir signé la zone.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| success | boolean | |
| domain | string | |
| enabled | boolean | |
| records | DsRecord[] |
Exemple
curl -X POST https://domani.run/api/domains/mysite.com/dnssec \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"keyTag": "12345", "algorithm": "13", "digestType": "2", "digest": "A1B2C3..."}'/api/domains/{domain}/dnssecSupprimer un enregistrement DNSSEC DS (désactiver DNSSEC)
Supprime un enregistrement de signataire de délégation (DS) du registre par sa balise de clé. La suppression de tous les enregistrements DS désactive DNSSEC pour le domaine.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
| keyTag* | string | Balise clé de l'enregistrement DS à supprimer |
Réponse 200
| success | boolean | |
| domain | string | |
| enabled | boolean | |
| records | DsRecord[] |
Exemple
curl -X DELETE "https://domani.run/api/domains/mysite.com/dnssec?keyTag=12345" \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dns/snapshotCapturer un instantané DNS
Capture tous les enregistrements DNS d'un domaine via des recherches DNS publiques (Cloudflare DoH). Détecte les sous-domaines à partir des journaux de transparence des certificats, des enregistrements SPF et des noms communs. L'instantané est également stocké côté serveur en tant que sauvegarde.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| extra_subdomains | string[] | Sous-domaines supplémentaires à inclure dans l'instantané |
Réponse 200
| domain | string | |
| records | DnsRecord[] | |
| subdomains | string[] | |
| sources | string[] | |
| capturedAt | string (date-time) |
Exemple de réponse
{
"domain": "mysite.com",
"records": [
{
"type": "A",
"name": "@",
"value": "76.76.21.21",
"ttl": 3600
},
{
"type": "CNAME",
"name": "www",
"value": "mysite.com",
"ttl": 3600
},
{
"type": "MX",
"name": "@",
"value": "aspmx.l.google.com",
"ttl": 3600,
"priority": 1
}
],
"subdomains": [
"www",
"mail",
"api"
],
"sources": [
"ct",
"wordlist"
],
"capturedAt": "2026-03-06T12:00:00.000Z"
}Exemple
curl -X POST https://domani.run/api/domains/mysite.com/dns/snapshot \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dns/restoreRestaurer le DNS à partir d'un instantané
Applique les enregistrements DNS d'un instantané au registraire actuel du domaine. Utilise un algorithme de comparaison pour éviter la duplication d'enregistrements déjà existants. Si aucun instantané n'est fourni dans le corps, restauration à partir de la sauvegarde côté serveur (créée par instantané ou transfert). Routage du courrier : un changement de la destination du courrier du domaine (ses enregistrements MX ou NS, les enregistrements d'adresse par lesquels se résout un hôte MX situé dans la zone, ou ceux d'un hôte qui reçoit du courrier Domani et ne publie aucun MX) nécessite la portée email:auth_secrets, car qui reçoit le courrier reçoit ses codes de connexion. Sans elle, la requête répond 403 INSUFFICIENT_SCOPE avant tout changement, et un jeton confiné à des boîtes aux lettres répond 403 MAILBOX_CONFINED même avec elle. Les autres enregistrements ne demandent que domains:write. Chaque changement de routage est consigné dans le journal d'audit.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| snapshot | object | Un objet instantané DNS (tel que renvoyé par le point de terminaison de l'instantané). En cas d'omission, la sauvegarde stockée côté serveur est utilisée. |
| dry_run | boolean | Aperçu uniquement : renvoie ce que la restauration créerait (would_apply) et ignorerait, sans rien écrire. |
Réponse 200
| domain | string | |
| applied | integer | Nombre d'enregistrements créés |
| skipped | integer | Nombre d'enregistrements déjà présents |
| recordCount | integer | Nombre total d'enregistrements dans l'instantané |
| errors | string[] | |
| dry_run | boolean | C'est vrai quand il s'agissait d'un aperçu - rien n'était écrit |
| would_apply | DnsRecord[] | Essai à sec uniquement : les enregistrements que la restauration créerait |
Exemple de réponse
{
"domain": "mysite.com",
"applied": 5,
"skipped": 2,
"recordCount": 7,
"errors": []
}Exemple
curl -X POST https://domani.run/api/domains/mysite.com/dns/restore \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dns/cloneCloner le DNS d'un autre domaine sur celui-ci
Copie la configuration DNS d'un domaine source que vous possédez sur ce domaine - utile pour les marques multi-TLD (brand.com → brand.dev) qui partagent le même A/CNAME/MX. Fusionne par défaut (les enregistrements source gagnent en cas de collision type+nom, les autres enregistrements de ce domaine sont conservés) ; définissez replace: true pour un miroir exact. Routage du courrier : un changement de la destination du courrier du domaine (ses enregistrements MX ou NS, les enregistrements d'adresse par lesquels se résout un hôte MX situé dans la zone, ou ceux d'un hôte qui reçoit du courrier Domani et ne publie aucun MX) nécessite la portée email:auth_secrets, car qui reçoit le courrier reçoit ses codes de connexion. Sans elle, la requête répond 403 INSUFFICIENT_SCOPE avant tout changement, et un jeton confiné à des boîtes aux lettres répond 403 MAILBOX_CONFINED même avec elle. Les autres enregistrements ne demandent que domains:write. Chaque changement de routage est consigné dans le journal d'audit.
Paramètres
| domain* | string | Domaine cible (le DNS est écrit ici) |
Corps de la demande
| from* | string | Domaine source à partir duquel copier le DNS (doit être le vôtre) |
| replace | boolean | Miroir exact : supprimez les enregistrements cibles que la source n'a pas. Par défaut : fusionner |
Réponse 200
| success | boolean | |
| from_domain | string | |
| to_domain | string | |
| records | DnsRecord[] |
Exemple
curl -X POST https://domani.run/api/domains/brand.dev/dns/clone \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"from": "brand.com"}'/api/domains/{domain}/nameserversObtenir des serveurs de noms pour un domaine
Renvoie les serveurs de noms faisant autorité configurés pour un domaine que vous possédez. S'il est vide, les opérations DNS (parking, e-mail, connexion) échoueront jusqu'à ce que les serveurs de noms soient attribués.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| nameservers | string[] | |
| default_nameservers | string[] | Les serveurs de noms depuis lesquels la zone du domaine est servie : l'hébergeur de zone quand Domani y héberge la zone, sinon ceux par défaut du registraire (null si inconnus) |
| dns_provider | string | Qui répond pour la zone du domaine : le DNS propre du registraire, une zone que Domani héberge sur Cloudflare, ou un fournisseur externe pour un domaine importé |
| hint | string |
Exemple de réponse
{
"domain": "mysite.com",
"nameservers": [
"ns1.systemdns.com",
"ns2.systemdns.com",
"ns3.systemdns.com"
],
"default_nameservers": [
"ns1.systemdns.com",
"ns2.systemdns.com",
"ns3.systemdns.com"
],
"dns_provider": "registrar",
"hint": "3 nameservers configured for mysite.com."
}Exemple
curl https://domani.run/api/domains/mysite.com/nameservers \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/nameserversDéfinir des serveurs de noms pour un domaine
Remplacez les serveurs de noms d'un domaine que vous possédez. Nécessite 2 à 13 noms d'hôtes valides. Valeurs communes : OpenSRS DNS (ns1.systemdns.com, ns2.systemdns.com, ns3.systemdns.com). Les serveurs de noms décident où va tout le courrier du domaine, codes de connexion compris : les changer nécessite la portée email:auth_secrets et un jeton non confiné à des boîtes aux lettres (403 INSUFFICIENT_SCOPE ou 403 MAILBOX_CONFINED sinon), et chaque changement est consigné dans le journal d'audit.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| nameservers* | string[] | Noms d'hôte du serveur de noms (2 à 13 requis) |
Réponse 200
| success | boolean | |
| domain | string | |
| nameservers | string[] | |
| hint | string |
Exemple de réponse
{
"success": true,
"domain": "mysite.com",
"nameservers": [
"ns1.systemdns.com",
"ns2.systemdns.com",
"ns3.systemdns.com"
],
"hint": "Nameservers for mysite.com updated to ns1.systemdns.com, ns2.systemdns.com, ns3.systemdns.com. Changes may take up to 48 hours to propagate."
}Exemple
curl -X PUT https://domani.run/api/domains/mysite.com/nameservers \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"nameservers": ["ns1.systemdns.com", "ns2.systemdns.com", "ns3.systemdns.com"]}'Se connecter
/api/domains/{domain}/connectConnecter un domaine à un fournisseur d'hébergement ou de messagerie
Connecte un domaine à un fournisseur d'hébergement ou de messagerie en détectant automatiquement le fournisseur à partir d'une URL cible ou en acceptant un nom de fournisseur explicite. Pour les domaines gérés via la plateforme, les enregistrements DNS sont définis automatiquement (statut : dns_set). Pour les domaines importés (registraire externe), renvoie les enregistrements sous forme d'instructions à ajouter manuellement auprès de votre registraire (statut : manual_setup_required, les enregistrements ont le statut pending). Fournisseurs d'hébergement pris en charge : vercel, netlify, cloudflare-pages, github-pages, railway, fly. Fournisseurs de messagerie pris en charge : google-workspace, fastmail, proton. Utilisez GET /api/domains/{domain}/connect pour répertorier tous les fournisseurs et méthodes disponibles. Routage du courrier : un changement de la destination du courrier du domaine (ses enregistrements MX ou NS, les enregistrements d'adresse par lesquels se résout un hôte MX situé dans la zone, ou ceux d'un hôte qui reçoit du courrier Domani et ne publie aucun MX) nécessite la portée email:auth_secrets, car qui reçoit le courrier reçoit ses codes de connexion. Sans elle, la requête répond 403 INSUFFICIENT_SCOPE avant tout changement, et un jeton confiné à des boîtes aux lettres répond 403 MAILBOX_CONFINED même avec elle. Les autres enregistrements ne demandent que domains:write. Chaque changement de routage est consigné dans le journal d'audit.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| target | string | URL cible pour la détection automatique (par exemple my-app.vercel.app) |
| provider | string | Nom explicite du fournisseur (par exemple, vercel, google-workspace) |
| method | string | Méthode de connexion si le fournisseur en a plusieurs (par exemple, cname uniquement) |
| dry_run | boolean | Aperçu uniquement : renvoie le diff (create/replace/already_set/keep) sans rien écrire. |
| confirm_replace_mx | boolean | Obligatoire lorsque la connexion remplace les enregistrements MX existants pointant vers un autre fournisseur (409 MX_REPLACEMENT_REQUIRES_CONFIRMATION sinon) - elle redirige l'e-mail du domaine. |
Réponse 200
| domain | string | |
| provider | string | |
| category | string | |
| method | string | |
| records | DnsRecord[] | |
| docs | string (uri) | |
| status | string | dns_set = enregistrements écrits automatiquement. manual_setup_required = domaine importé, ajoutez des enregistrements chez votre registraire. dry_run = aperçu uniquement, rien d'écrit. |
| hint | string | |
| next_steps | string[] | Actions spécifiques au fournisseur à effectuer une fois les enregistrements DNS définis |
| diff | object | Simulation uniquement : ce que ferait l’écriture - create, replace (enregistrements existants qui seraient supprimés), already_set et keep (rrsets intacts). |
Exemple
curl -X POST https://domani.run/api/domains/mysite.com/connect \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"target": "my-app.vercel.app"}'/api/domains/{domain}/connectListe des fournisseurs disponibles pour connecter un domaine
Renvoie tous les fournisseurs d’hébergement et de messagerie pris en charge avec leurs méthodes de connexion. Utilisez-le pour découvrir quels fournisseurs sont disponibles avant d'appeler POST.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| providers | object |
/api/domains/{domain}/verifyVérifiez qu'une connexion fournisseur fonctionne
Exécute la vérification de vérification du fournisseur pour confirmer que les enregistrements DNS se sont propagés et que la connexion est active. À utiliser après le POST /api/domains/{domain}/connect pour vérifier.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| target | string | Cible pour la détection automatique |
| provider | string | Nom du fournisseur |
| method | string | Nom de la méthode |
Réponse 200
| domain | string | |
| provider | string | |
| method | string | |
| verified | boolean | |
| message | string | |
| hint | string | |
| next_steps | string[] | Étapes de dépannage spécifiques au fournisseur (uniquement lorsque la vérification est fausse) |
Exemple
curl -X POST https://domani.run/api/domains/mysite.com/verify \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"target": "my-app.vercel.app"}'Statut
/api/domains/{domain}/statusVérifier la santé du domaine : DNS, SSL, e-mail, expiration
Vérifie la santé d'un domaine via DNS-over-HTTPS : enregistrements A/AAAA/CNAME/MX/TXT/NS, statut du certificat SSL, configuration de la messagerie et date d'expiration. Prend en charge le streaming SSE via Accept: text/event-stream - la fermeture de la connexion annule les vérifications DNS/SSL en vol côté serveur. Utilisez-le après la connexion pour vérifier la propagation DNS.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| days_until_expiry | integer | |
| dns | object | |
| ssl | object | |
| object |
Exemple de réponse
{
"domain": "mysite.com",
"status": "active",
"expires": "2027-02-18T00:00:00.000Z",
"days_until_expiry": 365,
"dns": {
"propagated": true,
"a": [
"76.76.21.21"
],
"aaaa": [],
"cname": [],
"mx": [],
"txt": [],
"ns": [
"ns1.porkbun.com",
"ns2.porkbun.com"
],
"registrar_records": [
{
"type": "A",
"name": "@",
"value": "76.76.21.21",
"ttl": 3600
}
]
},
"ssl": {
"active": true
},
"email": {
"configured": false,
"mx": []
}
}Exemple
curl https://domani.run/api/domains/mysite.com/status \ -H "Authorization: Bearer domani_sk_xxx"
Vérifier le service
/api/domains/{domain}/verify-serviceAjoutez des enregistrements DNS pour vérifier la propriété du domaine pour un service tiers
Ajoute les enregistrements DNS corrects (TXT, CNAME) pour prouver la propriété du domaine à un service tiers. Prend en charge Stripe, Google Search Console, AWS SES, Postmark, Resend, Facebook, HubSpot et Microsoft 365. Les noms de services inconnus renvoient à un enregistrement TXT générique. Les enregistrements sont fusionnés avec le DNS existant - les enregistrements existants sont préservés. Routage du courrier : un changement de la destination du courrier du domaine (ses enregistrements MX ou NS, les enregistrements d'adresse par lesquels se résout un hôte MX situé dans la zone, ou ceux d'un hôte qui reçoit du courrier Domani et ne publie aucun MX) nécessite la portée email:auth_secrets, car qui reçoit le courrier reçoit ses codes de connexion. Sans elle, la requête répond 403 INSUFFICIENT_SCOPE avant tout changement, et un jeton confiné à des boîtes aux lettres répond 403 MAILBOX_CONFINED même avec elle. Les autres enregistrements ne demandent que domains:write. Chaque changement de routage est consigné dans le journal d'audit.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Corps de la demande
| service* | string | Nom du service (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365) |
| token* | string | Jeton de vérification fourni par le service |
Réponse 200
| domain | string | |
| service | string | |
| service_display_name | string | |
| known_service | boolean | |
| records_added | DnsRecord[] | |
| total_records | integer | |
| docs | string (uri) | null | |
| hint | string |
Exemple de réponse
{
"domain": "mysite.com",
"service": "stripe",
"service_display_name": "Stripe",
"known_service": true,
"records_added": [
{
"type": "TXT",
"name": "@",
"value": "stripe-verification=abc123def456",
"ttl": 3600
}
],
"total_records": 3,
"docs": "https://docs.stripe.com/identity/verification-checks/selfie#domain-verification",
"hint": "Stripe verification records added. Return to Stripe to complete verification."
}Exemple
curl -X POST https://domani.run/api/domains/mysite.com/verify-service \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"service": "stripe", "token": "abc123def456"}'/api/domains/{domain}/verify-serviceRépertorier les services pris en charge pour la vérification du domaine
Renvoie tous les services connus avec leurs noms, descriptions et URL de documentation. Les services inconnus reviennent à un enregistrement TXT générique.
Paramètres
| domain* | string | Nom de domaine que vous possédez |
Réponse 200
| domain | string | |
| services | object[] | |
| hint | string |
Découverte
/api/domains/{domain}/profilePubliqueObtenez un profil du domaine public
Renvoie le dernier dossier public sécurisé et fondé sur des preuves pour un domaine. Ce point de terminaison ne renvoie jamais d’observations masquées ni de coordonnées brutes d’enregistrement.
Paramètres
| domain* | string |
Réponse 200
| profile | PublicDomainProfile |
/api/domains/{domain}/profilePubliqueRechercher ou actualiser un profil du domaine public
Exécute une analyse limitée à l'aide de sources de registre public, DNS, de site en direct, de données structurées et d'archives, puis stocke le profil sécurisé pour la confidentialité de la page publique canonique. La profondeur instantanée est utilisée pour un premier rendu rapide ; deep est la valeur par défaut et ajoute une recherche historique.
Paramètres
| domain* | string | |
| depth | string(instant | deep) | Profondeur de la recherche. La valeur par défaut est profonde. |
Réponse 201
| profile | PublicDomainProfile |
/api/domains/whoisPubliqueRechercher les données d'enregistrement de domaine via RDAP
Interroge le réseau RDAP (Registration Data Access Protocol) pour les données d'enregistrement de domaine. Renvoie le bureau d'enregistrement, les dates de création/expiration/mise à jour, les jours jusqu'à l'expiration, les codes d'état, les serveurs de noms, le statut DNSSEC et les informations de contact (titulaire, contact administratif, contact technique, contact de facturation et contact anti-abus). Fonctionne pour n'importe quel domaine - aucune propriété requise. RDAP est le remplacement moderne et natif JSON du WHOIS. Revient au WHOIS (port 43) pour les TLD sans RDAP et complète le RDAP avec des données de référence WHOIS lorsque des contacts sont manquants (commun après le RGPD). Les informations de contact peuvent être partiellement ou entièrement masquées en raison du RGPD ou des services de protection de la vie privée. Point de terminaison public - aucune authentification requise. Les requêtes authentifiées bénéficient de limites de débit plus élevées (30/min contre 10/min).
Paramètres
| q* | string | Domaine à rechercher (par exemple, example.com) |
Réponse 200
| domain | string | |
| registered | boolean | Si le domaine est actuellement enregistré |
| registrar | string | null | Nom actuel du registraire |
| registrar_url | string | null | URL du site Web du registraire |
| registrar_iana_id | string | null | ID IANA du bureau d’enregistrement (à partir des publicIds RDAP) |
| created | string | null | Date d’inscription (YYYY-MM-DD) |
| expires | string | null | Date d’expiration (YYYY-MM-DD) |
| updated | string | null | Date de dernière mise à jour (YYYY-MM-DD) |
| days_until_expiry | integer | null | Jours jusqu'à expiration (nul si non enregistré) |
| status | string[] | Codes de statut EPP |
| nameservers | string[] | Serveurs de noms faisant autorité |
| dnssec | boolean | Si DNSSEC est activé |
| redacted | boolean | Si les données WHOIS/RDAP sont masquées pour des raisons de confidentialité (RGPD) |
| contacts | object | Coordonnées par rôle (nulles lorsqu'aucune donnée n'est disponible, les champs peuvent être nuls lorsqu'ils sont masqués) |
Exemple
curl "https://domani.run/api/domains/whois?q=google.com"
/api/domains/{domain}/ogPubliqueObtenir les métadonnées d'aperçu du site Web pour un domaine
Renvoie les métadonnées Open Graph (titre, description, image, favicon) pour un domaine. Les données sont récupérées à la demande et mises en cache pendant 7 jours. La première demande de domaine peut prendre 1 à 5 s (récupération en direct) ; les requêtes ultérieures sont instantanées (accès au cache). Renvoie des champs nuls si le site est inaccessible ou n'a pas de balises OG. Point de terminaison public - aucune authentification requise.
Paramètres
| domain* | string | Domaine pour lequel récupérer les métadonnées (par exemple, google.com) |
Réponse 200
| title | string | null | Titre de la page (og:title > twitter:title > <titre>) |
| description | string | null | Description de la page (og:description > méta description) |
| image | string | null | URL de l'image OG (absolue) |
| favicon | string | null | URL du favicon (absolu) |
Exemple
curl "https://domani.run/api/domains/google.com/og"
Facturation
/api/billing/setupObtenir une URL pour ajouter un mode de paiement
Renvoie toujours à la fois une url Stripe Checkout et un client_secret SetupIntent pour ajouter une carte de crédit. Un agent qui ne peut pas exécuter Stripe.js doit ouvrir url dans un navigateur et dire à l'utilisateur d'y ajouter sa carte ; un frontend intégrant Stripe Elements directement (comme le tableau de bord Domani) utilise client_secret à la place. Ceci est requis avant d'acheter des domaines par carte. Une fois le paiement terminé, l'utilisateur est redirigé vers le tableau de bord.
Corps de la demande
| mode | string(setup_intent | checkout) | Obsolète : `url` et `client_secret` sont toujours renvoyés quelle que soit cette valeur. Conservé pour la compatibilité ascendante. |
Réponse 200
| url | string (uri) | URL Stripe Checkout - ouvrez-la dans un navigateur pour ajouter une carte |
| client_secret | string | Secret client Stripe SetupIntent, pour un frontend utilisant Stripe.js directement |
| hint | string | Conseils pour les prochaines étapes |
Exemple de réponse
{
"url": "https://checkout.domani.run/session/cs_abc123...",
"client_secret": "seti_abc123_secret_xyz",
"hint": "Open `url` in a browser to add your payment card."
}Exemple
curl -X POST https://domani.run/api/billing/setup \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/cardSupprimer le mode de paiement enregistré
Détache la carte de crédit enregistrée de l'utilisateur de son compte. Après la suppression, une nouvelle carte doit être ajoutée avant d'acheter des domaines.
Réponse 200
| removed | boolean |
Exemple de réponse
{
"removed": true
}Exemple
curl -X DELETE https://domani.run/api/billing/card \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/connectObtenez le statut de paiement du marché
Renvoie le statut d'intégration de Stripe Connect du vendeur et le solde disponible sur le marché. payouts_enabled est vrai une fois l'intégration terminée et le vendeur peut recevoir des paiements bancaires.
Réponse 200
| onboarded | boolean | Le vendeur a soumis les détails d'intégration de Connect |
| payouts_enabled | boolean | Les paiements bancaires sont actifs |
| details_submitted | boolean | |
| balance_cents | integer | Solde disponible sur le marché en cents |
Exemple de réponse
{
"onboarded": true,
"payouts_enabled": true,
"details_submitted": true,
"balance_cents": 45000
}Exemple
curl https://domani.run/api/billing/connect \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/connectCommencer l'intégration des paiements bancaires
Crée (ou reprend) l'intégration de Stripe Connect Express pour un vendeur de place de marché et renvoie une URL d'intégration hébergée vers laquelle rediriger l'utilisateur. Obligatoire avant qu’un vendeur puisse retirer ses gains vers sa banque.
Réponse 200
| url | string (uri) | URL d'intégration hébergée par Stripe |
Exemple de réponse
{
"url": "https://connect.stripe.com/setup/e/acct_123/..."
}Exemple
curl -X POST https://domani.run/api/billing/connect \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/connect/payoutRetirer le solde du marché vers la banque
Transfère l’intégralité du solde disponible sur le marché du vendeur vers son compte bancaire connecté. Nécessite une intégration complète du paiement (POST /api/billing/connect). Le solde est réservé avant le transfert et restauré en cas d'échec, de sorte qu'un échec ne fait jamais perdre de fonds.
Réponse 200
| amount_cents | integer | Montant transféré en centimes |
| transfer_id | string | Identifiant de transfert Stripe |
Exemple de réponse
{
"amount_cents": 45000,
"transfer_id": "tr_123"
}Exemple
curl -X POST https://domani.run/api/billing/connect/payout \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/invoicesListe des factures de paiement
Renvoie une liste des factures payées avec le numéro de facture, le montant, la date et des liens pour afficher ou télécharger le PDF. Les factures sont générées automatiquement pour chaque achat, renouvellement et transfert de domaine.
Paramètres
| limit | integer | Max factures à retourner |
Réponse 200
| invoices | object[] | |
| has_more | boolean | |
| hint | string |
Exemple
curl https://domani.run/api/billing/invoices \ -H "Authorization: Bearer domani_sk_xxx"
Références
/api/referralsObtenez les revenus et l'historique des parrainages
Renvoie votre code de parrainage unique, votre taux de commission (20 %), la répartition des revenus (total, payé, en attente) et un historique de tous les achats référés. Partagez votre code de parrainage avec d'autres personnes - lorsqu'ils s'inscrivent avec votre code (via le paramètre ref), vous gagnez automatiquement une commission sur tous leurs futurs achats de domaine.
Réponse 200
| referral_code | string | Votre code de parrainage unique à partager |
| referral_rate | integer | Pourcentage de commission (actuellement 20%) |
| total_earned_cents | integer | Gains totaux en centimes |
| total_paid_cents | integer | Total payé en centimes |
| total_pending_cents | integer | Paiement en attente en centimes |
| referrals | object[] |
Exemple de réponse
{
"referral_code": "x7k9m2",
"referral_rate": 20,
"total_earned_cents": 400,
"total_paid_cents": 200,
"total_pending_cents": 200,
"referrals": [
{
"id": "cm5ref001",
"domains": [
"friend-site.com"
],
"earned_cents": 200,
"paid_out": true,
"created_at": "2025-01-20T10:00:00.000Z"
},
{
"id": "cm5ref002",
"domains": [
"another.dev"
],
"earned_cents": 200,
"paid_out": false,
"created_at": "2025-02-10T15:30:00.000Z"
}
]
}Exemple
curl https://domani.run/api/referrals \ -H "Authorization: Bearer domani_sk_xxx"
Précommandes
/api/backordersPasser une précommande sur un domaine déjà enregistré
Surveille un domaine actuellement enregistré par un tiers et tente automatiquement de l’enregistrer pour vous lorsqu’il devient disponible. La disponibilité est vérifiée toutes les quelques minutes afin d’agir rapidement après sa libération. Vous êtes débité uniquement si l’enregistrement réussit, sans frais initiaux. Un plafond vous protège contre une hausse du prix d’enregistrement avant la libération. Nécessite un moyen de paiement enregistré (carte) ou payment_method: "balance" pour régler l’enregistrement en cas de réussite. Sans garantie de succès : un service spécialisé peut obtenir un domaine disputé en premier.
Corps de la demande
| domain* | string | Domaine actuellement enregistré à surveiller et à tenter d’enregistrer lors de sa libération. |
| max_price | number | Montant maximal en USD que vous paierez pour l’enregistrer. Par défaut, le prix d’enregistrement actuel. Doit être >= au prix actuel. |
| payment_method | string(card | balance) | Mode de paiement à utiliser si l’enregistrement réussit. Par défaut, votre moyen préféré. |
Réponse 201
| backorder | Backorder | |
| hint | string |
Exemple
curl -X POST https://domani.run/api/backorders \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain": "taken.com"}'/api/backordersListez vos précommandes
Renvoie vos backorders, du plus récent au plus ancien. Filtrez par status (watching, caught, failed, cancelled, expired).
Paramètres
| status | string(watching | caught | failed | cancelled | expired) | Filtrer par statut. |
Réponse 200
| backorders | Backorder[] |
/api/backorders/{id}Obtenez une précommande
Paramètres
| id* | string | ID de précommande. |
Réponse 200
| backorder | Backorder |
/api/backorders/{id}Annuler une précommande
Arrête de surveiller un domaine. Seules les précommandes en état de watching peuvent être annulées.
Paramètres
| id* | string | ID de précommande. |
Réponse 200
| id | string | |
| status | string | |
| hint | string |
Marché
/api/domains/sellMettre en vente un domaine (marché ouvert)
publiez tous les domaines à vendre sur le marché Domani, y compris les domaines d'autres bureaux d'enregistrement. Les domaines déjà présents dans votre compte Domani sont automatiquement vérifiés et publiés immédiatement (statut active). Les domaines externes nécessitent une vérification de la propriété TXT (statut pending_verification). Frais : Commission de plateforme de 10 % sur les ventes réussies. Nécessite la portée deals:write.
Corps de la demande
| domain* | string | Nom de domaine à mettre en vente |
| price* | number | Prix de vente en USD |
| description | string | Description de l'annonce facultative |
Réponse 201
| listing | object | |
| txt_record | object | null | Enregistrement TXT à ajouter pour la vérification de la propriété (uniquement pour les domaines externes) |
| hint | string |
/api/domains/sell/verifyVérifier la propriété TXT pour la annonce externe
Vérifiez que l'enregistrement de propriété TXT a été ajouté pour une annonce de domaine externe. En cas de succès, le statut de l'annonce passe de pending_verification à active et devient achetable. Nécessite la portée deals:write.
Corps de la demande
| domain* | string | Nom de domaine à vérifier |
Réponse 200
| listing | object | |
| hint | string |
/api/domains/sell/statusVérifier la annonce et l'état de la transaction
Vérifiez l'état d'une annonce de domaines et de toute transactions active. Renvoie les détails de la annonce, l'état du pipeline de transactions et des conseils contextuels. Nécessite la portée deals:read.
Paramètres
| domain* | string | Nom de domaine à vérifier |
Réponse 200
| listing | object | null | |
| deal | object | null | |
| hint | string |
/api/dealsListez vos transactions
Répertoriez les transactions du marché dont vous êtes l’acheteur ou le vendeur. Filtrer par rôle ou statut. Nécessite la portée deals:read.
Paramètres
| role | string(buyer | seller) | Filtrer par rôle |
| status | string(active | escrow_held | epp_pending | transfer_started | completed | refunded | expired) | Filtrer par statut («active» = tous les non-terminaux) |
| domain | string | Filtrer par nom de domaine |
| limit | integer | Nombre d'transactions à renvoyer (50 par défaut, 100 maximum) |
| cursor | string | Curseur de pagination d'une réponse précédente |
Réponse 200
| deals | object[] | |
| has_more | boolean | Si d'autres résultats sont disponibles |
| next_cursor | string | null | Curseur pour la page suivante |
/api/dealsAcheter un domaine externe (créer une transactions)
Créez une transaction de séquestre pour acheter un domaine publié sur le marché. Le paiement de l'acheteur est conservé sous séquestre jusqu'à ce que le transfert de domaine soit terminé. Le vendeur est averti et dispose de 7 jours pour fournir le code EPP/auth. Nécessite la portée domains:transfer.
Corps de la demande
| domain* | string | Nom de domaine à acheter |
| payment_method | string(card | usdc | balance) | Mode de paiement : «card» (par défaut), «usdc» ou «balance» (crédit du marché). |
Réponse 201
| deal | object | |
| hint | string | |
| next_steps | string[] |
/api/deals/{id}Obtenez des détails sur la transaction avec la chronologie
Obtenez tous les détails d’une transaction, notamment la ventilation du prix, les échéances et la chronologie des événements. L’acheteur comme le vendeur peuvent accéder à leurs transactions. Nécessite la portée deals:read.
Paramètres
| id* | string | ID de la transaction |
Réponse 200
| deal | object | |
| hint | string |
/api/deals/{id}Fournir le code EPP/auth (vendeur)
Le vendeur fournit le code EPP/autorisation pour lancer le transfert de domaine. Le code est crypté au repos et utilisé pour démarrer le transfert du bureau d'enregistrement. 3 tentatives maximum. Nécessite la portée deals:write.
Paramètres
| id* | string | ID de la transaction |
Corps de la demande
| auth_code* | string | Code EPP/autorisation du registraire actuel |
Réponse 200
| deal | object | |
| hint | string |
/api/deals/{id}/invoiceObtenez un reçu/un relevé de transaction
Renvoie une facture tenant compte du rôle pour une transaction sur le marché. Les acheteurs reçoivent un reçu d'achat ; les vendeurs reçoivent un relevé indiquant la vente, la ligne de commission de la plateforme et le paiement net. Fonctionne pour chaque mode de paiement (carte/USDC/solde). Nécessite la portée deals:read.
Paramètres
| id* | string |
Réponse 200
| invoice | DealInvoice |
/api/negotiationsListez vos négociations
Répertorie les négociations de prix où vous êtes l'acheteur ou le vendeur. Les contreparties sont anonymisées (rôles uniquement). Nécessite la portée deals:read.
Paramètres
| role | string(buyer | seller) | Filtrer par votre rôle |
| status | string | Filtrer par statut (open|agreed|completed|declined|expired|cancelled|all) |
Réponse 200
| negotiations | Negotiation[] |
/api/negotiationsFaire une offre sur une annonce
Ouvre une négociation de prix anonyme sur un domaine activement publié avec une offre initiale. Le vendeur peut faire une contre-offre, accepter ou refuser. Après acceptation, l'acheteur finalise le paiement et une transaction est créée au prix convenu. Nécessite la portée deals:write.
Corps de la demande
| domain* | string | Le domaine mis en vente sur lequel négocier |
| offer* | number | Offre initiale en USD |
| message | string | Message facultatif au vendeur |
Réponse 201
| negotiation | Negotiation |
Exemple
curl -X POST https://domani.run/api/negotiations \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain":"example.com","offer":500}'/api/negotiations/{id}Obtenez un fil de négociation
Renvoie une négociation avec son fil d’offre complet, anonymisé (les offres portent les libellés techniques 'you' ou 'counterparty'). Nécessite la portée deals:read.
Paramètres
| id* | string |
Réponse 200
| negotiation | Negotiation |
/api/negotiations/{id}faire une contre-offre, accepter ou refuser
Répondez à l'offre actuelle sur la table lorsque c'est votre tour. counter nécessite un nouveau montant ; accept verrouille le prix au montant actuellement sur la table ; decline met fin à la négociation. Nécessite la portée deals:write.
Paramètres
| id* | string |
Corps de la demande
| action* | string(counter | accept | decline) | |
| counter | number | Nouveau montant en USD (obligatoire lorsque action=counter) |
| message | string |
Réponse 200
| negotiation | Negotiation |
/api/negotiations/{id}Retirer une négociation
L'acheteur retire une négociation ouverte ou convenue. Nécessite la portée deals:write.
Paramètres
| id* | string |
Réponse 200
| cancelled | boolean |
/api/negotiations/{id}/finalizeFinaliser une négociation convenue (salaire)
L'acheteur paie le prix convenu pour créer la transaction de séquestre, puis le flux de transfert standard s'exécute. Accepte les mêmes modes de paiement qu'un achat sur la Marketplace (carte, USDC, x402). Renvoie 402 avec les instructions de paiement si aucun paiement n'est fourni. Pour une acquisition auprès d'un courtier, si le prix convenu est supérieur au max_budget que vous avez défini, renvoie 409 BUDGET_EXCEEDED - soumettez à nouveau avec confirm_over_budget: true pour continuer. Nécessite la portée domains:transfer.
Paramètres
| id* | string |
Corps de la demande
| payment_method | string(card | usdc | balance) | |
| payment_signature | string | null | |
| payment_tx | string | |
| payment_chain | string | |
| confirm_over_budget | boolean | Pour les transactions de courtier : continuez même si le prix convenu dépasse le max_budget que vous avez défini. |
/api/brokerLister vos demandes de courtier
Répertorie vos demandes d'acquisition de domaine et leur statut. Nécessite la portée deals:read.
Paramètres
| status | string | Filtrer par statut ou «all» |
Réponse 200
| requests | BrokerRequest[] |
/api/brokerDemander l'acquisition d'un domaine déjà enregistré
Demandez à domani d'acquérir un domaine spécifique non mis en vente en votre nom. Les agents recherchent le propriétaire via RDAP, le contactent de manière anonyme et négocient - avec commission uniquement, sans frais initiaux. L’intérêt du propriétaire ouvre une négociation anonyme. Remarque : de nombreux propriétaires sont inaccessibles (WHOIS masqué RGPD) - la demande se termine alors par no_contact. Nécessite la portée deals:write.
Corps de la demande
| domain* | string | Le domaine déjà enregistré que vous souhaitez |
| max_budget | number | Votre plafond en USD (facultatif) |
Réponse 201
| request | BrokerRequest |
Exemple
curl -X POST https://domani.run/api/broker \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain":"dream.com","max_budget":5000}'/api/broker/{id}Obtenez une demande de courtier
Renvoie l’une de vos demandes de courtier. Nécessite la portée deals:read.
Paramètres
| id* | string |
Réponse 200
| request | BrokerRequest |
/api/broker/{id}Annuler une demande de courtier
Annule une demande d'acquisition de domaine active. Nécessite la portée deals:write.
Paramètres
| id* | string |
Réponse 200
| cancelled | boolean |
/api/broker/respondPubliqueLire l'état d'une demande de courtier (côté propriétaire)
Le chemin de lecture de l'agent propriétaire : interrogez l'état actuel et anonyme d'une demande avec votre token avant d'agir. Renvoie le domaine, l'offre de l'acheteur sur la table, à qui appartient le mouvement et les actions disponibles maintenant. Ne révèle jamais l’identité ou le budget de l’acheteur. Autorisé par jeton.
Paramètres
| token* | string | Le jeton de sensibilisation de votre e-mail de demande. |
Réponse 200
| domain | string | |
| status | string | |
| your_turn | boolean | Que ce soit le déménagement du propriétaire. |
| current_offer_usd | number | null | L'offre de l'acheteur sur la table. |
| agreed_price_usd | number | null | |
| actions | string[] | Actions disponibles maintenant (sous-ensemble de offer/counter/accept/decline/opt_out). |
Exemple
curl "https://domani.run/api/broker/respond?token=<from your inbox>"
/api/broker/respondPubliqueRépondre à une demande de courtier (côté propriétaire)
Le chemin propriétaire-agent : répondez à la demande d'acquisition d'un courtier en utilisant le token provenant de l'e-mail de sensibilisation envoyé dans votre boîte de réception - l'alternative entièrement autonome à la réponse par e-mail ou au clic sur le lien de réclamation humaine. offer/counter ouvre ou avance une négociation anonyme au prix demandé ; decline et opt_out y mettent fin. Autorisé par jeton (le jeton est la capacité) - aucun compte ni étendue requis.
Corps de la demande
| token* | string | Le jeton de sensibilisation de votre e-mail de demande (la réponse est courtier+<token>@). |
| action* | string(offer | counter | accept | decline | opt_out) | offer/counter pour indiquer un prix ; accept pour accepter l’offre actuelle de l’acheteur ; decline pour la refuser ; opt_out pour ne plus être contacté. |
| price | number | Votre prix demandé en USD (obligatoire pour l'offre/le comptoir). |
Réponse 200
| handled | boolean | |
| outcome | string | Valeurs d’état : opted_out | declined | negotiation_opened | countered | ignored_not_your_turn | unclear |
| status | string | |
| negotiation_id | string | |
| domain | string |
Exemple
curl -X POST https://domani.run/api/broker/respond \
-H "Content-Type: application/json" \
-d '{"token":"<from your inbox>","action":"offer","price":800}'Auth
/api/oauth/registerEnregistrer un client OAuth (RFC 7591)
Enregistrement dynamique de client pour les clients MCP compatibles OAuth (connecteurs Claude.ai, ChatGPT, Grok Bot). Enregistrement ouvert : il n’accorde rien par lui-même - chaque autorisation passe toujours par l’écran de consentement de l’utilisateur. Les clients publics (token_endpoint_auth_method=none) doivent utiliser PKCE S256. Découverte : /.well-known/oauth-authorization-server.
Corps de la demande
| redirect_uris* | string[] | URI de redirection exacts (https, http sur loopback ou un schéma personnalisé natif) |
| client_name | string | Affiché sur l’écran de consentement |
| token_endpoint_auth_method | string(none | client_secret_post | client_secret_basic) | |
| client_uri | string | |
| logo_uri | string |
Réponse 201
| client_id | string | |
| client_name | string | |
| redirect_uris | string[] | |
| token_endpoint_auth_method | string | |
| grant_types | string[] | |
| response_types | string[] | |
| client_id_issued_at | integer | |
| client_secret | string | Uniquement pour les clients confidentiels ; renvoyé une seule fois |
/api/oauth/tokenPoint de terminaison de jeton OAuth
Échanger un code d’autorisation (avec le code_verifier PKCE) contre un jeton d’accès, ou effectuer une rotation avec grant_type=refresh_token. Les jetons d’accès sont des jetons API domani ordinaires portant les étendues approuvées et le confinement de boîte aux lettres. Les codes sont à usage unique ; les jetons de rafraîchissement sont renouvelés à chaque utilisation.
Réponse 200
| access_token | string | |
| token_type | string | |
| expires_in | integer | |
| refresh_token | string | |
| scope | string |