Documentação do Mailzero

A API por trás do Today: conecte uma caixa de entrada, leia o resumo e os fatos, entregue os tipos de assuntos que você escolher aos seus agentes sob delegações permanentes e deixe-os agir dentro de concessões com um recibo para cada efeito. Domínios, DNS e o resto da plataforma mantêm sua referência mais abaixo.

Suporte: support@mailzero.run

Autenticação

Todos os endpoints autenticados exigem um token Bearer no cabeçalho Authorization.

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

Obtenha uma chave de API por criando uma conta ou do Ajustes. Alguns endpoints (pesquisa, TLDs, WHOIS) são públicos, mas têm limites de taxa mais baixos sem autenticação.

Escopos de token

Os tokens podem ser restritos a escopos de permissão específicos. Usar * para acesso total (padrão). Crie tokens com escopo via `POST /api/tokens` com um `scopes` matriz.

EscopoConcede acesso a
domains:readGET /api/domains, GET /api/domains/{domain}, GET /api/domains/{domain}/dns, /dnssec, /status, /email/check, /auth-code, /transfer-away, /transfer-status, /analytics
domains:writePUT /api/domains/{domain}/dns, POST/DELETE /api/domains/{domain}/dnssec, POST /connect, POST /verify, PUT /settings, PUT /parking, PUT/DELETE /api/domains/{domain}/for-sale, POST /api/domains/import, POST /import/verify
domains:transferPOST /api/domains/buy, POST /transfer, POST /renew (envolve pagamento, inclui compras no mercado)
tokens:readGET /api/tokens
tokens:writePOST /api/tokens, DELETE /api/tokens/{id}
webhooks:readGET /api/webhooks, GET /api/webhooks/{id}/deliveries
webhooks:writePOST /api/webhooks, PATCH /api/webhooks/{id}, DELETE /api/webhooks/{id}
email:readGET /api/emails, /api/emails/{address}, /api/emails/{address}/messages, /api/emails/{address}/aliases, /api/email/changes, /api/domains/{domain}/email/status, /api/domains/{domain}/email/deliverability, /api/suppressions, GET /api/contacts
email:writePOST /api/emails, POST /api/emails/{address}/send, POST /api/domains/{domain}/email/setup, aliases + catch-all, POST/DELETE /api/suppressions, POST/DELETE /api/contacts
email:deleteExclua permanentemente as mensagens que já estão na Lixeira. Mover mensagens para a Lixeira requer apenas email:write. Conceda este escopo apenas a agentes autorizados a apagar irreversivelmente o conteúdo do email
email:manage_mailboxesCria caixas de correio (POST /api/emails) e nada mais. Esse escopo administrativo restrito permite que agentes criem endereços para novos projetos (partners@, launch@) sem poder ler ou enviar e-mails, gerenciar domínios ou manipular tokens
email:auth_secretsLeia mensagens classificadas como correio de autenticação (OTP/códigos de verificação, redefinições de senha, links mágicos). Sem ele, email:read ainda os lista, mas o assunto e o corpo voltam ocultos - portanto, um token de agente roubado não pode coletar códigos 2FA. Conceda-o apenas a agentes que realmente precisem concluir logins
account:readGET /api/me, GET /api/agents/identity
account:writeDELETE /api/me, POST /api/billing/setup, POST /api/billing/subscribe, POST /api/billing/cancel, POST /api/me/resend-verification, POST/PATCH/DELETE /api/agents/identity
billing:readGET /api/billing/invoices
searchGET /api/domains/search, /suggest, /whois, /dns-check, GET /api/tlds
deals:readGET /api/deals, GET /api/deals/{id}
deals:writePOST /api/domains/sell, PATCH /api/deals/{id}
notifications:readGET /api/notifications, GET /api/notifications/count
backorders:readGET /api/backorders, GET /api/backorders/{id}
backorders:writePOST /api/backorders, DELETE /api/backorders/{id}
assistant:readRead Mailzero assistant settings, the Today queue, Work items, exact action previews, history-import progress, and content-minimized Activity
assistant:writeChange Mailzero assistant settings, record consent and start history imports, record human Decisions on Work items, retry imports, and export or delete derived assistant data. Never sends mail

Atenuação do escopo: um token só pode criar tokens filhos com escopos iguais ou menores - nunca mais.

Retornos de escopo ausentes 403 com código `INSUFFICIENT_SCOPE` e uma dica nomeando o escopo necessário.

Início rápido para agentes: o loop de tarefas

Dê a um agente uma identidade e um token, entregue a ele um tipo de assunto com uma delegação permanente para observar, então deixe-o ler o envelope de cada assunto, solicitar efeitos e reportar. O nível e as concessões aprovam, escalam para você ou recusam; cada efeito deixa um recibo; aumente o nível quando os recibos o merecerem.

# 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

Os endpoints do assistente Mailzero transformam os próprios e-mails de um usuário em decisões fundamentadas: uma fila de Hoje versionada, um item de trabalho por conversa que precisa de julgamento e um plano de ação exato, preparado apenas depois que o usuário escolhe. Nada em /api/assistant envia, exclui ou altera e-mails; a saída do modelo é sempre uma proposta que o servidor valida.

Dois escopos cobrem tudo: assistant:read para configurações, Hoje, itens de trabalho, planos de ação, progresso da importação e Atividade; assistant:write para alterações de configuração, consentimento e importação de histórico, decisões humanas sobre itens de trabalho e exportação ou exclusão de dados derivados.

O processamento começa apenas após consentimento explícito: POST /api/assistant/preview registra a versão do consentimento, delimita as caixas de que o usuário é dono e inicia uma importação em segundo plano que pode ser retomada. Consulte GET /api/assistant/backfill para acompanhar o progresso.

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

Uma escolha prepara um plano exato. Leia-o com GET /api/assistant/action-plans/{id}, mostre-o ao usuário e depois envie pelo endpoint normal de resposta POST /api/emails/{address}/messages/{id}/reply com assistant_plan_id. O servidor recusa planos desatualizados ou incompatíveis, registra um recibo por envio e move o item de trabalho para Aguardando ou Resolvidos.

Webhooks de caixa de correio autenticados

No painel, abra a guia Email de um domínio, escolha uma caixa de correio e selecione Authorization ou X-API-Key. Domani criptografa o valor e o envia com testes de webhook e entregas de e-mail de entrada. As entregas de entrada ao vivo são duráveis ​​e repetidas até três vezes; `X-Domani-Delivery-Attempt`.

read -rsp 'Sender credential: ' WEBHOOK_SENDER_AUTH; echo export WEBHOOK_SENDER_AUTH jq -n --arg url 'https://agent.example/webhook' --arg auth "$WEBHOOK_SENDER_AUTH" '{url:$url,headers:'{Authorization:$auth}} | \ curl --fail-with-body -X PUT "https://domani.run/api/emails/agent%40example.com/webhook" \ -H "Authorization: Bearer $DOMANI_API_KEY" \ -H "Content-Type: application/json" --data-binary @- unset WEBHOOK_SENDER_AUTH

Os valores de cabeçalho nunca são retornados. As respostas expõem apenas `header_names`. Omitir `headers` para preservar o valor armazenado, envie um objeto vazio para limpá-lo e use `POST /api/emails/`'{address}'`/webhook/test` para verificar a entrega.

Começando do zero? Incluir `webhook_headers` em `POST /api/agents/provision` para comprar o domínio, criar sua caixa de correio e anexar o webhook do evento autenticado em uma chamada idempotente. Domani valida o URL e os nomes dos cabeçalhos antes de qualquer cobrança.

Erros

Todos os erros retornam um envelope JSON consistente. Usar `code` para manipulação programática e `hint` para orientação de recuperação.

{
  "error": "Missing API key",
  "code": "MISSING_API_KEY",
  "hint": "Include 'Authorization: Bearer domani_sk_xxx' header",
  "documentation_url": "https://domani.run/llms.txt"
}
CódigoHTTP
MISSING_API_KEY401
INVALID_API_KEY401
EXPIRED_API_KEY401
MISSING_PARAMETER400
INVALID_DOMAIN400
PAYMENT_REQUIRED402
DOMAIN_UNAVAILABLE409
RATE_LIMIT_EXCEEDED429
USER_EXISTS409
NOT_FOUND404
UNKNOWN_PROVIDER400
UNKNOWN_METHOD400
TARGET_REQUIRED400
INVALID_PARAMETER400
CONTACT_REQUIRED400
INVALID_CONTACT400
INSUFFICIENT_SCOPE403
SCOPE_ESCALATION400
MAILBOX_CONFINED400
DOMAIN_EXISTS400
DOMAIN_NOT_ACTIVE400
UNSUPPORTED_TLD400
TLD_NOT_IN_PUBLIC_DNS400
NOT_AVAILABLE400
ALREADY_REGISTERED400
TRANSFER_NOT_ELIGIBLE400
RENEWAL_NOT_ELIGIBLE400
ALREADY_LISTED400
LISTING_SOLD400
SELF_PURCHASE400
DESCRIPTION_TOO_LONG400
DEAL_NOT_FOUND400
INVALID_DEAL_STATE400
EPP_ATTEMPTS_EXCEEDED400
ACTIVE_DEAL_EXISTS400
AGENT_IDENTITY_NOT_FOUND400
AGENT_IDENTITY_ESCALATION400
AGENT_MAILBOXES_REQUIRED400
CREDENTIAL_REVOKE_FAILED400
INVALID_IDEMPOTENCY_KEY400
IDEMPOTENCY_KEY_MISMATCH400
IDEMPOTENCY_KEY_REUSED400
OPERATION_IN_PROGRESS400
OPERATION_SUPERSEDED400
INVALID_OPERATION_RECEIPT400
WORKSPACE_ADMIN_REQUIRED400
WORKSPACE_OWNER_REQUIRED400
PRINCIPAL_NOT_IN_WORKSPACE400
MAILBOX_NOT_IN_WORKSPACE400
GROUP_NOT_IN_WORKSPACE400
COLLECTION_NOT_IN_WORKSPACE400
ACCESS_VERSION_CONFLICT400
ACCESS_OFFER_INVALID400
ACCESS_OFFER_EMAIL_MISMATCH400
MAIL_DOMAIN_CAPACITY_EXHAUSTED400
MAIL_PROVIDER_ERROR400
INVALID_HTTP_ROUTE_HOSTNAME400
INVALID_HTTP_ROUTE_UPSTREAM400
INVALID_HTTP_ROUTE_UPSTREAM_HEADERS400
INVALID_HTTP_ROUTE_LEASE400
INVALID_HTTP_ROUTE_POLICY400
INVALID_HOSTNAME_BINDING400
HTTP_ROUTE_HOSTNAME_NOT_ALLOWED400
HTTP_ROUTE_HOSTNAME_REQUIRED400
HTTP_ROUTE_HOSTNAME_RESERVED400
HTTP_ROUTE_HOSTNAME_UNAVAILABLE400
HTTP_ROUTE_CONCURRENCY_LIMIT400
HTTP_ROUTE_WORKSPACE_LIMIT400
HTTP_ROUTE_DOMAIN_NOT_OWNED400
HTTP_ROUTE_TERMINAL400
HTTP_ROUTE_VERIFICATION_NOT_ENABLED400
HTTP_ROUTE_VERIFICATION_REQUIRES_HTTPS400
HTTP_ROUTE_POLICY_WITHOUT_SCOPE400
HTTP_ROUTE_POLICY_REQUIRED400
HTTP_ROUTE_AGENT_IDENTITY_REQUIRED400
HTTP_ROUTE_POLICY_ESCALATION400
HOSTNAME_BINDING_NOT_ACTIVE400
HOSTNAME_BINDING_DNS_CONFLICT400
HOSTNAME_BINDING_ACK_REQUIRED400
HOSTNAME_BINDING_BROWSER_MODE_MISMATCH400
HOSTNAME_DNS_CONFLICT400
ZONE_READ_FAILED400
DNS_VERSION_CONFLICT400
UNAUTHORIZED400
APEX_WEB_MODE_CONFLICT400
APEX_DELEGATION_ACK_REQUIRED400
VERIFICATION_COOLDOWN400
VERIFICATION_SEND_FAILED400
UPGRADE_REQUIRED400
FREE_LIMIT_EXCEEDED400

Limites de taxa

Cada resposta inclui cabeçalhos de limite de taxa:

  • `X-RateLimit-Limit` - máximo de solicitações por janela
  • `X-RateLimit-Remaining` - pedidos restantes
  • `X-RateLimit-Reset` - timestamp unix quando a janela é redefinida

Quando a taxa for limitada (HTTP 429), verifique o `Retry-After` cabeçalho por segundos para esperar.

Assistente Mailzero

GET/api/assistant/rules

Listar as delegações permanentes

As regras de delegação permanente do proprietário em ordem: nome, o predicado de correspondência, o destinatário (uma identidade de agente ou um membro do workspace), o nível de autonomia, quantas vezes cada uma correspondeu. Requer assistant:read; um token de agente é recusado.

Resposta 200

rulesAssistantRule[]
POST/api/assistant/rules

Criar uma delegação permanente

Entregar um tipo de assunto a um agente ou uma pessoa uma vez. match é um predicado explícito, nunca uma chamada de modelo: qualquer um de senderAddress, senderDomain, organisation, workKeyPrefix, senderKind, mailboxIds, labels, subjectPattern (ancorado, insensível a maiúsculas/minúsculas), minOccurrences, minConfidence (a probabilidade do classificador calibrado em uma etiqueta category:, de 0,5 a 1); todas as condições declaradas devem ser verdadeiras. As regras são ordenadas e a primeira correspondência vence; o nível é observe a menos que dito o contrário. Uma regra correspondente entrega o próximo item correspondente ao destinatário, notifica através do aviso de delegação, e o Today mostra o porquê. Requer assistant:write; um token de agente é recusado.

Resposta 201

idstring
namestring
enabledboolean
positioninteger
matchAssistantRuleMatch
assigneeobject
levelstring
grantsAssistantGrants
match_countinteger
last_matched_atstring (date-time) | null
created_atstring (date-time)
updated_atstring (date-time)
PUT/api/assistant/rules/{id}

Alterar uma delegação permanente

Renomear, habilitar ou desabilitar, reordenar, alterar a correspondência, o destinatário, o nível ou as permissões. Reduzir o nível para observe é o interruptor de desativação de um clique de uma regra. Requer assistant:write; um token de agente é recusado.

Parâmetros

id*string

Resposta 200

idstring
namestring
enabledboolean
positioninteger
matchAssistantRuleMatch
assigneeobject
levelstring
grantsAssistantGrants
match_countinteger
last_matched_atstring (date-time) | null
created_atstring (date-time)
updated_atstring (date-time)
DELETE/api/assistant/rules/{id}

Excluir uma delegação permanente

Remove a regra; os itens que ela entregou retornam ao proprietário, os recibos do que o destinatário fez permanecem. Requer assistant:write; um token de agente é recusado.

Parâmetros

id*string

Resposta 200

deletedboolean
released_itemsinteger
POST/api/assistant/rules/test

Testar as delegações permanentes em fatos de amostra

Uma simulação: qual regra pegaria uma mensagem com esses fatos (caixa de entrada, chave, remetente, assunto, etiquetas, ocorrências), e por quê. Nada muda. Requer assistant:write; um token de agente é recusado.

Solicitar corpo

mailbox_id*string
key*stringA chave do item de trabalho, por exemplo org:tucows:invoice
sender_addressstring | null
sender_kindstring(human | automated)
subjectstring | null
labelsstring[]
occurrencesinteger
confidenceobjectA probabilidade do classificador por etiqueta, para uma regra com minConfidence

Resposta 200

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

Testar um efeito contra o nível e as permissões de uma delegação permanente

Uma execução de teste da ordem de validação para um efeito solicitado sob a regra hoje: o nível permite o tipo; as permissões permitem os destinatários, o volume (contagem de efeitos executados hoje), o cronograma, o gasto, as classes de risco lidas do assunto; o aprovador obrigatório aprovou. Responde o status que um plano tomaria (proposed, approved, escalated ou rejected) com cada verificação e o motivo. Nada muda. Requer assistant:write; um token de agente é recusado.

Parâmetros

id*string

Solicitar corpo

effect*object
matterobject
atstring (date-time)O instante para verificar o cronograma; agora por padrão
approved_bystring[]IDs de membros que já aprovaram

Resposta 200

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

Ler as métricas de tarefa

Os sete números da camada de tarefa em uma janela móvel (trinta dias por padrão, window_days de 1 a 90), para a conta e para cada delegação permanente: assuntos fechados sem o proprietário, o tempo da chegada até a conclusão, os planos executados conforme proposto, editados e rejeitados, as escalações por assunto, as correções após execução, as colisões, o custo do modelo por assunto. Lido dos recibos, dos planos, das escalações e do livro-razão; nada é estimado. Requer assistant:read.

Parâmetros

window_daysinteger

Resposta 200

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

Listar a fila de aprovações

Os planos aguardando o proprietário (propostos em rascunho ou retidos por uma permissão) e as perguntas que os responsáveis fizeram, entre os assuntos que o leitor pode ver. Responda através das interações do item de trabalho: aprovar ou rejeitar um plano, escolher uma opção ou instruir sobre uma pergunta. Requer assistant:read. Um assunto criado a partir de um e-mail de autenticação antes que esse e-mail fosse mantido fora do assistente é exibido com título, resumo, pedido e efeitos do plano retidos para um leitor sem email:auth_secrets.

Resposta 200

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

Listar as sugestões de delegação

As delegações permanentes que o assistente propõe: um assunto que ocorreu pelo menos três vezes em noventa dias (a mesma organização ou remetente) e foi tratado da mesma forma todas as vezes (ignorado, respondido, fechado, entregue a um agente), com a regra pré-preenchida. Abertas por padrão. Nada é criado até que o proprietário aceite. Requer assistant:read; um token de agente é recusado.

Parâmetros

statusstring(open | accepted | dismissed)

Resposta 200

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

Aceitar ou descartar uma sugestão de delegação

Aceitar: a sugestão fecha e a regra pré-preenchida retorna para o cliente criar (POST /api/assistant/rules). Descartar: ela fecha e nunca retorna para os mesmos assuntos e tratamento. Requer assistant:write; um token de agente é recusado.

Parâmetros

id*string

Solicitar corpo

action*string(accept | dismiss)

Resposta 200

suggestionAssistantSuggestion
ruleAssistantRuleInput
GET/api/assistant/grants

Listar as permissões anexadas aos destinatários

As permissões anexadas aos agentes e membros do proprietário, além de cada regra que lhes entrega assuntos; o mais restritivo entre a regra e o destinatário se aplica. Requer assistant:read; um token de agente é recusado.

Resposta 200

grantsAssistantAssigneeGrants[]
PUT/api/assistant/grants

Definir as permissões de um destinatário

Anexar permissões a uma identidade de agente ou um membro do workspace; elas substituem as permissões anteriores do destinatário e limitam cada regra que lhes entrega assuntos. Requer assistant:write; um token de agente é recusado.

Solicitar corpo

assignee_type*string(agent | member)
assignee_ref*stringO slug da identidade do agente, ou o id de usuário do membro
grants*AssistantGrants

Resposta 200

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

Remover as permissões de um destinatário

O destinatário mantém apenas o que cada regra concede. Requer assistant:write; um token de agente é recusado.

Parâmetros

type*string(agent | member)
ref*string

Resposta 200

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

Ler um envelope de tarefa

O assunto transferido, conforme o destinatário precisa: o resumo com a evidência, os fatos, a delegação (destinatário, regra, nível, os tipos de efeito permitidos, as permissões efetivas), os planos abertos e recentes, o arrendamento. Um token de agent lê os assuntos transferidos a ele e aqueles das caixas de entrada que opera; o proprietário lê os seus próprios. Requer assistant:read. Um assunto criado a partir de um e-mail de autenticação antes que esse e-mail fosse mantido fora do assistente é exibido com título, resumo, pedido e efeitos do plano retidos para um leitor sem email:auth_secrets.

Parâmetros

id*stringO id do item de trabalho

Resposta 200

idstringO id do item de trabalho
versioninteger
statusstring
deadlinestring (date-time) | null
youobject
delegationobject
leaseAssistantTaskLease
briefobject | nullO resumo do assunto, conforme GET /api/assistant/work-items/{id}/brief responde
factsobject | nullOs fatos do assunto, conforme GET /api/assistant/work-items/{id}/facts responde
plansobject
escalationsobject[]As perguntas feitas na tarefa, mais recentes primeiro, com suas respostas
POST/api/assistant/tasks/{id}/lease

Tomar ou renovar o arrendamento de uma tarefa

Dois destinatários nunca trabalham um assunto: o arrendamento nomeia quem trabalha nele até quando (quinze minutos por padrão, até uma hora). Tomá-lo novamente o renova; outro detentor é recusado com TASK_LEASED até a expiração. Uma solicitação de efeitos toma o arrendamento por conta própria. Requer assistant:write.

Parâmetros

id*string

Solicitar corpo

ttl_secondsinteger

Resposta 200

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

Devolver o arrendamento

Libera o arrendamento que o chamador detém; um arrendamento detido por outro destinatário é deixado intacto. Requer assistant:write.

Parâmetros

id*string

Resposta 200

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

Solicitar efeitos em uma tarefa

O destinatário solicita um ou mais efeitos (responder, encaminhar, rotular, adiar, resolver, anotar, requisitar). O nível da delegação decide os tipos permitidos e as permissões os limitam: dentro das permissões em guarded_send ou operate (e os tipos de entrada em triage) os efeitos são executados imediatamente com seus recibos; em draft eles aguardam a aprovação do proprietário; uma permissão falhada escala para o proprietário; um tipo que o nível não permite é recusado. A própria solicitação do proprietário é executada imediatamente. A mesma chave de idempotência responde o primeiro plano novamente. Requer assistant:write.

Parâmetros

id*string

Solicitar corpo

effects*AssistantEffect[]
idempotency_key*string
notestringO que o destinatário quer que o proprietário saiba sobre esta solicitação

Resposta 200

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

Parar e perguntar ao proprietário

O responsável faz uma pergunta com a evidência e, quando útil, as opções que vê. O proprietário responde com as interações comuns de escolher ou instruir na decisão que isso cria; o assunto aparece no Today como precisando do proprietário, o lease é liberado, a tarefa aguarda. Requer assistant:write.

Parâmetros

id*string

Solicitar corpo

question*string
optionsobject[]
evidence_refsstring[]

Resposta 200

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

Relatar sobre uma tarefa

O que o responsável fez e como terminou: done (o assunto resolve, ou aguarda quando uma resposta ainda é esperada), blocked (o proprietário é perguntado), ou handed back (o proprietário assume e a regra fica desligada neste assunto). Reivindicações são reconciliadas com os recibos que a plataforma escreveu: uma reivindicação sem recibo é registrada como uma reivindicação, nunca como um fato. O lease é liberado. Requer assistant:write.

Parâmetros

id*string

Solicitar corpo

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

Resposta 200

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

Leia o que o assistente estabeleceu sobre uma mensagem

O conhecimento que as análises desta mensagem produziram: afirmações (sujeito, predicado, valor com tipo e moeda, base, confiança, validade, evidência), entidades, compromissos e expectativas. Nada é computado no caminho: uma mensagem que o pipeline nunca analisou responde analysed: false com reason (not_enabled quando a caixa de entrada não está no assistente, not_analysed quando a análise ainda não aconteceu). Requer assistant:read.

Parâmetros

address*string
id*stringID da mensagem

Resposta 200

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

Extraia os campos que você precisa de uma mensagem com seu próprio schema

Uma chamada de modelo no texto da mensagem (assunto, remetente, corpo) com um schema JSON do chamador de objetos e primitivos (até 8 KB, sem referências): responde data nessa forma, confidence (0 a 1) e evidence_quotes (trechos literais). Armazenado em cache por (mensagem, schema, instruções) então a mesma pergunta custa uma chamada (cached: true depois). Limitado pelo orçamento de modelo da conta (429 quando esgotado, 503 quando a rota do modelo está desligada). E-mails de código de login respondem 403 AUTH_MESSAGE. Corpos acima de 60.000 caracteres respondem 413.

Parâmetros

address*string
id*stringID da mensagem

Solicitar corpo

schema*objectSchema JSON dos campos a extrair: um objeto de primitivos, arrays e objetos aninhados, abaixo de 8 KB, sem $ref
instructionsstringOrientação opcional, por exemplo, valores em EUR

Resposta 200

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

Obter configurações do assistente Mailzero

Retorna o estado de ativação do assistente, sinalizadores de sombra/pausa, versão de consentimento, rota de privacidade, escopo de caixas de correio e todas as caixas de correio que você possui. Requer a permissão assistant:read.

Resposta 200

enabledboolean
shadow_enabledboolean
pausedboolean
mailbox_idsstring[]
agent_mailbox_idsstring[]Caixas operadas pelos seus agentes. Os itens delas aparecem na seção de agentes do Today em vez de em Needs you.
agentsobject[]Suas identidades de agente, para delegação.
search_opt_out_mailbox_idsstring[]Caixas de correio cujo e-mail é pesquisado apenas por palavras: suas mensagens nunca são enviadas para o modelo de embedding.
brief_opt_out_mailbox_idsstring[]Caixas de correio cujos resumos permanecem determinísticos: nenhum trecho de evidência é enviado ao modelo para o resumo e próxima ação (a análise de e-mails recebidos permanece inalterada)
history_window_daysinteger
privacy_routestring
attachment_visionboolean
community_signalsbooleanSeus relatórios de phishing contam para as impressões digitais da comunidade (um domínio, a forma de um assunto, nunca um texto ou um endereço) e as contagens da comunidade chegam aos seus sinais de confiança. Ativado por padrão; desativado mantém ambos locais.
pipeline_versionstring
consentobject
mailboxesobject[]

Resposta de exemplo

{
  "enabled": false,
  "shadow_enabled": true,
  "paused": false,
  "mailbox_ids": [
    "mbx_123"
  ],
  "history_window_days": 30,
  "privacy_route": "private_cloud",
  "attachment_vision": false,
  "pipeline_version": "communication-analysis.v1",
  "consent": {
    "required_version": "mailzero-personal-ai.v1",
    "accepted_version": "mailzero-personal-ai.v1",
    "accepted_at": "2026-09-02T09:12:00.000Z"
  },
  "mailboxes": [
    {
      "id": "mbx_123",
      "slug": "hello",
      "domain": "example.com",
      "name": "Hello",
      "kind": "api",
      "address": "hello@example.com"
    }
  ]
}
PUT/api/assistant/settings

Atualizar configurações do assistente Mailzero

Habilita, pausa, retoma ou delimita explicitamente o processamento do assistente. Enviar mailbox_ids: [] desabilita todas as caixas de correio e cancela uma importação de histórico em andamento. Retomar requer a versão de consentimento atual. O recebimento de e-mail permanece independente. Requer a permissão assistant:write.

Solicitar corpo

enabledbooleanMostrar Decisões do Today e gerar rascunhos sob demanda
shadow_enabledbooleanAnalisar e-mail sem exibir Decisões
pausedboolean
mailbox_idsstring[]IDs de caixas de correio próprias a processar; um array vazio desabilita tudo
agent_mailbox_idsstring[]Caixas operadas pelos seus agentes. Os itens delas aparecem na seção de agentes do Today em vez de em Needs you.
history_window_daysinteger
attachment_visionboolean

Resposta 200

okboolean
enabledboolean
shadow_enabledboolean
pausedboolean
mailbox_idsstring[]

Resposta de exemplo

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

Consentir e iniciar uma importação de histórico em segundo plano

Registra o consentimento explícito atual de IA, habilita o processamento em segundo plano nas caixas de correio selecionadas do usuário e cria uma importação de histórico recente retomável. O cliente pode fechar imediatamente e consultar GET /api/assistant/backfill. Requer a permissão assistant:write.

Solicitar corpo

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

Resposta 200

okboolean
previewobject

Resposta de exemplo

{
  "ok": true,
  "preview": {
    "mailbox_ids": [
      "mbx_123"
    ],
    "history_window_days": 30,
    "scanned": 0,
    "enqueued": 0,
    "capped": false,
    "background": true,
    "backfill_id": "bf_456"
  }
}
GET/api/assistant/backfill

Obter progresso da importação de histórico em segundo plano

Retorna a fase de varredura/análise, mensagens processadas e totais, porcentagem, ETA adaptativo, estado de pausa e se o aplicativo pode fechar. Requer a permissão assistant:read.

Resposta 200

backfillobject | null

Resposta de exemplo

{
  "backfill": {
    "id": "bf_456",
    "status": "processing",
    "phase": "analysis",
    "paused": false,
    "processed": 12,
    "total": 40,
    "failed": 0,
    "percent": 30,
    "estimated_seconds_remaining": 240,
    "estimated_completion_at": "2026-09-02T09:20:00.000Z",
    "can_close_app": true,
    "started_at": "2026-09-02T09:12:00.000Z",
    "completed_at": null
  }
}
POST/api/assistant/backfill

Tentar novamente mensagens com falha na importação de histórico

Reenfileira falhas terminais da importação mais recente para caixas de correio que permanecem habilitadas para IA. As tentativas automáticas já foram esgotadas antes de uma mensagem aparecer aqui. Requer a permissão assistant:write.

Resposta 200

okboolean
retriedinteger

Resposta de exemplo

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

Obter a fila de decisões fundamentadas do Today

Retorna as projeções versionadas Now, Needs you, Waiting, Upcoming e Handled recentes com as_of, lag, coverage e warnings. Cada item vincula à sua mensagem de origem; nada aqui envia e-mail. Requer a permissão assistant:read. O e-mail de autenticação (códigos de login, redefinições de senha, links mágicos) nunca vira um assunto e nunca chega a um modelo. Um assunto criado a partir de um e-mail de autenticação antes que esse e-mail fosse mantido fora do assistente é exibido com título, resumo, pedido e efeitos do plano retidos para um leitor sem email:auth_secrets.

Parâmetros

agentstringApenas a visão de um agente: os itens das caixas de correio que ele opera e os itens entregues a ele. Um token vinculado a uma identidade de agente sempre obtém a visão desse agente; nomear outro agente retorna 403 AGENT_SCOPE.
categorystringApenas um tipo de assunto (invoice, meeting_request, newsletter...); o campo categories da resposta lista cada tipo presente na visão com sua contagem. Um tipo desconhecido responde 400 INVALID_CATEGORY.
tagstringSomente os assuntos que carregam esta etiqueta (uma das etiquetas da pessoa); o campo tags da resposta lista cada etiqueta da visão com sua contagem.

Resposta 200

typestring
as_ofstring
projection_lag_msinteger
categorystring | nullO tipo de assunto ao qual a visão está restrita (o parâmetro category), ou null para todos os tipos.
categoriesobjectCada tipo de assunto presente na visão, antes do filtro, com quantos itens ele contém.
tagstring | nullA etiqueta à qual a visão está restrita (o parâmetro tag), ou null para todos os assuntos.
tagsobjectCada etiqueta da pessoa na visão, antes do filtro, com quantos assuntos a carregam.
sectionsobject

Resposta de exemplo

{
  "type": "today",
  "as_of": "2026-09-02T09:15:00.000Z",
  "projection_lag_ms": 4200,
  "category": null,
  "categories": {
    "partner_inquiry": 1
  },
  "tag": null,
  "tags": {
    "lumenworks": 1
  },
  "sections": {
    "now": [
      {
        "id": "wi_789",
        "version": 3,
        "status": "needs_judgment",
        "title": "Investor update",
        "summary": "Paul needs the August metrics before his 16:00 partner call.",
        "category": "partner_inquiry",
        "tags": [
          "lumenworks"
        ],
        "proposed_tags": [],
        "mailbox": {
          "id": "mbx_123",
          "address": "hello@example.com",
          "name": "Hello"
        },
        "source": {
          "type": "domani-postgres",
          "conversation_id": "conv_1",
          "event_id": "msg_1",
          "revision": 1
        },
        "attention": {
          "level": "now",
          "reason": "Deadline today from a known investor",
          "confidence": "high",
          "deadline": "2026-09-02T16:00:00.000Z"
        },
        "decision": {
          "id": "dec_1",
          "version": 1,
          "status": "open",
          "question": "How do you want to answer Paul?",
          "options": [
            {
              "id": "opt_send",
              "label": "Send current metrics",
              "recommended": true
            },
            {
              "id": "opt_tomorrow",
              "label": "Ask for tomorrow"
            }
          ]
        }
      }
    ],
    "needs_you": [],
    "waiting": [],
    "upcoming": [],
    "handled": []
  }
}
GET/api/assistant/work-items/{id}

Obter um item Work do assistente e o plano atual exato

Retorna o item Work fundamentado, sua Decision aberta e opções, o plano Action atual exato, compromissos e expectativas abertas, interações e recibos. Requer a permissão assistant:read. Um assunto criado a partir de um e-mail de autenticação antes que esse e-mail fosse mantido fora do assistente é exibido com título, resumo, pedido e efeitos do plano retidos para um leitor sem email:auth_secrets.

Parâmetros

id*stringID do item Work da fila Today

Resposta 200

idstring
versioninteger
statusstring
titlestring
summarystring
askstring | nullA única coisa que o proprietário precisa fazer ou decidir, ou null.
categorystring | nullO tipo de assunto que a análise encontrou (uma fatura, um pedido de reunião, uma newsletter...), ou null quando nenhuma análise o disse. As regras o reconhecem pelo rótulo category:<kind>.
tagsstring[]As etiquetas da pessoa no assunto (CT-01b): confirmadas uma vez ou definidas à mão, cada uma é um rótulo na conversa no provedor. As regras as reconhecem como o rótulo tag:<name>.
proposed_tagsstring[]As etiquetas que o motor propõe para o assunto (uma por projeto que nomeou), ainda não confirmadas. Confirme uma com a interação tag; ela então se aplica ao próximo assunto do mesmo projeto sem perguntar.
suspectbooleanOs sinais de confiança consideraram o remetente suspeito: o assunto fica na seção Suspeito, nunca é Now, não carrega decisão, e nenhum efeito é executado nele até que a pessoa o reporte como legítimo.
suspect_reasonsstring[]Por que parece suspeito, uma frase por sinal (uma autenticação falhou, um Reply-To divergente, um domínio parecido, um nome emprestado, um primeiro contato sobre dinheiro, uma instrução ao assistente, um segredo pedido por e-mail de retorno).
senderobject | null
recurrenceobjectQuantas vezes essa mesma situação voltou: um item, N mensagens.
mailboxobject
opened_atstring | null
delegated_tostring | nullO slug do agente a quem o proprietário confiou este item, ou null.
delegation_ruleobject | nullA delegação permanente que entregou este item, e por que correspondeu; suspensa assim que o proprietário retomou o item.
unreadbooleanVerdadeiro até que o proprietário abra o item após a última alteração.
messagesobject[]As mensagens de origem por trás deste item, da mais recente para a mais antiga.
historyobject[]O que já aconteceu neste assunto, do mais antigo para o mais recente: uma linha por mensagem anterior.
sourceobject
attentionobject
analysisobject
evidence_refsstring[]
entity_refsstring[]
snoozed_untilstring | null
decisionobject | null
planobject | null
GET/api/assistant/work-items/{id}/brief

Ler o resumo da situação de um item de Trabalho

Um documento que um agente lê antes de agir: a situação (status, atenção, recorrência, remetente), a história até agora (cada email dela, analisado ou não), os fatos que as análises estabeleceram (alegações com valor, base e validade, e as entidades), os compromissos e expectativas abertos com o que é aguardado de quem e desde quando, o que já foi resolvido (loops fechados e recibos), a Decisão atual com suas opções, um próximo passo sugerido (a opção recomendada da Decisão quando há uma, caso contrário uma regra: uma promessa atrasada, uma expectativa atrasada para cobrar, a solicitação do remetente para responder), e as mensagens de evidência. Determinístico e barato: nenhuma chamada de modelo. Tokens de agente leem os itens das caixas de correio que operam e os itens entregues a eles.

Parâmetros

id*stringID do item de Work
synthesisbooleanDefina como false para pular a leitura do modelo (resumo, próxima ação concreta, perguntas abertas) e ler apenas o brief determinístico; a leitura é armazenada em cache por estado das evidências

Resposta 200

idstring
versioninteger
generated_atstring (date-time)
titlestring
summarystring
askstring | null
mailboxobject
delegated_tostring | null
situationobject
storyobject[]Cada email da situação, do mais antigo ao mais recente, com o título de uma linha que a análise atribuiu
factsobject[]
entitiesobject[]
commitmentsobject[]Promessas abertas feitas pelo lado do proprietário
expectationsobject[]Coisas abertas aguardadas de outros
settledobject[]Loops fechados e recibos, do mais recente ao mais antigo
awaitingobject[]
decisionobject | nullA Decisão preparada atual com suas opções
summary_sourcestringSe o resumo é a leitura do modelo sobre as evidências ou a própria frase do pipeline
suggested_nextobject | null
open_questionsstring[]O que apenas o proprietário pode decidir antes da próxima ação, no máximo três perguntas
synthesisobject | nullA chamada do modelo que escreveu o resumo e a próxima ação, null quando o brief é apenas determinístico
evidenceobject[]
owner_repliesobject[]
evidence_refsstring[]
GET/api/assistant/brief

Ler o resumo da situação para um correspondente

O que saber antes de responder a uma pessoa: o resumo do item de Trabalho ativo mais recente dela nas caixas de correio que você pode ler (ou uma caixa de correio), os outros itens pelos quais ela está responsável, e seus últimos dez emails. brief é null quando nada foi analisado dela ainda.

Parâmetros

correspondent*stringO endereço de email da pessoa
mailboxstringRestringir a um endereço de caixa de correio (slug@domain)

Resposta 200

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

Leia os fatos por trás de um item de Work

As afirmações e entidades mescladas de cada análise do item (mais recente primeiro vence), mais seus compromissos e expectativas armazenados com seu status. Tokens de agente leem os itens das caixas de entrada que operam e os itens entregues a eles.

Parâmetros

id*stringID do item de Work

Resposta 200

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

Marcar um item Work como aberto

Registra que o proprietário abriu este item Work na versão atual, o que remove o marcador de não lido até que o item mude novamente. Requer o escopo assistant:write.

Parâmetros

id*string

Resposta 200

okboolean
opened_atstring
unreadboolean
GET/api/assistant/learned

O que o assistente aprendeu sobre você

As regras de silêncio que o assistente propõe depois que o mesmo remetente ou organização foi ignorado toda vez que voltou, os silêncios em vigor (um remetente, um domínio ou uma situação que o assistente mantém fora de Hoje), cada um com o seu motivo, e as etiquetas confirmadas uma vez, cada uma aplicada ao próximo assunto do mesmo projeto sem perguntar. Aceite uma regra de silêncio pelo endpoint suggestions; esqueça um silêncio com o endpoint mutes, uma etiqueta com o endpoint tags.

Resposta 200

mutesobject[]Os silenciamentos em vigor, mais recentes primeiro.
suggestionsAssistantSuggestion[]As regras silenciosas abertas: aceite uma através do endpoint de sugestões para definir o silenciamento que ela carrega.
tagsobject[]As etiquetas confirmadas uma vez (CT-01b), as mais recentes primeiro: cada uma se aplica ao próximo assunto do mesmo projeto sem perguntar até ser esquecida.
DELETE/api/assistant/learned/mutes

Esquecer um silenciamento

O próximo email daquele remetente, domínio ou situação se torna um item novamente.

Solicitar corpo

kind*string(sender | sender_domain | situation)
value*stringO endereço, o domínio ou a chave de situação, como a visualização aprendida lista.

Resposta 200

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

Esquecer uma etiqueta

Nada mais é aplicado sem perguntar: o próximo assunto desse projeto propõe a etiqueta de novo. Os assuntos que a carregam a mantêm.

Solicitar corpo

name*stringA etiqueta, como a visão learned a lista.

Resposta 200

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

Investigue um assunto: o que o registro e os links dizem

Lê, naquele instante, os fatos que a infraestrutura pública mantém sobre o domínio do remetente (sua data de registro e registrador, sua postura SPF e DMARC, se recebe email), para onde cada link da mensagem de origem realmente vai (os redirecionamentos seguidos um salto por vez, o host final e os fatos do seu domínio), e o que cada anexo realmente é (seus primeiros bytes em comparação com o nome e o tipo declarado). Responde o dossiê com os sinais que os fatos adicionam (um domínio registrado dias atrás, um link que chega em outro lugar, um domínio do remetente que não protege nada, um programa nomeado como um documento). Sem fornecedor, sem conta, nada armazenado; uma consulta que falha é um fato por si só.

Parâmetros

id*string

Resposta 200

work_item_idstring
sourcestringSe a mensagem de origem foi lida, ou apenas o endereço do remetente.
checked_atstring
senderobject
linksobject[]
attachmentsobject[]O que cada anexo realmente é, lido de seus primeiros bytes em comparação com o que seu nome e tipo declarado prometem.
signalsobject[]O que os fatos adicionam à avaliação, uma frase cada.
GET/api/assistant/work-items/{id}/sender

Quem está por trás de um assunto: a organização, as pessoas envolvidas, o histórico

Responde a ficha do remetente de um assunto: a organização do remetente como o perfil de domínio armazenado a conhece (nome, razão social, categoria, site, data de registro, postura de email; null para um domínio de email compartilhado como gmail.com ou um domínio nunca analisado, e nunca uma análise ao vivo), as pessoas que as mensagens da história carregam em from, to e cc com seus papéis e se pertencem à mesma organização (as próprias caixas do leitor excluídas), e a relação: quanto email veio deste endereço nas caixas do leitor (contado até 50), quando pela primeira e última vez, os outros assuntos do remetente e os assuntos levantados por colegas do mesmo domínio. Requer o scope assistant:read.

Parâmetros

id*string

Resposta 200

work_item_idstring
senderobject | null
organisationobject | nullNull para um domínio de email compartilhado ou um domínio nunca analisado.
participantsobject[]
relationshipobject
generated_atstring (date-time)
POST/api/assistant/work-items/{id}/interactions

Registrar uma Decision humana isolada

Escolha uma opção, dê uma instrução, assuma o controle, adie, ignore, corrija, reporte o veredito de confiança (phishing ou legítimo), ou aprove ou rejeite um plano em espera (um plano aprovado executa imediatamente, com seus recibos na resposta). A chamada é isolada por work_item_version e repetida de forma idempotente por idempotency_key. Escolher ou instruir prepara um rascunho exato que ainda passa pelo fluxo normal de resposta; este endpoint nunca envia e-mail. Requer a permissão assistant:write.

Parâmetros

id*string

Solicitar corpo

scopestring(item | sender | sender_domain | situation)Com tipo ignore: também silenciar o remetente, seu domínio ou esta situação recorrente para que nunca volte.
verdictstring(phishing | legitimate)Com type report: o veredito da pessoa sobre os sinais de confiança. Phishing fecha o assunto, silencia o remetente e fecha seus outros assuntos ativos; legitimate limpa o veredito suspeito e suas razões.
plan_idstringCom type approve ou reject: o plano de ação em espera (proposto ou escalado).
reasonstringCom type reject: o motivo, mantido no plano.
type*string(choose | instruct | take_over | snooze | ignore | correct | delegate | approve | reject | report | tag)
addstring[]Com type tag: etiquetas para colocar no assunto (uma proposta confirmada, ou uma à mão; minúsculas, letras, dígitos e hifens). Uma etiqueta adicionada uma vez é aprendida: o próximo assunto do mesmo projeto a recebe sem perguntar.
removestring[]Com type tag: etiquetas para tirar do assunto (uma proposta nomeada aqui é recusada). A página learned esquece uma etiqueta de vez.
agent_slugstring | nullCom o tipo delegate: o slug do seu agente a quem confiar o item, ou null para retomá-lo.
member_idstring | nullCom type delegate: o id de usuário de um membro do seu workspace para delegar o item em vez de um agente; ele o encontra em handed_to_you no Today e o trabalha através dos endpoints de tarefas sob seu próprio acesso.
work_item_version*integer
decision_idstring
decision_versioninteger
option_idstring
instructionstring
untilstring (date-time)
remind_atstring (date-time)
fieldstring
correctionstring
idempotency_key*string

Resposta 200

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

Obter a visualização exata da ação por ID opaco

Retorna a identidade de resposta exata, destinatários, corpo, compromissos e efeitos colaterais de um plano de ação preparado, além de sua expiração e revisão de origem, para que um cliente possa mostrar o que acontecerá antes que o usuário envie através do endpoint de resposta existente com assistant_plan_id. Requer o scope assistant:read.

Parâmetros

id*stringID do plano de ação opaco

Resposta 200

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

Obter atividade do assistente com conteúdo minimizado

Lista as interações e recibos recentes atribuídos ao chamador sem os corpos das mensagens. Requer o scope assistant:read.

Parâmetros

limitinteger

Resposta 200

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

Exportar dados derivados do assistente

Exporta análises, reivindicações aceitas, decisões, interações, recibos e uso do modelo como um anexo JSON. Nunca inclui os corpos de e-mail de origem ou bytes de anexos. Requer o scope assistant:write. Também requer email:auth_secrets (caso contrário, 403 INSUFFICIENT_SCOPE): o estado derivado pode conter o que o assistente extraiu de e-mails de autenticação antes que esses e-mails fossem mantidos fora dele.

Resposta 200

formatstring
exported_atstring
notestring
DELETE/api/assistant/data

Excluir dados derivados do assistente

Exclui de forma idempotente inteligência derivada, trabalhos, uso do modelo, dispositivos, importações e configurações enquanto preserva o e-mail de origem. Requer a permissão assistant:write.

Resposta 200

okboolean
deletedobject
source_mail_deletedboolean

Resposta de exemplo

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

Registrar um dispositivo para alertas Now ocultados

Registra ou rotaciona um token push criptografado para uma instalação de aplicativo e ambiente. Apenas o aplicativo nativo chama isso; requer um assistente ativo e a permissão assistant:write.

Solicitar corpo

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

Resposta 200

okboolean
deviceobject
DELETE/api/assistant/devices

Revogar um registro de dispositivo

Revoga todos os registros push de uma instalação, por exemplo ao sair. Requer a permissão assistant:write.

Parâmetros

installation_id*string

Resposta 200

okboolean

E-mail

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

Verifique a integridade do DNS do e-mail (MX, SPF, DMARC, DKIM)

Verifica a configuração DNS de email para um domínio: registros MX, SPF, DMARC e DKIM. Detecta automaticamente o provedor de e-mail dos registros MX (Google Workspace, Proton, Fastmail).

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
providerstring | nullProvedor de e-mail detectado automaticamente (google-workspace, proton, fastmail) ou null
mxobject
spfobject
dmarcobject
dkimobject

Resposta de exemplo

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

Exemplo

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

Obtenha a integridade da entregabilidade de e-mail no escopo do proprietário

Separa a prontidão de autenticação determinística, resultados de entrega ponderados pelo destinatário em 30 dias, estado de segurança da conta e posicionamento medido do fornecedor. A pontuação de prontidão não é uma probabilidade da Caixa de entrada e o posicionamento não medido é retornado como not_tested.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
statusstring
confidencestring
checked_atstring (date-time)
window_daysinteger
readinessobjectProntidão determinística de configuração de DNS. A pontuação não é uma probabilidade da caixa de entrada.
sending_healthobject
placementobject
actionsobject[]
caveatsstring[]

Exemplo

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

Configurar e-mail em um domínio

Pré-configure o DNS de e-mail em um domínio (opcional). Isso é chamado automaticamente por create_mailbox quando necessário. Passe force=true para substituir o provedor de e-mail existente (Google Workspace, Fastmail, Proton).

Parâmetros

domain*stringNome de domínio

Solicitar corpo

forcebooleanSubstitua o provedor de e-mail existente (Google Workspace, Fastmail, Proton). Padrão: falso

Resposta 200

domainstring
statusstring
verified_atstring | null
receiving_verifiedbooleanVerdadeiro quando o MX do domínio aponta para o receptor da plataforma, de modo que o e-mail dos seus endereços é aceito.
sending_configuredboolean
sending_verifiedboolean
recordsDnsRecord[]
hintstring
DELETE/api/domains/{domain}/email/setup

Remover e-mail de um domínio

Remova o email de um domínio, exclua todas as caixas de correio e mensagens e defina emailEnabled como falso. Altera o e-mail do domínio inteiro, portanto um token confinado a caixas de correio recebe 403 MAILBOX_CONFINED.

Parâmetros

domain*stringNome de domínio
GET/api/domains/{domain}/email/status

Verifique o status do DNS do e-mail

Verifique o status de verificação de DNS do email para um domínio. Retorna se o domínio está verificado e pronto, detalhes do registro DNS e contagem de caixas de correio.

Parâmetros

domain*stringNome de domínio

Resposta 200

domainstring
enabledboolean
verifiedbooleanVerdadeiro somente quando o recebimento e o envio de saída são verificados
receiving_verifiedbooleanVerdadeiro quando o MX do domínio aponta para o receptor da plataforma, de modo que o e-mail dos seus endereços é aceito.
sending_configuredboolean
sending_verifiedboolean
recordsDnsRecord[]
mailbox_countinteger
dns_managedbooleanVerdadeiro quando a Domani escreve a zona do domínio por conta própria: os registros pendentes são publicados e reparados por uma auditoria a cada hora, sem nada a adicionar manualmente. Falso para uma zona externa, onde os registros pendentes devem ser adicionados no provedor de DNS.
unreachable_addressesstring[]Endereços do domínio que o seu MX de recebimento recusa (caixas api em um domínio hospedado ainda não registradas no host de e-mail). Vazio quando todos os endereços podem receber; o registro é repetido automaticamente.
provider_statusstring
mailbox_plan_keystringA chave do plano do espaço de trabalho que rege aqui as caixas de correio com domínio próprio (a assinatura do próprio espaço de trabalho, não necessariamente o plano pessoal do usuário conectado).
mailbox_limitinteger | nullCaixas de correio com domínio próprio que o plano permite em todo o espaço de trabalho. null significa ilimitado.
mailbox_limit_reachedbooleanVerdadeiro quando o espaço de trabalho atinge o limite de caixas de correio do plano: outra caixa neste domínio exige um upgrade antes.
mailbox_upgrade_planobject | nullO plano mais barato que daria espaço para outra caixa de correio. null quando já é ilimitado.
hintstring
POST/api/email

Crie uma caixa de correio em domani.run

Crie um endereço de e-mail gratuito em domani.run (por exemplo, hello@domani.run). Não é necessária propriedade de domínio. Limitado a 1 caixa de correio @domani.run gratuita por usuário. Muitas lesmas comuns são reservadas.

Solicitar corpo

slug*stringParte local do endereço de e-mail (por exemplo, 'hello' para hello@domani.run)
namestringNome de exibição (o padrão é slug maiúsculo)

Resposta 201

idstring
addressstring
namestring | null
slugstring
domainstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
collaboration_enabledboolean
sharedbooleanIndica se pelo menos uma pessoa além do solicitante pode ler esta caixa de correio
message_countinteger
webhook_urlstring | null
header_namesstring[]Nomes de cabeçalho de autenticação de webhook configurados; valores nunca são retornados
forward_tostring | null
signing_secretstring | null
created_atstring (date-time)
hintstring
GET/api/email

Listar todas as caixas de correio

Liste todas as caixas de correio que o identidade solicitante pode acessar em todos os domínios, incluindo permissões de espaço de trabalho.

Parâmetros

domainstringFiltrar por domínio

Resposta 200

mailboxesobject[]
POST/api/emails

Crie uma caixa de correio

Crie um endereço de e-mail (caixa de correio). Forneça um endereço completo como "hello@mysite.com". O Email DNS é configurado automaticamente na primeira utilização. Passe force=true para substituir um provedor de e-mail existente. A capacidade da caixa de correio de domínio personalizado é determinada pela conta ativa ou plano de espaço de trabalho. Cada conta pode criar uma caixa de correio gratuita @domani.run separadamente com POST /api/email. Passe workspace_id para criar a caixa de correio dentro de um espaço de trabalho de sua propriedade. Para um domínio personalizado, isso adota explícita e atomicamente o domínio e todas as suas caixas de correio irmãs sem escopo nesse espaço de trabalho; um domínio nunca pode ser dividido entre espaços de trabalho. Passe kind="hosted" para criar uma caixa de correio IMAP/SMTP real em seu próprio domínio (conecte Apple Mail, Thunderbird ou qualquer cliente) em vez da caixa de correio API padrão (enviar/receber via API + webhooks). As caixas de correio hospedadas retornam registros DNS para publicação, configurações do cliente de email e uma senha de aplicativo única. Requer um domínio que você possui.

Solicitar corpo

address*stringEndereço de e-mail completo, por ex. hello@mysite.com
namestringNome de exibição para e-mails enviados (por exemplo, "John Doe")
forcebooleanSubstitua os registros MX existentes. Padrão: falso
kindstring(api | hosted)"api" (padrão: enviar/receber via API + webhooks) ou "hosted" (caixa de correio IMAP/SMTP real em seu domínio)
workspace_idstringEspaço de trabalho para possuir a caixa de correio. Somente o proprietário do workspace pode adotar recursos.

Resposta 201

idstring
addressstring
namestring | null
domainstring
slugstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
collaboration_enabledboolean
sharedbooleanIndica se pelo menos uma pessoa além do solicitante pode ler esta caixa de correio
message_countinteger
webhook_urlstring | null
header_namesstring[]Nomes de cabeçalho de autenticação de webhook configurados; valores nunca são retornados
forward_tostring | null
signing_secretstring | nullSegredo HMAC para verificar cargas úteis de webhook de entrada (mostrado uma vez na criação)
host_idstringID principal do host de email para uma caixa de correio hospedada
dns_recordsDnsRecord[]
dns_statusstring
receiving_statusstring
sending_statusstring
sending_errorobject
client_settingsobject
credentialobject
storage_quota_bytesinteger
created_atstring (date-time)
hintstring
GET/api/emails

Listar todas as caixas de correio

Liste todas as caixas de correio que o identidade solicitante pode acessar, incluindo permissões de espaço de trabalho. O mesmo que GET /api/email.

Parâmetros

domainstringFiltrar por domínio

Resposta 200

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

Obtenha detalhes da caixa de correio

Obtenha detalhes de uma caixa de correio específica por meio de seu endereço de e-mail completo (codificado em URL, por exemplo, hello%40mysite.com).

Parâmetros

address*stringEndereço de e-mail completo (codificado em URL, por exemplo, hello%40mysite.com)

Resposta 200

idstring
addressstring
slugstring
domainstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
webhook_urlstring | null
forward_tostring | null
signing_secretstring | nullSegredo HMAC para gestores; nulo para visualizadores/respondentes
message_countinteger
storage_quota_bytesinteger | null
storage_used_bytesinteger | null
storage_measured_atstring (date-time) | null
created_atstring (date-time)
PATCH/api/emails/{address}

Atualizar caixa de correio

Atualize o nome de exibição, o URL do webhook ou o endereço de email de encaminhamento de uma caixa de correio pelo endereço de email completo. Defina como nulo para desabilitar/limpar.

Parâmetros

address*stringEndereço de e-mail completo (codificado em URL)

Solicitar corpo

namestring | nullNome de exibição da caixa de correio. Defina como nulo para limpar.
webhook_urlstring | nullURL HTTPS para webhook de e-mail de entrada ou nulo para limpar
forward_tostring | nullEndereço de e-mail para encaminhar e-mails recebidos ou nulo para limpar
drop_spambooleanDescartar (não armazenar ou webhook) mensagens de entrada sinalizadas como spam
tone_notesstring | nullDicas de voz que os agentes leem antes de escrever a partir desta caixa de correio (tom, assinatura, o que fazer e o que evitar no fraseado). Defina como nulo para limpar.

Resposta 200

idstring
addressstring
slugstring
domainstring
namestring | null
webhook_urlstring | null
forward_tostring | null
tone_notesstring | null
signing_secretstringSegredo HMAC para verificar cargas úteis de webhook de entrada
DELETE/api/emails/{address}

Excluir uma caixa de correio

Exclua uma caixa de correio pelo endereço de e-mail completo. Requer confirm=true no corpo. Sem confirmação, retorna uma visualização com message_count.

Parâmetros

address*stringEndereço de e-mail completo (codificado em URL)

Solicitar corpo

confirmbooleanDeve ser verdadeiro para realmente excluir. Omitir a visualização.
POST/api/emails/{address}/send

Envie um e-mail

Envie um e-mail de uma caixa identificada pelo endereço completo. O servidor executa primeiro uma política obrigatória e versionada: nega falhas objetivas de segurança e retorna como avisos os problemas de reputação e qualidade do conteúdo. Para uma resposta colaborativa em thread, passe o lease de composição, o reply_version observado e uma chave de idempotência estável; o servidor rejeita atomicamente respostas obsoletas ou duplicadas imediatamente antes do envio. Máximo de 20 destinatários únicos por mensagem. Limite: 100 destinatários por hora por caixa.

Parâmetros

address*stringEndereço de e-mail do remetente (codificado em URL)

Solicitar corpo

to*anyEndereço(s) de e-mail do destinatário
ccanyDestinatário(s) do CC
bccanyDestinatário(s) CCO
subjectstring
textstringCorpo de texto simples
htmlstringCorpo HTML
reply_tostringEndereço para resposta
in_reply_tostringID da mensagem do e-mail que está sendo respondido (para encadeamento)
referencesstringCadeia de ID de mensagem separada por espaço (para encadeamento)
idempotency_keystringChave estável que evita envios duplicados
send_atstring (date-time)Agende o envio (ISO 8601, de 30 segundos a 30 dias à frente). A mensagem é armazenada com o status 'scheduled' e despachada no lado do servidor; mova-a para a lixeira antes disso para cancelar. Anexos ainda não são suportados com send_at.
coordinationobjectNecessário para uma resposta colaborativa protegida.
allow_risky_contentbooleanCampo de compatibilidade obsoleto. Links públicos de autenticação HTTPS de terceiros são permitidos com um aviso; bloqueios de segurança objetivos não podem ser substituídos.
attachmentsobject[]Anexos de arquivo (máximo de 10, máximo de 40 MB no total). O conteúdo deve ser codificado em base64.

Resposta 200

idstring
message_idstringID da mensagem RFC 5322
fromstring
tostring
bccstring | nullDestinatário(s) Bcc para quem você enviou, retornados apenas na sua própria mensagem de saída; nunca entregues como cabeçalho e nunca presentes em uma mensagem recebida.
statusstring
attachments_countinteger
suppressedstring[]
deliverabilityobjectRelatório de política versionado aplicado a este envio; inspecionar decisões e verificações categorizadas
POST/api/emails/{address}/deliverability-check

Simular um e-mail de saída

Execute a política do lado do servidor com versão exata usada pelo endpoint de envio sem enviar ou consumir cota de email. Links públicos de autenticação HTTPS em domínios de terceiros são permitidos com um aviso de reputação. URLs locais/privados, links de autenticação não HTTPS e anexos executáveis ​​são bloqueados; corpos acima de 102 KB produzem um aviso de recorte.

Parâmetros

address*stringEndereço de e-mail do remetente (codificado em URL)

Solicitar corpo

subjectstring
textstring
htmlstring
idempotency_keystring
allow_risky_contentbooleanCampo de compatibilidade obsoleto; bloqueios de segurança objetivos não podem ser substituídos.
attachmentsobject[]

Resposta 200

policy_versionstring
decisionstring
safe_to_sendbooleanBooleano compatível com versões anteriores equivalente a decisão! = negar
riskstring
scoreinteger
authentication_messageboolean
checksobject[]
blocked_reasonsstring[]
warningsstring[]
override_usedboolean
GET/api/emails/{address}/messages

Listar e-mails

Liste e-mails em uma pasta canônica ou visualização virtual. O padrão é Caixa de entrada. A localização da pasta é independente da direção da mensagem e do veredicto de spam. O e-mail de autenticação (OTPs/códigos de verificação, redefinições de senha, links mágicos) é marcado como security: "auth". Tokens sem o escopo email:auth_secrets veem aquelas mensagens com assunto e corpo OCULTOS (redacted: true) - os metadados (de, data) permanecem visíveis. Os filtros subject, q e attachments correspondem ao que quem chama pode ler: sem o escopo, essa mensagem só corresponde pelo assunto e pelo corpo ocultos, então uma busca pelo código que ela contém não encontra nada.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
cursorstringCursor de paginação da resposta anterior
limitintegerMáximo de mensagens a serem retornadas
directionstring(in | out | all)Filtrar por direção (padrão: todos)
folderstring(inbox | archive | sent | spam | trash)Pasta do sistema. Mutuamente exclusivo com vista. O padrão é caixa de entrada.
labelstringRótulos separados por vírgula: apenas mensagens que possuem qualquer um deles
viewstring(starred | all | needs_human | scheduled)Visualização virtual. Mutuamente exclusivo com pasta.
sincestringTimestamp ISO - retorna apenas mensagens criadas após esta data
untilstringTimestamp ISO - retorna apenas mensagens criadas antes desta data
fromstringFiltrar por endereço do remetente
tostringFiltrar por endereço de destinatário
subjectstringFiltrar por assunto
qstringPesquisa ampla, sem distinção entre maiúsculas e minúsculas, entre remetente, destinatários, assunto e corpo de texto simples
unreadbooleanRetornar apenas mensagens não lidas
attachmentsbooleanRetornar mensagens que contenham apenas anexos
spambooleanFiltrar por sinalizador de spam (passar falso para ocultar a entrada sinalizada como spam)

Resposta 200

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

Buscar emails por significado e por palavras

Busca nas caixas de entrada que você pode ler, ou em uma caixa de entrada com mailbox. Híbrido por padrão: o embedding da mensagem (pgvector, cosseno) e o índice de palavras ponderadas são fundidos por rank recíproco com um pequeno impulso de recência, em uma única instrução; why indica qual ramo correspondeu. Operadores do Gmail em q: from: to: cc: subject: label: filename: mailbox: is:unread|read|starred|unstarred has:attachment in:inbox|archive|sent|spam|trash|anywhere after:2026/08/01 before: newer_than:7d older_than:2w (h/d/w/m/y), "a phrase", -word ou -from: para excluir, a OR b. Uma consulta feita apenas de operadores lista as mensagens correspondentes da mais recente para a mais antiga (why: filter). Códigos e links de login, spam e emails do sistema nunca são indexados; caixas de entrada listadas em search_opt_out_mailbox_ids do assistente são buscadas apenas por palavras. Um token vinculado a uma identidade de agente busca apenas as caixas de entrada que seu agente opera. Requer email:read. Sem email:auth_secrets, o e-mail de autenticação recebido é deixado de fora antes da classificação: nenhuma palavra, operador ou filtro corresponde a ele, então uma busca por um código de login não encontra nada.

Parâmetros

mailboxstringRestringir a um endereço de caixa de entrada (slug@domain).
q*stringO que você está procurando, em qualquer idioma: um nome, uma referência ou uma descrição do email, mais operadores do Gmail (`from:dave is:unread newer_than:7d -invoice "exact phrase"`).
modestring(hybrid | semantic | keyword)hybrid funde o embedding e as palavras por rank; semantic usa apenas o significado; keyword apenas as palavras.
limitintegerResultados a retornar.
sincestringApenas emails recebidos após este timestamp ISO.
untilstringApenas emails recebidos antes deste timestamp ISO.
folderstring(inbox | archive | sent | spam | trash | anywhere)Uma pasta. Lixeira é excluída a menos que seja nomeada ou com `anywhere`.
fromstringEndereço do remetente contém.
labelstringRótulos separados por vírgula: apenas mensagens que possuem qualquer um deles

Resposta 200

resultsobject[]
modestring
querystring
took_msinteger
hintstring

Exemplo

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

Iniciar conexão de uma caixa de entrada do Gmail

Retorna a URL de consentimento do Google vinculada à sua conta e ao limite de importação. Abra-a em um navegador; após o consentimento, a caixa de entrada se torna uma caixa de correio conectada em seu próprio endereço, os emails recebidos após o limite são importados (padrão: as últimas 24 horas), e novos emails seguem conforme chegam. Nunca a caixa de entrada inteira: amplie depois com POST /api/emails/{address}/import. Requer email:write. O OAuth do Google deve estar configurado no servidor.

Solicitar corpo

accessstring(read | write)read (o padrão) lê a caixa de entrada; write também permite que a plataforma altere rótulos e o estado de leitura e envie como a pessoa, para os efeitos de uma delegação permanente. Reconecte com write para ampliar uma permissão somente leitura.
sincestring (date-time)Importar os emails recebidos após este instante
windowstring(24h | 7d | 30d | 1y)Uma predefinição em vez de since; padrão 24h
workspace_idstringWorkspace ao qual a caixa de correio pertence; seu workspace pessoal por padrão
login_hintstringA conta do Google a pré-selecionar
return_tostringCaminho do app para enviar o navegador após o consentimento

Resposta 200

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

Comece a conectar uma caixa de entrada do Outlook

Retorna a URL de consentimento da Microsoft vinculada à sua conta e ao limite de importação. Abra-a em um navegador; após o consentimento, a caixa de entrada se torna uma caixa de correio conectada em seu próprio endereço, o email recebido após o limite é importado (padrão: as últimas 24 horas), e novos emails chegam conforme são recebidos. Nunca a caixa de entrada inteira: amplie depois com POST /api/emails/{address}/import. Requer email:write. O OAuth da Microsoft deve estar configurado no servidor.

Solicitar corpo

accessstring(read | write)read (o padrão) lê a caixa de entrada; write também permite que a plataforma altere rótulos e o estado de leitura e envie como a pessoa, para os efeitos de uma delegação permanente. Reconecte com write para ampliar uma permissão somente leitura.
sincestring (date-time)Importar os emails recebidos após este instante
windowstring(24h | 7d | 30d | 1y)Uma predefinição em vez de since; padrão 24h
workspace_idstringWorkspace ao qual a caixa de correio pertence; seu workspace pessoal por padrão
login_hintstringA conta da Microsoft a ser pré-selecionada
return_tostringCaminho do app para enviar o navegador após o consentimento

Resposta 200

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

Lista as formas como uma caixa de entrada pode ser conectada

Uma linha por provedor (Gmail, Outlook, qualquer caixa de entrada por encaminhamento, um endereço hospedado aqui): como a conexão começa (uma tela de consentimento, uma regra de encaminhamento, um endereço criado), o que a conexão pode fazer (ler, ou ler e escrever), se importa emails mais antigos, e se este servidor está configurado para isso. Mostre um botão de conectar apenas quando configured for true; reason nomeia a variável ausente para o operador. Requer email:read.

Resposta 200

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

Conectar uma caixa de entrada por encaminhamento

Cria uma caixa de correio conectada no próprio endereço da caixa de entrada e responde com um endereço de encaminhamento no domínio de encaminhamento da plataforma, com os passos para Gmail, Outlook e outros provedores. Adicione uma regra de encaminhamento no provedor; o que chega naquele endereço é desembrulhado (remetente original, data, assunto) e armazenado sob a caixa de correio conectada. O Gmail pede ao endereço de encaminhamento para confirmar: o código e o link aparecem na conexão. O primeiro email que volta, ou uma sonda (POST /api/emails/{address}/connector/verify), torna a conexão ativa. Apenas emails novos chegam desta forma; emails mais antigos não podem ser importados. Requer email:write. O domínio de encaminhamento deve estar configurado no servidor.

Solicitar corpo

address*stringA caixa de entrada a conectar, por exemplo someone@gmail.com
workspace_idstringWorkspace ao qual a caixa de correio pertence; seu workspace pessoal por padrão

Resposta 200

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

Enviar uma sonda através da regra de encaminhamento

Envia um email para a caixa de entrada conectada; quando a regra de encaminhamento o traz de volta ao endereço de encaminhamento, a conexão se torna ativa. Apenas para uma conexão por encaminhamento. Requer email:write.

Parâmetros

address*stringO endereço conectado, por exemplo someone@gmail.com

Resposta 200

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

Ler a conexão de uma caixa de correio conectada

Tipo, status, o limite de importação, a fase de sincronização (a varredura de importação, depois histórico), o progresso da importação (verificados, copiados, a analisar, analisados), a última sincronização e o último erro. Requer email:read. A confirmação de encaminhamento (o código e o link do Gmail) é e-mail de autenticação: sem email:auth_secrets, o código e a url dela são null e ela traz redacted: true. Um token confinado a caixas de correio só encontra as próprias caixas de correio (caso contrário, 404).

Parâmetros

address*stringO endereço conectado, por exemplo someone@gmail.com

Resposta 200

addressstring
mailbox_idstring
kindstring
statusstring
import_sincestring (date-time) | nullO limite da primeira importação: nenhum email recebido antes dele é copiado
phasestringlista enquanto a varredura de importação percorre os emails após o limite, histórico uma vez que novos emails seguem o histórico da fonte
paused_reasonstring | null
import_runobject | nullA execução de importação atual ou última desta caixa de correio
source_messages_totalinteger | nullO que a origem reporta para toda a caixa de entrada, para escala
last_sync_atstring (date-time) | null
last_errorstring | null
backoff_untilstring (date-time) | null
verified_atstring (date-time) | null
connected_atstring (date-time)
cost_cap_usdnumberO gasto de modelo permitido por execução de importação, em USD
accessstring | nullPara uma conexão Gmail: o que a permissão permite; write significa rótulos em ambas as direções e envio como a pessoa
forwardingobject | nullPara uma conexão por encaminhamento: o endereço de encaminhamento, o que chegou, a confirmação do Gmail, a sonda, os passos
DELETE/api/emails/{address}/connector

Desconectar uma caixa de correio conectada

Remove as próprias cópias da pessoa (mensagens, anexos, linhas de busca, trabalhos pendentes) e a credencial; mantém a linha da caixa de correio, o link marcado como desconectado, e o que os agentes fizeram (recibos). Apenas uma caixa de correio conectada pode ser desconectada. Requer email:write.

Parâmetros

address*string

Resposta 200

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

Importar emails mais antigos de uma caixa de correio conectada

Amplia a importação para uma data anterior: uma nova execução de importação copia os emails entre o novo limite e o atual, em ordem de chegada, sob seu próprio limite de custo. Recusado enquanto uma varredura de importação ainda está em execução. Requer email:write.

Parâmetros

address*string

Solicitar corpo

since*string (date-time)O novo limite, anterior ao atual

Resposta 200

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

Buscar em uma caixa de entrada por significado e por palavras

A mesma busca que GET /api/emails/search, restrita a esta caixa de entrada. Requer email:read. Sem email:auth_secrets, o e-mail de autenticação recebido é deixado de fora antes da classificação: nenhuma palavra, operador ou filtro corresponde a ele, então uma busca por um código de login não encontra nada.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
q*stringO que você está procurando, em qualquer idioma: um nome, uma referência ou uma descrição do email, mais operadores do Gmail (`from:dave is:unread newer_than:7d -invoice "exact phrase"`).
modestring(hybrid | semantic | keyword)hybrid funde o embedding e as palavras por rank; semantic usa apenas o significado; keyword apenas as palavras.
limitintegerResultados a retornar.
sincestringApenas emails recebidos após este timestamp ISO.
untilstringApenas emails recebidos antes deste timestamp ISO.
folderstring(inbox | archive | sent | spam | trash | anywhere)Uma pasta. Lixeira é excluída a menos que seja nomeada ou com `anywhere`.
fromstringEndereço do remetente contém.
labelstringRótulos separados por vírgula: apenas mensagens que possuem qualquer um deles

Resposta 200

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

Listar as conversas de uma caixa de correio

Mensagens agrupadas da forma que clientes de email as agrupam: uma resposta se junta à thread da mensagem que ela responde (In-Reply-To, depois a cadeia References), email sem cabeçalhos utilizáveis se junta à thread mais recente com o mesmo assunto e um correspondente em comum dentro de trinta dias, todo o resto inicia uma thread cujo id é o id de sua primeira mensagem. Threads são ordenadas por última atividade; lixeira e spam nunca participam a menos que nomeados como a pasta. folder=inbox|archive|sent mantém as threads que têm uma mensagem lá mas ainda conta a conversa inteira.

Parâmetros

address*string
folderstring(all | inbox | archive | sent | spam | trash)
sincestringApenas threads com atividade após este horário
limitinteger
cursorstringnext_cursor da página anterior
labelstringRótulos separados por vírgula: apenas threads com uma mensagem que possui qualquer um deles

Resposta 200

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

Ler uma conversa, mensagem mais antiga primeiro

Todas as mensagens da thread (lixeira incluída, para que nada falte da história) com seu texto, mais antiga primeiro, mais os participantes e a contagem de não lidas. Email de autenticação é censurado da forma que leituras de mensagem são.

Parâmetros

address*string
id*stringId da thread (o thread_id de qualquer uma de suas mensagens)

Resposta 200

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

Transmitir eventos da caixa de entrada (server-sent events)

Retorna text/event-stream. Sem um cursor a transmissão começa no presente; com since (um cursor de /api/email/changes ou o id de qualquer evento anterior) primeiro reproduz cada mudança após aquele ponto, depois segue o diário da caixa de entrada ao vivo: cada frame carrega o tipo da mudança como o nome do evento (message.received, message.updated, message.deleted, message.moved, message.status, mailbox.resync_required, assistant.item.delegated, assistant.item.recalled, ...), a mudança como dados JSON com seu cursor retomável, e esse mesmo cursor como o id do frame. O primeiro frame é ready com o cursor para retomar; um comentário keep-alive chega a cada 20 segundos; a conexão fecha após cerca de 5 minutos com um frame close e uma dica retry:. Reconecte com Last-Event-ID (ou since) para retomar sem lacuna e sem duplicata. Tokens de agente são confinados às caixas de entrada que o agente opera. Uma entrada sobre um item de trabalho criado a partir de um e-mail de autenticação traz title e ask ocultos para um token sem email:auth_secrets.

Parâmetros

address*string
sincestringCursor para reproduzir a partir de; o `cursor` de qualquer evento anterior ou um next_cursor de /api/email/changes
GET/api/emails/{address}/folders

Listar pastas e contagens de e-mail

Retorna contagens derivadas do servidor para pastas do sistema e visualizações virtuais, além de recursos de ciclo de vida para o back-end da caixa de correio.

Parâmetros

address*string

Resposta 200

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

Aplicar uma ação de ciclo de vida às mensagens

Mova, restaure, marque como lida, marque com estrela ou exclua permanentemente até 100 IDs de mensagens explícitas. Mover para a Lixeira é reversível. A exclusão permanente requer email:delete e aceita apenas mensagens que já estão na Lixeira. Cada resposta é um recibo de operação durável com um resultado por ID solicitado. Forneça uma chave estável no cabeçalho padrão Idempotency-Key ou no campo JSON legado idempotency_key e reutilize-a após o tempo limite; uma nova tentativa exata retorna o recibo armazenado sem outra mutação. Se ambos os formulários forem fornecidos, eles deverão corresponder. Reutilizar uma chave com uma solicitação diferente retorna 409. Quando omitido, o servidor cria uma chave e a retorna no corpo e no cabeçalho Idempotency-Key. Retorna 207 quando apenas parte do lote é bem-sucedida.

Parâmetros

address*string

Solicitar corpo

message_ids*string[]
action*string(move | mark_read | star | restore | delete_permanently | label)
destinationstring(inbox | archive | sent | spam | trash)
readboolean
starredboolean
addstring[]label: rótulos a adicionar
removestring[]label: rótulos a remover
setstring[]label: substituir todos os rótulos (tem prioridade sobre adicionar e remover)
idempotency_keystringChave estável para este lote lógico exato. Reutilize após um tempo limite.

Resposta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVerdadeiro quando esta resposta reutilizou o recibo imutável concluído e não realizou nenhuma nova mutação.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
PATCH/api/emails/{address}/messages/read

Marcar mensagens como lidas ou não lidas

Endpoint de compatibilidade para atualizações de estado de leitura seguras para novas tentativas. Retorna o recibo de operação canônico durável por item mais a contagem herdada. Forneça e reutilize o cabeçalho Idempotency-Key ou o campo idempotency_key de compatibilidade após o tempo limite.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Solicitar corpo

message_ids*string[]IDs de mensagens para marcar
read*booleanverdadeiro para marcar como lido, falso para marcar como não lido
idempotency_keystring

Resposta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVerdadeiro quando esta resposta reutilizou o recibo imutável concluído e não realizou nenhuma nova mutação.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
countinteger
POST/api/emails/{address}/messages/delete

Excluir mensagens em massa

Endpoint de compatibilidade que move mensagens com segurança para a Lixeira. Retorna o recibo de operação canônico durável por item mais a contagem herdada. Forneça e reutilize o cabeçalho Idempotency-Key ou o campo idempotency_key de compatibilidade após o tempo limite.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Solicitar corpo

message_ids*string[]IDs de mensagens a serem excluídas
idempotency_keystring

Resposta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVerdadeiro quando esta resposta reutilizou o recibo imutável concluído e não realizou nenhuma nova mutação.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
countinteger
GET/api/emails/{address}/messages/{id}

Receba uma mensagem

Busque uma única mensagem por ID de uma caixa de correio identificada por seu endereço de e-mail completo. Mensagens classificadas como correio de autenticação (OTP, redefinição de senha, link mágico) retornam com assunto/corpo oculto, a menos que o token tenha o escopo email:auth_secrets.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
id*stringID da mensagem

Resposta 200

idstring
thread_idstringId da conversa compartilhado por todas as mensagens da thread (o id da mensagem raiz)
labelsstring[]Todos os rótulos na mensagem; `label` é o primeiro
thread_keystringChave de conversa canônica com namespace de back-end
thread_aliasesstring[]Chaves de fluxo de trabalho herdadas para transmitir ao alterar o estado da conversa
message_idstring | null
directionstring
fromstringO nome de exibição e o endereço do remetente tirados do cabeçalho From (ex.: 'Alice <alice@example.com>'), ou apenas o endereço quando o e-mail não trazia nome.
avatar_urlstring (uri) | nullURL do proxy Domani que preserva a privacidade para o avatar do remetente
tostringTodos os destinatários To do cabeçalho, com nomes de exibição, na ordem em que o remetente os escreveu (não apenas o endereço de envelope que roteou este e-mail para a caixa de entrada).
ccstring | nullTodos os destinatários Cc do cabeçalho, com nomes de exibição, ou null quando o e-mail não trazia Cc.
bccstring | nullDestinatários Bcc, presentes apenas na sua própria mensagem de saída (nunca em uma recebida, e nunca entregues como cabeçalho).
reply_tostring | null
subjectstring
textstring | null
htmlstring | null
in_reply_tostring | null
referencesstring | null
attachmentsobject[]
statusstring
is_readboolean
read_atstring | null
eventsobject[]
created_atstring (date-time)
DELETE/api/emails/{address}/messages/{id}

Excluir uma mensagem

Mova uma mensagem para a Lixeira. Isto é reversível. Use a ação de ciclo de vida com delete_permanently e um token email:delete para apagar uma mensagem que já está na Lixeira.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
id*stringID da mensagem

Resposta 200

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

Responder a uma mensagem

Responda a uma mensagem em uma caixa identificada pelo endereço completo. Os cabeçalhos da thread são preenchidos automaticamente, e o original é citado abaixo da resposta como fazem os clientes de e-mail (linha de atribuição no idioma da conta, linhas > no texto, um bloco gmail_quote no HTML), a menos que quote seja false. Clientes colaborativos devem passar o lease de composição, o reply_version observado e uma chave de idempotência estável; o servidor rejeita atomicamente uma resposta obsoleta ou duplicada imediatamente antes do envio.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
id*stringID da mensagem para responder

Solicitar corpo

textstringCorpo da resposta em texto simples
htmlstringCorpo da resposta HTML
ccanyDestinatários adicionais de CC
allbooleanResponder a todos: preencher automaticamente o CC do Para/CC original
quotebooleanCita o original abaixo da resposta; false envia apenas o texto ou o HTML informado
idempotency_keystringFormulário de compatibilidade corporal da Idempotency-Key
coordinationobject

Resposta 200

idstring
message_idstring
fromstring
tostring
statusstring
reply_versionintegerGeração reservada para uma resposta protegida
POST/api/emails/{address}/messages/{id}/forward

Encaminhar uma mensagem

Encaminhe uma mensagem de uma caixa de correio identificada pelo seu endereço de e-mail completo para outro destinatário. O encaminhamento de mensagens de autenticação (OTP, redefinição de senha, link mágico) requer o escopo email:auth_secrets - isso exfiltraria o segredo.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
id*stringID da mensagem a ser encaminhada

Solicitar corpo

to*stringEndereço de e-mail do destinatário
textstringNota opcional para preceder

Resposta 200

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

Obtenha informações do avatar da caixa de correio

Retorna o URL do Gravatar (se definido) e o link de inscrição para uma caixa de correio identificada pelo seu endereço de e-mail completo.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Resposta 200

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

Obter configuração do webhook da caixa de correio

Retorna a URL do webhook, o segredo de assinatura, os nomes dos cabeçalhos de autenticação configurados e o status de uma caixa de correio. Os valores de cabeçalho nunca são retornados.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Resposta 200

addressstring
webhook_urlstring | null
signing_secretstring | null
has_webhookboolean
eventsstring[]Eventos que este webhook carrega: email.received, qualquer veredicto de entrega em e-mail de saída (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) e os avisos de transferência de agente (assistant.item.delegated, assistant.item.recalled); vazio sem um webhook
header_namesstring[]Nomes de cabeçalho de autenticação configurados; valores nunca são retornados
hintstring
PUT/api/emails/{address}/webhook

Definir webhook da caixa de correio

Configure o destino HTTPS para eventos de caixa de correio assinados por HMAC: o e-mail de entrada por padrão, mais (opcional via events) o veredito de entrega do e-mail enviado A PARTIR DA caixa de correio: uma devolução chega ao remetente segundos depois de o envio ser aceito, em vez de viver apenas no histórico da mensagem. As entregas de entrada em tempo real são armazenadas de forma durável, tentadas imediatamente e repetidas até três vezes. Cada tentativa inclui X-Domani-Delivery-Attempt começando em 1. Os valores opcionais de autorização ou X-API-Key são criptografados e nunca retornados; os operadores humanos devem enviá-los fora do contexto do modelo por meio das opções de variável de ambiente CLI.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Solicitar corpo

url*stringURL do webhook HTTPS
eventsstring[]Eventos para enviar (assistant.item.delegated e assistant.item.recalled informam a um agente que o proprietário lhe entregou um item do Today ou o retomou; o webhook de cada caixa de correio que o agente opera os recebe). Omitido mantém a assinatura atual (apenas entrada para um novo webhook). Veredictos de entrega em e-mail enviado DA caixa de correio são opt-in e chegam na mesma URL com a mesma assinatura: {event, mailbox, email, message: {id, message_id, to, subject, status, detail}}.
headersobjectCabeçalhos de autenticação criptografados opcionais. Somente autorização e chave X-API são aceitas; envie {} para limpar. Não passe valores pelo contexto do modelo; a CLI suporta --authorization-env e --api-key-env.

Resposta 200

addressstring
webhook_urlstring
signing_secretstring
has_webhookboolean
eventsstring[]Eventos que este webhook carrega: email.received, qualquer veredicto de entrega em e-mail de saída (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) e os avisos de transferência de agente (assistant.item.delegated, assistant.item.recalled); vazio sem um webhook
header_namesstring[]Nomes de cabeçalho de autenticação configurados; valores nunca são retornados
hintstring

Exemplo

curl -X PUT https://domani.run/api/emails/agent%40example.com/webhook \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://agent.example/webhook","events":["email.received","email.bounced","email.delivered"]}'
DELETE/api/emails/{address}/webhook

Remover webhook da caixa de correio

Remova o URL do webhook e o segredo de assinatura de uma caixa de correio. Os e-mails recebidos serão armazenados apenas.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Resposta 200

addressstring
webhook_urlstring | null
signing_secretstring | null
has_webhookboolean
eventsstring[]Eventos que este webhook carrega: email.received, qualquer veredicto de entrega em e-mail de saída (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) e os avisos de transferência de agente (assistant.item.delegated, assistant.item.recalled); vazio sem um webhook
header_namesstring[]
hintstring
POST/api/emails/{address}/webhook/rotate

Alternar segredo de assinatura do webhook

Gere novamente o segredo de assinatura HMAC-SHA256 para um webhook de caixa de correio. O antigo segredo é imediatamente invalidado.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Resposta 200

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

Testar webhook de caixa de correio

Envie uma carga de teste assinada para o URL do webhook da caixa de correio. Retorna o status HTTP e se a entrega foi bem-sucedida. Os testes não são repetidos; as entregas de entrada ao vivo são repetidas até três vezes.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Resposta 200

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

Listar aliases de caixa de correio

Liste todos os endereços de alias entregues em uma caixa de correio. Os aliases permitem que vários endereços (vendas@, olá@, contato@) compartilhem uma caixa de entrada sem usar um slot de caixa de correio.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Resposta 200

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

Adicionar um alias de caixa de correio

Adicione um endereço de alias que seja entregue nesta caixa de correio, sem usar um slot de caixa de correio. O alias deve estar no mesmo domínio que a caixa de correio. Forneça um slug simples ("sales") ou um endereço completo ("sales@mysite.com").

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Solicitar corpo

alias*stringEndereço de alias - um slug simples ou slug@domain completo no mesmo domínio

Resposta 201

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

Remover um alias de caixa de correio

Remova um alias de uma caixa de correio. O e-mail para esse endereço deixa de ser entregue.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
alias*stringEndereço de alias a ser removido (codificado em URL ou um slug simples)

Resposta 200

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

Obtenha as configurações do cliente de e-mail (hospedado)

Obtenha configurações de conexão IMAP/SMTP para uma caixa de correio hospedada, para configurar Apple Mail, Thunderbird ou qualquer cliente de email. Nome de usuário é o endereço completo; a senha é uma senha de aplicativo (crie uma com POST /api/emails/{address}/credentials). Apenas caixas de correio hospedadas.

Parâmetros

address*stringEndereço da caixa de correio hospedada (codificado em URL)

Resposta 200

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

Listar senhas de aplicativos (hospedados)

Liste as senhas de aplicativo de uma caixa de correio hospedada. Os segredos são mostrados apenas uma vez na criação; isso retorna apenas rótulos e metadados. Apenas caixas de correio hospedadas.

Parâmetros

address*stringEndereço da caixa de correio hospedada (codificado em URL)

Resposta 200

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

Crie uma senha de aplicativo (hospedado)

Crie uma senha de aplicativo para uma caixa de correio hospedada, usada como senha em um cliente de email (IMAP/SMTP). O segredo é retornado uma vez - armazene-o agora. Apenas caixas de correio hospedadas.

Parâmetros

address*stringEndereço da caixa de correio hospedada (codificado em URL)

Solicitar corpo

labelstringEtiqueta para identificar esta senha de aplicativo, por exemplo. "Correio para laptop"

Resposta 201

idstring
labelstring
passwordstringA senha do aplicativo - mostrada uma vez, armazene-a agora
client_settingsobject
hintstring
DELETE/api/emails/{address}/credentials/{id}

Revogar uma senha de aplicativo (hospedado)

Revogar uma senha de aplicativo. Qualquer cliente de e-mail que o utilize interrompe a conexão imediatamente. Apenas caixas de correio hospedadas.

Parâmetros

address*stringEndereço da caixa de correio hospedada (codificado em URL)
id*stringID da senha do aplicativo (do endpoint da lista)

Resposta 200

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

Sinalizar uma mensagem para um humano

Escale uma mensagem para o humano da conta (ou limpe o sinalizador com clear=true). Define needs_human na mensagem, retém a conversa no status needs_human e dispara o webhook email.escalated + notificação no aplicativo. A primitiva do produto por trás de 'answer the easy ones, stop on the one the human must decide' (responda as fáceis, pare naquela que o humano precisa decidir).

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
id*stringID da mensagem a sinalizar

Solicitar corpo

reasonstringPor que o humano é necessário - exibido na notificação
clearbooleanLimpe o sinalizador em vez de defini-lo (o humano assumiu)

Resposta 200

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

Definir um lembrete de follow-up

Defina (ou limpe com clear=true) um lembrete único de follow-up em uma mensagem. Quando remind_at chega e a mensagem ainda está sem resposta (entrada: nenhuma resposta enviada; saída: nenhuma resposta de entrada recebida), email.reminder_due dispara como webhook + notificação no aplicativo e o lembrete se limpa sozinho.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
id*stringID da mensagem a acompanhar

Solicitar corpo

remind_atstring (date-time)Horário ISO 8601 para ser lembrado (de 1 minuto a 90 dias à frente)
notestringContexto exibido quando o lembrete dispara
clearbooleanLimpar um lembrete pendente

Resposta 200

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

Listar contatos

A agenda de contatos da conta, alimentada automaticamente pelo tráfego de e-mail: correspondentes, contagens de mensagens, última atividade e notas. Por padrão, os mais recentemente ativos primeiro (order=recent), para exibição: um contato que recebe e-mail novo durante uma varredura paginada passa à frente do cursor, então essa varredura pode pulá-lo. Para sincronizar a agenda inteira, passe order=created: os mais antigos primeiro pela data de criação e depois pelo id, uma chave que nunca muda, então cada contato que existe durante toda a varredura volta exatamente uma vez e os contatos criados nesse meio-tempo vêm no final. Um cursor só continua a ordem de onde veio (400 INVALID_CURSOR caso contrário). Agrega dados de todas as caixas de correio, portanto tokens confinados a caixas de correio são negados (400 MAILBOX_CONFINED).

Parâmetros

qstringFiltrar por substring do endereço ou do nome
limitintegerContatos a retornar (padrão 50)
cursorstringCursor de paginação de uma resposta anterior
orderstring(recent | created)Ordem de classificação. recent (padrão): os mais recentemente ativos primeiro, para exibição. created: os mais antigos primeiro pela data de criação e depois pelo id, estável para uma varredura completa. Qualquer outro valor retorna 400 INVALID_ORDER.

Resposta 200

contactsobject[]
next_cursorstring | null
POST/api/contacts

Criar ou atualizar um contato

Salve um contato: defina um nome de exibição e anexe notas ('prefers short emails', 'decision maker at Acme'). O tráfego de e-mail continua alimentando as contagens de mensagens de qualquer forma.

Solicitar corpo

address*stringO endereço de e-mail do contato
namestring | nullNome de exibição (nulo o limpa)
notesstring | nullNotas que agentes e humanos leem para obter contexto (nulo as limpa)
DELETE/api/contacts/{address}

Excluir um contato

Remova um contato da agenda de contatos. O tráfego de e-mail o recriará como contato automático se a pessoa escrever novamente.

Parâmetros

address*stringO endereço de e-mail do contato (codificado em URL)
GET/api/emails/{address}/rules

Listar regras de e-mail de entrada

Liste as regras de filtragem de entrada de uma caixa de correio, na ordem de prioridade em que são aplicadas (a primeira correspondência vence).

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Resposta 200

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

Adicionar uma regra de e-mail de entrada

Adicione uma regra executada em mensagens recebidas que correspondam a um campo (from/to/subject/body). Ações: drop, mark_read, forward (action_arg = endereço), webhook_only (ignora o encaminhamento) e label (action_arg = rótulo). As regras são aplicadas por prioridade crescente; a primeira correspondência vence.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)

Solicitar 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_argstringEndereço de encaminhamento (para forward), valor do rótulo (para label) ou motivo exibido ao humano (para escalate)
priorityintegerBaixe as execuções primeiro (padrão 0)
enabledbooleanPadrão verdadeiro

Resposta 201

idstring
priorityintegerAbaixe as corridas primeiro
match_fieldstring
match_opstring
match_valuestring
actionstring
action_argstring | null
enabledboolean
created_atstring (date-time)
DELETE/api/emails/{address}/rules/{ruleId}

Remover uma regra de e-mail de entrada

Remova uma regra de filtragem de entrada de uma caixa de correio.

Parâmetros

address*stringEndereço de e-mail da caixa de correio (codificado em URL)
ruleId*stringO ID da regra

Resposta 200

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

Definir domínio genérico

Encaminhe cada e-mail enviado para um endereço sem correspondência no domínio para uma caixa de correio designada. Qualquer coisa que não corresponda a uma caixa de correio, subendereço ou alias será incluída no pega-tudo. A caixa de correio já deve existir no domínio. Altera o e-mail do domínio inteiro, portanto um token confinado a caixas de correio recebe 403 MAILBOX_CONFINED.

Parâmetros

domain*stringNome de domínio

Solicitar corpo

mailbox*stringCaixa de correio pega-tudo - um slug simples ou endereço completo neste domínio

Resposta 200

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

Limpar domínio genérico

Remova o pega-tudo em um domínio. Os e-mails para endereços não correspondentes serão descartados novamente. Altera o e-mail do domínio inteiro, portanto um token confinado a caixas de correio recebe 403 MAILBOX_CONFINED.

Parâmetros

domain*stringNome de domínio

Resposta 200

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

Sincronizar incrementalmente uma caixa de correio

Chame sem cursor para capturar uma linha de base antes de um instantâneo completo limitado. Em seguida, passe next_cursor para reproduzir as mutações que aconteceram durante e após esse instantâneo. Os cursores são opacos, assinados, vinculados à caixa de correio e expiram após 30 dias. As notificações push são apenas dicas de invalidação; este diário é a fonte de recuperação durável. Uma entrada sobre um item de trabalho criado a partir de um e-mail de autenticação traz title e ask ocultos para um token sem email:auth_secrets.

Parâmetros

mailbox_id*string
cursorstringnext_cursor opaco de uma resposta anterior
limitinteger

Resposta 200

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

Listar endereços suprimidos

Liste endereços em sua lista de supressão - devoluções definitivas e reclamações (ingeridas automaticamente de eventos de entrega), além de entradas manuais. Os envios para esses endereços são ignorados. Paginado por cursor.

Parâmetros

cursorstringCursor de paginação de uma resposta anterior
limitintegerMáximo de entradas (padrão 50, máximo 100)

Resposta 200

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

Adicione uma supressão

Adicione manualmente um endereço à sua lista de supressão para que envios futuros o ignorem. Devoluções permanentes e reclamações são adicionados automaticamente; use isso para endereços que você deseja parar de enviar por e-mail. Idempotente.

Solicitar corpo

address*stringEndereço de e-mail para suprimir
reasonstring(manual | hard_bounce | complaint)Motivo (padrão: manual)

Resposta 201

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

Remover uma supressão

Remova um endereço da sua lista de supressão para poder enviá-lo novamente por e-mail (por exemplo, depois que o destinatário consertar sua caixa de correio).

Parâmetros

address*stringEndereço de e-mail suprimido (codificado em URL)

Resposta 200

addressstring
deletedboolean
hintstring

Collaboration

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

Solicitar uma transferência de propriedade do espaço de trabalho

Somente proprietário. Envia um link de aceitação de 48 horas para um membro existente. Nada se move até que o membro autenticado aceite.

Parâmetros

id*string

Solicitar corpo

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

Revogar uma transferência de propriedade pendente

Parâmetros

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

Aceitar a propriedade do espaço de trabalho

Somente alvo. Transfere atomicamente o espaço de trabalho, domínios com escopo e caixas de correio; o proprietário anterior torna-se administrador e o pagador existente permanece inalterado.

Solicitar corpo

token*string

Autenticação

POST/api/auth/registerPúblico

Crie uma nova conta

Começa a criar uma nova conta (ou autentica uma existente) enviando um link de login por e-mail; nenhuma chave de API é retornada aqui. Uma pessoa que clica nesse link em um navegador chega ao painel já autenticada. Uma CLI ou um agente sem sessão de navegador deve usar em vez disso o fluxo de login por dispositivo (POST /api/auth/cli e depois consultar GET /api/auth/cli/poll), que envia por e-mail a mesma aprovação e devolve uma chave de API quando aprovada - a resposta indica isso em next_steps. Passar um código ref vincula permanentemente o novo usuário a um indicador - o indicador ganha uma comissão sobre todas as futuras compras de domínios desse usuário.

Solicitar corpo

email*string (email)
refstringCódigo de referência - vincula permanentemente este usuário ao referenciador. O referenciador ganha uma comissão em cada compra de domínio.

Resposta 202

okboolean
verification_requiredboolean
messagestring
hintstring
next_stepsstring[]

Resposta de exemplo

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

Exemplo

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

Envie um e-mail de login com link mágico

Envia um link de login para o e-mail fornecido. Se o usuário não existir, crie primeiro uma conta. O link mágico redireciona para o painel com credenciais de autenticação. Para acesso programático à API, use POST /api/auth/register para obter uma chave de API diretamente.

Solicitar corpo

email*string (email)

Resposta 200

okboolean
messagestring

Resposta de exemplo

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

Exemplo

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

Gerar um código de login de uso único entre hosts

Somente no navegador: permite que uma pessoa conectada em domani.run ou mailzero.run retome a sessão no outro host sem um segundo link mágico. Retorna uma URL cujo fragmento carrega um código de uso único, válido por 60 segundos e vinculado ao host; o código nunca é registrado em log nem enviado em uma string de consulta. Não tem utilidade fora de uma sessão de navegador, por isso não é exposto como ferramenta de agente.

Solicitar corpo

target*string(mail | domani)
path*string

Resposta 200

urlstring

Resposta de exemplo

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

Resgatar um código de login de uso único entre hosts

Somente no navegador: chamado pela página /auth/handoff no host de destino para trocar o código do fragmento da URL por uma sessão, exatamente como GET /api/auth/verify faz com um link mágico. O código deve corresponder ao Host em que esta solicitação chegou. Não é uma ferramenta de agente.

Solicitar corpo

code*string

Resposta 200

okboolean
nextstring

Resposta de exemplo

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

Conta

GET/api/me

Obtenha detalhes da conta atual

Retorna as informações da conta do usuário autenticado, incluindo e-mail, status do pagamento, status das informações de contato, código de referência e contagens de uso. Os agentes devem chamar isso após a autenticação para verificar has_payment_method e has_contact antes de tentar compras.

Resposta 200

idstring
emailstring (email)
planstringChave do plano Domani pessoal ativo
workspace_plansstring[]Chaves ativas distintas do plano Mailzero em espaços de trabalho que o usuário pode acessar
has_payment_methodbooleanSe o usuário possui um cartão registrado (obrigatório antes de comprar domínios)
preferred_payment_methodstring | null
preferred_localestringLocale usado pelas interfaces Domani e comunicações transacionais
has_contactbooleanSe o usuário definiu suas informações de contato WHOIS. Opcionais para compras (enquanto não forem definidas, o contato da Domani mantém os novos domínios em nome do usuário), obrigatórias para uma transferência de entrada.
contactRegistrantContactInformações de contato do registrante (nulo se não definido)
referral_codestringSeu código de referência exclusivo
referral_rateintegerPorcentagem de comissão sobre compras referidas
balancenumberSaldo de crédito do Marketplace em dólares americanos (ganho com vendas)
domain_countintegerNúmero de domínios possuídos
token_countintegerNúmero de tokens de API ativos
featuresstring[]Flags de recursos habilitadas para esta conta (recursos GA mais os recursos em prévia concedidos ao usuário), por exemplo mailzero_assistant
can_manage_assistantbooleanIndica se o token que faz a chamada tem o escopo assistant:read. Independente de `features`: uma flag de recurso diz que a conta é elegível para o assistente, isto indica se este token específico (acesso total, ou um token com escopo CLI/OAuth/delegado) pode ler ou alterar suas configurações.
is_adminboolean
mailbox_entitlementobjectCapacidade de caixas de correio com domínio próprio no espaço de trabalho pessoal da conta. Tem um plano próprio, não o `plan` acima: um espaço de trabalho pode ter sua própria assinatura do Mailzero enquanto o plano do usuário continua gratuito.
created_atstring (date-time)

Resposta de exemplo

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

Exemplo

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

Atualizar preferências da conta

Atualize o método de pagamento preferencial do usuário autenticado e/ou localidade BCP 47. As respostas da API permanecem estruturadas e não são traduzidas.

Solicitar corpo

preferred_payment_methodstring | null(card | usdc)Forma de pagamento padrão para compras (card, usdc ou null para seleção automática)
preferred_localestring(en | fr | es | pt-BR | ja | zh-Hans | it)Locale usado pelas interfaces Domani e comunicações transacionais

Resposta 200

preferred_payment_methodstring | null
preferred_localestring
hintstring
DELETE/api/me

Excluir conta (bloqueada enquanto os domínios estão retidos)

Exclua permanentemente a conta, os tokens, os webhooks, as caixas de correio e outros dados do aplicativo do usuário autenticado. Os domínios registrados NÃO são excluídos com a conta: a solicitação falha com 409 HAS_DOMAINS até que todos os domínios sejam transferidos. Esta ação não pode ser desfeita.

Resposta 200

deletedboolean
hintstring
GET/api/me/activation

Obtenha um estado de ativação verdadeiro e as próximas ações recomendadas

Retorna marcos de produtos derivados do servidor e próximas ações com reconhecimento de capacidade. A criação de token, o uso de token, as visualizações de página e o estado da lista de verificação do cliente são deliberadamente excluídos.

Resposta 200

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

Exemplo

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

Ignorar ou restaurar a orientação inicial

Armazena apenas a preferência de apresentação. Ele não pode completar um marco do produto.

Solicitar corpo

dismissed_version*integer

Resposta 200

dismissed_versioninteger
hintstring
GET/api/me/contact

Obtenha informações de contato do registrante

Retorna as informações de contato WHOIS do titular do usuário autenticado. Opcionais para compras (enquanto não forem definidas, o contato da Domani mantém os novos domínios em nome do usuário), obrigatórias para uma transferência de entrada.

Resposta 200

has_contactboolean
contactRegistrantContact

Resposta de exemplo

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

Exemplo

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

Definir informações de contato do registrante

Define ou atualiza suas informações de contato WHOIS do titular. Opcionais para compras, obrigatórias para uma transferência de entrada. Elas se tornam o contato titular e de cobrança dos seus domínios: enquanto não forem definidas, o contato da Domani os mantém em seu nome. Ao atualizar, o novo contato é enviado a todos os seus domínios ativos nos registradores que aceitam alterações de contato, o que torna você o titular deles; o registrador pode pedir por e-mail que você o confirme em até 15 dias.

Resposta 200

contactRegistrantContact

Exemplo

curl -X PUT https://domani.run/api/me/contact \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"Jane","last_name":"Doe","address1":"123 Main St","city":"New York","state":"NY","postal_code":"10001","country":"US","phone":"+1.2125551234","email":"jane@example.com"}'
POST/api/me/resend-verification

Reenviar verificação de e-mail de contato

Reenvie o e-mail de verificação para o endereço de contato da conta. Limitado a um envio a cada 15 minutos por endereço.

Solicitar corpo

emailstring (email)Endereço de e-mail para verificação (o padrão é e-mail de contato da conta)

Resposta 200

sentboolean
already_verifiedboolean
hintstring
GET/api/sessions

Listar os dispositivos conectados

Cada navegador, app móvel e terminal conectado à conta, com a sessão de quem chama primeiro (current). Cada login abre sua própria sessão, então entrar em um novo dispositivo nunca desconecta outro. A localização é de onde o dispositivo entrou (país e cidade pelo IP), ausente quando desconhecida. Chaves de API não são sessões: liste-as com GET /api/tokens.

Resposta 200

sessionsobject[]
hintstring

Resposta de exemplo

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

Exemplo

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

Desconectar todos os outros dispositivos

Desconecta todas as sessões da conta, exceto a que faz a solicitação. Esses dispositivos precisarão entrar de novo na próxima solicitação. As chaves de API não mudam.

Resposta 200

revokedinteger
hintstring

Resposta de exemplo

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

Exemplo

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

Desconectar um dispositivo

Desconecta uma sessão. current indica a sessão que faz a solicitação (sair não exige escopo); qualquer outra sessão exige tokens:write.

Parâmetros

id*stringID da sessão (de GET /api/sessions), ou `current`

Resposta 200

successboolean
currentbooleanVerdadeiro quando quem chama se desconectou: a chave dele não funciona mais
hintstring

Resposta de exemplo

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

Exemplo

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

Tokens de API

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

Listar os tokens de API de uma identidade de agente

Os tokens vinculados a esta identidade de agente (chaves mascaradas, escopos, confinamento de caixa de correio, último uso). Um token vinculado a agente é a visão daquele agente sobre cada assistente e superfície de email.

Parâmetros

slug*stringO identificador da identidade de agente.
POST/api/agents/identity/{slug}/tokens

Dar a um agente sua própria chave de API em uma chamada

Cria um token vinculado a esta identidade de agente, confinado às caixas de correio que o agente opera, com os escopos mínimos que um agente precisa (assistant:read, assistant:write, email:read, email:write). Com essa chave o agente lê apenas seu próprio Today, suas caixas de correio e os itens entregues a ele; nomear outro agente responde 403 e rotas exclusivas do proprietário (configurações, backfill, exportação) recusam. A chave completa é retornada apenas nesta resposta. Requer tokens:write. Um agente que não opera nenhuma caixa de correio não recebe escopos de e-mail por padrão, e pedi-los responde 400 AGENT_MAILBOXES_REQUIRED: uma chave sem caixas de correio alcançaria todas as caixas de correio da conta.

Parâmetros

slug*stringO identificador da identidade de agente.

Solicitar corpo

namestringPadrão é '<slug> agent'.
scopesstring[]Padrão é assistant:read, assistant:write, email:read, email:write. Não pode exceder os escopos do próprio chamador.
mailboxesstring[]Endereços de caixa de correio aos quais o token está confinado. Padrão são as caixas de correio que o agente opera.
expires_inintegerSegundos até a expiração (máximo um ano).

Resposta 201

successboolean
tokenobject
agentobject
hintstring

Exemplo

curl -X POST https://domani.run/api/agents/identity/dave/tokens \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"name": "Dave on the laptop"}'
DELETE/api/agents/identity/{slug}/tokens/{id}

Revogar um token de API de um agente

Revoga um token vinculado a esta identidade de agente. Ele para de funcionar imediatamente. Requer tokens:write.

Parâmetros

slug*string
id*string

Resposta 200

successboolean
hintstring
GET/api/tokens

Liste seus tokens de API

Retorna todos os tokens de API do usuário autenticado. As chaves são mascaradas por segurança (primeiros 12 + últimos 4 caracteres visíveis). Use isto para auditar tokens ativos.

Resposta 200

tokensTokenInfo[]

Resposta de exemplo

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

Exemplo

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

Crie um novo token de API

Cria um novo token de API. A chave completa é retornada apenas nesta resposta - armazene-a com segurança. Você pode criar vários tokens para separar o acesso de diferentes aplicativos.

Solicitar corpo

namestringNome legível para identificar este token
expires_inintegerVida útil do token em segundos (mínimo 3600 = 1h, máximo 31536000 = 1 ano). Omitir para não expirar.
expires_atstring (date-time)Data de validade absoluta (ISO 8601). Alternativa para expires_in.
scopesstring[]Escopos de permissão para este token. Use ['*'] para acesso total (padrão). Um token só pode conceder escopos que já possui (atenuação de escopo). Escopos: 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 (envolve pagamento, inclui compras no 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 (Excluir permanentemente mensagens que já estão na Lixeira. Mover mensagens para a Lixeira requer apenas email:write. Conceda este escopo apenas a agentes com permissão para apagar irreversivelmente o conteúdo de e-mail), email:manage_mailboxes (Criar caixas de correio (POST /api/emails) e nada mais. O escopo administrativo restrito para agentes que podem criar endereços para novos projetos (partners@, launch@) sem conseguir ler ou enviar e-mails, gerenciar domínios ou tocar em tokens), email:auth_secrets (Ler mensagens classificadas como e-mail de autenticação (OTP / códigos de verificação, redefinições de senha, links mágicos). Sem ele, email:read ainda as lista, mas o assunto e o corpo voltam ocultos - assim, um token de agente roubado não consegue coletar códigos 2FA. Conceda-o apenas a agentes que realmente precisam concluir logins), 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 (Ler configurações do assistente Mailzero, a fila Today, itens de Work, visualizações exatas de ações, progresso de importação de histórico e Activity com conteúdo minimizado), assistant:write (Alterar configurações do assistente Mailzero, registrar consentimento e iniciar importações de histórico, registrar Decisions humanas sobre itens de Work, tentar novamente importações e exportar ou excluir dados derivados do assistente. Nunca envia e-mail).
max_per_txnumberLimite de gastos por transação em dólares americanos. Qualquer cobrança única acima disso falha com 403 SPEND_CAP_EXCEEDED. Um token só pode conceder limites iguais ou inferiores aos seus (CAP_ESCALATION caso contrário).
max_per_monthnumberLimite de gastos mensais em dólares americanos em todas as operações pagas feitas com este token.
agent_identity_idstringID opcional de uma identidade de agente pertencente a esta conta. As ações de correio realizadas com o token são atribuídas a esse agente.
http_route_policyobjectAutoridade estruturada obrigatória para um token com escopo que inclua http-routes:read ou http-routes:write.
mailboxesstring[]Confine o token a estes endereços de caixa de correio (slug@domain). Um token confinado só vê e atua nessas caixas de correio; um solicitante confinado só pode delegar um subconjunto das suas próprias (400 MAILBOX_ESCALATION caso contrário).

Resposta 201

idstring
namestring
keystringChave de API completa - salve-a, ela não será mostrada novamente
expiresAtstring (date-time) | nullQuando este token expirar (nulo = nunca)
scopesstring[]Escopos de permissão concedidos a este token
createdAtstring (date-time)
max_per_txnumber | nullLimite de gasto por transação em USD (nulo = ilimitado)
max_per_monthnumber | nullLimite de gasto mensal em USD (nulo = ilimitado)
mailbox_idsstring[]IDs de caixa de correio aos quais este token está confinado
http_route_policyHttpRoutePolicy
agent_identityobject | null

Resposta de exemplo

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

Exemplo

curl -X POST https://domani.run/api/tokens \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"name": "CI/CD Pipeline"}'
DELETE/api/tokens/{id}

Revogar um token de API

Revoga permanentemente um token de API. Quaisquer aplicativos que utilizem esse token perderão imediatamente o acesso. Esta ação não pode ser desfeita.

Parâmetros

id*stringID do token (da resposta GET /api/tokens)

Resposta 200

successboolean

Resposta de exemplo

{
  "success": true
}

Exemplo

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

Listar eventos de auditoria de segurança

Retorna a trilha de auditoria de segurança da conta, primeiro a mais recente: ciclo de vida do token (criado, revogado, tentativas de escalonamento), negações de gastos máximos e max_price, cobranças, solicitações de pagamento e exclusões de contas bloqueadas. Use-o para monitorar o que os tokens dos seus agentes estão fazendo.

Parâmetros

limitintegerEventos por página
cursorstringCursor de paginação (next_cursor da página anterior)
typestringFiltre por tipo de evento (por exemplo, token.created, Purchase.charged, Purchase.denied_cap)

Resposta 200

eventsobject[]
next_cursorstring | null
hintstring

Resposta de exemplo

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

Exemplo

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

Webhooks

GET/api/webhooks

Listar webhooks

Liste todos os endpoints de webhook configurados para sua conta. Retorna URL, eventos inscritos e status ativo para cada webhook. Os segredos nunca são retornados após a criação. Um token confinado a caixas de correio vê apenas os webhooks confinados às próprias caixas de correio.

Resposta 200

webhooksobject[]
hintstring

Resposta de exemplo

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

Exemplo

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

Criar webhook

Registre um novo endpoint de webhook HTTPS. Os valores opcionais de autorização ou X-API-Key são criptografados em repouso e incluídos em cada entrega. O segredo de assinatura é retornado apenas uma vez. Máximo de 5 webhooks por conta. Um webhook criado por um token confinado a caixas de correio fica confinado às mesmas caixas: não recebe nenhum evento de e-mail de outra caixa de correio.

Solicitar corpo

url*string (uri)URL HTTPS que receberá solicitações POST de webhook
events*string[]Tipos de eventos para assinar. Use GET /api/webhooks/events para listar os tipos disponíveis.
headersobjectCabeçalhos de autenticação criptografados opcionais. Somente autorização e chave X-API são aceitas.

Resposta 200

idstring
urlstring (uri)
eventsstring[]
secretstringSegredo de assinatura HMAC-SHA256 (mostrado uma vez)
activeboolean
header_namesstring[]Nomes de cabeçalho de autenticação configurados; valores nunca são retornados
created_atstring (date-time)
hintstring

Resposta de exemplo

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

Exemplo

curl -X POST https://domani.run/api/webhooks \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hook","events":["domain.purchased","dns.updated"],"headers":{"Authorization":"Bearer sender_key_xxx"}}'
PATCH/api/webhooks/{id}

Atualizar webhook

Atualize o URL de um webhook, eventos inscritos, status ativo ou cabeçalhos de autenticação criptografados. Envie apenas os campos que deseja alterar. Um token confinado a caixas de correio só alcança os webhooks confinados às próprias caixas de correio (caso contrário, 404).

Parâmetros

id*stringID do webhook

Solicitar corpo

urlstring (uri)Novo URL HTTPS
eventsstring[]Nova lista de tipos de eventos
activebooleanDefina false para pausar, true para retomar
headersobjectSubstitua cabeçalhos de autenticação criptografados; envie {} para limpar. Somente autorização e chave X-API são aceitas.

Resposta 200

idstring
urlstring (uri)
eventsstring[]
activeboolean
header_namesstring[]Nomes de cabeçalho de autenticação configurados; valores nunca são retornados
hintstring
DELETE/api/webhooks/{id}

Excluir webhook

Exclua um ponto de extremidade do webhook. Todas as entregas pendentes serão canceladas. Isto não pode ser desfeito. Um token confinado a caixas de correio só alcança os webhooks confinados às próprias caixas de correio (caso contrário, 404).

Parâmetros

id*stringID do webhook

Resposta 200

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

Listar entregas de webhook

Obtenha tentativas de entrega recentes de um webhook. Mostra o tipo de evento, o status HTTP, o número de tentativas e quaisquer erros. Útil para depurar entregas com falha. Um token confinado a caixas de correio só alcança os webhooks confinados às próprias caixas de correio (caso contrário, 404).

Parâmetros

id*stringID do webhook
limitintegerNúmero máximo de entregas a devolver

Resposta 200

deliveriesobject[]
hintstring

Resposta de exemplo

{
  "deliveries": [
    {
      "id": "cm5del001",
      "replay_of_id": null,
      "event_type": "domain.purchased",
      "status": "delivered",
      "http_status": 200,
      "attempts": 1,
      "last_error": null,
      "created_at": "2026-02-25T10:05:00.000Z"
    }
  ],
  "hint": "1 delivery(ies) for this webhook."
}
POST/api/webhooks/{id}/deliveries/{deliveryId}/replay

Reproduzir uma entrega de webhook

Clone e entregue novamente imediatamente um evento de webhook imutável. A carga útil do evento e o ID do evento permanecem idênticos; a assinatura HMAC recebe um novo carimbo de data/hora. Uma chave de idempotência obrigatória garante que as novas tentativas do chamador nunca sejam enviadas duas vezes. Um token confinado a caixas de correio só alcança os webhooks confinados às próprias caixas de correio (caso contrário, 404). Uma exceção à carga útil idêntica: um assunto copiado de um e-mail de autenticação é enviado oculto, pois a URL do webhook pode ter mudado desde o primeiro envio.

Parâmetros

id*stringID do webhook
deliveryId*stringID de entrega original

Solicitar corpo

idempotency_key*string

Resposta 200

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

Listar tipos de eventos de webhook

Liste todos os tipos de eventos de webhook disponíveis com descrições. Nenhuma autenticação necessária.

Resposta 200

eventsobject[]

Resposta de exemplo

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

Exemplo

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

Notificações

GET/api/notifications

Listar notificações

Liste suas notificações no aplicativo com paginação baseada em cursor. Inclui eventos de transações, atualizações de listagem e alertas do sistema. Requer escopo notifications:read. Uma notificação escrita antes de os assuntos de e-mail serem ocultados na gravação é lida com o assunto do e-mail de autenticação oculto, em body e data.subject, para um token sem email:auth_secrets.

Parâmetros

limitintegerMáximo de notificações para retornar
cursorstringCursor para paginação (do next_cursor da resposta anterior)

Resposta 200

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

Obtenha contagem de notificações não lidas

Endpoint leve para pesquisa de contagem de notificações não lidas. Requer escopo notifications:read.

Resposta 200

unread_countinteger

Resposta de exemplo

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

Marcar notificação como lida

Marcar uma única notificação como lida. Requer escopo notifications:read.

Parâmetros

id*stringID de notificação

Solicitar corpo

read*booleanDefina como verdadeiro para marcar como lido

Resposta 200

okboolean
POST/api/notifications/read-all

Marcar todas as notificações como lidas

Marcar todas as notificações não lidas como lidas. Requer escopo notifications:read.

Resposta 200

okboolean
countintegerNúmero de notificações marcadas como lidas
GET/api/notifications/preferences

Obtenha preferências de notificação

Retorna as preferências de notificação do usuário para cada categoria e canal (in_app, email). As preferências ausentes são ativadas por padrão. Requer o escopo notifications:read.

Resposta 200

preferencesobject[]
expiry_alert_daysinteger[]Dias antes do vencimento, o usuário recebe lembretes de renovação (padrão 30/7/1). Vazio = sem lembretes de expiração.
PUT/api/notifications/preferences

Atualizar preferências de notificação

Atualize as preferências de notificação para categorias e canais específicos. Requer escopo notifications:read.

Solicitar corpo

preferencesobject[]
expiry_alert_daysinteger[]Dias antes do vencimento para receber lembretes de renovação. Matriz vazia = sem lembretes de expiração.

Resposta 200

okboolean

TLDs

GET/api/tldsPúblico

Liste os TLDs vendidos pela Domani, com preços

Retorna os TLDs vendidos pela Domani, com preços de registro, renovação e transferência. É o catálogo dos nossos registradores, não todos os TLDs que existem: alguns TLDs da zona raiz, como gov ou edu, não podem ser registrados pela Domani. Cada entrada tem um kind: tld (um TLD da zona raiz da IANA), second_level (uma oferta sob um deles, como co.uk) ou alt_root (um nome fora da zona raiz, que não resolve no DNS público). As entradas alt_root ficam de fora, a menos que o parâmetro kind as solicite. Suporta filtragem por faixa de preço, pesquisa por nome de TLD, classificação e paginação via limit/offset. Quando paginado, inclui um cabeçalho Link com o URL da próxima página. Endpoint público - não é necessária autenticação. As solicitações autenticadas obtêm limites de taxa mais altos (60/min vs 30/min).

Parâmetros

max_pricenumberPreço máximo de registro em dólares americanos
min_pricenumberPreço mínimo de registro em dólares americanos
sortstring(tld | price | renewal)Campo de classificação - 'tld' (em ordem alfabética), 'price' (registro) ou 'renewal'
orderstring(asc | desc)Ordem de classificação
searchstringFiltrar nomes de TLD contendo esta string
limitintegerMáximo de resultados por página
offsetintegerNúmero de resultados a serem ignorados
kindstringTipos a retornar, separados por vírgula: `tld`, `second_level`, `alt_root`. Padrão: `tld,second_level`, as entradas que resolvem no DNS público. As entradas `alt_root` (fora da zona raiz da IANA) só são retornadas quando solicitadas.

Resposta 200

tldsTldInfo[]
totalintegerTotal de TLDs correspondentes (antes da paginação)
offsetinteger
limitinteger | null

Resposta de exemplo

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

Exemplo

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

Domínios

GET/api/domains

Liste todos os seus domínios registrados

Retorna todos os domínios pertencentes ao usuário autenticado, ordenados por data de compra (os mais recentes primeiro). Inclui nome de domínio, status, data de compra e data de validade.

Resposta 200

domainsDomainRecord[]

Resposta de exemplo

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

Exemplo

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

Reivindique uma identidade de agente livre (<handle>.domani.run)

Oferece ao agente uma identidade gratuita em <slug>.domani.run - uma página de perfil ativa, sem compra de domínio, instantaneamente. A maneira fácil de começar; atualize para um domínio de propriedade real posteriormente. Requer account:write.

Solicitar corpo

slug*stringO identificador - torna-se <slug>.domani.run
namestringNome de exibição
biostring
emojistringEmoji de avatar
emailstring (email)Contato público (por exemplo, sua caixa de entrada gratuita @domani.run)
linksobject[]

Resposta 200

idstringID de identidade estável usado para vincular tokens de API com escopo definido
slugstring
urlstringO subdomínio de identidade (canônico)
page_urlstringFallback de caminho que sempre funciona
namestring | null
biostring | null
emojistring | null
emailstring | null
linksobject[]
viewsinteger
created_atstring (date-time)

Resposta de exemplo

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

Exemplo

curl -X POST https://domani.run/api/agents/identity \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"slug": "myagent", "name": "My Agent", "bio": "I broker domains.", "emoji": "🤖"}'
GET/api/agents/identity

Liste as identidades dos seus agentes

Lista as identidades gratuitas (<handle>.domani.run) que você reivindicou. Requer account:read.

Resposta 200

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

Atualizar uma identidade de agente

Atualize os campos name/bio/emoji/email/links de uma identidade gratuita. Requer account:write.

Parâmetros

slug*stringO identificador a ser atualizado

Solicitar corpo

namestring
biostring
emojistring
emailstring
linksobject[]

Resposta 200

idstringID de identidade estável usado para vincular tokens de API com escopo definido
slugstring
urlstringO subdomínio de identidade (canônico)
page_urlstringFallback de caminho que sempre funciona
namestring | null
biostring | null
emojistring | null
emailstring | null
linksobject[]
viewsinteger
created_atstring (date-time)
DELETE/api/agents/identity/{slug}

Liberar uma identidade de agente

Libera um identificador de identidade gratuito para que fique disponível novamente. Requer account:write.

Parâmetros

slug*stringA alça para liberar

Resposta 200

successboolean
slugstring
releasedboolean
POST/api/agents/provision

Forneça uma identidade completa do agente em uma chamada

Fornece a um agente de IA uma identidade completa da Internet em uma única solicitação: compra o domínio (se ainda não for seu), configura DNS de e-mail, cria uma caixa de correio e, opcionalmente, registra um webhook autenticado para e-mail de entrada e eventos de domínio. webhook_headers aceita apenas Authorization e X-API-Key; os valores são criptografados em repouso e nunca retornados. Repetir o mesmo domínio, slug de caixa de correio e URL de webhook reutiliza esses recursos. Cada entrada de webhook é validada antes da compra ou cobrança de um domínio. A compra do domínio é a única etapa que pode ser cobrada e o único pré-requisito difícil - se falhar, toda a chamada falhará (402 para pagamento, 409 se for feita por outra conta). Configuração de e-mail, criação de caixa de correio e registro de webhook são o melhor esforço: problemas transitórios (por exemplo, DNS ainda em propagação) são retornados em warnings em vez de falharem na chamada, para que o agente sempre obtenha seu domínio. O pagamento funciona exatamente como POST /api/domains/buy (cartão, saldo do mercado ou USDC por meio do cabeçalho PAYMENT-SIGNATURE/fluxo de duas etapas).

Solicitar corpo

domain*stringDomínio a ser fornecido ao agente. Comprou se ainda não possui.
slugstringParte local da caixa de correio (hi@domain). O padrão é 'hi'.
namestringNome de exibição para e-mail de saída.
webhook_urlstring (uri)URL HTTPS opcional para receber e-mails de entrada + eventos de domínio.
webhook_headersobjectAutenticação de entrega opcional. Os valores são criptografados em repouso e nunca retornados; as respostas expõem apenas header_names.
webhook_eventsstring[]Tipos de eventos de webhook. O padrão é email.received/delivered/bounced.
payment_methodstring(card | usdc | balance)Como pagar pelo domínio.
payment_txstringHash tx USDC (fluxo de duas etapas).
payment_chainstring(base | ethereum)
yearsinteger
max_pricenumberTeto em USD para a cobrança do domínio. Se o preço real ultrapassar esse valor, a solicitação falha com 400 PRICE_ABOVE_MAX e nada é cobrado. O campo `price` do erro é o total a aceitar; confirme-o com o usuário antes de tentar novamente com esse max_price.

Resposta 200

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

Exemplo

curl -X POST https://domani.run/api/agents/provision \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"domain":"myagent.run","slug":"hi","webhook_url":"https://my-agent.example.com/inbox","webhook_headers":{"Authorization":"Bearer sender-key"}}'
POST/api/domains/buy

Compre um ou mais domínios

Compra e registra imediatamente um ou mais domínios. Envie {"domain": "..."} para um único domínio ou {"domains": ["...", "..."]} para um lote de até 10. Se o domínio estiver anunciado para venda no marketplace Domani, o endpoint encaminha automaticamente para uma compra no marketplace, em vez de um novo registro. A resposta inclui years: 0 e marketplace_purchase: true para diferenciar a compra de um registro. Compras no marketplace aceitam somente um domínio. O comprador paga o preço anunciado integral; o vendedor recebe esse preço menos a comissão da plataforma (10% por padrão). Em compras em lote, cada domínio é processado de forma independente: uma falha não bloqueia as demais compras. A resposta inclui results (sucessos), errors (falhas) e summary com as contagens. Aceita três formas de pagamento: 1. Cartão (padrão): exige um cartão cadastrado via POST /api/billing/setup. Cada domínio é cobrado separadamente. 2. USDC (duas etapas): faça uma primeira chamada sem pagamento para receber uma resposta 402 com payment_options.crypto (endereço da carteira, valor e redes). Envie USDC on-chain e repita a chamada com payment_tx e payment_chain no corpo da solicitação. 3. USDC x402 (atômico): inclua um cabeçalho PAYMENT-SIGNATURE com um pagamento USDC assinado na Base. Compras em lote exigem um cartão cadastrado (USDC não é compatível com vários domínios). Se nenhum pagamento for enviado para um único domínio, retorna HTTP 402 com as instruções de pagamento.

Solicitar corpo

domainstringDomínio único para comprar (por exemplo, mysite.com)
domainsstring[]Conjunto de domínios para compra (máximo de 10, requer cartão registrado)
payment_methodstring(card | usdc | balance)Forma de pagamento: 'card' (padrão), 'usdc' (x402 - a primeira chamada retorna 402 com instruções de pagamento) ou 'balance' (gastar crédito do marketplace).
payment_txstringHash de transação de um pagamento em USDC já enviado na rede. Obrigatório na segunda chamada do fluxo USDC de duas etapas.
payment_chainstring(base | ethereum)Cadeia na qual o pagamento em USDC foi enviado (por exemplo, 'base' ou 'ethereum').
yearsintegerNúmero de anos para registro (1-10, padrão 1). O preço é multiplicado por anos.
max_pricenumberTeto em USD para a cobrança total. Se o preço real passar dele, a requisição falha com 400 PRICE_ABOVE_MAX e nada é cobrado: um cinto de segurança para agentes autônomos. Sem max_price, o teto é o preço que a busca exibiu: quando só um registrador mais caro pode ficar com o nome, a compra falha da mesma forma. O `price` do erro é o total a aceitar, com `listed_price` e `renewal_price` ao lado; confirme-os com o usuário antes de tentar novamente com esse max_price.
refstringCódigo de referência (opcional) - o referenciador ganha uma comissão

Exemplo

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

Obtenha informações detalhadas sobre um domínio que você possui

Retorna informações abrangentes sobre um domínio: status, data de compra, vencimento, forma de pagamento, bloqueio de segurança, privacidade WHOIS, status de renovação automática e datas de registro. O objeto registrar pode ser null se os dados estendidos não estiverem disponíveis.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
statusstring
auto_renewbooleanSe a renovação automática está habilitada
purchased_atstring (date-time)
expires_atstring (date-time)
days_until_expiryintegerDias até a expiração do domínio
renewal_pricenumber | nullQuanto custa um ano de renovação em USD no registrador que mantém o domínio; renovar N anos custa N vezes esse valor. Null quando o domani não pode renovar o domínio ou o preço é desconhecido.
payment_methodstringComo o domínio foi pago
payment_txstring | nullHash tx na rede (pagamentos em USDC)
registrantstringQuem o registro indica como titular do domínio. `customer`: seus próprios dados de contato (de set_contact). `domani`: o contato padrão da Domani, que mantém o domínio em seu nome até você adicionar os seus com set_contact, o que torna você o titular. `unknown`: ainda não verificado. A privacidade WHOIS oculta os dados em ambos os casos.
transfer_outobjectTransferência do domínio para outro registrador. `mode` `api`: get_auth_code retorna o código. `manual`: o registrador não tem API para isso, então a equipe da Domani obtém o código manualmente em até 1 dia útil. null: indisponível para este domínio.
registrar_statusstringSe os dados do registrador ativo foram atualizados ou gerenciados externamente
registrar_checked_atstring (date-time)Quando a atualização do registrador foi tentada
registrarobject | nullDetalhes de registro de domínio (nulo se indisponível)

Resposta de exemplo

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

Exemplo

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

Atualizar configurações de domínio

Atualize as configurações de um domínio que você possui. Suporta auto_renew, whois_privacy e security_lock. Pelo menos um campo deve ser fornecido.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

auto_renewbooleanSe a renovação automática deve ser habilitada para este domínio
whois_privacybooleanSe deve ativar a proteção de privacidade WHOIS
security_lockbooleanSe deve bloquear o domínio contra transferências

Resposta 200

domainstring
auto_renewboolean
whois_privacyboolean
security_lockboolean
hintstring

Exemplo

curl -X PUT https://domani.run/api/domains/mysite.com/settings \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"auto_renew": false}'
PUT/api/domains/{domain}/parking

Atualizar configurações de parking

Atualize as configurações de parking e listagem de um domínio que você possui. Ative/desative a página de parking e defina um preço de listagem para 'Venda'. Quando o parking está ativado, os visitantes do domínio veem uma página da marca. Quando um preço de listagem é definido, os visitantes veem uma página “À venda” com um formulário de contato.

Parâmetros

domain*stringNome de domínio

Solicitar corpo

enabledbooleanSe deve ativar a página de parking
listing_pricenumber | nullPreço de venda em dólares americanos ou nulo para remover listagem

Resposta 200

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

Encaminhar um domínio para um URL

Encaminhe um domínio que você possui para outro URL (por exemplo, brand.com -> https://brand.dev) - útil para marcas com vários TLDs. O domínio deve apontar para os servidores de nomes/IP de parking do domani para que o redirecionamento seja veiculado. Permanente (308) por padrão ou temporário (307). Requer escopo domains:write.

Parâmetros

domain*stringNome de domínio

Solicitar corpo

url*stringURL de destino (ou domínio simples) para encaminhar, por exemplo https://brand.dev
permanentbooleanverdadeiro = permanente (308, padrão), falso = temporário (307)

Resposta 200

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

Pare de encaminhar um domínio

Remova o redirecionamento de um domínio para que ele retorne à página de parking. Requer escopo domains:write.

Parâmetros

domain*stringNome de domínio

Resposta 200

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

Anuncie um domínio para venda

Anuncie no marketplace Domani um domínio que você possui. Os compradores podem adquiri-lo diretamente pela API. O domínio deve estar ativo e ainda não pode estar anunciado. Taxas: a Domani cobra uma comissão da plataforma (10% por padrão) nas vendas concluídas. O vendedor recebe o preço anunciado menos a comissão; o comprador paga o preço anunciado integral. Requer o escopo domains:write.

Parâmetros

domain*stringNome de domínio para listar para venda

Solicitar corpo

price*numberPreço de venda em USD
descriptionstringDescrição opcional da listagem

Resposta 200

listingobject
hintstring

Resposta de exemplo

{
  "listing": {
    "id": "lst_abc123",
    "domain": "example.com",
    "price": 5000,
    "currency": "USD",
    "description": null,
    "status": "active",
    "created_at": "2026-03-14T12:00:00.000Z"
  },
  "hint": "example.com listed for sale at $5,000. Buyers can purchase it on the marketplace."
}
PATCH/api/domains/{domain}/for-sale

Atualizar uma listagem de domínio

Atualize o preço e/ou a descrição de uma listagem ativa no mercado. Pelo menos um campo deve ser fornecido. Requer escopo domains:write.

Parâmetros

domain*stringNome de domínio com listagem ativa

Solicitar corpo

pricenumberNovo preço de venda em USD
descriptionstring | nullNova descrição (nulo para limpar)

Resposta 200

listingobject
hintstring

Resposta de exemplo

{
  "listing": {
    "id": "lst_abc123",
    "domain": "example.com",
    "price": 7000,
    "currency": "USD",
    "description": "Premium domain",
    "status": "active",
    "created_at": "2026-03-14T12:00:00.000Z"
  },
  "hint": "Listing for example.com has been updated. New price: $7,000."
}
DELETE/api/domains/{domain}/for-sale

Cancelar uma listagem de domínio

Remova uma listagem ativa à venda de um domínio que você possui. O domínio permanece na sua conta, mas não está mais disponível para compra no mercado. Requer escopo domains:write.

Parâmetros

domain*stringNome de domínio para remover da lista

Resposta 200

domainstring
statusstring
hintstring

Resposta de exemplo

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

Obtenha análises de parking

Obtenha análises de visitantes para um domínio em parking: visualizações de páginas, consultas, taxa de conversão, detalhamento diário de 30 dias e consultas recentes.

Parâmetros

domain*stringNome de domínio

Resposta 200

domainstring
views_7dintegerTotal de visualizações de página nos últimos 7 dias
views_30dintegerTotal de visualizações de página nos últimos 30 dias
inquiries_30dintegerTotal de consultas nos últimos 30 dias
conversion_ratenumberProporção de consulta por visualização como porcentagem
daily_viewsobject[]Contagens de visualizações diárias dos últimos 30 dias
recent_inquiriesobject[]5 consultas mais recentes
hintstring

Resposta de exemplo

{
  "domain": "example.com",
  "views_7d": 42,
  "views_30d": 156,
  "inquiries_30d": 3,
  "conversion_rate": 1.92,
  "daily_views": [
    {
      "date": "2026-02-25",
      "views": 7
    }
  ],
  "recent_inquiries": [
    {
      "email": "buyer@example.com",
      "offer": 500,
      "date": "2026-02-25T10:00:00Z"
    }
  ],
  "hint": "example.com received 156 views and 3 inquiries in the last 30 days (1.92% conversion)."
}
GET/api/domains/{domain}/auth-code

Obtenha o código de autenticação EPP

Obtenha o código EPP/auth necessário para transferir um domínio para outro registrador. Desbloqueia automaticamente o domínio se ele estiver bloqueado. Quem tem o código de autorização pode levar o domínio, e o e-mail dele junto: lê-lo exige o escopo email:auth_secrets e um token não restrito a caixas de correio (caso contrário, 403 INSUFFICIENT_SCOPE ou 403 MAILBOX_CONFINED), e cada leitura fica registrada no log de auditoria. Alguns registradores não têm API para o código: a primeira chamada responde então 202 com status: "requested" enquanto a equipe da Domani desbloqueia o domínio e obtém o código manualmente (em até 1 dia útil, expected_by); o usuário recebe um e-mail quando ele estiver pronto, e uma chamada posterior responde 200 com status: "ready" e o código. Nos 60 dias após um registro ou uma transferência de entrada, esse domínio responde 409 TRANSFER_LOCKED com available_at.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
statusstring`ready`: o código está em auth_code. `requested`: a equipe da Domani está obtendo o código junto ao registrador; o usuário recebe um e-mail quando ele estiver pronto.
auth_codestring | nullCódigo de autorização EPP a ser fornecido ao novo registrador. null enquanto o status for requested.
was_unlockedbooleanSe o domínio foi desbloqueado para permitir a transferência
requested_atstring (date-time)Quando o código foi solicitado (registradores sem API para isso)
expected_bystring (date-time)Até quando a equipe da Domani terá o código, no máximo (status requested)
hintstring
next_stepsstring[]
GET/api/domains/{domain}/transfer-away

Obtenha o status da transferência de saída

Verifique o status de uma transferência de domínio de saída. Use depois de obter um código de autorização e iniciar a transferência no novo registrador. Indisponível para um domínio cujo transfer_out.mode é manual.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

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

Verifique o status da transferência de entrada

Verifique o status de uma transferência de domínio de entrada. Retorna status detalhado com dicas acionáveis. Use após iniciar uma transferência com POST /api/domains/transfer.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
statusstring
timestampstringData e hora da última atualização de status
hintstringOrientação prática com base no status atual
continuityobjectDelegação capturada e verificação pós-transferência para transferências seguras.
POST/api/domains/import

Importe um domínio externo

Importe um domínio que você possui em outro registrador (GoDaddy, Namecheap, Cloudflare, etc.) para gerenciar através do domani.run. Gratuito, sem necessidade de transferência. Retorna um registro TXT para verificação de propriedade baseada em DNS.

Solicitar corpo

domain*stringDomínio a importar

Resposta 200

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

Verifique e conclua a importação do domínio

Verifique o registro DNS TXT e conclua a importação do domínio. Chame após adicionar o registro TXT retornado por POST /api/domains/import. Usa DNS sobre HTTPS da Cloudflare para verificar a propagação.

Solicitar corpo

domain*stringDomínio a ser verificado

Resposta 201

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

Planeje como adotar um domínio existente

Inspeção somente leitura de um domínio existente antes de conectá-lo ou transferi-lo. Retorna o registrador atual, servidores de nomes autorizados, provedor de DNS, estado de DNSSEC, estado da conta, preço de transferência, invariantes de segurança e próximas ações exatas da API. Ligue para isso antes de solicitar um código EPP. A conexão deixa o registrador e o DNS inalterados. A transferência preserva os servidores de nomes e não migra o DNS.

Parâmetros

domain*stringDomínio existente para inspecionar, por ex. meusite.com

Resposta 200

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

Verifique previamente a elegibilidade da transferência

Verifique se um domínio está qualificado para transferência antes de iniciar. Retorna o preço de transferência, o status de elegibilidade e quaisquer bloqueadores (TLD não suportado, período de espera da ICANN, domínio bloqueado). Chame isso antes de POST /api/domains/transfer.

Parâmetros

domain*stringDomínio a ser verificado, por ex. meusite.com

Resposta 200

domainstring
tldstring
eligibleboolean
pricenumber | nullPreço de transferência em dólares americanos (nulo se o TLD não for compatível)
currencystring
renewal_pricenumberSomente se elegível: quanto custa cada ano após a transferência, em USD, no registrador para o qual ele vai. Ausente quando desconhecido.
reasonstringMotivo legível se não for elegível
codestring
eligible_atstring (date)Data ISO em que o domínio se torna elegível (período de espera da ICANN)
hintstring
POST/api/domains/transfer-watch

Observe um domínio para elegibilidade de transferência

Monitore um domínio e receba uma notificação (e-mail + webhook transfer.eligible) quando ele puder ser transferido. Usa RDAP para verificar códigos de status EPP e períodos de bloqueio de 60 dias da ICANN. Se já estiver elegível, responde imediatamente sem criar um monitoramento.

Solicitar corpo

domain*stringDomínio para assistir, por ex. meusite.com

Resposta 200

domainstring
eligiblebooleanSe o domínio está atualmente qualificado para transferência
eligible_atstring (date)Data ISO em que o domínio se torna elegível (se ainda não for elegível)
hintstringOrientação acionável
watchingbooleanSe uma notificação foi configurada
POST/api/domains/transfer

Transferir domínio de outro provedor

Inicie uma transferência de domínio após planDomainAdoption e confirmação explícita do preço. Requer o código de autorização/EPP do fornecedor atual. Os servidores de nomes oficiais existentes são preservados e verificados. A migração de DNS nunca está implícita. A transferência normalmente leva de 1 a 5 dias para ser concluída. O pagamento é cobrado antecipadamente via cartão ou USDC.

Solicitar corpo

domain*stringDomínio a transferir, por ex. meusite.com
auth_code*stringCódigo de autorização/EPP do provedor atual
payment_methodstring(card | usdc | balance)Forma de pagamento: 'card' (padrão), 'usdc' ou 'balance' (crédito no marketplace).
payment_txstringHash de transação de um pagamento em USDC já enviado na rede.
payment_chainstring(base | ethereum)Cadeia em que o pagamento em USDC foi enviado.
extra_subdomainsstring[]Subdomínios adicionais a serem incluídos no instantâneo DNS pré-transferência. Descobrimos subdomínios automaticamente por meio de logs CT, SPF, inferência MX/DKIM e uma lista de palavras comum - use isso para quaisquer subdomínios personalizados que possamos perder.
max_pricenumberTeto em USD para a cobrança da transferência. Se o preço real passar dele, a requisição falha com 400 PRICE_ABOVE_MAX e nada é cobrado. Sem max_price, o teto é o preço de transferência exibido: quando só um registrador mais caro pode ficar com ela, a transferência falha da mesma forma. O `price` do erro é o total a aceitar; confirme-o com o usuário antes de tentar novamente com esse max_price.

Resposta 202

domainstring
statusstring
expiresstring (date-time)
pricenumber
currencystring
payment_methodstring
payment_txstring
auto_renewboolean
hintstring
dns_snapshotobjectResumo do backup de recuperação capturado antes da transferência. Não é aplicado a menos que seja necessária uma operação de recuperação explícita.
nameservers_preservedboolean
dns_migrationstring
continuityobject

Exemplo

curl -X POST https://domani.run/api/domains/transfer \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"domain": "mysite.com", "auth_code": "EPP-AUTH-CODE"}'
POST/api/domains/{domain}/renew

Renovar um domínio

Renove um domínio que você possui por mais anos (1 a 10). O pagamento é cobrado antecipadamente. A nova data de expiração é retornada na resposta. Quando o registrador do domínio recusa a renovação (renovado nos últimos 30 dias, ou um prazo que ele não vende), a solicitação falha com 400 RENEWAL_NOT_ELIGIBLE antes de qualquer cobrança. O preço é renewal_price de GET /api/domains/{domain} vezes years: envie esse total como max_price para que uma mudança de preço falhe antes de qualquer cobrança.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

yearsintegerNúmero de anos para renovar (padrão 1)
payment_methodstring(card | usdc | balance)Forma de pagamento: 'card' (padrão), 'usdc' ou 'balance' (crédito no marketplace).
payment_txstringHash de transação de um pagamento em USDC já enviado na rede.
payment_chainstring(base | ethereum)Cadeia em que o pagamento em USDC foi enviado.
max_pricenumberTeto em dólares americanos para a cobrança de renovação. Se o preço real exceder esse valor, a solicitação falhará com 400 PRICE_ABOVE_MAX e nada será cobrado. O campo `price` do erro é o total a aceitar; confirme-o com o usuário antes de tentar novamente com esse max_price.

Resposta 200

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

Exemplo

curl -X POST https://domani.run/api/domains/mysite.com/renew \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"years": 1}'
POST/api/domains/{domain}/buy-aftermarket

Compre um domínio mercado secundário

Compre um domínio já registrado que esteja listado para venda em um mercado secundário (Afternic / Sedo) pelo preço de compra agora, através da Domani. O preço de listagem é verificado novamente em tempo real antes da cobrança; passe max_price para limitar o que você pagará. Listagens somente para fazer ofertas não podem ser compradas aqui - use o corretor (POST /api/broker) para negociar um preço. O pagamento funciona como um cadastro: cartão, USDC on Base (x402) ou saldo do marketplace. Requer o escopo domains:transfer. Em caso de sucesso, o domínio chega à sua conta (status: active ou provisioning enquanto uma transferência gradual é finalizada).

Parâmetros

domain*stringO domínio listado no mercado secundário para comprar

Solicitar corpo

max_pricenumberTeto de preço rígido em dólares americanos. O padrão é o preço de compra imediata da listagem; a compra é rejeitada se o preço ao vivo exceder esse valor.
payment_methodstring(card | usdc | balance)Forma de pagamento: 'card' (padrão), 'usdc' ou 'balance' (crédito no marketplace).
payment_txstringHash de transação de um pagamento em USDC já enviado na rede.
payment_chainstring(base | ethereum)Cadeia em que o pagamento em USDC foi enviado.

Resposta 201

domainstring
statusstring'active' quando a compra for concluída ou 'provisioning' enquanto uma transferência gradual é finalizada.
pricenumber
currencystring
payment_methodstring
payment_txstring
marketplacestringmercado secundário em que o domínio foi comprado (por exemplo, 'Afternic', 'Sedo').
hintstring
next_stepsstring[]

Exemplo

curl -X POST https://domani.run/api/domains/coolname.com/buy-aftermarket \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{}'

DNS

GET/api/domains/{domain}/dns

Obtenha registros DNS para um domínio que você possui

Retorna todos os registros DNS configurados para um domínio que você possui (A, AAAA, CNAME, MX, TXT, NS, ...), cada um com um id estável, mais um token zone_version (também enviado como cabeçalho ETag). Passe zone_version de volta em PUT para detectar alterações simultâneas de zona.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
recordsDnsRecord[]
zone_versionstringToken de simultaneidade otimista para toda a zona. Passe-o de volta em PUT (body zone_version ou cabeçalho If-Match) para falhar com 409 DNS_VERSION_CONFLICT em vez de derrotar uma alteração simultânea.

Resposta de exemplo

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

Exemplo

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

Defina registros DNS para um domínio que você possui

Upserts registros DNS no nível rrset: para cada (tipo, nome) presente na carga útil, os registros existentes naquele (tipo, nome) são substituídos pelos que você envia; rrsets NÃO mencionados na carga útil são preservados e os registros NS nunca são tocados. Um backup automático da zona no lado do servidor é feito antes de cada gravação. Simultaneidade: passe o zone_version de um GET anterior (campo corporal ou cabeçalho If-Match). Se a zona mudou desde então, a gravação falha com 409 DNS_VERSION_CONFLICT e retorna os registros atuais + versão para que você possa mesclar novamente e tentar novamente. Roteamento de e-mail: uma mudança no destino para onde o e-mail do domínio é entregue (seus registros MX ou NS, os registros de endereço pelos quais um host MX dentro da zona é resolvido, ou os de um host que recebe e-mail do Domani e não publica nenhum MX) requer o escopo email:auth_secrets, pois quem recebe o e-mail recebe os códigos de login dele. Sem ele, a solicitação responde 403 INSUFFICIENT_SCOPE antes de qualquer mudança, e um token confinado a caixas de correio responde 403 MAILBOX_CONFINED mesmo com ele. Os demais registros exigem apenas domains:write. Toda mudança de roteamento é registrada no log de auditoria.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

records*DnsRecord[]
zone_versionstringA zone_version de um GET anterior. Em caso de incompatibilidade, a gravação é rejeitada com 409 DNS_VERSION_CONFLICT (nada escrito). Recomendado sempre que outro ator possa editar a mesma zona.

Resposta 200

successboolean
domainstring
recordsDnsRecord[]

Resposta de exemplo

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

Exemplo

curl -X PUT https://domani.run/api/domains/mysite.com/dns \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"records": [
    {"type": "A", "name": "@", "value": "76.76.21.21", "ttl": 3600},
    {"type": "CNAME", "name": "www", "value": "cname.vercel-dns.com", "ttl": 3600}
  ]}'
GET/api/domains/{domain}/dnssec

Listar registros DNSSEC DS para um domínio que você possui

Retorna os registros de assinante de delegação (DS) DNSSEC publicados no registro de um domínio que você possui e se o DNSSEC está habilitado. Pares com registros TLSA (definidos por meio do endpoint DNS) para DANE.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
enabledbooleanVerdadeiro quando pelo menos um registro DS é publicado
recordsDsRecord[]

Resposta de exemplo

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

Exemplo

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

Publicar um registro DNSSEC DS (ativar DNSSEC)

Publica um registro DS (delegation-signer) no registro, habilitando DNSSEC para o domínio. Obtenha os valores DS do seu provedor de DNS/zona após assinar a zona.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

successboolean
domainstring
enabledboolean
recordsDsRecord[]

Exemplo

curl -X POST https://domani.run/api/domains/mysite.com/dnssec \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"keyTag": "12345", "algorithm": "13", "digestType": "2", "digest": "A1B2C3..."}'
DELETE/api/domains/{domain}/dnssec

Remover um registro DNSSEC DS (desativar DNSSEC)

Remove um registro DS (delegation-signer) no registro por sua tag de chave. A remoção de todos os registros DS desativa o DNSSEC do domínio.

Parâmetros

domain*stringNome de domínio que você possui
keyTag*stringTag-chave do registro DS a ser removida

Resposta 200

successboolean
domainstring
enabledboolean
recordsDsRecord[]

Exemplo

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

Capture um instantâneo de DNS

Captura todos os registros DNS de um domínio por meio de pesquisas de DNS público (Cloudflare DoH). Descobre subdomínios de logs de transparência de certificados, registros SPF e nomes comuns. O instantâneo também é armazenado no servidor como backup.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

extra_subdomainsstring[]Subdomínios adicionais para incluir no snapshot

Resposta 200

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

Resposta de exemplo

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

Exemplo

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

Restaurar DNS de um instantâneo

Aplica registros DNS de um instantâneo ao registrador atual do domínio. Usa um algoritmo diff para evitar a duplicação de registros já existentes. Se nenhum instantâneo for fornecido no corpo, restaura a partir do backup do lado do servidor (criado por instantâneo ou transferência). Roteamento de e-mail: uma mudança no destino para onde o e-mail do domínio é entregue (seus registros MX ou NS, os registros de endereço pelos quais um host MX dentro da zona é resolvido, ou os de um host que recebe e-mail do Domani e não publica nenhum MX) requer o escopo email:auth_secrets, pois quem recebe o e-mail recebe os códigos de login dele. Sem ele, a solicitação responde 403 INSUFFICIENT_SCOPE antes de qualquer mudança, e um token confinado a caixas de correio responde 403 MAILBOX_CONFINED mesmo com ele. Os demais registros exigem apenas domains:write. Toda mudança de roteamento é registrada no log de auditoria.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

snapshotobjectUm objeto de instantâneo DNS (conforme retornado pelo ponto final do instantâneo). Se omitido, o backup armazenado no servidor será usado.
dry_runbooleanSomente visualização: retorna o que a restauração criaria (would_apply) e pularia, sem escrever nada.

Resposta 200

domainstring
appliedintegerNúmero de registros criados
skippedintegerNúmero de registros já presentes
recordCountintegerTotal de registros no instantâneo
errorsstring[]
dry_runbooleanÉ verdade quando esta era uma prévia - nada foi escrito
would_applyDnsRecord[]Somente simulação: os registros que a restauração criaria

Resposta de exemplo

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

Exemplo

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

Clonar o DNS de outro domínio neste

Copia a configuração de DNS de um domínio de origem de sua propriedade para este domínio - útil para marcas com vários TLDs (brand.com → brand.dev) que compartilham o mesmo A/CNAME/MX. Mescla por padrão (os registros de origem vencem em qualquer colisão tipo+nome, os demais registros deste domínio são mantidos); defina replace: true para um espelho exato. Roteamento de e-mail: uma mudança no destino para onde o e-mail do domínio é entregue (seus registros MX ou NS, os registros de endereço pelos quais um host MX dentro da zona é resolvido, ou os de um host que recebe e-mail do Domani e não publica nenhum MX) requer o escopo email:auth_secrets, pois quem recebe o e-mail recebe os códigos de login dele. Sem ele, a solicitação responde 403 INSUFFICIENT_SCOPE antes de qualquer mudança, e um token confinado a caixas de correio responde 403 MAILBOX_CONFINED mesmo com ele. Os demais registros exigem apenas domains:write. Toda mudança de roteamento é registrada no log de auditoria.

Parâmetros

domain*stringDomínio de destino (DNS está escrito aqui)

Solicitar corpo

from*stringDomínio de origem para copiar o DNS (deve ser seu)
replacebooleanEspelho exato - elimina registros de destino que a origem não possui. Padrão: mesclar

Resposta 200

successboolean
from_domainstring
to_domainstring
recordsDnsRecord[]

Exemplo

curl -X POST https://domani.run/api/domains/brand.dev/dns/clone \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"from": "brand.com"}'
GET/api/domains/{domain}/nameservers

Obtenha servidores de nomes para um domínio

Retorna os servidores de nomes autorizados configurados para um domínio que você possui. Se estiver vazio, as operações de DNS (parking, email, conexão) falharão até que os servidores de nomes sejam atribuídos.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
nameserversstring[]
default_nameserversstring[]Os servidores de nomes a partir dos quais a zona do domínio é servida: o host de zona quando a Domani hospeda a zona lá; caso contrário, os padrões do registrador (null se desconhecidos)
dns_providerstringQuem responde pela zona do domínio: o DNS do próprio registrador, uma zona que a Domani hospeda na Cloudflare ou um provedor externo para um domínio importado
hintstring

Resposta de exemplo

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

Exemplo

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

Definir servidores de nomes para um domínio

Substitua os servidores de nomes por um domínio de sua propriedade. Requer de 2 a 13 nomes de host válidos. Valores comuns: OpenSRS DNS (ns1.systemdns.com, ns2.systemdns.com, ns3.systemdns.com). Os servidores de nomes decidem para onde vai todo o e-mail do domínio, incluindo os códigos de login: alterá-los requer o escopo email:auth_secrets e um token não confinado a caixas de correio (caso contrário, 403 INSUFFICIENT_SCOPE ou 403 MAILBOX_CONFINED), e toda alteração é registrada no log de auditoria.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

nameservers*string[]Nomes de host de servidores de nomes (de 2 a 13 obrigatórios)

Resposta 200

successboolean
domainstring
nameserversstring[]
hintstring

Resposta de exemplo

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

Exemplo

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

Conectar

POST/api/domains/{domain}/connect

Conecte um domínio a um provedor de hospedagem ou e-mail

Conecta um domínio a um provedor de hospedagem ou de e-mail detectando automaticamente o provedor a partir de um URL de destino ou aceitando um nome de provedor explícito. Para domínios gerenciados através da plataforma, os registros DNS são definidos automaticamente (status: dns_set). Para domínios importados (registrador externo), retorna os registros como instruções para adicionar manualmente em seu registrador (status: manual_setup_required, os registros têm status pending). Provedores de hospedagem suportados: vercel, netlify, cloudflare-pages, github-pages, railway, fly. Provedores de e-mail suportados: google-workspace, fastmail, proton. Use GET /api/domains/{domain}/connect para listar todos os provedores e métodos disponíveis. Roteamento de e-mail: uma mudança no destino para onde o e-mail do domínio é entregue (seus registros MX ou NS, os registros de endereço pelos quais um host MX dentro da zona é resolvido, ou os de um host que recebe e-mail do Domani e não publica nenhum MX) requer o escopo email:auth_secrets, pois quem recebe o e-mail recebe os códigos de login dele. Sem ele, a solicitação responde 403 INSUFFICIENT_SCOPE antes de qualquer mudança, e um token confinado a caixas de correio responde 403 MAILBOX_CONFINED mesmo com ele. Os demais registros exigem apenas domains:write. Toda mudança de roteamento é registrada no log de auditoria.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

targetstringURL de destino para detecção automática (por exemplo, my-app.vercel.app)
providerstringNome explícito do provedor (por exemplo, vercel, google-workspace)
methodstringMétodo de conexão se o provedor tiver vários (por exemplo, somente cname)
dry_runbooleanSomente visualização: retorna as diferenças (create/replace/already_set/keep) sem gravar nada.
confirm_replace_mxbooleanObrigatório quando a conexão substituiria os registros MX existentes que apontam para outro provedor (409 MX_REPLACEMENT_REQUIRES_CONFIRMATION caso contrário) - ela redireciona o email do domínio.

Resposta 200

domainstring
providerstring
categorystring
methodstring
recordsDnsRecord[]
docsstring (uri)
statusstringdns_set = registros gravados automaticamente. manual_setup_required = domínio importado, adicione registros em seu registrador. dry_run = apenas visualização, nada escrito.
hintstring
next_stepsstring[]Ações específicas do provedor a serem concluídas após a definição dos registros DNS
diffobjectSomente simulação: informa o que a gravação faria - create, replace (registros existentes que seriam removidos), already_set e keep (rrsets intocados).

Exemplo

curl -X POST https://domani.run/api/domains/mysite.com/connect \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"target": "my-app.vercel.app"}'
GET/api/domains/{domain}/connect

Listar provedores disponíveis para conectar um domínio

Retorna todos os provedores de hospedagem e e-mail suportados com seus métodos de conexão. Use isto para descobrir quais provedores estão disponíveis antes de chamar o POST.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

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

Verifique se uma conexão de provedor está funcionando

Executa a verificação do provedor para confirmar se os registros DNS foram propagados e se a conexão está ativa. Use após POST /api/domains/{domain}/connect para verificar.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

targetstringAlvo para detecção automática
providerstringNome do provedor
methodstringNome do método

Resposta 200

domainstring
providerstring
methodstring
verifiedboolean
messagestring
hintstring
next_stepsstring[]Etapas de solução de problemas específicas do provedor (somente quando verificado é falso)

Exemplo

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

Estado

GET/api/domains/{domain}/status

Verifique a integridade do domínio: DNS, SSL, email, expiração

Verifica a integridade de um domínio via DNS sobre HTTPS: registros A/AAAA/CNAME/MX/TXT/NS, status do certificado SSL, configuração de email e data de expiração. Suporta streaming SSE via Accept: text/event-stream - fechar a conexão cancela verificações de DNS/SSL em andamento no lado do servidor. Use isto após conectar-se para verificar a propagação do DNS.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

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

Resposta de exemplo

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

Exemplo

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

Verifique o serviço

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

Adicione registros DNS para verificar a propriedade do domínio de um serviço de terceiros

Adiciona os registros DNS corretos (TXT, CNAME) para provar a propriedade do domínio a um serviço de terceiros. Suporta Stripe, Google Search Console, AWS SES, Postmark, Resend, Facebook, HubSpot e Microsoft 365. Nomes de serviços desconhecidos voltam para um registro TXT genérico. Os registros são mesclados com o DNS existente - os registros existentes são preservados. Roteamento de e-mail: uma mudança no destino para onde o e-mail do domínio é entregue (seus registros MX ou NS, os registros de endereço pelos quais um host MX dentro da zona é resolvido, ou os de um host que recebe e-mail do Domani e não publica nenhum MX) requer o escopo email:auth_secrets, pois quem recebe o e-mail recebe os códigos de login dele. Sem ele, a solicitação responde 403 INSUFFICIENT_SCOPE antes de qualquer mudança, e um token confinado a caixas de correio responde 403 MAILBOX_CONFINED mesmo com ele. Os demais registros exigem apenas domains:write. Toda mudança de roteamento é registrada no log de auditoria.

Parâmetros

domain*stringNome de domínio que você possui

Solicitar corpo

service*stringNome do serviço (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365)
token*stringToken de verificação fornecido pelo serviço

Resposta 200

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

Resposta de exemplo

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

Exemplo

curl -X POST https://domani.run/api/domains/mysite.com/verify-service \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"service": "stripe", "token": "abc123def456"}'
GET/api/domains/{domain}/verify-service

Listar serviços suportados para verificação de domínio

Retorna todos os serviços conhecidos com seus nomes, descrições e URLs de documentação. Serviços desconhecidos recorrem a um registro TXT genérico.

Parâmetros

domain*stringNome de domínio que você possui

Resposta 200

domainstring
servicesobject[]
hintstring

Descoberta

GET/api/domains/{domain}/profilePúblico

Obtenha um perfil de domínio público

Retorna o mais recente dossiê público com segurança de privacidade e respaldado por evidências para um domínio. Este endpoint nunca retorna observações ocultas ou detalhes de contato de registro brutos.

Parâmetros

domain*string

Resposta 200

profilePublicDomainProfile
POST/api/domains/{domain}/profilePúblico

Pesquise ou atualize um perfil de domínio público

Executa uma análise limitada usando registro público, DNS, site ativo, dados estruturados e fontes de arquivo e, em seguida, armazena o perfil de privacidade seguro para a página pública canônica. A profundidade instantânea é usada para uma primeira renderização rápida; profundo é o padrão e adiciona pesquisa histórica.

Parâmetros

domain*string
depthstring(instant | deep)Profundidade da pesquisa. O padrão é profundo.

Resposta 201

profilePublicDomainProfile
GET/api/domains/whoisPúblico

Procure dados de registro de domínio via RDAP

Consulta a rede RDAP (Registration Data Access Protocol) em busca de dados de registro de domínio. Retorna registrador, datas de criação/expiração/atualização, dias até a expiração, códigos de status, servidores de nomes, status DNSSEC e informações de contato (registrante, administrador, técnico, cobrança, abuso). Funciona para qualquer domínio - não é necessária propriedade. RDAP é o substituto moderno e nativo de JSON para WHOIS. Retorna ao WHOIS (porta 43) para TLDs sem RDAP e complementa o RDAP com dados de referência do WHOIS quando faltam contatos (comum pós-GDPR). As informações de contato podem ser parcial ou totalmente ocultas devido ao GDPR ou aos serviços de proteção de privacidade. Endpoint público - não é necessária autenticação. As solicitações autenticadas obtêm limites de taxa mais altos (30/min vs 10/min).

Parâmetros

q*stringDomínio a ser pesquisado (por exemplo, example.com)

Resposta 200

domainstring
registeredbooleanSe o domínio está atualmente registrado
registrarstring | nullNome do registrador atual
registrar_urlstring | nullURL do site do registrador
registrar_iana_idstring | nullID da IANA do registrador (de RDAP publicIds)
createdstring | nullData de registro (YYYY-MM-DD)
expiresstring | nullData de validade (YYYY-MM-DD)
updatedstring | nullData da última atualização (YYYY-MM-DD)
days_until_expiryinteger | nullDias até o vencimento (nulo se não registrado)
statusstring[]Códigos de status EPP
nameserversstring[]Servidores de nomes autorizados
dnssecbooleanSe o DNSSEC está ativado
redactedbooleanSe os dados WHOIS/RDAP são ocultos para fins de privacidade (GDPR)
contactsobjectInformações de contato por função (nulas quando não há dados disponíveis, os campos podem ser nulos quando ocultos)

Exemplo

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

Obtenha metadados de visualização do site para um domínio

Retorna metadados do Open Graph (título, descrição, imagem, favicon) para um domínio. Os dados são buscados sob demanda e armazenados em cache por 7 dias. A primeira solicitação de um domínio pode levar de 1 a 5 segundos (busca ao vivo); as solicitações subsequentes são instantâneas (acerto no cache). Retorna campos nulos se o site estiver inacessível ou não tiver tags OG. Endpoint público - não é necessária autenticação.

Parâmetros

domain*stringDomínio para buscar metadados (por exemplo, google.com)

Resposta 200

titlestring | nullTítulo da página (og:title > twitter:title > <title>)
descriptionstring | nullDescrição da página (og:description > meta descrição)
imagestring | nullURL da imagem OG (absoluta)
faviconstring | nullURL do favicon (absoluto)

Exemplo

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

Faturamento

POST/api/billing/setup

Obtenha um URL para adicionar uma forma de pagamento

Sempre retorna tanto um url do Stripe Checkout quanto um client_secret do SetupIntent para adicionar um cartão de crédito. Um agente que não pode executar o Stripe.js deve abrir url em um navegador e dizer ao usuário para adicionar o cartão lá; um frontend que incorpora o Stripe Elements diretamente (como o painel do Domani) usa client_secret em vez disso. Isso é necessário antes de comprar domínios com cartão. Depois que o usuário conclui o checkout, ele é redirecionado de volta ao painel.

Solicitar corpo

modestring(setup_intent | checkout)Obsoleto: tanto `url` quanto `client_secret` são sempre retornados independentemente deste valor. Mantido por compatibilidade com versões anteriores.

Resposta 200

urlstring (uri)URL do Stripe Checkout - abra-o em um navegador para adicionar um cartão
client_secretstringSegredo do cliente Stripe SetupIntent, para um frontend que usa o Stripe.js diretamente
hintstringOrientação para os próximos passos

Resposta de exemplo

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

Exemplo

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

Remover forma de pagamento salva

Desanexa o cartão de crédito salvo do usuário da conta. Após a remoção, um novo cartão deve ser adicionado antes da compra de domínios.

Resposta 200

removedboolean

Resposta de exemplo

{
  "removed": true
}

Exemplo

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

Obtenha o status de pagamento do mercado

Retorna o status de integração do vendedor no Stripe Connect e o saldo disponível no marketplace. payouts_enabled é verdadeiro quando a integração é concluída e o vendedor pode receber pagamentos bancários.

Resposta 200

onboardedbooleanO vendedor enviou detalhes de integração do Connect
payouts_enabledbooleanOs pagamentos bancários estão ativos
details_submittedboolean
balance_centsintegerSaldo disponível no mercado em centavos

Resposta de exemplo

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

Exemplo

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

Iniciar a integração de pagamentos bancários

Cria (ou retoma) a integração do Stripe Connect Express para um vendedor do marketplace e retorna um URL de integração hospedado para redirecionar o usuário. Obrigatório antes que um vendedor possa sacar ganhos para seu banco.

Resposta 200

urlstring (uri)URL de integração hospedado pelo Stripe

Resposta de exemplo

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

Exemplo

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

Retirar saldo do mercado para o banco

Transfere todo o saldo disponível no mercado do vendedor para sua conta bancária conectada. Requer integração de pagamento concluída (POST /api/billing/connect). O saldo é reservado antes da transferência e restaurado em caso de falha, para que uma falha nunca perca fundos.

Resposta 200

amount_centsintegerValor transferido em centavos
transfer_idstringID de transferência do Stripe

Resposta de exemplo

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

Exemplo

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

Listar faturas de pagamento

Retorna uma lista de faturas pagas com número da fatura, valor, data e links para visualizar ou baixar o PDF. As faturas são geradas automaticamente para cada compra, renovação e transferência de domínio.

Parâmetros

limitintegerMáximo de faturas a serem devolvidas

Resposta 200

invoicesobject[]
has_moreboolean
hintstring

Exemplo

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

Referências

GET/api/referrals

Obtenha ganhos e histórico de referências

Retorna seu código de indicação exclusivo, taxa de comissão (20%), detalhamento de ganhos (total, pago, pendente) e um histórico de todas as compras indicadas. Compartilhe seu código de referência com outras pessoas - quando elas se registram com seu código (por meio do parâmetro ref), você ganha automaticamente uma comissão sobre todas as futuras compras de domínio.

Resposta 200

referral_codestringSeu código de referência exclusivo para compartilhar
referral_rateintegerPorcentagem de comissão (atualmente 20%)
total_earned_centsintegerGanhos totais em centavos
total_paid_centsintegerTotal pago em centavos
total_pending_centsintegerPagamento pendente em centavos
referralsobject[]

Resposta de exemplo

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

Exemplo

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

Reservas pendentes

POST/api/backorders

Faça um reserva em um domínio já registrado

Monitora um domínio registrado para outra pessoa e tenta registrá-lo automaticamente para você quando ficar disponível. A disponibilidade é verificada a cada poucos minutos para agir rapidamente após a liberação. Você só é cobrado se o registro for concluído, sem pagamento antecipado. Um limite protege contra aumentos no preço de registro antes da liberação. Requer um método de pagamento salvo (cartão) ou payment_method: "balance" para pagar o registro se ele for concluído. Sem garantia de sucesso: um serviço especializado pode registrar primeiro um domínio disputado.

Solicitar corpo

domain*stringDomínio atualmente registrado que será monitorado para tentar registrá-lo quando for liberado.
max_pricenumberValor máximo em USD que você pagará para registrá-lo. O padrão é o preço de registro atual. Deve ser >= ao preço atual.
payment_methodstring(card | balance)Método de pagamento usado se o registro for concluído. O padrão é seu método preferido.

Resposta 201

backorderBackorder
hintstring

Exemplo

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

Liste seus reservas

Retorna seus backorders do mais recente ao mais antigo. Filtre por status (watching, caught, failed, cancelled, expired).

Parâmetros

statusstring(watching | caught | failed | cancelled | expired)Filtre por status.

Resposta 200

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

Obter um reserva

Parâmetros

id*stringID do reserva.

Resposta 200

backorderBackorder
DELETE/api/backorders/{id}

Cancelar um reserva

Para de monitorar um domínio. Somente reservas no estado watching podem ser cancelados.

Parâmetros

id*stringID do reserva.

Resposta 200

idstring
statusstring
hintstring

Mercado

POST/api/domains/sell

Anuncie um domínio para venda (mercado aberto)

Anuncie qualquer domínio para venda no marketplace Domani, inclusive domínios de outros registradores. Domínios já presentes na sua conta Domani são verificados automaticamente e anunciados de imediato (status active). Domínios externos exigem verificação de propriedade por TXT (status pending_verification). Taxas: comissão de 10% da plataforma sobre vendas concluídas. Requer o escopo deals:write.

Solicitar corpo

domain*stringNome de domínio para listar para venda
price*numberPreço de venda em USD
descriptionstringDescrição opcional da listagem

Resposta 201

listingobject
txt_recordobject | nullRegistro TXT a ser adicionado para verificação de propriedade (somente para domínios externos)
hintstring
POST/api/domains/sell/verify

Verifique a propriedade do TXT para listagem externa

Verifique se o registro de propriedade TXT foi adicionado a uma listagem de domínio externo. Em caso de sucesso, o status da listagem muda de pending_verification para active e se torna comprável. Requer o escopo deals:write.

Solicitar corpo

domain*stringNome de domínio para verificar

Resposta 200

listingobject
hintstring
GET/api/domains/sell/status

Verifique a listagem e o status da transação

Verifique o status de uma listagem de domínio e qualquer transação ativo. Retorna detalhes da listagem, status do pipeline de transações e dicas contextuais. Requer escopo deals:read.

Parâmetros

domain*stringNome de domínio para verificar

Resposta 200

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

Liste suas transações

Liste as transações do mercado onde você é o comprador ou vendedor. Filtre por função ou status. Requer escopo deals:read.

Parâmetros

rolestring(buyer | seller)Filtrar por função
statusstring(active | escrow_held | epp_pending | transfer_started | completed | refunded | expired)Filtrar por status ('active' = todos não terminais)
domainstringFiltrar por nome de domínio
limitintegerNúmero de transações a serem retornados (padrão 50, máximo 100)
cursorstringCursor de paginação de uma resposta anterior

Resposta 200

dealsobject[]
has_morebooleanSe mais resultados estão disponíveis
next_cursorstring | nullCursor para a próxima página
POST/api/deals

Comprar um domínio externo (criar transação)

Crie uma transação de garantia para comprar um domínio listado no mercado. O pagamento do comprador é mantido em depósito em garantia até que a transferência do domínio seja concluída. O vendedor é notificado e tem 7 dias para fornecer o código EPP/auth. Requer escopo domains:transfer.

Solicitar corpo

domain*stringNome de domínio para comprar
payment_methodstring(card | usdc | balance)Forma de pagamento: 'card' (padrão), 'usdc' ou 'balance' (crédito no marketplace).

Resposta 201

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

Obtenha detalhes da transação com cronograma

Obtenha todos os detalhes de uma transação, incluindo a composição do preço, os prazos e a linha do tempo dos eventos. Tanto o comprador quanto o vendedor podem acessar suas transações. Requer o escopo deals:read.

Parâmetros

id*stringID da transação

Resposta 200

dealobject
hintstring
PATCH/api/deals/{id}

Forneça EPP/código de autenticação (vendedor)

O vendedor fornece o código EPP/autorização para iniciar a transferência do domínio. O código é criptografado em repouso e usado para iniciar a transferência do registrador. Máximo de 3 tentativas. Requer o escopo deals:write.

Parâmetros

id*stringID da transação

Solicitar corpo

auth_code*stringCódigo EPP/autorização do registrador atual

Resposta 200

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

Obtenha um recibo/extrato da transação

Retorna uma fatura com reconhecimento de função para uma transação de mercado. Os compradores recebem um recibo de compra; os vendedores recebem um extrato mostrando a venda, a linha de comissão da plataforma e o pagamento líquido. Funciona para todos os métodos de pagamento (cartão/USDC/saldo). Requer escopo deals:read.

Parâmetros

id*string

Resposta 200

invoiceDealInvoice
GET/api/negotiations

Liste suas negociações

Lista as negociações de preços nas quais você é o comprador ou vendedor. As contrapartes são anônimas (apenas funções). Requer escopo deals:read.

Parâmetros

rolestring(buyer | seller)Filtre por sua função
statusstringFiltrar por status (open|agreed|completed|declined|expired|cancelled|all)

Resposta 200

negotiationsNegotiation[]
POST/api/negotiations

Faça uma oferta em uma listagem

Abre uma negociação anônima de preço em um domínio listado ativamente com uma oferta inicial. O vendedor pode contestar, aceitar ou recusar. Após a aceitação, o comprador finaliza o pagamento e um negócio é criado pelo preço acordado. Requer o escopo deals:write.

Solicitar corpo

domain*stringO domínio listado para negociar
offer*numberOferta inicial em dólares americanos
messagestringMensagem opcional para o vendedor

Resposta 201

negotiationNegotiation

Exemplo

curl -X POST https://domani.run/api/negotiations \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"domain":"example.com","offer":500}'
GET/api/negotiations/{id}

Obtenha um tópico de negociação

Retorna uma negociação com seu tópico de oferta completo, anonimizado (as ofertas são rotuladas como 'you' ou 'counterparty'). Requer escopo deals:read.

Parâmetros

id*string

Resposta 200

negotiationNegotiation
POST/api/negotiations/{id}

fazer uma contraproposta, aceitar ou recusar

Responda à oferta atual na mesa quando chegar a sua vez. counter requer um novo valor; accept bloqueia o preço no valor atualmente na mesa; decline encerra a negociação. Requer o escopo deals:write.

Parâmetros

id*string

Solicitar corpo

action*string(counter | accept | decline)
counternumberNovo valor em USD (obrigatório quando action=counter)
messagestring

Resposta 200

negotiationNegotiation
DELETE/api/negotiations/{id}

Retirar uma negociação

O comprador desiste de uma negociação aberta ou acordada. Requer o escopo deals:write.

Parâmetros

id*string

Resposta 200

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

Finalizar uma negociação acordada (pagamento)

O comprador paga o preço acordado para criar a transação de garantia e, em seguida, o fluxo de transferência padrão é executado. Aceita os mesmos métodos de pagamento de uma compra no marketplace (cartão, USDC, x402). Retorna 402 com instruções de pagamento se nenhum pagamento for fornecido. Para uma aquisição proveniente de um corretor, se o preço acordado estiver acima do max_budget que você definiu, retorna 409 BUDGET_EXCEEDED - reenvie com confirm_over_budget: true para prosseguir. Requer escopo domains:transfer.

Parâmetros

id*string

Solicitar corpo

payment_methodstring(card | usdc | balance)
payment_signaturestring | null
payment_txstring
payment_chainstring
confirm_over_budgetbooleanPara transações intermediadas: prossiga mesmo que o preço acordado exceda o max_budget que você definiu.
GET/api/broker

Liste suas solicitações de corretor

Lista suas solicitações de aquisição de domínio e seu status. Requer escopo deals:read.

Parâmetros

statusstringFiltrar por status ou 'all'

Resposta 200

requestsBrokerRequest[]
POST/api/broker

Solicitar aquisição de um domínio já registrado

Peça ao domani para adquirir em seu nome um domínio específico já registrado e fora de venda. Os agentes localizam o proprietário via RDAP, entram em contato anonimamente e negociam - apenas por comissão, sem taxa inicial. O interesse do proprietário abre uma negociação anônima. Observação: muitos proprietários não podem ser contatados (WHOIS oculto pelo GDPR); nesse caso, a solicitação termina como no_contact. Requer o escopo deals:write.

Solicitar corpo

domain*stringO domínio já registrado que você deseja
max_budgetnumberSeu teto em USD (opcional)

Resposta 201

requestBrokerRequest

Exemplo

curl -X POST https://domani.run/api/broker \
  -H "Authorization: Bearer domani_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{"domain":"dream.com","max_budget":5000}'
GET/api/broker/{id}

Obtenha uma solicitação de corretor

Retorna uma de suas solicitações de corretor. Requer escopo deals:read.

Parâmetros

id*string

Resposta 200

requestBrokerRequest
DELETE/api/broker/{id}

Cancelar uma solicitação de corretor

Cancela uma solicitação de aquisição de domínio ativa. Requer o escopo deals:write.

Parâmetros

id*string

Resposta 200

cancelledboolean
GET/api/broker/respondPúblico

Leia o estado de uma consulta do corretor (lado do proprietário)

O caminho de leitura do agente-proprietário: pesquise o estado atual e anônimo de uma consulta com seu token antes de agir. Retorna o domínio, a oferta do comprador na mesa, de quem é a jogada e as ações disponíveis no momento. Nunca expõe a identidade ou orçamento do comprador. Autorizado por token.

Parâmetros

token*stringO token de divulgação do seu e-mail de consulta.

Resposta 200

domainstring
statusstring
your_turnbooleanQuer seja a mudança do proprietário.
current_offer_usdnumber | nullA oferta do comprador na mesa.
agreed_price_usdnumber | null
actionsstring[]Ações disponíveis agora (subconjunto de offer/counter/accept/decline/opt_out).

Exemplo

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

Responder a uma consulta do corretor (lado do proprietário)

O caminho proprietário-agente: responda à consulta de aquisição de um corretor usando o token do e-mail de divulgação entregue em sua caixa de entrada - a alternativa totalmente autônoma à resposta por e-mail ou clicando no link de reivindicação humana. offer/counter abrir ou avançar uma negociação anônima pelo preço pedido; decline e opt_out encerram. Autorizado por token (o token é o recurso) - nenhuma conta ou escopo é necessário.

Solicitar corpo

token*stringO token de divulgação do seu e-mail de consulta (a resposta é corretor+<token>@).
action*string(offer | counter | accept | decline | opt_out)offer/counter para indicar um preço; accept para aceitar a oferta atual do comprador; decline para recusá-la; opt_out para não receber mais contatos.
pricenumberSeu preço pedido em dólares americanos (obrigatório para oferta/balcão).

Resposta 200

handledboolean
outcomestringValores de status: opted_out | declined | negotiation_opened | countered | ignored_not_your_turn | unclear
statusstring
negotiation_idstring
domainstring

Exemplo

curl -X POST https://domani.run/api/broker/respond \
  -H "Content-Type: application/json" \
  -d '{"token":"<from your inbox>","action":"offer","price":800}'

Auth

POST/api/oauth/register

Registrar um cliente OAuth (RFC 7591)

Registro dinâmico de clientes para clientes MCP compatíveis com OAuth (conectores Claude.ai, ChatGPT e Grok Bot). Registro aberto: por si só não concede nada - toda autorização ainda passa pela tela de consentimento do usuário. Clientes públicos (token_endpoint_auth_method=none) devem usar PKCE S256. Descoberta: /.well-known/oauth-authorization-server.

Solicitar corpo

redirect_uris*string[]URIs de redirecionamento exatos (https, http em loopback ou um esquema personalizado nativo)
client_namestringExibido na tela de consentimento
token_endpoint_auth_methodstring(none | client_secret_post | client_secret_basic)
client_uristring
logo_uristring

Resposta 201

client_idstring
client_namestring
redirect_urisstring[]
token_endpoint_auth_methodstring
grant_typesstring[]
response_typesstring[]
client_id_issued_atinteger
client_secretstringSomente para clientes confidenciais; retornado uma vez
POST/api/oauth/token

Endpoint de token OAuth

Troque um código de autorização (com o code_verifier do PKCE) por um token de acesso, ou faça a rotação com grant_type=refresh_token. Os tokens de acesso são tokens comuns da API domani que carregam os escopos aprovados e o confinamento de caixa de correio. Os códigos são de uso único; os tokens de atualização são rotacionados a cada uso.

Resposta 200

access_tokenstring
token_typestring
expires_ininteger
refresh_tokenstring
scopestring