Documentazione Mailzero

L'API dietro Today: collega una casella di posta, leggi il brief e i fatti, affida i tipi di questioni che scegli ai tuoi agenti tramite deleghe permanenti e lasciali agire entro i limiti concessi con una ricevuta per ogni effetto. Domini, DNS e il resto della piattaforma mantengono il loro riferimento più in basso.

Supporto: support@mailzero.run

Autenticazione

Tutti gli endpoint autenticati richiedono un token Bearer nell’header Authorization.

curl https://domani.run/api/domains/search?q=example.com \ -H "Authorization: Bearer domani_sk_xxx"

Ottieni una chiave API tramite creazione di un account o dal Impostazioni. Alcuni endpoint (ricerca, TLD, WHOIS) sono pubblici ma hanno limiti di velocità inferiori senza autenticazione.

Ambiti dei token

I token possono essere limitati ad ambiti di autorizzazione specifici. Utilizzare * per l'accesso completo (impostazione predefinita). Crea token con ambito tramite `POST /api/tokens` con a `scopes` matrice.

AmbitoConcede l'accesso a
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 (comporta il pagamento, include gli acquisti sul marketplace)
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:deleteElimina definitivamente i messaggi già presenti nel Cestino. Lo spostamento dei messaggi nel Cestino richiede solo l'email:write. Concedere questo ambito solo agli agenti autorizzati a cancellare in modo irreversibile il contenuto della posta elettronica
email:manage_mailboxesCrea caselle di posta (POST /api/emails) e nient’altro. Questo ambito amministrativo ristretto consente agli agenti di creare indirizzi per nuovi progetti (partners@, launch@) senza poter leggere o inviare e-mail, gestire domini o manipolare token
email:auth_secretsLeggere messaggi classificati come posta di autenticazione (codici OTP/di verifica, reimpostazione della password, collegamenti magici). Senza di esso, email:read li elenca ancora, ma l'oggetto e il corpo tornano oscurati, quindi un token dell'agente rubato non può raccogliere codici 2FA. Concedilo solo agli agenti che hanno realmente bisogno di completare gli accessi
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

Attenuazione dell'ambito: un token può creare solo token figlio con ambiti uguali o inferiori, mai di più.

Restituzioni dell'ambito mancante 403 con codice `INSUFFICIENT_SCOPE` e un suggerimento che nomina l'ambito richiesto.

Guida rapida agenti: il ciclo delle attività

Dai a un agente un'identità e un token, affidagli un tipo di questione con una delega permanente a livello observe, poi lascia che legga la busta di ogni questione, richieda effetti e faccia rapporto. Il livello e i limiti concessi approvano, escalano a te o rifiutano; ogni effetto lascia una ricevuta; aumenta il livello quando le ricevute lo giustificano.

# 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."}'

Assistente Mailzero

Gli endpoint dell'assistente Mailzero trasformano la posta di un utente in Decisioni fondate sui messaggi reali: una coda Oggi con versioni, un Elemento di lavoro per ogni thread che richiede una decisione e un Piano d'azione esatto preparato solo dopo la scelta dell'utente. Niente sotto /api/assistant invia, elimina o modifica la posta; l'output del modello è sempre una proposta che il server convalida.

Lo coprono due ambiti: assistant:read per impostazioni, Oggi, Elementi di lavoro, Piani d'azione, avanzamento dell'importazione e Attività; assistant:write per modifiche alle impostazioni, consenso e importazione della cronologia, Decisioni umane sugli Elementi di lavoro ed esportazione o eliminazione dei dati derivati.

L'elaborazione inizia solo dopo un consenso esplicito: POST /api/assistant/preview registra la versione del consenso, delimita le caselle di proprietà e avvia un'importazione in background riprendibile. Interroga GET /api/assistant/backfill per l'avanzamento.

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

Una scelta prepara un piano esatto. Leggilo con GET /api/assistant/action-plans/{id}, mostralo all'utente, poi invia tramite il normale endpoint di risposta POST /api/emails/{address}/messages/{id}/reply con assistant_plan_id. Il server rifiuta i piani obsoleti o non corrispondenti, registra una ricevuta per ogni invio e sposta l'Elemento di lavoro in In attesa o Gestito.

Webhook delle cassette postali autenticati

Nella dashboard, apri la scheda E-mail di un dominio, scegli una casella di posta, quindi seleziona Authorization o X-API-Key. Domani crittografa il valore e lo invia con test webhook e consegne di posta elettronica in entrata. Le consegne in entrata in tempo reale sono durevoli e vengono ritentate fino a tre volte; `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

I valori dell'intestazione non vengono mai restituiti. Le risposte espongono solo `header_names`. Omettere `headers` per preservare il valore memorizzato, inviare un oggetto vuoto per cancellarlo e utilizzare `POST /api/emails/`'{address}'`/webhook/test` per verificare la consegna

Ricominciare da zero? Includi `webhook_headers` dentro `POST /api/agents/provision` per acquistare il dominio, creare la sua casella di posta e allegare il webhook dell'evento autenticato in una chiamata idempotente. Domani convalida l'URL e i nomi delle intestazioni prima di qualsiasi addebito.

Errori

Tutti gli errori restituiscono una busta JSON coerente. Utilizzare `code` per la gestione programmatica e `hint` per indicazioni sul recupero.

{
  "error": "Missing API key",
  "code": "MISSING_API_KEY",
  "hint": "Include 'Authorization: Bearer domani_sk_xxx' header",
  "documentation_url": "https://domani.run/llms.txt"
}
CodiceHTTP
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

Limiti di velocità

Ogni risposta include intestazioni del limite di velocità:

  • `X-RateLimit-Limit` - richieste massime per finestra
  • `X-RateLimit-Remaining` - richieste rimaste
  • `X-RateLimit-Reset` - timestamp unix quando la finestra si reimposta

Quando la velocità è limitata (HTTP 429), controlla il file `Retry-After` intestazione per secondi di attesa.

Assistente Mailzero

GET/api/assistant/rules

Elenca le deleghe permanenti

Le regole di delega permanente del proprietario in ordine: nome, il predicato di match, l'assegnatario (un'identità agent o un membro del workspace), il livello di autonomia, quante volte ciascuna ha fatto match. Richiede assistant:read; un token agent viene rifiutato.

Risposta 200

rulesAssistantRule[]
POST/api/assistant/rules

Crea una delega permanente

Consegna un tipo di questione a un agent o a una persona una volta. match è un predicato esplicito, mai una chiamata al modello: uno qualsiasi tra senderAddress, senderDomain, organisation, workKeyPrefix, senderKind, mailboxIds, labels, subjectPattern (ancorato, case-insensitive), minOccurrences, minConfidence (la probabilità del classificatore calibrato su un'etichetta category:, da 0,5 a 1); ogni condizione dichiarata deve essere vera. Le regole sono ordinate e il primo match vince; il livello è observe salvo diversa indicazione. Una regola che fa match consegna il prossimo elemento corrispondente all'assegnatario, glielo comunica tramite la notifica di delega, e Today mostra perché. Richiede assistant:write; un token agent viene rifiutato.

Risposta 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}

Modifica una delega permanente

Rinomina, abilita o disabilita, riordina, cambia il match, l'assegnatario, il livello o le autorizzazioni. Abbassare il livello a observe è l'interruttore di emergenza con un clic di una regola. Richiede assistant:write; un token agent viene rifiutato.

Parametri

id*string

Risposta 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}

Elimina una delega permanente

Rimuove la regola; gli elementi che ha consegnato tornano al proprietario, le ricevute di ciò che l'assegnatario ha fatto rimangono. Richiede assistant:write; un token agent viene rifiutato.

Parametri

id*string

Risposta 200

deletedboolean
released_itemsinteger
POST/api/assistant/rules/test

Prova le deleghe permanenti su fatti di esempio

Un'esecuzione di prova: quale regola prenderebbe un messaggio con questi fatti (mailbox, key, sender, subject, labels, occurrences), e perché. Nulla cambia. Richiede assistant:write; un token agente viene rifiutato.

Richiedi corpo

mailbox_id*string
key*stringLa chiave dell'elemento di lavoro, ad esempio org:tucows:invoice
sender_addressstring | null
sender_kindstring(human | automated)
subjectstring | null
labelsstring[]
occurrencesinteger
confidenceobjectLa probabilità del classificatore per etichetta, per una regola con minConfidence

Risposta 200

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

Prova un effetto contro il livello e le autorizzazioni di una delega permanente

Una prova a secco dell'ordine di validazione per un effetto richiesto sotto la regola oggi: il livello consente il tipo; le autorizzazioni consentono i destinatari, il volume (conteggio degli effetti eseguiti oggi), la pianificazione, la spesa, le classi di rischio lette dalla pratica; l'approvatore richiesto ha approvato. Risponde con lo stato che un piano assumerebbe (proposed, approved, escalated o rejected) con ogni controllo e il motivo. Nulla cambia. Richiede assistant:write; un token agente viene rifiutato.

Parametri

id*string

Richiedi corpo

effect*object
matterobject
atstring (date-time)L'istante a cui verificare la pianificazione; ora per impostazione predefinita
approved_bystring[]ID dei membri che hanno già approvato

Risposta 200

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

Leggi le metriche task

I sette numeri del livello task su una finestra mobile (trenta giorni per impostazione predefinita, window_days da 1 a 90), per l'account e per ogni delega permanente: matter chiusi senza il proprietario, il tempo dall'arrivo al completamento, i piani eseguiti come proposti, modificati e rifiutati, le escalation per matter, le correzioni dopo l'esecuzione, le collisioni, il costo del modello per matter. Letti dalle ricevute, dai piani, dalle escalation e dal registro; nulla è stimato. Richiede assistant:read.

Parametri

window_daysinteger

Risposta 200

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

Elenca la coda delle approvazioni

I piani in attesa del proprietario (proposti in bozza o trattenuti da una permissione) e le domande poste dagli assegnatari, tra le questioni che il lettore può vedere. Rispondi attraverso le interazioni dell'elemento di lavoro: approva o rifiuta un piano, scegli un'opzione o dai istruzioni su una domanda. Richiede assistant:read. Una questione creata dalla posta di autenticazione prima che questa venisse tenuta fuori dall'assistente viene mostrata con titolo, riepilogo, richiesta ed effetti del piano trattenuti per un lettore senza email:auth_secrets.

Risposta 200

typestring
as_ofstring (date-time)
plansobject[]
escalationsobject[]
GET/api/assistant/suggestions

Elencare i suggerimenti di delega

Le deleghe permanenti proposte dall'assistente: una questione ricorsa almeno tre volte in novanta giorni (la stessa organizzazione o mittente) e gestita allo stesso modo ogni volta (ignored, answered, closed, handed to one agent), con la regola precompilata. Quelle aperte per impostazione predefinita. Nulla viene creato finché il proprietario non accetta. Richiede assistant:read; un token agente viene rifiutato.

Parametri

statusstring(open | accepted | dismissed)

Risposta 200

suggestionsAssistantSuggestion[]
POST/api/assistant/suggestions/{id}

Accettare o rifiutare un suggerimento di delega

Accettare: il suggerimento si chiude e la regola precompilata torna per essere creata dal client (POST /api/assistant/rules). Rifiutare: si chiude e non torna mai più per le stesse questioni e gestione. Richiede assistant:write; un token agente viene rifiutato.

Parametri

id*string

Richiedi corpo

action*string(accept | dismiss)

Risposta 200

suggestionAssistantSuggestion
ruleAssistantRuleInput
GET/api/assistant/grants

Elenca le autorizzazioni associate agli assegnatari

Le autorizzazioni associate agli agenti e ai membri del proprietario, oltre a ogni regola che assegna loro pratiche; si applica il più restrittivo tra la regola e l'assegnatario. Richiede assistant:read; un token agente viene rifiutato.

Risposta 200

grantsAssistantAssigneeGrants[]
PUT/api/assistant/grants

Imposta le autorizzazioni di un assegnatario

Associa autorizzazioni a un'identità agente o a un membro dello spazio di lavoro; sostituiscono le autorizzazioni precedenti dell'assegnatario e limitano ogni regola che assegna loro pratiche. Richiede assistant:write; un token agente viene rifiutato.

Richiedi corpo

assignee_type*string(agent | member)
assignee_ref*stringLo slug dell'identità dell'agent, o l'user id del membro
grants*AssistantGrants

Risposta 200

assigneeobject
grantsAssistantGrants
created_atstring (date-time)
updated_atstring (date-time)
DELETE/api/assistant/grants/{type}/{ref}

Rimuovi le autorizzazioni di un assegnatario

L'assegnatario mantiene solo ciò che ogni regola concede. Richiede assistant:write; un token agente viene rifiutato.

Parametri

type*string(agent | member)
ref*string

Risposta 200

deletedboolean
GET/api/assistant/tasks/{id}

Leggi una busta di task

La questione consegnata, come l'assegnatario ne ha bisogno: il riepilogo con le prove, i fatti, la delega (assegnatario, regola, livello, i tipi di effetto consentiti, le autorizzazioni effettive), i piani aperti e recenti, il lease. Un token agent legge le questioni consegnate ad esso e quelle delle caselle di posta che gestisce; il proprietario legge le proprie. Richiede assistant:read. Una questione creata dalla posta di autenticazione prima che questa venisse tenuta fuori dall'assistente viene mostrata con titolo, riepilogo, richiesta ed effetti del piano trattenuti per un lettore senza email:auth_secrets.

Parametri

id*stringL'id dell'elemento di lavoro

Risposta 200

idstringL'id dell'elemento di lavoro
versioninteger
statusstring
deadlinestring (date-time) | null
youobject
delegationobject
leaseAssistantTaskLease
briefobject | nullIl riepilogo della questione, come risponde GET /api/assistant/work-items/{id}/brief
factsobject | nullI fatti della questione, come risponde GET /api/assistant/work-items/{id}/facts
plansobject
escalationsobject[]Le domande poste sul task, dalla più recente, con le loro risposte
POST/api/assistant/tasks/{id}/lease

Prendi o rinnova il lease su un task

Due assegnatari non lavorano mai su una questione: il lease indica chi ci lavora fino a quando (quindici minuti per impostazione predefinita, fino a un'ora). Prenderlo di nuovo lo rinnova; un altro titolare viene rifiutato con TASK_LEASED fino alla scadenza. Una richiesta di effetti prende il lease autonomamente. Richiede assistant:write.

Parametri

id*string

Richiedi corpo

ttl_secondsinteger

Risposta 200

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

Restituisci il lease

Rilascia il lease detenuto dal chiamante; un lease detenuto da un altro assegnatario viene lasciato intatto. Richiede assistant:write.

Parametri

id*string

Risposta 200

task_idstring
releasedboolean
leaseAssistantTaskLease
POST/api/assistant/tasks/{id}/effects

Richiedi effetti su un task

L'assegnatario richiede uno o più effetti (reply, forward, label, snooze, resolve, note, request). Il livello della delega decide i tipi consentiti e le autorizzazioni li limitano: all'interno delle autorizzazioni a guarded_send o operate (e i tipi in entrata a triage) gli effetti vengono eseguiti immediatamente con le loro ricevute; a draft attendono l'approvazione del proprietario; un'autorizzazione fallita viene escalata al proprietario; un tipo che il livello non consente viene rifiutato. La richiesta del proprietario stesso viene eseguita immediatamente. La stessa chiave di idempotenza risponde di nuovo con il primo piano. Richiede assistant:write.

Parametri

id*string

Richiedi corpo

effects*AssistantEffect[]
idempotency_key*string
notestringCosa l'assegnatario vuole che il proprietario sappia su questa richiesta

Risposta 200

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

Fermarsi e chiedere al proprietario

L'assegnatario pone una domanda con l'evidenza e, quando utile, le opzioni che vede. Il proprietario risponde con le normali interazioni choose o instruct sulla decisione che questo crea; la questione appare in Today come necessitante il proprietario, il lease viene rilasciato, il task attende. Richiede assistant:write.

Parametri

id*string

Richiedi corpo

question*string
optionsobject[]
evidence_refsstring[]

Risposta 200

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

Rapporto su un task

Cosa ha fatto l'assegnatario e come è finito: done (la questione si risolve, o attende quando è ancora prevista una risposta), blocked (viene chiesto al proprietario), o handed back (il proprietario prende il controllo e la regola resta fuori da questa questione). I claim vengono riconciliati con le receipt che la piattaforma ha scritto: un claim senza receipt viene registrato come claim, mai come fatto. Il lease viene rilasciato. Richiede assistant:write.

Parametri

id*string

Richiedi corpo

outcome*string(done | blocked | handed_back)
summary*string
evidence_refsstring[]
claimsobject[]

Risposta 200

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

Leggi ciò che l'assistente ha stabilito riguardo a un messaggio

La conoscenza che le analisi di questo messaggio hanno prodotto: affermazioni (soggetto, predicato, valore con tipo e valuta, base, confidenza, validità, evidenza), entità, impegni e aspettative. Nulla viene calcolato durante il processo: un messaggio che la pipeline non ha mai analizzato risponde analysed: false con reason (not_enabled quando la casella di posta non è nell'assistente, not_analysed quando l'analisi non è ancora avvenuta). Richiede assistant:read.

Parametri

address*string
id*stringID del messaggio

Risposta 200

message_idstring
thread_idstring
analysedboolean
reasonstringSolo quando analysed è false
analysisobject
factsFact[]
entitiesobject[]
commitmentsobject[]
expectationsobject[]
POST/api/emails/{address}/messages/{id}/extract

Estrai i campi di cui hai bisogno da un messaggio con il tuo schema

Una chiamata al modello sul testo del messaggio (oggetto, mittente, corpo) con uno schema JSON del chiamante di oggetti e primitive (fino a 8 KB, senza riferimenti): risponde data in quella forma, confidence (da 0 a 1) e evidence_quotes (estratti testuali). Memorizzato in cache da (messaggio, schema, istruzioni) quindi la stessa domanda costa una chiamata (cached: true dopo). Limitato dal budget del modello dell'account (429 quando esaurito, 503 quando il percorso del modello è disattivato). Le mail con codice di accesso rispondono 403 AUTH_MESSAGE. I corpi oltre 60.000 caratteri rispondono 413.

Parametri

address*string
id*stringID del messaggio

Richiedi corpo

schema*objectSchema JSON dei campi da estrarre: un oggetto di primitive, array e oggetti annidati, sotto 8 KB, senza $ref
instructionsstringIndicazioni opzionali, ad es. importi in EUR

Risposta 200

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

Ottieni impostazioni dell'assistente Mailzero

Restituisce lo stato di attivazione dell'assistente, i flag shadow/pause, la versione del consenso, il percorso privacy, l'ambito delle caselle di posta e tutte le caselle di posta che possiedi. Richiede l'autorizzazione assistant:read.

Risposta 200

enabledboolean
shadow_enabledboolean
pausedboolean
mailbox_idsstring[]
agent_mailbox_idsstring[]Caselle gestite dai tuoi agenti. I loro elementi compaiono nella sezione agenti di Today invece che in Needs you.
agentsobject[]Le tue identità di agente, per la delega.
search_opt_out_mailbox_idsstring[]Caselle di posta la cui posta viene cercata solo per parole: i loro messaggi non vengono mai inviati al modello di embedding.
brief_opt_out_mailbox_idsstring[]Caselle di posta i cui riepiloghi rimangono deterministici: nessun estratto di evidenza viene inviato al modello per il riepilogo e la prossima mossa (l'analisi della posta in arrivo rimane invariata)
history_window_daysinteger
privacy_routestring
attachment_visionboolean
community_signalsbooleanI tuoi report di phishing contribuiscono alle impronte della community (un dominio, la forma di un oggetto, mai un testo o un indirizzo) e i conteggi della community raggiungono i tuoi segnali di fiducia. Attivo per impostazione predefinita; disattivandolo entrambi rimangono locali.
pipeline_versionstring
consentobject
mailboxesobject[]

Risposta di esempio

{
  "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

Aggiorna impostazioni dell'assistente Mailzero

Abilita, mette in pausa, riprende o delimita esplicitamente l'elaborazione dell'assistente. Inviare mailbox_ids: [] disabilita tutte le caselle di posta e annulla un'importazione cronologia in corso. La ripresa richiede la versione corrente del consenso. La ricezione della posta rimane indipendente. Richiede l'autorizzazione assistant:write.

Richiedi corpo

enabledbooleanMostra le Decisioni Today e genera bozze su richiesta
shadow_enabledbooleanAnalizza la posta senza mostrare le Decisioni
pausedboolean
mailbox_idsstring[]ID delle caselle di posta possedute da elaborare; un array vuoto disabilita tutto
agent_mailbox_idsstring[]Caselle gestite dai tuoi agenti. I loro elementi compaiono nella sezione agenti di Today invece che in Needs you.
history_window_daysinteger
attachment_visionboolean

Risposta 200

okboolean
enabledboolean
shadow_enabledboolean
pausedboolean
mailbox_idsstring[]

Risposta di esempio

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

Acconsentire e avviare un'importazione cronologia in background

Registra il consenso esplicito IA corrente, abilita l'elaborazione in background sulle caselle di posta selezionate dell'utente e crea un'importazione riprendibile della cronologia recente. Il client può chiudersi immediatamente ed effettuare polling su GET /api/assistant/backfill. Richiede l'autorizzazione assistant:write.

Richiedi corpo

mailbox_ids*string[]
history_window_daysinteger
consent*boolean(true)
consent_version*string(mailzero-personal-ai.v1)

Risposta 200

okboolean
previewobject

Risposta di esempio

{
  "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

Ottenere il progresso dell'importazione cronologia in background

Restituisce la fase di scansione/analisi, i messaggi elaborati e totali, la percentuale, l'ETA adattivo, lo stato di pausa e se l'app può chiudersi. Richiede l'autorizzazione assistant:read.

Risposta 200

backfillobject | null

Risposta di esempio

{
  "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

Ritentare i messaggi di importazione cronologia falliti

Rimette in coda i fallimenti terminali dall'importazione più recente per le caselle di posta che rimangono abilitate all'IA. I tentativi automatici sono già stati esauriti prima che un messaggio appaia qui. Richiede l'autorizzazione assistant:write.

Risposta 200

okboolean
retriedinteger

Risposta di esempio

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

Ottenere la coda delle decisioni fondate di Today

Restituisce le proiezioni versionate Now, Needs you, Waiting, Upcoming e Handled recenti con as_of, lag, coverage e warnings. Ogni elemento rimanda al messaggio di origine; nulla qui invia posta. Richiede l'autorizzazione assistant:read. La posta di autenticazione (codici di accesso, reimpostazioni della password, link magici) non diventa mai una questione e non raggiunge mai un modello. Una questione creata dalla posta di autenticazione prima che questa venisse tenuta fuori dall'assistente viene mostrata con titolo, riepilogo, richiesta ed effetti del piano trattenuti per un lettore senza email:auth_secrets.

Parametri

agentstringVista di un solo agente: gli elementi delle caselle di posta che gestisce e gli elementi a lui assegnati. Un token associato a un'identità agente ottiene sempre la vista di quell'agente; specificare un altro agente restituisce 403 AGENT_SCOPE.
categorystringUn solo tipo di questione (invoice, meeting_request, newsletter...); il campo categories della risposta elenca ogni tipo presente nella vista con il suo conteggio. Un tipo sconosciuto risponde 400 INVALID_CATEGORY.
tagstringSolo le pratiche che portano questa etichetta (una delle etichette della persona); il campo tags della risposta elenca ogni etichetta della vista con il suo conteggio.

Risposta 200

typestring
as_ofstring
projection_lag_msinteger
categorystring | nullIl tipo di questione a cui la vista è ristretta (il parametro category), oppure null per tutti i tipi.
categoriesobjectOgni tipo di questione presente nella vista, prima del filtro, con quanti elementi contiene.
tagstring | nullL'etichetta a cui la vista è ristretta (il parametro tag), o null per tutte le pratiche.
tagsobjectOgni etichetta della persona nella vista, prima del filtro, con quante pratiche la portano.
sectionsobject

Risposta di esempio

{
  "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}

Ottieni un elemento Work dell'assistente e il piano attuale esatto

Restituisce l'elemento Work fondato, la sua Decision aperta e le opzioni, il piano Action attuale esatto, impegni e aspettative aperti, interazioni e ricevute. Richiede l'autorizzazione assistant:read. Una questione creata dalla posta di autenticazione prima che questa venisse tenuta fuori dall'assistente viene mostrata con titolo, riepilogo, richiesta ed effetti del piano trattenuti per un lettore senza email:auth_secrets.

Parametri

id*stringID dell'elemento Work dalla coda Today

Risposta 200

idstring
versioninteger
statusstring
titlestring
summarystring
askstring | nullL'unica cosa che il proprietario deve fare o decidere, oppure null.
categorystring | nullIl tipo di questione trovato dall'analisi (una fattura, una richiesta di riunione, una newsletter...), oppure null quando nessuna analisi lo ha detto. Le regole lo riconoscono con l'etichetta category:<kind>.
tagsstring[]Le etichette della persona sulla pratica (CT-01b): confermate una volta o messe a mano, ognuna è un'etichetta sul thread presso il provider. Le regole le riconoscono come l'etichetta tag:<name>.
proposed_tagsstring[]Le etichette che il motore propone per la pratica (una per progetto che ha nominato), non ancora confermate. Confermane una con l'interazione tag; poi si applica alla prossima pratica dello stesso progetto senza domande.
suspectbooleanI segnali di fiducia hanno trovato il mittente sospetto: la questione si trova nella sezione Sospetti, non è mai Ora, non porta decisioni e nessun effetto viene eseguito su di essa finché la persona non la segnala come legittima.
suspect_reasonsstring[]Perché sembra sospetto, una frase per segnale (un'autenticazione fallita, un Reply-To divergente, un dominio simile, un nome preso in prestito, un primo contatto riguardo denaro, un'istruzione all'assistente, un segreto richiesto per posta di ritorno).
senderobject | null
recurrenceobjectQuante volte questa stessa situazione è tornata: un elemento, N messaggi.
mailboxobject
opened_atstring | null
delegated_tostring | nullLo slug dell'agente a cui il proprietario ha affidato questo elemento, o null.
delegation_ruleobject | nullLa delega permanente che ha consegnato questo elemento, e perché ha fatto match; sospesa una volta che il proprietario ha ripreso l'elemento.
unreadbooleanVero finché il proprietario non apre l'elemento dopo l'ultima modifica.
messagesobject[]I messaggi di origine dietro questo elemento, dal più recente al più vecchio.
historyobject[]Cosa è già successo in questa questione, dal più vecchio al più recente: una riga per ogni messaggio precedente.
sourceobject
attentionobject
analysisobject
evidence_refsstring[]
entity_refsstring[]
snoozed_untilstring | null
decisionobject | null
planobject | null
GET/api/assistant/work-items/{id}/brief

Leggi il riassunto della situazione di un elemento di lavoro

Un documento che un agente legge prima di agire: la situazione (stato, attenzione, ricorrenza, mittente), la storia finora (ogni mail di essa, analizzata o meno), i fatti che le analisi hanno stabilito (affermazioni con valore, base e validità, e le entità), gli impegni e le aspettative aperti con ciò che è atteso da chi e da quando, ciò che è già risolto (cicli chiusi e ricevute), la Decisione attuale con le sue opzioni, un prossimo passo suggerito (l'opzione raccomandata della Decisione quando ce n'è una, altrimenti una regola: una promessa scaduta, un'aspettativa scaduta da sollecitare, la richiesta del mittente a cui rispondere), e i messaggi di prova. Deterministico ed economico: nessuna chiamata al modello. I token agente leggono gli elementi delle caselle di posta che operano e gli elementi loro consegnati.

Parametri

id*stringID elemento Work
synthesisbooleanImpostare su false per saltare la lettura del modello (riepilogo, prossima azione concreta, domande aperte) e leggere solo il brief deterministico; la lettura è memorizzata in cache per stato delle prove

Risposta 200

idstring
versioninteger
generated_atstring (date-time)
titlestring
summarystring
askstring | null
mailboxobject
delegated_tostring | null
situationobject
storyobject[]Ogni mail della situazione, dalla più vecchia alla più recente, con il titolo di una riga che l'analisi le ha dato
factsobject[]
entitiesobject[]
commitmentsobject[]Promesse aperte fatte dalla parte del proprietario
expectationsobject[]Cose aperte attese da altri
settledobject[]Cicli chiusi e ricevute, dalla più recente alla più vecchia
awaitingobject[]
decisionobject | nullLa Decisione preparata attuale con le sue opzioni
summary_sourcestringSe il riepilogo è la lettura del modello delle prove o la frase propria della pipeline
suggested_nextobject | null
open_questionsstring[]Ciò che solo il proprietario può decidere prima della prossima azione, al massimo tre domande
synthesisobject | nullLa chiamata al modello che ha scritto il riepilogo e la prossima azione, null quando il brief è solo deterministico
evidenceobject[]
owner_repliesobject[]
evidence_refsstring[]
GET/api/assistant/brief

Leggi il riassunto della situazione per un corrispondente

Cosa sapere prima di rispondere a una persona: il riassunto del loro elemento di lavoro attivo più recente tra le caselle di posta che puoi leggere (o una casella di posta), gli altri elementi di cui sono responsabili, e le loro ultime dieci mail. brief è null quando non è stato ancora analizzato nulla da loro.

Parametri

correspondent*stringL'indirizzo email della persona
mailboxstringLimita a un indirizzo di casella di posta (slug@domain)

Risposta 200

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

Leggi i fatti dietro un elemento Work

Le affermazioni e le entità unite da ogni analisi dell'elemento (la più recente vince), più i suoi impegni e aspettative memorizzati con il loro stato. I token degli agenti leggono gli elementi delle caselle di posta che operano e gli elementi a loro affidati.

Parametri

id*stringID elemento Work

Risposta 200

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

Contrassegnare un elemento Work come aperto

Registra che il proprietario ha aperto questo elemento Work nella versione attuale, rimuovendo il contrassegno di non letto finché l'elemento non cambia di nuovo. Richiede l'ambito assistant:write.

Parametri

id*string

Risposta 200

okboolean
opened_atstring
unreadboolean
GET/api/assistant/learned

Cosa ha imparato l'assistant su di te

Le regole di silenzio che l'assistente propone dopo che lo stesso mittente o la stessa organizzazione è stata ignorata a ogni ritorno, i silenzi in vigore (un mittente, un dominio o una situazione che l'assistente tiene fuori da Oggi), ognuno con il suo motivo, e le etichette confermate una volta, ognuna applicata alla prossima pratica dello stesso progetto senza domande. Accetta una regola di silenzio tramite l'endpoint suggestions; dimentica un silenzio con l'endpoint mutes, un'etichetta con l'endpoint tags.

Risposta 200

mutesobject[]I mute in vigore, dal più recente al più vecchio.
suggestionsAssistantSuggestion[]Le quiet rule aperte: accettane una tramite l'endpoint suggestions per impostare il mute che contiene.
tagsobject[]Le etichette confermate una volta (CT-01b), le più recenti prima: ognuna si applica alla prossima pratica dello stesso progetto senza domande finché non viene dimenticata.
DELETE/api/assistant/learned/mutes

Dimentica un mute

La prossima mail di quel mittente, dominio o situazione diventa di nuovo un item.

Richiedi corpo

kind*string(sender | sender_domain | situation)
value*stringL'indirizzo, il dominio o la chiave della situazione, come la vista learned la elenca.

Risposta 200

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

Dimentica un'etichetta

Niente viene più applicato senza domande: la prossima pratica di quel progetto propone di nuovo l'etichetta. Le pratiche che la portano la conservano.

Richiedi corpo

name*stringL'etichetta, come la elenca la vista learned.

Risposta 200

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

Indagare una questione: cosa dicono il registro e i link

Legge, in quell'istante, i fatti che l'infrastruttura pubblica detiene sul dominio del mittente (la sua data di registrazione e registrar, la sua postura SPF e DMARC, se riceve posta), dove ogni link del messaggio sorgente va realmente (i redirect seguiti un hop alla volta, l'host finale e i fatti del suo dominio), e cosa ogni allegato è realmente (i suoi primi byte rispetto al nome e al tipo dichiarato). Risponde con il dossier con i segnali che i fatti aggiungono (un dominio registrato giorni fa, un link che atterra altrove, un dominio del mittente che non protegge nulla, un programma nominato come documento). Nessun vendor, nessun account, nulla memorizzato; una ricerca che fallisce è un fatto a sé.

Parametri

id*string

Risposta 200

work_item_idstring
sourcestringSe il messaggio sorgente è stato letto, o solo l'indirizzo del mittente.
checked_atstring
senderobject
linksobject[]
attachmentsobject[]Cosa ogni allegato è realmente, letto dai suoi primi byte rispetto a ciò che il suo nome e il tipo dichiarato promettono.
signalsobject[]Cosa aggiungono i fatti alla valutazione, una frase ciascuno.
GET/api/assistant/work-items/{id}/sender

Chi c'è dietro una pratica: l'organizzazione, le persone coinvolte, la cronologia

Risponde la scheda del mittente di una pratica: l'organizzazione del mittente come la conosce il profilo di dominio memorizzato (nome, ragione sociale, categoria, sito web, data di registrazione, postura di posta; null per un dominio di posta condiviso come gmail.com o un dominio mai analizzato, e mai un'analisi dal vivo), le persone che i messaggi della storia portano in from, to e cc con i loro ruoli e se appartengono alla stessa organizzazione (le caselle del lettore stesso escluse), e la relazione: quanta posta è arrivata da questo indirizzo nelle caselle del lettore (contata fino a 50), quando la prima e l'ultima volta, le altre pratiche del mittente e le pratiche sollevate da colleghi dello stesso dominio. Richiede lo scope assistant:read.

Parametri

id*string

Risposta 200

work_item_idstring
senderobject | null
organisationobject | nullNull per un dominio di posta condiviso o un dominio mai analizzato.
participantsobject[]
relationshipobject
generated_atstring (date-time)
POST/api/assistant/work-items/{id}/interactions

Registra una Decision umana delimitata

Scegli un'opzione, dai un'istruzione, prendi il controllo, posticipa, ignora, correggi, segnala il verdetto di fiducia (phishing o legittimo), oppure approva o rifiuta un piano in attesa (un piano approvato viene eseguito immediatamente, con le sue ricevute nella risposta). La chiamata è delimitata da work_item_version e ripetuta in modo idempotente da idempotency_key. Scegliere o istruire prepara una bozza esatta che passa comunque attraverso il normale flusso di risposta; questo endpoint non invia mai email. Richiede lo scope assistant:write.

Parametri

id*string

Richiedi corpo

scopestring(item | sender | sender_domain | situation)Con tipo ignore: silenzia anche il mittente, il suo dominio o questa situazione ricorrente in modo che non ritorni mai.
verdictstring(phishing | legitimate)Con type report: il verdetto della persona sui segnali di fiducia. Phishing chiude la questione, silenzia il mittente e chiude le sue altre questioni attive; legittimo cancella il verdetto sospetto e le sue ragioni.
plan_idstringCon type approve o reject: il piano d'azione in attesa (proposto o escalato).
reasonstringCon type reject: il motivo, mantenuto sul piano.
type*string(choose | instruct | take_over | snooze | ignore | correct | delegate | approve | reject | report | tag)
addstring[]Con type tag: etichette da mettere sulla pratica (una proposta confermata, o una a mano; minuscole, lettere, cifre e trattini). Un'etichetta aggiunta una volta viene appresa: la prossima pratica dello stesso progetto la riceve senza domande.
removestring[]Con type tag: etichette da togliere dalla pratica (una proposta nominata qui viene rifiutata). La pagina learned dimentica un'etichetta per sempre.
agent_slugstring | nullCon il tipo delegate: lo slug del tuo agente a cui affidare l'elemento, o null per riprenderlo.
member_idstring | nullCon type delegate: l'id utente di un membro del tuo workspace a cui passare l'elemento invece che a un agent; lo trova sotto handed_to_you nel suo Today e lo gestisce tramite gli endpoint delle attività con il proprio accesso.
work_item_version*integer
decision_idstring
decision_versioninteger
option_idstring
instructionstring
untilstring (date-time)
remind_atstring (date-time)
fieldstring
correctionstring
idempotency_key*string

Risposta 200

okboolean
work_itemAssistantWorkItem
plan_idstring | null
GET/api/assistant/action-plans/{id}

Ottieni l'anteprima esatta dell'azione tramite ID opaco

Restituisce l'identità di risposta esatta, i destinatari, il corpo, gli impegni e gli effetti collaterali di un piano d'azione preparato, oltre alla sua scadenza e revisione di origine, in modo che un client possa mostrare cosa accadrà prima che l'utente invii tramite l'endpoint di risposta esistente con assistant_plan_id. Richiede lo scope assistant:read.

Parametri

id*stringID del piano d'azione opaco

Risposta 200

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

Ottieni l'attività dell'assistente con contenuto minimizzato

Elenca le interazioni e le ricevute recenti attribuite al chiamante senza i corpi dei messaggi. Richiede lo scope assistant:read.

Parametri

limitinteger

Risposta 200

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

Esporta i dati derivati dell'assistente

Esporta analisi, rivendicazioni accettate, decisioni, interazioni, ricevute e utilizzo del modello come allegato JSON. Non include mai i corpi delle email di origine o i byte degli allegati. Richiede lo scope assistant:write. Richiede anche email:auth_secrets (altrimenti 403 INSUFFICIENT_SCOPE): lo stato derivato può contenere ciò che l'assistente ha ricavato dalla posta di autenticazione prima che questa ne venisse esclusa.

Risposta 200

formatstring
exported_atstring
notestring
DELETE/api/assistant/data

Elimina dati derivati dall'assistente

Elimina in modo idempotente intelligence derivata, job, utilizzo del modello, dispositivi, importazioni e impostazioni preservando la posta sorgente. Richiede l'autorizzazione assistant:write.

Risposta 200

okboolean
deletedobject
source_mail_deletedboolean

Risposta di esempio

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

Registra un dispositivo per avvisi Now con dati riservati

Registra o ruota un token push crittografato per un'installazione app e ambiente. Solo l'app nativa chiama questo; richiede un assistente attivo e l'autorizzazione assistant:write.

Richiedi corpo

installation_id*string
platform*string(ios | android)
environment*string(development | preview | production)
push_token*string
locale*string
lock_screen_detailstring(redacted | sender_only)

Risposta 200

okboolean
deviceobject
DELETE/api/assistant/devices

Revoca una registrazione dispositivo

Revoca tutte le registrazioni push di un'installazione, ad esempio al logout. Richiede l'autorizzazione assistant:write.

Parametri

installation_id*string

Risposta 200

okboolean

Email

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

Controlla lo stato del DNS della posta elettronica (MX, SPF, DMARC, DKIM)

Controlla la configurazione DNS della posta elettronica per un dominio: record MX, SPF, DMARC e DKIM. Rileva automaticamente il provider di posta elettronica dai record MX (Google Workspace, Proton, Fastmail).

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
providerstring | nullProvider di posta elettronica rilevato automaticamente (google-workspace, proton, fastmail) o null
mxobject
spfobject
dmarcobject
dkimobject

Risposta di esempio

{
  "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"
    ]
  }
}

Esempio

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

Ottieni lo stato di recapito della posta elettronica con ambito proprietario

Separa la disponibilità dell'autenticazione deterministica, i risultati di consegna ponderati per destinatario entro 30 giorni, lo stato di sicurezza dell'account e il posizionamento misurato del fornitore. Il punteggio di preparazione non è una probabilità della posta in arrivo e il posizionamento non misurato viene restituito come not_tested.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
statusstring
confidencestring
checked_atstring (date-time)
window_daysinteger
readinessobjectDisponibilità della configurazione DNS deterministica. Il punteggio non è una probabilità della posta in arrivo.
sending_healthobject
placementobject
actionsobject[]
caveatsstring[]

Esempio

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

Configura la posta elettronica su un dominio

Preconfigurare il DNS e-mail su un dominio (facoltativo). Questo viene chiamato automaticamente da create_mailbox quando necessario. Passa force=true per sovrascrivere il provider di posta elettronica esistente (Google Workspace, Fastmail, Proton).

Parametri

domain*stringNome di dominio

Richiedi corpo

forcebooleanSostituisci il provider di posta elettronica esistente (Google Workspace, Fastmail, Proton). Predefinito: falso

Risposta 200

domainstring
statusstring
verified_atstring | null
receiving_verifiedbooleanVero quando l'MX del dominio punta al ricevitore della piattaforma, quindi la posta per i suoi indirizzi viene accettata.
sending_configuredboolean
sending_verifiedboolean
recordsDnsRecord[]
hintstring
DELETE/api/domains/{domain}/email/setup

Rimuovere la posta elettronica da un dominio

Rimuovi la posta elettronica da un dominio, elimina tutte le caselle di posta e i messaggi e imposta emailEnabled su false. Modifica la posta dell'intero dominio, quindi un token confinato a caselle di posta riceve 403 MAILBOX_CONFINED.

Parametri

domain*stringNome di dominio
GET/api/domains/{domain}/email/status

Controlla lo stato DNS dell'e-mail

Controlla lo stato di verifica DNS dell'e-mail per un dominio. Restituisce se il dominio è verificato e pronto, i dettagli del record DNS e il conteggio delle cassette postali.

Parametri

domain*stringNome di dominio

Risposta 200

domainstring
enabledboolean
verifiedbooleanVero solo quando vengono verificati sia la ricezione che l'invio in uscita
receiving_verifiedbooleanVero quando l'MX del dominio punta al ricevitore della piattaforma, quindi la posta per i suoi indirizzi viene accettata.
sending_configuredboolean
sending_verifiedboolean
recordsDnsRecord[]
mailbox_countinteger
dns_managedbooleanVero quando Domani scrive da solo la zona del dominio: i record in sospeso vengono pubblicati e riparati da un controllo orario, senza nulla da aggiungere a mano. Falso per una zona esterna, dove i record in sospeso vanno aggiunti presso il provider DNS.
unreachable_addressesstring[]Indirizzi del dominio che il suo MX di ricezione rifiuta (caselle api su un dominio ospitato non ancora registrate sull'host di posta). Vuoto quando ogni indirizzo può ricevere; la registrazione viene ritentata automaticamente.
provider_statusstring
mailbox_plan_keystringLa chiave del piano dello spazio di lavoro che regola qui le caselle su dominio personalizzato (l’abbonamento dello spazio di lavoro, non necessariamente il piano personale dell’utente connesso).
mailbox_limitinteger | nullCaselle su dominio personalizzato consentite dal piano in tutto lo spazio di lavoro. null significa illimitato.
mailbox_limit_reachedbooleanVero quando lo spazio di lavoro raggiunge il limite di caselle del suo piano: un’altra casella su questo dominio richiede prima un upgrade.
mailbox_upgrade_planobject | nullIl piano più economico che lascerebbe spazio per un’altra casella. null se è già illimitato.
hintstring
POST/api/email

Crea una casella di posta su domani.run

Crea un indirizzo email gratuito su domani.run (es. hello@domani.run). Non è richiesta la proprietà del dominio. Limitato a 1 casella di posta @domani.run gratuita per utente. Molte lumache comuni sono riservate.

Richiedi corpo

slug*stringParte locale dell’indirizzo email (ad esempio 'hello' per hello@domani.run)
namestringNome visualizzato (per impostazione predefinita è lo slug in maiuscolo)

Risposta 201

idstring
addressstring
namestring | null
slugstring
domainstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
collaboration_enabledboolean
sharedbooleanIndica se almeno una persona diversa dal chiamante può leggere questa casella di posta
message_countinteger
webhook_urlstring | null
header_namesstring[]Nomi di intestazione di autenticazione del webhook configurati; i valori non vengono mai restituiti
forward_tostring | null
signing_secretstring | null
created_atstring (date-time)
hintstring
GET/api/email

Elenca tutte le caselle di posta

Elenca tutte le cassette postali a cui può accedere l'entità agente in tutti i domini, incluse le autorizzazioni di aree di lavoro.

Parametri

domainstringFiltra per dominio

Risposta 200

mailboxesobject[]
POST/api/emails

Crea una casella di posta

Creare un indirizzo email (casella di posta). Fornisci un indirizzo completo come "hello@mysite.com". Il DNS e-mail viene configurato automaticamente al primo utilizzo. Passa force=true per sovrascrivere un provider di posta elettronica esistente. La capacità della casella di posta del dominio personalizzato è determinata dall'account attivo o dal piano dell'area di lavoro. Ogni account può creare una casella di posta @domani.run gratuita separatamente con POST /api/email. Passa workspace_id per creare la casella di posta all'interno di uno spazio di lavoro di tua proprietà. Per un dominio personalizzato, adotta in modo esplicito e atomico il dominio e tutte le relative cassette postali di pari livello senza ambito in quell'area di lavoro; un dominio non può mai essere suddiviso tra aree di lavoro. Passa kind="hosted" per creare una vera casella di posta IMAP/SMTP sul tuo dominio (connetti Apple Mail, Thunderbird o qualsiasi client) invece della casella di posta API predefinita (invia/ricevi tramite API + webhook). Le cassette postali ospitate restituiscono i record DNS da pubblicare, le impostazioni del client di posta e una password dell'app monouso. Richiede un dominio di tua proprietà.

Richiedi corpo

address*stringIndirizzo e-mail completo, ad es. hello@mysite.com
namestringNome visualizzato per le e-mail in uscita (ad esempio "John Doe")
forcebooleanSostituisci i record MX esistenti. Predefinito: falso
kindstring(api | hosted)"api" (impostazione predefinita: invio/ricezione tramite API + webhook) o "hosted" (casella di posta IMAP/SMTP reale sul tuo dominio)
workspace_idstringSpazio di lavoro per possedere la casella di posta. Solo il proprietario dell'area di lavoro può adottare le risorse.

Risposta 201

idstring
addressstring
namestring | null
domainstring
slugstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
collaboration_enabledboolean
sharedbooleanIndica se almeno una persona diversa dal chiamante può leggere questa casella di posta
message_countinteger
webhook_urlstring | null
header_namesstring[]Nomi di intestazione di autenticazione del webhook configurati; i valori non vengono mai restituiti
forward_tostring | null
signing_secretstring | nullSegreto HMAC per la verifica dei payload del webhook in entrata (mostrato una volta alla creazione)
host_idstringID entità host di posta per una cassetta postale ospitata
dns_recordsDnsRecord[]
dns_statusstring
receiving_statusstring
sending_statusstring
sending_errorobject
client_settingsobject
credentialobject
storage_quota_bytesinteger
created_atstring (date-time)
hintstring
GET/api/emails

Elenca tutte le caselle di posta

Elencare tutte le cassette postali a cui può accedere l'entità agente, comprese le autorizzazioni di spazi di lavoro. Uguale a GET /api/email.

Parametri

domainstringFiltra per dominio

Risposta 200

mailboxesobject[]
GET/api/emails/{address}

Ottieni i dettagli della casella di posta

Ottieni i dettagli di una casella di posta specifica tramite il suo indirizzo email completo (codificato URL, ad esempio ciao%40miosito.com).

Parametri

address*stringIndirizzo email completo (codificato URL, ad esempio ciao%40miosito.com)

Risposta 200

idstring
addressstring
slugstring
domainstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
webhook_urlstring | null
forward_tostring | null
signing_secretstring | nullSegreto HMAC per i manager; null per visualizzatori/risponditori
message_countinteger
storage_quota_bytesinteger | null
storage_used_bytesinteger | null
storage_measured_atstring (date-time) | null
created_atstring (date-time)
PATCH/api/emails/{address}

Aggiorna casella di posta

Aggiorna il nome visualizzato, l'URL webhook o l'indirizzo email di inoltro di una casella di posta utilizzando il suo indirizzo email completo. Impostare su null per disabilitare/cancellare.

Parametri

address*stringIndirizzo email completo (codificato URL)

Richiedi corpo

namestring | nullNome visualizzato per la casella di posta. Impostare su null per cancellare.
webhook_urlstring | nullURL HTTPS per il webhook della posta elettronica in entrata o null da cancellare
forward_tostring | nullIndirizzo e-mail a cui inoltrare le e-mail in entrata o null da cancellare
drop_spambooleanRilascia (non archiviare o webhook) i messaggi in entrata contrassegnati come spam
tone_notesstring | nullIndicazioni di voce che gli agenti leggono prima di scrivere bozze da questa casella di posta (tono, firma, formulazioni da usare e da evitare). Imposta null per cancellarle.

Risposta 200

idstring
addressstring
slugstring
domainstring
namestring | null
webhook_urlstring | null
forward_tostring | null
tone_notesstring | null
signing_secretstringSegreto HMAC per la verifica dei payload del webhook in entrata
DELETE/api/emails/{address}

Elimina una casella di posta

Elimina una casella di posta tramite il suo indirizzo email completo. Richiede confirm=true nel corpo. Senza conferma, restituisce un'anteprima con message_count.

Parametri

address*stringIndirizzo email completo (codificato URL)

Richiedi corpo

confirmbooleanDeve essere vero per essere effettivamente eliminato. Ometti di visualizzare l'anteprima.
POST/api/emails/{address}/send

Invia un'e-mail

Invia un’e-mail da una casella identificata dal suo indirizzo completo. Il server esegue prima una policy obbligatoria e versionata: nega i problemi oggettivi di sicurezza e restituisce come avvisi i problemi di reputazione e qualità dei contenuti. Per una risposta collaborativa in thread, passa il lease di composizione, il reply_version osservato e una chiave di idempotenza stabile; il server rifiuta atomicamente risposte obsolete o doppie subito prima dell’invio. Massimo 20 destinatari univoci per messaggio. Limite: 100 destinatari all’ora per casella.

Parametri

address*stringIndirizzo email del mittente (codificato URL)

Richiedi corpo

to*anyIndirizzo/i email del destinatario
ccanyDestinatario/i CC
bccanyDestinatario(i) CCN
subjectstring
textstringCorpo del testo normale
htmlstringCorpo HTML
reply_tostringIndirizzo di risposta
in_reply_tostringID messaggio dell'e-mail a cui si è risposto (per il threading)
referencesstringCatena Message-ID separata da spazi (per il threading)
idempotency_keystringChiave stabile che impedisce invii duplicati
send_atstring (date-time)Programma l’invio (ISO 8601, da 30 secondi a 30 giorni nel futuro). Il messaggio viene archiviato con stato 'scheduled' e inviato lato server; per annullarlo, spostalo nel cestino prima di allora. Gli allegati non sono ancora supportati con send_at.
coordinationobjectNecessario per una risposta collaborativa riservata.
allow_risky_contentbooleanCampo di compatibilità deprecato. I collegamenti di autenticazione HTTPS pubblici di terze parti sono consentiti con un avviso; i blocchi di sicurezza oggettivi non possono essere ignorati.
attachmentsobject[]File allegati (max 10, max 40 MB totali). Il contenuto deve essere codificato in base64.

Risposta 200

idstring
message_idstringID messaggio RFC 5322
fromstring
tostring
bccstring | nullDestinatario/i Bcc a cui hai inviato, restituiti solo sul tuo messaggio in uscita; mai consegnati come intestazione e mai presenti su un messaggio ricevuto.
statusstring
attachments_countinteger
suppressedstring[]
deliverabilityobjectReport sui criteri con versione applicato a questo invio; ispezionare la decisione e i controlli categorizzati
POST/api/emails/{address}/deliverability-check

Verifica preliminare di un'e-mail in uscita

Esegui la policy lato server con la versione esatta utilizzata dall'endpoint di invio senza inviare o consumare la quota di posta elettronica. I collegamenti di autenticazione HTTPS pubblici su domini di terze parti sono consentiti con un avviso di reputazione. Gli URL locali/privati, i collegamenti di autenticazione non HTTPS e gli allegati eseguibili vengono bloccati; i corpi superiori a 102 KB producono un avviso di ritaglio.

Parametri

address*stringIndirizzo email del mittente (codificato URL)

Richiedi corpo

subjectstring
textstring
htmlstring
idempotency_keystring
allow_risky_contentbooleanCampo di compatibilità deprecato; i blocchi di sicurezza oggettivi non possono essere ignorati.
attachmentsobject[]

Risposta 200

policy_versionstring
decisionstring
safe_to_sendbooleanEquivalente booleano retrocompatibile a decisione != nega
riskstring
scoreinteger
authentication_messageboolean
checksobject[]
blocked_reasonsstring[]
warningsstring[]
override_usedboolean
GET/api/emails/{address}/messages

Elenca le email

Elenca le email in una cartella canonica o in una vista virtuale. L’impostazione predefinita è Posta in arrivo. La posizione della cartella è indipendente dalla direzione del messaggio e dal verdetto di spam. La posta di autenticazione (OTP/codici di verifica, reimpostazioni della password, link magici) è contrassegnata dal tag security: "auth". I token senza l’ambito email:auth_secrets vedono questi messaggi con oggetto e corpo OSCURATI (redacted: true); i metadati (mittente, data) rimangono visibili. I filtri subject, q e attachments corrispondono a ciò che il chiamante può leggere: senza l'ambito, un messaggio del genere corrisponde solo per oggetto e corpo oscurati, quindi una ricerca del codice che contiene non trova nulla.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
cursorstringCursore di impaginazione dalla risposta precedente
limitintegerNumero massimo di messaggi da restituire
directionstring(in | out | all)Filtra per direzione (impostazione predefinita: tutti)
folderstring(inbox | archive | sent | spam | trash)Cartella di sistema. Mutuamente esclusivi con vista. L'impostazione predefinita è la posta in arrivo.
labelstringEtichette separate da virgola: solo i messaggi che ne hanno almeno una
viewstring(starred | all | needs_human | scheduled)Vista virtuale. Si escludono a vicenda con la cartella.
sincestringTimestamp ISO: restituisce solo i messaggi creati dopo questa data
untilstringTimestamp ISO: restituisce solo i messaggi creati prima di questa data
fromstringFiltra per indirizzo del mittente
tostringFiltra per indirizzo del destinatario
subjectstringFiltra per argomento
qstringRicerca ampia senza distinzione tra maiuscole e minuscole tra mittente, destinatario, oggetto e corpo del testo normale
unreadbooleanRestituisce solo i messaggi non letti
attachmentsbooleanRestituisce i messaggi che contengono solo allegati
spambooleanFiltra per contrassegno spam (passa false per nascondere i messaggi in entrata contrassegnati come spam)

Risposta 200

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

Cerca email per significato e per parole

Cerca nelle caselle di posta che puoi leggere, o in una casella con mailbox. Ibrido per impostazione predefinita: l'embedding del messaggio (pgvector, cosine) e l'indice delle parole pesate sono fusi per rank reciproco con un piccolo boost di recency, in un'unica istruzione; why indica quale ramo ha trovato corrispondenza. Operatori Gmail in 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 o -from: per escludere, a OR b. Una query fatta solo di operatori elenca i messaggi corrispondenti dal più recente (why: filter). Codici e link di accesso, spam e posta di sistema non sono mai indicizzati; le caselle elencate in search_opt_out_mailbox_ids dell'assistente sono cercate solo per parole. Un token legato a un'identità agent cerca solo nelle caselle che il suo agent gestisce. Richiede email:read. Senza email:auth_secrets, la posta di autenticazione in arrivo viene esclusa prima dell'ordinamento: nessuna parola, operatore o filtro la trova, quindi la ricerca di un codice di accesso non trova nulla.

Parametri

mailboxstringLimita a un indirizzo casella (slug@domain).
q*stringQuello che stai cercando, in qualsiasi lingua: un nome, un riferimento o una descrizione dell'email, più gli operatori Gmail (`from:dave is:unread newer_than:7d -invoice "exact phrase"`).
modestring(hybrid | semantic | keyword)hybrid fonde l'embedding e le parole per rank; semantic usa solo il significato; keyword solo le parole.
limitintegerRisultati da restituire.
sincestringSolo email ricevute dopo questo timestamp ISO.
untilstringSolo email ricevute prima di questo timestamp ISO.
folderstring(inbox | archive | sent | spam | trash | anywhere)Una cartella. Trash è escluso a meno che non sia nominato o con `anywhere`.
fromstringL'indirizzo mittente contiene.
labelstringEtichette separate da virgola: solo i messaggi che ne hanno almeno una

Risposta 200

resultsobject[]
modestring
querystring
took_msinteger
hintstring

Esempio

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

Inizia a connettere una inbox Gmail

Restituisce l'URL di consenso Google associato al tuo account e al limite di importazione. Aprilo in un browser; dopo il consenso l'inbox diventa una casella di posta connessa al suo indirizzo, la posta ricevuta dopo il limite viene importata (predefinito: le ultime 24 ore), e la nuova posta segue man mano che arriva. Mai l'intera inbox: amplia successivamente con POST /api/emails/{address}/import. Richiede email:write. Google OAuth deve essere configurato sul server.

Richiedi corpo

accessstring(read | write)read (l'impostazione predefinita) legge la casella di posta; write consente inoltre alla piattaforma di modificare le etichette e lo stato di lettura e di inviare come la persona, per gli effetti di una delega permanente. Riconnetti con write per ampliare una concessione di sola lettura.
sincestring (date-time)Importa la posta ricevuta dopo questo istante
windowstring(24h | 7d | 30d | 1y)Un preset invece di since; predefinito 24h
workspace_idstringWorkspace a cui appartiene la casella di posta; il tuo workspace personale per impostazione predefinita
login_hintstringL'account Google da preselezionare
return_tostringPercorso app a cui inviare il browser dopo il consenso

Risposta 200

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

Inizia a connettere una casella di posta Outlook

Restituisce l'URL di consenso Microsoft associato al tuo account e al limite di importazione. Aprilo in un browser; dopo il consenso la casella diventa una mailbox connessa al proprio indirizzo, la posta ricevuta dopo il limite viene importata (predefinito: le ultime 24 ore), e la nuova posta segue man mano che arriva. Mai l'intera casella: amplia successivamente con POST /api/emails/{address}/import. Richiede email:write. OAuth Microsoft deve essere configurato sul server.

Richiedi corpo

accessstring(read | write)read (l'impostazione predefinita) legge la casella di posta; write consente inoltre alla piattaforma di modificare le etichette e lo stato di lettura e di inviare come la persona, per gli effetti di una delega permanente. Riconnetti con write per ampliare una concessione di sola lettura.
sincestring (date-time)Importa la posta ricevuta dopo questo istante
windowstring(24h | 7d | 30d | 1y)Un preset invece di since; predefinito 24h
workspace_idstringWorkspace a cui appartiene la casella di posta; il tuo workspace personale per impostazione predefinita
login_hintstringL'account Microsoft da preselezionare
return_tostringPercorso app a cui inviare il browser dopo il consenso

Risposta 200

auth_urlstring
statestring
import_sincestring (date-time)
expires_ininteger
accessstring
GET/api/emails/connect/providers

Elenca i modi in cui una casella di posta può essere connessa

Una riga per provider (Gmail, Outlook, qualsiasi casella di posta tramite inoltro, un indirizzo ospitato qui): come inizia la connessione (una schermata di consenso, una regola di inoltro, un indirizzo creato), cosa può fare la connessione (leggere, o leggere e scrivere), se importa posta più vecchia, e se questo server è configurato per esso. Mostra un pulsante di connessione solo quando configured è true; reason indica la variabile mancante per l'operatore. Richiede email:read.

Risposta 200

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

Connetti un inbox tramite inoltro

Crea una casella di posta connessa all'indirizzo proprio dell'inbox e risponde con un indirizzo di inoltro sul dominio di inoltro della piattaforma, con i passaggi per Gmail, Outlook e altri provider. Aggiungi una regola di inoltro al provider; ciò che arriva a quell'indirizzo viene estratto (mittente originale, data, oggetto) e memorizzato sotto la casella di posta connessa. Gmail chiede all'indirizzo di inoltro di confermare: il codice e il link appaiono sulla connessione. La prima mail che torna, o una prova (POST /api/emails/{address}/connector/verify), rende la connessione attiva. Solo la nuova posta arriva in questo modo; la posta più vecchia non può essere importata. Richiede email:write. Il dominio di inoltro deve essere configurato sul server.

Richiedi corpo

address*stringL'inbox da connettere, per esempio someone@gmail.com
workspace_idstringWorkspace a cui appartiene la casella di posta; il tuo workspace personale per impostazione predefinita

Risposta 200

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

Invia una prova attraverso la regola di inoltro

Invia una mail all'inbox connesso; quando la regola di inoltro la riporta all'indirizzo di inoltro, la connessione diventa attiva. Solo per una connessione tramite inoltro. Richiede email:write.

Parametri

address*stringL'indirizzo connesso, per esempio someone@gmail.com

Risposta 200

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

Leggi la connessione di una casella di posta connessa

Tipo, stato, il limite di importazione, la fase di sincronizzazione (la scansione di importazione, poi cronologia), il progresso di importazione (scansionate, copiate, da analizzare, analizzate), l'ultima sincronizzazione e l'ultimo errore. Richiede email:read. La conferma di inoltro (il codice e il link di Gmail) è posta di autenticazione: senza email:auth_secrets il suo codice e il suo url sono null e riporta redacted: true. Un token confinato a caselle di posta trova solo le proprie caselle (altrimenti 404).

Parametri

address*stringL'indirizzo connesso, per esempio someone@gmail.com

Risposta 200

addressstring
mailbox_idstring
kindstring
statusstring
import_sincestring (date-time) | nullIl limite della prima importazione: nessuna mail ricevuta prima di esso viene copiata
phasestringelenca mentre la scansione di importazione scorre la posta dopo il limite, cronologia una volta che la nuova posta segue la cronologia della fonte
paused_reasonstring | null
import_runobject | nullL'esecuzione di importazione corrente o più recente di questa casella di posta
source_messages_totalinteger | nullCiò che la sorgente riporta per l'intera inbox, per scala
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_usdnumberIl budget di spesa del modello consentito per esecuzione di importazione, in USD
accessstring | nullPer una connessione Gmail: cosa consente la concessione; write significa etichette in entrambe le direzioni e invio come la persona
forwardingobject | nullPer una connessione tramite inoltro: l'indirizzo di inoltro, cosa è arrivato, la conferma di Gmail, la prova, i passaggi
DELETE/api/emails/{address}/connector

Disconnetti una casella di posta connessa

Rimuove le copie personali (messaggi, allegati, righe di ricerca, lavori in sospeso) e le credenziali; mantiene la riga della casella di posta, il collegamento contrassegnato come disconnesso e ciò che hanno fatto gliagente (ricevute). Solo una casella di posta connessa può essere disconnessa. Richiede email:write.

Parametri

address*string

Risposta 200

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

Importa posta più vecchia di una casella di posta connessa

Amplia l'importazione a una data precedente: una nuova esecuzione di importazione copia la posta tra il nuovo limite e quello corrente, in ordine di arrivo, sotto il proprio limite di costo. Rifiutato mentre una scansione di importazione è ancora in esecuzione. Richiede email:write.

Parametri

address*string

Richiedi corpo

since*string (date-time)Il nuovo limite, precedente a quello attuale

Risposta 200

import_run_idstring
import_sincestring (date-time)
import_untilstring (date-time)
GET/api/emails/{address}/search

Cerca in una casella per significato e per parole

La stessa ricerca di GET /api/emails/search, limitata a questa casella. Richiede email:read. Senza email:auth_secrets, la posta di autenticazione in arrivo viene esclusa prima dell'ordinamento: nessuna parola, operatore o filtro la trova, quindi la ricerca di un codice di accesso non trova nulla.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
q*stringQuello che stai cercando, in qualsiasi lingua: un nome, un riferimento o una descrizione dell'email, più gli operatori Gmail (`from:dave is:unread newer_than:7d -invoice "exact phrase"`).
modestring(hybrid | semantic | keyword)hybrid fonde l'embedding e le parole per rank; semantic usa solo il significato; keyword solo le parole.
limitintegerRisultati da restituire.
sincestringSolo email ricevute dopo questo timestamp ISO.
untilstringSolo email ricevute prima di questo timestamp ISO.
folderstring(inbox | archive | sent | spam | trash | anywhere)Una cartella. Trash è escluso a meno che non sia nominato o con `anywhere`.
fromstringL'indirizzo mittente contiene.
labelstringEtichette separate da virgola: solo i messaggi che ne hanno almeno una

Risposta 200

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

Elenca le conversazioni di una casella di posta

Messaggi raggruppati nel modo in cui i client di posta li raggruppano: una risposta si unisce al thread del messaggio a cui risponde (In-Reply-To, poi la catena References), la posta senza intestazioni utilizzabili si unisce al thread più recente con lo stesso oggetto e un corrispondente in comune entro trenta giorni, tutto il resto avvia un thread il cui id è l'id del suo primo messaggio. I thread sono ordinati per ultima attività; cestino e spam non partecipano mai a meno che non siano nominati come cartella. folder=inbox|archive|sent mantiene i thread che hanno un messaggio lì ma conta comunque l'intera conversazione.

Parametri

address*string
folderstring(all | inbox | archive | sent | spam | trash)
sincestringSolo thread con attività dopo questo momento
limitinteger
cursorstringnext_cursor dalla pagina precedente
labelstringEtichette separate da virgola: solo i thread con un messaggio che ne ha almeno una

Risposta 200

threadsEmailThread[]
next_cursorstring | null
has_moreboolean
GET/api/emails/{address}/threads/{id}

Leggi una conversazione, messaggio più vecchio per primo

Ogni messaggio del thread (cestino incluso, quindi nulla manca dalla storia) con il suo testo, più vecchio per primo, più i partecipanti e il conteggio dei non letti. La posta di autenticazione è oscurata nel modo in cui lo sono le letture dei messaggi.

Parametri

address*string
id*stringId del thread (il thread_id di uno qualsiasi dei suoi messaggi)

Risposta 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

Trasmetti eventi della casella di posta (server-sent events)

Risponde con text/event-stream. Senza un cursor lo stream inizia dal presente; con since (un cursor da /api/email/changes o l'id di qualsiasi evento precedente) riproduce prima ogni modifica dopo quel punto, poi segue il journal della casella di posta in tempo reale: ogni frame porta il tipo della modifica come nome dell'evento (message.received, message.updated, message.deleted, message.moved, message.status, mailbox.resync_required, assistant.item.delegated, assistant.item.recalled, ...), la modifica come dati JSON con il suo cursor ripristinabile, e quello stesso cursor come id del frame. Il primo frame è ready con il cursor da cui riprendere; un commento keep-alive arriva ogni 20 secondi; la connessione si chiude dopo circa 5 minuti con un frame close e un suggerimento retry:. Riconnettiti con Last-Event-ID (o since) per riprendere senza interruzioni e senza duplicati. I token degli agente sono limitati alle caselle di posta su cui opera l'agente. Una voce su un elemento di lavoro creato dalla posta di autenticazione riporta title e ask oscurati per un token senza email:auth_secrets.

Parametri

address*string
sincestringCursor da cui riprodurre; il `cursor` di qualsiasi evento precedente o un next_cursor da /api/email/changes
GET/api/emails/{address}/folders

Elenca le cartelle e i conteggi della posta elettronica

Restituisce conteggi derivati dal server per cartelle di sistema e visualizzazioni virtuali, oltre a funzionalità del ciclo di vita per il backend della casella di posta.

Parametri

address*string

Risposta 200

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

Applicare un'azione del ciclo di vita ai messaggi

Sposta, ripristina, contrassegna come letti, contrassegna come Speciali o elimina definitivamente fino a 100 ID di messaggi espliciti. Lo spostamento nel Cestino è reversibile. L'eliminazione permanente richiede email:delete e accetta solo i messaggi già nel Cestino. Ogni risposta è una ricevuta di operazione durevole con un risultato per ID richiesto. Fornisci una chiave stabile nell'intestazione standard Idempotency-Key o nel campo JSON legacy idempotency_key e riutilizzala dopo i timeout; un tentativo esatto restituisce la ricevuta memorizzata senza un'altra mutazione. Se vengono forniti entrambi i moduli, devono corrispondere. Riutilizzare una chiave con una richiesta diversa restituisce 409. Se omesso, il server crea una chiave e la restituisce nel corpo e nell'intestazione Idempotency-Key. Restituisce 207 quando solo una parte del batch riesce.

Parametri

address*string

Richiedi corpo

message_ids*string[]
action*string(move | mark_read | star | restore | delete_permanently | label)
destinationstring(inbox | archive | sent | spam | trash)
readboolean
starredboolean
addstring[]label: etichette da aggiungere
removestring[]label: etichette da rimuovere
setstring[]label: sostituisce ogni etichetta (ha priorità su add e remove)
idempotency_keystringChiave stabile per questo esatto batch logico. Riutilizzare dopo un timeout.

Risposta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVero quando questa risposta ha riutilizzato la ricevuta immutabile completata e non ha eseguito alcuna nuova mutazione.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
PATCH/api/emails/{address}/messages/read

Contrassegna i messaggi come letti o non letti

Endpoint di compatibilità per aggiornamenti dello stato di lettura a prova di tentativo. Restituisce la ricevuta canonica dell'operazione durevole per articolo più il conteggio legacy. Fornisci e riutilizza l'intestazione Idempotency-Key o il campo di compatibilità idempotency_key dopo i timeout.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Richiedi corpo

message_ids*string[]ID dei messaggi da contrassegnare
read*booleantrue per contrassegnare come letto, false per contrassegnarlo come non letto
idempotency_keystring

Risposta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVero quando questa risposta ha riutilizzato la ricevuta immutabile completata e non ha eseguito alcuna nuova mutazione.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
countinteger
POST/api/emails/{address}/messages/delete

Eliminazione collettiva dei messaggi

Endpoint di compatibilità che sposta in modo sicuro i messaggi nel Cestino. Restituisce la ricevuta canonica dell'operazione durevole per articolo più il conteggio legacy. Fornisci e riutilizza l'intestazione Idempotency-Key o il campo di compatibilità idempotency_key dopo i timeout.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Richiedi corpo

message_ids*string[]ID dei messaggi da eliminare
idempotency_keystring

Risposta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVero quando questa risposta ha riutilizzato la ricevuta immutabile completata e non ha eseguito alcuna nuova mutazione.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
countinteger
GET/api/emails/{address}/messages/{id}

Ricevi un messaggio

Recupera un singolo messaggio per ID da una casella di posta identificata dal suo indirizzo email completo. I messaggi classificati come posta di autenticazione (OTP, reimpostazione della password, collegamento magico) ritornano con l'oggetto/corpo oscurato a meno che il token non abbia l'ambito email:auth_secrets.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
id*stringID del messaggio

Risposta 200

idstring
thread_idstringId della conversazione condiviso da ogni messaggio del thread (l'id del messaggio radice)
labelsstring[]Ogni etichetta sul messaggio; `label` è la prima
thread_keystringChiave di conversazione canonica con spazio dei nomi nel backend
thread_aliasesstring[]Chiavi del flusso di lavoro legacy da restituire quando si modifica lo stato della conversazione
message_idstring | null
directionstring
fromstringIl nome visualizzato e l'indirizzo del mittente ricavati dall'intestazione From (es. 'Alice <alice@example.com>'), oppure il solo indirizzo quando la posta non recava un nome.
avatar_urlstring (uri) | nullURL proxy Domani che preserva la privacy per l'avatar del mittente
tostringTutti i destinatari To dell'intestazione, con i nomi visualizzati, nell'ordine in cui il mittente li ha scritti (non solo l'indirizzo di busta che ha instradato questa posta alla casella).
ccstring | nullTutti i destinatari Cc dell'intestazione, con i nomi visualizzati, oppure null quando la posta non recava un Cc.
bccstring | nullDestinatari Bcc, presenti solo sul tuo messaggio in uscita (mai su uno ricevuto, e mai consegnati come intestazione).
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}

Elimina un messaggio

Sposta un messaggio nel Cestino. Questo è reversibile. Utilizza l'azione del ciclo di vita con delete_permanently e un token email:delete per cancellare un messaggio già nel Cestino.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
id*stringID del messaggio

Risposta 200

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

Rispondi a un messaggio

Rispondi a un messaggio in una casella identificata dal suo indirizzo completo. Le intestazioni del thread vengono compilate automaticamente e l’originale viene citato sotto la risposta come fanno i client di posta (riga di attribuzione nella lingua dell’account, righe > nel testo, un blocco gmail_quote nell’HTML), a meno che quote sia false. I client collaborativi devono passare il lease di composizione, il reply_version osservato e una chiave di idempotenza stabile; il server rifiuta atomicamente una risposta obsoleta o doppia subito prima dell’invio.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
id*stringID del messaggio a cui rispondere

Richiedi corpo

textstringCorpo della risposta in testo semplice
htmlstringCorpo della risposta HTML
ccanyDestinatari CC aggiuntivi
allbooleanRispondi a tutti: compila automaticamente CC dal A/CC originale
quotebooleanCita l’originale sotto la risposta; false invia solo il testo o l’HTML fornito
idempotency_keystringForma di compatibilità del corpo della chiave di idempotenza
coordinationobject

Risposta 200

idstring
message_idstring
fromstring
tostring
statusstring
reply_versionintegerGenerazione riservata per una risposta custodita
POST/api/emails/{address}/messages/{id}/forward

Inoltra un messaggio

Inoltra un messaggio da una casella di posta identificata dal suo indirizzo email completo a un altro destinatario. L'inoltro della posta di autenticazione (OTP, reimpostazione della password, collegamento magico) richiede l'ambito email:auth_secrets: esfiltrerebbe il segreto.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
id*stringID del messaggio da inoltrare

Richiedi corpo

to*stringIndirizzo e-mail del destinatario
textstringNota facoltativa da anteporre

Risposta 200

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

Ottieni informazioni sull'avatar della casella di posta

Restituisce l'URL Gravatar (se impostato) e il collegamento di registrazione per una casella di posta identificata dal suo indirizzo email completo.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Risposta 200

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

Ottieni la configurazione del webhook della casella di posta

Restituisce l'URL del webhook, il segreto di firma, i nomi delle intestazioni di autenticazione configurate e lo stato di una cassetta postale. I valori dell'intestazione non vengono mai restituiti.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Risposta 200

addressstring
webhook_urlstring | null
signing_secretstring | null
has_webhookboolean
eventsstring[]Eventi trasportati da questo webhook: email.received, qualsiasi verdetto di consegna sulla posta in uscita (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) e le notifiche di passaggio di consegne dell'agente (assistant.item.delegated, assistant.item.recalled); vuoto senza un webhook
header_namesstring[]Nomi di intestazione di autenticazione configurati; i valori non vengono mai restituiti
hintstring
PUT/api/emails/{address}/webhook

Imposta il webhook della casella di posta

Configura la destinazione HTTPS per gli eventi della casella di posta firmati HMAC: la posta in entrata per impostazione predefinita, più (su adesione tramite events) il verdetto di consegna della posta inviata DALLA casella: un rimbalzo raggiunge il mittente pochi secondi dopo l'accettazione dell'invio, invece di vivere solo nella cronologia del messaggio. Le consegne in entrata in tempo reale vengono archiviate in modo duraturo, tentate immediatamente e ritentate fino a tre volte. Ogni tentativo include X-Domani-Delivery-Attempt a partire da 1. I valori facoltativi di autorizzazione o X-API-Key vengono crittografati e non vengono mai restituiti; gli operatori umani dovrebbero inviarli al di fuori del contesto del modello tramite le opzioni delle variabili di ambiente CLI.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Richiedi corpo

url*stringURL del webhook HTTPS
eventsstring[]Eventi da inviare (assistant.item.delegated e assistant.item.recalled informano unagente che il proprietario gli ha affidato un elemento Today o lo ha ripreso; il webhook di ogni casella di posta che l'agente gestisce li riceve). Se omesso mantiene la sottoscrizione corrente (solo posta in arrivo per un nuovo webhook). I verdetti di consegna sulla posta inviata DALLA casella di posta sono opt-in e arrivano allo stesso URL con la stessa firma: {event, mailbox, email, message: {id, message_id, to, subject, status, detail}}.
headersobjectIntestazioni di autenticazione crittografate opzionali. Sono accettate solo Autorizzazione e X-API-Key; invia {} per cancellare. Non passare valori attraverso il contesto del modello; la CLI supporta --authorization-env e --api-key-env.

Risposta 200

addressstring
webhook_urlstring
signing_secretstring
has_webhookboolean
eventsstring[]Eventi trasportati da questo webhook: email.received, qualsiasi verdetto di consegna sulla posta in uscita (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) e le notifiche di passaggio di consegne dell'agente (assistant.item.delegated, assistant.item.recalled); vuoto senza un webhook
header_namesstring[]Nomi di intestazione di autenticazione configurati; i valori non vengono mai restituiti
hintstring

Esempio

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

Rimuovere il webhook della casella di posta

Rimuovere l'URL del webhook e il segreto di firma da una casella di posta. Verranno archiviate solo le e-mail in entrata.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Risposta 200

addressstring
webhook_urlstring | null
signing_secretstring | null
has_webhookboolean
eventsstring[]Eventi trasportati da questo webhook: email.received, qualsiasi verdetto di consegna sulla posta in uscita (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) e le notifiche di passaggio di consegne dell'agente (assistant.item.delegated, assistant.item.recalled); vuoto senza un webhook
header_namesstring[]
hintstring
POST/api/emails/{address}/webhook/rotate

Ruota il segreto di firma del webhook

Rigenera il segreto di firma HMAC-SHA256 per un webhook della casella di posta. Il vecchio segreto viene immediatamente invalidato.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Risposta 200

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

Testare il webhook della casella di posta

Invia un payload di prova firmato all'URL del webhook della casella di posta. Restituisce lo stato HTTP e se la consegna è riuscita. I test non vengono ripetuti; le consegne in entrata in tempo reale vengono ritentate fino a tre volte.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Risposta 200

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

Elenca gli alias della casella di posta

Elenca tutti gli indirizzi alias recapitati in una casella di posta. Gli alias consentono a diversi indirizzi (vendite@, ciao@, contatto@) di condividere una casella di posta senza utilizzare uno slot della casella di posta.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Risposta 200

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

Aggiungi un alias di casella di posta

Aggiungi un indirizzo alias che recapiti in questa casella senza occupare uno slot. L’alias deve appartenere allo stesso dominio della casella. Indica lo slug semplice ("sales") oppure l’indirizzo completo ("sales@mysite.com").

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Richiedi corpo

alias*stringIndirizzo alias: uno slug semplice o uno slug@domain completo sullo stesso dominio

Risposta 201

addressstring
mailboxstring
created_atstring (date-time)
hintstring
DELETE/api/emails/{address}/aliases/{alias}

Rimuovere un alias di casella di posta

Rimuovere un alias da una casella di posta. L'e-mail a quell'indirizzo non verrà più recapitata.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
alias*stringIndirizzo alias da rimuovere (codificato URL o semplice slug)

Risposta 200

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

Ottieni le impostazioni del client di posta (ospitato)

Ottieni le impostazioni di connessione IMAP/SMTP per una casella di posta ospitata, per configurare Apple Mail, Thunderbird o qualsiasi client di posta. Il nome utente è l'indirizzo completo; la password è una password dell'app (creane una con POST /api/emails/{address}/credentials). Solo caselle di posta ospitate.

Parametri

address*stringIndirizzo della casella di posta ospitata (codificata URL)

Risposta 200

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

Elenca le password delle app (ospitate)

Elenca le password dell'app per una casella di posta ospitata. I segreti vengono mostrati solo una volta al momento della creazione; questo restituisce solo etichette e metadati. Solo caselle di posta ospitate.

Parametri

address*stringIndirizzo della casella di posta ospitata (codificata URL)

Risposta 200

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

Creare una password per l'app (ospitata)

Crea una password dell'app per una casella di posta ospitata, utilizzata come password in un client di posta (IMAP/SMTP). Il segreto viene restituito una volta: archivialo ora. Solo caselle di posta ospitate.

Parametri

address*stringIndirizzo della casella di posta ospitata (codificata URL)

Richiedi corpo

labelstringEtichetta per identificare la password dell'app, ad es. "Posta portatile"

Risposta 201

idstring
labelstring
passwordstringLa password dell'app: mostrata una volta, memorizzala ora
client_settingsobject
hintstring
DELETE/api/emails/{address}/credentials/{id}

Revoca la password di un'app (ospitata)

Revoca la password di un'app. Qualsiasi client di posta che lo utilizza interrompe immediatamente la connessione. Solo caselle di posta ospitate.

Parametri

address*stringIndirizzo della casella di posta ospitata (codificata URL)
id*stringID password dell'app (dall'endpoint dell'elenco)

Risposta 200

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

Segnala un messaggio a un umano

Escala un messaggio all’umano dell’account (oppure rimuovi la segnalazione con clear=true). Imposta needs_human sul messaggio, trattiene la sua conversazione nello stato needs_human e attiva il webhook email.escalated + una notifica in-app. La primitiva di prodotto dietro 'answer the easy ones, stop on the one the human must decide'.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
id*stringID del messaggio da segnalare

Richiedi corpo

reasonstringPerché serve l’umano - mostrato nella notifica
clearbooleanRimuovi la segnalazione invece di impostarla (l’umano ha preso in carico)

Risposta 200

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

Imposta un promemoria di follow-up

Imposta (o cancella con clear=true) un promemoria di follow-up una tantum su un messaggio. Quando arriva remind_at e il messaggio è ancora senza risposta (in entrata: nessuna risposta inviata; in uscita: nessuna risposta in entrata ricevuta), email.reminder_due si attiva come webhook + notifica in-app e il promemoria si cancella da solo.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
id*stringID del messaggio da monitorare

Richiedi corpo

remind_atstring (date-time)Orario ISO 8601 del promemoria (da 1 minuto a 90 giorni nel futuro)
notestringContesto mostrato quando il promemoria scatta
clearbooleanCancella un promemoria in sospeso

Risposta 200

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

Elenca i contatti

La rubrica dell’account, alimentata automaticamente dal traffico di posta: corrispondenti, conteggi dei messaggi, ultima attività e note. Per impostazione predefinita prima i più attivi di recente (order=recent), per la visualizzazione: un contatto che riceve nuova posta durante una scansione paginata passa davanti al cursore, quindi quella scansione può saltarlo. Per sincronizzare l’intera rubrica, passa order=created: prima i più vecchi per data di creazione e poi per id, una chiave che non cambia mai, quindi ogni contatto presente per tutta la scansione viene restituito esattamente una volta e i contatti creati nel frattempo arrivano alla fine. Un cursore prosegue solo l’ordine da cui proviene (altrimenti 400 INVALID_CURSOR). Aggrega i dati di tutte le caselle di posta, quindi i token confinati a una casella vengono rifiutati (400 MAILBOX_CONFINED).

Parametri

qstringFiltra per sottostringa dell’indirizzo o del nome
limitintegerContatti da restituire (predefinito 50)
cursorstringCursore di impaginazione da una risposta precedente
orderstring(recent | created)Ordinamento. recent (predefinito): prima i più attivi di recente, per la visualizzazione. created: prima i più vecchi per data di creazione e poi per id, stabile per una scansione completa. Qualsiasi altro valore restituisce 400 INVALID_ORDER.

Risposta 200

contactsobject[]
next_cursorstring | null
POST/api/contacts

Crea o aggiorna un contatto

Salva un contatto: imposta un nome visualizzato e allega delle note ('prefers short emails', 'decision maker at Acme'). Il traffico di posta continua comunque ad alimentare i conteggi dei messaggi.

Richiedi corpo

address*stringL’indirizzo email del contatto
namestring | nullNome visualizzato (null lo cancella)
notesstring | nullNote che agenti e umani leggono per avere contesto (null le cancella)
DELETE/api/contacts/{address}

Elimina un contatto

Rimuovi un contatto dalla rubrica. Il traffico di posta lo ricreerà come contatto automatico se dovesse scrivere di nuovo.

Parametri

address*stringL’indirizzo email del contatto (codificato URL)
GET/api/emails/{address}/rules

Elenca le regole della posta in entrata

Elenca le regole di filtraggio in entrata di una casella di posta, nell'ordine di priorità in cui vengono applicate (prevale la prima corrispondenza).

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Risposta 200

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

Aggiungi una regola per la posta in entrata

Aggiungi una regola eseguita sui messaggi in entrata che corrispondono a un campo (from/to/subject/body). Azioni: drop, mark_read, forward (action_arg = indirizzo), webhook_only (salta l’inoltro) e label (action_arg = etichetta). Le regole si applicano in ordine di priorità crescente; vince la prima corrispondenza.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)

Richiedi corpo

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_argstringIndirizzo di inoltro (per forward), valore dell’etichetta (per label) o motivo mostrato all’umano (per escalate)
priorityintegerViene eseguito prima il valore inferiore (impostazione predefinita 0)
enabledbooleanPredefinito vero

Risposta 201

idstring
priorityintegerIl basso viene eseguito per primo
match_fieldstring
match_opstring
match_valuestring
actionstring
action_argstring | null
enabledboolean
created_atstring (date-time)
DELETE/api/emails/{address}/rules/{ruleId}

Rimuovere una regola della posta in entrata

Rimuovere una regola di filtro in entrata da una casella di posta.

Parametri

address*stringIndirizzo email della casella di posta (codificato URL)
ruleId*stringL'ID della regola

Risposta 200

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

Imposta il dominio catch-all

Indirizza ogni email inviata a un indirizzo senza corrispondenza nel dominio in una casella di posta designata. Tutto ciò che non corrisponde a una casella di posta, a un sottoindirizzo o a un alias finisce nel catch-all. La casella di posta deve già esistere nel dominio. Modifica la posta dell'intero dominio, quindi un token confinato a caselle di posta riceve 403 MAILBOX_CONFINED.

Parametri

domain*stringNome di dominio

Richiedi corpo

mailbox*stringCasella di posta catch-all: uno slug semplice o un indirizzo completo su questo dominio

Risposta 200

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

Cancella dominio universale

Rimuovi il catch-all su un dominio. Le e-mail indirizzate a indirizzi non corrispondenti verranno nuovamente eliminate. Modifica la posta dell'intero dominio, quindi un token confinato a caselle di posta riceve 403 MAILBOX_CONFINED.

Parametri

domain*stringNome di dominio

Risposta 200

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

Sincronizza in modo incrementale una casella di posta

Chiama senza cursore per acquisire una linea di base prima di uno snapshot completo limitato. Quindi passa next_cursor per riprodurre le mutazioni avvenute durante e dopo quell'istantanea. I cursori sono opachi, firmati, associati alla casella di posta e scadono dopo 30 giorni. Le notifiche push sono solo suggerimenti di invalidazione; questo diario è la fonte di recupero durevole. Una voce su un elemento di lavoro creato dalla posta di autenticazione riporta title e ask oscurati per un token senza email:auth_secrets.

Parametri

mailbox_id*string
cursorstringnext_cursor opaco da una risposta precedente
limitinteger

Risposta 200

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

Elenca gli indirizzi soppressi

Elenca gli indirizzi nell'elenco di soppressione: mancati recapiti e reclami (acquisiti automaticamente dagli eventi di consegna) più inserimenti manuali. Gli invii a questi indirizzi vengono saltati. Impaginato con il cursore.

Parametri

cursorstringCursore di impaginazione da una risposta precedente
limitintegerNumero massimo di voci (predefinito 50, massimo 100)

Risposta 200

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

Aggiungi una soppressione

Aggiungi manualmente un indirizzo all'elenco di soppressione in modo che gli invii futuri lo saltino. I mancati recapiti permanenti e i reclami vengono aggiunti automaticamente; usalo per gli indirizzi a cui desideri interrompere l'invio di email. Idempotente.

Richiedi corpo

address*stringIndirizzo email da eliminare
reasonstring(manual | hard_bounce | complaint)Motivo (predefinito: manuale)

Risposta 201

addressstring
reasonstring
sourcestring
created_atstring (date-time)
hintstring
DELETE/api/suppressions/{address}

Rimuovere una soppressione

Rimuovi un indirizzo dall'elenco di soppressione in modo da poterlo inviare nuovamente via email (ad esempio dopo che il destinatario ha corretto la propria casella di posta).

Parametri

address*stringIndirizzo email soppresso (codificato URL)

Risposta 200

addressstring
deletedboolean
hintstring

Collaboration

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

Richiedi un trasferimento della proprietà dell'area di lavoro

Solo proprietario. Invia un collegamento di accettazione di 48 ore a un membro esistente. Niente si muove finché il membro autenticato non accetta.

Parametri

id*string

Richiedi corpo

membership_id*string
DELETE/api/workspaces/{id}/ownership-transfer/{transferId}

Revocare un trasferimento di proprietà in sospeso

Parametri

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

Accetta la proprietà dell'area di lavoro

Solo target. Trasferisce atomicamente lo spazio di lavoro, i domini con ambito e le caselle di posta; il proprietario precedente diventa amministratore e il pagatore esistente rimane invariato.

Richiedi corpo

token*string

Autenticazione

POST/api/auth/registerPubblico

Crea un nuovo account

Inizia la creazione di un nuovo account (o accede a uno esistente) inviando un link di accesso via e-mail; qui non viene restituita nessuna chiave API. Una persona che clicca su quel link da un browser arriva alla dashboard già autenticata. Una CLI o un agente senza sessione del browser dovrebbe usare invece il flusso di accesso da dispositivo (POST /api/auth/cli e poi interrogare GET /api/auth/cli/poll), che invia via e-mail la stessa approvazione e restituisce una chiave API una volta approvata - la risposta lo indica in next_steps. Passare un codice ref collega permanentemente il nuovo utente a un referente - il referente guadagna una commissione su tutti i futuri acquisti di domini di questo utente.

Richiedi corpo

email*string (email)
refstringCodice referral: collega permanentemente questo utente al referrer. Il referrer guadagna una commissione su ogni acquisto di dominio.

Risposta 202

okboolean
verification_requiredboolean
messagestring
hintstring
next_stepsstring[]

Risposta di esempio

{
  "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."
  ]
}

Esempio

curl -X POST https://domani.run/api/auth/register \
  -H "Content-Type: application/json" \
  -d '{"email": "dev@example.com"}'
POST/api/auth/loginPubblico

Invia un'e-mail di accesso con collegamento magico

Invia un collegamento di accesso all'e-mail fornita. Se l'utente non esiste, crea prima un account. Il collegamento magico reindirizza alla dashboard con credenziali di autenticazione. Per l'accesso API programmatico, utilizza POST /api/auth/register per ottenere direttamente una chiave API.

Richiedi corpo

email*string (email)

Risposta 200

okboolean
messagestring

Risposta di esempio

{
  "ok": true,
  "message": "Check your email for a sign-in link."
}

Esempio

curl -X POST https://domani.run/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "dev@example.com"}'
POST/api/auth/handoff

Genera un codice di accesso monouso tra host

Solo browser: consente a una persona che ha effettuato l’accesso su domani.run o mailzero.run di riprendere la sessione sull’altro host senza un secondo collegamento magico. Restituisce un URL il cui frammento contiene un codice monouso, valido 60 secondi e legato all’host; il codice non viene mai registrato nei log né inviato in una stringa di query. Non serve al di fuori di una sessione del browser, quindi non è esposto come strumento per agenti.

Richiedi corpo

target*string(mail | domani)
path*string

Risposta 200

urlstring

Risposta di esempio

{
  "url": "https://mailzero.run/auth/handoff#code=xxx&next=%2Finbox"
}
POST/api/auth/handoff/redeemPubblico

Riscatta un codice di accesso monouso tra host

Solo browser: viene chiamato dalla pagina /auth/handoff sull’host di destinazione per scambiare il codice del frammento dell’URL con una sessione, esattamente come fa GET /api/auth/verify per un collegamento magico. Il codice deve corrispondere all’Host su cui è arrivata questa richiesta. Non è uno strumento per agenti.

Richiedi corpo

code*string

Risposta 200

okboolean
nextstring

Risposta di esempio

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

Account

GET/api/me

Ottieni i dettagli del conto corrente

Restituisce le informazioni sull'account dell'utente autenticato, inclusi e-mail, stato del pagamento, stato delle informazioni di contatto, codice di riferimento e conteggi di utilizzo. Gli agenti dovrebbero chiamarlo dopo l'autenticazione per verificare has_payment_method e has_contact prima di tentare gli acquisti.

Risposta 200

idstring
emailstring (email)
planstringChiave personale attiva del piano Domani
workspace_plansstring[]Chiavi attive distinte del piano Mailzero sugli spazi di lavoro a cui l'utente può accedere
has_payment_methodbooleanSe l'utente ha una carta in archivio (richiesto prima di acquistare domini)
preferred_payment_methodstring | null
preferred_localestringLocale utilizzata dalle interfacce Domani e dalle comunicazioni transazionali
has_contactbooleanSe l'utente ha impostato le informazioni di contatto WHOIS. Facoltative per gli acquisti (finché non sono impostate, il contatto di Domani detiene i nuovi domini per conto dell'utente), obbligatorie per un trasferimento in entrata.
contactRegistrantContactInformazioni di contatto del registrante (null se non impostato)
referral_codestringIl tuo codice di riferimento univoco
referral_rateintegerPercentuale di commissione sugli acquisti riferiti
balancenumberSaldo del credito del mercato in USD (guadagnato dalle vendite)
domain_countintegerNumero di domini posseduti
token_countintegerNumero di token API attivi
featuresstring[]Flag delle funzionalità abilitati per questo account (funzionalità GA più le funzionalità in anteprima concesse all’utente), ad es. mailzero_assistant
can_manage_assistantbooleanIndica se il token chiamante ha l'ambito assistant:read. Indipendente da `features`: un flag di funzionalità indica che l'account è idoneo per l'assistente, questo indica se questo token specifico (accesso completo, o un token con ambito CLI/OAuth/delegato) può leggere o modificare le sue impostazioni.
is_adminboolean
mailbox_entitlementobjectSpazio per caselle su dominio personalizzato nello spazio di lavoro personale dell’account. Ha un proprio piano, non il `plan` qui sopra: uno spazio di lavoro può avere un proprio abbonamento Mailzero mentre il piano dell’utente resta gratuito.
created_atstring (date-time)

Risposta di esempio

{
  "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"
}

Esempio

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

Aggiorna le preferenze dell'account

Aggiorna il metodo di pagamento preferito dell'utente autenticato e/o la locale BCP 47. Le risposte API rimangono strutturate e non vengono tradotte.

Richiedi corpo

preferred_payment_methodstring | null(card | usdc)Metodo di pagamento predefinito per gli acquisti (card, usdc o null per la selezione automatica)
preferred_localestring(en | fr | es | pt-BR | ja | zh-Hans | it)Locale utilizzata dalle interfacce Domani e dalle comunicazioni transazionali

Risposta 200

preferred_payment_methodstring | null
preferred_localestring
hintstring
DELETE/api/me

Elimina account (bloccato mentre i domini sono trattenuti)

Elimina definitivamente l'account, i token, i webhook, le caselle di posta e gli altri dati dell'applicazione dell'utente autenticato. I domini registrati NON vengono eliminati con l'account: la richiesta fallisce con 409 HAS_DOMAINS finché tutti i domini non vengono trasferiti. Questa azione non può essere annullata.

Risposta 200

deletedboolean
hintstring
GET/api/me/activation

Ottieni uno stato di attivazione veritiero e le azioni successive consigliate

Restituisce le tappe fondamentali del prodotto derivato dal server e le azioni successive basate sulle capacità. La creazione di token, l'utilizzo di token, le visualizzazioni di pagina e lo stato dell'elenco di controllo del client sono deliberatamente esclusi.

Risposta 200

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

Esempio

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

Ignora o ripristina la guida di prima esecuzione

Memorizza solo la preferenza di presentazione. Non può completare un'attività cardine del prodotto.

Richiedi corpo

dismissed_version*integer

Risposta 200

dismissed_versioninteger
hintstring
GET/api/me/contact

Ottieni le informazioni di contatto del registrante

Restituisce le informazioni di contatto WHOIS del registrante per l'utente autenticato. Facoltative per gli acquisti (finché non sono impostate, il contatto di Domani detiene i nuovi domini per conto dell'utente), obbligatorie per un trasferimento in entrata.

Risposta 200

has_contactboolean
contactRegistrantContact

Risposta di esempio

{
  "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"
  }
}

Esempio

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

Imposta le informazioni di contatto del registrante

Imposta o aggiorna le tue informazioni di contatto WHOIS del registrante. Facoltative per gli acquisti, obbligatorie per un trasferimento in entrata. Diventano il contatto registrante e di fatturazione dei tuoi domini: finché non sono impostate, il contatto di Domani li detiene per tuo conto. A ogni aggiornamento, il nuovo contatto viene inviato a tutti i tuoi domini attivi presso i registrar che supportano le modifiche dei contatti, il che ti rende il loro registrante; il registrar può chiederti via email di confermarlo entro 15 giorni.

Risposta 200

contactRegistrantContact

Esempio

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

Invia nuovamente la verifica dell'e-mail di contatto

Invia nuovamente l’email di verifica all’indirizzo di contatto dell’account. Limitato a un invio ogni 15 minuti per indirizzo.

Richiedi corpo

emailstring (email)Indirizzo email da verificare (l'impostazione predefinita è l'email di contatto dell'account)

Risposta 200

sentboolean
already_verifiedboolean
hintstring
GET/api/sessions

Elenca i dispositivi connessi

Ogni browser, app mobile e terminale con accesso all'account, prima la sessione di chi chiama (current). Ogni accesso apre una sessione propria, quindi accedere da un nuovo dispositivo non disconnette mai gli altri. La posizione è il luogo da cui il dispositivo ha effettuato l'accesso (paese e città dal suo IP), assente se sconosciuta. Le chiavi API non sono sessioni: elencale con GET /api/tokens.

Risposta 200

sessionsobject[]
hintstring

Risposta di esempio

{
  "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."
}

Esempio

curl https://domani.run/api/sessions \
  -H "Authorization: Bearer domani_sk_xxx"
DELETE/api/sessions

Disconnetti tutti gli altri dispositivi

Disconnette tutte le sessioni dell'account tranne quella che effettua la richiesta. A quei dispositivi verrà chiesto di accedere di nuovo alla prossima richiesta. Le chiavi API restano invariate.

Risposta 200

revokedinteger
hintstring

Risposta di esempio

{
  "revoked": 2,
  "hint": "Every other device is signed out. API keys are unchanged."
}

Esempio

curl -X DELETE https://domani.run/api/sessions \
  -H "Authorization: Bearer domani_sk_xxx"
DELETE/api/sessions/{id}

Disconnetti un dispositivo

Disconnette una sessione. current indica la sessione che effettua la richiesta (disconnettersi non richiede alcun ambito); qualsiasi altra sessione richiede tokens:write.

Parametri

id*stringID della sessione (da GET /api/sessions), oppure `current`

Risposta 200

successboolean
currentbooleanVero quando chi chiama si è disconnesso da solo: la sua chiave non funziona più
hintstring

Risposta di esempio

{
  "success": true,
  "current": false,
  "hint": "That device is signed out and will be asked to sign in again."
}

Esempio

curl -X DELETE https://domani.run/api/sessions/cm5ses456 \
  -H "Authorization: Bearer domani_sk_xxx"

Token API

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

Elenca i token API di un'identità agente

I token associati a questa identità agente (chiavi mascherate, scope, confinamento mailbox, ultimo utilizzo). Un token associato ad un agente è la vista di quell'agente su ogni superficie assistant e mail.

Parametri

slug*stringL'handle dell'identità agente.
POST/api/agents/identity/{slug}/tokens

Assegna ad un agente la propria chiave API in una sola chiamata

Crea un token associato a questa identità agente, confinato alle mailbox che l'agente gestisce, con gli scope minimi di cui un agente ha bisogno (assistant:read, assistant:write, email:read, email:write). Con quella chiave l'agente legge solo il proprio Today, le proprie mailbox e gli elementi che gli sono stati assegnati; nominare un altro agente risponde 403 e le route riservate al proprietario (settings, backfill, export) lo rifiutano. La chiave completa viene restituita solo in questa risposta. Richiede tokens:write. Un agente che non gestisce alcuna casella di posta non riceve ambiti di posta per impostazione predefinita, e richiederli risponde 400 AGENT_MAILBOXES_REQUIRED: una chiave senza caselle raggiungerebbe tutte le caselle di posta dell'account.

Parametri

slug*stringL'handle dell'identità agente.

Richiedi corpo

namestringPredefinito a '<slug> agent'.
scopesstring[]Predefinito a assistant:read, assistant:write, email:read, email:write. Non può superare gli scope del chiamante stesso.
mailboxesstring[]Indirizzi mailbox a cui il token è confinato. Predefinito alle mailbox che l'agente gestisce.
expires_inintegerSecondi fino alla scadenza (massimo un anno).

Risposta 201

successboolean
tokenobject
agentobject
hintstring

Esempio

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}

Revoca un token API di un agente

Revoca un token associato a questa identità agente. Smette di funzionare immediatamente. Richiede tokens:write.

Parametri

slug*string
id*string

Risposta 200

successboolean
hintstring
GET/api/tokens

Elenca i tuoi token API

Restituisce tutti i token API per l'utente autenticato. Le chiavi sono mascherate per motivi di sicurezza (primi 12 + ultimi 4 caratteri visibili). Utilizzalo per controllare i token attivi.

Risposta 200

tokensTokenInfo[]

Risposta di esempio

{
  "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"
    }
  ]
}

Esempio

curl https://domani.run/api/tokens \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/tokens

Crea un nuovo token API

Crea un nuovo token API. La chiave completa viene restituita solo in questa risposta: conservala in modo sicuro. Puoi creare più token per separare l'accesso per diverse applicazioni.

Richiedi corpo

namestringNome leggibile per identificare questo token
expires_inintegerDurata del token in secondi (min 3600 = 1 ora, max 31536000 = 1 anno). Omettere senza scadenza.
expires_atstring (date-time)Data di scadenza assoluta (ISO 8601). Alternativa a expires_in.
scopesstring[]Ambiti di autorizzazione per questo token. Utilizza ['*'] per l’accesso completo (impostazione predefinita). Un token può concedere solo gli ambiti di cui già dispone (attenuazione dell’ambito). Ambiti: 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 (comporta il pagamento, include gli acquisti sul marketplace)), 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 (Elimina definitivamente i messaggi già presenti nel Cestino. Lo spostamento dei messaggi nel Cestino richiede solo email:write. Concedi questo ambito solo agli agenti autorizzati a cancellare in modo irreversibile il contenuto della posta elettronica), email:manage_mailboxes (Crea caselle di posta (POST /api/emails) e nient’altro. L’ambito amministrativo ristretto per gli agenti che possono attivare indirizzi per nuovi progetti (partners@, launch@) senza poter leggere o inviare posta, gestire domini o toccare i token), email:auth_secrets (Leggi i messaggi classificati come posta di autenticazione (OTP / codici di verifica, reimpostazioni della password, collegamenti magici). Senza questo ambito, email:read li elenca comunque, ma oggetto e corpo vengono restituiti oscurati - così un token di agente rubato non può raccogliere codici 2FA. Concedilo solo agli agenti che hanno davvero bisogno di completare gli accessi), 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 (Legge le impostazioni dell'assistente Mailzero, la coda Today, gli elementi Work, le anteprime esatte delle azioni, i progressi di importazione della cronologia e l'Activity con contenuto minimizzato), assistant:write (Modifica le impostazioni dell'assistente Mailzero, registra il consenso e avvia le importazioni della cronologia, registra le Decisions umane sugli elementi Work, riprova le importazioni ed esporta o elimina i dati derivati dell'assistente. Non invia mai posta).
max_per_txnumberLimite di spesa per transazione in USD. Qualsiasi singolo addebito superiore a questo valore fallisce con 403 SPEND_CAP_EXCEEDED. Un token può garantire solo limiti pari o inferiori al proprio (altrimenti CAP_ESCALATION).
max_per_monthnumberLimite di spesa mensile in USD per tutte le operazioni a pagamento effettuate con questo token.
agent_identity_idstringID facoltativo dell'identità dell'agente di proprietà di questo account. Le azioni di posta effettuate con il token vengono attribuite a quell'agente.
http_route_policyobjectAutorità strutturata obbligatoria per un token con ambito che include http-routes:read o http-routes:write.
mailboxesstring[]Confina il token a questi indirizzi di casella di posta (slug@domain). Un token confinato vede e agisce solo su quelle caselle; un chiamante confinato può delegare solo un sottoinsieme delle proprie (altrimenti 400 MAILBOX_ESCALATION).

Risposta 201

idstring
namestring
keystringChiave API completa: salvala, non verrà mostrata più
expiresAtstring (date-time) | nullQuando questo token scade (null = mai)
scopesstring[]Ambiti delle autorizzazioni concessi a questo token
createdAtstring (date-time)
max_per_txnumber | nullLimite di spesa per transazione in USD (null = illimitato)
max_per_monthnumber | nullLimite di spesa mensile in USD (null = illimitato)
mailbox_idsstring[]ID delle caselle di posta a cui questo token è confinato
http_route_policyHttpRoutePolicy
agent_identityobject | null

Risposta di esempio

{
  "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
}

Esempio

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}

Revoca un token API

Revoca permanentemente un token API. Tutte le applicazioni che utilizzano questo token perderanno immediatamente l'accesso. Questa azione non può essere annullata.

Parametri

id*stringID token (dalla risposta GET /api/tokens)

Risposta 200

successboolean

Risposta di esempio

{
  "success": true
}

Esempio

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

Elenca gli eventi di controllo della sicurezza

Restituisce il registro di audit di sicurezza dell’account, dal più recente: ciclo di vita dei token (creazione, revoca, tentativi di escalation), rifiuti per limite di spesa e max_price, addebiti, richieste di pagamento ed eliminazioni di account bloccate. Usalo per monitorare l’attività dei token dei tuoi agenti.

Parametri

limitintegerEventi per pagina
cursorstringCursore di paginazione (next_cursor dalla pagina precedente)
typestringFiltra per tipo di evento (ad esempio token.creato, acquisto.addebitato, acquisto.denied_cap)

Risposta 200

eventsobject[]
next_cursorstring | null
hintstring

Risposta di esempio

{
  "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."
}

Esempio

curl "https://domani.run/api/audit?limit=50" \
  -H "Authorization: Bearer domani_sk_xxx"

Webhooks

GET/api/webhooks

Elenca webhook

Elenca tutti gli endpoint webhook configurati per il tuo account. Restituisce l'URL, gli eventi sottoscritti e lo stato attivo per ciascun webhook. I segreti non vengono mai restituiti dopo la creazione. Un token confinato a caselle di posta vede solo i webhook confinati alle proprie caselle.

Risposta 200

webhooksobject[]
hintstring

Risposta di esempio

{
  "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)."
}

Esempio

curl https://domani.run/api/webhooks \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/webhooks

Crea webhook

Registra un nuovo endpoint webhook HTTPS. I valori facoltativi di autorizzazione o X-API-Key vengono crittografati quando sono inattivi e inclusi in ogni consegna. Il segreto della firma viene restituito una sola volta. Massimo 5 webhook per account. Un webhook creato da un token confinato a caselle di posta è confinato alle stesse caselle: non riceve alcun evento di posta da altre caselle.

Richiedi corpo

url*string (uri)URL HTTPS che riceverà le richieste POST del webhook
events*string[]Tipi di eventi a cui iscriversi. Utilizzare GET /api/webhooks/events per elencare i tipi disponibili.
headersobjectIntestazioni di autenticazione crittografate opzionali. Sono accettate solo l'autorizzazione e la X-API-Key.

Risposta 200

idstring
urlstring (uri)
eventsstring[]
secretstringSegreto di firma HMAC-SHA256 (mostrato una volta)
activeboolean
header_namesstring[]Nomi di intestazione di autenticazione configurati; i valori non vengono mai restituiti
created_atstring (date-time)
hintstring

Risposta di esempio

{
  "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."
}

Esempio

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}

Aggiorna webhook

Aggiorna l'URL di un webhook, gli eventi sottoscritti, lo stato attivo o le intestazioni di autenticazione crittografate. Invia solo i campi che desideri modificare. Un token confinato a caselle di posta raggiunge solo i webhook confinati alle proprie caselle (altrimenti 404).

Parametri

id*stringID del webhook

Richiedi corpo

urlstring (uri)Nuovo URL HTTPS
eventsstring[]Nuovo elenco di tipi di eventi
activebooleanImposta false per mettere in pausa, true per riprendere
headersobjectSostituisci le intestazioni di autenticazione crittografate; invia {} per cancellare. Sono accettate solo l'autorizzazione e la X-API-Key.

Risposta 200

idstring
urlstring (uri)
eventsstring[]
activeboolean
header_namesstring[]Nomi di intestazione di autenticazione configurati; i valori non vengono mai restituiti
hintstring
DELETE/api/webhooks/{id}

Elimina webhook

Elimina un endpoint webhook. Tutte le consegne in sospeso verranno annullate. Questa operazione non può essere annullata. Un token confinato a caselle di posta raggiunge solo i webhook confinati alle proprie caselle (altrimenti 404).

Parametri

id*stringID del webhook

Risposta 200

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

Elenca le consegne dei webhook

Ottieni tentativi di consegna recenti per un webhook. Mostra il tipo di evento, lo stato HTTP, il numero di tentativi ed eventuali errori. Utile per il debug di consegne non riuscite. Un token confinato a caselle di posta raggiunge solo i webhook confinati alle proprie caselle (altrimenti 404).

Parametri

id*stringID del webhook
limitintegerNumero massimo di consegne da restituire

Risposta 200

deliveriesobject[]
hintstring

Risposta di esempio

{
  "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

Riprodurre una consegna di webhook

Clonare e riconsegnare immediatamente un evento webhook immutabile. Il payload dell'evento e l'ID evento rimangono identici; la firma HMAC riceve un nuovo timestamp. Una chiave di idempotenza richiesta garantisce che i nuovi tentativi del chiamante non vengano mai inviati due volte. Un token confinato a caselle di posta raggiunge solo i webhook confinati alle proprie caselle (altrimenti 404). Un'eccezione al payload identico: un oggetto copiato dalla posta di autenticazione viene inviato oscurato, perché l'URL del webhook può essere cambiato dal primo invio.

Parametri

id*stringID del webhook
deliveryId*stringID di consegna originale

Richiedi corpo

idempotency_key*string

Risposta 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

Elenca i tipi di eventi webhook

Elenca tutti i tipi di eventi webhook disponibili con le descrizioni. Nessuna autenticazione richiesta.

Risposta 200

eventsobject[]

Risposta di esempio

{
  "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"
    }
  ]
}

Esempio

curl https://domani.run/api/webhooks/events

Notifiche

GET/api/notifications

Elenca notifiche

Elenca le notifiche in-app con paginazione basata sul cursore. Include eventi delle transazioni, aggiornamenti delle inserzioni e avvisi di sistema. Richiede l’ambito notifications:read. Una notifica scritta prima che gli oggetti delle email venissero oscurati in scrittura si legge con l'oggetto della posta di autenticazione oscurato, in body e data.subject, per un token senza email:auth_secrets.

Parametri

limitintegerNotifiche massime da restituire
cursorstringCursore per l'impaginazione (dal next_cursor della risposta precedente)

Risposta 200

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

Ottieni il conteggio delle notifiche non lette

Endpoint leggero per il polling del conteggio delle notifiche non lette. Richiede l'ambito notifications:read.

Risposta 200

unread_countinteger

Risposta di esempio

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

Contrassegna la notifica come letta

Contrassegna una singola notifica come letta. Richiede l'ambito notifications:read.

Parametri

id*stringID di notifica

Richiedi corpo

read*booleanImposta su true per contrassegnare come letto

Risposta 200

okboolean
POST/api/notifications/read-all

Contrassegna tutte le notifiche come lette

Contrassegna tutte le notifiche non lette come lette. Richiede l'ambito notifications:read.

Risposta 200

okboolean
countintegerNumero di notifiche contrassegnate come lette
GET/api/notifications/preferences

Ottieni le preferenze di notifica

Restituisce le preferenze di notifica dell'utente per ogni categoria e canale (in_app, email). Le preferenze mancanti sono abilitate per impostazione predefinita. Richiede l'ambito notifications:read.

Risposta 200

preferencesobject[]
expiry_alert_daysinteger[]Giorni prima della scadenza, l'utente riceve promemoria di rinnovo (impostazione predefinita 30/7/1). Vuoto = nessun promemoria di scadenza.
PUT/api/notifications/preferences

Aggiorna le preferenze di notifica

Aggiorna le preferenze di notifica per categorie e canali specifici. Richiede l'ambito notifications:read.

Richiedi corpo

preferencesobject[]
expiry_alert_daysinteger[]Giorni prima della scadenza per ricevere promemoria di rinnovo. Array vuoto = nessun promemoria di scadenza.

Risposta 200

okboolean

TLD

GET/api/tldsPubblico

Elenca i TLD venduti da Domani, con i prezzi

Restituisce i TLD venduti da Domani, con i prezzi di registrazione, rinnovo e trasferimento. È il catalogo dei nostri registrar, non tutti i TLD esistenti: alcuni TLD della zona radice, come gov o edu, non possono essere registrati tramite Domani. Ogni voce ha un kind: tld (un TLD della zona radice IANA), second_level (un'offerta sotto uno di essi, come co.uk) o alt_root (un nome fuori dalla zona radice, che non si risolve nel DNS pubblico). Le voci alt_root sono escluse a meno che il parametro kind non le richieda. Supporta il filtraggio per fascia di prezzo, la ricerca per nome TLD, l'ordinamento e l'impaginazione tramite limit/offset. Quando impaginato, include un'intestazione Link con l'URL della pagina successiva. Endpoint pubblico: non è richiesta alcuna autenticazione. Le richieste autenticate ottengono limiti di velocità più elevati (60/min contro 30/min).

Parametri

max_pricenumberPrezzo massimo di registrazione in USD
min_pricenumberPrezzo minimo di registrazione in USD
sortstring(tld | price | renewal)Ordina il campo: "tld" (alfabetico), "price" (registrazione) o "renewal"
orderstring(asc | desc)Ordinamento
searchstringFiltra i nomi TLD contenenti questa stringa
limitintegerRisultati massimi per pagina
offsetintegerNumero di risultati da saltare
kindstringTipi da restituire, separati da virgole: `tld`, `second_level`, `alt_root`. Predefinito: `tld,second_level`, le voci che si risolvono nel DNS pubblico. Le voci `alt_root` (fuori dalla zona radice IANA) vengono restituite solo se richieste.

Risposta 200

tldsTldInfo[]
totalintegerTLD corrispondenti totali (prima dell'impaginazione)
offsetinteger
limitinteger | null

Risposta di esempio

{
  "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
}

Esempio

curl https://domani.run/api/tlds?max_price=10&sort=price

Domini

GET/api/domains

Elenca tutti i tuoi domini registrati

Restituisce tutti i domini di proprietà dell'utente autenticato, ordinati per data di acquisto (prima il più recente). Include nome di dominio, stato, data di acquisto e data di scadenza.

Risposta 200

domainsDomainRecord[]

Risposta di esempio

{
  "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
    }
  ]
}

Esempio

curl https://domani.run/api/domains \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/agents/identity

Rivendica un'identità di agente libero (<handle>.domani.run)

Fornisce a un agente un'identità gratuita su <slug>.domani.run: una pagina di profilo live, senza acquisto di dominio, istantaneamente. Il modo senza attriti per iniziare; esegui l'upgrade a un dominio di proprietà reale in un secondo momento. Richiede account:write.

Richiedi corpo

slug*stringL'handle diventa <slug>.domani.run
namestringNome visualizzato
biostring
emojistringEmoji dell'avatar
emailstring (email)Contatto pubblico (ad esempio la tua casella di posta gratuita @domani.run)
linksobject[]

Risposta 200

idstringID identità stabile utilizzato per associare token API con ambito
slugstring
urlstringIl sottodominio identità (canonico)
page_urlstringFallback del percorso che funziona sempre
namestring | null
biostring | null
emojistring | null
emailstring | null
linksobject[]
viewsinteger
created_atstring (date-time)

Risposta di esempio

{
  "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"
}

Esempio

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

Elenca le identità dei tuoi agenti

Elenca le identità libere (<handle>.domani.run) che hai rivendicato. Richiede account:read.

Risposta 200

identitiesAgentIdentity[]
PATCH/api/agents/identity/{slug}

Aggiorna l'identità di un agente

Aggiorna i campi name/bio/emoji/email/links di un’identità gratuita. Richiede account:write.

Parametri

slug*stringHandle da aggiornare

Richiedi corpo

namestring
biostring
emojistring
emailstring
linksobject[]

Risposta 200

idstringID identità stabile utilizzato per associare token API con ambito
slugstring
urlstringIl sottodominio identità (canonico)
page_urlstringFallback del percorso che funziona sempre
namestring | null
biostring | null
emojistring | null
emailstring | null
linksobject[]
viewsinteger
created_atstring (date-time)
DELETE/api/agents/identity/{slug}

Rilascia l'identità di un agente

Rilascia un handle di identità gratuito in modo che sia nuovamente disponibile. Richiede account:write.

Parametri

slug*stringLa maniglia per rilasciare

Risposta 200

successboolean
slugstring
releasedboolean
POST/api/agents/provision

Fornisci l'identità completa dell'agente in una sola chiamata

Fornisce a un agente AI un'identità Internet completa in un'unica richiesta: acquista il dominio (se non già posseduto), configura il DNS di posta elettronica, crea una casella di posta e, facoltativamente, registra un webhook autenticato per la posta elettronica in entrata e gli eventi del dominio. webhook_headers accetta solo Authorization e X-API-Key; i valori vengono crittografati quando sono inattivi e non vengono mai restituiti. La ripetizione dello stesso dominio, slug della casella di posta e URL webhook riutilizza tali risorse. Ogni input del webhook viene convalidato prima dell'acquisto o dell'addebito di un dominio. L'acquisto del dominio è l'unico passaggio addebitabile e l'unico prerequisito difficile: se fallisce, l'intera chiamata fallisce (402 per il pagamento, 409 se presa da un altro account). La configurazione dell'e-mail, la creazione della casella di posta e la registrazione del webhook rappresentano la soluzione migliore: i problemi temporanei (ad esempio il DNS ancora in propagazione) vengono restituiti in warnings anziché fallire la chiamata, in modo che l'agente ottenga sempre il suo dominio. Il pagamento funziona esattamente come POST /api/domains/buy (carta, saldo del mercato o USDC tramite l'intestazione PAYMENT-SIGNATURE / flusso in due passaggi).

Richiedi corpo

domain*stringDominio da fornire all'agente. Comprato se non già posseduto.
slugstringParte locale della casella di posta (hi@domain). Valore predefinito: 'hi'.
namestringNome visualizzato per la posta elettronica in uscita.
webhook_urlstring (uri)URL HTTPS opzionale per ricevere e-mail in entrata + eventi del dominio.
webhook_headersobjectAutenticazione di consegna opzionale. I valori vengono crittografati quando sono inattivi e non vengono mai restituiti; le risposte espongono solo header_names.
webhook_eventsstring[]Tipi di eventi webhook. Il valore predefinito è email.received/delivered/bounced.
payment_methodstring(card | usdc | balance)Come pagare il dominio.
payment_txstringHash tx USDC (flusso in due fasi).
payment_chainstring(base | ethereum)
yearsinteger
max_pricenumberMassimale in USD per l'addebito del dominio. Se il prezzo reale lo supera, la richiesta fallisce con 400 PRICE_ABOVE_MAX e non viene addebitato nulla. Il campo `price` dell'errore è il totale da accettare; confermalo con l'utente prima di riprovare con quel max_price.

Risposta 200

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

Esempio

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

Acquista uno o più domini

Acquista uno o più domini e li registra immediatamente. Invia {"domain": "..."} per singoli o {"domains": ["...", "..."]} per gruppi (max 10). Se il dominio è in vendita sul marketplace Domani, questo endpoint instrada automaticamente verso un acquisto sul marketplace invece che verso una nuova registrazione. La risposta include years: 0 e marketplace_purchase: true per distinguerla da una registrazione. Gli acquisti sul Marketplace sono consentiti solo per un singolo dominio. L'acquirente paga l'intero prezzo di listino; il venditore riceve il prezzo meno una commissione della piattaforma (predefinita 10%). Gli acquisti in blocco elaborano ciascun dominio in modo indipendente: gli errori non bloccano altri acquisti. La risposta include results (riuscito), errors (non riuscito) e summary con i conteggi. Accetta tre metodi di pagamento: 1. Carta (impostazione predefinita): richiede una carta in archivio tramite POST /api/billing/setup. Addebito per dominio. 2. USDC (due passaggi): prima chiamata senza pagamento per ottenere un 402 con payment_options.crypto (indirizzo del portafoglio, importo, catene). Invia USDC sulla catena, quindi riprova con payment_tx e payment_chain nel corpo della richiesta. 3. x402 USDC (atomico): include un'intestazione PAYMENT-SIGNATURE con un pagamento USDC firmato su Base. Gli acquisti in blocco richiedono una carta in archivio (USDC non supportato per multidominio). Se non è previsto alcun pagamento per il singolo dominio, restituisce HTTP 402 con le istruzioni di pagamento.

Richiedi corpo

domainstringUnico dominio da acquistare (es. miosito.com)
domainsstring[]Array di domini da acquistare (max 10, richiede la carta in archivio)
payment_methodstring(card | usdc | balance)Metodo di pagamento: "card" (predefinito), "usdc" (x402: la prima chiamata restituisce 402 con le istruzioni di pagamento) o "balance" (spendere credito marketplace).
payment_txstringHash della transazione di un pagamento USDC già inviato sulla catena. Richiesto alla seconda chiamata del flusso USDC in due fasi.
payment_chainstring(base | ethereum)Catena su cui è stato inviato il pagamento USDC (ad esempio "base" o "ethereum").
yearsintegerNumero di anni da registrare (1-10, predefinito 1). Il prezzo viene moltiplicato per anni.
max_pricenumberTetto in USD per l'addebito totale. Se il prezzo reale lo supera, la richiesta fallisce con 400 PRICE_ABOVE_MAX e non viene addebitato nulla: una cintura di sicurezza per gli agenti autonomi. Senza max_price il tetto è il prezzo mostrato dalla ricerca: quando solo un registrar più caro può prendere il nome, l'acquisto fallisce allo stesso modo. Il `price` dell'errore è il totale da accettare, con `listed_price` e `renewal_price` accanto; confermali con l'utente prima di riprovare con quel max_price.
refstringCodice referral (facoltativo): il referrer guadagna una commissione

Esempio

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}

Ottieni informazioni dettagliate su un dominio di tua proprietà

Restituisce informazioni complete su un dominio: stato, data di acquisto, scadenza, metodo di pagamento, blocco di sicurezza, privacy WHOIS, stato di rinnovo automatico e date di registrazione. L'oggetto registrar può essere null se i dati estesi non sono disponibili.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
statusstring
auto_renewbooleanSe il rinnovo automatico è abilitato
purchased_atstring (date-time)
expires_atstring (date-time)
days_until_expiryintegerGiorni fino alla scadenza del dominio
renewal_pricenumber | nullQuanto costa un anno di rinnovo in USD presso il registrar che detiene il dominio; rinnovare N anni costa N volte questo importo. Null quando domani non può rinnovare il dominio o il suo prezzo è sconosciuto.
payment_methodstringCome è stato pagato il dominio
payment_txstring | nullHash tx on-chain (pagamenti USDC)
registrantstringChi il registro indica come intestatario del dominio. `customer`: i tuoi dati di contatto (da set_contact). `domani`: il contatto predefinito di Domani, che detiene il dominio per tuo conto finché non aggiungi i tuoi con set_contact, il che ti rende l'intestatario. `unknown`: non ancora verificato. La privacy WHOIS nasconde i dati in entrambi i casi.
transfer_outobjectTrasferimento del dominio a un altro registrar. `mode` `api`: get_auth_code restituisce il codice. `manual`: il registrar non ha un'API per ottenerlo, quindi il team di Domani lo ottiene manualmente entro 1 giorno lavorativo. null: non disponibile per questo dominio.
registrar_statusstringSe i dati del registrar attivo sono stati aggiornati o sono gestiti esternamente
registrar_checked_atstring (date-time)Quando è stato tentato l'aggiornamento del registrar
registrarobject | nullDettagli di registrazione del dominio (null se non disponibile)

Risposta di esempio

{
  "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"
  }
}

Esempio

curl https://domani.run/api/domains/mysite.com \
  -H "Authorization: Bearer domani_sk_xxx"
PUT/api/domains/{domain}/settings

Aggiorna le impostazioni del dominio

Aggiorna le impostazioni per un dominio di tua proprietà. Supporta auto_renew, whois_privacy e security_lock. È necessario fornire almeno un campo.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

auto_renewbooleanSe abilitare il rinnovo automatico per questo dominio
whois_privacybooleanSe abilitare la protezione della privacy WHOIS
security_lockbooleanSe bloccare il dominio contro i trasferimenti

Risposta 200

domainstring
auto_renewboolean
whois_privacyboolean
security_lockboolean
hintstring

Esempio

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

Aggiorna le impostazioni di parking

Aggiorna le impostazioni di parking e pubblicazione per un dominio di tua proprietà. Abilita/disabilita la pagina del parking e imposta un prezzo di vendita "In vendita". Quando il parking è abilitato, i visitatori del dominio vedono una pagina brandizzata. Quando viene impostato un prezzo di inserzione, i visitatori visualizzano una pagina "In vendita" con un modulo di contatto.

Parametri

domain*stringNome di dominio

Richiedi corpo

enabledbooleanSe abilitare la pagina di parking
listing_pricenumber | nullPrezzo di vendita in USD o null per rimuovere l'inserzione

Risposta 200

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

Inoltra un dominio a un URL

Inoltra un dominio di tua proprietà a un altro URL (ad esempio brand.com -> https://brand.dev) - utile per i marchi multi-TLD. Il dominio deve puntare ai nameserver/IP di parking di domani affinché il reindirizzamento venga servito. Permanente (308) per impostazione predefinita o temporaneo (307). Richiede l'ambito domains:write.

Parametri

domain*stringNome di dominio

Richiedi corpo

url*stringURL di destinazione (o dominio nudo) a cui inoltrare, ad es. https://brand.dev
permanentbooleanvero = permanente (308, predefinito), falso = temporaneo (307)

Risposta 200

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

Interrompe l'inoltro di un dominio

Rimuovi il reindirizzamento di un dominio in modo che ritorni alla pagina in parking. Richiede l'ambito domains:write.

Parametri

domain*stringNome di dominio

Risposta 200

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

Metti in vendita un dominio

Metti in vendita un dominio che possiedi sul marketplace di Domani. Gli acquirenti possono acquistarlo direttamente tramite l'API. Il dominio deve essere attivo e non essere già in vendita. Commissioni: Domani addebita una commissione di piattaforma (predefinita 10%) sulle vendite riuscite. Il venditore riceve il prezzo indicato meno la commissione. L'acquirente paga l'intero prezzo di listino. Richiede l'ambito domains:write.

Parametri

domain*stringNome di dominio da elencare per la vendita

Richiedi corpo

price*numberPrezzo di vendita in USD
descriptionstringDescrizione facoltativa dell’inserzione

Risposta 200

listingobject
hintstring

Risposta di esempio

{
  "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

Aggiorna un’inserzione di dominio

Aggiorna il prezzo e/o la descrizione di un'inserzione su un marketplace attivo. È necessario fornire almeno un campo. Richiede l'ambito domains:write.

Parametri

domain*stringNome di dominio con inserzione attiva

Richiedi corpo

pricenumberNuovo prezzo di vendita in USD
descriptionstring | nullNuova descrizione (null per cancellare)

Risposta 200

listingobject
hintstring

Risposta di esempio

{
  "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

Annulla un’inserzione di dominio

Rimuovi un’inserzione di vendita attiva per un dominio di tua proprietà. Il dominio rimane nel tuo account ma non è più disponibile per l'acquisto sul marketplace. Richiede l'ambito domains:write.

Parametri

domain*stringNome di dominio da rimuovere dall'elenco

Risposta 200

domainstring
statusstring
hintstring

Risposta di esempio

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

Ottieni le analisi del parking

Ottieni analisi dei visitatori per un dominio in parking: visualizzazioni di pagina, richieste, tasso di conversione, suddivisione giornaliera di 30 giorni e richieste recenti.

Parametri

domain*stringNome di dominio

Risposta 200

domainstring
views_7dintegerVisualizzazioni di pagina totali negli ultimi 7 giorni
views_30dintegerVisualizzazioni di pagina totali negli ultimi 30 giorni
inquiries_30dintegerRichieste totali negli ultimi 30 giorni
conversion_ratenumberRapporto richieste-visualizzazioni in percentuale
daily_viewsobject[]La visualizzazione giornaliera conta per gli ultimi 30 giorni
recent_inquiriesobject[]5 richieste più recenti
hintstring

Risposta di esempio

{
  "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

Ottieni il codice di autenticazione EPP

Ottieni il codice EPP/auth necessario per trasferire un dominio a un altro registrar. Sblocca automaticamente il dominio se è bloccato. Chi possiede il codice di autorizzazione può spostare il dominio, e la sua posta con esso: leggerlo richiede lo scope email:auth_secrets e un token non limitato a caselle di posta (altrimenti 403 INSUFFICIENT_SCOPE o 403 MAILBOX_CONFINED), e ogni lettura viene registrata nel log di audit. Alcuni registrar non hanno un'API per il codice: la prima chiamata risponde allora 202 con status: "requested" mentre il team di Domani sblocca il dominio e ottiene il codice manualmente (entro 1 giorno lavorativo, expected_by); l'utente riceve un'email quando è pronto, e una chiamata successiva risponde 200 con status: "ready" e il codice. Entro 60 giorni da una registrazione o da un trasferimento in entrata, un dominio di questo tipo risponde 409 TRANSFER_LOCKED con available_at.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
statusstring`ready`: il codice è in auth_code. `requested`: il team di Domani lo sta ottenendo dal registrar; l'utente riceve un'email quando è pronto.
auth_codestring | nullCodice di autorizzazione EPP da fornire al nuovo registrar. null finché lo stato è requested.
was_unlockedbooleanSe il dominio è stato sbloccato per consentire il trasferimento
requested_atstring (date-time)Quando è stato richiesto il codice (registrar senza un'API per ottenerlo)
expected_bystring (date-time)Entro quando il team di Domani avrà il codice (stato requested)
hintstring
next_stepsstring[]
GET/api/domains/{domain}/transfer-away

Ottieni lo stato del trasferimento in uscita

Controlla lo stato di un trasferimento di dominio in uscita. Da usare dopo aver ottenuto un codice di autorizzazione e avviato il trasferimento presso il nuovo registrar. Non disponibile per un dominio il cui transfer_out.mode è manual.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

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

Controlla lo stato del trasferimento in entrata

Controlla lo stato di un trasferimento di dominio in entrata. Restituisce lo stato dettagliato con suggerimenti utilizzabili. Da utilizzare dopo aver avviato un trasferimento con POST /api/domains/transfer.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
statusstring
timestampstringTimestamp dell'ultimo aggiornamento di stato
hintstringIndicazioni attuabili in base allo stato attuale
continuityobjectDelega catturata e verifica post-trasferimento per trasferimenti sicuri.
POST/api/domains/import

Importa un dominio esterno

Importa un dominio di tua proprietà presso un altro registrar (GoDaddy, Namecheap, Cloudflare, ecc.) da gestire tramite domani.run. Gratuito, non è necessario alcun trasferimento. Restituisce un record TXT per la verifica della proprietà basata su DNS.

Richiedi corpo

domain*stringDominio da importare

Risposta 200

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

Verifica e completa l'importazione del dominio

Verifica il record DNS TXT e completa l'importazione del dominio. Chiama dopo aver aggiunto il record TXT restituito da POST /api/domains/import. Utilizza Cloudflare DNS-over-HTTPS per controllare la propagazione.

Richiedi corpo

domain*stringDominio da verificare

Risposta 201

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

Pianifica come adottare un dominio esistente

Ispezione in sola lettura di un dominio esistente prima di collegarlo o trasferirlo. Restituisce il registrar corrente, i nameserver autorevoli, il provider DNS, lo stato DNSSEC, lo stato dell'account, il prezzo di trasferimento, le invarianti di sicurezza e le esatte azioni API successive. Chiamalo prima di richiedere un codice EPP. La connessione lascia invariati il ​​registrar e il DNS. Il trasferimento preserva i server dei nomi e non esegue la migrazione del DNS.

Parametri

domain*stringDominio esistente da controllare, ad es. miosito.com

Risposta 200

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

Verifica preventiva l'idoneità al trasferimento

Controlla se un dominio è idoneo per il trasferimento prima di iniziare. Restituisce il prezzo di trasferimento, lo stato di idoneità ed eventuali blocchi (TLD non supportato, periodo di attesa ICANN, dominio bloccato). Chiamalo prima del POST /api/domains/transfer.

Parametri

domain*stringDominio da verificare, ad es. miosito.com

Risposta 200

domainstring
tldstring
eligibleboolean
pricenumber | nullPrezzo di trasferimento in USD (nullo se TLD non supportato)
currencystring
renewal_pricenumberSolo se idoneo: quanto costa ogni anno dopo il trasferimento, in USD, presso il registrar verso cui si sposta. Assente quando è sconosciuto.
reasonstringMotivo leggibile se non idoneo
codestring
eligible_atstring (date)Data ISO in cui il dominio diventa idoneo (periodo di attesa dell'ICANN)
hintstring
POST/api/domains/transfer-watch

Controlla l'idoneità al trasferimento di un dominio

Monitora un dominio e ricevi una notifica (email + webhook transfer.eligible) quando diventa trasferibile. Usa RDAP per controllare i codici di stato EPP e i periodi di blocco ICANN di 60 giorni. Se è già trasferibile, risponde subito senza creare un monitoraggio.

Richiedi corpo

domain*stringDominio da tenere d'occhio, ad es. miosito.com

Risposta 200

domainstring
eligiblebooleanSe il dominio è attualmente idoneo per il trasferimento
eligible_atstring (date)Data ISO in cui il dominio diventa idoneo (se non ancora idoneo)
hintstringGuida praticabile
watchingbooleanSe è stata impostata una notifica
POST/api/domains/transfer

Trasferisci il dominio da un altro provider

Avvia il trasferimento del dominio dopo planDomainAdoption e la conferma esplicita del prezzo. Richiede l'autorizzazione/codice EPP del fornitore attuale. I nameserver autorevoli esistenti vengono preservati e verificati. La migrazione DNS non è mai implicita. Il completamento del trasferimento richiede in genere 1-5 giorni. Il pagamento viene addebitato in anticipo tramite carta o USDC.

Richiedi corpo

domain*stringDominio da trasferire, ad es. miosito.com
auth_code*stringCodice di autorizzazione/EPP dell'attuale fornitore
payment_methodstring(card | usdc | balance)Metodo di pagamento: "card" (predefinito), "usdc" o "balance" (credito del mercato).
payment_txstringHash della transazione di un pagamento USDC già inviato sulla catena.
payment_chainstring(base | ethereum)Catena in cui è stato inviato il pagamento USDC.
extra_subdomainsstring[]Sottodomini aggiuntivi da includere nello snapshot DNS pre-trasferimento. Rileviamo automaticamente i sottodomini tramite registri CT, SPF, inferenza MX/DKIM e un elenco di parole comune: utilizzalo per eventuali sottodomini personalizzati che potremmo perdere.
max_pricenumberTetto in USD per l'addebito del trasferimento. Se il prezzo reale lo supera, la richiesta fallisce con 400 PRICE_ABOVE_MAX e non viene addebitato nulla. Senza max_price il tetto è il prezzo di trasferimento mostrato: quando solo un registrar più caro può prenderlo, il trasferimento fallisce allo stesso modo. Il `price` dell'errore è il totale da accettare; confermalo con l'utente prima di riprovare con quel max_price.

Risposta 202

domainstring
statusstring
expiresstring (date-time)
pricenumber
currencystring
payment_methodstring
payment_txstring
auto_renewboolean
hintstring
dns_snapshotobjectRiepilogo del backup di ripristino acquisito prima del trasferimento. Non viene applicato a meno che non sia necessaria un'operazione di ripristino esplicita.
nameservers_preservedboolean
dns_migrationstring
continuityobject

Esempio

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

Rinnova un dominio

Rinnova un dominio di tua proprietà per ulteriori anni (1-10). Il pagamento viene addebitato in anticipo. La nuova data di scadenza viene restituita nella risposta. Quando il registrar del dominio rifiuta il rinnovo (rinnovato negli ultimi 30 giorni, o una durata che non vende), la richiesta fallisce con 400 RENEWAL_NOT_ELIGIBLE prima di qualsiasi addebito. Il prezzo è renewal_price di GET /api/domains/{domain} moltiplicato per years: invia quel totale come max_price così che un cambio di prezzo fallisca prima di qualsiasi addebito.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

yearsintegerNumero di anni da rinnovare (predefinito 1)
payment_methodstring(card | usdc | balance)Metodo di pagamento: "card" (predefinito), "usdc" o "balance" (credito del mercato).
payment_txstringHash della transazione di un pagamento USDC già inviato sulla catena.
payment_chainstring(base | ethereum)Catena in cui è stato inviato il pagamento USDC.
max_pricenumberMassimale in USD per la tassa di rinnovo. Se il prezzo reale lo supera, la richiesta fallisce con 400 PRICE_ABOVE_MAX e non viene addebitato nulla. Il campo `price` dell'errore è il totale da accettare; confermalo con l'utente prima di riprovare con quel max_price.

Risposta 200

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

Esempio

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

Acquista un dominio mercato secondario

Acquista un dominio già registrato che è in vendita su un mercato secondario (Afternic / Sedo) al prezzo di acquisto immediato, tramite Domani. Il prezzo di quotazione viene ricontrollato in tempo reale prima dell'addebito; passa max_price per limitare l'importo da pagare. Le inserzioni di sola offerta non possono essere acquistate qui: utilizza invece il broker (POST /api/broker) per negoziare un prezzo. Il pagamento funziona come una registrazione: carta, USDC su Base (x402) o saldo del mercato. Richiede l'ambito domains:transfer. In caso di successo, il dominio arriva nel tuo account (status: active o provisioning mentre viene finalizzato un trasferimento graduale).

Parametri

domain*stringIl dominio pubblicato sul mercato secondario da acquistare

Richiedi corpo

max_pricenumberTetto massimo dei prezzi in USD. Impostazioni predefinite del prezzo di acquisto immediato dell'inserzione; l'acquisto viene rifiutato se il prezzo in vigore supera questo valore.
payment_methodstring(card | usdc | balance)Metodo di pagamento: "card" (predefinito), "usdc" o "balance" (credito del mercato).
payment_txstringHash della transazione di un pagamento USDC già inviato sulla catena.
payment_chainstring(base | ethereum)Catena in cui è stato inviato il pagamento USDC.

Risposta 201

domainstring
statusstring"active" al completamento dell'acquisto o "provisioning" durante il completamento di un trasferimento graduale.
pricenumber
currencystring
payment_methodstring
payment_txstring
marketplacestringmercato secondario su cui è stato acquistato il dominio (ad esempio "Afternic", "Sedo").
hintstring
next_stepsstring[]

Esempio

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

Ottieni i record DNS per un dominio di tua proprietà

Restituisce tutti i record DNS configurati per un dominio di tua proprietà (A, AAAA, CNAME, MX, TXT, NS, ...), ciascuno con un id stabile, più un token zone_version (inviato anche come intestazione ETag). Ripassa zone_version su PUT per rilevare modifiche simultanee della zona.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
recordsDnsRecord[]
zone_versionstringToken di concorrenza ottimistica per l'intera zona. Passalo nuovamente su PUT (body zone_version o intestazione If-Match) per fallire con 409 DNS_VERSION_CONFLICT invece di bloccare una modifica simultanea.

Risposta di esempio

{
  "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"
}

Esempio

curl https://domani.run/api/domains/mysite.com/dns \
  -H "Authorization: Bearer domani_sk_xxx"
PUT/api/domains/{domain}/dns

Imposta i record DNS per un dominio di tua proprietà

Aggiorna i record DNS a livello rrset: per ogni (tipo, nome) presente nel payload, i record esistenti a quel (tipo, nome) vengono sostituiti da quelli inviati; gli rrset NON menzionati nel payload vengono conservati e i record NS non vengono mai toccati. Prima di ogni scrittura viene eseguito un backup automatico lato server della zona. Concorrenza: passa zone_version da un GET precedente (campo del corpo o intestazione If-Match). Se la zona è cambiata da allora, la scrittura fallisce con 409 DNS_VERSION_CONFLICT e restituisce i record correnti + la versione in modo da poterli unire nuovamente e riprovare. Instradamento della posta: una modifica alla destinazione della posta del dominio (i suoi record MX o NS, i record di indirizzo attraverso cui si risolve un host MX interno alla zona, o quelli di un host che riceve posta Domani e non pubblica alcun MX) richiede l'ambito email:auth_secrets, perché chi riceve la posta ne riceve i codici di accesso. Senza di esso la richiesta risponde 403 INSUFFICIENT_SCOPE prima di qualsiasi modifica, e un token confinato a caselle di posta risponde 403 MAILBOX_CONFINED anche con esso. Gli altri record richiedono solo domains:write. Ogni modifica dell'instradamento viene annotata nel registro di audit.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

records*DnsRecord[]
zone_versionstringLa zone_version di un GET precedente. In caso di mancata corrispondenza la scrittura viene rifiutata con 409 DNS_VERSION_CONFLICT (niente scritto). Consigliato ogni volta che un altro attore può modificare la stessa zona.

Risposta 200

successboolean
domainstring
recordsDnsRecord[]

Risposta di esempio

{
  "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
    }
  ]
}

Esempio

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

Elenca i record DS DNSSEC per un dominio di tua proprietà

Restituisce i record del firmatario della delega (DS) DNSSEC pubblicati nel registro per un dominio di tua proprietà e se DNSSEC è abilitato. Si accoppia con record TLSA (impostati tramite l'endpoint DNS) per DANE.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
enabledbooleanVero quando viene pubblicato almeno un record DS
recordsDsRecord[]

Risposta di esempio

{
  "domain": "mysite.com",
  "enabled": true,
  "records": [
    {
      "keyTag": "12345",
      "algorithm": "13",
      "digestType": "2",
      "digest": "A1B2C3..."
    }
  ]
}

Esempio

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

Pubblica un record DNSSEC DS (abilita DNSSEC)

Pubblica un record del firmatario della delega (DS) nel registro, abilitando DNSSEC per il dominio. Ottieni i valori DS dal tuo provider DNS/zona dopo aver firmato la zona.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

successboolean
domainstring
enabledboolean
recordsDsRecord[]

Esempio

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

Rimuovere un record DNSSEC DS (disabilitare DNSSEC)

Rimuove un record del firmatario della delega (DS) nel registro tramite il relativo tag chiave. La rimozione di tutti i record DS disabilita DNSSEC per il dominio.

Parametri

domain*stringNome di dominio di tua proprietà
keyTag*stringTag chiave del record DS da rimuovere

Risposta 200

successboolean
domainstring
enabledboolean
recordsDsRecord[]

Esempio

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

Cattura un'istantanea DNS

Cattura tutti i record DNS per un dominio tramite ricerche DNS pubbliche (Cloudflare DoH). Rileva i sottodomini dai log di Certificate Transparency, dai record SPF e dai nomi comuni. Lo snapshot viene inoltre archiviato sul lato server come backup.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

extra_subdomainsstring[]Sottodomini aggiuntivi da includere nello snapshot

Risposta 200

domainstring
recordsDnsRecord[]
subdomainsstring[]
sourcesstring[]
capturedAtstring (date-time)

Risposta di esempio

{
  "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"
}

Esempio

curl -X POST https://domani.run/api/domains/mysite.com/dns/snapshot \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/domains/{domain}/dns/restore

Ripristina DNS da uno snapshot

Applica i record DNS da uno snapshot al registrar corrente del dominio. Utilizza un algoritmo di differenza per evitare la duplicazione di record già esistenti. Se nel corpo non viene fornita alcuna istantanea, viene ripristinato dal backup lato server (creato mediante istantanea o trasferimento). Instradamento della posta: una modifica alla destinazione della posta del dominio (i suoi record MX o NS, i record di indirizzo attraverso cui si risolve un host MX interno alla zona, o quelli di un host che riceve posta Domani e non pubblica alcun MX) richiede l'ambito email:auth_secrets, perché chi riceve la posta ne riceve i codici di accesso. Senza di esso la richiesta risponde 403 INSUFFICIENT_SCOPE prima di qualsiasi modifica, e un token confinato a caselle di posta risponde 403 MAILBOX_CONFINED anche con esso. Gli altri record richiedono solo domains:write. Ogni modifica dell'instradamento viene annotata nel registro di audit.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

snapshotobjectUn oggetto snapshot DNS (come restituito dall'endpoint dello snapshot). Se omesso, viene utilizzato il backup lato server archiviato.
dry_runbooleanSolo anteprima: restituisce ciò che il ripristino creerebbe (would_apply) e salterebbe, senza scrivere nulla.

Risposta 200

domainstring
appliedintegerNumero di record creati
skippedintegerNumero di record già presenti
recordCountintegerRecord totali nello snapshot
errorsstring[]
dry_runbooleanÈ vero, quando si trattava di un'anteprima, non era scritto nulla
would_applyDnsRecord[]Solo prova: i record che il ripristino creerebbe

Risposta di esempio

{
  "domain": "mysite.com",
  "applied": 5,
  "skipped": 2,
  "recordCount": 7,
  "errors": []
}

Esempio

curl -X POST https://domani.run/api/domains/mysite.com/dns/restore \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/domains/{domain}/dns/clone

Clona il DNS di un altro dominio su questo

Copia la configurazione DNS di un dominio di origine di tua proprietà su questo dominio: utile per marchi multi-TLD (brand.com → brand.dev) che condividono lo stesso A/CNAME/MX. Unisce per impostazione predefinita (i record di origine vincono in qualsiasi collisione di tipo+nome, gli altri record di questo dominio vengono mantenuti); imposta replace: true per un mirror esatto. Instradamento della posta: una modifica alla destinazione della posta del dominio (i suoi record MX o NS, i record di indirizzo attraverso cui si risolve un host MX interno alla zona, o quelli di un host che riceve posta Domani e non pubblica alcun MX) richiede l'ambito email:auth_secrets, perché chi riceve la posta ne riceve i codici di accesso. Senza di esso la richiesta risponde 403 INSUFFICIENT_SCOPE prima di qualsiasi modifica, e un token confinato a caselle di posta risponde 403 MAILBOX_CONFINED anche con esso. Gli altri record richiedono solo domains:write. Ogni modifica dell'instradamento viene annotata nel registro di audit.

Parametri

domain*stringDominio di destinazione (il DNS è scritto qui)

Richiedi corpo

from*stringDominio di origine da cui copiare il DNS (deve essere tuo)
replacebooleanMirror esatto: rilascia i record di destinazione che l'origine non ha. Predefinito: unisci

Risposta 200

successboolean
from_domainstring
to_domainstring
recordsDnsRecord[]

Esempio

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

Ottieni server dei nomi per un dominio

Restituisce i nameserver autorevoli configurati per un dominio di tua proprietà. Se vuoto, le operazioni DNS (parking, posta elettronica, connessione) falliranno finché non verranno assegnati i server dei nomi.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
nameserversstring[]
default_nameserversstring[]I nameserver da cui viene servita la zona del dominio: l'host di zona quando Domani ospita lì la zona, altrimenti quelli predefiniti del registrar (null se sconosciuti)
dns_providerstringChi risponde per la zona del dominio: il DNS del registrar stesso, una zona che Domani ospita su Cloudflare, oppure un provider esterno per un dominio importato
hintstring

Risposta di esempio

{
  "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."
}

Esempio

curl https://domani.run/api/domains/mysite.com/nameservers \
  -H "Authorization: Bearer domani_sk_xxx"
PUT/api/domains/{domain}/nameservers

Imposta i nameserver per un dominio

Sostituisci i nameserver per un dominio di tua proprietà. Richiede da 2 a 13 nomi host validi. Valori comuni: OpenSRS DNS (ns1.systemdns.com, ns2.systemdns.com, ns3.systemdns.com). I nameserver decidono dove va tutta la posta del dominio, codici di accesso compresi: cambiarli richiede l'ambito email:auth_secrets e un token non confinato a caselle di posta (altrimenti 403 INSUFFICIENT_SCOPE o 403 MAILBOX_CONFINED), e ogni modifica viene annotata nel registro di audit.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

nameservers*string[]Nomi host del server dei nomi (2-13 richiesti)

Risposta 200

successboolean
domainstring
nameserversstring[]
hintstring

Risposta di esempio

{
  "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."
}

Esempio

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"]}'

Connettiti

POST/api/domains/{domain}/connect

Connetti un dominio a un provider di hosting o di posta elettronica

Connette un dominio a un provider di hosting o di posta elettronica rilevando automaticamente il provider da un URL di destinazione o accettando un nome provider esplicito. Per i domini gestiti tramite la piattaforma, i record DNS vengono impostati automaticamente (stato: dns_set). Per i domini importati (registrar esterno), restituisce i record come istruzioni da aggiungere manualmente al tuo registrar (stato: manual_setup_required, i record hanno lo stato pending). Provider di hosting supportati: vercel, netlify, cloudflare-pages, github-pages, railway, fly. Provider di posta elettronica supportati: google-workspace, fastmail, proton. Utilizza GET /api/domains/{domain}/connect per elencare tutti i provider e i metodi disponibili. Instradamento della posta: una modifica alla destinazione della posta del dominio (i suoi record MX o NS, i record di indirizzo attraverso cui si risolve un host MX interno alla zona, o quelli di un host che riceve posta Domani e non pubblica alcun MX) richiede l'ambito email:auth_secrets, perché chi riceve la posta ne riceve i codici di accesso. Senza di esso la richiesta risponde 403 INSUFFICIENT_SCOPE prima di qualsiasi modifica, e un token confinato a caselle di posta risponde 403 MAILBOX_CONFINED anche con esso. Gli altri record richiedono solo domains:write. Ogni modifica dell'instradamento viene annotata nel registro di audit.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

targetstringURL di destinazione per il rilevamento automatico (ad esempio my-app.vercel.app)
providerstringNome esplicito del provider (ad esempio vercel, google-workspace)
methodstringMetodo di connessione se il provider ne ha più (ad esempio solo cname)
dry_runbooleanSolo anteprima: restituisce le differenze (create/replace/already_set/keep) senza scrivere nulla.
confirm_replace_mxbooleanRichiesto quando la connessione sostituisce i record MX esistenti che puntano a un altro provider (altrimenti 409 MX_REPLACEMENT_REQUIRES_CONFIRMATION): reindirizza l'e-mail del dominio.

Risposta 200

domainstring
providerstring
categorystring
methodstring
recordsDnsRecord[]
docsstring (uri)
statusstringdns_set = record scritti automaticamente. manual_setup_required = dominio importato, aggiungi record al tuo registrar. dry_run = solo anteprima, niente scritto.
hintstring
next_stepsstring[]Azioni specifiche del provider da completare dopo l'impostazione dei record DNS
diffobjectSolo simulazione: indica cosa farebbe la scrittura - create, replace (record esistenti che verrebbero rimossi), already_set e keep (rrset non modificati).

Esempio

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

Elenca i provider disponibili per la connessione di un dominio

Restituisce tutti i provider di hosting e di posta elettronica supportati con i relativi metodi di connessione. Usalo per scoprire quali fornitori sono disponibili prima di chiamare POST.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

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

Verificare che la connessione al provider funzioni

Esegue il controllo di verifica del provider per verificare che i record DNS si siano propagati e che la connessione sia attiva. Utilizzare dopo il POST /api/domains/{domain}/connect per verificare.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

targetstringObiettivo per il rilevamento automatico
providerstringNome del fornitore
methodstringNome del metodo

Risposta 200

domainstring
providerstring
methodstring
verifiedboolean
messagestring
hintstring
next_stepsstring[]Passaggi di risoluzione dei problemi specifici del provider (solo se verificato è falso)

Esempio

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

Stato

GET/api/domains/{domain}/status

Controlla lo stato del dominio: DNS, SSL, email, scadenza

Controlla lo stato di un dominio tramite DNS-over-HTTPS: record A/AAAA/CNAME/MX/TXT/NS, stato del certificato SSL, configurazione email e data di scadenza. Supporta lo streaming SSE tramite Accept: text/event-stream: la chiusura della connessione annulla i controlli DNS/SSL in corso sul lato server. Utilizzalo dopo la connessione per verificare la propagazione del DNS.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

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

Risposta di esempio

{
  "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": []
  }
}

Esempio

curl https://domani.run/api/domains/mysite.com/status \
  -H "Authorization: Bearer domani_sk_xxx"

Verifica servizio

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

Aggiungi record DNS per verificare la proprietà del dominio per un servizio di terze parti

Aggiunge i record DNS corretti (TXT, CNAME) per dimostrare la proprietà del dominio a un servizio di terze parti. Supporta Stripe, Google Search Console, AWS SES, Postmark, Resend, Facebook, HubSpot e Microsoft 365. I nomi di servizi sconosciuti ricadono in un record TXT generico. I record vengono uniti al DNS esistente: i record esistenti vengono conservati. Instradamento della posta: una modifica alla destinazione della posta del dominio (i suoi record MX o NS, i record di indirizzo attraverso cui si risolve un host MX interno alla zona, o quelli di un host che riceve posta Domani e non pubblica alcun MX) richiede l'ambito email:auth_secrets, perché chi riceve la posta ne riceve i codici di accesso. Senza di esso la richiesta risponde 403 INSUFFICIENT_SCOPE prima di qualsiasi modifica, e un token confinato a caselle di posta risponde 403 MAILBOX_CONFINED anche con esso. Gli altri record richiedono solo domains:write. Ogni modifica dell'instradamento viene annotata nel registro di audit.

Parametri

domain*stringNome di dominio di tua proprietà

Richiedi corpo

service*stringNome del servizio (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365)
token*stringToken di verifica fornito dal servizio

Risposta 200

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

Risposta di esempio

{
  "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."
}

Esempio

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

Elenca i servizi supportati per la verifica del dominio

Restituisce tutti i servizi conosciuti con i relativi nomi, descrizioni e URL della documentazione. I servizi sconosciuti ricadono in un record TXT generico.

Parametri

domain*stringNome di dominio di tua proprietà

Risposta 200

domainstring
servicesobject[]
hintstring

Scoperta

GET/api/domains/{domain}/profilePubblico

Ottieni un profilo di dominio pubblico

Restituisce l'ultimo dossier pubblico protetto dalla privacy e supportato da prove per un dominio. Questo endpoint non restituisce mai osservazioni redatte o dettagli di contatto di registrazione non elaborati.

Parametri

domain*string

Risposta 200

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

Ricerca o aggiorna un profilo di dominio pubblico

Esegue un'analisi limitata utilizzando fonti di registro pubblico, DNS, sito live, dati strutturati e archivio, quindi archivia il profilo sicuro per la privacy per la pagina pubblica canonica. La profondità istantanea viene utilizzata per un primo rendering veloce; deep è l'impostazione predefinita e aggiunge la ricerca storica.

Parametri

domain*string
depthstring(instant | deep)Profondità di ricerca. Il valore predefinito è profondo.

Risposta 201

profilePublicDomainProfile
GET/api/domains/whoisPubblico

Cerca i dati di registrazione del dominio tramite RDAP

Interroga la rete RDAP (Registration Data Access Protocol) per i dati di registrazione del dominio. Restituisce registrar, date di creazione/scadenza/aggiornamento, giorni rimanenti fino alla scadenza, codici di stato, server dei nomi, stato DNSSEC e informazioni di contatto (registrante, contatto amministrativo, contatto tecnico, contatto di fatturazione e contatto antiabuso). Funziona con qualsiasi dominio: non è richiesta la proprietà. RDAP è il moderno sostituto nativo JSON di WHOIS. Ricade su WHOIS (porta 43) per i TLD senza RDAP e integra RDAP con i dati di riferimento WHOIS quando mancano i contatti (comune post-GDPR). Le informazioni di contatto potrebbero essere parzialmente o completamente oscurate a causa del GDPR o dei servizi di protezione della privacy. Endpoint pubblico: non è richiesta alcuna autenticazione. Le richieste autenticate ottengono limiti di velocità più elevati (30/min contro 10/min).

Parametri

q*stringDominio da cercare (ad esempio esempio.com)

Risposta 200

domainstring
registeredbooleanSe il dominio è attualmente registrato
registrarstring | nullNome del registrar attuale
registrar_urlstring | nullURL del sito web del registrar
registrar_iana_idstring | nullID IANA del registrar (dai publicIds RDAP)
createdstring | nullData di registrazione (YYYY-MM-DD)
expiresstring | nullData di scadenza (YYYY-MM-DD)
updatedstring | nullData dell’ultimo aggiornamento (YYYY-MM-DD)
days_until_expiryinteger | nullGiorni alla scadenza (nulli se non registrati)
statusstring[]Codici di stato EPP
nameserversstring[]Nameserver autorevoli
dnssecbooleanSe DNSSEC è abilitato
redactedbooleanSe i dati WHOIS/RDAP vengono oscurati per motivi di privacy (GDPR)
contactsobjectInformazioni di contatto per ruolo (nulle quando non ci sono dati disponibili, i campi potrebbero essere nulli se oscurati)

Esempio

curl "https://domani.run/api/domains/whois?q=google.com"
GET/api/domains/{domain}/ogPubblico

Ottieni i metadati di anteprima del sito web per un dominio

Restituisce i metadati Open Graph (titolo, descrizione, immagine, favicon) per un dominio. I dati vengono recuperati su richiesta e memorizzati nella cache per 7 giorni. La prima richiesta di un dominio può richiedere da 1 a 5 secondi (recupero in tempo reale); le richieste successive sono istantanee (hit nella cache). Restituisce campi nulli se il sito non è raggiungibile o non ha tag OG. Endpoint pubblico: non è richiesta alcuna autenticazione.

Parametri

domain*stringDominio per cui recuperare i metadati (ad esempio google.com)

Risposta 200

titlestring | nullTitolo della pagina (og:title > twitter:title > <titolo>)
descriptionstring | nullDescrizione della pagina (og:description > meta descrizione)
imagestring | nullURL dell'immagine OG (assoluto)
faviconstring | nullURL della favicon (assoluto)

Esempio

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

Fatturazione

POST/api/billing/setup

Ottieni un URL per aggiungere un metodo di pagamento

Restituisce sempre sia un url di Stripe Checkout che un client_secret di SetupIntent per aggiungere una carta di credito. Un agente che non può eseguire Stripe.js dovrebbe aprire url in un browser e dire all'utente di aggiungere la carta lì; un frontend che integra Stripe Elements direttamente (come la dashboard di Domani) usa invece client_secret. Questo è necessario prima di acquistare domini con una carta. Dopo che l'utente completa il pagamento, viene reindirizzato alla dashboard.

Richiedi corpo

modestring(setup_intent | checkout)Deprecato: sia `url` che `client_secret` vengono sempre restituiti indipendentemente da questo valore. Mantenuto per compatibilità con le versioni precedenti.

Risposta 200

urlstring (uri)URL di Stripe Checkout - aprilo in un browser per aggiungere una carta
client_secretstringSegreto client Stripe SetupIntent, per un frontend che usa Stripe.js direttamente
hintstringGuida ai passaggi successivi

Risposta di esempio

{
  "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."
}

Esempio

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

Rimuovi il metodo di pagamento salvato

Scollega la carta di credito salvata dell'utente dal suo account. Dopo la rimozione è necessario aggiungere una nuova carta prima di acquistare i domini.

Risposta 200

removedboolean

Risposta di esempio

{
  "removed": true
}

Esempio

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

Ottieni lo stato dei pagamenti sul mercato

Restituisce lo stato di onboarding di Stripe Connect del venditore e il saldo disponibile sul mercato. payouts_enabled è vero una volta completata l'onboarding e il venditore può ricevere pagamenti bancari.

Risposta 200

onboardedbooleanIl venditore ha inviato i dettagli di onboarding di Connect
payouts_enabledbooleanSono attivi i versamenti bancari
details_submittedboolean
balance_centsintegerSaldo disponibile sul mercato in centesimi

Risposta di esempio

{
  "onboarded": true,
  "payouts_enabled": true,
  "details_submitted": true,
  "balance_cents": 45000
}

Esempio

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

Inizia l'onboarding dei pagamenti bancari

Crea (o riprende) l'onboarding Stripe Connect Express per un venditore del marketplace e restituisce un URL di onboarding ospitato a cui reindirizzare l'utente. Obbligatorio prima che un venditore possa prelevare i guadagni dalla propria banca.

Risposta 200

urlstring (uri)URL di onboarding ospitato da Stripe

Risposta di esempio

{
  "url": "https://connect.stripe.com/setup/e/acct_123/..."
}

Esempio

curl -X POST https://domani.run/api/billing/connect \
  -H "Authorization: Bearer domani_sk_xxx"
POST/api/billing/connect/payout

Preleva il saldo del mercato in banca

Trasferisce l'intero saldo disponibile sul mercato del venditore sul suo conto bancario collegato. Richiede il completamento dell'onboarding del pagamento (POST /api/billing/connect). Il saldo viene riservato prima del trasferimento e ripristinato in caso di fallimento, quindi un fallimento non perde mai i fondi.

Risposta 200

amount_centsintegerImporto trasferito in centesimi
transfer_idstringID trasferimento Stripe

Risposta di esempio

{
  "amount_cents": 45000,
  "transfer_id": "tr_123"
}

Esempio

curl -X POST https://domani.run/api/billing/connect/payout \
  -H "Authorization: Bearer domani_sk_xxx"
GET/api/billing/invoices

Elenca le fatture di pagamento

Restituisce un elenco di fatture pagate con numero di fattura, importo, data e collegamenti per visualizzare o scaricare il PDF. Le fatture vengono generate automaticamente per ogni acquisto, rinnovo e trasferimento del dominio.

Parametri

limitintegerMax fatture da restituire

Risposta 200

invoicesobject[]
has_moreboolean
hintstring

Esempio

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

Referral

GET/api/referrals

Ottieni i guadagni e la cronologia dei referral

Restituisce il tuo codice di riferimento univoco, il tasso di commissione (20%), la ripartizione dei guadagni (totale, pagato, in sospeso) e una cronologia di tutti gli acquisti segnalati. Condividi il tuo codice di riferimento con altri: quando si registrano con il tuo codice (tramite il parametro ref), guadagni automaticamente una commissione su tutti i loro futuri acquisti di domini.

Risposta 200

referral_codestringIl tuo codice di riferimento univoco da condividere
referral_rateintegerPercentuale di commissione (attualmente 20%)
total_earned_centsintegerGuadagno totale in centesimi
total_paid_centsintegerTotale pagato in centesimi
total_pending_centsintegerPagamento in centesimi in sospeso
referralsobject[]

Risposta di esempio

{
  "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"
    }
  ]
}

Esempio

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

Prenotazioni

POST/api/backorders

Effettua un backorder su un dominio già registrato

Monitora un dominio registrato da un’altra persona e tenta di registrarlo automaticamente per te quando diventa disponibile. La disponibilità viene verificata ogni pochi minuti per agire rapidamente dopo il rilascio. L’addebito avviene solo se la registrazione riesce, senza pagamento anticipato. Un limite protegge da un aumento del prezzo di registrazione prima del rilascio. Richiede un metodo di pagamento salvato (carta) o payment_method: "balance" per pagare la registrazione se riesce. Senza garanzia di successo: un servizio specializzato può registrare per primo un dominio conteso.

Richiedi corpo

domain*stringDominio attualmente registrato da monitorare per tentare la registrazione quando viene rilasciato.
max_pricenumberImporto massimo in USD che pagherai per registrarlo. Il valore predefinito è il prezzo di registrazione corrente. Deve essere >= al prezzo corrente.
payment_methodstring(card | balance)Metodo di pagamento da usare se la registrazione riesce. Per impostazione predefinita usa il metodo preferito.

Risposta 201

backorderBackorder
hintstring

Esempio

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

Elenca i tuoi backorder

Restituisce i backorder dal più recente al meno recente. Filtra per status (watching, caught, failed, cancelled, expired).

Parametri

statusstring(watching | caught | failed | cancelled | expired)Filtra per stato.

Risposta 200

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

Ottieni un backorder

Parametri

id*stringID dell'backorder.

Risposta 200

backorderBackorder
DELETE/api/backorders/{id}

Annulla un backorder

Interrompe il controllo di un dominio. Solo gli backorder nello stato di watching possono essere annullati.

Parametri

id*stringID dell'backorder.

Risposta 200

idstring
statusstring
hintstring

Mercato

POST/api/domains/sell

Metti in vendita un dominio (mercato aperto)

pubblica qualsiasi dominio in vendita sul mercato Domani, inclusi i domini su altri registrar. I domini già presenti nel tuo account Domani vengono verificati automaticamente ed pubblicati immediatamente (stato active). I domini esterni richiedono la verifica della proprietà TXT (stato pending_verification). Commissioni: commissione della piattaforma del 10% sulle vendite riuscite. Richiede l'ambito deals:write.

Richiedi corpo

domain*stringNome di dominio da elencare per la vendita
price*numberPrezzo di vendita in USD
descriptionstringDescrizione facoltativa dell’inserzione

Risposta 201

listingobject
txt_recordobject | nullRecord TXT da aggiungere per la verifica della proprietà (solo per domini esterni)
hintstring
POST/api/domains/sell/verify

Verifica la proprietà TXT per l’inserzione esterna

Verifica che il record di proprietà TXT sia stato aggiunto per un inserzione di dominio esterno. In caso di successo, lo stato dell'inserzione cambia da pending_verification a active e diventa acquistabile. Richiede l'ambito deals:write.

Richiedi corpo

domain*stringNome di dominio da verificare

Risposta 200

listingobject
hintstring
GET/api/domains/sell/status

Controlla lo stato dell’inserzione e della transazione

Controlla lo stato di un inserzione di dominio e di eventuali transazioni attive. Restituisce i dettagli dell'inserzione, lo stato della pipeline delle transazioni e suggerimenti contestuali. Richiede l'ambito deals:read.

Parametri

domain*stringNome di dominio da verificare

Risposta 200

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

Elenca le tue transazioni

Elenca le transazioni del marketplace in cui sei l'acquirente o il venditore. Filtra per ruolo o stato. Richiede l'ambito deals:read.

Parametri

rolestring(buyer | seller)Filtra per ruolo
statusstring(active | escrow_held | epp_pending | transfer_started | completed | refunded | expired)Filtra per stato ("active" = tutti non terminali)
domainstringFiltra per nome di dominio
limitintegerNumero di transazioni da restituire (predefinito 50, massimo 100)
cursorstringCursore di impaginazione da una risposta precedente

Risposta 200

dealsobject[]
has_morebooleanSe sono disponibili più risultati
next_cursorstring | nullCursore per la pagina successiva
POST/api/deals

Acquista un dominio esterno (crea una transazione)

Crea una transazione di deposito a garanzia per acquistare un dominio pubblicato sul mercato. Il pagamento dell'acquirente viene trattenuto in garanzia fino al completamento del trasferimento del dominio. Il venditore viene avvisato e ha 7 giorni di tempo per fornire il codice EPP/auth. Richiede l'ambito domains:transfer.

Richiedi corpo

domain*stringNome di dominio da acquistare
payment_methodstring(card | usdc | balance)Metodo di pagamento: "card" (predefinito), "usdc" o "balance" (credito del mercato).

Risposta 201

dealobject
hintstring
next_stepsstring[]
GET/api/deals/{id}

Ottieni i dettagli della transazione con la sequenza temporale

Ottieni tutti i dettagli di una transazione, inclusi la ripartizione del prezzo, le scadenze e la cronologia degli eventi. Sia l’acquirente sia il venditore possono accedere alle proprie transazioni. Richiede l’ambito deals:read.

Parametri

id*stringID della transazione

Risposta 200

dealobject
hintstring
PATCH/api/deals/{id}

Fornire il codice EPP/autenticazione (venditore)

Il venditore fornisce il codice EPP/autorizzazione per avviare il trasferimento del dominio. Il codice viene crittografato a riposo e utilizzato per avviare il trasferimento al registrar. Massimo 3 tentativi. Richiede l'ambito deals:write.

Parametri

id*stringID della transazione

Richiedi corpo

auth_code*stringCodice EPP/autorizzazione dell'attuale registrar

Risposta 200

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

Ottieni una ricevuta/estratto conto della transazione

Restituisce una fattura in base al ruolo per una transazione del marketplace. Gli acquirenti ricevono una ricevuta di acquisto; i venditori ricevono un estratto conto che mostra la vendita, la linea di commissione della piattaforma e il pagamento netto. Funziona con ogni metodo di pagamento (carta/USDC/saldo). Richiede l'ambito deals:read.

Parametri

id*string

Risposta 200

invoiceDealInvoice
GET/api/negotiations

Elenca le tue negoziazioni

Elenca le trattative sui prezzi in cui sei l'acquirente o il venditore. Le controparti sono anonimizzate (solo ruoli). Richiede l'ambito deals:read.

Parametri

rolestring(buyer | seller)Filtra per il tuo ruolo
statusstringFiltra per stato (open|agreed|completed|declined|expired|cancelled|all)

Risposta 200

negotiationsNegotiation[]
POST/api/negotiations

Fai un'offerta su un annuncio

Apre una negoziazione anonima del prezzo su un dominio pubblicato attivamente con un'offerta iniziale. Il venditore può rilancia, accettare o rifiutare. All'accettazione l'acquirente finalizza il pagamento e viene creata una transazione al prezzo concordato. Richiede l'ambito deals:write.

Richiedi corpo

domain*stringIl dominio messo in vendita su cui negoziare
offer*numberOfferta iniziale in USD
messagestringMessaggio facoltativo al venditore

Risposta 201

negotiationNegotiation

Esempio

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}

Ottieni un thread di negoziazione

Restituisce una trattativa con il thread dell'offerta completo, reso anonimo (le offerte sono etichettate come "you" o "counterparty"). Richiede l'ambito "deals:read".

Parametri

id*string

Risposta 200

negotiationNegotiation
POST/api/negotiations/{id}

rilancia, accetta o rifiuta

Rispondi all'offerta attuale sul tavolo quando è il tuo turno. counter richiede un nuovo importo; accept blocca il prezzo all'importo attualmente sul tavolo; Il decline pone fine alla trattativa. Richiede l'ambito deals:write.

Parametri

id*string

Richiedi corpo

action*string(counter | accept | decline)
counternumberNuovo importo in USD (richiesto quando action=counter)
messagestring

Risposta 200

negotiationNegotiation
DELETE/api/negotiations/{id}

Ritirare una trattativa

L'acquirente ritira una trattativa aperta o concordata. Richiede l'ambito deals:write.

Parametri

id*string

Risposta 200

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

Concludere una trattativa concordata (pagare)

L'acquirente paga il prezzo concordato per creare la transazione di deposito a garanzia, quindi viene eseguito il flusso di trasferimento standard. Accetta gli stessi metodi di pagamento di un acquisto sul marketplace (carta, USDC, x402). Restituisce 402 con le istruzioni di pagamento se non viene fornito alcun pagamento. Per un'acquisizione tramite broker, se il prezzo concordato è superiore al max_budget impostato, restituisce 409 BUDGET_EXCEEDED - invia nuovamente con confirm_over_budget: true per procedere. Richiede l'ambito domains:transfer.

Parametri

id*string

Richiedi corpo

payment_methodstring(card | usdc | balance)
payment_signaturestring | null
payment_txstring
payment_chainstring
confirm_over_budgetbooleanPer le transazioni tramite broker: procedi anche se il prezzo concordato supera il max_budget impostato.
GET/api/broker

Elenca le tue richieste di broker

Elenca le tue richieste di acquisizione di domini e il loro stato. Richiede l'ambito deals:read.

Parametri

statusstringFiltra per stato o "all"

Risposta 200

requestsBrokerRequest[]
POST/api/broker

Richiedere l'acquisizione di un dominio già registrato

Chiedi a domani di acquisire per tuo conto uno specifico dominio già registrato e non pubblicato. Gli agenti individuano il proprietario tramite RDAP, lo contattano in modo anonimo e negoziano: solo su commissione, senza costi iniziali. L'interesse del proprietario apre una trattativa anonima. Nota: molti proprietari non sono raggiungibili (WHOIS oscurato dal GDPR): la richiesta termina quindi con no_contact. Richiede l'ambito deals:write.

Richiedi corpo

domain*stringIl dominio già registrato che desideri
max_budgetnumberIl tuo massimale in USD (facoltativo)

Risposta 201

requestBrokerRequest

Esempio

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}

Ottieni una richiesta del broker

Restituisce una delle tue richieste del broker. Richiede l'ambito deals:read.

Parametri

id*string

Risposta 200

requestBrokerRequest
DELETE/api/broker/{id}

Annulla una richiesta del broker

Annulla una richiesta di acquisizione di dominio attiva. Richiede l'ambito deals:write.

Parametri

id*string

Risposta 200

cancelledboolean
GET/api/broker/respondPubblico

Leggere lo stato di una richiesta del broker (lato proprietario)

Il percorso di lettura dell'agente proprietario: interroga lo stato corrente e anonimo di una richiesta con il tuo token prima di agire. Restituisce il dominio, l'offerta dell'acquirente sul tavolo, di chi è la mossa e le azioni disponibili al momento. Non rivela mai l'identità o il budget dell'acquirente. Autorizzato tramite token.

Parametri

token*stringIl token di sensibilizzazione dalla tua email di richiesta.

Risposta 200

domainstring
statusstring
your_turnbooleanChe si tratti della mossa del proprietario.
current_offer_usdnumber | nullL'offerta dell'acquirente sul tavolo.
agreed_price_usdnumber | null
actionsstring[]Azioni attualmente disponibili (sottoinsieme di offer/counter/accept/decline/opt_out).

Esempio

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

Rispondere a una richiesta del broker (lato proprietario)

Il percorso proprietario-agente: rispondi alla richiesta di acquisizione di un broker utilizzando il token dall'e-mail di sensibilizzazione consegnata alla tua casella di posta: l'alternativa completamente autonoma alla risposta via e-mail o al clic sul collegamento di reclamo umano. offer/counter apre o avanza una trattativa anonima al prezzo da te richiesto; decline e opt_out lo interrompono. Autorizzato tramite token (il token è la funzionalità): non è richiesto alcun account o ambito.

Richiedi corpo

token*stringIl token di sensibilizzazione dalla tua email di richiesta (la risposta è broker+<token>@).
action*string(offer | counter | accept | decline | opt_out)offer/counter per indicare un prezzo; accept per accettare l’offerta attuale dell’acquirente; decline per rifiutarla; opt_out per non essere più contattato.
pricenumberIl prezzo richiesto in USD (richiesto per l'offerta/controfferta).

Risposta 200

handledboolean
outcomestringValori di stato: opted_out | declined | negotiation_opened | countered | ignored_not_your_turn | unclear
statusstring
negotiation_idstring
domainstring

Esempio

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

Registra un client OAuth (RFC 7591)

Registrazione dinamica dei client per i client MCP compatibili con OAuth (connettori Claude.ai, ChatGPT, Grok Bot). Registrazione aperta: di per sé non concede nulla - ogni autorizzazione passa comunque dalla schermata di consenso dell’utente. I client pubblici (token_endpoint_auth_method=none) devono usare PKCE S256. Discovery: /.well-known/oauth-authorization-server.

Richiedi corpo

redirect_uris*string[]URI di reindirizzamento esatti (https, http su loopback o uno schema personalizzato nativo)
client_namestringMostrato nella schermata di consenso
token_endpoint_auth_methodstring(none | client_secret_post | client_secret_basic)
client_uristring
logo_uristring

Risposta 201

client_idstring
client_namestring
redirect_urisstring[]
token_endpoint_auth_methodstring
grant_typesstring[]
response_typesstring[]
client_id_issued_atinteger
client_secretstringSolo per i client confidenziali; restituito una sola volta
POST/api/oauth/token

Endpoint token OAuth

Scambia un codice di autorizzazione (con il code_verifier PKCE) per un token di accesso, oppure ruota con grant_type=refresh_token. I token di accesso sono normali token API domani che portano con sé gli ambiti approvati e il confinamento alle caselle di posta. I codici sono monouso; i refresh token ruotano a ogni utilizzo.

Risposta 200

access_tokenstring
token_typestring
expires_ininteger
refresh_tokenstring
scopestring