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.
| Escopo | Concede acesso a |
|---|---|
| domains:read | GET /api/domains, GET /api/domains/{domain}, GET /api/domains/{domain}/dns, /dnssec, /status, /email/check, /auth-code, /transfer-away, /transfer-status, /analytics |
| domains:write | PUT /api/domains/{domain}/dns, POST/DELETE /api/domains/{domain}/dnssec, POST /connect, POST /verify, PUT /settings, PUT /parking, PUT/DELETE /api/domains/{domain}/for-sale, POST /api/domains/import, POST /import/verify |
| domains:transfer | POST /api/domains/buy, POST /transfer, POST /renew (envolve pagamento, inclui compras no mercado) |
| 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 | Exclua 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_mailboxes | Cria 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_secrets | Leia 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:read | GET /api/me, GET /api/agents/identity |
| account:write | DELETE /api/me, POST /api/billing/setup, POST /api/billing/subscribe, POST /api/billing/cancel, POST /api/me/resend-verification, POST/PATCH/DELETE /api/agents/identity |
| billing:read | GET /api/billing/invoices |
| search | GET /api/domains/search, /suggest, /whois, /dns-check, GET /api/tlds |
| deals:read | GET /api/deals, GET /api/deals/{id} |
| deals:write | POST /api/domains/sell, PATCH /api/deals/{id} |
| notifications:read | GET /api/notifications, GET /api/notifications/count |
| backorders:read | GET /api/backorders, GET /api/backorders/{id} |
| backorders:write | POST /api/backorders, DELETE /api/backorders/{id} |
| assistant:read | Read Mailzero assistant settings, the Today queue, Work items, exact action previews, history-import progress, and content-minimized Activity |
| assistant:write | Change Mailzero assistant settings, record consent and start history imports, record human Decisions on Work items, retry imports, and export or delete derived assistant data. Never sends mail |
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_AUTHOs 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ódigo | HTTP |
|---|---|
| MISSING_API_KEY | 401 |
| INVALID_API_KEY | 401 |
| EXPIRED_API_KEY | 401 |
| MISSING_PARAMETER | 400 |
| INVALID_DOMAIN | 400 |
| PAYMENT_REQUIRED | 402 |
| DOMAIN_UNAVAILABLE | 409 |
| RATE_LIMIT_EXCEEDED | 429 |
| USER_EXISTS | 409 |
| NOT_FOUND | 404 |
| UNKNOWN_PROVIDER | 400 |
| UNKNOWN_METHOD | 400 |
| TARGET_REQUIRED | 400 |
| INVALID_PARAMETER | 400 |
| CONTACT_REQUIRED | 400 |
| INVALID_CONTACT | 400 |
| INSUFFICIENT_SCOPE | 403 |
| SCOPE_ESCALATION | 400 |
| MAILBOX_CONFINED | 400 |
| DOMAIN_EXISTS | 400 |
| DOMAIN_NOT_ACTIVE | 400 |
| UNSUPPORTED_TLD | 400 |
| TLD_NOT_IN_PUBLIC_DNS | 400 |
| NOT_AVAILABLE | 400 |
| ALREADY_REGISTERED | 400 |
| TRANSFER_NOT_ELIGIBLE | 400 |
| RENEWAL_NOT_ELIGIBLE | 400 |
| ALREADY_LISTED | 400 |
| LISTING_SOLD | 400 |
| SELF_PURCHASE | 400 |
| DESCRIPTION_TOO_LONG | 400 |
| DEAL_NOT_FOUND | 400 |
| INVALID_DEAL_STATE | 400 |
| EPP_ATTEMPTS_EXCEEDED | 400 |
| ACTIVE_DEAL_EXISTS | 400 |
| AGENT_IDENTITY_NOT_FOUND | 400 |
| AGENT_IDENTITY_ESCALATION | 400 |
| AGENT_MAILBOXES_REQUIRED | 400 |
| CREDENTIAL_REVOKE_FAILED | 400 |
| INVALID_IDEMPOTENCY_KEY | 400 |
| IDEMPOTENCY_KEY_MISMATCH | 400 |
| IDEMPOTENCY_KEY_REUSED | 400 |
| OPERATION_IN_PROGRESS | 400 |
| OPERATION_SUPERSEDED | 400 |
| INVALID_OPERATION_RECEIPT | 400 |
| WORKSPACE_ADMIN_REQUIRED | 400 |
| WORKSPACE_OWNER_REQUIRED | 400 |
| PRINCIPAL_NOT_IN_WORKSPACE | 400 |
| MAILBOX_NOT_IN_WORKSPACE | 400 |
| GROUP_NOT_IN_WORKSPACE | 400 |
| COLLECTION_NOT_IN_WORKSPACE | 400 |
| ACCESS_VERSION_CONFLICT | 400 |
| ACCESS_OFFER_INVALID | 400 |
| ACCESS_OFFER_EMAIL_MISMATCH | 400 |
| MAIL_DOMAIN_CAPACITY_EXHAUSTED | 400 |
| MAIL_PROVIDER_ERROR | 400 |
| INVALID_HTTP_ROUTE_HOSTNAME | 400 |
| INVALID_HTTP_ROUTE_UPSTREAM | 400 |
| INVALID_HTTP_ROUTE_UPSTREAM_HEADERS | 400 |
| INVALID_HTTP_ROUTE_LEASE | 400 |
| INVALID_HTTP_ROUTE_POLICY | 400 |
| INVALID_HOSTNAME_BINDING | 400 |
| HTTP_ROUTE_HOSTNAME_NOT_ALLOWED | 400 |
| HTTP_ROUTE_HOSTNAME_REQUIRED | 400 |
| HTTP_ROUTE_HOSTNAME_RESERVED | 400 |
| HTTP_ROUTE_HOSTNAME_UNAVAILABLE | 400 |
| HTTP_ROUTE_CONCURRENCY_LIMIT | 400 |
| HTTP_ROUTE_WORKSPACE_LIMIT | 400 |
| HTTP_ROUTE_DOMAIN_NOT_OWNED | 400 |
| HTTP_ROUTE_TERMINAL | 400 |
| HTTP_ROUTE_VERIFICATION_NOT_ENABLED | 400 |
| HTTP_ROUTE_VERIFICATION_REQUIRES_HTTPS | 400 |
| HTTP_ROUTE_POLICY_WITHOUT_SCOPE | 400 |
| HTTP_ROUTE_POLICY_REQUIRED | 400 |
| HTTP_ROUTE_AGENT_IDENTITY_REQUIRED | 400 |
| HTTP_ROUTE_POLICY_ESCALATION | 400 |
| HOSTNAME_BINDING_NOT_ACTIVE | 400 |
| HOSTNAME_BINDING_DNS_CONFLICT | 400 |
| HOSTNAME_BINDING_ACK_REQUIRED | 400 |
| HOSTNAME_BINDING_BROWSER_MODE_MISMATCH | 400 |
| HOSTNAME_DNS_CONFLICT | 400 |
| ZONE_READ_FAILED | 400 |
| DNS_VERSION_CONFLICT | 400 |
| UNAUTHORIZED | 400 |
| APEX_WEB_MODE_CONFLICT | 400 |
| APEX_DELEGATION_ACK_REQUIRED | 400 |
| VERIFICATION_COOLDOWN | 400 |
| VERIFICATION_SEND_FAILED | 400 |
| UPGRADE_REQUIRED | 400 |
| FREE_LIMIT_EXCEEDED | 400 |
Limites de 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
/api/assistant/rulesListar 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
| rules | AssistantRule[] |
/api/assistant/rulesCriar 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
| id | string | |
| name | string | |
| enabled | boolean | |
| position | integer | |
| match | AssistantRuleMatch | |
| assignee | object | |
| level | string | |
| grants | AssistantGrants | |
| match_count | integer | |
| last_matched_at | string (date-time) | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/api/assistant/rules/{id}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
| id | string | |
| name | string | |
| enabled | boolean | |
| position | integer | |
| match | AssistantRuleMatch | |
| assignee | object | |
| level | string | |
| grants | AssistantGrants | |
| match_count | integer | |
| last_matched_at | string (date-time) | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/api/assistant/rules/{id}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
| deleted | boolean | |
| released_items | integer |
/api/assistant/rules/testTestar 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* | string | A chave do item de trabalho, por exemplo org:tucows:invoice |
| sender_address | string | null | |
| sender_kind | string(human | automated) | |
| subject | string | null | |
| labels | string[] | |
| occurrences | integer | |
| confidence | object | A probabilidade do classificador por etiqueta, para uma regra com minConfidence |
Resposta 200
| matched | boolean | |
| rule | AssistantRule | |
| why | string[] | |
| considered | integer |
/api/assistant/rules/{id}/checkTestar 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 | |
| matter | object | |
| at | string (date-time) | O instante para verificar o cronograma; agora por padrão |
| approved_by | string[] | IDs de membros que já aprovaram |
Resposta 200
| rule | object | |
| allowed_kinds | string[] | |
| effective_grants | AssistantGrants | |
| outcome | string | |
| check | AssistantGrantCheck | |
| hint | string |
/api/assistant/metricsLer 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_days | integer |
Resposta 200
| type | string | |
| as_of | string (date-time) | |
| window_days | integer | |
| account | AssistantTaskNumbers | |
| rules | object[] |
/api/assistant/approvalsListar 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
| type | string | |
| as_of | string (date-time) | |
| plans | object[] | |
| escalations | object[] |
/api/assistant/suggestionsListar 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
| status | string(open | accepted | dismissed) |
Resposta 200
| suggestions | AssistantSuggestion[] |
/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
| suggestion | AssistantSuggestion | |
| rule | AssistantRuleInput |
/api/assistant/grantsListar 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
| grants | AssistantAssigneeGrants[] |
/api/assistant/grantsDefinir 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* | string | O slug da identidade do agente, ou o id de usuário do membro |
| grants* | AssistantGrants |
Resposta 200
| assignee | object | |
| grants | AssistantGrants | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/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
| deleted | boolean |
/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* | string | O id do item de trabalho |
Resposta 200
| id | string | O id do item de trabalho |
| version | integer | |
| status | string | |
| deadline | string (date-time) | null | |
| you | object | |
| delegation | object | |
| lease | AssistantTaskLease | |
| brief | object | null | O resumo do assunto, conforme GET /api/assistant/work-items/{id}/brief responde |
| facts | object | null | Os fatos do assunto, conforme GET /api/assistant/work-items/{id}/facts responde |
| plans | object | |
| escalations | object[] | As perguntas feitas na tarefa, mais recentes primeiro, com suas respostas |
/api/assistant/tasks/{id}/leaseTomar 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_seconds | integer |
Resposta 200
| task_id | string | |
| lease | AssistantTaskLease |
/api/assistant/tasks/{id}/leaseDevolver 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_id | string | |
| released | boolean | |
| lease | AssistantTaskLease |
/api/assistant/tasks/{id}/effectsSolicitar 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 | |
| note | string | O que o destinatário quer que o proprietário saiba sobre esta solicitação |
Resposta 200
| task_id | string | |
| replayed | boolean | |
| plan | AssistantPlan | |
| execution | object | null | |
| lease | AssistantTaskLease | |
| hint | string |
/api/assistant/tasks/{id}/escalateParar 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 | |
| options | object[] | |
| evidence_refs | string[] |
Resposta 200
| task_id | string | |
| escalation_id | string | |
| decision_id | string | |
| status | string | |
| version | integer | |
| hint | string |
/api/assistant/tasks/{id}/reportRelatar 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_refs | string[] | |
| claims | object[] |
Resposta 200
| task_id | string | |
| outcome | string | |
| status | string | |
| reconciliation | object | |
| receipt_id | string | |
| hint | string |
/api/emails/{address}/messages/{id}/factsLeia 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* | string | ID da mensagem |
Resposta 200
| message_id | string | |
| thread_id | string | |
| analysed | boolean | |
| reason | string | Somente quando analysed é false |
| analysis | object | |
| facts | Fact[] | |
| entities | object[] | |
| commitments | object[] | |
| expectations | object[] |
/api/emails/{address}/messages/{id}/extractExtraia 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* | string | ID da mensagem |
Solicitar corpo
| schema* | object | Schema JSON dos campos a extrair: um objeto de primitivos, arrays e objetos aninhados, abaixo de 8 KB, sem $ref |
| instructions | string | Orientação opcional, por exemplo, valores em EUR |
Resposta 200
| message_id | string | |
| data | object | |
| confidence | number | |
| evidence_quotes | string[] | |
| model | string | |
| cached | boolean | |
| generated_at | string (date-time) | |
| usage | object |
/api/assistant/settingsObter 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
| enabled | boolean | |
| shadow_enabled | boolean | |
| paused | boolean | |
| mailbox_ids | string[] | |
| agent_mailbox_ids | string[] | Caixas operadas pelos seus agentes. Os itens delas aparecem na seção de agentes do Today em vez de em Needs you. |
| agents | object[] | Suas identidades de agente, para delegação. |
| search_opt_out_mailbox_ids | string[] | 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_ids | string[] | 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_days | integer | |
| privacy_route | string | |
| attachment_vision | boolean | |
| community_signals | boolean | Seus 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_version | string | |
| consent | object | |
| mailboxes | object[] |
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"
}
]
}/api/assistant/settingsAtualizar 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
| enabled | boolean | Mostrar Decisões do Today e gerar rascunhos sob demanda |
| shadow_enabled | boolean | Analisar e-mail sem exibir Decisões |
| paused | boolean | |
| mailbox_ids | string[] | IDs de caixas de correio próprias a processar; um array vazio desabilita tudo |
| agent_mailbox_ids | string[] | Caixas operadas pelos seus agentes. Os itens delas aparecem na seção de agentes do Today em vez de em Needs you. |
| history_window_days | integer | |
| attachment_vision | boolean |
Resposta 200
| ok | boolean | |
| enabled | boolean | |
| shadow_enabled | boolean | |
| paused | boolean | |
| mailbox_ids | string[] |
Resposta de exemplo
{
"ok": true,
"enabled": true,
"shadow_enabled": true,
"paused": false,
"mailbox_ids": [
"mbx_123"
]
}/api/assistant/previewConsentir 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_days | integer | |
| consent* | boolean(true) | |
| consent_version* | string(mailzero-personal-ai.v1) |
Resposta 200
| ok | boolean | |
| preview | object |
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"
}
}/api/assistant/backfillObter 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
| backfill | object | 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
}
}/api/assistant/backfillTentar 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
| ok | boolean | |
| retried | integer |
Resposta de exemplo
{
"ok": true,
"retried": 2
}/api/assistant/todayObter 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
| agent | string | Apenas 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. |
| category | string | Apenas 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. |
| tag | string | Somente 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
| type | string | |
| as_of | string | |
| projection_lag_ms | integer | |
| category | string | null | O tipo de assunto ao qual a visão está restrita (o parâmetro category), ou null para todos os tipos. |
| categories | object | Cada tipo de assunto presente na visão, antes do filtro, com quantos itens ele contém. |
| tag | string | null | A etiqueta à qual a visão está restrita (o parâmetro tag), ou null para todos os assuntos. |
| tags | object | Cada etiqueta da pessoa na visão, antes do filtro, com quantos assuntos a carregam. |
| sections | object |
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": []
}
}/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* | string | ID do item Work da fila Today |
Resposta 200
| id | string | |
| version | integer | |
| status | string | |
| title | string | |
| summary | string | |
| ask | string | null | A única coisa que o proprietário precisa fazer ou decidir, ou null. |
| category | string | null | O 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>. |
| tags | string[] | 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_tags | string[] | 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. |
| suspect | boolean | Os 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_reasons | string[] | 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). |
| sender | object | null | |
| recurrence | object | Quantas vezes essa mesma situação voltou: um item, N mensagens. |
| mailbox | object | |
| opened_at | string | null | |
| delegated_to | string | null | O slug do agente a quem o proprietário confiou este item, ou null. |
| delegation_rule | object | null | A delegação permanente que entregou este item, e por que correspondeu; suspensa assim que o proprietário retomou o item. |
| unread | boolean | Verdadeiro até que o proprietário abra o item após a última alteração. |
| messages | object[] | As mensagens de origem por trás deste item, da mais recente para a mais antiga. |
| history | object[] | O que já aconteceu neste assunto, do mais antigo para o mais recente: uma linha por mensagem anterior. |
| source | object | |
| attention | object | |
| analysis | object | |
| evidence_refs | string[] | |
| entity_refs | string[] | |
| snoozed_until | string | null | |
| decision | object | null | |
| plan | object | null |
/api/assistant/work-items/{id}/briefLer 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* | string | ID do item de Work |
| synthesis | boolean | Defina 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
| id | string | |
| version | integer | |
| generated_at | string (date-time) | |
| title | string | |
| summary | string | |
| ask | string | null | |
| mailbox | object | |
| delegated_to | string | null | |
| situation | object | |
| story | object[] | Cada email da situação, do mais antigo ao mais recente, com o título de uma linha que a análise atribuiu |
| facts | object[] | |
| entities | object[] | |
| commitments | object[] | Promessas abertas feitas pelo lado do proprietário |
| expectations | object[] | Coisas abertas aguardadas de outros |
| settled | object[] | Loops fechados e recibos, do mais recente ao mais antigo |
| awaiting | object[] | |
| decision | object | null | A Decisão preparada atual com suas opções |
| summary_source | string | Se o resumo é a leitura do modelo sobre as evidências ou a própria frase do pipeline |
| suggested_next | object | null | |
| open_questions | string[] | O que apenas o proprietário pode decidir antes da próxima ação, no máximo três perguntas |
| synthesis | object | null | A chamada do modelo que escreveu o resumo e a próxima ação, null quando o brief é apenas determinístico |
| evidence | object[] | |
| owner_replies | object[] | |
| evidence_refs | string[] |
/api/assistant/briefLer 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* | string | O endereço de email da pessoa |
| mailbox | string | Restringir a um endereço de caixa de correio (slug@domain) |
Resposta 200
| correspondent | string | |
| mailboxes | string[] | |
| brief | any | |
| related | object[] | |
| recent_mail | object[] | |
| generated_at | string (date-time) |
/api/assistant/work-items/{id}/factsLeia 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* | string | ID do item de Work |
Resposta 200
| work_item_id | string | |
| version | integer | |
| analysed | boolean | |
| analyses | object[] | |
| facts | Fact[] | |
| entities | object[] | |
| commitments | object[] | |
| expectations | object[] | |
| evidence_refs | string[] |
/api/assistant/work-items/{id}/openMarcar 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
| ok | boolean | |
| opened_at | string | |
| unread | boolean |
/api/assistant/learnedO 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
| mutes | object[] | Os silenciamentos em vigor, mais recentes primeiro. |
| suggestions | AssistantSuggestion[] | As regras silenciosas abertas: aceite uma através do endpoint de sugestões para definir o silenciamento que ela carrega. |
| tags | object[] | 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. |
/api/assistant/learned/mutesEsquecer 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* | string | O endereço, o domínio ou a chave de situação, como a visualização aprendida lista. |
Resposta 200
| ok | boolean | |
| kind | string | |
| value | string |
/api/assistant/learned/tagsEsquecer 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* | string | A etiqueta, como a visão learned a lista. |
Resposta 200
| ok | boolean | |
| name | string |
/api/assistant/work-items/{id}/investigateInvestigue 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_id | string | |
| source | string | Se a mensagem de origem foi lida, ou apenas o endereço do remetente. |
| checked_at | string | |
| sender | object | |
| links | object[] | |
| attachments | object[] | O que cada anexo realmente é, lido de seus primeiros bytes em comparação com o que seu nome e tipo declarado prometem. |
| signals | object[] | O que os fatos adicionam à avaliação, uma frase cada. |
/api/assistant/work-items/{id}/senderQuem 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_id | string | |
| sender | object | null | |
| organisation | object | null | Null para um domínio de email compartilhado ou um domínio nunca analisado. |
| participants | object[] | |
| relationship | object | |
| generated_at | string (date-time) |
/api/assistant/work-items/{id}/interactionsRegistrar 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
| scope | string(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. |
| verdict | string(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_id | string | Com type approve ou reject: o plano de ação em espera (proposto ou escalado). |
| reason | string | Com type reject: o motivo, mantido no plano. |
| type* | string(choose | instruct | take_over | snooze | ignore | correct | delegate | approve | reject | report | tag) | |
| add | string[] | 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. |
| remove | string[] | Com type tag: etiquetas para tirar do assunto (uma proposta nomeada aqui é recusada). A página learned esquece uma etiqueta de vez. |
| agent_slug | string | null | Com o tipo delegate: o slug do seu agente a quem confiar o item, ou null para retomá-lo. |
| member_id | string | null | Com 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_id | string | |
| decision_version | integer | |
| option_id | string | |
| instruction | string | |
| until | string (date-time) | |
| remind_at | string (date-time) | |
| field | string | |
| correction | string | |
| idempotency_key* | string |
Resposta 200
| ok | boolean | |
| work_item | AssistantWorkItem | |
| plan_id | string | null |
/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* | string | ID do plano de ação opaco |
Resposta 200
| id | string | |
| status | string | |
| expires_at | string | |
| source_revision | integer | |
| effects | object[] |
/api/assistant/activityObter 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
| limit | integer |
Resposta 200
| type | string | |
| as_of | string | |
| events | object[] |
/api/assistant/dataExportar 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
| format | string | |
| exported_at | string | |
| note | string |
/api/assistant/dataExcluir 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
| ok | boolean | |
| deleted | object | |
| source_mail_deleted | boolean |
Resposta de exemplo
{
"ok": true,
"deleted": {
"work_items": 12,
"claims": 40,
"entities": 9,
"jobs": 52
},
"source_mail_deleted": false
}/api/assistant/devicesRegistrar 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_detail | string(redacted | sender_only) |
Resposta 200
| ok | boolean | |
| device | object |
/api/assistant/devicesRevogar 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
| ok | boolean |
/api/domains/{domain}/email/checkVerifique 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| provider | string | null | Provedor de e-mail detectado automaticamente (google-workspace, proton, fastmail) ou null |
| mx | object | |
| spf | object | |
| dmarc | object | |
| dkim | object |
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"
/api/domains/{domain}/email/deliverabilityObtenha 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| status | string | |
| confidence | string | |
| checked_at | string (date-time) | |
| window_days | integer | |
| readiness | object | Prontidão determinística de configuração de DNS. A pontuação não é uma probabilidade da caixa de entrada. |
| sending_health | object | |
| placement | object | |
| actions | object[] | |
| caveats | string[] |
Exemplo
curl https://domani.run/api/domains/mysite.com/email/deliverability \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/email/setupConfigurar 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* | string | Nome de domínio |
Solicitar corpo
| force | boolean | Substitua o provedor de e-mail existente (Google Workspace, Fastmail, Proton). Padrão: falso |
Resposta 200
| domain | string | |
| status | string | |
| verified_at | string | null | |
| receiving_verified | boolean | Verdadeiro quando o MX do domínio aponta para o receptor da plataforma, de modo que o e-mail dos seus endereços é aceito. |
| sending_configured | boolean | |
| sending_verified | boolean | |
| records | DnsRecord[] | |
| hint | string |
/api/domains/{domain}/email/setupRemover 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* | string | Nome de domínio |
/api/domains/{domain}/email/statusVerifique 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* | string | Nome de domínio |
Resposta 200
| domain | string | |
| enabled | boolean | |
| verified | boolean | Verdadeiro somente quando o recebimento e o envio de saída são verificados |
| receiving_verified | boolean | Verdadeiro quando o MX do domínio aponta para o receptor da plataforma, de modo que o e-mail dos seus endereços é aceito. |
| sending_configured | boolean | |
| sending_verified | boolean | |
| records | DnsRecord[] | |
| mailbox_count | integer | |
| dns_managed | boolean | Verdadeiro 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_addresses | string[] | 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_status | string | |
| mailbox_plan_key | string | A 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_limit | integer | null | Caixas de correio com domínio próprio que o plano permite em todo o espaço de trabalho. null significa ilimitado. |
| mailbox_limit_reached | boolean | Verdadeiro 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_plan | object | null | O plano mais barato que daria espaço para outra caixa de correio. null quando já é ilimitado. |
| hint | string |
/api/emailCrie 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* | string | Parte local do endereço de e-mail (por exemplo, 'hello' para hello@domani.run) |
| name | string | Nome de exibição (o padrão é slug maiúsculo) |
Resposta 201
| id | string | |
| address | string | |
| name | string | null | |
| slug | string | |
| domain | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| collaboration_enabled | boolean | |
| shared | boolean | Indica se pelo menos uma pessoa além do solicitante pode ler esta caixa de correio |
| message_count | integer | |
| webhook_url | string | null | |
| header_names | string[] | Nomes de cabeçalho de autenticação de webhook configurados; valores nunca são retornados |
| forward_to | string | null | |
| signing_secret | string | null | |
| created_at | string (date-time) | |
| hint | string |
/api/emailListar 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
| domain | string | Filtrar por domínio |
Resposta 200
| mailboxes | object[] |
/api/emailsCrie 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* | string | Endereço de e-mail completo, por ex. hello@mysite.com |
| name | string | Nome de exibição para e-mails enviados (por exemplo, "John Doe") |
| force | boolean | Substitua os registros MX existentes. Padrão: falso |
| kind | string(api | hosted) | "api" (padrão: enviar/receber via API + webhooks) ou "hosted" (caixa de correio IMAP/SMTP real em seu domínio) |
| workspace_id | string | Espaço de trabalho para possuir a caixa de correio. Somente o proprietário do workspace pode adotar recursos. |
Resposta 201
| id | string | |
| address | string | |
| name | string | null | |
| domain | string | |
| slug | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| collaboration_enabled | boolean | |
| shared | boolean | Indica se pelo menos uma pessoa além do solicitante pode ler esta caixa de correio |
| message_count | integer | |
| webhook_url | string | null | |
| header_names | string[] | Nomes de cabeçalho de autenticação de webhook configurados; valores nunca são retornados |
| forward_to | string | null | |
| signing_secret | string | null | Segredo HMAC para verificar cargas úteis de webhook de entrada (mostrado uma vez na criação) |
| host_id | string | ID principal do host de email para uma caixa de correio hospedada |
| dns_records | DnsRecord[] | |
| dns_status | string | |
| receiving_status | string | |
| sending_status | string | |
| sending_error | object | |
| client_settings | object | |
| credential | object | |
| storage_quota_bytes | integer | |
| created_at | string (date-time) | |
| hint | string |
/api/emailsListar 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
| domain | string | Filtrar por domínio |
Resposta 200
| mailboxes | object[] |
/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* | string | Endereço de e-mail completo (codificado em URL, por exemplo, hello%40mysite.com) |
Resposta 200
| id | string | |
| address | string | |
| slug | string | |
| domain | string | |
| kind | string | |
| workspace_id | string | null | |
| access_role | string | |
| effective_capabilities | MailboxEffectiveCapabilities | |
| webhook_url | string | null | |
| forward_to | string | null | |
| signing_secret | string | null | Segredo HMAC para gestores; nulo para visualizadores/respondentes |
| message_count | integer | |
| storage_quota_bytes | integer | null | |
| storage_used_bytes | integer | null | |
| storage_measured_at | string (date-time) | null | |
| created_at | string (date-time) |
/api/emails/{address}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* | string | Endereço de e-mail completo (codificado em URL) |
Solicitar corpo
| name | string | null | Nome de exibição da caixa de correio. Defina como nulo para limpar. |
| webhook_url | string | null | URL HTTPS para webhook de e-mail de entrada ou nulo para limpar |
| forward_to | string | null | Endereço de e-mail para encaminhar e-mails recebidos ou nulo para limpar |
| drop_spam | boolean | Descartar (não armazenar ou webhook) mensagens de entrada sinalizadas como spam |
| tone_notes | string | null | Dicas 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
| id | string | |
| address | string | |
| slug | string | |
| domain | string | |
| name | string | null | |
| webhook_url | string | null | |
| forward_to | string | null | |
| tone_notes | string | null | |
| signing_secret | string | Segredo HMAC para verificar cargas úteis de webhook de entrada |
/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* | string | Endereço de e-mail completo (codificado em URL) |
Solicitar corpo
| confirm | boolean | Deve ser verdadeiro para realmente excluir. Omitir a visualização. |
/api/emails/{address}/sendEnvie 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* | string | Endereço de e-mail do remetente (codificado em URL) |
Solicitar corpo
| to* | any | Endereço(s) de e-mail do destinatário |
| cc | any | Destinatário(s) do CC |
| bcc | any | Destinatário(s) CCO |
| subject | string | |
| text | string | Corpo de texto simples |
| html | string | Corpo HTML |
| reply_to | string | Endereço para resposta |
| in_reply_to | string | ID da mensagem do e-mail que está sendo respondido (para encadeamento) |
| references | string | Cadeia de ID de mensagem separada por espaço (para encadeamento) |
| idempotency_key | string | Chave estável que evita envios duplicados |
| send_at | string (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. |
| coordination | object | Necessário para uma resposta colaborativa protegida. |
| allow_risky_content | boolean | Campo 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. |
| attachments | object[] | Anexos de arquivo (máximo de 10, máximo de 40 MB no total). O conteúdo deve ser codificado em base64. |
Resposta 200
| id | string | |
| message_id | string | ID da mensagem RFC 5322 |
| from | string | |
| to | string | |
| bcc | string | null | Destinatá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. |
| status | string | |
| attachments_count | integer | |
| suppressed | string[] | |
| deliverability | object | Relatório de política versionado aplicado a este envio; inspecionar decisões e verificações categorizadas |
/api/emails/{address}/deliverability-checkSimular 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* | string | Endereço de e-mail do remetente (codificado em URL) |
Solicitar corpo
| subject | string | |
| text | string | |
| html | string | |
| idempotency_key | string | |
| allow_risky_content | boolean | Campo de compatibilidade obsoleto; bloqueios de segurança objetivos não podem ser substituídos. |
| attachments | object[] |
Resposta 200
| policy_version | string | |
| decision | string | |
| safe_to_send | boolean | Booleano compatível com versões anteriores equivalente a decisão! = negar |
| risk | string | |
| score | integer | |
| authentication_message | boolean | |
| checks | object[] | |
| blocked_reasons | string[] | |
| warnings | string[] | |
| override_used | boolean |
/api/emails/{address}/messagesListar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| cursor | string | Cursor de paginação da resposta anterior |
| limit | integer | Máximo de mensagens a serem retornadas |
| direction | string(in | out | all) | Filtrar por direção (padrão: todos) |
| folder | string(inbox | archive | sent | spam | trash) | Pasta do sistema. Mutuamente exclusivo com vista. O padrão é caixa de entrada. |
| label | string | Rótulos separados por vírgula: apenas mensagens que possuem qualquer um deles |
| view | string(starred | all | needs_human | scheduled) | Visualização virtual. Mutuamente exclusivo com pasta. |
| since | string | Timestamp ISO - retorna apenas mensagens criadas após esta data |
| until | string | Timestamp ISO - retorna apenas mensagens criadas antes desta data |
| from | string | Filtrar por endereço do remetente |
| to | string | Filtrar por endereço de destinatário |
| subject | string | Filtrar por assunto |
| q | string | Pesquisa ampla, sem distinção entre maiúsculas e minúsculas, entre remetente, destinatários, assunto e corpo de texto simples |
| unread | boolean | Retornar apenas mensagens não lidas |
| attachments | boolean | Retornar mensagens que contenham apenas anexos |
| spam | boolean | Filtrar por sinalizador de spam (passar falso para ocultar a entrada sinalizada como spam) |
Resposta 200
| messages | object[] | |
| next_cursor | string | null |
/api/emails/searchBuscar 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
| mailbox | string | Restringir a um endereço de caixa de entrada (slug@domain). |
| q* | string | O 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"`). |
| mode | string(hybrid | semantic | keyword) | hybrid funde o embedding e as palavras por rank; semantic usa apenas o significado; keyword apenas as palavras. |
| limit | integer | Resultados a retornar. |
| since | string | Apenas emails recebidos após este timestamp ISO. |
| until | string | Apenas emails recebidos antes deste timestamp ISO. |
| folder | string(inbox | archive | sent | spam | trash | anywhere) | Uma pasta. Lixeira é excluída a menos que seja nomeada ou com `anywhere`. |
| from | string | Endereço do remetente contém. |
| label | string | Rótulos separados por vírgula: apenas mensagens que possuem qualquer um deles |
Resposta 200
| results | object[] | |
| mode | string | |
| query | string | |
| took_ms | integer | |
| hint | string |
Exemplo
curl "https://domani.run/api/emails/search?q=facture+tucows+ao%C3%BBt&limit=5" \ -H "Authorization: Bearer domani_sk_xxx"
/api/emails/connect/gmailIniciar 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
| access | string(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. |
| since | string (date-time) | Importar os emails recebidos após este instante |
| window | string(24h | 7d | 30d | 1y) | Uma predefinição em vez de since; padrão 24h |
| workspace_id | string | Workspace ao qual a caixa de correio pertence; seu workspace pessoal por padrão |
| login_hint | string | A conta do Google a pré-selecionar |
| return_to | string | Caminho do app para enviar o navegador após o consentimento |
Resposta 200
| auth_url | string | |
| state | string | |
| import_since | string (date-time) | |
| expires_in | integer | |
| access | string |
/api/emails/connect/outlookComece 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
| access | string(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. |
| since | string (date-time) | Importar os emails recebidos após este instante |
| window | string(24h | 7d | 30d | 1y) | Uma predefinição em vez de since; padrão 24h |
| workspace_id | string | Workspace ao qual a caixa de correio pertence; seu workspace pessoal por padrão |
| login_hint | string | A conta da Microsoft a ser pré-selecionada |
| return_to | string | Caminho do app para enviar o navegador após o consentimento |
Resposta 200
| auth_url | string | |
| state | string | |
| import_since | string (date-time) | |
| expires_in | integer | |
| access | string |
/api/emails/connect/providersLista 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
| providers | MailProvider[] |
/api/emails/connect/forwardingConectar 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* | string | A caixa de entrada a conectar, por exemplo someone@gmail.com |
| workspace_id | string | Workspace ao qual a caixa de correio pertence; seu workspace pessoal por padrão |
Resposta 200
| address | string | |
| mailbox_id | string | |
| status | string | |
| forwarding_address | string | |
| instructions | object | |
| guide | ForwardingGuide |
/api/emails/{address}/connector/verifyEnviar 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* | string | O endereço conectado, por exemplo someone@gmail.com |
Resposta 200
| sent_to | string | |
| forwarding_address | string |
/api/emails/{address}/connectorLer 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* | string | O endereço conectado, por exemplo someone@gmail.com |
Resposta 200
| address | string | |
| mailbox_id | string | |
| kind | string | |
| status | string | |
| import_since | string (date-time) | null | O limite da primeira importação: nenhum email recebido antes dele é copiado |
| phase | string | lista 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_reason | string | null | |
| import_run | object | null | A execução de importação atual ou última desta caixa de correio |
| source_messages_total | integer | null | O que a origem reporta para toda a caixa de entrada, para escala |
| last_sync_at | string (date-time) | null | |
| last_error | string | null | |
| backoff_until | string (date-time) | null | |
| verified_at | string (date-time) | null | |
| connected_at | string (date-time) | |
| cost_cap_usd | number | O gasto de modelo permitido por execução de importação, em USD |
| access | string | null | Para uma conexão Gmail: o que a permissão permite; write significa rótulos em ambas as direções e envio como a pessoa |
| forwarding | object | null | Para uma conexão por encaminhamento: o endereço de encaminhamento, o que chegou, a confirmação do Gmail, a sonda, os passos |
/api/emails/{address}/connectorDesconectar 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
| disconnected | boolean | |
| address | string | |
| removed_messages | integer | |
| removed_attachments | integer |
/api/emails/{address}/importImportar 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_id | string | |
| import_since | string (date-time) | |
| import_until | string (date-time) |
/api/emails/{address}/searchBuscar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| q* | string | O 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"`). |
| mode | string(hybrid | semantic | keyword) | hybrid funde o embedding e as palavras por rank; semantic usa apenas o significado; keyword apenas as palavras. |
| limit | integer | Resultados a retornar. |
| since | string | Apenas emails recebidos após este timestamp ISO. |
| until | string | Apenas emails recebidos antes deste timestamp ISO. |
| folder | string(inbox | archive | sent | spam | trash | anywhere) | Uma pasta. Lixeira é excluída a menos que seja nomeada ou com `anywhere`. |
| from | string | Endereço do remetente contém. |
| label | string | Rótulos separados por vírgula: apenas mensagens que possuem qualquer um deles |
Resposta 200
| results | object[] | |
| mode | string | |
| query | string | |
| took_ms | integer | |
| hint | string |
/api/emails/{address}/threadsListar 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 | |
| folder | string(all | inbox | archive | sent | spam | trash) | |
| since | string | Apenas threads com atividade após este horário |
| limit | integer | |
| cursor | string | next_cursor da página anterior |
| label | string | Rótulos separados por vírgula: apenas threads com uma mensagem que possui qualquer um deles |
Resposta 200
| threads | EmailThread[] | |
| next_cursor | string | null | |
| has_more | boolean |
/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* | string | Id da thread (o thread_id de qualquer uma de suas mensagens) |
Resposta 200
| id | string | |
| subject | string | null | |
| participants | string[] | |
| message_count | integer | |
| unread_count | integer | |
| first_message_at | string (date-time) | |
| last_message_at | string (date-time) | |
| messages | object[] |
/api/emails/{address}/eventsTransmitir 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 | |
| since | string | Cursor para reproduzir a partir de; o `cursor` de qualquer evento anterior ou um next_cursor de /api/email/changes |
/api/emails/{address}/foldersListar 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
| folders | object[] | |
| views | object[] | |
| capabilities | object |
/api/emails/{address}/messages/actionsAplicar 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) | |
| destination | string(inbox | archive | sent | spam | trash) | |
| read | boolean | |
| starred | boolean | |
| add | string[] | label: rótulos a adicionar |
| remove | string[] | label: rótulos a remover |
| set | string[] | label: substituir todos os rótulos (tem prioridade sobre adicionar e remover) |
| idempotency_key | string | Chave estável para este lote lógico exato. Reutilize após um tempo limite. |
Resposta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Verdadeiro quando esta resposta reutilizou o recibo imutável concluído e não realizou nenhuma nova mutação. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null |
/api/emails/{address}/messages/readMarcar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Solicitar corpo
| message_ids* | string[] | IDs de mensagens para marcar |
| read* | boolean | verdadeiro para marcar como lido, falso para marcar como não lido |
| idempotency_key | string |
Resposta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Verdadeiro quando esta resposta reutilizou o recibo imutável concluído e não realizou nenhuma nova mutação. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null | |
| count | integer |
/api/emails/{address}/messages/deleteExcluir 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Solicitar corpo
| message_ids* | string[] | IDs de mensagens a serem excluídas |
| idempotency_key | string |
Resposta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Verdadeiro quando esta resposta reutilizou o recibo imutável concluído e não realizou nenhuma nova mutação. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null | |
| count | integer |
/api/emails/{address}/messages/{id}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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| id* | string | ID da mensagem |
Resposta 200
| id | string | |
| thread_id | string | Id da conversa compartilhado por todas as mensagens da thread (o id da mensagem raiz) |
| labels | string[] | Todos os rótulos na mensagem; `label` é o primeiro |
| thread_key | string | Chave de conversa canônica com namespace de back-end |
| thread_aliases | string[] | Chaves de fluxo de trabalho herdadas para transmitir ao alterar o estado da conversa |
| message_id | string | null | |
| direction | string | |
| from | string | O 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_url | string (uri) | null | URL do proxy Domani que preserva a privacidade para o avatar do remetente |
| to | string | Todos 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). |
| cc | string | null | Todos os destinatários Cc do cabeçalho, com nomes de exibição, ou null quando o e-mail não trazia Cc. |
| bcc | string | null | Destinatários Bcc, presentes apenas na sua própria mensagem de saída (nunca em uma recebida, e nunca entregues como cabeçalho). |
| reply_to | string | null | |
| subject | string | |
| text | string | null | |
| html | string | null | |
| in_reply_to | string | null | |
| references | string | null | |
| attachments | object[] | |
| status | string | |
| is_read | boolean | |
| read_at | string | null | |
| events | object[] | |
| created_at | string (date-time) |
/api/emails/{address}/messages/{id}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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| id* | string | ID da mensagem |
Resposta 200
| id | string | |
| deleted | boolean |
/api/emails/{address}/messages/{id}/replyResponder 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| id* | string | ID da mensagem para responder |
Solicitar corpo
| text | string | Corpo da resposta em texto simples |
| html | string | Corpo da resposta HTML |
| cc | any | Destinatários adicionais de CC |
| all | boolean | Responder a todos: preencher automaticamente o CC do Para/CC original |
| quote | boolean | Cita o original abaixo da resposta; false envia apenas o texto ou o HTML informado |
| idempotency_key | string | Formulário de compatibilidade corporal da Idempotency-Key |
| coordination | object |
Resposta 200
| id | string | |
| message_id | string | |
| from | string | |
| to | string | |
| status | string | |
| reply_version | integer | Geração reservada para uma resposta protegida |
/api/emails/{address}/messages/{id}/forwardEncaminhar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| id* | string | ID da mensagem a ser encaminhada |
Solicitar corpo
| to* | string | Endereço de e-mail do destinatário |
| text | string | Nota opcional para preceder |
Resposta 200
| id | string | |
| message_id | string | |
| from | string | |
| to | string | |
| status | string |
/api/emails/{address}/avatarObtenha 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Resposta 200
| address | string | |
| gravatar_url | string | null | |
| gravatar_signup | string | |
| has_avatar | boolean | |
| hint | string |
/api/emails/{address}/webhookObter 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Resposta 200
| address | string | |
| webhook_url | string | null | |
| signing_secret | string | null | |
| has_webhook | boolean | |
| events | string[] | 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_names | string[] | Nomes de cabeçalho de autenticação configurados; valores nunca são retornados |
| hint | string |
/api/emails/{address}/webhookDefinir 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Solicitar corpo
| url* | string | URL do webhook HTTPS |
| events | string[] | 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}}. |
| headers | object | Cabeç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
| address | string | |
| webhook_url | string | |
| signing_secret | string | |
| has_webhook | boolean | |
| events | string[] | 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_names | string[] | Nomes de cabeçalho de autenticação configurados; valores nunca são retornados |
| hint | string |
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"]}'/api/emails/{address}/webhookRemover 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Resposta 200
| address | string | |
| webhook_url | string | null | |
| signing_secret | string | null | |
| has_webhook | boolean | |
| events | string[] | 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_names | string[] | |
| hint | string |
/api/emails/{address}/webhook/rotateAlternar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Resposta 200
| address | string | |
| webhook_url | string | |
| signing_secret | string | |
| has_webhook | boolean | |
| hint | string |
/api/emails/{address}/webhook/testTestar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Resposta 200
| address | string | |
| webhook_url | string | |
| status | integer | |
| success | boolean | |
| hint | string |
/api/emails/{address}/aliasesListar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Resposta 200
| mailbox | string | |
| aliases | object[] | |
| hint | string |
/api/emails/{address}/aliasesAdicionar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Solicitar corpo
| alias* | string | Endereço de alias - um slug simples ou slug@domain completo no mesmo domínio |
Resposta 201
| address | string | |
| mailbox | string | |
| created_at | string (date-time) | |
| hint | string |
/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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| alias* | string | Endereço de alias a ser removido (codificado em URL ou um slug simples) |
Resposta 200
| address | string | |
| deleted | boolean | |
| hint | string |
/api/emails/{address}/client-settingsObtenha 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* | string | Endereço da caixa de correio hospedada (codificado em URL) |
Resposta 200
| mailbox | string | |
| username | string | |
| imap | object | |
| smtp | object | |
| hint | string |
/api/emails/{address}/credentialsListar 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* | string | Endereço da caixa de correio hospedada (codificado em URL) |
Resposta 200
| mailbox | string | |
| credentials | object[] | |
| hint | string |
/api/emails/{address}/credentialsCrie 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* | string | Endereço da caixa de correio hospedada (codificado em URL) |
Solicitar corpo
| label | string | Etiqueta para identificar esta senha de aplicativo, por exemplo. "Correio para laptop" |
Resposta 201
| id | string | |
| label | string | |
| password | string | A senha do aplicativo - mostrada uma vez, armazene-a agora |
| client_settings | object | |
| hint | string |
/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* | string | Endereço da caixa de correio hospedada (codificado em URL) |
| id* | string | ID da senha do aplicativo (do endpoint da lista) |
Resposta 200
| id | string | |
| revoked | boolean | |
| hint | string |
/api/emails/{address}/messages/{id}/escalateSinalizar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| id* | string | ID da mensagem a sinalizar |
Solicitar corpo
| reason | string | Por que o humano é necessário - exibido na notificação |
| clear | boolean | Limpe o sinalizador em vez de defini-lo (o humano assumiu) |
Resposta 200
| id | string | |
| needs_human | boolean | |
| escalation_reason | string | null | |
| thread_key | string |
/api/emails/{address}/messages/{id}/remindDefinir 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| id* | string | ID da mensagem a acompanhar |
Solicitar corpo
| remind_at | string (date-time) | Horário ISO 8601 para ser lembrado (de 1 minuto a 90 dias à frente) |
| note | string | Contexto exibido quando o lembrete dispara |
| clear | boolean | Limpar um lembrete pendente |
Resposta 200
| id | string | |
| remind_at | string | null | |
| reminder_note | string | null |
/api/contactsListar 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
| q | string | Filtrar por substring do endereço ou do nome |
| limit | integer | Contatos a retornar (padrão 50) |
| cursor | string | Cursor de paginação de uma resposta anterior |
| order | string(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
| contacts | object[] | |
| next_cursor | string | null |
/api/contactsCriar 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* | string | O endereço de e-mail do contato |
| name | string | null | Nome de exibição (nulo o limpa) |
| notes | string | null | Notas que agentes e humanos leem para obter contexto (nulo as limpa) |
/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* | string | O endereço de e-mail do contato (codificado em URL) |
/api/emails/{address}/rulesListar 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* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
Resposta 200
| mailbox | string | |
| rules | MailRule[] | |
| hint | string |
/api/emails/{address}/rulesAdicionar 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* | string | Endereç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_arg | string | Endereço de encaminhamento (para forward), valor do rótulo (para label) ou motivo exibido ao humano (para escalate) |
| priority | integer | Baixe as execuções primeiro (padrão 0) |
| enabled | boolean | Padrão verdadeiro |
Resposta 201
| id | string | |
| priority | integer | Abaixe as corridas primeiro |
| match_field | string | |
| match_op | string | |
| match_value | string | |
| action | string | |
| action_arg | string | null | |
| enabled | boolean | |
| created_at | string (date-time) |
/api/emails/{address}/rules/{ruleId}Remover uma regra de e-mail de entrada
Remova uma regra de filtragem de entrada de uma caixa de correio.
Parâmetros
| address* | string | Endereço de e-mail da caixa de correio (codificado em URL) |
| ruleId* | string | O ID da regra |
Resposta 200
| id | string | |
| deleted | boolean | |
| hint | string |
/api/domains/{domain}/email/catch-allDefinir 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* | string | Nome de domínio |
Solicitar corpo
| mailbox* | string | Caixa de correio pega-tudo - um slug simples ou endereço completo neste domínio |
Resposta 200
| domain | string | |
| catch_all | string | null | |
| hint | string |
/api/domains/{domain}/email/catch-allLimpar 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* | string | Nome de domínio |
Resposta 200
| domain | string | |
| catch_all | string | null | |
| hint | string |
/api/email/changesSincronizar 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 | |
| cursor | string | next_cursor opaco de uma resposta anterior |
| limit | integer |
Resposta 200
| changes | MailboxChange[] | |
| next_cursor | string | |
| has_more | boolean | |
| requires_full_sync | boolean | |
| reason | string |
/api/suppressionsListar 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
| cursor | string | Cursor de paginação de uma resposta anterior |
| limit | integer | Máximo de entradas (padrão 50, máximo 100) |
Resposta 200
| suppressions | object[] | |
| next_cursor | string | null | |
| hint | string |
/api/suppressionsAdicione 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* | string | Endereço de e-mail para suprimir |
| reason | string(manual | hard_bounce | complaint) | Motivo (padrão: manual) |
Resposta 201
| address | string | |
| reason | string | |
| source | string | |
| created_at | string (date-time) | |
| hint | string |
/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* | string | Endereço de e-mail suprimido (codificado em URL) |
Resposta 200
| address | string | |
| deleted | boolean | |
| hint | string |
Collaboration
/api/workspaces/{id}/ownership-transferSolicitar 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 |
/api/workspaces/{id}/ownership-transfer/{transferId}Revogar uma transferência de propriedade pendente
Parâmetros
| id* | string | |
| transferId* | string |
/api/workspaces/ownership-transfers/acceptAceitar 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
/api/auth/registerPúblicoCrie 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) | |
| ref | string | Có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
| ok | boolean | |
| verification_required | boolean | |
| message | string | |
| hint | string | |
| next_steps | string[] |
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"}'/api/auth/loginPúblicoEnvie 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
| ok | boolean | |
| message | string |
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"}'/api/auth/verifyPúblicoVerifique um token de link mágico
Valida o token do link mágico e redireciona para o painel com credenciais de autenticação. Usado pelo e-mail de link mágico - normalmente não chamado diretamente pelos agentes. Os agentes devem usar POST /api/auth/register.
Parâmetros
| token* | string | Token de link mágico de e-mail (codificado em base64url) |
/api/auth/handoffGerar 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
| url | string |
Resposta de exemplo
{
"url": "https://mailzero.run/auth/handoff#code=xxx&next=%2Finbox"
}/api/auth/handoff/redeemPúblicoResgatar 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
| ok | boolean | |
| next | string |
Resposta de exemplo
{
"ok": true,
"next": "/inbox"
}Conta
/api/meObtenha 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
| id | string | |
| string (email) | ||
| plan | string | Chave do plano Domani pessoal ativo |
| workspace_plans | string[] | Chaves ativas distintas do plano Mailzero em espaços de trabalho que o usuário pode acessar |
| has_payment_method | boolean | Se o usuário possui um cartão registrado (obrigatório antes de comprar domínios) |
| preferred_payment_method | string | null | |
| preferred_locale | string | Locale usado pelas interfaces Domani e comunicações transacionais |
| has_contact | boolean | Se 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. |
| contact | RegistrantContact | Informações de contato do registrante (nulo se não definido) |
| referral_code | string | Seu código de referência exclusivo |
| referral_rate | integer | Porcentagem de comissão sobre compras referidas |
| balance | number | Saldo de crédito do Marketplace em dólares americanos (ganho com vendas) |
| domain_count | integer | Número de domínios possuídos |
| token_count | integer | Número de tokens de API ativos |
| features | string[] | 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_assistant | boolean | Indica 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_admin | boolean | |
| mailbox_entitlement | object | Capacidade 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_at | string (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"
/api/meAtualizar 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_method | string | null(card | usdc) | Forma de pagamento padrão para compras (card, usdc ou null para seleção automática) |
| preferred_locale | string(en | fr | es | pt-BR | ja | zh-Hans | it) | Locale usado pelas interfaces Domani e comunicações transacionais |
Resposta 200
| preferred_payment_method | string | null | |
| preferred_locale | string | |
| hint | string |
/api/meExcluir 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
| deleted | boolean | |
| hint | string |
/api/me/activationObtenha 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
| version | integer | |
| account_created_at | string (date-time) | |
| entry | object | |
| milestones | object | |
| status | string | |
| recommended_actions | object[] | |
| available_paths | string[] | |
| dismissed_version | integer | |
| pending_claim | object | null |
Exemplo
curl https://domani.run/api/me/activation \ -H "Authorization: Bearer domani_sk_xxx"
/api/me/activationIgnorar 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_version | integer | |
| hint | string |
/api/me/contactObtenha 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_contact | boolean | |
| contact | RegistrantContact |
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"
/api/me/contactDefinir 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
| contact | RegistrantContact |
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"}'/api/me/resend-verificationReenviar 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
| string (email) | Endereço de e-mail para verificação (o padrão é e-mail de contato da conta) |
Resposta 200
| sent | boolean | |
| already_verified | boolean | |
| hint | string |
/api/sessionsListar 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
| sessions | object[] | |
| hint | string |
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"
/api/sessionsDesconectar 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
| revoked | integer | |
| hint | string |
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"
/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* | string | ID da sessão (de GET /api/sessions), ou `current` |
Resposta 200
| success | boolean | |
| current | boolean | Verdadeiro quando quem chama se desconectou: a chave dele não funciona mais |
| hint | string |
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
/api/agents/identity/{slug}/tokensListar 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* | string | O identificador da identidade de agente. |
/api/agents/identity/{slug}/tokensDar 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* | string | O identificador da identidade de agente. |
Solicitar corpo
| name | string | Padrão é '<slug> agent'. |
| scopes | string[] | Padrão é assistant:read, assistant:write, email:read, email:write. Não pode exceder os escopos do próprio chamador. |
| mailboxes | string[] | 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_in | integer | Segundos até a expiração (máximo um ano). |
Resposta 201
| success | boolean | |
| token | object | |
| agent | object | |
| hint | string |
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"}'/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
| success | boolean | |
| hint | string |
/api/tokensListe 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
| tokens | TokenInfo[] |
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"
/api/tokensCrie 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
| name | string | Nome legível para identificar este token |
| expires_in | integer | Vida útil do token em segundos (mínimo 3600 = 1h, máximo 31536000 = 1 ano). Omitir para não expirar. |
| expires_at | string (date-time) | Data de validade absoluta (ISO 8601). Alternativa para expires_in. |
| scopes | string[] | 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_tx | number | Limite 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_month | number | Limite de gastos mensais em dólares americanos em todas as operações pagas feitas com este token. |
| agent_identity_id | string | ID 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_policy | object | Autoridade estruturada obrigatória para um token com escopo que inclua http-routes:read ou http-routes:write. |
| mailboxes | string[] | 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
| id | string | |
| name | string | |
| key | string | Chave de API completa - salve-a, ela não será mostrada novamente |
| expiresAt | string (date-time) | null | Quando este token expirar (nulo = nunca) |
| scopes | string[] | Escopos de permissão concedidos a este token |
| createdAt | string (date-time) | |
| max_per_tx | number | null | Limite de gasto por transação em USD (nulo = ilimitado) |
| max_per_month | number | null | Limite de gasto mensal em USD (nulo = ilimitado) |
| mailbox_ids | string[] | IDs de caixa de correio aos quais este token está confinado |
| http_route_policy | HttpRoutePolicy | |
| agent_identity | object | 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"}'/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* | string | ID do token (da resposta GET /api/tokens) |
Resposta 200
| success | boolean |
Resposta de exemplo
{
"success": true
}Exemplo
curl -X DELETE https://domani.run/api/tokens/cm5abc123 \ -H "Authorization: Bearer domani_sk_xxx"
/api/auditListar 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
| limit | integer | Eventos por página |
| cursor | string | Cursor de paginação (next_cursor da página anterior) |
| type | string | Filtre por tipo de evento (por exemplo, token.created, Purchase.charged, Purchase.denied_cap) |
Resposta 200
| events | object[] | |
| next_cursor | string | null | |
| hint | string |
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
/api/webhooksListar 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
| webhooks | object[] | |
| hint | string |
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"
/api/webhooksCriar 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. |
| headers | object | Cabeçalhos de autenticação criptografados opcionais. Somente autorização e chave X-API são aceitas. |
Resposta 200
| id | string | |
| url | string (uri) | |
| events | string[] | |
| secret | string | Segredo de assinatura HMAC-SHA256 (mostrado uma vez) |
| active | boolean | |
| header_names | string[] | Nomes de cabeçalho de autenticação configurados; valores nunca são retornados |
| created_at | string (date-time) | |
| hint | string |
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"}}'/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* | string | ID do webhook |
Solicitar corpo
| url | string (uri) | Novo URL HTTPS |
| events | string[] | Nova lista de tipos de eventos |
| active | boolean | Defina false para pausar, true para retomar |
| headers | object | Substitua cabeçalhos de autenticação criptografados; envie {} para limpar. Somente autorização e chave X-API são aceitas. |
Resposta 200
| id | string | |
| url | string (uri) | |
| events | string[] | |
| active | boolean | |
| header_names | string[] | Nomes de cabeçalho de autenticação configurados; valores nunca são retornados |
| hint | string |
/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* | string | ID do webhook |
Resposta 200
| success | boolean | |
| hint | string |
/api/webhooks/{id}/deliveriesListar 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* | string | ID do webhook |
| limit | integer | Número máximo de entregas a devolver |
Resposta 200
| deliveries | object[] | |
| hint | string |
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."
}/api/webhooks/{id}/deliveries/{deliveryId}/replayReproduzir 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* | string | ID do webhook |
| deliveryId* | string | ID de entrega original |
Solicitar corpo
| idempotency_key* | string |
Resposta 200
| delivery_id | string | |
| original_delivery_id | string | |
| event_type | string | |
| status | string | |
| http_status | integer | null | |
| attempts | integer | |
| idempotency_key | string | |
| idempotent_replay | boolean | |
| created_at | string (date-time) | |
| hint | string |
/api/webhooks/eventsListar 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
| events | object[] |
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
/api/notificationsListar 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
| limit | integer | Máximo de notificações para retornar |
| cursor | string | Cursor para paginação (do next_cursor da resposta anterior) |
Resposta 200
| notifications | object[] | |
| has_more | boolean | |
| next_cursor | string | null |
/api/notifications/countObtenha 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_count | integer |
Resposta de exemplo
{
"unread_count": 3
}/api/notifications/{id}Marcar notificação como lida
Marcar uma única notificação como lida. Requer escopo notifications:read.
Parâmetros
| id* | string | ID de notificação |
Solicitar corpo
| read* | boolean | Defina como verdadeiro para marcar como lido |
Resposta 200
| ok | boolean |
/api/notifications/read-allMarcar todas as notificações como lidas
Marcar todas as notificações não lidas como lidas. Requer escopo notifications:read.
Resposta 200
| ok | boolean | |
| count | integer | Número de notificações marcadas como lidas |
/api/notifications/preferencesObtenha 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
| preferences | object[] | |
| expiry_alert_days | integer[] | Dias antes do vencimento, o usuário recebe lembretes de renovação (padrão 30/7/1). Vazio = sem lembretes de expiração. |
/api/notifications/preferencesAtualizar preferências de notificação
Atualize as preferências de notificação para categorias e canais específicos. Requer escopo notifications:read.
Solicitar corpo
| preferences | object[] | |
| expiry_alert_days | integer[] | Dias antes do vencimento para receber lembretes de renovação. Matriz vazia = sem lembretes de expiração. |
Resposta 200
| ok | boolean |
TLDs
/api/tldsPúblicoListe 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_price | number | Preço máximo de registro em dólares americanos |
| min_price | number | Preço mínimo de registro em dólares americanos |
| sort | string(tld | price | renewal) | Campo de classificação - 'tld' (em ordem alfabética), 'price' (registro) ou 'renewal' |
| order | string(asc | desc) | Ordem de classificação |
| search | string | Filtrar nomes de TLD contendo esta string |
| limit | integer | Máximo de resultados por página |
| offset | integer | Número de resultados a serem ignorados |
| kind | string | Tipos 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
| tlds | TldInfo[] | |
| total | integer | Total de TLDs correspondentes (antes da paginação) |
| offset | integer | |
| limit | integer | 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
Pesquisa de domínio
/api/domains/searchPúblicoVerifique a disponibilidade e os preços dos domínios
Verifica a disponibilidade e os preços de um ou mais domínios por meio de RDAP + preços de varejo. Em seguida, um nome que o RDAP considera não registrado é verificado com o registrador: um nome premium ou reservado pelo registro volta com available: false, registry_status e um reason. Use q para um único domínio (retorna objeto plano) ou domains para múltiplos (retorna array). Suporta streaming SSE via cabeçalho Accept: text/event-stream - fechar a conexão cancela todas as pesquisas RDAP em andamento no lado do servidor. Máximo de 200 domínios por solicitação. Endpoint público - não é necessária autenticação. As solicitações autenticadas obtêm limites de taxa mais altos (60/min vs 20/min).
Parâmetros
| q | string | Domínio único incluindo TLD (abreviação - retorna objeto plano). Mutuamente exclusivo com `domains`. |
| domains | string | Lista separada por vírgulas de nomes de domínio completos a serem verificados (máximo de 200). Retorna o resultado da matriz. |
| max_price | number | Incluir apenas domínios abaixo deste preço (USD) |
| sort | string(price | tld) | Classifique os resultados por preço ou nome de TLD |
| source | string(all | primary | secondary) | Filtre os resultados por fonte: 'primary' (somente disponibilidade do registrador), 'secondary' (somente listagens do mercado Domani) ou 'all' (ambos) |
| order | string(asc | desc) |
Resposta 200
| available | boolean | Se o domínio está disponível para registro |
| domain | string | Nome de domínio completo incluindo TLD |
| price | number | Preço de registro na moeda especificada |
| currency | string | Código de moeda ISO 4217 (sempre USD) |
| error | boolean | Verdadeiro se a pesquisa RDAP falhou (disponibilidade desconhecida) |
| for_sale | object | Presente quando o domínio está listado para venda (seja no mercado Domani ou detectado em um mercado externo) |
| tld_kind | string | Tipo do sufixo do domínio em relação à zona raiz: `tld`, `second_level` ou `alt_root`. Um domínio `alt_root` está fora da zona raiz da IANA e não resolve no DNS público: ele não é verificado, e `reason` explica o motivo. |
| registry_status | string | Presente quando o registro retém um nome que o RDAP considera não registrado: `premium` (o registro define o próprio preço, veja `registry_price`) ou `reserved` (não pode ser registrado). Esse resultado vem com `available: false`, já que `POST /api/domains/buy` não pode registrá-lo, e `reason` explica o motivo. |
| registry_price | number | Presente nos resultados `premium` quando o registrador informou: o preço do primeiro ano definido pelo registro, em USD. `price` continua sendo o preço padrão do TLD, que não se aplica a este nome. |
| renewal_price | number | Quanto custa cada ano após o primeiro, em USD, no registrador que registraria o nome: o valor cobrado pela renovação. Ausente quando desconhecido. Em um resultado `premium` é, como `price`, o preço padrão do TLD. |
| reason | string | Por que o domínio não é oferecido: um nome fora do DNS público (`tld_kind` `alt_root`) ou um nome retido pelo registro (`registry_status`). |
Exemplo
curl "https://domani.run/api/domains/search?q=mysite.com"
/api/domains/suggestPúblicoSugestões de domínio baseadas em IA com disponibilidade
Dada uma descrição do projeto, gera nomes de domínio completos com TLDs criativos (por exemplo, codebuddy.dev, wavify.fm), verifica a disponibilidade e retorna apenas os domínios disponíveis com preços. Usa um loop de agente que tenta novamente até que domínios disponíveis suficientes sejam encontrados. Suporta streaming SSE via Accept: text/event-stream - fechar a conexão cancela a geração de LLM em andamento e pesquisas RDAP no lado do servidor. Endpoint público - não é necessária autenticação.
Parâmetros
| prompt* | string | Descrição do projeto ou palavras-chave para gerar sugestões de domínio (mínimo 3 caracteres) |
| count | integer | Número de domínios disponíveis para retornar (padrão 10) |
| exclude | string | Lista separada por vírgulas de domínios a serem excluídos das sugestões (por exemplo, de um lote anterior) |
| tlds | string | TLDs preferenciais separados por vírgula (sem pontos). Os resultados favorecerão fortemente esses TLDs. |
| style | string(single | creative | short | brandable | keyword) | Preferência de estilo de nome: 'single' (uma palavra), 'creative' (evocativo/metafórico), 'short' (3-6 caracteres), 'brandable' (inventado), 'keyword' (descritivo). |
| lang | string(japanese | spanish | french | italian | latin | nordic | arabic | sanskrit) | Inspiração linguística/cultural para nomes. Os nomes serão inspirados nas palavras, na estética e na cultura deste idioma. |
Resposta 200
| suggestions | object[] | Nomes de domínio disponíveis com preços |
| checked | integer | Total de domínios verificados |
| iterations | integer | Número de rodadas LLM |
Resposta de exemplo
{
"suggestions": [
{
"domain": "codebuddy.dev",
"price": 13,
"currency": "USD",
"renewal_price": 13
},
{
"domain": "aiforge.sh",
"price": 33,
"currency": "USD"
},
{
"domain": "devcraft.app",
"price": 13,
"currency": "USD"
}
],
"checked": 42,
"iterations": 2
}Exemplo
curl "https://domani.run/api/domains/suggest?prompt=AI+coding+assistant"
/api/domains/dns-checkPúblicoVerificação rápida de existência de domínio baseada em DNS
Testa se um nome de domínio é obtido em vários TLDs ao mesmo tempo usando consultas DNS (mais rápido que a pesquisa, sem preços). Retorna arrays 'taken' (definitivamente registrados) e 'candidates' (potencialmente disponíveis). Use isso para restringir antes de ligar para a pesquisa de preços. Endpoint público - não é necessária autenticação.
Parâmetros
| name* | string | Nome de domínio sem TLD, por ex. 'myapp' |
| tlds* | string | TLDs separados por vírgula para verificar, por ex. 'com,dev,ai,io' |
Resposta 200
| name | string | |
| taken | string[] | TLDs definitivamente registrados |
| candidates | string[] | TLDs que estão potencialmente disponíveis |
Domínios
/api/domainsListe 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
| domains | DomainRecord[] |
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"
/api/agents/identityReivindique 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* | string | O identificador - torna-se <slug>.domani.run |
| name | string | Nome de exibição |
| bio | string | |
| emoji | string | Emoji de avatar |
| string (email) | Contato público (por exemplo, sua caixa de entrada gratuita @domani.run) | |
| links | object[] |
Resposta 200
| id | string | ID de identidade estável usado para vincular tokens de API com escopo definido |
| slug | string | |
| url | string | O subdomínio de identidade (canônico) |
| page_url | string | Fallback de caminho que sempre funciona |
| name | string | null | |
| bio | string | null | |
| emoji | string | null | |
| string | null | ||
| links | object[] | |
| views | integer | |
| created_at | string (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": "🤖"}'/api/agents/identityListe as identidades dos seus agentes
Lista as identidades gratuitas (<handle>.domani.run) que você reivindicou. Requer account:read.
Resposta 200
| identities | AgentIdentity[] |
/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* | string | O identificador a ser atualizado |
Solicitar corpo
| name | string | |
| bio | string | |
| emoji | string | |
| string | ||
| links | object[] |
Resposta 200
| id | string | ID de identidade estável usado para vincular tokens de API com escopo definido |
| slug | string | |
| url | string | O subdomínio de identidade (canônico) |
| page_url | string | Fallback de caminho que sempre funciona |
| name | string | null | |
| bio | string | null | |
| emoji | string | null | |
| string | null | ||
| links | object[] | |
| views | integer | |
| created_at | string (date-time) |
/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* | string | A alça para liberar |
Resposta 200
| success | boolean | |
| slug | string | |
| released | boolean |
/api/agents/provisionForneç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* | string | Domínio a ser fornecido ao agente. Comprou se ainda não possui. |
| slug | string | Parte local da caixa de correio (hi@domain). O padrão é 'hi'. |
| name | string | Nome de exibição para e-mail de saída. |
| webhook_url | string (uri) | URL HTTPS opcional para receber e-mails de entrada + eventos de domínio. |
| webhook_headers | object | Autenticação de entrega opcional. Os valores são criptografados em repouso e nunca retornados; as respostas expõem apenas header_names. |
| webhook_events | string[] | Tipos de eventos de webhook. O padrão é email.received/delivered/bounced. |
| payment_method | string(card | usdc | balance) | Como pagar pelo domínio. |
| payment_tx | string | Hash tx USDC (fluxo de duas etapas). |
| payment_chain | string(base | ethereum) | |
| years | integer | |
| max_price | number | Teto 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
| domain | string | |
| domain_status | string | |
| mailbox | object | null | |
| webhook | object | null | |
| warnings | string[] | |
| hint | string | |
| next_steps | string[] |
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"}}'/api/domains/buyCompre 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
| domain | string | Domínio único para comprar (por exemplo, mysite.com) |
| domains | string[] | Conjunto de domínios para compra (máximo de 10, requer cartão registrado) |
| payment_method | string(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_tx | string | Hash de transação de um pagamento em USDC já enviado na rede. Obrigatório na segunda chamada do fluxo USDC de duas etapas. |
| payment_chain | string(base | ethereum) | Cadeia na qual o pagamento em USDC foi enviado (por exemplo, 'base' ou 'ethereum'). |
| years | integer | Número de anos para registro (1-10, padrão 1). O preço é multiplicado por anos. |
| max_price | number | Teto 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. |
| ref | string | Có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"}'/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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| status | string | |
| auto_renew | boolean | Se a renovação automática está habilitada |
| purchased_at | string (date-time) | |
| expires_at | string (date-time) | |
| days_until_expiry | integer | Dias até a expiração do domínio |
| renewal_price | number | null | Quanto 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_method | string | Como o domínio foi pago |
| payment_tx | string | null | Hash tx na rede (pagamentos em USDC) |
| registrant | string | Quem 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_out | object | Transferê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_status | string | Se os dados do registrador ativo foram atualizados ou gerenciados externamente |
| registrar_checked_at | string (date-time) | Quando a atualização do registrador foi tentada |
| registrar | object | null | Detalhes 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"
/api/domains/{domain}/settingsAtualizar 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* | string | Nome de domínio que você possui |
Solicitar corpo
| auto_renew | boolean | Se a renovação automática deve ser habilitada para este domínio |
| whois_privacy | boolean | Se deve ativar a proteção de privacidade WHOIS |
| security_lock | boolean | Se deve bloquear o domínio contra transferências |
Resposta 200
| domain | string | |
| auto_renew | boolean | |
| whois_privacy | boolean | |
| security_lock | boolean | |
| hint | string |
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}'/api/domains/{domain}/parkingAtualizar 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* | string | Nome de domínio |
Solicitar corpo
| enabled | boolean | Se deve ativar a página de parking |
| listing_price | number | null | Preço de venda em dólares americanos ou nulo para remover listagem |
Resposta 200
| domain | string | |
| parking_enabled | boolean | |
| listing_price | number | null | |
| hint | string |
/api/domains/{domain}/redirectEncaminhar 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* | string | Nome de domínio |
Solicitar corpo
| url* | string | URL de destino (ou domínio simples) para encaminhar, por exemplo https://brand.dev |
| permanent | boolean | verdadeiro = permanente (308, padrão), falso = temporário (307) |
Resposta 200
| domain | string | |
| redirect_url | string | null | |
| permanent | boolean |
/api/domains/{domain}/redirectPare 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* | string | Nome de domínio |
Resposta 200
| domain | string | |
| redirect_url | string | null |
/api/domains/{domain}/for-saleAnuncie 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* | string | Nome de domínio para listar para venda |
Solicitar corpo
| price* | number | Preço de venda em USD |
| description | string | Descrição opcional da listagem |
Resposta 200
| listing | object | |
| hint | string |
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."
}/api/domains/{domain}/for-saleAtualizar 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* | string | Nome de domínio com listagem ativa |
Solicitar corpo
| price | number | Novo preço de venda em USD |
| description | string | null | Nova descrição (nulo para limpar) |
Resposta 200
| listing | object | |
| hint | string |
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."
}/api/domains/{domain}/for-saleCancelar 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* | string | Nome de domínio para remover da lista |
Resposta 200
| domain | string | |
| status | string | |
| hint | string |
Resposta de exemplo
{
"domain": "example.com",
"status": "cancelled",
"hint": "Listing for example.com has been cancelled."
}/api/domains/{domain}/analyticsObtenha 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* | string | Nome de domínio |
Resposta 200
| domain | string | |
| views_7d | integer | Total de visualizações de página nos últimos 7 dias |
| views_30d | integer | Total de visualizações de página nos últimos 30 dias |
| inquiries_30d | integer | Total de consultas nos últimos 30 dias |
| conversion_rate | number | Proporção de consulta por visualização como porcentagem |
| daily_views | object[] | Contagens de visualizações diárias dos últimos 30 dias |
| recent_inquiries | object[] | 5 consultas mais recentes |
| hint | string |
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)."
}/api/domains/{domain}/auth-codeObtenha 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| status | string | `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_code | string | null | Código de autorização EPP a ser fornecido ao novo registrador. null enquanto o status for requested. |
| was_unlocked | boolean | Se o domínio foi desbloqueado para permitir a transferência |
| requested_at | string (date-time) | Quando o código foi solicitado (registradores sem API para isso) |
| expected_by | string (date-time) | Até quando a equipe da Domani terá o código, no máximo (status requested) |
| hint | string | |
| next_steps | string[] |
/api/domains/{domain}/transfer-awayObtenha 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| status | string | |
| gaining_registrar | string | |
| request_date | string (date-time) | |
| hint | string |
/api/domains/{domain}/transfer-statusVerifique 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| status | string | |
| timestamp | string | Data e hora da última atualização de status |
| hint | string | Orientação prática com base no status atual |
| continuity | object | Delegação capturada e verificação pós-transferência para transferências seguras. |
/api/domains/importImporte 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* | string | Domínio a importar |
Resposta 200
| domain | string | |
| status | string | |
| token | string | |
| txt_record | object | |
| hint | string |
/api/domains/import/verifyVerifique 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* | string | Domínio a ser verificado |
Resposta 201
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| registrar | string | |
| payment_method | string | |
| hint | string |
/api/domains/adoption-planPlaneje 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* | string | Domínio existente para inspecionar, por ex. meusite.com |
Resposta 200
| version | integer | |
| domain | string | |
| registered | boolean | |
| account_state | string | |
| recommended_action | string | |
| current | object | |
| options | object | |
| invariants | string[] | |
| warnings | string[] |
/api/domains/transfer-checkVerifique 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* | string | Domínio a ser verificado, por ex. meusite.com |
Resposta 200
| domain | string | |
| tld | string | |
| eligible | boolean | |
| price | number | null | Preço de transferência em dólares americanos (nulo se o TLD não for compatível) |
| currency | string | |
| renewal_price | number | Somente se elegível: quanto custa cada ano após a transferência, em USD, no registrador para o qual ele vai. Ausente quando desconhecido. |
| reason | string | Motivo legível se não for elegível |
| code | string | |
| eligible_at | string (date) | Data ISO em que o domínio se torna elegível (período de espera da ICANN) |
| hint | string |
/api/domains/transfer-watchObserve 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* | string | Domínio para assistir, por ex. meusite.com |
Resposta 200
| domain | string | |
| eligible | boolean | Se o domínio está atualmente qualificado para transferência |
| eligible_at | string (date) | Data ISO em que o domínio se torna elegível (se ainda não for elegível) |
| hint | string | Orientação acionável |
| watching | boolean | Se uma notificação foi configurada |
/api/domains/transferTransferir 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* | string | Domínio a transferir, por ex. meusite.com |
| auth_code* | string | Código de autorização/EPP do provedor atual |
| payment_method | string(card | usdc | balance) | Forma de pagamento: 'card' (padrão), 'usdc' ou 'balance' (crédito no marketplace). |
| payment_tx | string | Hash de transação de um pagamento em USDC já enviado na rede. |
| payment_chain | string(base | ethereum) | Cadeia em que o pagamento em USDC foi enviado. |
| extra_subdomains | string[] | 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_price | number | Teto 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
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string | |
| auto_renew | boolean | |
| hint | string | |
| dns_snapshot | object | Resumo 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_preserved | boolean | |
| dns_migration | string | |
| continuity | object |
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"}'/api/domains/{domain}/renewRenovar 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* | string | Nome de domínio que você possui |
Solicitar corpo
| years | integer | Número de anos para renovar (padrão 1) |
| payment_method | string(card | usdc | balance) | Forma de pagamento: 'card' (padrão), 'usdc' ou 'balance' (crédito no marketplace). |
| payment_tx | string | Hash de transação de um pagamento em USDC já enviado na rede. |
| payment_chain | string(base | ethereum) | Cadeia em que o pagamento em USDC foi enviado. |
| max_price | number | Teto 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
| domain | string | |
| renewed_years | integer | |
| new_expiry | string (date-time) | |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string |
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}'/api/domains/{domain}/buy-aftermarketCompre 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* | string | O domínio listado no mercado secundário para comprar |
Solicitar corpo
| max_price | number | Teto 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_method | string(card | usdc | balance) | Forma de pagamento: 'card' (padrão), 'usdc' ou 'balance' (crédito no marketplace). |
| payment_tx | string | Hash de transação de um pagamento em USDC já enviado na rede. |
| payment_chain | string(base | ethereum) | Cadeia em que o pagamento em USDC foi enviado. |
Resposta 201
| domain | string | |
| status | string | 'active' quando a compra for concluída ou 'provisioning' enquanto uma transferência gradual é finalizada. |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string | |
| marketplace | string | mercado secundário em que o domínio foi comprado (por exemplo, 'Afternic', 'Sedo'). |
| hint | string | |
| next_steps | string[] |
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
/api/domains/{domain}/dnsObtenha 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| records | DnsRecord[] | |
| zone_version | string | Token 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"
/api/domains/{domain}/dnsDefina 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* | string | Nome de domínio que você possui |
Solicitar corpo
| records* | DnsRecord[] | |
| zone_version | string | A 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
| success | boolean | |
| domain | string | |
| records | DnsRecord[] |
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}
]}'/api/domains/{domain}/dnssecListar 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| enabled | boolean | Verdadeiro quando pelo menos um registro DS é publicado |
| records | DsRecord[] |
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"
/api/domains/{domain}/dnssecPublicar 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* | string | Nome de domínio que você possui |
Resposta 200
| success | boolean | |
| domain | string | |
| enabled | boolean | |
| records | DsRecord[] |
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..."}'/api/domains/{domain}/dnssecRemover 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* | string | Nome de domínio que você possui |
| keyTag* | string | Tag-chave do registro DS a ser removida |
Resposta 200
| success | boolean | |
| domain | string | |
| enabled | boolean | |
| records | DsRecord[] |
Exemplo
curl -X DELETE "https://domani.run/api/domains/mysite.com/dnssec?keyTag=12345" \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dns/snapshotCapture 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* | string | Nome de domínio que você possui |
Solicitar corpo
| extra_subdomains | string[] | Subdomínios adicionais para incluir no snapshot |
Resposta 200
| domain | string | |
| records | DnsRecord[] | |
| subdomains | string[] | |
| sources | string[] | |
| capturedAt | string (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"
/api/domains/{domain}/dns/restoreRestaurar 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* | string | Nome de domínio que você possui |
Solicitar corpo
| snapshot | object | Um objeto de instantâneo DNS (conforme retornado pelo ponto final do instantâneo). Se omitido, o backup armazenado no servidor será usado. |
| dry_run | boolean | Somente visualização: retorna o que a restauração criaria (would_apply) e pularia, sem escrever nada. |
Resposta 200
| domain | string | |
| applied | integer | Número de registros criados |
| skipped | integer | Número de registros já presentes |
| recordCount | integer | Total de registros no instantâneo |
| errors | string[] | |
| dry_run | boolean | É verdade quando esta era uma prévia - nada foi escrito |
| would_apply | DnsRecord[] | 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"
/api/domains/{domain}/dns/cloneClonar 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* | string | Domínio de destino (DNS está escrito aqui) |
Solicitar corpo
| from* | string | Domínio de origem para copiar o DNS (deve ser seu) |
| replace | boolean | Espelho exato - elimina registros de destino que a origem não possui. Padrão: mesclar |
Resposta 200
| success | boolean | |
| from_domain | string | |
| to_domain | string | |
| records | DnsRecord[] |
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"}'/api/domains/{domain}/nameserversObtenha 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| nameservers | string[] | |
| default_nameservers | string[] | 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_provider | string | Quem 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 |
| hint | string |
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"
/api/domains/{domain}/nameserversDefinir 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* | string | Nome 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
| success | boolean | |
| domain | string | |
| nameservers | string[] | |
| hint | string |
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
/api/domains/{domain}/connectConecte 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* | string | Nome de domínio que você possui |
Solicitar corpo
| target | string | URL de destino para detecção automática (por exemplo, my-app.vercel.app) |
| provider | string | Nome explícito do provedor (por exemplo, vercel, google-workspace) |
| method | string | Método de conexão se o provedor tiver vários (por exemplo, somente cname) |
| dry_run | boolean | Somente visualização: retorna as diferenças (create/replace/already_set/keep) sem gravar nada. |
| confirm_replace_mx | boolean | Obrigató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
| domain | string | |
| provider | string | |
| category | string | |
| method | string | |
| records | DnsRecord[] | |
| docs | string (uri) | |
| status | string | dns_set = registros gravados automaticamente. manual_setup_required = domínio importado, adicione registros em seu registrador. dry_run = apenas visualização, nada escrito. |
| hint | string | |
| next_steps | string[] | Ações específicas do provedor a serem concluídas após a definição dos registros DNS |
| diff | object | Somente 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"}'/api/domains/{domain}/connectListar 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| providers | object |
/api/domains/{domain}/verifyVerifique 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* | string | Nome de domínio que você possui |
Solicitar corpo
| target | string | Alvo para detecção automática |
| provider | string | Nome do provedor |
| method | string | Nome do método |
Resposta 200
| domain | string | |
| provider | string | |
| method | string | |
| verified | boolean | |
| message | string | |
| hint | string | |
| next_steps | string[] | 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
/api/domains/{domain}/statusVerifique 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| days_until_expiry | integer | |
| dns | object | |
| ssl | object | |
| object |
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
/api/domains/{domain}/verify-serviceAdicione 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* | string | Nome de domínio que você possui |
Solicitar corpo
| service* | string | Nome do serviço (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365) |
| token* | string | Token de verificação fornecido pelo serviço |
Resposta 200
| domain | string | |
| service | string | |
| service_display_name | string | |
| known_service | boolean | |
| records_added | DnsRecord[] | |
| total_records | integer | |
| docs | string (uri) | null | |
| hint | string |
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"}'/api/domains/{domain}/verify-serviceListar 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* | string | Nome de domínio que você possui |
Resposta 200
| domain | string | |
| services | object[] | |
| hint | string |
Descoberta
/api/domains/{domain}/profilePúblicoObtenha 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
| profile | PublicDomainProfile |
/api/domains/{domain}/profilePúblicoPesquise 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 | |
| depth | string(instant | deep) | Profundidade da pesquisa. O padrão é profundo. |
Resposta 201
| profile | PublicDomainProfile |
/api/domains/whoisPúblicoProcure 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* | string | Domínio a ser pesquisado (por exemplo, example.com) |
Resposta 200
| domain | string | |
| registered | boolean | Se o domínio está atualmente registrado |
| registrar | string | null | Nome do registrador atual |
| registrar_url | string | null | URL do site do registrador |
| registrar_iana_id | string | null | ID da IANA do registrador (de RDAP publicIds) |
| created | string | null | Data de registro (YYYY-MM-DD) |
| expires | string | null | Data de validade (YYYY-MM-DD) |
| updated | string | null | Data da última atualização (YYYY-MM-DD) |
| days_until_expiry | integer | null | Dias até o vencimento (nulo se não registrado) |
| status | string[] | Códigos de status EPP |
| nameservers | string[] | Servidores de nomes autorizados |
| dnssec | boolean | Se o DNSSEC está ativado |
| redacted | boolean | Se os dados WHOIS/RDAP são ocultos para fins de privacidade (GDPR) |
| contacts | object | Informaçõ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"
/api/domains/{domain}/ogPúblicoObtenha 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* | string | Domínio para buscar metadados (por exemplo, google.com) |
Resposta 200
| title | string | null | Título da página (og:title > twitter:title > <title>) |
| description | string | null | Descrição da página (og:description > meta descrição) |
| image | string | null | URL da imagem OG (absoluta) |
| favicon | string | null | URL do favicon (absoluto) |
Exemplo
curl "https://domani.run/api/domains/google.com/og"
Faturamento
/api/billing/setupObtenha 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
| mode | string(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
| url | string (uri) | URL do Stripe Checkout - abra-o em um navegador para adicionar um cartão |
| client_secret | string | Segredo do cliente Stripe SetupIntent, para um frontend que usa o Stripe.js diretamente |
| hint | string | Orientaçã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"
/api/billing/cardRemover 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
| removed | boolean |
Resposta de exemplo
{
"removed": true
}Exemplo
curl -X DELETE https://domani.run/api/billing/card \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/connectObtenha 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
| onboarded | boolean | O vendedor enviou detalhes de integração do Connect |
| payouts_enabled | boolean | Os pagamentos bancários estão ativos |
| details_submitted | boolean | |
| balance_cents | integer | Saldo 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"
/api/billing/connectIniciar 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
| url | string (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"
/api/billing/connect/payoutRetirar 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_cents | integer | Valor transferido em centavos |
| transfer_id | string | ID 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"
/api/billing/invoicesListar 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
| limit | integer | Máximo de faturas a serem devolvidas |
Resposta 200
| invoices | object[] | |
| has_more | boolean | |
| hint | string |
Exemplo
curl https://domani.run/api/billing/invoices \ -H "Authorization: Bearer domani_sk_xxx"
Referências
/api/referralsObtenha 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_code | string | Seu código de referência exclusivo para compartilhar |
| referral_rate | integer | Porcentagem de comissão (atualmente 20%) |
| total_earned_cents | integer | Ganhos totais em centavos |
| total_paid_cents | integer | Total pago em centavos |
| total_pending_cents | integer | Pagamento pendente em centavos |
| referrals | object[] |
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
/api/backordersFaç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* | string | Domínio atualmente registrado que será monitorado para tentar registrá-lo quando for liberado. |
| max_price | number | Valor 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_method | string(card | balance) | Método de pagamento usado se o registro for concluído. O padrão é seu método preferido. |
Resposta 201
| backorder | Backorder | |
| hint | string |
Exemplo
curl -X POST https://domani.run/api/backorders \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain": "taken.com"}'/api/backordersListe seus reservas
Retorna seus backorders do mais recente ao mais antigo. Filtre por status (watching, caught, failed, cancelled, expired).
Parâmetros
| status | string(watching | caught | failed | cancelled | expired) | Filtre por status. |
Resposta 200
| backorders | Backorder[] |
/api/backorders/{id}Obter um reserva
Parâmetros
| id* | string | ID do reserva. |
Resposta 200
| backorder | Backorder |
/api/backorders/{id}Cancelar um reserva
Para de monitorar um domínio. Somente reservas no estado watching podem ser cancelados.
Parâmetros
| id* | string | ID do reserva. |
Resposta 200
| id | string | |
| status | string | |
| hint | string |
Mercado
/api/domains/sellAnuncie 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* | string | Nome de domínio para listar para venda |
| price* | number | Preço de venda em USD |
| description | string | Descrição opcional da listagem |
Resposta 201
| listing | object | |
| txt_record | object | null | Registro TXT a ser adicionado para verificação de propriedade (somente para domínios externos) |
| hint | string |
/api/domains/sell/verifyVerifique 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* | string | Nome de domínio para verificar |
Resposta 200
| listing | object | |
| hint | string |
/api/domains/sell/statusVerifique 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* | string | Nome de domínio para verificar |
Resposta 200
| listing | object | null | |
| deal | object | null | |
| hint | string |
/api/dealsListe 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
| role | string(buyer | seller) | Filtrar por função |
| status | string(active | escrow_held | epp_pending | transfer_started | completed | refunded | expired) | Filtrar por status ('active' = todos não terminais) |
| domain | string | Filtrar por nome de domínio |
| limit | integer | Número de transações a serem retornados (padrão 50, máximo 100) |
| cursor | string | Cursor de paginação de uma resposta anterior |
Resposta 200
| deals | object[] | |
| has_more | boolean | Se mais resultados estão disponíveis |
| next_cursor | string | null | Cursor para a próxima página |
/api/dealsComprar 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* | string | Nome de domínio para comprar |
| payment_method | string(card | usdc | balance) | Forma de pagamento: 'card' (padrão), 'usdc' ou 'balance' (crédito no marketplace). |
Resposta 201
| deal | object | |
| hint | string | |
| next_steps | string[] |
/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* | string | ID da transação |
Resposta 200
| deal | object | |
| hint | string |
/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* | string | ID da transação |
Solicitar corpo
| auth_code* | string | Código EPP/autorização do registrador atual |
Resposta 200
| deal | object | |
| hint | string |
/api/deals/{id}/invoiceObtenha 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
| invoice | DealInvoice |
/api/negotiationsListe 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
| role | string(buyer | seller) | Filtre por sua função |
| status | string | Filtrar por status (open|agreed|completed|declined|expired|cancelled|all) |
Resposta 200
| negotiations | Negotiation[] |
/api/negotiationsFaç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* | string | O domínio listado para negociar |
| offer* | number | Oferta inicial em dólares americanos |
| message | string | Mensagem opcional para o vendedor |
Resposta 201
| negotiation | Negotiation |
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}'/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
| negotiation | Negotiation |
/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) | |
| counter | number | Novo valor em USD (obrigatório quando action=counter) |
| message | string |
Resposta 200
| negotiation | Negotiation |
/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
| cancelled | boolean |
/api/negotiations/{id}/finalizeFinalizar 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_method | string(card | usdc | balance) | |
| payment_signature | string | null | |
| payment_tx | string | |
| payment_chain | string | |
| confirm_over_budget | boolean | Para transações intermediadas: prossiga mesmo que o preço acordado exceda o max_budget que você definiu. |
/api/brokerListe suas solicitações de corretor
Lista suas solicitações de aquisição de domínio e seu status. Requer escopo deals:read.
Parâmetros
| status | string | Filtrar por status ou 'all' |
Resposta 200
| requests | BrokerRequest[] |
/api/brokerSolicitar 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* | string | O domínio já registrado que você deseja |
| max_budget | number | Seu teto em USD (opcional) |
Resposta 201
| request | BrokerRequest |
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}'/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
| request | BrokerRequest |
/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
| cancelled | boolean |
/api/broker/respondPúblicoLeia 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* | string | O token de divulgação do seu e-mail de consulta. |
Resposta 200
| domain | string | |
| status | string | |
| your_turn | boolean | Quer seja a mudança do proprietário. |
| current_offer_usd | number | null | A oferta do comprador na mesa. |
| agreed_price_usd | number | null | |
| actions | string[] | 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>"
/api/broker/respondPúblicoResponder 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* | string | O 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. |
| price | number | Seu preço pedido em dólares americanos (obrigatório para oferta/balcão). |
Resposta 200
| handled | boolean | |
| outcome | string | Valores de status: opted_out | declined | negotiation_opened | countered | ignored_not_your_turn | unclear |
| status | string | |
| negotiation_id | string | |
| domain | string |
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
/api/oauth/registerRegistrar 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_name | string | Exibido na tela de consentimento |
| token_endpoint_auth_method | string(none | client_secret_post | client_secret_basic) | |
| client_uri | string | |
| logo_uri | string |
Resposta 201
| client_id | string | |
| client_name | string | |
| redirect_uris | string[] | |
| token_endpoint_auth_method | string | |
| grant_types | string[] | |
| response_types | string[] | |
| client_id_issued_at | integer | |
| client_secret | string | Somente para clientes confidenciais; retornado uma vez |
/api/oauth/tokenEndpoint 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_token | string | |
| token_type | string | |
| expires_in | integer | |
| refresh_token | string | |
| scope | string |