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.
| Ambito | Concede l'accesso a |
|---|---|
| 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, aliases + 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 l'email:write. Concedere 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. 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_secrets | Leggere 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:read | GET /api/me, GET /api/agents/identity |
| account:write | DELETE /api/me, POST /api/billing/setup, POST /api/billing/subscribe, POST /api/billing/cancel, POST /api/me/resend-verification, POST/PATCH/DELETE /api/agents/identity |
| billing:read | GET /api/billing/invoices |
| search | GET /api/domains/search, /suggest, /whois, /dns-check, GET /api/tlds |
| deals:read | GET /api/deals, GET /api/deals/{id} |
| deals:write | POST /api/domains/sell, PATCH /api/deals/{id} |
| notifications:read | GET /api/notifications, GET /api/notifications/count |
| backorders:read | GET /api/backorders, GET /api/backorders/{id} |
| backorders:write | POST /api/backorders, DELETE /api/backorders/{id} |
| assistant:read | Read Mailzero assistant settings, the Today queue, Work items, exact action previews, history-import progress, and content-minimized Activity |
| assistant:write | Change Mailzero assistant settings, record consent and start history imports, record human Decisions on Work items, retry imports, and export or delete derived assistant data. Never sends mail |
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_AUTHI 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"
}| Codice | HTTP |
|---|---|
| MISSING_API_KEY | 401 |
| INVALID_API_KEY | 401 |
| EXPIRED_API_KEY | 401 |
| MISSING_PARAMETER | 400 |
| INVALID_DOMAIN | 400 |
| PAYMENT_REQUIRED | 402 |
| DOMAIN_UNAVAILABLE | 409 |
| RATE_LIMIT_EXCEEDED | 429 |
| USER_EXISTS | 409 |
| NOT_FOUND | 404 |
| UNKNOWN_PROVIDER | 400 |
| UNKNOWN_METHOD | 400 |
| TARGET_REQUIRED | 400 |
| INVALID_PARAMETER | 400 |
| CONTACT_REQUIRED | 400 |
| INVALID_CONTACT | 400 |
| INSUFFICIENT_SCOPE | 403 |
| SCOPE_ESCALATION | 400 |
| MAILBOX_CONFINED | 400 |
| DOMAIN_EXISTS | 400 |
| DOMAIN_NOT_ACTIVE | 400 |
| UNSUPPORTED_TLD | 400 |
| TLD_NOT_IN_PUBLIC_DNS | 400 |
| NOT_AVAILABLE | 400 |
| ALREADY_REGISTERED | 400 |
| TRANSFER_NOT_ELIGIBLE | 400 |
| RENEWAL_NOT_ELIGIBLE | 400 |
| ALREADY_LISTED | 400 |
| LISTING_SOLD | 400 |
| SELF_PURCHASE | 400 |
| DESCRIPTION_TOO_LONG | 400 |
| DEAL_NOT_FOUND | 400 |
| INVALID_DEAL_STATE | 400 |
| EPP_ATTEMPTS_EXCEEDED | 400 |
| ACTIVE_DEAL_EXISTS | 400 |
| AGENT_IDENTITY_NOT_FOUND | 400 |
| AGENT_IDENTITY_ESCALATION | 400 |
| AGENT_MAILBOXES_REQUIRED | 400 |
| CREDENTIAL_REVOKE_FAILED | 400 |
| INVALID_IDEMPOTENCY_KEY | 400 |
| IDEMPOTENCY_KEY_MISMATCH | 400 |
| IDEMPOTENCY_KEY_REUSED | 400 |
| OPERATION_IN_PROGRESS | 400 |
| OPERATION_SUPERSEDED | 400 |
| INVALID_OPERATION_RECEIPT | 400 |
| WORKSPACE_ADMIN_REQUIRED | 400 |
| WORKSPACE_OWNER_REQUIRED | 400 |
| PRINCIPAL_NOT_IN_WORKSPACE | 400 |
| MAILBOX_NOT_IN_WORKSPACE | 400 |
| GROUP_NOT_IN_WORKSPACE | 400 |
| COLLECTION_NOT_IN_WORKSPACE | 400 |
| ACCESS_VERSION_CONFLICT | 400 |
| ACCESS_OFFER_INVALID | 400 |
| ACCESS_OFFER_EMAIL_MISMATCH | 400 |
| MAIL_DOMAIN_CAPACITY_EXHAUSTED | 400 |
| MAIL_PROVIDER_ERROR | 400 |
| INVALID_HTTP_ROUTE_HOSTNAME | 400 |
| INVALID_HTTP_ROUTE_UPSTREAM | 400 |
| INVALID_HTTP_ROUTE_UPSTREAM_HEADERS | 400 |
| INVALID_HTTP_ROUTE_LEASE | 400 |
| INVALID_HTTP_ROUTE_POLICY | 400 |
| INVALID_HOSTNAME_BINDING | 400 |
| HTTP_ROUTE_HOSTNAME_NOT_ALLOWED | 400 |
| HTTP_ROUTE_HOSTNAME_REQUIRED | 400 |
| HTTP_ROUTE_HOSTNAME_RESERVED | 400 |
| HTTP_ROUTE_HOSTNAME_UNAVAILABLE | 400 |
| HTTP_ROUTE_CONCURRENCY_LIMIT | 400 |
| HTTP_ROUTE_WORKSPACE_LIMIT | 400 |
| HTTP_ROUTE_DOMAIN_NOT_OWNED | 400 |
| HTTP_ROUTE_TERMINAL | 400 |
| HTTP_ROUTE_VERIFICATION_NOT_ENABLED | 400 |
| HTTP_ROUTE_VERIFICATION_REQUIRES_HTTPS | 400 |
| HTTP_ROUTE_POLICY_WITHOUT_SCOPE | 400 |
| HTTP_ROUTE_POLICY_REQUIRED | 400 |
| HTTP_ROUTE_AGENT_IDENTITY_REQUIRED | 400 |
| HTTP_ROUTE_POLICY_ESCALATION | 400 |
| HOSTNAME_BINDING_NOT_ACTIVE | 400 |
| HOSTNAME_BINDING_DNS_CONFLICT | 400 |
| HOSTNAME_BINDING_ACK_REQUIRED | 400 |
| HOSTNAME_BINDING_BROWSER_MODE_MISMATCH | 400 |
| HOSTNAME_DNS_CONFLICT | 400 |
| ZONE_READ_FAILED | 400 |
| DNS_VERSION_CONFLICT | 400 |
| UNAUTHORIZED | 400 |
| APEX_WEB_MODE_CONFLICT | 400 |
| APEX_DELEGATION_ACK_REQUIRED | 400 |
| VERIFICATION_COOLDOWN | 400 |
| VERIFICATION_SEND_FAILED | 400 |
| UPGRADE_REQUIRED | 400 |
| FREE_LIMIT_EXCEEDED | 400 |
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
/api/assistant/rulesElenca 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
| rules | AssistantRule[] |
/api/assistant/rulesCrea 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
| id | string | |
| name | string | |
| enabled | boolean | |
| position | integer | |
| match | AssistantRuleMatch | |
| assignee | object | |
| level | string | |
| grants | AssistantGrants | |
| match_count | integer | |
| last_matched_at | string (date-time) | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/api/assistant/rules/{id}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
| id | string | |
| name | string | |
| enabled | boolean | |
| position | integer | |
| match | AssistantRuleMatch | |
| assignee | object | |
| level | string | |
| grants | AssistantGrants | |
| match_count | integer | |
| last_matched_at | string (date-time) | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/api/assistant/rules/{id}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
| deleted | boolean | |
| released_items | integer |
/api/assistant/rules/testProva 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* | string | La chiave dell'elemento di lavoro, ad esempio org:tucows:invoice |
| sender_address | string | null | |
| sender_kind | string(human | automated) | |
| subject | string | null | |
| labels | string[] | |
| occurrences | integer | |
| confidence | object | La probabilità del classificatore per etichetta, per una regola con minConfidence |
Risposta 200
| matched | boolean | |
| rule | AssistantRule | |
| why | string[] | |
| considered | integer |
/api/assistant/rules/{id}/checkProva 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 | |
| matter | object | |
| at | string (date-time) | L'istante a cui verificare la pianificazione; ora per impostazione predefinita |
| approved_by | string[] | ID dei membri che hanno già approvato |
Risposta 200
| rule | object | |
| allowed_kinds | string[] | |
| effective_grants | AssistantGrants | |
| outcome | string | |
| check | AssistantGrantCheck | |
| hint | string |
/api/assistant/metricsLeggi 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_days | integer |
Risposta 200
| type | string | |
| as_of | string (date-time) | |
| window_days | integer | |
| account | AssistantTaskNumbers | |
| rules | object[] |
/api/assistant/approvalsElenca 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
| type | string | |
| as_of | string (date-time) | |
| plans | object[] | |
| escalations | object[] |
/api/assistant/suggestionsElencare 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
| status | string(open | accepted | dismissed) |
Risposta 200
| suggestions | AssistantSuggestion[] |
/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
| suggestion | AssistantSuggestion | |
| rule | AssistantRuleInput |
/api/assistant/grantsElenca 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
| grants | AssistantAssigneeGrants[] |
/api/assistant/grantsImposta 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* | string | Lo slug dell'identità dell'agent, o l'user id del membro |
| grants* | AssistantGrants |
Risposta 200
| assignee | object | |
| grants | AssistantGrants | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/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
| deleted | boolean |
/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* | string | L'id dell'elemento di lavoro |
Risposta 200
| id | string | L'id dell'elemento di lavoro |
| version | integer | |
| status | string | |
| deadline | string (date-time) | null | |
| you | object | |
| delegation | object | |
| lease | AssistantTaskLease | |
| brief | object | null | Il riepilogo della questione, come risponde GET /api/assistant/work-items/{id}/brief |
| facts | object | null | I fatti della questione, come risponde GET /api/assistant/work-items/{id}/facts |
| plans | object | |
| escalations | object[] | Le domande poste sul task, dalla più recente, con le loro risposte |
/api/assistant/tasks/{id}/leasePrendi 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_seconds | integer |
Risposta 200
| task_id | string | |
| lease | AssistantTaskLease |
/api/assistant/tasks/{id}/leaseRestituisci 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_id | string | |
| released | boolean | |
| lease | AssistantTaskLease |
/api/assistant/tasks/{id}/effectsRichiedi 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 | |
| note | string | Cosa l'assegnatario vuole che il proprietario sappia su questa richiesta |
Risposta 200
| task_id | string | |
| replayed | boolean | |
| plan | AssistantPlan | |
| execution | object | null | |
| lease | AssistantTaskLease | |
| hint | string |
/api/assistant/tasks/{id}/escalateFermarsi 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 | |
| options | object[] | |
| evidence_refs | string[] |
Risposta 200
| task_id | string | |
| escalation_id | string | |
| decision_id | string | |
| status | string | |
| version | integer | |
| hint | string |
/api/assistant/tasks/{id}/reportRapporto 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_refs | string[] | |
| claims | object[] |
Risposta 200
| task_id | string | |
| outcome | string | |
| status | string | |
| reconciliation | object | |
| receipt_id | string | |
| hint | string |
/api/emails/{address}/messages/{id}/factsLeggi 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* | string | ID del messaggio |
Risposta 200
| message_id | string | |
| thread_id | string | |
| analysed | boolean | |
| reason | string | Solo quando analysed è false |
| analysis | object | |
| facts | Fact[] | |
| entities | object[] | |
| commitments | object[] | |
| expectations | object[] |
/api/emails/{address}/messages/{id}/extractEstrai 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* | string | ID del messaggio |
Richiedi corpo
| schema* | object | Schema JSON dei campi da estrarre: un oggetto di primitive, array e oggetti annidati, sotto 8 KB, senza $ref |
| instructions | string | Indicazioni opzionali, ad es. importi in EUR |
Risposta 200
| message_id | string | |
| data | object | |
| confidence | number | |
| evidence_quotes | string[] | |
| model | string | |
| cached | boolean | |
| generated_at | string (date-time) | |
| usage | object |
/api/assistant/settingsOttieni 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
| enabled | boolean | |
| shadow_enabled | boolean | |
| paused | boolean | |
| mailbox_ids | string[] | |
| agent_mailbox_ids | string[] | Caselle gestite dai tuoi agenti. I loro elementi compaiono nella sezione agenti di Today invece che in Needs you. |
| agents | object[] | Le tue identità di agente, per la delega. |
| search_opt_out_mailbox_ids | string[] | 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_ids | string[] | 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_days | integer | |
| privacy_route | string | |
| attachment_vision | boolean | |
| community_signals | boolean | I 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_version | string | |
| consent | object | |
| mailboxes | object[] |
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"
}
]
}/api/assistant/settingsAggiorna 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
| enabled | boolean | Mostra le Decisioni Today e genera bozze su richiesta |
| shadow_enabled | boolean | Analizza la posta senza mostrare le Decisioni |
| paused | boolean | |
| mailbox_ids | string[] | ID delle caselle di posta possedute da elaborare; un array vuoto disabilita tutto |
| agent_mailbox_ids | string[] | Caselle gestite dai tuoi agenti. I loro elementi compaiono nella sezione agenti di Today invece che in Needs you. |
| history_window_days | integer | |
| attachment_vision | boolean |
Risposta 200
| ok | boolean | |
| enabled | boolean | |
| shadow_enabled | boolean | |
| paused | boolean | |
| mailbox_ids | string[] |
Risposta di esempio
{
"ok": true,
"enabled": true,
"shadow_enabled": true,
"paused": false,
"mailbox_ids": [
"mbx_123"
]
}/api/assistant/previewAcconsentire 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_days | integer | |
| consent* | boolean(true) | |
| consent_version* | string(mailzero-personal-ai.v1) |
Risposta 200
| ok | boolean | |
| preview | object |
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"
}
}/api/assistant/backfillOttenere 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
| backfill | object | 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
}
}/api/assistant/backfillRitentare 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
| ok | boolean | |
| retried | integer |
Risposta di esempio
{
"ok": true,
"retried": 2
}/api/assistant/todayOttenere 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
| agent | string | Vista 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. |
| category | string | Un 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. |
| tag | string | Solo 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
| type | string | |
| as_of | string | |
| projection_lag_ms | integer | |
| category | string | null | Il tipo di questione a cui la vista è ristretta (il parametro category), oppure null per tutti i tipi. |
| categories | object | Ogni tipo di questione presente nella vista, prima del filtro, con quanti elementi contiene. |
| tag | string | null | L'etichetta a cui la vista è ristretta (il parametro tag), o null per tutte le pratiche. |
| tags | object | Ogni etichetta della persona nella vista, prima del filtro, con quante pratiche la portano. |
| sections | object |
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": []
}
}/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* | string | ID dell'elemento Work dalla coda Today |
Risposta 200
| id | string | |
| version | integer | |
| status | string | |
| title | string | |
| summary | string | |
| ask | string | null | L'unica cosa che il proprietario deve fare o decidere, oppure null. |
| category | string | null | Il 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>. |
| tags | string[] | 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_tags | string[] | 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. |
| suspect | boolean | I 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_reasons | string[] | 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). |
| sender | object | null | |
| recurrence | object | Quante volte questa stessa situazione è tornata: un elemento, N messaggi. |
| mailbox | object | |
| opened_at | string | null | |
| delegated_to | string | null | Lo slug dell'agente a cui il proprietario ha affidato questo elemento, o null. |
| delegation_rule | object | null | La delega permanente che ha consegnato questo elemento, e perché ha fatto match; sospesa una volta che il proprietario ha ripreso l'elemento. |
| unread | boolean | Vero finché il proprietario non apre l'elemento dopo l'ultima modifica. |
| messages | object[] | I messaggi di origine dietro questo elemento, dal più recente al più vecchio. |
| history | object[] | Cosa è già successo in questa questione, dal più vecchio al più recente: una riga per ogni messaggio precedente. |
| source | object | |
| attention | object | |
| analysis | object | |
| evidence_refs | string[] | |
| entity_refs | string[] | |
| snoozed_until | string | null | |
| decision | object | null | |
| plan | object | null |
/api/assistant/work-items/{id}/briefLeggi 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* | string | ID elemento Work |
| synthesis | boolean | Impostare 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
| id | string | |
| version | integer | |
| generated_at | string (date-time) | |
| title | string | |
| summary | string | |
| ask | string | null | |
| mailbox | object | |
| delegated_to | string | null | |
| situation | object | |
| story | object[] | Ogni mail della situazione, dalla più vecchia alla più recente, con il titolo di una riga che l'analisi le ha dato |
| facts | object[] | |
| entities | object[] | |
| commitments | object[] | Promesse aperte fatte dalla parte del proprietario |
| expectations | object[] | Cose aperte attese da altri |
| settled | object[] | Cicli chiusi e ricevute, dalla più recente alla più vecchia |
| awaiting | object[] | |
| decision | object | null | La Decisione preparata attuale con le sue opzioni |
| summary_source | string | Se il riepilogo è la lettura del modello delle prove o la frase propria della pipeline |
| suggested_next | object | null | |
| open_questions | string[] | Ciò che solo il proprietario può decidere prima della prossima azione, al massimo tre domande |
| synthesis | object | null | La chiamata al modello che ha scritto il riepilogo e la prossima azione, null quando il brief è solo deterministico |
| evidence | object[] | |
| owner_replies | object[] | |
| evidence_refs | string[] |
/api/assistant/briefLeggi 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* | string | L'indirizzo email della persona |
| mailbox | string | Limita a un indirizzo di casella di posta (slug@domain) |
Risposta 200
| correspondent | string | |
| mailboxes | string[] | |
| brief | any | |
| related | object[] | |
| recent_mail | object[] | |
| generated_at | string (date-time) |
/api/assistant/work-items/{id}/factsLeggi 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* | string | ID elemento Work |
Risposta 200
| work_item_id | string | |
| version | integer | |
| analysed | boolean | |
| analyses | object[] | |
| facts | Fact[] | |
| entities | object[] | |
| commitments | object[] | |
| expectations | object[] | |
| evidence_refs | string[] |
/api/assistant/work-items/{id}/openContrassegnare 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
| ok | boolean | |
| opened_at | string | |
| unread | boolean |
/api/assistant/learnedCosa 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
| mutes | object[] | I mute in vigore, dal più recente al più vecchio. |
| suggestions | AssistantSuggestion[] | Le quiet rule aperte: accettane una tramite l'endpoint suggestions per impostare il mute che contiene. |
| tags | object[] | 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. |
/api/assistant/learned/mutesDimentica 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* | string | L'indirizzo, il dominio o la chiave della situazione, come la vista learned la elenca. |
Risposta 200
| ok | boolean | |
| kind | string | |
| value | string |
/api/assistant/learned/tagsDimentica 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* | string | L'etichetta, come la elenca la vista learned. |
Risposta 200
| ok | boolean | |
| name | string |
/api/assistant/work-items/{id}/investigateIndagare 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_id | string | |
| source | string | Se il messaggio sorgente è stato letto, o solo l'indirizzo del mittente. |
| checked_at | string | |
| sender | object | |
| links | object[] | |
| attachments | object[] | Cosa ogni allegato è realmente, letto dai suoi primi byte rispetto a ciò che il suo nome e il tipo dichiarato promettono. |
| signals | object[] | Cosa aggiungono i fatti alla valutazione, una frase ciascuno. |
/api/assistant/work-items/{id}/senderChi 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_id | string | |
| sender | object | null | |
| organisation | object | null | Null per un dominio di posta condiviso o un dominio mai analizzato. |
| participants | object[] | |
| relationship | object | |
| generated_at | string (date-time) |
/api/assistant/work-items/{id}/interactionsRegistra 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
| scope | string(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. |
| verdict | string(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_id | string | Con type approve o reject: il piano d'azione in attesa (proposto o escalato). |
| reason | string | Con type reject: il motivo, mantenuto sul piano. |
| type* | string(choose | instruct | take_over | snooze | ignore | correct | delegate | approve | reject | report | tag) | |
| add | string[] | 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. |
| remove | string[] | Con type tag: etichette da togliere dalla pratica (una proposta nominata qui viene rifiutata). La pagina learned dimentica un'etichetta per sempre. |
| agent_slug | string | null | Con il tipo delegate: lo slug del tuo agente a cui affidare l'elemento, o null per riprenderlo. |
| member_id | string | null | Con 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_id | string | |
| decision_version | integer | |
| option_id | string | |
| instruction | string | |
| until | string (date-time) | |
| remind_at | string (date-time) | |
| field | string | |
| correction | string | |
| idempotency_key* | string |
Risposta 200
| ok | boolean | |
| work_item | AssistantWorkItem | |
| plan_id | string | null |
/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* | string | ID del piano d'azione opaco |
Risposta 200
| id | string | |
| status | string | |
| expires_at | string | |
| source_revision | integer | |
| effects | object[] |
/api/assistant/activityOttieni 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
| limit | integer |
Risposta 200
| type | string | |
| as_of | string | |
| events | object[] |
/api/assistant/dataEsporta 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
| format | string | |
| exported_at | string | |
| note | string |
/api/assistant/dataElimina 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
| ok | boolean | |
| deleted | object | |
| source_mail_deleted | boolean |
Risposta di esempio
{
"ok": true,
"deleted": {
"work_items": 12,
"claims": 40,
"entities": 9,
"jobs": 52
},
"source_mail_deleted": false
}/api/assistant/devicesRegistra 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_detail | string(redacted | sender_only) |
Risposta 200
| ok | boolean | |
| device | object |
/api/assistant/devicesRevoca 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
| ok | boolean |
/api/domains/{domain}/email/checkControlla 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| provider | string | null | Provider di posta elettronica rilevato automaticamente (google-workspace, proton, fastmail) o null |
| mx | object | |
| spf | object | |
| dmarc | object | |
| dkim | object |
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"
/api/domains/{domain}/email/deliverabilityOttieni 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| status | string | |
| confidence | string | |
| checked_at | string (date-time) | |
| window_days | integer | |
| readiness | object | Disponibilità della configurazione DNS deterministica. Il punteggio non è una probabilità della posta in arrivo. |
| sending_health | object | |
| placement | object | |
| actions | object[] | |
| caveats | string[] |
Esempio
curl https://domani.run/api/domains/mysite.com/email/deliverability \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/email/setupConfigura 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* | string | Nome di dominio |
Richiedi corpo
| force | boolean | Sostituisci il provider di posta elettronica esistente (Google Workspace, Fastmail, Proton). Predefinito: falso |
Risposta 200
| domain | string | |
| status | string | |
| verified_at | string | null | |
| receiving_verified | boolean | Vero quando l'MX del dominio punta al ricevitore della piattaforma, quindi la posta per i suoi indirizzi viene accettata. |
| sending_configured | boolean | |
| sending_verified | boolean | |
| records | DnsRecord[] | |
| hint | string |
/api/domains/{domain}/email/setupRimuovere 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* | string | Nome di dominio |
/api/domains/{domain}/email/statusControlla 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* | string | Nome di dominio |
Risposta 200
| domain | string | |
| enabled | boolean | |
| verified | boolean | Vero solo quando vengono verificati sia la ricezione che l'invio in uscita |
| receiving_verified | boolean | Vero quando l'MX del dominio punta al ricevitore della piattaforma, quindi la posta per i suoi indirizzi viene accettata. |
| sending_configured | boolean | |
| sending_verified | boolean | |
| records | DnsRecord[] | |
| mailbox_count | integer | |
| dns_managed | boolean | Vero 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_addresses | string[] | 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_status | string | |
| mailbox_plan_key | string | La 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_limit | integer | null | Caselle su dominio personalizzato consentite dal piano in tutto lo spazio di lavoro. null significa illimitato. |
| mailbox_limit_reached | boolean | Vero 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_plan | object | null | Il piano più economico che lascerebbe spazio per un’altra casella. null se è già illimitato. |
| hint | string |
/api/emailCrea 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* | string | Parte locale dell’indirizzo email (ad esempio 'hello' per hello@domani.run) |
| name | string | Nome visualizzato (per impostazione predefinita è lo slug in maiuscolo) |
Risposta 201
| id | string | |
| address | string | |
| name | string | null | |
| slug | string | |
| domain | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| collaboration_enabled | boolean | |
| shared | boolean | Indica se almeno una persona diversa dal chiamante può leggere questa casella di posta |
| message_count | integer | |
| webhook_url | string | null | |
| header_names | string[] | Nomi di intestazione di autenticazione del webhook configurati; i valori non vengono mai restituiti |
| forward_to | string | null | |
| signing_secret | string | null | |
| created_at | string (date-time) | |
| hint | string |
/api/emailElenca 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
| domain | string | Filtra per dominio |
Risposta 200
| mailboxes | object[] |
/api/emailsCrea 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* | string | Indirizzo e-mail completo, ad es. hello@mysite.com |
| name | string | Nome visualizzato per le e-mail in uscita (ad esempio "John Doe") |
| force | boolean | Sostituisci i record MX esistenti. Predefinito: falso |
| kind | string(api | hosted) | "api" (impostazione predefinita: invio/ricezione tramite API + webhook) o "hosted" (casella di posta IMAP/SMTP reale sul tuo dominio) |
| workspace_id | string | Spazio di lavoro per possedere la casella di posta. Solo il proprietario dell'area di lavoro può adottare le risorse. |
Risposta 201
| id | string | |
| address | string | |
| name | string | null | |
| domain | string | |
| slug | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| collaboration_enabled | boolean | |
| shared | boolean | Indica se almeno una persona diversa dal chiamante può leggere questa casella di posta |
| message_count | integer | |
| webhook_url | string | null | |
| header_names | string[] | Nomi di intestazione di autenticazione del webhook configurati; i valori non vengono mai restituiti |
| forward_to | string | null | |
| signing_secret | string | null | Segreto HMAC per la verifica dei payload del webhook in entrata (mostrato una volta alla creazione) |
| host_id | string | ID entità host di posta per una cassetta postale ospitata |
| dns_records | DnsRecord[] | |
| dns_status | string | |
| receiving_status | string | |
| sending_status | string | |
| sending_error | object | |
| client_settings | object | |
| credential | object | |
| storage_quota_bytes | integer | |
| created_at | string (date-time) | |
| hint | string |
/api/emailsElenca 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
| domain | string | Filtra per dominio |
Risposta 200
| mailboxes | object[] |
/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* | string | Indirizzo email completo (codificato URL, ad esempio ciao%40miosito.com) |
Risposta 200
| id | string | |
| address | string | |
| slug | string | |
| domain | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| webhook_url | string | null | |
| forward_to | string | null | |
| signing_secret | string | null | Segreto HMAC per i manager; null per visualizzatori/risponditori |
| message_count | integer | |
| storage_quota_bytes | integer | null | |
| storage_used_bytes | integer | null | |
| storage_measured_at | string (date-time) | null | |
| created_at | string (date-time) |
/api/emails/{address}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* | string | Indirizzo email completo (codificato URL) |
Richiedi corpo
| name | string | null | Nome visualizzato per la casella di posta. Impostare su null per cancellare. |
| webhook_url | string | null | URL HTTPS per il webhook della posta elettronica in entrata o null da cancellare |
| forward_to | string | null | Indirizzo e-mail a cui inoltrare le e-mail in entrata o null da cancellare |
| drop_spam | boolean | Rilascia (non archiviare o webhook) i messaggi in entrata contrassegnati come spam |
| tone_notes | string | null | Indicazioni 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
| id | string | |
| address | string | |
| slug | string | |
| domain | string | |
| name | string | null | |
| webhook_url | string | null | |
| forward_to | string | null | |
| tone_notes | string | null | |
| signing_secret | string | Segreto HMAC per la verifica dei payload del webhook in entrata |
/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* | string | Indirizzo email completo (codificato URL) |
Richiedi corpo
| confirm | boolean | Deve essere vero per essere effettivamente eliminato. Ometti di visualizzare l'anteprima. |
/api/emails/{address}/sendInvia 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* | string | Indirizzo email del mittente (codificato URL) |
Richiedi corpo
| to* | any | Indirizzo/i email del destinatario |
| cc | any | Destinatario/i CC |
| bcc | any | Destinatario(i) CCN |
| subject | string | |
| text | string | Corpo del testo normale |
| html | string | Corpo HTML |
| reply_to | string | Indirizzo di risposta |
| in_reply_to | string | ID messaggio dell'e-mail a cui si è risposto (per il threading) |
| references | string | Catena Message-ID separata da spazi (per il threading) |
| idempotency_key | string | Chiave stabile che impedisce invii duplicati |
| send_at | string (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. |
| coordination | object | Necessario per una risposta collaborativa riservata. |
| allow_risky_content | boolean | Campo 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. |
| attachments | object[] | File allegati (max 10, max 40 MB totali). Il contenuto deve essere codificato in base64. |
Risposta 200
| id | string | |
| message_id | string | ID messaggio RFC 5322 |
| from | string | |
| to | string | |
| bcc | string | null | Destinatario/i Bcc a cui hai inviato, restituiti solo sul tuo messaggio in uscita; mai consegnati come intestazione e mai presenti su un messaggio ricevuto. |
| status | string | |
| attachments_count | integer | |
| suppressed | string[] | |
| deliverability | object | Report sui criteri con versione applicato a questo invio; ispezionare la decisione e i controlli categorizzati |
/api/emails/{address}/deliverability-checkVerifica 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* | string | Indirizzo email del mittente (codificato URL) |
Richiedi corpo
| subject | string | |
| text | string | |
| html | string | |
| idempotency_key | string | |
| allow_risky_content | boolean | Campo di compatibilità deprecato; i blocchi di sicurezza oggettivi non possono essere ignorati. |
| attachments | object[] |
Risposta 200
| policy_version | string | |
| decision | string | |
| safe_to_send | boolean | Equivalente booleano retrocompatibile a decisione != nega |
| risk | string | |
| score | integer | |
| authentication_message | boolean | |
| checks | object[] | |
| blocked_reasons | string[] | |
| warnings | string[] | |
| override_used | boolean |
/api/emails/{address}/messagesElenca 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* | string | Indirizzo email della casella di posta (codificato URL) |
| cursor | string | Cursore di impaginazione dalla risposta precedente |
| limit | integer | Numero massimo di messaggi da restituire |
| direction | string(in | out | all) | Filtra per direzione (impostazione predefinita: tutti) |
| folder | string(inbox | archive | sent | spam | trash) | Cartella di sistema. Mutuamente esclusivi con vista. L'impostazione predefinita è la posta in arrivo. |
| label | string | Etichette separate da virgola: solo i messaggi che ne hanno almeno una |
| view | string(starred | all | needs_human | scheduled) | Vista virtuale. Si escludono a vicenda con la cartella. |
| since | string | Timestamp ISO: restituisce solo i messaggi creati dopo questa data |
| until | string | Timestamp ISO: restituisce solo i messaggi creati prima di questa data |
| from | string | Filtra per indirizzo del mittente |
| to | string | Filtra per indirizzo del destinatario |
| subject | string | Filtra per argomento |
| q | string | Ricerca ampia senza distinzione tra maiuscole e minuscole tra mittente, destinatario, oggetto e corpo del testo normale |
| unread | boolean | Restituisce solo i messaggi non letti |
| attachments | boolean | Restituisce i messaggi che contengono solo allegati |
| spam | boolean | Filtra per contrassegno spam (passa false per nascondere i messaggi in entrata contrassegnati come spam) |
Risposta 200
| messages | object[] | |
| next_cursor | string | null |
/api/emails/searchCerca 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
| mailbox | string | Limita a un indirizzo casella (slug@domain). |
| q* | string | Quello 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"`). |
| mode | string(hybrid | semantic | keyword) | hybrid fonde l'embedding e le parole per rank; semantic usa solo il significato; keyword solo le parole. |
| limit | integer | Risultati da restituire. |
| since | string | Solo email ricevute dopo questo timestamp ISO. |
| until | string | Solo email ricevute prima di questo timestamp ISO. |
| folder | string(inbox | archive | sent | spam | trash | anywhere) | Una cartella. Trash è escluso a meno che non sia nominato o con `anywhere`. |
| from | string | L'indirizzo mittente contiene. |
| label | string | Etichette separate da virgola: solo i messaggi che ne hanno almeno una |
Risposta 200
| results | object[] | |
| mode | string | |
| query | string | |
| took_ms | integer | |
| hint | string |
Esempio
curl "https://domani.run/api/emails/search?q=facture+tucows+ao%C3%BBt&limit=5" \ -H "Authorization: Bearer domani_sk_xxx"
/api/emails/connect/gmailInizia 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
| access | string(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. |
| since | string (date-time) | Importa la posta ricevuta dopo questo istante |
| window | string(24h | 7d | 30d | 1y) | Un preset invece di since; predefinito 24h |
| workspace_id | string | Workspace a cui appartiene la casella di posta; il tuo workspace personale per impostazione predefinita |
| login_hint | string | L'account Google da preselezionare |
| return_to | string | Percorso app a cui inviare il browser dopo il consenso |
Risposta 200
| auth_url | string | |
| state | string | |
| import_since | string (date-time) | |
| expires_in | integer | |
| access | string |
/api/emails/connect/outlookInizia 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
| access | string(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. |
| since | string (date-time) | Importa la posta ricevuta dopo questo istante |
| window | string(24h | 7d | 30d | 1y) | Un preset invece di since; predefinito 24h |
| workspace_id | string | Workspace a cui appartiene la casella di posta; il tuo workspace personale per impostazione predefinita |
| login_hint | string | L'account Microsoft da preselezionare |
| return_to | string | Percorso app a cui inviare il browser dopo il consenso |
Risposta 200
| auth_url | string | |
| state | string | |
| import_since | string (date-time) | |
| expires_in | integer | |
| access | string |
/api/emails/connect/providersElenca 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
| providers | MailProvider[] |
/api/emails/connect/forwardingConnetti 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* | string | L'inbox da connettere, per esempio someone@gmail.com |
| workspace_id | string | Workspace a cui appartiene la casella di posta; il tuo workspace personale per impostazione predefinita |
Risposta 200
| address | string | |
| mailbox_id | string | |
| status | string | |
| forwarding_address | string | |
| instructions | object | |
| guide | ForwardingGuide |
/api/emails/{address}/connector/verifyInvia 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* | string | L'indirizzo connesso, per esempio someone@gmail.com |
Risposta 200
| sent_to | string | |
| forwarding_address | string |
/api/emails/{address}/connectorLeggi 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* | string | L'indirizzo connesso, per esempio someone@gmail.com |
Risposta 200
| address | string | |
| mailbox_id | string | |
| kind | string | |
| status | string | |
| import_since | string (date-time) | null | Il limite della prima importazione: nessuna mail ricevuta prima di esso viene copiata |
| phase | string | elenca mentre la scansione di importazione scorre la posta dopo il limite, cronologia una volta che la nuova posta segue la cronologia della fonte |
| paused_reason | string | null | |
| import_run | object | null | L'esecuzione di importazione corrente o più recente di questa casella di posta |
| source_messages_total | integer | null | Ciò che la sorgente riporta per l'intera inbox, per scala |
| last_sync_at | string (date-time) | null | |
| last_error | string | null | |
| backoff_until | string (date-time) | null | |
| verified_at | string (date-time) | null | |
| connected_at | string (date-time) | |
| cost_cap_usd | number | Il budget di spesa del modello consentito per esecuzione di importazione, in USD |
| access | string | null | Per una connessione Gmail: cosa consente la concessione; write significa etichette in entrambe le direzioni e invio come la persona |
| forwarding | object | null | Per una connessione tramite inoltro: l'indirizzo di inoltro, cosa è arrivato, la conferma di Gmail, la prova, i passaggi |
/api/emails/{address}/connectorDisconnetti 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
| disconnected | boolean | |
| address | string | |
| removed_messages | integer | |
| removed_attachments | integer |
/api/emails/{address}/importImporta 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_id | string | |
| import_since | string (date-time) | |
| import_until | string (date-time) |
/api/emails/{address}/searchCerca 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* | string | Indirizzo email della casella di posta (codificato URL) |
| q* | string | Quello 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"`). |
| mode | string(hybrid | semantic | keyword) | hybrid fonde l'embedding e le parole per rank; semantic usa solo il significato; keyword solo le parole. |
| limit | integer | Risultati da restituire. |
| since | string | Solo email ricevute dopo questo timestamp ISO. |
| until | string | Solo email ricevute prima di questo timestamp ISO. |
| folder | string(inbox | archive | sent | spam | trash | anywhere) | Una cartella. Trash è escluso a meno che non sia nominato o con `anywhere`. |
| from | string | L'indirizzo mittente contiene. |
| label | string | Etichette separate da virgola: solo i messaggi che ne hanno almeno una |
Risposta 200
| results | object[] | |
| mode | string | |
| query | string | |
| took_ms | integer | |
| hint | string |
/api/emails/{address}/threadsElenca 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 | |
| folder | string(all | inbox | archive | sent | spam | trash) | |
| since | string | Solo thread con attività dopo questo momento |
| limit | integer | |
| cursor | string | next_cursor dalla pagina precedente |
| label | string | Etichette separate da virgola: solo i thread con un messaggio che ne ha almeno una |
Risposta 200
| threads | EmailThread[] | |
| next_cursor | string | null | |
| has_more | boolean |
/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* | string | Id del thread (il thread_id di uno qualsiasi dei suoi messaggi) |
Risposta 200
| id | string | |
| subject | string | null | |
| participants | string[] | |
| message_count | integer | |
| unread_count | integer | |
| first_message_at | string (date-time) | |
| last_message_at | string (date-time) | |
| messages | object[] |
/api/emails/{address}/eventsTrasmetti 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 | |
| since | string | Cursor da cui riprodurre; il `cursor` di qualsiasi evento precedente o un next_cursor da /api/email/changes |
/api/emails/{address}/foldersElenca 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
| folders | object[] | |
| views | object[] | |
| capabilities | object |
/api/emails/{address}/messages/actionsApplicare 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) | |
| destination | string(inbox | archive | sent | spam | trash) | |
| read | boolean | |
| starred | boolean | |
| add | string[] | label: etichette da aggiungere |
| remove | string[] | label: etichette da rimuovere |
| set | string[] | label: sostituisce ogni etichetta (ha priorità su add e remove) |
| idempotency_key | string | Chiave stabile per questo esatto batch logico. Riutilizzare dopo un timeout. |
Risposta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Vero quando questa risposta ha riutilizzato la ricevuta immutabile completata e non ha eseguito alcuna nuova mutazione. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null |
/api/emails/{address}/messages/readContrassegna 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* | string | Indirizzo email della casella di posta (codificato URL) |
Richiedi corpo
| message_ids* | string[] | ID dei messaggi da contrassegnare |
| read* | boolean | true per contrassegnare come letto, false per contrassegnarlo come non letto |
| idempotency_key | string |
Risposta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Vero quando questa risposta ha riutilizzato la ricevuta immutabile completata e non ha eseguito alcuna nuova mutazione. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null | |
| count | integer |
/api/emails/{address}/messages/deleteEliminazione 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* | string | Indirizzo email della casella di posta (codificato URL) |
Richiedi corpo
| message_ids* | string[] | ID dei messaggi da eliminare |
| idempotency_key | string |
Risposta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Vero quando questa risposta ha riutilizzato la ricevuta immutabile completata e non ha eseguito alcuna nuova mutazione. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null | |
| count | integer |
/api/emails/{address}/messages/{id}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* | string | Indirizzo email della casella di posta (codificato URL) |
| id* | string | ID del messaggio |
Risposta 200
| id | string | |
| thread_id | string | Id della conversazione condiviso da ogni messaggio del thread (l'id del messaggio radice) |
| labels | string[] | Ogni etichetta sul messaggio; `label` è la prima |
| thread_key | string | Chiave di conversazione canonica con spazio dei nomi nel backend |
| thread_aliases | string[] | Chiavi del flusso di lavoro legacy da restituire quando si modifica lo stato della conversazione |
| message_id | string | null | |
| direction | string | |
| from | string | Il 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_url | string (uri) | null | URL proxy Domani che preserva la privacy per l'avatar del mittente |
| to | string | Tutti 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). |
| cc | string | null | Tutti i destinatari Cc dell'intestazione, con i nomi visualizzati, oppure null quando la posta non recava un Cc. |
| bcc | string | null | Destinatari Bcc, presenti solo sul tuo messaggio in uscita (mai su uno ricevuto, e mai consegnati come intestazione). |
| reply_to | string | null | |
| subject | string | |
| text | string | null | |
| html | string | null | |
| in_reply_to | string | null | |
| references | string | null | |
| attachments | object[] | |
| status | string | |
| is_read | boolean | |
| read_at | string | null | |
| events | object[] | |
| created_at | string (date-time) |
/api/emails/{address}/messages/{id}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* | string | Indirizzo email della casella di posta (codificato URL) |
| id* | string | ID del messaggio |
Risposta 200
| id | string | |
| deleted | boolean |
/api/emails/{address}/messages/{id}/replyRispondi 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* | string | Indirizzo email della casella di posta (codificato URL) |
| id* | string | ID del messaggio a cui rispondere |
Richiedi corpo
| text | string | Corpo della risposta in testo semplice |
| html | string | Corpo della risposta HTML |
| cc | any | Destinatari CC aggiuntivi |
| all | boolean | Rispondi a tutti: compila automaticamente CC dal A/CC originale |
| quote | boolean | Cita l’originale sotto la risposta; false invia solo il testo o l’HTML fornito |
| idempotency_key | string | Forma di compatibilità del corpo della chiave di idempotenza |
| coordination | object |
Risposta 200
| id | string | |
| message_id | string | |
| from | string | |
| to | string | |
| status | string | |
| reply_version | integer | Generazione riservata per una risposta custodita |
/api/emails/{address}/messages/{id}/forwardInoltra 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* | string | Indirizzo email della casella di posta (codificato URL) |
| id* | string | ID del messaggio da inoltrare |
Richiedi corpo
| to* | string | Indirizzo e-mail del destinatario |
| text | string | Nota facoltativa da anteporre |
Risposta 200
| id | string | |
| message_id | string | |
| from | string | |
| to | string | |
| status | string |
/api/emails/{address}/avatarOttieni 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* | string | Indirizzo email della casella di posta (codificato URL) |
Risposta 200
| address | string | |
| gravatar_url | string | null | |
| gravatar_signup | string | |
| has_avatar | boolean | |
| hint | string |
/api/emails/{address}/webhookOttieni 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* | string | Indirizzo email della casella di posta (codificato URL) |
Risposta 200
| address | string | |
| webhook_url | string | null | |
| signing_secret | string | null | |
| has_webhook | boolean | |
| events | string[] | 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_names | string[] | Nomi di intestazione di autenticazione configurati; i valori non vengono mai restituiti |
| hint | string |
/api/emails/{address}/webhookImposta 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* | string | Indirizzo email della casella di posta (codificato URL) |
Richiedi corpo
| url* | string | URL del webhook HTTPS |
| events | string[] | 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}}. |
| headers | object | Intestazioni 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
| address | string | |
| webhook_url | string | |
| signing_secret | string | |
| has_webhook | boolean | |
| events | string[] | 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_names | string[] | Nomi di intestazione di autenticazione configurati; i valori non vengono mai restituiti |
| hint | string |
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"]}'/api/emails/{address}/webhookRimuovere 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* | string | Indirizzo email della casella di posta (codificato URL) |
Risposta 200
| address | string | |
| webhook_url | string | null | |
| signing_secret | string | null | |
| has_webhook | boolean | |
| events | string[] | 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_names | string[] | |
| hint | string |
/api/emails/{address}/webhook/rotateRuota 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* | string | Indirizzo email della casella di posta (codificato URL) |
Risposta 200
| address | string | |
| webhook_url | string | |
| signing_secret | string | |
| has_webhook | boolean | |
| hint | string |
/api/emails/{address}/webhook/testTestare 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* | string | Indirizzo email della casella di posta (codificato URL) |
Risposta 200
| address | string | |
| webhook_url | string | |
| status | integer | |
| success | boolean | |
| hint | string |
/api/emails/{address}/aliasesElenca 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* | string | Indirizzo email della casella di posta (codificato URL) |
Risposta 200
| mailbox | string | |
| aliases | object[] | |
| hint | string |
/api/emails/{address}/aliasesAggiungi 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* | string | Indirizzo email della casella di posta (codificato URL) |
Richiedi corpo
| alias* | string | Indirizzo alias: uno slug semplice o uno slug@domain completo sullo stesso dominio |
Risposta 201
| address | string | |
| mailbox | string | |
| created_at | string (date-time) | |
| hint | string |
/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* | string | Indirizzo email della casella di posta (codificato URL) |
| alias* | string | Indirizzo alias da rimuovere (codificato URL o semplice slug) |
Risposta 200
| address | string | |
| deleted | boolean | |
| hint | string |
/api/emails/{address}/client-settingsOttieni 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* | string | Indirizzo della casella di posta ospitata (codificata URL) |
Risposta 200
| mailbox | string | |
| username | string | |
| imap | object | |
| smtp | object | |
| hint | string |
/api/emails/{address}/credentialsElenca 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* | string | Indirizzo della casella di posta ospitata (codificata URL) |
Risposta 200
| mailbox | string | |
| credentials | object[] | |
| hint | string |
/api/emails/{address}/credentialsCreare 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* | string | Indirizzo della casella di posta ospitata (codificata URL) |
Richiedi corpo
| label | string | Etichetta per identificare la password dell'app, ad es. "Posta portatile" |
Risposta 201
| id | string | |
| label | string | |
| password | string | La password dell'app: mostrata una volta, memorizzala ora |
| client_settings | object | |
| hint | string |
/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* | string | Indirizzo della casella di posta ospitata (codificata URL) |
| id* | string | ID password dell'app (dall'endpoint dell'elenco) |
Risposta 200
| id | string | |
| revoked | boolean | |
| hint | string |
/api/emails/{address}/messages/{id}/escalateSegnala 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* | string | Indirizzo email della casella di posta (codificato URL) |
| id* | string | ID del messaggio da segnalare |
Richiedi corpo
| reason | string | Perché serve l’umano - mostrato nella notifica |
| clear | boolean | Rimuovi la segnalazione invece di impostarla (l’umano ha preso in carico) |
Risposta 200
| id | string | |
| needs_human | boolean | |
| escalation_reason | string | null | |
| thread_key | string |
/api/emails/{address}/messages/{id}/remindImposta 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* | string | Indirizzo email della casella di posta (codificato URL) |
| id* | string | ID del messaggio da monitorare |
Richiedi corpo
| remind_at | string (date-time) | Orario ISO 8601 del promemoria (da 1 minuto a 90 giorni nel futuro) |
| note | string | Contesto mostrato quando il promemoria scatta |
| clear | boolean | Cancella un promemoria in sospeso |
Risposta 200
| id | string | |
| remind_at | string | null | |
| reminder_note | string | null |
/api/contactsElenca 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
| q | string | Filtra per sottostringa dell’indirizzo o del nome |
| limit | integer | Contatti da restituire (predefinito 50) |
| cursor | string | Cursore di impaginazione da una risposta precedente |
| order | string(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
| contacts | object[] | |
| next_cursor | string | null |
/api/contactsCrea 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* | string | L’indirizzo email del contatto |
| name | string | null | Nome visualizzato (null lo cancella) |
| notes | string | null | Note che agenti e umani leggono per avere contesto (null le cancella) |
/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* | string | L’indirizzo email del contatto (codificato URL) |
/api/emails/{address}/rulesElenca 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* | string | Indirizzo email della casella di posta (codificato URL) |
Risposta 200
| mailbox | string | |
| rules | MailRule[] | |
| hint | string |
/api/emails/{address}/rulesAggiungi 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* | string | Indirizzo 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_arg | string | Indirizzo di inoltro (per forward), valore dell’etichetta (per label) o motivo mostrato all’umano (per escalate) |
| priority | integer | Viene eseguito prima il valore inferiore (impostazione predefinita 0) |
| enabled | boolean | Predefinito vero |
Risposta 201
| id | string | |
| priority | integer | Il basso viene eseguito per primo |
| match_field | string | |
| match_op | string | |
| match_value | string | |
| action | string | |
| action_arg | string | null | |
| enabled | boolean | |
| created_at | string (date-time) |
/api/emails/{address}/rules/{ruleId}Rimuovere una regola della posta in entrata
Rimuovere una regola di filtro in entrata da una casella di posta.
Parametri
| address* | string | Indirizzo email della casella di posta (codificato URL) |
| ruleId* | string | L'ID della regola |
Risposta 200
| id | string | |
| deleted | boolean | |
| hint | string |
/api/domains/{domain}/email/catch-allImposta 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* | string | Nome di dominio |
Richiedi corpo
| mailbox* | string | Casella di posta catch-all: uno slug semplice o un indirizzo completo su questo dominio |
Risposta 200
| domain | string | |
| catch_all | string | null | |
| hint | string |
/api/domains/{domain}/email/catch-allCancella 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* | string | Nome di dominio |
Risposta 200
| domain | string | |
| catch_all | string | null | |
| hint | string |
/api/email/changesSincronizza 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 | |
| cursor | string | next_cursor opaco da una risposta precedente |
| limit | integer |
Risposta 200
| changes | MailboxChange[] | |
| next_cursor | string | |
| has_more | boolean | |
| requires_full_sync | boolean | |
| reason | string |
/api/suppressionsElenca 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
| cursor | string | Cursore di impaginazione da una risposta precedente |
| limit | integer | Numero massimo di voci (predefinito 50, massimo 100) |
Risposta 200
| suppressions | object[] | |
| next_cursor | string | null | |
| hint | string |
/api/suppressionsAggiungi 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* | string | Indirizzo email da eliminare |
| reason | string(manual | hard_bounce | complaint) | Motivo (predefinito: manuale) |
Risposta 201
| address | string | |
| reason | string | |
| source | string | |
| created_at | string (date-time) | |
| hint | string |
/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* | string | Indirizzo email soppresso (codificato URL) |
Risposta 200
| address | string | |
| deleted | boolean | |
| hint | string |
Collaboration
/api/workspaces/{id}/ownership-transferRichiedi 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 |
/api/workspaces/{id}/ownership-transfer/{transferId}Revocare un trasferimento di proprietà in sospeso
Parametri
| id* | string | |
| transferId* | string |
/api/workspaces/ownership-transfers/acceptAccetta 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
/api/auth/registerPubblicoCrea 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) | |
| ref | string | Codice referral: collega permanentemente questo utente al referrer. Il referrer guadagna una commissione su ogni acquisto di dominio. |
Risposta 202
| ok | boolean | |
| verification_required | boolean | |
| message | string | |
| hint | string | |
| next_steps | string[] |
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"}'/api/auth/loginPubblicoInvia 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
| ok | boolean | |
| message | string |
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"}'/api/auth/verifyPubblicoVerifica un token di collegamento magico
Convalida il token di collegamento magico e reindirizza al dashboard con credenziali di autenticazione. Utilizzato dall'e-mail di collegamento magico, in genere non chiamato direttamente dagli agenti. Gli agenti dovrebbero invece utilizzare POST /api/auth/register.
Parametri
| token* | string | Token di collegamento magico dall'e-mail (codificato base64url) |
/api/auth/handoffGenera 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
| url | string |
Risposta di esempio
{
"url": "https://mailzero.run/auth/handoff#code=xxx&next=%2Finbox"
}/api/auth/handoff/redeemPubblicoRiscatta 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
| ok | boolean | |
| next | string |
Risposta di esempio
{
"ok": true,
"next": "/inbox"
}Account
/api/meOttieni 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
| id | string | |
| string (email) | ||
| plan | string | Chiave personale attiva del piano Domani |
| workspace_plans | string[] | Chiavi attive distinte del piano Mailzero sugli spazi di lavoro a cui l'utente può accedere |
| has_payment_method | boolean | Se l'utente ha una carta in archivio (richiesto prima di acquistare domini) |
| preferred_payment_method | string | null | |
| preferred_locale | string | Locale utilizzata dalle interfacce Domani e dalle comunicazioni transazionali |
| has_contact | boolean | Se 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. |
| contact | RegistrantContact | Informazioni di contatto del registrante (null se non impostato) |
| referral_code | string | Il tuo codice di riferimento univoco |
| referral_rate | integer | Percentuale di commissione sugli acquisti riferiti |
| balance | number | Saldo del credito del mercato in USD (guadagnato dalle vendite) |
| domain_count | integer | Numero di domini posseduti |
| token_count | integer | Numero di token API attivi |
| features | string[] | Flag delle funzionalità abilitati per questo account (funzionalità GA più le funzionalità in anteprima concesse all’utente), ad es. mailzero_assistant |
| can_manage_assistant | boolean | Indica 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_admin | boolean | |
| mailbox_entitlement | object | Spazio 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_at | string (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"
/api/meAggiorna 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_method | string | null(card | usdc) | Metodo di pagamento predefinito per gli acquisti (card, usdc o null per la selezione automatica) |
| preferred_locale | string(en | fr | es | pt-BR | ja | zh-Hans | it) | Locale utilizzata dalle interfacce Domani e dalle comunicazioni transazionali |
Risposta 200
| preferred_payment_method | string | null | |
| preferred_locale | string | |
| hint | string |
/api/meElimina 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
| deleted | boolean | |
| hint | string |
/api/me/activationOttieni 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
| version | integer | |
| account_created_at | string (date-time) | |
| entry | object | |
| milestones | object | |
| status | string | |
| recommended_actions | object[] | |
| available_paths | string[] | |
| dismissed_version | integer | |
| pending_claim | object | null |
Esempio
curl https://domani.run/api/me/activation \ -H "Authorization: Bearer domani_sk_xxx"
/api/me/activationIgnora 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_version | integer | |
| hint | string |
/api/me/contactOttieni 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_contact | boolean | |
| contact | RegistrantContact |
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"
/api/me/contactImposta 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
| contact | RegistrantContact |
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"}'/api/me/resend-verificationInvia 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
| string (email) | Indirizzo email da verificare (l'impostazione predefinita è l'email di contatto dell'account) |
Risposta 200
| sent | boolean | |
| already_verified | boolean | |
| hint | string |
/api/sessionsElenca 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
| sessions | object[] | |
| hint | string |
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"
/api/sessionsDisconnetti 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
| revoked | integer | |
| hint | string |
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"
/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* | string | ID della sessione (da GET /api/sessions), oppure `current` |
Risposta 200
| success | boolean | |
| current | boolean | Vero quando chi chiama si è disconnesso da solo: la sua chiave non funziona più |
| hint | string |
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
/api/agents/identity/{slug}/tokensElenca 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* | string | L'handle dell'identità agente. |
/api/agents/identity/{slug}/tokensAssegna 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* | string | L'handle dell'identità agente. |
Richiedi corpo
| name | string | Predefinito a '<slug> agent'. |
| scopes | string[] | Predefinito a assistant:read, assistant:write, email:read, email:write. Non può superare gli scope del chiamante stesso. |
| mailboxes | string[] | Indirizzi mailbox a cui il token è confinato. Predefinito alle mailbox che l'agente gestisce. |
| expires_in | integer | Secondi fino alla scadenza (massimo un anno). |
Risposta 201
| success | boolean | |
| token | object | |
| agent | object | |
| hint | string |
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"}'/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
| success | boolean | |
| hint | string |
/api/tokensElenca 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
| tokens | TokenInfo[] |
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"
/api/tokensCrea 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
| name | string | Nome leggibile per identificare questo token |
| expires_in | integer | Durata del token in secondi (min 3600 = 1 ora, max 31536000 = 1 anno). Omettere senza scadenza. |
| expires_at | string (date-time) | Data di scadenza assoluta (ISO 8601). Alternativa a expires_in. |
| scopes | string[] | 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_tx | number | Limite 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_month | number | Limite di spesa mensile in USD per tutte le operazioni a pagamento effettuate con questo token. |
| agent_identity_id | string | ID 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_policy | object | Autorità strutturata obbligatoria per un token con ambito che include http-routes:read o http-routes:write. |
| mailboxes | string[] | 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
| id | string | |
| name | string | |
| key | string | Chiave API completa: salvala, non verrà mostrata più |
| expiresAt | string (date-time) | null | Quando questo token scade (null = mai) |
| scopes | string[] | Ambiti delle autorizzazioni concessi a questo token |
| createdAt | string (date-time) | |
| max_per_tx | number | null | Limite di spesa per transazione in USD (null = illimitato) |
| max_per_month | number | null | Limite di spesa mensile in USD (null = illimitato) |
| mailbox_ids | string[] | ID delle caselle di posta a cui questo token è confinato |
| http_route_policy | HttpRoutePolicy | |
| agent_identity | object | 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"}'/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* | string | ID token (dalla risposta GET /api/tokens) |
Risposta 200
| success | boolean |
Risposta di esempio
{
"success": true
}Esempio
curl -X DELETE https://domani.run/api/tokens/cm5abc123 \ -H "Authorization: Bearer domani_sk_xxx"
/api/auditElenca 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
| limit | integer | Eventi per pagina |
| cursor | string | Cursore di paginazione (next_cursor dalla pagina precedente) |
| type | string | Filtra per tipo di evento (ad esempio token.creato, acquisto.addebitato, acquisto.denied_cap) |
Risposta 200
| events | object[] | |
| next_cursor | string | null | |
| hint | string |
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
/api/webhooksElenca 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
| webhooks | object[] | |
| hint | string |
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"
/api/webhooksCrea 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. |
| headers | object | Intestazioni di autenticazione crittografate opzionali. Sono accettate solo l'autorizzazione e la X-API-Key. |
Risposta 200
| id | string | |
| url | string (uri) | |
| events | string[] | |
| secret | string | Segreto di firma HMAC-SHA256 (mostrato una volta) |
| active | boolean | |
| header_names | string[] | Nomi di intestazione di autenticazione configurati; i valori non vengono mai restituiti |
| created_at | string (date-time) | |
| hint | string |
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"}}'/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* | string | ID del webhook |
Richiedi corpo
| url | string (uri) | Nuovo URL HTTPS |
| events | string[] | Nuovo elenco di tipi di eventi |
| active | boolean | Imposta false per mettere in pausa, true per riprendere |
| headers | object | Sostituisci le intestazioni di autenticazione crittografate; invia {} per cancellare. Sono accettate solo l'autorizzazione e la X-API-Key. |
Risposta 200
| id | string | |
| url | string (uri) | |
| events | string[] | |
| active | boolean | |
| header_names | string[] | Nomi di intestazione di autenticazione configurati; i valori non vengono mai restituiti |
| hint | string |
/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* | string | ID del webhook |
Risposta 200
| success | boolean | |
| hint | string |
/api/webhooks/{id}/deliveriesElenca 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* | string | ID del webhook |
| limit | integer | Numero massimo di consegne da restituire |
Risposta 200
| deliveries | object[] | |
| hint | string |
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."
}/api/webhooks/{id}/deliveries/{deliveryId}/replayRiprodurre 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* | string | ID del webhook |
| deliveryId* | string | ID di consegna originale |
Richiedi corpo
| idempotency_key* | string |
Risposta 200
| delivery_id | string | |
| original_delivery_id | string | |
| event_type | string | |
| status | string | |
| http_status | integer | null | |
| attempts | integer | |
| idempotency_key | string | |
| idempotent_replay | boolean | |
| created_at | string (date-time) | |
| hint | string |
/api/webhooks/eventsElenca i tipi di eventi webhook
Elenca tutti i tipi di eventi webhook disponibili con le descrizioni. Nessuna autenticazione richiesta.
Risposta 200
| events | object[] |
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
/api/notificationsElenca 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
| limit | integer | Notifiche massime da restituire |
| cursor | string | Cursore per l'impaginazione (dal next_cursor della risposta precedente) |
Risposta 200
| notifications | object[] | |
| has_more | boolean | |
| next_cursor | string | null |
/api/notifications/countOttieni 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_count | integer |
Risposta di esempio
{
"unread_count": 3
}/api/notifications/{id}Contrassegna la notifica come letta
Contrassegna una singola notifica come letta. Richiede l'ambito notifications:read.
Parametri
| id* | string | ID di notifica |
Richiedi corpo
| read* | boolean | Imposta su true per contrassegnare come letto |
Risposta 200
| ok | boolean |
/api/notifications/read-allContrassegna tutte le notifiche come lette
Contrassegna tutte le notifiche non lette come lette. Richiede l'ambito notifications:read.
Risposta 200
| ok | boolean | |
| count | integer | Numero di notifiche contrassegnate come lette |
/api/notifications/preferencesOttieni 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
| preferences | object[] | |
| expiry_alert_days | integer[] | Giorni prima della scadenza, l'utente riceve promemoria di rinnovo (impostazione predefinita 30/7/1). Vuoto = nessun promemoria di scadenza. |
/api/notifications/preferencesAggiorna le preferenze di notifica
Aggiorna le preferenze di notifica per categorie e canali specifici. Richiede l'ambito notifications:read.
Richiedi corpo
| preferences | object[] | |
| expiry_alert_days | integer[] | Giorni prima della scadenza per ricevere promemoria di rinnovo. Array vuoto = nessun promemoria di scadenza. |
Risposta 200
| ok | boolean |
TLD
/api/tldsPubblicoElenca 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_price | number | Prezzo massimo di registrazione in USD |
| min_price | number | Prezzo minimo di registrazione in USD |
| sort | string(tld | price | renewal) | Ordina il campo: "tld" (alfabetico), "price" (registrazione) o "renewal" |
| order | string(asc | desc) | Ordinamento |
| search | string | Filtra i nomi TLD contenenti questa stringa |
| limit | integer | Risultati massimi per pagina |
| offset | integer | Numero di risultati da saltare |
| kind | string | Tipi 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
| tlds | TldInfo[] | |
| total | integer | TLD corrispondenti totali (prima dell'impaginazione) |
| offset | integer | |
| limit | integer | 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
Ricerca domini
/api/domains/searchPubblicoVerifica disponibilità e prezzi per i domini
Verifica la disponibilità e i prezzi per uno o più domini tramite RDAP + prezzi al dettaglio. Un nome che RDAP considera non registrato viene poi verificato con il registrar: un nome premium o riservato dal registro viene restituito con available: false, registry_status e un reason. Utilizza q per un singolo dominio (restituisce un oggetto semplice) o domains per più domini (restituisce un array). Supporta lo streaming SSE tramite l'intestazione Accept: text/event-stream: la chiusura della connessione annulla tutte le ricerche RDAP in volo sul lato server. Massimo 200 domini per richiesta. Endpoint pubblico: non è richiesta alcuna autenticazione. Le richieste autenticate ottengono limiti di velocità più elevati (60/min contro 20/min).
Parametri
| q | string | Dominio singolo incluso TLD (abbreviazione: restituisce un oggetto piatto). Si escludono a vicenda con i `domains`. |
| domains | string | Elenco separato da virgole di nomi di dominio completi da verificare (max 200). Restituisce il risultato dell'array. |
| max_price | number | Includi solo domini con questo prezzo (USD) |
| sort | string(price | tld) | Ordina i risultati per prezzo o nome TLD |
| source | string(all | primary | secondary) | Filtra i risultati per fonte: "primary" (solo disponibilità del registrar), "secondary" (solo inserzione del marketplace Domani) o "all" (entrambi) |
| order | string(asc | desc) |
Risposta 200
| available | boolean | Se il dominio è disponibile per la registrazione |
| domain | string | Nome di dominio completo incluso TLD |
| price | number | Prezzo di registrazione nella valuta specificata |
| currency | string | Codice valuta ISO 4217 (sempre USD) |
| error | boolean | Vero se la ricerca RDAP non è riuscita (disponibilità sconosciuta) |
| for_sale | object | Presente quando il dominio è messo in vendita (sul marketplace di Domani o rilevato su un mercato secondario esterno) |
| tld_kind | string | Tipo del suffisso del dominio rispetto alla zona radice: `tld`, `second_level` o `alt_root`. Un dominio `alt_root` è fuori dalla zona radice IANA e non si risolve nel DNS pubblico: non viene verificato e `reason` spiega perché. |
| registry_status | string | Presente quando il registro trattiene un nome che RDAP considera non registrato: `premium` (il registro ne fissa il prezzo, vedi `registry_price`) o `reserved` (non può essere registrato). Un risultato di questo tipo ha `available: false`, poiché `POST /api/domains/buy` non può registrarlo, e `reason` spiega il motivo. |
| registry_price | number | Presente nei risultati `premium` quando il registrar lo ha indicato: il prezzo del primo anno fissato dal registro, in USD. `price` resta il prezzo standard del TLD, che non si applica a questo nome. |
| renewal_price | number | Quanto costa ogni anno dopo il primo, in USD, presso il registrar che registrerebbe il nome: quanto viene fatturato il suo rinnovo. Assente quando è sconosciuto. Su un risultato `premium` è, come `price`, il prezzo standard del TLD. |
| reason | string | Perché il dominio non è offerto: un nome fuori dal DNS pubblico (`tld_kind` `alt_root`) o un nome trattenuto dal registro (`registry_status`). |
Esempio
curl "https://domani.run/api/domains/search?q=mysite.com"
/api/domains/suggestPubblicoSuggerimenti di domini basati sull'intelligenza artificiale con disponibilità
Data una descrizione del progetto, genera nomi di dominio completi con TLD creativi (ad esempio codebuddy.dev, wavify.fm), controlla la disponibilità e restituisce solo i domini disponibili con i prezzi. Utilizza un ciclo agentico che riprova finché non viene trovato un numero sufficiente di domini disponibili. Supporta lo streaming SSE tramite Accept: text/event-stream: la chiusura della connessione annulla la generazione LLM in volo e le ricerche RDAP sul lato server. Endpoint pubblico: non è richiesta alcuna autenticazione.
Parametri
| prompt* | string | Descrizione del progetto o parole chiave da cui generare suggerimenti di dominio (min 3 caratteri) |
| count | integer | Numero di domini disponibili da restituire (predefinito 10) |
| exclude | string | Elenco separato da virgole di domini da escludere dai suggerimenti (ad esempio da un batch precedente) |
| tlds | string | TLD preferiti separati da virgole (senza punti). I risultati favoriranno fortemente questi TLD. |
| style | string(single | creative | short | brandable | keyword) | Preferenza per lo stile del nome: 'single' (una parola), 'creative' (evocativo/metaforico), 'short' (3-6 caratteri), 'brandable' (inventato), 'keyword' (descrittivo). |
| lang | string(japanese | spanish | french | italian | latin | nordic | arabic | sanskrit) | Ispirazione linguistica/culturale per i nomi. I nomi trarranno spunto dalle parole, dall'estetica e dalla cultura di questa lingua. |
Risposta 200
| suggestions | object[] | Nomi di dominio disponibili con prezzi |
| checked | integer | Domini totali controllati |
| iterations | integer | Numero di round LLM |
Risposta di esempio
{
"suggestions": [
{
"domain": "codebuddy.dev",
"price": 13,
"currency": "USD",
"renewal_price": 13
},
{
"domain": "aiforge.sh",
"price": 33,
"currency": "USD"
},
{
"domain": "devcraft.app",
"price": 13,
"currency": "USD"
}
],
"checked": 42,
"iterations": 2
}Esempio
curl "https://domani.run/api/domains/suggest?prompt=AI+coding+assistant"
/api/domains/dns-checkPubblicoControllo rapido dell'esistenza del dominio basato su DNS
Verifica se un nome di dominio viene utilizzato su più TLD contemporaneamente utilizzando query DNS (più veloce della ricerca, senza prezzo). Restituisce gli array "taken" (sicuramente registrati) e "candidates" (potenzialmente disponibili). Utilizzalo per restringere il campo prima di chiamare la ricerca dei prezzi. Endpoint pubblico: non è richiesta alcuna autenticazione.
Parametri
| name* | string | Nome di dominio senza TLD, ad es. "myapp" |
| tlds* | string | TLD separati da virgole da controllare, ad es. 'com,dev,ai,io' |
Risposta 200
| name | string | |
| taken | string[] | TLD definitivamente registrati |
| candidates | string[] | TLD potenzialmente disponibili |
Domini
/api/domainsElenca 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
| domains | DomainRecord[] |
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"
/api/agents/identityRivendica 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* | string | L'handle diventa <slug>.domani.run |
| name | string | Nome visualizzato |
| bio | string | |
| emoji | string | Emoji dell'avatar |
| string (email) | Contatto pubblico (ad esempio la tua casella di posta gratuita @domani.run) | |
| links | object[] |
Risposta 200
| id | string | ID identità stabile utilizzato per associare token API con ambito |
| slug | string | |
| url | string | Il sottodominio identità (canonico) |
| page_url | string | Fallback del percorso che funziona sempre |
| name | string | null | |
| bio | string | null | |
| emoji | string | null | |
| string | null | ||
| links | object[] | |
| views | integer | |
| created_at | string (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": "🤖"}'/api/agents/identityElenca le identità dei tuoi agenti
Elenca le identità libere (<handle>.domani.run) che hai rivendicato. Richiede account:read.
Risposta 200
| identities | AgentIdentity[] |
/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* | string | Handle da aggiornare |
Richiedi corpo
| name | string | |
| bio | string | |
| emoji | string | |
| string | ||
| links | object[] |
Risposta 200
| id | string | ID identità stabile utilizzato per associare token API con ambito |
| slug | string | |
| url | string | Il sottodominio identità (canonico) |
| page_url | string | Fallback del percorso che funziona sempre |
| name | string | null | |
| bio | string | null | |
| emoji | string | null | |
| string | null | ||
| links | object[] | |
| views | integer | |
| created_at | string (date-time) |
/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* | string | La maniglia per rilasciare |
Risposta 200
| success | boolean | |
| slug | string | |
| released | boolean |
/api/agents/provisionFornisci 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* | string | Dominio da fornire all'agente. Comprato se non già posseduto. |
| slug | string | Parte locale della casella di posta (hi@domain). Valore predefinito: 'hi'. |
| name | string | Nome visualizzato per la posta elettronica in uscita. |
| webhook_url | string (uri) | URL HTTPS opzionale per ricevere e-mail in entrata + eventi del dominio. |
| webhook_headers | object | Autenticazione di consegna opzionale. I valori vengono crittografati quando sono inattivi e non vengono mai restituiti; le risposte espongono solo header_names. |
| webhook_events | string[] | Tipi di eventi webhook. Il valore predefinito è email.received/delivered/bounced. |
| payment_method | string(card | usdc | balance) | Come pagare il dominio. |
| payment_tx | string | Hash tx USDC (flusso in due fasi). |
| payment_chain | string(base | ethereum) | |
| years | integer | |
| max_price | number | Massimale 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
| domain | string | |
| domain_status | string | |
| mailbox | object | null | |
| webhook | object | null | |
| warnings | string[] | |
| hint | string | |
| next_steps | string[] |
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"}}'/api/domains/buyAcquista 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
| domain | string | Unico dominio da acquistare (es. miosito.com) |
| domains | string[] | Array di domini da acquistare (max 10, richiede la carta in archivio) |
| payment_method | string(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_tx | string | Hash della transazione di un pagamento USDC già inviato sulla catena. Richiesto alla seconda chiamata del flusso USDC in due fasi. |
| payment_chain | string(base | ethereum) | Catena su cui è stato inviato il pagamento USDC (ad esempio "base" o "ethereum"). |
| years | integer | Numero di anni da registrare (1-10, predefinito 1). Il prezzo viene moltiplicato per anni. |
| max_price | number | Tetto 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. |
| ref | string | Codice 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"}'/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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| status | string | |
| auto_renew | boolean | Se il rinnovo automatico è abilitato |
| purchased_at | string (date-time) | |
| expires_at | string (date-time) | |
| days_until_expiry | integer | Giorni fino alla scadenza del dominio |
| renewal_price | number | null | Quanto 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_method | string | Come è stato pagato il dominio |
| payment_tx | string | null | Hash tx on-chain (pagamenti USDC) |
| registrant | string | Chi 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_out | object | Trasferimento 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_status | string | Se i dati del registrar attivo sono stati aggiornati o sono gestiti esternamente |
| registrar_checked_at | string (date-time) | Quando è stato tentato l'aggiornamento del registrar |
| registrar | object | null | Dettagli 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"
/api/domains/{domain}/settingsAggiorna 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| auto_renew | boolean | Se abilitare il rinnovo automatico per questo dominio |
| whois_privacy | boolean | Se abilitare la protezione della privacy WHOIS |
| security_lock | boolean | Se bloccare il dominio contro i trasferimenti |
Risposta 200
| domain | string | |
| auto_renew | boolean | |
| whois_privacy | boolean | |
| security_lock | boolean | |
| hint | string |
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}'/api/domains/{domain}/parkingAggiorna 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* | string | Nome di dominio |
Richiedi corpo
| enabled | boolean | Se abilitare la pagina di parking |
| listing_price | number | null | Prezzo di vendita in USD o null per rimuovere l'inserzione |
Risposta 200
| domain | string | |
| parking_enabled | boolean | |
| listing_price | number | null | |
| hint | string |
/api/domains/{domain}/redirectInoltra 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* | string | Nome di dominio |
Richiedi corpo
| url* | string | URL di destinazione (o dominio nudo) a cui inoltrare, ad es. https://brand.dev |
| permanent | boolean | vero = permanente (308, predefinito), falso = temporaneo (307) |
Risposta 200
| domain | string | |
| redirect_url | string | null | |
| permanent | boolean |
/api/domains/{domain}/redirectInterrompe 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* | string | Nome di dominio |
Risposta 200
| domain | string | |
| redirect_url | string | null |
/api/domains/{domain}/for-saleMetti 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* | string | Nome di dominio da elencare per la vendita |
Richiedi corpo
| price* | number | Prezzo di vendita in USD |
| description | string | Descrizione facoltativa dell’inserzione |
Risposta 200
| listing | object | |
| hint | string |
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."
}/api/domains/{domain}/for-saleAggiorna 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* | string | Nome di dominio con inserzione attiva |
Richiedi corpo
| price | number | Nuovo prezzo di vendita in USD |
| description | string | null | Nuova descrizione (null per cancellare) |
Risposta 200
| listing | object | |
| hint | string |
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."
}/api/domains/{domain}/for-saleAnnulla 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* | string | Nome di dominio da rimuovere dall'elenco |
Risposta 200
| domain | string | |
| status | string | |
| hint | string |
Risposta di esempio
{
"domain": "example.com",
"status": "cancelled",
"hint": "Listing for example.com has been cancelled."
}/api/domains/{domain}/analyticsOttieni 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* | string | Nome di dominio |
Risposta 200
| domain | string | |
| views_7d | integer | Visualizzazioni di pagina totali negli ultimi 7 giorni |
| views_30d | integer | Visualizzazioni di pagina totali negli ultimi 30 giorni |
| inquiries_30d | integer | Richieste totali negli ultimi 30 giorni |
| conversion_rate | number | Rapporto richieste-visualizzazioni in percentuale |
| daily_views | object[] | La visualizzazione giornaliera conta per gli ultimi 30 giorni |
| recent_inquiries | object[] | 5 richieste più recenti |
| hint | string |
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)."
}/api/domains/{domain}/auth-codeOttieni 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| status | string | `ready`: il codice è in auth_code. `requested`: il team di Domani lo sta ottenendo dal registrar; l'utente riceve un'email quando è pronto. |
| auth_code | string | null | Codice di autorizzazione EPP da fornire al nuovo registrar. null finché lo stato è requested. |
| was_unlocked | boolean | Se il dominio è stato sbloccato per consentire il trasferimento |
| requested_at | string (date-time) | Quando è stato richiesto il codice (registrar senza un'API per ottenerlo) |
| expected_by | string (date-time) | Entro quando il team di Domani avrà il codice (stato requested) |
| hint | string | |
| next_steps | string[] |
/api/domains/{domain}/transfer-awayOttieni 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| status | string | |
| gaining_registrar | string | |
| request_date | string (date-time) | |
| hint | string |
/api/domains/{domain}/transfer-statusControlla 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| status | string | |
| timestamp | string | Timestamp dell'ultimo aggiornamento di stato |
| hint | string | Indicazioni attuabili in base allo stato attuale |
| continuity | object | Delega catturata e verifica post-trasferimento per trasferimenti sicuri. |
/api/domains/importImporta 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* | string | Dominio da importare |
Risposta 200
| domain | string | |
| status | string | |
| token | string | |
| txt_record | object | |
| hint | string |
/api/domains/import/verifyVerifica 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* | string | Dominio da verificare |
Risposta 201
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| registrar | string | |
| payment_method | string | |
| hint | string |
/api/domains/adoption-planPianifica 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* | string | Dominio esistente da controllare, ad es. miosito.com |
Risposta 200
| version | integer | |
| domain | string | |
| registered | boolean | |
| account_state | string | |
| recommended_action | string | |
| current | object | |
| options | object | |
| invariants | string[] | |
| warnings | string[] |
/api/domains/transfer-checkVerifica 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* | string | Dominio da verificare, ad es. miosito.com |
Risposta 200
| domain | string | |
| tld | string | |
| eligible | boolean | |
| price | number | null | Prezzo di trasferimento in USD (nullo se TLD non supportato) |
| currency | string | |
| renewal_price | number | Solo se idoneo: quanto costa ogni anno dopo il trasferimento, in USD, presso il registrar verso cui si sposta. Assente quando è sconosciuto. |
| reason | string | Motivo leggibile se non idoneo |
| code | string | |
| eligible_at | string (date) | Data ISO in cui il dominio diventa idoneo (periodo di attesa dell'ICANN) |
| hint | string |
/api/domains/transfer-watchControlla 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* | string | Dominio da tenere d'occhio, ad es. miosito.com |
Risposta 200
| domain | string | |
| eligible | boolean | Se il dominio è attualmente idoneo per il trasferimento |
| eligible_at | string (date) | Data ISO in cui il dominio diventa idoneo (se non ancora idoneo) |
| hint | string | Guida praticabile |
| watching | boolean | Se è stata impostata una notifica |
/api/domains/transferTrasferisci 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* | string | Dominio da trasferire, ad es. miosito.com |
| auth_code* | string | Codice di autorizzazione/EPP dell'attuale fornitore |
| payment_method | string(card | usdc | balance) | Metodo di pagamento: "card" (predefinito), "usdc" o "balance" (credito del mercato). |
| payment_tx | string | Hash della transazione di un pagamento USDC già inviato sulla catena. |
| payment_chain | string(base | ethereum) | Catena in cui è stato inviato il pagamento USDC. |
| extra_subdomains | string[] | 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_price | number | Tetto 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
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string | |
| auto_renew | boolean | |
| hint | string | |
| dns_snapshot | object | Riepilogo del backup di ripristino acquisito prima del trasferimento. Non viene applicato a meno che non sia necessaria un'operazione di ripristino esplicita. |
| nameservers_preserved | boolean | |
| dns_migration | string | |
| continuity | object |
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"}'/api/domains/{domain}/renewRinnova 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| years | integer | Numero di anni da rinnovare (predefinito 1) |
| payment_method | string(card | usdc | balance) | Metodo di pagamento: "card" (predefinito), "usdc" o "balance" (credito del mercato). |
| payment_tx | string | Hash della transazione di un pagamento USDC già inviato sulla catena. |
| payment_chain | string(base | ethereum) | Catena in cui è stato inviato il pagamento USDC. |
| max_price | number | Massimale 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
| domain | string | |
| renewed_years | integer | |
| new_expiry | string (date-time) | |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string |
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}'/api/domains/{domain}/buy-aftermarketAcquista 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* | string | Il dominio pubblicato sul mercato secondario da acquistare |
Richiedi corpo
| max_price | number | Tetto 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_method | string(card | usdc | balance) | Metodo di pagamento: "card" (predefinito), "usdc" o "balance" (credito del mercato). |
| payment_tx | string | Hash della transazione di un pagamento USDC già inviato sulla catena. |
| payment_chain | string(base | ethereum) | Catena in cui è stato inviato il pagamento USDC. |
Risposta 201
| domain | string | |
| status | string | "active" al completamento dell'acquisto o "provisioning" durante il completamento di un trasferimento graduale. |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string | |
| marketplace | string | mercato secondario su cui è stato acquistato il dominio (ad esempio "Afternic", "Sedo"). |
| hint | string | |
| next_steps | string[] |
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
/api/domains/{domain}/dnsOttieni 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| records | DnsRecord[] | |
| zone_version | string | Token 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"
/api/domains/{domain}/dnsImposta 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| records* | DnsRecord[] | |
| zone_version | string | La 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
| success | boolean | |
| domain | string | |
| records | DnsRecord[] |
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}
]}'/api/domains/{domain}/dnssecElenca 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| enabled | boolean | Vero quando viene pubblicato almeno un record DS |
| records | DsRecord[] |
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"
/api/domains/{domain}/dnssecPubblica 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| success | boolean | |
| domain | string | |
| enabled | boolean | |
| records | DsRecord[] |
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..."}'/api/domains/{domain}/dnssecRimuovere 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* | string | Nome di dominio di tua proprietà |
| keyTag* | string | Tag chiave del record DS da rimuovere |
Risposta 200
| success | boolean | |
| domain | string | |
| enabled | boolean | |
| records | DsRecord[] |
Esempio
curl -X DELETE "https://domani.run/api/domains/mysite.com/dnssec?keyTag=12345" \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dns/snapshotCattura 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| extra_subdomains | string[] | Sottodomini aggiuntivi da includere nello snapshot |
Risposta 200
| domain | string | |
| records | DnsRecord[] | |
| subdomains | string[] | |
| sources | string[] | |
| capturedAt | string (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"
/api/domains/{domain}/dns/restoreRipristina 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| snapshot | object | Un oggetto snapshot DNS (come restituito dall'endpoint dello snapshot). Se omesso, viene utilizzato il backup lato server archiviato. |
| dry_run | boolean | Solo anteprima: restituisce ciò che il ripristino creerebbe (would_apply) e salterebbe, senza scrivere nulla. |
Risposta 200
| domain | string | |
| applied | integer | Numero di record creati |
| skipped | integer | Numero di record già presenti |
| recordCount | integer | Record totali nello snapshot |
| errors | string[] | |
| dry_run | boolean | È vero, quando si trattava di un'anteprima, non era scritto nulla |
| would_apply | DnsRecord[] | 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"
/api/domains/{domain}/dns/cloneClona 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* | string | Dominio di destinazione (il DNS è scritto qui) |
Richiedi corpo
| from* | string | Dominio di origine da cui copiare il DNS (deve essere tuo) |
| replace | boolean | Mirror esatto: rilascia i record di destinazione che l'origine non ha. Predefinito: unisci |
Risposta 200
| success | boolean | |
| from_domain | string | |
| to_domain | string | |
| records | DnsRecord[] |
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"}'/api/domains/{domain}/nameserversOttieni 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| nameservers | string[] | |
| default_nameservers | string[] | 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_provider | string | Chi 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 |
| hint | string |
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"
/api/domains/{domain}/nameserversImposta 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| nameservers* | string[] | Nomi host del server dei nomi (2-13 richiesti) |
Risposta 200
| success | boolean | |
| domain | string | |
| nameservers | string[] | |
| hint | string |
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
/api/domains/{domain}/connectConnetti 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| target | string | URL di destinazione per il rilevamento automatico (ad esempio my-app.vercel.app) |
| provider | string | Nome esplicito del provider (ad esempio vercel, google-workspace) |
| method | string | Metodo di connessione se il provider ne ha più (ad esempio solo cname) |
| dry_run | boolean | Solo anteprima: restituisce le differenze (create/replace/already_set/keep) senza scrivere nulla. |
| confirm_replace_mx | boolean | Richiesto 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
| domain | string | |
| provider | string | |
| category | string | |
| method | string | |
| records | DnsRecord[] | |
| docs | string (uri) | |
| status | string | dns_set = record scritti automaticamente. manual_setup_required = dominio importato, aggiungi record al tuo registrar. dry_run = solo anteprima, niente scritto. |
| hint | string | |
| next_steps | string[] | Azioni specifiche del provider da completare dopo l'impostazione dei record DNS |
| diff | object | Solo 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"}'/api/domains/{domain}/connectElenca 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| providers | object |
/api/domains/{domain}/verifyVerificare 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| target | string | Obiettivo per il rilevamento automatico |
| provider | string | Nome del fornitore |
| method | string | Nome del metodo |
Risposta 200
| domain | string | |
| provider | string | |
| method | string | |
| verified | boolean | |
| message | string | |
| hint | string | |
| next_steps | string[] | 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
/api/domains/{domain}/statusControlla 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| days_until_expiry | integer | |
| dns | object | |
| ssl | object | |
| object |
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
/api/domains/{domain}/verify-serviceAggiungi 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* | string | Nome di dominio di tua proprietà |
Richiedi corpo
| service* | string | Nome del servizio (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365) |
| token* | string | Token di verifica fornito dal servizio |
Risposta 200
| domain | string | |
| service | string | |
| service_display_name | string | |
| known_service | boolean | |
| records_added | DnsRecord[] | |
| total_records | integer | |
| docs | string (uri) | null | |
| hint | string |
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"}'/api/domains/{domain}/verify-serviceElenca 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* | string | Nome di dominio di tua proprietà |
Risposta 200
| domain | string | |
| services | object[] | |
| hint | string |
Scoperta
/api/domains/{domain}/profilePubblicoOttieni 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
| profile | PublicDomainProfile |
/api/domains/{domain}/profilePubblicoRicerca 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 | |
| depth | string(instant | deep) | Profondità di ricerca. Il valore predefinito è profondo. |
Risposta 201
| profile | PublicDomainProfile |
/api/domains/whoisPubblicoCerca 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* | string | Dominio da cercare (ad esempio esempio.com) |
Risposta 200
| domain | string | |
| registered | boolean | Se il dominio è attualmente registrato |
| registrar | string | null | Nome del registrar attuale |
| registrar_url | string | null | URL del sito web del registrar |
| registrar_iana_id | string | null | ID IANA del registrar (dai publicIds RDAP) |
| created | string | null | Data di registrazione (YYYY-MM-DD) |
| expires | string | null | Data di scadenza (YYYY-MM-DD) |
| updated | string | null | Data dell’ultimo aggiornamento (YYYY-MM-DD) |
| days_until_expiry | integer | null | Giorni alla scadenza (nulli se non registrati) |
| status | string[] | Codici di stato EPP |
| nameservers | string[] | Nameserver autorevoli |
| dnssec | boolean | Se DNSSEC è abilitato |
| redacted | boolean | Se i dati WHOIS/RDAP vengono oscurati per motivi di privacy (GDPR) |
| contacts | object | Informazioni 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"
/api/domains/{domain}/ogPubblicoOttieni 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* | string | Dominio per cui recuperare i metadati (ad esempio google.com) |
Risposta 200
| title | string | null | Titolo della pagina (og:title > twitter:title > <titolo>) |
| description | string | null | Descrizione della pagina (og:description > meta descrizione) |
| image | string | null | URL dell'immagine OG (assoluto) |
| favicon | string | null | URL della favicon (assoluto) |
Esempio
curl "https://domani.run/api/domains/google.com/og"
Fatturazione
/api/billing/setupOttieni 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
| mode | string(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
| url | string (uri) | URL di Stripe Checkout - aprilo in un browser per aggiungere una carta |
| client_secret | string | Segreto client Stripe SetupIntent, per un frontend che usa Stripe.js direttamente |
| hint | string | Guida 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"
/api/billing/cardRimuovi 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
| removed | boolean |
Risposta di esempio
{
"removed": true
}Esempio
curl -X DELETE https://domani.run/api/billing/card \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/connectOttieni 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
| onboarded | boolean | Il venditore ha inviato i dettagli di onboarding di Connect |
| payouts_enabled | boolean | Sono attivi i versamenti bancari |
| details_submitted | boolean | |
| balance_cents | integer | Saldo 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"
/api/billing/connectInizia 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
| url | string (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"
/api/billing/connect/payoutPreleva 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_cents | integer | Importo trasferito in centesimi |
| transfer_id | string | ID 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"
/api/billing/invoicesElenca 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
| limit | integer | Max fatture da restituire |
Risposta 200
| invoices | object[] | |
| has_more | boolean | |
| hint | string |
Esempio
curl https://domani.run/api/billing/invoices \ -H "Authorization: Bearer domani_sk_xxx"
Referral
/api/referralsOttieni 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_code | string | Il tuo codice di riferimento univoco da condividere |
| referral_rate | integer | Percentuale di commissione (attualmente 20%) |
| total_earned_cents | integer | Guadagno totale in centesimi |
| total_paid_cents | integer | Totale pagato in centesimi |
| total_pending_cents | integer | Pagamento in centesimi in sospeso |
| referrals | object[] |
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
/api/backordersEffettua 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* | string | Dominio attualmente registrato da monitorare per tentare la registrazione quando viene rilasciato. |
| max_price | number | Importo massimo in USD che pagherai per registrarlo. Il valore predefinito è il prezzo di registrazione corrente. Deve essere >= al prezzo corrente. |
| payment_method | string(card | balance) | Metodo di pagamento da usare se la registrazione riesce. Per impostazione predefinita usa il metodo preferito. |
Risposta 201
| backorder | Backorder | |
| hint | string |
Esempio
curl -X POST https://domani.run/api/backorders \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain": "taken.com"}'/api/backordersElenca i tuoi backorder
Restituisce i backorder dal più recente al meno recente. Filtra per status (watching, caught, failed, cancelled, expired).
Parametri
| status | string(watching | caught | failed | cancelled | expired) | Filtra per stato. |
Risposta 200
| backorders | Backorder[] |
/api/backorders/{id}Ottieni un backorder
Parametri
| id* | string | ID dell'backorder. |
Risposta 200
| backorder | Backorder |
/api/backorders/{id}Annulla un backorder
Interrompe il controllo di un dominio. Solo gli backorder nello stato di watching possono essere annullati.
Parametri
| id* | string | ID dell'backorder. |
Risposta 200
| id | string | |
| status | string | |
| hint | string |
Mercato
/api/domains/sellMetti 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* | string | Nome di dominio da elencare per la vendita |
| price* | number | Prezzo di vendita in USD |
| description | string | Descrizione facoltativa dell’inserzione |
Risposta 201
| listing | object | |
| txt_record | object | null | Record TXT da aggiungere per la verifica della proprietà (solo per domini esterni) |
| hint | string |
/api/domains/sell/verifyVerifica 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* | string | Nome di dominio da verificare |
Risposta 200
| listing | object | |
| hint | string |
/api/domains/sell/statusControlla 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* | string | Nome di dominio da verificare |
Risposta 200
| listing | object | null | |
| deal | object | null | |
| hint | string |
/api/dealsElenca 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
| role | string(buyer | seller) | Filtra per ruolo |
| status | string(active | escrow_held | epp_pending | transfer_started | completed | refunded | expired) | Filtra per stato ("active" = tutti non terminali) |
| domain | string | Filtra per nome di dominio |
| limit | integer | Numero di transazioni da restituire (predefinito 50, massimo 100) |
| cursor | string | Cursore di impaginazione da una risposta precedente |
Risposta 200
| deals | object[] | |
| has_more | boolean | Se sono disponibili più risultati |
| next_cursor | string | null | Cursore per la pagina successiva |
/api/dealsAcquista 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* | string | Nome di dominio da acquistare |
| payment_method | string(card | usdc | balance) | Metodo di pagamento: "card" (predefinito), "usdc" o "balance" (credito del mercato). |
Risposta 201
| deal | object | |
| hint | string | |
| next_steps | string[] |
/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* | string | ID della transazione |
Risposta 200
| deal | object | |
| hint | string |
/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* | string | ID della transazione |
Richiedi corpo
| auth_code* | string | Codice EPP/autorizzazione dell'attuale registrar |
Risposta 200
| deal | object | |
| hint | string |
/api/deals/{id}/invoiceOttieni 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
| invoice | DealInvoice |
/api/negotiationsElenca 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
| role | string(buyer | seller) | Filtra per il tuo ruolo |
| status | string | Filtra per stato (open|agreed|completed|declined|expired|cancelled|all) |
Risposta 200
| negotiations | Negotiation[] |
/api/negotiationsFai 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* | string | Il dominio messo in vendita su cui negoziare |
| offer* | number | Offerta iniziale in USD |
| message | string | Messaggio facoltativo al venditore |
Risposta 201
| negotiation | Negotiation |
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}'/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
| negotiation | Negotiation |
/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) | |
| counter | number | Nuovo importo in USD (richiesto quando action=counter) |
| message | string |
Risposta 200
| negotiation | Negotiation |
/api/negotiations/{id}Ritirare una trattativa
L'acquirente ritira una trattativa aperta o concordata. Richiede l'ambito deals:write.
Parametri
| id* | string |
Risposta 200
| cancelled | boolean |
/api/negotiations/{id}/finalizeConcludere 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_method | string(card | usdc | balance) | |
| payment_signature | string | null | |
| payment_tx | string | |
| payment_chain | string | |
| confirm_over_budget | boolean | Per le transazioni tramite broker: procedi anche se il prezzo concordato supera il max_budget impostato. |
/api/brokerElenca le tue richieste di broker
Elenca le tue richieste di acquisizione di domini e il loro stato. Richiede l'ambito deals:read.
Parametri
| status | string | Filtra per stato o "all" |
Risposta 200
| requests | BrokerRequest[] |
/api/brokerRichiedere 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* | string | Il dominio già registrato che desideri |
| max_budget | number | Il tuo massimale in USD (facoltativo) |
Risposta 201
| request | BrokerRequest |
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}'/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
| request | BrokerRequest |
/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
| cancelled | boolean |
/api/broker/respondPubblicoLeggere 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* | string | Il token di sensibilizzazione dalla tua email di richiesta. |
Risposta 200
| domain | string | |
| status | string | |
| your_turn | boolean | Che si tratti della mossa del proprietario. |
| current_offer_usd | number | null | L'offerta dell'acquirente sul tavolo. |
| agreed_price_usd | number | null | |
| actions | string[] | Azioni attualmente disponibili (sottoinsieme di offer/counter/accept/decline/opt_out). |
Esempio
curl "https://domani.run/api/broker/respond?token=<from your inbox>"
/api/broker/respondPubblicoRispondere 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* | string | Il 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. |
| price | number | Il prezzo richiesto in USD (richiesto per l'offerta/controfferta). |
Risposta 200
| handled | boolean | |
| outcome | string | Valori di stato: opted_out | declined | negotiation_opened | countered | ignored_not_your_turn | unclear |
| status | string | |
| negotiation_id | string | |
| domain | string |
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
/api/oauth/registerRegistra 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_name | string | Mostrato nella schermata di consenso |
| token_endpoint_auth_method | string(none | client_secret_post | client_secret_basic) | |
| client_uri | string | |
| logo_uri | string |
Risposta 201
| client_id | string | |
| client_name | string | |
| redirect_uris | string[] | |
| token_endpoint_auth_method | string | |
| grant_types | string[] | |
| response_types | string[] | |
| client_id_issued_at | integer | |
| client_secret | string | Solo per i client confidenziali; restituito una sola volta |
/api/oauth/tokenEndpoint 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_token | string | |
| token_type | string | |
| expires_in | integer | |
| refresh_token | string | |
| scope | string |