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éeDonne accès à
domains:readGET /api/domains, GET /api/domains/{domain}, GET /api/domains/{domain}/dns, /dnssec, /status, /email/check, /auth-code, /transfer-away, /transfer-status, /analytics
domains:writePUT /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:transferPOST /api/domains/buy, POST /transfer, POST /renew (implique le paiement, inclut les achats sur le marché)
tokens:readGET /api/tokens
tokens:writePOST /api/tokens, DELETE /api/tokens/{id}
webhooks:readGET /api/webhooks, GET /api/webhooks/{id}/deliveries
webhooks:writePOST /api/webhooks, PATCH /api/webhooks/{id}, DELETE /api/webhooks/{id}
email:readGET /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:writePOST /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:deleteSupprimez 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_mailboxesCré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_secretsLisez 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:readGET /api/me, GET /api/agents/identity
account:writeDELETE /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:readGET /api/billing/invoices
searchGET /api/domains/search, /suggest, /whois, /dns-check, GET /api/tlds
deals:readGET /api/deals, GET /api/deals/{id}
deals:writePOST /api/domains/sell, PATCH /api/deals/{id}
notifications:readGET /api/notifications, GET /api/notifications/count
backorders:readGET /api/backorders, GET /api/backorders/{id}
backorders:writePOST /api/backorders, DELETE /api/backorders/{id}
assistant:readRead Mailzero assistant settings, the Today queue, Work items, exact action previews, history-import progress, and content-minimized Activity
assistant:writeChange 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_AUTH

Les 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"
}
CoderHTTP
MISSING_API_KEY401
INVALID_API_KEY401
EXPIRED_API_KEY401
MISSING_PARAMETER400
INVALID_DOMAIN400
PAYMENT_REQUIRED402
DOMAIN_UNAVAILABLE409
RATE_LIMIT_EXCEEDED429
USER_EXISTS409
NOT_FOUND404
UNKNOWN_PROVIDER400
UNKNOWN_METHOD400
TARGET_REQUIRED400
INVALID_PARAMETER400
CONTACT_REQUIRED400
INVALID_CONTACT400
INSUFFICIENT_SCOPE403
SCOPE_ESCALATION400
MAILBOX_CONFINED400
DOMAIN_EXISTS400
DOMAIN_NOT_ACTIVE400
UNSUPPORTED_TLD400
TLD_NOT_IN_PUBLIC_DNS400
NOT_AVAILABLE400
ALREADY_REGISTERED400
TRANSFER_NOT_ELIGIBLE400
RENEWAL_NOT_ELIGIBLE400
ALREADY_LISTED400
LISTING_SOLD400
SELF_PURCHASE400
DESCRIPTION_TOO_LONG400
DEAL_NOT_FOUND400
INVALID_DEAL_STATE400
EPP_ATTEMPTS_EXCEEDED400
ACTIVE_DEAL_EXISTS400
AGENT_IDENTITY_NOT_FOUND400
AGENT_IDENTITY_ESCALATION400
AGENT_MAILBOXES_REQUIRED400
CREDENTIAL_REVOKE_FAILED400
INVALID_IDEMPOTENCY_KEY400
IDEMPOTENCY_KEY_MISMATCH400
IDEMPOTENCY_KEY_REUSED400
OPERATION_IN_PROGRESS400
OPERATION_SUPERSEDED400
INVALID_OPERATION_RECEIPT400
WORKSPACE_ADMIN_REQUIRED400
WORKSPACE_OWNER_REQUIRED400
PRINCIPAL_NOT_IN_WORKSPACE400
MAILBOX_NOT_IN_WORKSPACE400
GROUP_NOT_IN_WORKSPACE400
COLLECTION_NOT_IN_WORKSPACE400
ACCESS_VERSION_CONFLICT400
ACCESS_OFFER_INVALID400
ACCESS_OFFER_EMAIL_MISMATCH400
MAIL_DOMAIN_CAPACITY_EXHAUSTED400
MAIL_PROVIDER_ERROR400
INVALID_HTTP_ROUTE_HOSTNAME400
INVALID_HTTP_ROUTE_UPSTREAM400
INVALID_HTTP_ROUTE_UPSTREAM_HEADERS400
INVALID_HTTP_ROUTE_LEASE400
INVALID_HTTP_ROUTE_POLICY400
INVALID_HOSTNAME_BINDING400
HTTP_ROUTE_HOSTNAME_NOT_ALLOWED400
HTTP_ROUTE_HOSTNAME_REQUIRED400
HTTP_ROUTE_HOSTNAME_RESERVED400
HTTP_ROUTE_HOSTNAME_UNAVAILABLE400
HTTP_ROUTE_CONCURRENCY_LIMIT400
HTTP_ROUTE_WORKSPACE_LIMIT400
HTTP_ROUTE_DOMAIN_NOT_OWNED400
HTTP_ROUTE_TERMINAL400
HTTP_ROUTE_VERIFICATION_NOT_ENABLED400
HTTP_ROUTE_VERIFICATION_REQUIRES_HTTPS400
HTTP_ROUTE_POLICY_WITHOUT_SCOPE400
HTTP_ROUTE_POLICY_REQUIRED400
HTTP_ROUTE_AGENT_IDENTITY_REQUIRED400
HTTP_ROUTE_POLICY_ESCALATION400
HOSTNAME_BINDING_NOT_ACTIVE400
HOSTNAME_BINDING_DNS_CONFLICT400
HOSTNAME_BINDING_ACK_REQUIRED400
HOSTNAME_BINDING_BROWSER_MODE_MISMATCH400
HOSTNAME_DNS_CONFLICT400
ZONE_READ_FAILED400
DNS_VERSION_CONFLICT400
UNAUTHORIZED400
APEX_WEB_MODE_CONFLICT400
APEX_DELEGATION_ACK_REQUIRED400
VERIFICATION_COOLDOWN400
VERIFICATION_SEND_FAILED400
UPGRADE_REQUIRED400
FREE_LIMIT_EXCEEDED400

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

GET/api/assistant/rules

Lister 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

rulesAssistantRule[]
POST/api/assistant/rules

Cré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

idstring
namestring
enabledboolean
positioninteger
matchAssistantRuleMatch
assigneeobject
levelstring
grantsAssistantGrants
match_countinteger
last_matched_atstring (date-time) | null
created_atstring (date-time)
updated_atstring (date-time)
PUT/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

idstring
namestring
enabledboolean
positioninteger
matchAssistantRuleMatch
assigneeobject
levelstring
grantsAssistantGrants
match_countinteger
last_matched_atstring (date-time) | null
created_atstring (date-time)
updated_atstring (date-time)
DELETE/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

deletedboolean
released_itemsinteger
POST/api/assistant/rules/test

Essayer 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*stringLa clé de l'élément de travail, par exemple org:tucows:invoice
sender_addressstring | null
sender_kindstring(human | automated)
subjectstring | null
labelsstring[]
occurrencesinteger
confidenceobjectLa probabilité du classifieur par label, pour une règle avec minConfidence

Réponse 200

matchedboolean
ruleAssistantRule
whystring[]
consideredinteger
POST/api/assistant/rules/{id}/check

Tester 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
matterobject
atstring (date-time)L'instant auquel vérifier l'horaire ; maintenant par défaut
approved_bystring[]Ids de membres qui ont déjà approuvé

Réponse 200

ruleobject
allowed_kindsstring[]
effective_grantsAssistantGrants
outcomestring
checkAssistantGrantCheck
hintstring
GET/api/assistant/metrics

Lire 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_daysinteger

Réponse 200

typestring
as_ofstring (date-time)
window_daysinteger
accountAssistantTaskNumbers
rulesobject[]
GET/api/assistant/approvals

Lister 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

typestring
as_ofstring (date-time)
plansobject[]
escalationsobject[]
GET/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

statusstring(open | accepted | dismissed)

Réponse 200

suggestionsAssistantSuggestion[]
POST/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

suggestionAssistantSuggestion
ruleAssistantRuleInput
GET/api/assistant/grants

Lister 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

grantsAssistantAssigneeGrants[]
PUT/api/assistant/grants

Dé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*stringLe slug d'identité de l'agent, ou l'identifiant utilisateur du membre
grants*AssistantGrants

Réponse 200

assigneeobject
grantsAssistantGrants
created_atstring (date-time)
updated_atstring (date-time)
DELETE/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

deletedboolean
GET/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*stringL'id de l'élément de travail

Réponse 200

idstringL'id de l'élément de travail
versioninteger
statusstring
deadlinestring (date-time) | null
youobject
delegationobject
leaseAssistantTaskLease
briefobject | nullLe résumé de l'affaire, tel que GET /api/assistant/work-items/{id}/brief y répond
factsobject | nullLes faits de l'affaire, tels que GET /api/assistant/work-items/{id}/facts y répond
plansobject
escalationsobject[]Les questions posées sur la tâche, les plus récentes en premier, avec leurs réponses
POST/api/assistant/tasks/{id}/lease

Prendre 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_secondsinteger

Réponse 200

task_idstring
leaseAssistantTaskLease
DELETE/api/assistant/tasks/{id}/lease

Rendre 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_idstring
releasedboolean
leaseAssistantTaskLease
POST/api/assistant/tasks/{id}/effects

Demander 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
notestringCe que l'assigné veut que le propriétaire sache à propos de cette demande

Réponse 200

task_idstring
replayedboolean
planAssistantPlan
executionobject | null
leaseAssistantTaskLease
hintstring
POST/api/assistant/tasks/{id}/escalate

Arrê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
optionsobject[]
evidence_refsstring[]

Réponse 200

task_idstring
escalation_idstring
decision_idstring
statusstring
versioninteger
hintstring
POST/api/assistant/tasks/{id}/report

Rapporter 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_refsstring[]
claimsobject[]

Réponse 200

task_idstring
outcomestring
statusstring
reconciliationobject
receipt_idstring
hintstring
GET/api/emails/{address}/messages/{id}/facts

Lire 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*stringIdentifiant du message

Réponse 200

message_idstring
thread_idstring
analysedboolean
reasonstringSeulement quand analysed est false
analysisobject
factsFact[]
entitiesobject[]
commitmentsobject[]
expectationsobject[]
POST/api/emails/{address}/messages/{id}/extract

Extraire 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*stringIdentifiant du message

Corps de la demande

schema*objectSchéma JSON des champs à extraire : un objet de primitives, tableaux et objets imbriqués, moins de 8 Ko, pas de $ref
instructionsstringGuidance optionnelle, par exemple montants en EUR

Réponse 200

message_idstring
dataobject
confidencenumber
evidence_quotesstring[]
modelstring
cachedboolean
generated_atstring (date-time)
usageobject
GET/api/assistant/settings

Obtenir 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

enabledboolean
shadow_enabledboolean
pausedboolean
mailbox_idsstring[]
agent_mailbox_idsstring[]Boîtes opérées par vos agents. Leurs éléments apparaissent dans la section agents de Today au lieu de Needs you.
agentsobject[]Vos identités d'agents, pour la délégation.
search_opt_out_mailbox_idsstring[]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_idsstring[]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_daysinteger
privacy_routestring
attachment_visionboolean
community_signalsbooleanVos 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_versionstring
consentobject
mailboxesobject[]

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"
    }
  ]
}
PUT/api/assistant/settings

Mettre à 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

enabledbooleanAfficher les Decisions dans Today et générer des brouillons à la demande
shadow_enabledbooleanAnalyser le courrier sans afficher les Decisions
pausedboolean
mailbox_idsstring[]IDs des boîtes mail possédées à traiter; un tableau vide désactive tout
agent_mailbox_idsstring[]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_daysinteger
attachment_visionboolean

Réponse 200

okboolean
enabledboolean
shadow_enabledboolean
pausedboolean
mailbox_idsstring[]

Exemple de réponse

{
  "ok": true,
  "enabled": true,
  "shadow_enabled": true,
  "paused": false,
  "mailbox_ids": [
    "mbx_123"
  ]
}
POST/api/assistant/preview

Consentir 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_daysinteger
consent*boolean(true)
consent_version*string(mailzero-personal-ai.v1)

Réponse 200

okboolean
previewobject

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"
  }
}
GET/api/assistant/backfill

Obtenir 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

backfillobject | 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
  }
}
POST/api/assistant/backfill

Ré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

okboolean
retriedinteger

Exemple de réponse

{
  "ok": true,
  "retried": 2
}
GET/api/assistant/today

Obtenir 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

agentstringVue 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.
categorystringUn 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.
tagstringSeulement 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

typestring
as_ofstring
projection_lag_msinteger
categorystring | nullLe type de sujet auquel la vue est restreinte (le paramètre category), ou null pour tous les types.
categoriesobjectChaque type de sujet présent dans la vue, avant le filtre, avec le nombre d'éléments qu'il contient.
tagstring | nullL'étiquette à laquelle la vue est restreinte (le paramètre tag), ou null pour tous les dossiers.
tagsobjectChaque étiquette de la personne dans la vue, avant le filtre, avec le nombre de dossiers qui la portent.
sectionsobject

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": []
  }
}
GET/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*stringID de l'élément Work de la file Today

Réponse 200

idstring
versioninteger
statusstring
titlestring
summarystring
askstring | nullLa seule chose que le propriétaire doit faire ou décider, ou null.
categorystring | nullLe 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>.
tagsstring[]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_tagsstring[]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.
suspectbooleanLes 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_reasonsstring[]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).
senderobject | null
recurrenceobjectCombien de fois cette même situation est revenue : un élément, N messages.
mailboxobject
opened_atstring | null
delegated_tostring | nullLe slug de l'agent à qui le propriétaire a confié cet élément, ou null.
delegation_ruleobject | nullLa 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.
unreadbooleanVrai tant que le propriétaire n'a pas ouvert l'élément après sa dernière modification.
messagesobject[]Les messages sources à l'origine de cet élément, du plus récent au plus ancien.
historyobject[]Ce qui s'est déjà passé dans ce dossier, du plus ancien au plus récent : une ligne par message antérieur.
sourceobject
attentionobject
analysisobject
evidence_refsstring[]
entity_refsstring[]
snoozed_untilstring | null
decisionobject | null
planobject | null
GET/api/assistant/work-items/{id}/brief

Lire 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*stringID de l'élément Work
synthesisbooleanDé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

idstring
versioninteger
generated_atstring (date-time)
titlestring
summarystring
askstring | null
mailboxobject
delegated_tostring | null
situationobject
storyobject[]Chaque courrier de la situation, du plus ancien au plus récent, avec le titre d'une ligne que l'analyse lui a donné
factsobject[]
entitiesobject[]
commitmentsobject[]Promesses ouvertes faites par le côté du propriétaire
expectationsobject[]Choses ouvertes attendues des autres
settledobject[]Boucles fermées et accusés de réception, du plus récent au plus ancien
awaitingobject[]
decisionobject | nullLa Décision préparée actuelle avec ses options
summary_sourcestringSi le résumé est la lecture du modèle des preuves ou la propre phrase du pipeline
suggested_nextobject | null
open_questionsstring[]Ce que seul le propriétaire peut décider avant l'action suivante, au maximum trois questions
synthesisobject | nullL'appel du modèle qui a écrit le résumé et l'action suivante, null lorsque le brief est uniquement déterministe
evidenceobject[]
owner_repliesobject[]
evidence_refsstring[]
GET/api/assistant/brief

Lire 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*stringL'adresse email de la personne
mailboxstringRestreindre à une adresse de boîte aux lettres (slug@domain)

Réponse 200

correspondentstring
mailboxesstring[]
briefany
relatedobject[]
recent_mailobject[]
generated_atstring (date-time)
GET/api/assistant/work-items/{id}/facts

Lire 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*stringID de l'élément Work

Réponse 200

work_item_idstring
versioninteger
analysedboolean
analysesobject[]
factsFact[]
entitiesobject[]
commitmentsobject[]
expectationsobject[]
evidence_refsstring[]
POST/api/assistant/work-items/{id}/open

Marquer 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

okboolean
opened_atstring
unreadboolean
GET/api/assistant/learned

Ce 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

mutesobject[]Les mises en sourdine en vigueur, les plus récentes en premier.
suggestionsAssistantSuggestion[]Les règles de silence ouvertes : acceptez-en une via l'endpoint suggestions pour définir la mise en sourdine qu'elle porte.
tagsobject[]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.
DELETE/api/assistant/learned/mutes

Oublier 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*stringL'adresse, le domaine ou la clé de situation, comme la vue learned le liste.

Réponse 200

okboolean
kindstring
valuestring
DELETE/api/assistant/learned/tags

Oublier 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*stringL'étiquette, telle que la vue learned la liste.

Réponse 200

okboolean
namestring
GET/api/assistant/work-items/{id}/investigate

Enquê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_idstring
sourcestringSi le message source a été lu, ou seulement l'adresse de l'expéditeur.
checked_atstring
senderobject
linksobject[]
attachmentsobject[]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.
signalsobject[]Ce que les faits ajoutent à l'évaluation, une phrase chacun.
GET/api/assistant/work-items/{id}/sender

Qui 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_idstring
senderobject | null
organisationobject | nullNull pour un domaine de messagerie partagé ou un domaine jamais analysé.
participantsobject[]
relationshipobject
generated_atstring (date-time)
POST/api/assistant/work-items/{id}/interactions

Enregistrer 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

scopestring(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.
verdictstring(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_idstringAvec type approve ou reject : le plan d'action en attente (proposé ou escaladé).
reasonstringAvec type reject : pourquoi, conservé sur le plan.
type*string(choose | instruct | take_over | snooze | ignore | correct | delegate | approve | reject | report | tag)
addstring[]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.
removestring[]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_slugstring | nullAvec le type delegate : le slug de votre agent à qui confier l'élément, ou null pour le reprendre.
member_idstring | nullAvec 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_idstring
decision_versioninteger
option_idstring
instructionstring
untilstring (date-time)
remind_atstring (date-time)
fieldstring
correctionstring
idempotency_key*string

Réponse 200

okboolean
work_itemAssistantWorkItem
plan_idstring | null
GET/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*stringID de plan d'action opaque

Réponse 200

idstring
statusstring
expires_atstring
source_revisioninteger
effectsobject[]
GET/api/assistant/activity

Obtenir 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

limitinteger

Réponse 200

typestring
as_ofstring
eventsobject[]
GET/api/assistant/data

Exporter 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

formatstring
exported_atstring
notestring
DELETE/api/assistant/data

Supprimer 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

okboolean
deletedobject
source_mail_deletedboolean

Exemple de réponse

{
  "ok": true,
  "deleted": {
    "work_items": 12,
    "claims": 40,
    "entities": 9,
    "jobs": 52
  },
  "source_mail_deleted": false
}
POST/api/assistant/devices

Enregistrer 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_detailstring(redacted | sender_only)

Réponse 200

okboolean
deviceobject
DELETE/api/assistant/devices

Ré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

okboolean

E-mail

GET/api/domains/{domain}/email/check

Vé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*stringNom de domaine que vous possédez

Réponse 200

domainstring
providerstring | nullFournisseur de messagerie détecté automatiquement (google-workspace, proton, fastmail) ou null
mxobject
spfobject
dmarcobject
dkimobject

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"
GET/api/domains/{domain}/email/deliverability

Obtenez 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*stringNom de domaine que vous possédez

Réponse 200

domainstring
statusstring
confidencestring
checked_atstring (date-time)
window_daysinteger
readinessobjectPréparation à la configuration DNS déterministe. Le score n’est pas une probabilité dans la boîte de réception.
sending_healthobject
placementobject
actionsobject[]
caveatsstring[]

Exemple

curl https://domani.run/api/domains/mysite.com/email/deliverability \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/domains/{domain}/email/setup

Configurer 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*stringNom de domaine

Corps de la demande

forcebooleanRemplacez le fournisseur de messagerie existant (Google Workspace, Fastmail, Proton). Par défaut : faux

Réponse 200

domainstring
statusstring
verified_atstring | null
receiving_verifiedbooleanVrai quand le MX du domaine pointe vers le récepteur de la plateforme, donc les e-mails de ses adresses sont acceptés.
sending_configuredboolean
sending_verifiedboolean
recordsDnsRecord[]
hintstring
DELETE/api/domains/{domain}/email/setup

Supprimer 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*stringNom de domaine
GET/api/domains/{domain}/email/status

Vé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*stringNom de domaine

Réponse 200

domainstring
enabledboolean
verifiedbooleanVrai uniquement lorsque la réception et l'envoi sortant sont vérifiés
receiving_verifiedbooleanVrai quand le MX du domaine pointe vers le récepteur de la plateforme, donc les e-mails de ses adresses sont acceptés.
sending_configuredboolean
sending_verifiedboolean
recordsDnsRecord[]
mailbox_countinteger
dns_managedbooleanVrai 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_addressesstring[]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_statusstring
mailbox_plan_keystringLa 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_limitinteger | nullNombre de boîtes mail sur domaine personnalisé que le plan autorise dans tout l’espace de travail. null signifie illimité.
mailbox_limit_reachedbooleanVrai 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_planobject | nullLe plan le moins cher qui laisserait de la place pour une autre boîte mail. null si c’est déjà illimité.
hintstring
POST/api/email

Cré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*stringPartie locale de l’adresse e-mail (par exemple 'hello' pour hello@domani.run)
namestringNom d'affichage (par défaut, slug en majuscule)

Réponse 201

idstring
addressstring
namestring | null
slugstring
domainstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
collaboration_enabledboolean
sharedbooleanIndique si au moins une personne autre que l’appelant peut lire cette boîte aux lettres
message_countinteger
webhook_urlstring | null
header_namesstring[]Noms d'en-tête d'authentification de webhook configurés ; les valeurs ne sont jamais renvoyées
forward_tostring | null
signing_secretstring | null
created_atstring (date-time)
hintstring
GET/api/email

Lister 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

domainstringFiltrer par domaine

Réponse 200

mailboxesobject[]
POST/api/emails

Cré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*stringAdresse e-mail complète, par ex. hello@mysite.com
namestringNom d'affichage pour les e-mails sortants (par exemple "John Doe")
forcebooleanRemplacez les enregistrements MX existants. Par défaut : faux
kindstring(api | hosted)"api" (par défaut : envoyer/recevoir via API + webhooks) ou "hosted" (véritable boîte mail IMAP/SMTP sur votre domaine)
workspace_idstringEspace 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

idstring
addressstring
namestring | null
domainstring
slugstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
collaboration_enabledboolean
sharedbooleanIndique si au moins une personne autre que l’appelant peut lire cette boîte aux lettres
message_countinteger
webhook_urlstring | null
header_namesstring[]Noms d'en-tête d'authentification de webhook configurés ; les valeurs ne sont jamais renvoyées
forward_tostring | null
signing_secretstring | nullSecret HMAC pour vérifier les charges utiles des webhooks entrants (affiché une fois lors de la création)
host_idstringID principal de l'hôte de messagerie pour une boîte aux lettres hébergée
dns_recordsDnsRecord[]
dns_statusstring
receiving_statusstring
sending_statusstring
sending_errorobject
client_settingsobject
credentialobject
storage_quota_bytesinteger
created_atstring (date-time)
hintstring
GET/api/emails

Lister 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

domainstringFiltrer par domaine

Réponse 200

mailboxesobject[]
GET/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*stringAdresse e-mail complète (codée en URL, par exemple hello%40mysite.com)

Réponse 200

idstring
addressstring
slugstring
domainstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
webhook_urlstring | null
forward_tostring | null
signing_secretstring | nullSecret HMAC pour les managers ; null pour les téléspectateurs/répondeurs
message_countinteger
storage_quota_bytesinteger | null
storage_used_bytesinteger | null
storage_measured_atstring (date-time) | null
created_atstring (date-time)
PATCH/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*stringAdresse e-mail complète (codée en URL)

Corps de la demande

namestring | nullNom d'affichage de la boîte aux lettres. Définissez sur null pour effacer.
webhook_urlstring | nullURL HTTPS pour le webhook de courrier électronique entrant, ou null pour effacer
forward_tostring | nullAdresse e-mail vers laquelle transférer les e-mails entrants, ou null pour effacer
drop_spambooleanSupprimer (ne pas stocker ni webhook) les messages entrants signalés comme spam
tone_notesstring | nullIndications 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

idstring
addressstring
slugstring
domainstring
namestring | null
webhook_urlstring | null
forward_tostring | null
tone_notesstring | null
signing_secretstringSecret HMAC pour vérifier les charges utiles des webhooks entrants
DELETE/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*stringAdresse e-mail complète (codée en URL)

Corps de la demande

confirmbooleanDoit être vrai pour être réellement supprimé. Omettre l'aperçu.
POST/api/emails/{address}/send

Envoyer 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*stringAdresse e-mail de l'expéditeur (codée en URL)

Corps de la demande

to*anyAdresse(s) e-mail du destinataire
ccanyDestinataire(s) CC
bccanyDestinataire(s) BCC
subjectstring
textstringCorps de texte brut
htmlstringCorps HTML
reply_tostringAdresse de réponse
in_reply_tostringID de message de l'e-mail auquel on répond (pour le fil de discussion)
referencesstringChaîne d'ID de message séparée par des espaces (pour le threading)
idempotency_keystringClé stable qui empêche les envois en double
send_atstring (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.
coordinationobjectRequis pour une réponse collaborative gardée.
allow_risky_contentbooleanChamp 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.
attachmentsobject[]Pièces jointes (max 10, max 40 Mo au total). Le contenu doit être codé en base64.

Réponse 200

idstring
message_idstringID de message RFC 5322
fromstring
tostring
bccstring | nullDestinataire(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.
statusstring
attachments_countinteger
suppressedstring[]
deliverabilityobjectRapport de stratégie versionné appliqué à cet envoi ; Décision d'inspection et contrôles catégorisés
POST/api/emails/{address}/deliverability-check

Contrô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*stringAdresse e-mail de l'expéditeur (codée en URL)

Corps de la demande

subjectstring
textstring
htmlstring
idempotency_keystring
allow_risky_contentbooleanChamp de compatibilité obsolète ; les blocs de sécurité objectifs ne peuvent pas être annulés.
attachmentsobject[]

Réponse 200

policy_versionstring
decisionstring
safe_to_sendbooleanÉquivalent booléen rétrocompatible à décision != refuser
riskstring
scoreinteger
authentication_messageboolean
checksobject[]
blocked_reasonsstring[]
warningsstring[]
override_usedboolean
GET/api/emails/{address}/messages

Liste 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
cursorstringCurseur de pagination de la réponse précédente
limitintegerMax de messages à renvoyer
directionstring(in | out | all)Filtrer par direction (par défaut : toutes)
folderstring(inbox | archive | sent | spam | trash)Dossier système. Mutuellement exclusif avec vue. La valeur par défaut est la boîte de réception.
labelstringÉtiquettes séparées par des virgules : seulement les messages portant l'une d'entre elles
viewstring(starred | all | needs_human | scheduled)Vue virtuelle. Mutuellement exclusif avec dossier.
sincestringHorodatage ISO - renvoie uniquement les messages créés après cette date
untilstringHorodatage ISO - renvoie uniquement les messages créés avant cette date
fromstringFiltrer par adresse d'expéditeur
tostringFiltrer par adresse du destinataire
subjectstringFiltrer par sujet
qstringRecherche étendue, insensible à la casse, parmi l'expéditeur, les destinataires, le sujet et le corps du texte brut
unreadbooleanRenvoie uniquement les messages non lus
attachmentsbooleanRenvoie les messages contenant uniquement des pièces jointes
spambooleanFiltrer par indicateur de spam (passez false pour masquer les spams entrants signalés)

Réponse 200

messagesobject[]
next_cursorstring | null
GET/api/emails/search

Rechercher 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

mailboxstringRestreindre à une seule adresse de boîte mail (slug@domain).
q*stringCe 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"`).
modestring(hybrid | semantic | keyword)hybrid fusionne l'embedding et les mots par rang ; semantic utilise uniquement le sens ; keyword uniquement les mots.
limitintegerRésultats à retourner.
sincestringUniquement les emails reçus après cet horodatage ISO.
untilstringUniquement les emails reçus avant cet horodatage ISO.
folderstring(inbox | archive | sent | spam | trash | anywhere)Un dossier. Trash est exclu sauf s'il est nommé ou avec `anywhere`.
fromstringL'adresse de l'expéditeur contient.
labelstringÉtiquettes séparées par des virgules : seulement les messages portant l'une d'entre elles

Réponse 200

resultsobject[]
modestring
querystring
took_msinteger
hintstring

Exemple

curl "https://domani.run/api/emails/search?q=facture+tucows+ao%C3%BBt&limit=5" \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/emails/connect/gmail

Commencer à 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

accessstring(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.
sincestring (date-time)Importer le courrier reçu après cet instant
windowstring(24h | 7d | 30d | 1y)Un préréglage au lieu de since ; par défaut 24h
workspace_idstringEspace de travail auquel appartient la boîte mail ; votre espace de travail personnel par défaut
login_hintstringLe compte Google à présélectionner
return_tostringChemin d'application vers lequel envoyer le navigateur après consentement

Réponse 200

auth_urlstring
statestring
import_sincestring (date-time)
expires_ininteger
accessstring
POST/api/emails/connect/outlook

Commencer à 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

accessstring(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.
sincestring (date-time)Importer le courrier reçu après cet instant
windowstring(24h | 7d | 30d | 1y)Un préréglage au lieu de since ; par défaut 24h
workspace_idstringEspace de travail auquel appartient la boîte mail ; votre espace de travail personnel par défaut
login_hintstringLe compte Microsoft à présélectionner
return_tostringChemin d'application vers lequel envoyer le navigateur après consentement

Réponse 200

auth_urlstring
statestring
import_sincestring (date-time)
expires_ininteger
accessstring
GET/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

providersMailProvider[]
POST/api/emails/connect/forwarding

Connecter 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*stringLa boîte de réception à connecter, par exemple someone@gmail.com
workspace_idstringEspace de travail auquel appartient la boîte mail ; votre espace de travail personnel par défaut

Réponse 200

addressstring
mailbox_idstring
statusstring
forwarding_addressstring
instructionsobject
guideForwardingGuide
POST/api/emails/{address}/connector/verify

Envoyer 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*stringL'adresse connectée, par exemple someone@gmail.com

Réponse 200

sent_tostring
forwarding_addressstring
GET/api/emails/{address}/connector

Lire 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*stringL'adresse connectée, par exemple someone@gmail.com

Réponse 200

addressstring
mailbox_idstring
kindstring
statusstring
import_sincestring (date-time) | nullLa limite de la première importation : aucun mail reçu avant elle n'est copié
phasestringliste 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_reasonstring | null
import_runobject | nullL'exécution d'importation actuelle ou dernière de cette boîte mail
source_messages_totalinteger | nullCe que la source rapporte pour toute la boîte de réception, pour l'échelle
last_sync_atstring (date-time) | null
last_errorstring | null
backoff_untilstring (date-time) | null
verified_atstring (date-time) | null
connected_atstring (date-time)
cost_cap_usdnumberLe montant de dépense du modèle autorisé par exécution d'importation, en USD
accessstring | nullPour 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
forwardingobject | nullPour une connexion par transfert : l'adresse de transfert, ce qui est arrivé, la confirmation de Gmail, la sonde, les étapes
DELETE/api/emails/{address}/connector

Dé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

disconnectedboolean
addressstring
removed_messagesinteger
removed_attachmentsinteger
POST/api/emails/{address}/import

Importer 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_idstring
import_sincestring (date-time)
import_untilstring (date-time)
GET/api/emails/{address}/search

Rechercher 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
q*stringCe 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"`).
modestring(hybrid | semantic | keyword)hybrid fusionne l'embedding et les mots par rang ; semantic utilise uniquement le sens ; keyword uniquement les mots.
limitintegerRésultats à retourner.
sincestringUniquement les emails reçus après cet horodatage ISO.
untilstringUniquement les emails reçus avant cet horodatage ISO.
folderstring(inbox | archive | sent | spam | trash | anywhere)Un dossier. Trash est exclu sauf s'il est nommé ou avec `anywhere`.
fromstringL'adresse de l'expéditeur contient.
labelstringÉtiquettes séparées par des virgules : seulement les messages portant l'une d'entre elles

Réponse 200

resultsobject[]
modestring
querystring
took_msinteger
hintstring
GET/api/emails/{address}/threads

Lister 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
folderstring(all | inbox | archive | sent | spam | trash)
sincestringSeulement les fils avec activité après cette heure
limitinteger
cursorstringnext_cursor de la page précédente
labelstringÉtiquettes séparées par des virgules : seulement les fils avec un message portant l'une d'entre elles

Réponse 200

threadsEmailThread[]
next_cursorstring | null
has_moreboolean
GET/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*stringId du fil (le thread_id de n'importe lequel de ses messages)

Réponse 200

idstring
subjectstring | null
participantsstring[]
message_countinteger
unread_countinteger
first_message_atstring (date-time)
last_message_atstring (date-time)
messagesobject[]
GET/api/emails/{address}/events

Diffuser 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
sincestringCurseur à partir duquel rejouer ; le `cursor` de n'importe quel événement antérieur ou un next_cursor provenant de /api/email/changes
GET/api/emails/{address}/folders

Ré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

foldersobject[]
viewsobject[]
capabilitiesobject
POST/api/emails/{address}/messages/actions

Appliquer 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)
destinationstring(inbox | archive | sent | spam | trash)
readboolean
starredboolean
addstring[]label : étiquettes à ajouter
removestring[]label : étiquettes à retirer
setstring[]label : remplacer chaque étiquette (prioritaire sur ajouter et retirer)
idempotency_keystringClé stable pour ce lot logique exact. Réutiliser après un délai d'attente.

Réponse 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVrai lorsque cette réponse a réutilisé le reçu complété immuable et n’a effectué aucune nouvelle mutation.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
PATCH/api/emails/{address}/messages/read

Marquer 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Corps de la demande

message_ids*string[]ID des messages à marquer
read*booleantrue pour marquer comme lu, false pour marquer comme non lu
idempotency_keystring

Réponse 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVrai lorsque cette réponse a réutilisé le reçu complété immuable et n’a effectué aucune nouvelle mutation.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
countinteger
POST/api/emails/{address}/messages/delete

Supprimer 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Corps de la demande

message_ids*string[]ID des messages à supprimer
idempotency_keystring

Réponse 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVrai lorsque cette réponse a réutilisé le reçu complété immuable et n’a effectué aucune nouvelle mutation.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
countinteger
GET/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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
id*stringIdentifiant du message

Réponse 200

idstring
thread_idstringId de conversation partagé par tous les messages du fil (l'id du message racine)
labelsstring[]Chaque étiquette sur le message ; `label` est la première
thread_keystringClé de conversation canonique avec espace de noms du backend
thread_aliasesstring[]Clés de workflow héritées à transmettre lors de la mutation de l'état de la conversation
message_idstring | null
directionstring
fromstringLe 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_urlstring (uri) | nullURL proxy Domani préservant la confidentialité pour l'avatar de l'expéditeur
tostringTous 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).
ccstring | nullTous les destinataires Cc de l'en-tête, avec leurs noms d'affichage, ou null quand le courrier ne portait pas de Cc.
bccstring | nullDestinataires Bcc, présents uniquement sur votre propre message sortant (jamais sur un message reçu, et jamais transmis comme en-tête).
reply_tostring | null
subjectstring
textstring | null
htmlstring | null
in_reply_tostring | null
referencesstring | null
attachmentsobject[]
statusstring
is_readboolean
read_atstring | null
eventsobject[]
created_atstring (date-time)
DELETE/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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
id*stringIdentifiant du message

Réponse 200

idstring
deletedboolean
POST/api/emails/{address}/messages/{id}/reply

Ré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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
id*stringID du message auquel répondre

Corps de la demande

textstringCorps de réponse en texte brut
htmlstringCorps de réponse HTML
ccanyDestinataire(s) CC supplémentaire(s)
allbooleanRépondre à tous : remplir automatiquement le CC à partir du To/CC d'origine
quotebooleanCite l’original sous la réponse ; false n’envoie que le texte ou le HTML fourni
idempotency_keystringForme de compatibilité corporelle de Idempotency-Key
coordinationobject

Réponse 200

idstring
message_idstring
fromstring
tostring
statusstring
reply_versionintegerGénération réservée pour une réponse réservée
POST/api/emails/{address}/messages/{id}/forward

Transfé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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
id*stringID du message à transférer

Corps de la demande

to*stringAdresse e-mail du destinataire
textstringNote facultative à ajouter au début

Réponse 200

idstring
message_idstring
fromstring
tostring
statusstring
GET/api/emails/{address}/avatar

Obtenir 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Réponse 200

addressstring
gravatar_urlstring | null
gravatar_signupstring
has_avatarboolean
hintstring
GET/api/emails/{address}/webhook

Obtenir 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Réponse 200

addressstring
webhook_urlstring | null
signing_secretstring | null
has_webhookboolean
eventsstring[]É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_namesstring[]Noms d'en-tête d'authentification configurés ; les valeurs ne sont jamais renvoyées
hintstring
PUT/api/emails/{address}/webhook

Dé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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Corps de la demande

url*stringURL du webhook HTTPS
eventsstring[]É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}}.
headersobjectEn-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

addressstring
webhook_urlstring
signing_secretstring
has_webhookboolean
eventsstring[]É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_namesstring[]Noms d'en-tête d'authentification configurés ; les valeurs ne sont jamais renvoyées
hintstring

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"]}'
DELETE/api/emails/{address}/webhook

Supprimer 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Réponse 200

addressstring
webhook_urlstring | null
signing_secretstring | null
has_webhookboolean
eventsstring[]É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_namesstring[]
hintstring
POST/api/emails/{address}/webhook/rotate

Faire 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Réponse 200

addressstring
webhook_urlstring
signing_secretstring
has_webhookboolean
hintstring
POST/api/emails/{address}/webhook/test

Tester 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Réponse 200

addressstring
webhook_urlstring
statusinteger
successboolean
hintstring
GET/api/emails/{address}/aliases

Ré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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Réponse 200

mailboxstring
aliasesobject[]
hintstring
POST/api/emails/{address}/aliases

Ajouter 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Corps de la demande

alias*stringAdresse d'alias - un slug nu ou un slug@domain complet sur le même domaine

Réponse 201

addressstring
mailboxstring
created_atstring (date-time)
hintstring
DELETE/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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
alias*stringAdresse d'alias à supprimer (codée en URL ou simple slug)

Réponse 200

addressstring
deletedboolean
hintstring
GET/api/emails/{address}/client-settings

Obtenir 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*stringAdresse de la boîte aux lettres hébergée (codée en URL)

Réponse 200

mailboxstring
usernamestring
imapobject
smtpobject
hintstring
GET/api/emails/{address}/credentials

Ré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*stringAdresse de la boîte aux lettres hébergée (codée en URL)

Réponse 200

mailboxstring
credentialsobject[]
hintstring
POST/api/emails/{address}/credentials

Cré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*stringAdresse de la boîte aux lettres hébergée (codée en URL)

Corps de la demande

labelstringÉtiquette pour identifier le mot de passe de cette application, par ex. "Courrier sur ordinateur portable"

Réponse 201

idstring
labelstring
passwordstringLe mot de passe de l'application : affiché une fois, stockez-le maintenant
client_settingsobject
hintstring
DELETE/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*stringAdresse de la boîte aux lettres hébergée (codée en URL)
id*stringIdentifiant du mot de passe de l'application (à partir du point de terminaison de la liste)

Réponse 200

idstring
revokedboolean
hintstring
POST/api/emails/{address}/messages/{id}/escalate

Signaler 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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
id*stringIdentifiant du message à signaler

Corps de la demande

reasonstringPourquoi l’humain est nécessaire - affiché dans la notification
clearbooleanRetirer le signalement au lieu de le poser (l’humain a pris le relais)

Réponse 200

idstring
needs_humanboolean
escalation_reasonstring | null
thread_keystring
POST/api/emails/{address}/messages/{id}/remind

Dé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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
id*stringIdentifiant du message à surveiller

Corps de la demande

remind_atstring (date-time)Heure ISO 8601 du rappel (de 1 minute à 90 jours à l’avance)
notestringContexte affiché lorsque le rappel se déclenche
clearbooleanEffacer un rappel en attente

Réponse 200

idstring
remind_atstring | null
reminder_notestring | null
GET/api/contacts

Ré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

qstringFiltrer par sous-chaîne d’adresse ou de nom
limitintegerContacts à renvoyer (50 par défaut)
cursorstringCurseur de pagination d'une réponse précédente
orderstring(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

contactsobject[]
next_cursorstring | null
POST/api/contacts

Cré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*stringL’adresse e-mail du contact
namestring | nullNom d’affichage (null l’efface)
notesstring | nullNotes que les agents et les humains lisent pour le contexte (null les efface)
DELETE/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*stringL’adresse e-mail du contact (encodée en URL)
GET/api/emails/{address}/rules

Ré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*stringAdresse e-mail de la boîte aux lettres (codée en URL)

Réponse 200

mailboxstring
rulesMailRule[]
hintstring
POST/api/emails/{address}/rules

Ajouter 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*stringAdresse 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_argstringAdresse de transfert (pour forward), valeur d’étiquette (pour label) ou raison affichée à l’humain (pour escalate)
priorityintegerLes exécutions inférieures en premier (0 par défaut)
enabledbooleanVrai par défaut

Réponse 201

idstring
priorityintegerAbaisser les pistes en premier
match_fieldstring
match_opstring
match_valuestring
actionstring
action_argstring | null
enabledboolean
created_atstring (date-time)
DELETE/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*stringAdresse e-mail de la boîte aux lettres (codée en URL)
ruleId*stringL'identifiant de la règle

Réponse 200

idstring
deletedboolean
hintstring
PUT/api/domains/{domain}/email/catch-all

Dé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*stringNom de domaine

Corps de la demande

mailbox*stringBoîte aux lettres fourre-tout - un simple slug ou une adresse complète sur ce domaine

Réponse 200

domainstring
catch_allstring | null
hintstring
DELETE/api/domains/{domain}/email/catch-all

Effacer 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*stringNom de domaine

Réponse 200

domainstring
catch_allstring | null
hintstring
GET/api/email/changes

Synchroniser 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
cursorstringnext_cursor opaque à partir d'une réponse précédente
limitinteger

Réponse 200

changesMailboxChange[]
next_cursorstring
has_moreboolean
requires_full_syncboolean
reasonstring
GET/api/suppressions

Liste 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

cursorstringCurseur de pagination d'une réponse précédente
limitintegerNombre maximum d'entrées (50 par défaut, 100 maximum)

Réponse 200

suppressionsobject[]
next_cursorstring | null
hintstring
POST/api/suppressions

Ajouter 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*stringAdresse e-mail à supprimer
reasonstring(manual | hard_bounce | complaint)Raison (par défaut : manuel)

Réponse 201

addressstring
reasonstring
sourcestring
created_atstring (date-time)
hintstring
DELETE/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*stringAdresse e-mail supprimée (codée en URL)

Réponse 200

addressstring
deletedboolean
hintstring

Collaboration

POST/api/workspaces/{id}/ownership-transfer

Demander 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
DELETE/api/workspaces/{id}/ownership-transfer/{transferId}

Révoquer un transfert de propriété en attente

Paramètres

id*string
transferId*string
POST/api/workspaces/ownership-transfers/accept

Accepter 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

POST/api/auth/registerPublique

Cré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)
refstringCode de parrainage - relie en permanence cet utilisateur au référent. Le parrain gagne une commission sur chaque achat de domaine.

Réponse 202

okboolean
verification_requiredboolean
messagestring
hintstring
next_stepsstring[]

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"}'
POST/api/auth/loginPublique

Envoyer 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

okboolean
messagestring

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"}'
POST/api/auth/handoff

Gé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

urlstring

Exemple de réponse

{
  "url": "https://mailzero.run/auth/handoff#code=xxx&next=%2Finbox"
}
POST/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

okboolean
nextstring

Exemple de réponse

{
  "ok": true,
  "next": "/inbox"
}

Compte

GET/api/me

Obtenir 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

idstring
emailstring (email)
planstringClé du plan Domani personnel actif
workspace_plansstring[]Clés actives distinctes du plan Mailzero sur les espaces de travail auxquels l'utilisateur peut accéder
has_payment_methodbooleanSi l'utilisateur a une carte enregistrée (obligatoire avant d'acheter des domaines)
preferred_payment_methodstring | null
preferred_localestringParamètres régionaux utilisés par les interfaces Domani et les communications transactionnelles
has_contactbooleanIndique 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.
contactRegistrantContactCoordonnées du titulaire (nulles si non définies)
referral_codestringVotre code de parrainage unique
referral_rateintegerPourcentage de commission sur les achats référés
balancenumberSolde créditeur du marché en USD (revenu des ventes)
domain_countintegerNombre de domaines possédés
token_countintegerNombre de jetons API actifs
featuresstring[]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_assistantbooleanIndique 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_adminboolean
mailbox_entitlementobjectPlace 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_atstring (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"
PUT/api/me

Mettre à 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_methodstring | null(card | usdc)Mode de paiement par défaut pour les achats (card, usdc ou null pour la sélection automatique)
preferred_localestring(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_methodstring | null
preferred_localestring
hintstring
DELETE/api/me

Supprimer 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

deletedboolean
hintstring
GET/api/me/activation

Obtenez 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

versioninteger
account_created_atstring (date-time)
entryobject
milestonesobject
statusstring
recommended_actionsobject[]
available_pathsstring[]
dismissed_versioninteger
pending_claimobject | null

Exemple

curl https://domani.run/api/me/activation \
  -H "Authorization: Bearer domani_sk_xxx"
PUT/api/me/activation

Ignorer 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_versioninteger
hintstring
GET/api/me/contact

Obtenir 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_contactboolean
contactRegistrantContact

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"
PUT/api/me/contact

Dé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

contactRegistrantContact

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"}'
POST/api/me/resend-verification

Renvoyer 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

emailstring (email)Adresse e-mail à vérifier (par défaut, l'adresse e-mail de contact du compte)

Réponse 200

sentboolean
already_verifiedboolean
hintstring
GET/api/sessions

Lister 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

sessionsobject[]
hintstring

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"
DELETE/api/sessions

Dé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

revokedinteger
hintstring

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"
DELETE/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*stringIdentifiant de la session (issu de GET /api/sessions), ou `current`

Réponse 200

successboolean
currentbooleanVrai lorsque l'appelant s'est lui-même déconnecté : sa clé ne fonctionne plus
hintstring

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

GET/api/agents/identity/{slug}/tokens

Lister 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*stringL'identifiant de l'identité agent.
POST/api/agents/identity/{slug}/tokens

Donner à 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*stringL'identifiant de l'identité agent.

Corps de la demande

namestringPar défaut '<slug> agent'.
scopesstring[]Par défaut assistant:read, assistant:write, email:read, email:write. Ne peut pas dépasser les scopes de l'appelant.
mailboxesstring[]Adresses de boîtes mail auxquelles le jeton est confiné. Par défaut les boîtes mail que l'agent opère.
expires_inintegerSecondes jusqu'à expiration (max un an).

Réponse 201

successboolean
tokenobject
agentobject
hintstring

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"}'
DELETE/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

successboolean
hintstring
GET/api/tokens

Listez 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

tokensTokenInfo[]

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"
POST/api/tokens

Cré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

namestringNom lisible par l'homme pour identifier ce jeton
expires_inintegerDurée de vie du jeton en secondes (min 3600 = 1h, max 31536000 = 1an). Omettre pour aucune expiration.
expires_atstring (date-time)Date de péremption absolue (ISO 8601). Alternative à expires_in.
scopesstring[]É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_txnumberPlafond 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_monthnumberPlafond de dépenses mensuel glissant en USD pour toutes les opérations payantes effectuées avec ce jeton.
agent_identity_idstringID 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_policyobjectAutorité structurée requise pour un jeton à étendue restreinte disposant de http-routes:read ou http-routes:write.
mailboxesstring[]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

idstring
namestring
keystringClé API complète : enregistrez-la, elle ne s'affichera plus
expiresAtstring (date-time) | nullQuand ce jeton expire (null = jamais)
scopesstring[]Étendues d'autorisation accordées à ce jeton
createdAtstring (date-time)
max_per_txnumber | nullPlafond de dépenses par transaction en USD (nul = non plafonné)
max_per_monthnumber | nullPlafond de dépenses mensuelles en USD (nul = non plafonné)
mailbox_idsstring[]Identifiants de boîtes aux lettres auxquels ce jeton est confiné
http_route_policyHttpRoutePolicy
agent_identityobject | 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"}'
DELETE/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*stringID de jeton (à partir de la réponse GET /api/tokens)

Réponse 200

successboolean

Exemple de réponse

{
  "success": true
}

Exemple

curl -X DELETE https://domani.run/api/tokens/cm5abc123 \
  -H "Authorization: Bearer domani_sk_xxx"
GET/api/audit

Ré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

limitintegerÉvénements par page
cursorstringCurseur de pagination (next_cursor de la page précédente)
typestringFiltrer par type d'événement (par exemple token.created, Purchase.charged, Purchase.denied_cap)

Réponse 200

eventsobject[]
next_cursorstring | null
hintstring

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

GET/api/webhooks

Ré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

webhooksobject[]
hintstring

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"
POST/api/webhooks

Cré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.
headersobjectEn-têtes d’authentification chiffrés facultatifs. Seules l'autorisation et la X-API-Key sont acceptées.

Réponse 200

idstring
urlstring (uri)
eventsstring[]
secretstringSecret de signature HMAC-SHA256 (affiché une fois)
activeboolean
header_namesstring[]Noms d'en-tête d'authentification configurés ; les valeurs ne sont jamais renvoyées
created_atstring (date-time)
hintstring

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"}}'
PATCH/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*stringIdentifiant du webhook

Corps de la demande

urlstring (uri)Nouvelle URL HTTPS
eventsstring[]Nouvelle liste de types d'événements
activebooleanDéfinir false pour mettre en pause, true pour reprendre
headersobjectRemplacez 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

idstring
urlstring (uri)
eventsstring[]
activeboolean
header_namesstring[]Noms d'en-tête d'authentification configurés ; les valeurs ne sont jamais renvoyées
hintstring
DELETE/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*stringIdentifiant du webhook

Réponse 200

successboolean
hintstring
GET/api/webhooks/{id}/deliveries

Lister 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*stringIdentifiant du webhook
limitintegerNombre maximal de transmissions à renvoyer

Réponse 200

deliveriesobject[]
hintstring

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."
}
POST/api/webhooks/{id}/deliveries/{deliveryId}/replay

Rejouer 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*stringIdentifiant du webhook
deliveryId*stringID de la transmission d’origine

Corps de la demande

idempotency_key*string

Réponse 200

delivery_idstring
original_delivery_idstring
event_typestring
statusstring
http_statusinteger | null
attemptsinteger
idempotency_keystring
idempotent_replayboolean
created_atstring (date-time)
hintstring
GET/api/webhooks/events

Ré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

eventsobject[]

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

GET/api/notifications

Liste 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

limitintegerNombre maximum de notifications à retourner
cursorstringCurseur de pagination (à partir du next_cursor de la réponse précédente)

Réponse 200

notificationsobject[]
has_moreboolean
next_cursorstring | null
GET/api/notifications/count

Obtenez 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_countinteger

Exemple de réponse

{
  "unread_count": 3
}
PATCH/api/notifications/{id}

Marquer la notification comme lue

Marquer une seule notification comme lue. Nécessite la portée notifications:read.

Paramètres

id*stringID de notification

Corps de la demande

read*booleanDéfinir sur true pour marquer comme lu

Réponse 200

okboolean
POST/api/notifications/read-all

Marquer toutes les notifications comme lues

Marquez toutes les notifications non lues comme lues. Nécessite la portée notifications:read.

Réponse 200

okboolean
countintegerNombre de notifications marquées comme lues
GET/api/notifications/preferences

Obtenir 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

preferencesobject[]
expiry_alert_daysinteger[]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.
PUT/api/notifications/preferences

Mettre à 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

preferencesobject[]
expiry_alert_daysinteger[]Quelques jours avant l'expiration pour recevoir des rappels de renouvellement. Tableau vide = aucun rappel d'expiration.

Réponse 200

okboolean

TLD

GET/api/tldsPublique

Obtenir 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_pricenumberPrix d'inscription maximum en USD
min_pricenumberPrix minimum d'inscription en USD
sortstring(tld | price | renewal)Champ de tri - « tld » (alphabétique), «price» (inscription) ou «renewal»
orderstring(asc | desc)Ordre de tri
searchstringFiltrer les noms de TLD contenant cette chaîne
limitintegerNombre maximum de résultats par page
offsetintegerNombre de résultats à ignorer
kindstringTypes à 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

tldsTldInfo[]
totalintegerTotal de TLD correspondants (avant pagination)
offsetinteger
limitinteger | 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

Domaines

GET/api/domains

Listez 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

domainsDomainRecord[]

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"
POST/api/agents/identity

Ré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*stringLe handle - devient <slug>.domani.run
namestringNom d'affichage
biostring
emojistringEmoji avatar
emailstring (email)Contact public (par exemple, votre boîte de réception gratuite @domani.run)
linksobject[]

Réponse 200

idstringID d'identité stable utilisé pour lier les jetons d'API étendus
slugstring
urlstringLe sous-domaine identité (canonique)
page_urlstringChemin de secours qui fonctionne toujours
namestring | null
biostring | null
emojistring | null
emailstring | null
linksobject[]
viewsinteger
created_atstring (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": "🤖"}'
GET/api/agents/identity

Ré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

identitiesAgentIdentity[]
PATCH/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*stringLe handle à mettre à jour

Corps de la demande

namestring
biostring
emojistring
emailstring
linksobject[]

Réponse 200

idstringID d'identité stable utilisé pour lier les jetons d'API étendus
slugstring
urlstringLe sous-domaine identité (canonique)
page_urlstringChemin de secours qui fonctionne toujours
namestring | null
biostring | null
emojistring | null
emailstring | null
linksobject[]
viewsinteger
created_atstring (date-time)
DELETE/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*stringLa poignée pour libérer

Réponse 200

successboolean
slugstring
releasedboolean
POST/api/agents/provision

Fournir 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*stringDomaine à donner à l'agent. Acheté s'il n'est pas déjà possédé.
slugstringPartie locale de la boîte aux lettres (hi@domain). Valeur par défaut : 'hi'.
namestringNom d’affichage du courrier électronique sortant.
webhook_urlstring (uri)URL HTTPS facultative pour recevoir les e-mails entrants + les événements de domaine.
webhook_headersobjectAuthentification d’acheminement facultative. Les valeurs sont chiffrées au repos et ne sont jamais renvoyées ; les réponses exposent uniquement header_names.
webhook_eventsstring[]Types d’événements Webhook. La valeur par défaut est email.received/delivered/bounced.
payment_methodstring(card | usdc | balance)Comment payer le domaine.
payment_txstringHachage USDC tx (flux en deux étapes).
payment_chainstring(base | ethereum)
yearsinteger
max_pricenumberPlafond 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

domainstring
domain_statusstring
mailboxobject | null
webhookobject | null
warningsstring[]
hintstring
next_stepsstring[]

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"}}'
POST/api/domains/buy

Acheter 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

domainstringDomaine unique à acheter (par exemple monsite.com)
domainsstring[]Gamme de domaines à acheter (max 10, nécessite une carte au dossier)
payment_methodstring(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_txstringHachage 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_chainstring(base | ethereum)Chaîne sur laquelle le paiement USDC a été envoyé (par exemple « base » ou « ethereum »).
yearsintegerNombre d'années pour s'inscrire (1-10, par défaut 1). Le prix est multiplié par années.
max_pricenumberPlafond 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.
refstringCode 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"}'
GET/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*stringNom de domaine que vous possédez

Réponse 200

domainstring
statusstring
auto_renewbooleanSi le renouvellement automatique est activé
purchased_atstring (date-time)
expires_atstring (date-time)
days_until_expiryintegerJours avant l'expiration du domaine
renewal_pricenumber | nullLe 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_methodstringComment le domaine a été payé
payment_txstring | nullHachage d'émission en chaîne (paiements USDC)
registrantstringQui 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_outobjectTransfert 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_statusstringSi les données du bureau d'enregistrement en direct ont été actualisées ou sont gérées en externe
registrar_checked_atstring (date-time)Lorsque l'actualisation du bureau d'enregistrement a été tentée
registrarobject | nullDé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"
PUT/api/domains/{domain}/settings

Mettre à 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*stringNom de domaine que vous possédez

Corps de la demande

auto_renewbooleanS'il faut activer le renouvellement automatique pour ce domaine
whois_privacybooleanS'il faut activer la protection de la confidentialité WHOIS
security_lockbooleanS'il faut verrouiller le domaine contre les transferts

Réponse 200

domainstring
auto_renewboolean
whois_privacyboolean
security_lockboolean
hintstring

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}'
PUT/api/domains/{domain}/parking

Mettre à 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*stringNom de domaine

Corps de la demande

enabledbooleanS'il faut activer la page de parking
listing_pricenumber | nullPrix de vente en USD, ou nul pour supprimer l'annonce

Réponse 200

domainstring
parking_enabledboolean
listing_pricenumber | null
hintstring
PUT/api/domains/{domain}/redirect

Transfé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*stringNom de domaine

Corps de la demande

url*stringURL cible (ou domaine nu) vers laquelle transférer, par ex. https://brand.dev
permanentbooleanvrai = permanent (308, par défaut), faux = temporaire (307)

Réponse 200

domainstring
redirect_urlstring | null
permanentboolean
DELETE/api/domains/{domain}/redirect

Arrê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*stringNom de domaine

Réponse 200

domainstring
redirect_urlstring | null
PUT/api/domains/{domain}/for-sale

Mettre 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*stringNom de domaine à mettre en vente

Corps de la demande

price*numberPrix de vente en USD
descriptionstringDescription de l'annonce facultative

Réponse 200

listingobject
hintstring

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."
}
PATCH/api/domains/{domain}/for-sale

Mettre à 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*stringNom de domaine avec mise en vente active

Corps de la demande

pricenumberNouveau prix de vente en USD
descriptionstring | nullNouvelle description (nul à effacer)

Réponse 200

listingobject
hintstring

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."
}
DELETE/api/domains/{domain}/for-sale

Annuler 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*stringNom de domaine à délister

Réponse 200

domainstring
statusstring
hintstring

Exemple de réponse

{
  "domain": "example.com",
  "status": "cancelled",
  "hint": "Listing for example.com has been cancelled."
}
GET/api/domains/{domain}/analytics

Obtenez 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*stringNom de domaine

Réponse 200

domainstring
views_7dintegerNombre total de pages vues au cours des 7 derniers jours
views_30dintegerNombre total de pages vues au cours des 30 derniers jours
inquiries_30dintegerNombre total de demandes au cours des 30 derniers jours
conversion_ratenumberTaux de requêtes/vues en pourcentage
daily_viewsobject[]Nombre de vues quotidiennes au cours des 30 derniers jours
recent_inquiriesobject[]5 demandes les plus récentes
hintstring

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)."
}
GET/api/domains/{domain}/auth-code

Obtenir 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*stringNom de domaine que vous possédez

Réponse 200

domainstring
statusstring`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_codestring | nullCode d'authentification EPP à donner au nouveau bureau d'enregistrement. null tant que le statut est requested.
was_unlockedbooleanSi le domaine a été déverrouillé pour permettre le transfert
requested_atstring (date-time)Date de la demande du code (bureaux d'enregistrement sans API pour ce code)
expected_bystring (date-time)Date à laquelle l'équipe Domani aura le code au plus tard (statut requested)
hintstring
next_stepsstring[]
GET/api/domains/{domain}/transfer-away

Obtenir 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*stringNom de domaine que vous possédez

Réponse 200

domainstring
statusstring
gaining_registrarstring
request_datestring (date-time)
hintstring
GET/api/domains/{domain}/transfer-status

Vé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*stringNom de domaine que vous possédez

Réponse 200

domainstring
statusstring
timestampstringHorodatage de la dernière mise à jour du statut
hintstringConseils exploitables basés sur l’état actuel
continuityobjectDélégation capturée et vérification post-transfert pour des transferts sécurisés.
POST/api/domains/import

Importer 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*stringDomaine à importer

Réponse 200

domainstring
statusstring
tokenstring
txt_recordobject
hintstring
POST/api/domains/import/verify

Vé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*stringDomaine à vérifier

Réponse 201

domainstring
statusstring
expiresstring (date-time)
registrarstring
payment_methodstring
hintstring
GET/api/domains/adoption-plan

Planifier 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*stringDomaine existant à inspecter, par ex. monsite.com

Réponse 200

versioninteger
domainstring
registeredboolean
account_statestring
recommended_actionstring
currentobject
optionsobject
invariantsstring[]
warningsstring[]
GET/api/domains/transfer-check

Vé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*stringDomaine à vérifier, par ex. monsite.com

Réponse 200

domainstring
tldstring
eligibleboolean
pricenumber | nullPrix de transfert en USD (nul si TLD non pris en charge)
currencystring
renewal_pricenumberUniquement 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.
reasonstringRaison lisible par l'homme si non éligible
codestring
eligible_atstring (date)Date ISO à laquelle le domaine devient éligible (délai d'attente ICANN)
hintstring
POST/api/domains/transfer-watch

Surveiller 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*stringDomaine à surveiller, par ex. monsite.com

Réponse 200

domainstring
eligiblebooleanSi le domaine est actuellement éligible au transfert
eligible_atstring (date)Date ISO à laquelle le domaine devient éligible (s'il n'est pas encore éligible)
hintstringDes conseils pratiques
watchingbooleanSi une notification a été configurée
POST/api/domains/transfer

Transfé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*stringDomaine à transférer, par ex. monsite.com
auth_code*stringCode d'autorisation/EPP du fournisseur actuel
payment_methodstring(card | usdc | balance)Mode de paiement : «card» (par défaut), «usdc» ou «balance» (crédit du marché).
payment_txstringHachage de transaction d'un paiement USDC déjà envoyé en chaîne.
payment_chainstring(base | ethereum)Chaînez le paiement USDC a été envoyé.
extra_subdomainsstring[]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_pricenumberPlafond 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

domainstring
statusstring
expiresstring (date-time)
pricenumber
currencystring
payment_methodstring
payment_txstring
auto_renewboolean
hintstring
dns_snapshotobjectRé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_preservedboolean
dns_migrationstring
continuityobject

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"}'
POST/api/domains/{domain}/renew

Renouveler 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*stringNom de domaine que vous possédez

Corps de la demande

yearsintegerNombre d'années à renouveler (par défaut 1)
payment_methodstring(card | usdc | balance)Mode de paiement : «card» (par défaut), «usdc» ou «balance» (crédit du marché).
payment_txstringHachage de transaction d'un paiement USDC déjà envoyé en chaîne.
payment_chainstring(base | ethereum)Chaînez le paiement USDC a été envoyé.
max_pricenumberPlafond 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

domainstring
renewed_yearsinteger
new_expirystring (date-time)
pricenumber
currencystring
payment_methodstring
payment_txstring

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}'
POST/api/domains/{domain}/buy-aftermarket

Acheter 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*stringLe domaine du marché secondaire à acheter

Corps de la demande

max_pricenumberPlafond 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_methodstring(card | usdc | balance)Mode de paiement : «card» (par défaut), «usdc» ou «balance» (crédit du marché).
payment_txstringHachage de transaction d'un paiement USDC déjà envoyé en chaîne.
payment_chainstring(base | ethereum)Chaînez le paiement USDC a été envoyé.

Réponse 201

domainstring
statusstring'active' lorsque l’achat est terminé, ou 'provisioning' pendant la finalisation d’un transfert par étapes.
pricenumber
currencystring
payment_methodstring
payment_txstring
marketplacestringMarché secondaire sur lequel le domaine a été acheté (par exemple « Afternic », « Sedo »).
hintstring
next_stepsstring[]

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

GET/api/domains/{domain}/dns

Obtenez 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*stringNom de domaine que vous possédez

Réponse 200

domainstring
recordsDnsRecord[]
zone_versionstringJeton 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"
PUT/api/domains/{domain}/dns

Dé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*stringNom de domaine que vous possédez

Corps de la demande

records*DnsRecord[]
zone_versionstringLa 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

successboolean
domainstring
recordsDnsRecord[]

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}
  ]}'
GET/api/domains/{domain}/dnssec

Ré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*stringNom de domaine que vous possédez

Réponse 200

domainstring
enabledbooleanVrai lorsqu'au moins un enregistrement DS est publié
recordsDsRecord[]

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"
POST/api/domains/{domain}/dnssec

Publier 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*stringNom de domaine que vous possédez

Réponse 200

successboolean
domainstring
enabledboolean
recordsDsRecord[]

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..."}'
DELETE/api/domains/{domain}/dnssec

Supprimer 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*stringNom de domaine que vous possédez
keyTag*stringBalise clé de l'enregistrement DS à supprimer

Réponse 200

successboolean
domainstring
enabledboolean
recordsDsRecord[]

Exemple

curl -X DELETE "https://domani.run/api/domains/mysite.com/dnssec?keyTag=12345" \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/domains/{domain}/dns/snapshot

Capturer 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*stringNom de domaine que vous possédez

Corps de la demande

extra_subdomainsstring[]Sous-domaines supplémentaires à inclure dans l'instantané

Réponse 200

domainstring
recordsDnsRecord[]
subdomainsstring[]
sourcesstring[]
capturedAtstring (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"
POST/api/domains/{domain}/dns/restore

Restaurer 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*stringNom de domaine que vous possédez

Corps de la demande

snapshotobjectUn 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_runbooleanAperçu uniquement : renvoie ce que la restauration créerait (would_apply) et ignorerait, sans rien écrire.

Réponse 200

domainstring
appliedintegerNombre d'enregistrements créés
skippedintegerNombre d'enregistrements déjà présents
recordCountintegerNombre total d'enregistrements dans l'instantané
errorsstring[]
dry_runbooleanC'est vrai quand il s'agissait d'un aperçu - rien n'était écrit
would_applyDnsRecord[]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"
POST/api/domains/{domain}/dns/clone

Cloner 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*stringDomaine cible (le DNS est écrit ici)

Corps de la demande

from*stringDomaine source à partir duquel copier le DNS (doit être le vôtre)
replacebooleanMiroir exact : supprimez les enregistrements cibles que la source n'a pas. Par défaut : fusionner

Réponse 200

successboolean
from_domainstring
to_domainstring
recordsDnsRecord[]

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"}'
GET/api/domains/{domain}/nameservers

Obtenir 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*stringNom de domaine que vous possédez

Réponse 200

domainstring
nameserversstring[]
default_nameserversstring[]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_providerstringQui 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é
hintstring

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"
PUT/api/domains/{domain}/nameservers

Dé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*stringNom 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

successboolean
domainstring
nameserversstring[]
hintstring

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

POST/api/domains/{domain}/connect

Connecter 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*stringNom de domaine que vous possédez

Corps de la demande

targetstringURL cible pour la détection automatique (par exemple my-app.vercel.app)
providerstringNom explicite du fournisseur (par exemple, vercel, google-workspace)
methodstringMéthode de connexion si le fournisseur en a plusieurs (par exemple, cname uniquement)
dry_runbooleanAperçu uniquement : renvoie le diff (create/replace/already_set/keep) sans rien écrire.
confirm_replace_mxbooleanObligatoire 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

domainstring
providerstring
categorystring
methodstring
recordsDnsRecord[]
docsstring (uri)
statusstringdns_set = enregistrements écrits automatiquement. manual_setup_required = domaine importé, ajoutez des enregistrements chez votre registraire. dry_run = aperçu uniquement, rien d'écrit.
hintstring
next_stepsstring[]Actions spécifiques au fournisseur à effectuer une fois les enregistrements DNS définis
diffobjectSimulation 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"}'
GET/api/domains/{domain}/connect

Liste 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*stringNom de domaine que vous possédez

Réponse 200

domainstring
providersobject
POST/api/domains/{domain}/verify

Vé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*stringNom de domaine que vous possédez

Corps de la demande

targetstringCible pour la détection automatique
providerstringNom du fournisseur
methodstringNom de la méthode

Réponse 200

domainstring
providerstring
methodstring
verifiedboolean
messagestring
hintstring
next_stepsstring[]É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

GET/api/domains/{domain}/status

Vé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*stringNom de domaine que vous possédez

Réponse 200

domainstring
statusstring
expiresstring (date-time)
days_until_expiryinteger
dnsobject
sslobject
emailobject

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

POST/api/domains/{domain}/verify-service

Ajoutez 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*stringNom de domaine que vous possédez

Corps de la demande

service*stringNom du service (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365)
token*stringJeton de vérification fourni par le service

Réponse 200

domainstring
servicestring
service_display_namestring
known_serviceboolean
records_addedDnsRecord[]
total_recordsinteger
docsstring (uri) | null
hintstring

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"}'
GET/api/domains/{domain}/verify-service

Ré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*stringNom de domaine que vous possédez

Réponse 200

domainstring
servicesobject[]
hintstring

Découverte

GET/api/domains/{domain}/profilePublique

Obtenez 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

profilePublicDomainProfile
POST/api/domains/{domain}/profilePublique

Rechercher 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
depthstring(instant | deep)Profondeur de la recherche. La valeur par défaut est profonde.

Réponse 201

profilePublicDomainProfile
GET/api/domains/whoisPublique

Rechercher 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*stringDomaine à rechercher (par exemple, example.com)

Réponse 200

domainstring
registeredbooleanSi le domaine est actuellement enregistré
registrarstring | nullNom actuel du registraire
registrar_urlstring | nullURL du site Web du registraire
registrar_iana_idstring | nullID IANA du bureau d’enregistrement (à partir des publicIds RDAP)
createdstring | nullDate d’inscription (YYYY-MM-DD)
expiresstring | nullDate d’expiration (YYYY-MM-DD)
updatedstring | nullDate de dernière mise à jour (YYYY-MM-DD)
days_until_expiryinteger | nullJours jusqu'à expiration (nul si non enregistré)
statusstring[]Codes de statut EPP
nameserversstring[]Serveurs de noms faisant autorité
dnssecbooleanSi DNSSEC est activé
redactedbooleanSi les données WHOIS/RDAP sont masquées pour des raisons de confidentialité (RGPD)
contactsobjectCoordonné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"
GET/api/domains/{domain}/ogPublique

Obtenir 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*stringDomaine pour lequel récupérer les métadonnées (par exemple, google.com)

Réponse 200

titlestring | nullTitre de la page (og:title > twitter:title > <titre>)
descriptionstring | nullDescription de la page (og:description > méta description)
imagestring | nullURL de l'image OG (absolue)
faviconstring | nullURL du favicon (absolu)

Exemple

curl "https://domani.run/api/domains/google.com/og"

Facturation

POST/api/billing/setup

Obtenir 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

modestring(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

urlstring (uri)URL Stripe Checkout - ouvrez-la dans un navigateur pour ajouter une carte
client_secretstringSecret client Stripe SetupIntent, pour un frontend utilisant Stripe.js directement
hintstringConseils 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"
DELETE/api/billing/card

Supprimer 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

removedboolean

Exemple de réponse

{
  "removed": true
}

Exemple

curl -X DELETE https://domani.run/api/billing/card \
  -H "Authorization: Bearer domani_sk_xxx"
GET/api/billing/connect

Obtenez 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

onboardedbooleanLe vendeur a soumis les détails d'intégration de Connect
payouts_enabledbooleanLes paiements bancaires sont actifs
details_submittedboolean
balance_centsintegerSolde 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"
POST/api/billing/connect

Commencer 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

urlstring (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"
POST/api/billing/connect/payout

Retirer 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_centsintegerMontant transféré en centimes
transfer_idstringIdentifiant 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"
GET/api/billing/invoices

Liste 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

limitintegerMax factures à retourner

Réponse 200

invoicesobject[]
has_moreboolean
hintstring

Exemple

curl https://domani.run/api/billing/invoices \
  -H "Authorization: Bearer domani_sk_xxx"

Références

GET/api/referrals

Obtenez 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_codestringVotre code de parrainage unique à partager
referral_rateintegerPourcentage de commission (actuellement 20%)
total_earned_centsintegerGains totaux en centimes
total_paid_centsintegerTotal payé en centimes
total_pending_centsintegerPaiement en attente en centimes
referralsobject[]

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

POST/api/backorders

Passer 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*stringDomaine actuellement enregistré à surveiller et à tenter d’enregistrer lors de sa libération.
max_pricenumberMontant maximal en USD que vous paierez pour l’enregistrer. Par défaut, le prix d’enregistrement actuel. Doit être >= au prix actuel.
payment_methodstring(card | balance)Mode de paiement à utiliser si l’enregistrement réussit. Par défaut, votre moyen préféré.

Réponse 201

backorderBackorder
hintstring

Exemple

curl -X POST https://domani.run/api/backorders \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"domain": "taken.com"}'
GET/api/backorders

Listez vos précommandes

Renvoie vos backorders, du plus récent au plus ancien. Filtrez par status (watching, caught, failed, cancelled, expired).

Paramètres

statusstring(watching | caught | failed | cancelled | expired)Filtrer par statut.

Réponse 200

backordersBackorder[]
GET/api/backorders/{id}

Obtenez une précommande

Paramètres

id*stringID de précommande.

Réponse 200

backorderBackorder
DELETE/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*stringID de précommande.

Réponse 200

idstring
statusstring
hintstring

Marché

POST/api/domains/sell

Mettre 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*stringNom de domaine à mettre en vente
price*numberPrix de vente en USD
descriptionstringDescription de l'annonce facultative

Réponse 201

listingobject
txt_recordobject | nullEnregistrement TXT à ajouter pour la vérification de la propriété (uniquement pour les domaines externes)
hintstring
POST/api/domains/sell/verify

Vé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*stringNom de domaine à vérifier

Réponse 200

listingobject
hintstring
GET/api/domains/sell/status

Vé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*stringNom de domaine à vérifier

Réponse 200

listingobject | null
dealobject | null
hintstring
GET/api/deals

Listez 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

rolestring(buyer | seller)Filtrer par rôle
statusstring(active | escrow_held | epp_pending | transfer_started | completed | refunded | expired)Filtrer par statut («active» = tous les non-terminaux)
domainstringFiltrer par nom de domaine
limitintegerNombre d'transactions à renvoyer (50 par défaut, 100 maximum)
cursorstringCurseur de pagination d'une réponse précédente

Réponse 200

dealsobject[]
has_morebooleanSi d'autres résultats sont disponibles
next_cursorstring | nullCurseur pour la page suivante
POST/api/deals

Acheter 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*stringNom de domaine à acheter
payment_methodstring(card | usdc | balance)Mode de paiement : «card» (par défaut), «usdc» ou «balance» (crédit du marché).

Réponse 201

dealobject
hintstring
next_stepsstring[]
GET/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*stringID de la transaction

Réponse 200

dealobject
hintstring
PATCH/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*stringID de la transaction

Corps de la demande

auth_code*stringCode EPP/autorisation du registraire actuel

Réponse 200

dealobject
hintstring
GET/api/deals/{id}/invoice

Obtenez 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

invoiceDealInvoice
GET/api/negotiations

Listez 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

rolestring(buyer | seller)Filtrer par votre rôle
statusstringFiltrer par statut (open|agreed|completed|declined|expired|cancelled|all)

Réponse 200

negotiationsNegotiation[]
POST/api/negotiations

Faire 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*stringLe domaine mis en vente sur lequel négocier
offer*numberOffre initiale en USD
messagestringMessage facultatif au vendeur

Réponse 201

negotiationNegotiation

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}'
GET/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

negotiationNegotiation
POST/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)
counternumberNouveau montant en USD (obligatoire lorsque action=counter)
messagestring

Réponse 200

negotiationNegotiation
DELETE/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

cancelledboolean
POST/api/negotiations/{id}/finalize

Finaliser 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_methodstring(card | usdc | balance)
payment_signaturestring | null
payment_txstring
payment_chainstring
confirm_over_budgetbooleanPour les transactions de courtier : continuez même si le prix convenu dépasse le max_budget que vous avez défini.
GET/api/broker

Lister vos demandes de courtier

Répertorie vos demandes d'acquisition de domaine et leur statut. Nécessite la portée deals:read.

Paramètres

statusstringFiltrer par statut ou «all»

Réponse 200

requestsBrokerRequest[]
POST/api/broker

Demander 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*stringLe domaine déjà enregistré que vous souhaitez
max_budgetnumberVotre plafond en USD (facultatif)

Réponse 201

requestBrokerRequest

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}'
GET/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

requestBrokerRequest
DELETE/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

cancelledboolean
GET/api/broker/respondPublique

Lire 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*stringLe jeton de sensibilisation de votre e-mail de demande.

Réponse 200

domainstring
statusstring
your_turnbooleanQue ce soit le déménagement du propriétaire.
current_offer_usdnumber | nullL'offre de l'acheteur sur la table.
agreed_price_usdnumber | null
actionsstring[]Actions disponibles maintenant (sous-ensemble de offer/counter/accept/decline/opt_out).

Exemple

curl "https://domani.run/api/broker/respond?token=<from your inbox>"
POST/api/broker/respondPublique

Ré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*stringLe 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é.
pricenumberVotre prix demandé en USD (obligatoire pour l'offre/le comptoir).

Réponse 200

handledboolean
outcomestringValeurs d’état : opted_out | declined | negotiation_opened | countered | ignored_not_your_turn | unclear
statusstring
negotiation_idstring
domainstring

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

POST/api/oauth/register

Enregistrer 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_namestringAffiché sur l’écran de consentement
token_endpoint_auth_methodstring(none | client_secret_post | client_secret_basic)
client_uristring
logo_uristring

Réponse 201

client_idstring
client_namestring
redirect_urisstring[]
token_endpoint_auth_methodstring
grant_typesstring[]
response_typesstring[]
client_id_issued_atinteger
client_secretstringUniquement pour les clients confidentiels ; renvoyé une seule fois
POST/api/oauth/token

Point 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_tokenstring
token_typestring
expires_ininteger
refresh_tokenstring
scopestring