Documentación de Mailzero
La API detrás de Today: conecta una bandeja de entrada, lee el resumen y los hechos, entrega los tipos de asuntos que elijas a tus agentes bajo delegaciones permanentes, y déjalos actuar dentro de permisos con un recibo por cada efecto. Dominios, DNS y el resto de la plataforma mantienen su referencia más abajo.
Soporte: support@mailzero.run
Autenticación
Todos los endpoints autenticados requieren un token Bearer en el encabezado Authorization.
curl https://domani.run/api/domains/search?q=example.com \ -H "Authorization: Bearer domani_sk_xxx"
Obtenga una clave API mediante creando una cuenta o desde el Ajustes. Algunos puntos finales (búsqueda, TLD, WHOIS) son públicos pero tienen límites de tarifas más bajos sin autenticación.
Alcances de tokens
Los tokens se pueden restringir a ámbitos de permisos específicos. uso * para acceso completo (predeterminado). Cree tokens con alcance a través de `POST /api/tokens` con un `scopes` matriz.
| Alcance | Otorga acceso 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 (implica pago, incluye compras en el 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 | Elimina permanentemente los mensajes que ya están en la Papelera. Mover mensajes a la Papelera solo requiere correo email:write. Otorgue este alcance solo a los agentes autorizados a borrar irreversiblemente el contenido del correo electrónico. |
| email:manage_mailboxes | Crea buzones (POST /api/emails) y nada más. Este alcance de administración restringido permite a los agentes crear direcciones para nuevos proyectos (partners@, launch@) sin poder leer ni enviar correo, gestionar dominios ni manipular tokens |
| email:auth_secrets | Leer mensajes clasificados como correo de autenticación (OTP/códigos de verificación, restablecimientos de contraseña, enlaces mágicos). Sin él, email:read todavía los enumera, pero el asunto y el cuerpo quedan ocultos, por lo que un token de agente robado no puede recopilar códigos 2FA. Concédelo solo a los agentes que realmente necesitan completar inicios de sesión |
| 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 |
Atenuación del alcance: un token solo puede crear tokens secundarios con alcances iguales o menores, nunca más.
Devoluciones de alcance faltantes 403 con codigo `INSUFFICIENT_SCOPE` y una pista que nombra el alcance requerido.
Inicio rápido para agentes: el ciclo de tareas
Dale a un agente una identidad y un token, entrégale un tipo de asunto con una delegación permanente en observación, luego déjalo leer el sobre de cada asunto, solicitar efectos e informar. El nivel y los permisos aprueban, escalan a ti o rechazan; cada efecto deja un recibo; aumenta el nivel cuando los recibos lo justifiquen.
# 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."}'Asistente Mailzero
Los endpoints del asistente Mailzero convierten el correo del propio usuario en Decisiones fundamentadas: una cola de Hoy versionada, un Elemento de trabajo por cada hilo que requiere criterio y un Plan de acción exacto que se prepara solo después de que el usuario elija. Nada bajo /api/assistant envía, elimina ni modifica correo; la salida del modelo es siempre una propuesta que el servidor valida.
Lo cubren dos alcances: assistant:read para ajustes, Hoy, Elementos de trabajo, Planes de acción, progreso de importación y Actividad; assistant:write para cambios de ajustes, consentimiento e importaciones de historial, Decisiones humanas sobre Elementos de trabajo y exportación o eliminación de datos derivados.
El procesamiento empieza solo tras un consentimiento explícito: POST /api/assistant/preview registra la versión del consentimiento, delimita los buzones propios e inicia una importación reanudable en segundo plano. Consulta periódicamente GET /api/assistant/backfill para ver el progreso.
curl -X POST https://domani.run/api/assistant/work-items/wi_789/interactions -H "Authorization: Bearer domani_sk_xxx" -H "Content-Type: application/json" -d '{"type":"choose","work_item_version":3,"decision_id":"dec_1","decision_version":1,"option_id":"opt_send","idempotency_key":"choose-wi_789-opt_send-1"}'Una elección prepara un plan exacto. Léelo con GET /api/assistant/action-plans/{id}, muéstraselo al usuario y luego envía a través del endpoint de respuesta habitual POST /api/emails/{address}/messages/{id}/reply con assistant_plan_id. El servidor rechaza los planes caducados o que no coinciden, registra un recibo por cada envío y mueve el Elemento de trabajo a En espera o Resuelto.
Webhooks de buzones de correo autenticados
En el panel, abra la pestaña Correo electrónico de un dominio, elija un buzón y luego seleccione Authorization o X-API-Key. Domani cifra el valor y lo envía con pruebas de webhook y entregas de correo electrónico entrante. Las entregas entrantes en vivo son duraderas y se reintentan hasta tres veces; `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_AUTHLos valores del encabezado nunca se devuelven. Las respuestas solo exponen `header_names`. Omitir `headers` para preservar el valor almacenado, envíe un objeto vacío para borrarlo y use `POST /api/emails/`'{address}'`/webhook/test` para verificar la entrega.
¿Empezar desde cero? incluir `webhook_headers` en `POST /api/agents/provision` para comprar el dominio, crear su buzón y adjuntar el webhook del evento autenticado en una llamada idempotente. Domani valida la URL y los nombres de los encabezados antes de cualquier cargo.
Errores
Todos los errores devuelven un sobre JSON coherente. uso `code` para el manejo programático y `hint` para obtener orientación sobre la recuperación.
{
"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 |
Límites de tarifas
Cada respuesta incluye encabezados de límite de tasa:
`X-RateLimit-Limit`- solicitudes máximas por ventana`X-RateLimit-Remaining`- quedan solicitudes`X-RateLimit-Reset`- marca de tiempo de Unix cuando se restablece la ventana
Cuando la tarifa es limitada (HTTP 429), verifique la `Retry-After` encabezado durante unos segundos para esperar.
Asistente Mailzero
/api/assistant/rulesListar las delegaciones permanentes
Las reglas de delegación permanente del propietario en orden: nombre, el predicado de coincidencia, el asignatario (una identidad de agente o un miembro del espacio de trabajo), el nivel de autonomía, cuántas veces coincidió cada una. Requiere assistant:read; un token de agente es rechazado.
Respuesta 200
| rules | AssistantRule[] |
/api/assistant/rulesCrear una delegación permanente
Entregar un tipo de asunto a un agente o una persona una vez. match es un predicado explícito, nunca una llamada de modelo: cualquiera de senderAddress, senderDomain, organisation, workKeyPrefix, senderKind, mailboxIds, labels, subjectPattern (anclado, sin distinción de mayúsculas y minúsculas), minOccurrences, minConfidence (la probabilidad del clasificador calibrado en una etiqueta category:, de 0,5 a 1); cada condición declarada debe cumplirse. Las reglas están ordenadas y la primera coincidencia gana; el nivel es observe a menos que se indique lo contrario. Una regla coincidente entrega el siguiente elemento coincidente al asignatario, se lo comunica mediante el aviso de delegación, y Today muestra por qué. Requiere assistant:write; un token de agente es rechazado.
Respuesta 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}Cambiar una delegación permanente
Renombrar, habilitar o deshabilitar, reordenar, cambiar la coincidencia, el asignatario, el nivel o los otorgamientos. Reducir el nivel a observe es el interruptor de apagado de un clic de una regla. Requiere assistant:write; un token de agente es rechazado.
Parámetros
| id* | string |
Respuesta 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}Eliminar una delegación permanente
Elimina la regla; los elementos que entregó vuelven al propietario, los recibos de lo que hizo el asignatario permanecen. Requiere assistant:write; un token de agente es rechazado.
Parámetros
| id* | string |
Respuesta 200
| deleted | boolean | |
| released_items | integer |
/api/assistant/rules/testProbar las delegaciones permanentes con hechos de muestra
Una ejecución de prueba: qué regla tomaría un asunto con estos hechos (buzón, clave, remitente, asunto, etiquetas, ocurrencias), y por qué. Nada cambia. Requiere assistant:write; un token de agente es rechazado.
Cuerpo de la solicitud
| mailbox_id* | string | |
| key* | string | La clave del elemento de trabajo, por ejemplo org:tucows:invoice |
| sender_address | string | null | |
| sender_kind | string(human | automated) | |
| subject | string | null | |
| labels | string[] | |
| occurrences | integer | |
| confidence | object | La probabilidad del clasificador por etiqueta, para una regla con minConfidence |
Respuesta 200
| matched | boolean | |
| rule | AssistantRule | |
| why | string[] | |
| considered | integer |
/api/assistant/rules/{id}/checkProbar un efecto contra el nivel y los permisos de una delegación vigente
Una ejecución de prueba del orden de validación para un efecto solicitado bajo la regla hoy: el nivel permite el tipo; los permisos permiten los destinatarios, el volumen (el conteo de efectos ejecutados hoy), el horario, el gasto, las clases de riesgo leídas del asunto; el aprobador requerido aprobó. Responde el estado que tomaría un plan (proposed, approved, escalated o rejected) con cada verificación y por qué. Nada cambia. Requiere assistant:write; un token de agente es rechazado.
Parámetros
| id* | string |
Cuerpo de la solicitud
| effect* | object | |
| matter | object | |
| at | string (date-time) | El instante en el que verificar el horario; ahora por defecto |
| approved_by | string[] | Ids de miembros que ya aprobaron |
Respuesta 200
| rule | object | |
| allowed_kinds | string[] | |
| effective_grants | AssistantGrants | |
| outcome | string | |
| check | AssistantGrantCheck | |
| hint | string |
/api/assistant/metricsLeer las métricas de tareas
Los siete números de la capa de tareas en una ventana móvil (treinta días por defecto, window_days de 1 a 90), para la cuenta y para cada delegación permanente: asuntos cerrados sin el owner, el tiempo desde la llegada hasta done, los planes ejecutados como se propusieron, editados y rechazados, las escalations por asunto, las correcciones después de la ejecución, las collisions, el costo del modelo por asunto. Leído de los receipts, los planes, las escalations y el ledger; nada es estimado. Requiere assistant:read.
Parámetros
| window_days | integer |
Respuesta 200
| type | string | |
| as_of | string (date-time) | |
| window_days | integer | |
| account | AssistantTaskNumbers | |
| rules | object[] |
/api/assistant/approvalsListar la cola de aprobaciones
Los planes esperando al propietario (propuestos en borrador, o retenidos por un permiso) y las preguntas que los asignados hicieron, a través de los asuntos que el lector puede ver. Responder a través de las interacciones del elemento de trabajo: aprobar o rechazar un plan, elegir una opción o instruir sobre una pregunta. Requiere assistant:read. Un asunto creado a partir de un correo de autenticación antes de que ese correo quedara fuera del asistente se muestra con su título, su resumen, su petición y los efectos de su plan retenidos para un lector sin email:auth_secrets.
Respuesta 200
| type | string | |
| as_of | string (date-time) | |
| plans | object[] | |
| escalations | object[] |
/api/assistant/suggestionsEnumerar las sugerencias de delegación
Las delegaciones permanentes que el asistente propone: un asunto que se repitió al menos tres veces en noventa días (la misma organización o remitente) y se manejó de la misma manera cada vez (ignored, answered, closed, handed to one agent), con la regla prellenada. Las abiertas por defecto. No se crea nada hasta que el propietario acepte. Requiere assistant:read; un token de agente es rechazado.
Parámetros
| status | string(open | accepted | dismissed) |
Respuesta 200
| suggestions | AssistantSuggestion[] |
/api/assistant/suggestions/{id}Aceptar o descartar una sugerencia de delegación
Aceptar: la sugerencia se cierra y la regla prellenada regresa para que el cliente la cree (POST /api/assistant/rules). Descartar: se cierra y nunca regresa para los mismos asuntos y manejo. Requiere assistant:write; un token de agente es rechazado.
Parámetros
| id* | string |
Cuerpo de la solicitud
| action* | string(accept | dismiss) |
Respuesta 200
| suggestion | AssistantSuggestion | |
| rule | AssistantRuleInput |
/api/assistant/grantsListar los permisos adjuntos a los asignatarios
Los permisos adjuntos a los agentes y miembros del propietario, además de cada regla que les entrega asuntos; se aplica el más estricto entre el de la regla y el del asignatario. Requiere assistant:read; un token de agente es rechazado.
Respuesta 200
| grants | AssistantAssigneeGrants[] |
/api/assistant/grantsEstablecer los permisos de un asignatario
Adjuntar permisos a una identidad de agente o un miembro del espacio de trabajo; reemplazan los permisos anteriores del asignatario y limitan cada regla que les entrega asuntos. Requiere assistant:write; un token de agente es rechazado.
Cuerpo de la solicitud
| assignee_type* | string(agent | member) | |
| assignee_ref* | string | El slug de identidad del agente, o el id de usuario del miembro |
| grants* | AssistantGrants |
Respuesta 200
| assignee | object | |
| grants | AssistantGrants | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
/api/assistant/grants/{type}/{ref}Eliminar los permisos de un asignatario
El asignatario conserva solo lo que cada regla otorga. Requiere assistant:write; un token de agente es rechazado.
Parámetros
| type* | string(agent | member) | |
| ref* | string |
Respuesta 200
| deleted | boolean |
/api/assistant/tasks/{id}Leer un sobre de tarea
El asunto entregado, como el asignado lo necesita: el resumen con la evidencia, los hechos, la delegación (asignado, regla, nivel, los tipos de efecto permitidos, los permisos efectivos), los planes abiertos y recientes, el arrendamiento. Un token de agent lee los asuntos entregados a él y los de los buzones que opera; el propietario lee los suyos. Requiere assistant:read. Un asunto creado a partir de un correo de autenticación antes de que ese correo quedara fuera del asistente se muestra con su título, su resumen, su petición y los efectos de su plan retenidos para un lector sin email:auth_secrets.
Parámetros
| id* | string | El id del elemento de trabajo |
Respuesta 200
| id | string | El id del elemento de trabajo |
| version | integer | |
| status | string | |
| deadline | string (date-time) | null | |
| you | object | |
| delegation | object | |
| lease | AssistantTaskLease | |
| brief | object | null | El resumen del asunto, como GET /api/assistant/work-items/{id}/brief lo responde |
| facts | object | null | Los hechos del asunto, como GET /api/assistant/work-items/{id}/facts los responde |
| plans | object | |
| escalations | object[] | Las preguntas realizadas en la tarea, las más recientes primero, con sus respuestas |
/api/assistant/tasks/{id}/leaseTomar o renovar el arrendamiento en una tarea
Dos asignados nunca trabajan un asunto: el arrendamiento nombra quién lo trabaja hasta cuándo (quince minutos por defecto, hasta una hora). Tomarlo de nuevo lo renueva; otro titular es rechazado con TASK_LEASED hasta el vencimiento. Una solicitud de efectos toma el arrendamiento por sí misma. Requiere assistant:write.
Parámetros
| id* | string |
Cuerpo de la solicitud
| ttl_seconds | integer |
Respuesta 200
| task_id | string | |
| lease | AssistantTaskLease |
/api/assistant/tasks/{id}/leaseDevolver el arrendamiento
Libera el arrendamiento que el llamador tiene; un arrendamiento en poder de otro asignado se deja solo. Requiere assistant:write.
Parámetros
| id* | string |
Respuesta 200
| task_id | string | |
| released | boolean | |
| lease | AssistantTaskLease |
/api/assistant/tasks/{id}/effectsSolicitar efectos en una tarea
El asignado solicita uno o más efectos (reply, forward, label, snooze, resolve, note, request). El nivel de la delegación decide los tipos permitidos y los permisos los limitan: dentro de los permisos en guarded_send u operate (y los tipos de entrada en triage) los efectos se ejecutan de inmediato con sus recibos; en draft esperan la aprobación del propietario; un permiso fallido escala al propietario; un tipo que el nivel no permite es rechazado. La propia solicitud del propietario se ejecuta de inmediato. La misma clave de idempotencia responde el primer plan de nuevo. Requiere assistant:write.
Parámetros
| id* | string |
Cuerpo de la solicitud
| effects* | AssistantEffect[] | |
| idempotency_key* | string | |
| note | string | Qué quiere el asignado que el propietario sepa sobre esta solicitud |
Respuesta 200
| task_id | string | |
| replayed | boolean | |
| plan | AssistantPlan | |
| execution | object | null | |
| lease | AssistantTaskLease | |
| hint | string |
/api/assistant/tasks/{id}/escalateDetener y preguntar al propietario
El asignado hace una pregunta con la evidencia y, cuando es útil, las opciones que ve. El propietario responde con las interacciones ordinarias de elegir o instruir sobre la decisión que esto crea; el asunto se muestra en Today como que necesita al propietario, el arrendamiento se libera, la tarea espera. Requiere assistant:write.
Parámetros
| id* | string |
Cuerpo de la solicitud
| question* | string | |
| options | object[] | |
| evidence_refs | string[] |
Respuesta 200
| task_id | string | |
| escalation_id | string | |
| decision_id | string | |
| status | string | |
| version | integer | |
| hint | string |
/api/assistant/tasks/{id}/reportReportar sobre una tarea
Lo que hizo el asignado y cómo terminó: done (el asunto se resuelve, o espera cuando aún se espera una respuesta), blocked (se pregunta al propietario), o handed back (el propietario toma el control y la regla permanece fuera de este asunto). Las reclamaciones se concilian con los recibos que escribió la plataforma: una reclamación sin recibo se registra como una reclamación, nunca como un hecho. El arrendamiento se libera. Requiere assistant:write.
Parámetros
| id* | string |
Cuerpo de la solicitud
| outcome* | string(done | blocked | handed_back) | |
| summary* | string | |
| evidence_refs | string[] | |
| claims | object[] |
Respuesta 200
| task_id | string | |
| outcome | string | |
| status | string | |
| reconciliation | object | |
| receipt_id | string | |
| hint | string |
/api/emails/{address}/messages/{id}/factsLee lo que el asistente estableció sobre un mensaje
El conocimiento que los análisis de este mensaje produjeron: afirmaciones (sujeto, predicado, valor con tipo y moneda, base, confianza, validez, evidencia), entidades, compromisos y expectativas. Nada se calcula en el camino: un mensaje que el pipeline nunca analizó responde analysed: false con reason (not_enabled cuando el buzón no está en el asistente, not_analysed cuando el análisis aún no ha ocurrido). Requiere assistant:read.
Parámetros
| address* | string | |
| id* | string | ID de mensaje |
Respuesta 200
| message_id | string | |
| thread_id | string | |
| analysed | boolean | |
| reason | string | Solo cuando analysed es false |
| analysis | object | |
| facts | Fact[] | |
| entities | object[] | |
| commitments | object[] | |
| expectations | object[] |
/api/emails/{address}/messages/{id}/extractExtrae los campos que necesitas de un mensaje con tu propio esquema
Una llamada al modelo sobre el texto del mensaje (asunto, remitente, cuerpo) con un esquema JSON del llamador de objetos y primitivos (hasta 8 KB, sin referencias): responde data en esa forma, confidence (0 a 1) y evidence_quotes (extractos textuales). Almacenado en caché por (mensaje, esquema, instrucciones) así que la misma pregunta cuesta una llamada (cached: true después). Limitado por el presupuesto de modelo de la cuenta (429 cuando se agota, 503 cuando la ruta del modelo está desactivada). Los correos de código de inicio de sesión responden 403 AUTH_MESSAGE. Los cuerpos de más de 60,000 caracteres responden 413.
Parámetros
| address* | string | |
| id* | string | ID de mensaje |
Cuerpo de la solicitud
| schema* | object | Esquema JSON de los campos a extraer: un objeto de primitivos, arrays y objetos anidados, menor a 8 KB, sin $ref |
| instructions | string | Orientación opcional, por ejemplo, cantidades en EUR |
Respuesta 200
| message_id | string | |
| data | object | |
| confidence | number | |
| evidence_quotes | string[] | |
| model | string | |
| cached | boolean | |
| generated_at | string (date-time) | |
| usage | object |
/api/assistant/settingsObtener configuración del asistente Mailzero
Devuelve el estado de activación del asistente, indicadores de sombra/pausa, versión de consentimiento, ruta de privacidad, alcance de buzones y todos los buzones que posees. Requiere el permiso assistant:read.
Respuesta 200
| enabled | boolean | |
| shadow_enabled | boolean | |
| paused | boolean | |
| mailbox_ids | string[] | |
| agent_mailbox_ids | string[] | Buzones operados por tus agentes. Sus elementos aparecen en la sección de agentes de Today en lugar de en Needs you. |
| agents | object[] | Tus identidades de agente, para delegar. |
| search_opt_out_mailbox_ids | string[] | Buzones cuyo correo se busca solo por palabras: sus mensajes nunca se envían al modelo de embedding. |
| brief_opt_out_mailbox_ids | string[] | Buzones cuyos resúmenes permanecen determinísticos: no se envía ningún extracto de evidencia al modelo para el resumen y el siguiente movimiento (el análisis del correo entrante no cambia) |
| history_window_days | integer | |
| privacy_route | string | |
| attachment_vision | boolean | |
| community_signals | boolean | Tus reportes de phishing cuentan para las huellas de la comunidad (un dominio, la forma de un asunto, nunca un texto o una dirección) y los conteos de la comunidad llegan a tus señales de confianza. Activado por defecto; desactivado mantiene ambos locales. |
| pipeline_version | string | |
| consent | object | |
| mailboxes | object[] |
Ejemplo de respuesta
{
"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/settingsActualizar configuración del asistente Mailzero
Habilita, pausa, reanuda o delimita explícitamente el procesamiento del asistente. Enviar mailbox_ids: [] deshabilita todos los buzones y cancela una importación de historial en curso. Reanudar requiere la versión de consentimiento actual. La recepción de correo permanece independiente. Requiere el permiso assistant:write.
Cuerpo de la solicitud
| enabled | boolean | Mostrar Decisiones de Today y generar borradores bajo demanda |
| shadow_enabled | boolean | Analizar correo sin mostrar Decisiones |
| paused | boolean | |
| mailbox_ids | string[] | IDs de buzones propios a procesar; un array vacío deshabilita todo |
| agent_mailbox_ids | string[] | Buzones operados por tus agentes. Sus elementos aparecen en la sección de agentes de Today en lugar de en Needs you. |
| history_window_days | integer | |
| attachment_vision | boolean |
Respuesta 200
| ok | boolean | |
| enabled | boolean | |
| shadow_enabled | boolean | |
| paused | boolean | |
| mailbox_ids | string[] |
Ejemplo de respuesta
{
"ok": true,
"enabled": true,
"shadow_enabled": true,
"paused": false,
"mailbox_ids": [
"mbx_123"
]
}/api/assistant/previewConsentir e iniciar una importación de historial en segundo plano
Registra el consentimiento explícito actual de IA, habilita el procesamiento en segundo plano en los buzones seleccionados del usuario y crea una importación de historial reciente reanudable. El cliente puede cerrarse inmediatamente y consultar GET /api/assistant/backfill. Requiere el permiso assistant:write.
Cuerpo de la solicitud
| mailbox_ids* | string[] | |
| history_window_days | integer | |
| consent* | boolean(true) | |
| consent_version* | string(mailzero-personal-ai.v1) |
Respuesta 200
| ok | boolean | |
| preview | object |
Ejemplo de respuesta
{
"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/backfillObtener progreso de importación de historial en segundo plano
Devuelve la fase de escaneo/análisis, mensajes procesados y totales, porcentaje, ETA adaptativo, estado de pausa y si la aplicación puede cerrarse. Requiere el permiso assistant:read.
Respuesta 200
| backfill | object | null |
Ejemplo de respuesta
{
"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/backfillReintentar mensajes fallidos de importación de historial
Vuelve a encolar los fallos terminales de la importación más reciente para buzones que permanecen habilitados para IA. Los reintentos automáticos ya se han agotado antes de que un mensaje aparezca aquí. Requiere el permiso assistant:write.
Respuesta 200
| ok | boolean | |
| retried | integer |
Ejemplo de respuesta
{
"ok": true,
"retried": 2
}/api/assistant/todayObtener la cola de decisiones fundamentadas de Today
Devuelve las proyecciones versionadas Now, Needs you, Waiting, Upcoming y Handled recientes con as_of, lag, coverage y warnings. Cada elemento enlaza a su mensaje de origen; nada aquí envía correo. Requiere el permiso assistant:read. El correo de autenticación (códigos de inicio de sesión, restablecimientos de contraseña, enlaces mágicos) nunca se convierte en un asunto y nunca llega a un modelo. Un asunto creado a partir de un correo de autenticación antes de que ese correo quedara fuera del asistente se muestra con su título, su resumen, su petición y los efectos de su plan retenidos para un lector sin email:auth_secrets.
Parámetros
| agent | string | Solo la vista de un agente: los elementos de los buzones que opera y los elementos que se le entregan. Un token vinculado a una identidad de agente siempre obtiene la vista de ese agente; nombrar otro agente responde 403 AGENT_SCOPE. |
| category | string | Solo un tipo de asunto (invoice, meeting_request, newsletter...); el campo categories de la respuesta lista cada tipo presente en la vista con su recuento. Un tipo desconocido responde 400 INVALID_CATEGORY. |
| tag | string | Solo los asuntos que llevan esta etiqueta (una de las etiquetas de la persona); el campo tags de la respuesta lista cada etiqueta de la vista con su recuento. |
Respuesta 200
| type | string | |
| as_of | string | |
| projection_lag_ms | integer | |
| category | string | null | El tipo de asunto al que se limita la vista (el parámetro category), o null para todos los tipos. |
| categories | object | Cada tipo de asunto presente en la vista, antes del filtro, con cuántos elementos contiene. |
| tag | string | null | La etiqueta a la que se limita la vista (el parámetro tag), o null para todos los asuntos. |
| tags | object | Cada etiqueta de la persona en la vista, antes del filtro, con cuántos asuntos la llevan. |
| sections | object |
Ejemplo de respuesta
{
"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}Obtener un elemento Work del asistente y el plan actual exacto
Devuelve el elemento Work fundamentado, su Decision abierta y opciones, el plan Action actual exacto, compromisos y expectativas abiertas, interacciones y recibos. Requiere el permiso assistant:read. Un asunto creado a partir de un correo de autenticación antes de que ese correo quedara fuera del asistente se muestra con su título, su resumen, su petición y los efectos de su plan retenidos para un lector sin email:auth_secrets.
Parámetros
| id* | string | ID del elemento Work de la cola Today |
Respuesta 200
| id | string | |
| version | integer | |
| status | string | |
| title | string | |
| summary | string | |
| ask | string | null | Lo único que el propietario debe hacer o decidir, o null. |
| category | string | null | El tipo de asunto que encontró el análisis (una factura, una solicitud de reunión, un boletín...), o null cuando ningún análisis lo dijo. Las reglas lo reconocen con la etiqueta category:<kind>. |
| tags | string[] | Las etiquetas de la persona en el asunto (CT-01b): confirmadas una vez o puestas a mano, cada una es una etiqueta en el hilo en el proveedor. Las reglas las reconocen como la etiqueta tag:<name>. |
| proposed_tags | string[] | Las etiquetas que el motor propone para el asunto (una por proyecto que nombró), aún sin confirmar. Confirma una con la interacción tag; después se aplica al próximo asunto del mismo proyecto sin preguntar. |
| suspect | boolean | Las señales de confianza encontraron al remitente sospechoso: el asunto se encuentra en la sección Suspect, nunca es Now, no lleva decisión, y no se ejecuta ningún efecto sobre él hasta que la persona lo reporte como legítimo. |
| suspect_reasons | string[] | Por qué parece sospechoso, una oración por señal (una autenticación fallida, un Reply-To divergente, un dominio parecido, un nombre prestado, un primer contacto sobre dinero, una instrucción al asistente, un secreto solicitado por correo de vuelta). |
| sender | object | null | |
| recurrence | object | Cuántas veces volvió esta misma situación: un elemento, N mensajes. |
| mailbox | object | |
| opened_at | string | null | |
| delegated_to | string | null | El slug del agente al que el propietario confió este elemento, o null. |
| delegation_rule | object | null | La delegación permanente que entregó este elemento, y por qué coincidió; suspendida una vez que el propietario recuperó el elemento. |
| unread | boolean | Verdadero hasta que el propietario abra el elemento después de su último cambio. |
| messages | object[] | Los mensajes de origen detrás de este elemento, del más reciente al más antiguo. |
| history | object[] | Lo que ya ocurrió en este asunto, del más antiguo al más reciente: una línea por cada mensaje 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}/briefLeer el resumen de situación de un elemento de Trabajo
Un documento que un agente lee antes de actuar: la situación (estado, atención, recurrencia, remitente), la historia hasta ahora (cada correo de ella, analizado o no), los hechos que los análisis establecieron (afirmaciones con valor, base y validez, y las entidades), los compromisos y expectativas abiertas con qué se espera de quién y desde cuándo, lo que ya se resolvió (ciclos cerrados y recibos), la Decisión actual con sus opciones, un siguiente paso sugerido (la opción recomendada de la Decisión cuando hay una, de lo contrario una regla: una promesa vencida, una expectativa vencida para perseguir, la solicitud del remitente para responder), y los mensajes de evidencia. Determinista y económico: sin llamada al modelo. Los tokens de agente leen los elementos de los buzones que operan y los elementos que se les entregan.
Parámetros
| id* | string | ID del elemento de Work |
| synthesis | boolean | Establecer en false para omitir la lectura del modelo (resumen, siguiente acción concreta, preguntas abiertas) y leer solo el brief determinístico; la lectura se almacena en caché por estado de la evidencia |
Respuesta 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 correo de la situación, del más antiguo al más reciente, con el título de una línea que le dio el análisis |
| facts | object[] | |
| entities | object[] | |
| commitments | object[] | Promesas abiertas hechas por el lado del propietario |
| expectations | object[] | Cosas abiertas esperadas de otros |
| settled | object[] | Ciclos cerrados y recibos, del más reciente al más antiguo |
| awaiting | object[] | |
| decision | object | null | La Decisión preparada actual con sus opciones |
| summary_source | string | Si el resumen es la lectura del modelo de la evidencia o la propia oración del pipeline |
| suggested_next | object | null | |
| open_questions | string[] | Lo que solo el propietario puede decidir antes de la siguiente acción, como máximo tres preguntas |
| synthesis | object | null | La llamada al modelo que escribió el resumen y la siguiente acción, null cuando el brief es solo determinístico |
| evidence | object[] | |
| owner_replies | object[] | |
| evidence_refs | string[] |
/api/assistant/briefLeer el resumen de situación para un corresponsal
Qué saber antes de responder a una persona: el resumen de su elemento de Trabajo activo más reciente en los buzones que puedes leer (o un buzón), los otros elementos que están pendientes, y sus últimos diez correos. brief es null cuando aún no se analizó nada de ellos.
Parámetros
| correspondent* | string | La dirección de correo electrónico de la persona |
| mailbox | string | Restringir a una dirección de buzón (slug@domain) |
Respuesta 200
| correspondent | string | |
| mailboxes | string[] | |
| brief | any | |
| related | object[] | |
| recent_mail | object[] | |
| generated_at | string (date-time) |
/api/assistant/work-items/{id}/factsLee los hechos detrás de un elemento de Work
Las afirmaciones y entidades fusionadas de cada análisis del elemento (el más reciente gana primero), más sus compromisos y expectativas almacenados con su estado. Los tokens de agente leen los elementos de los buzones que operan y los elementos que se les entregan.
Parámetros
| id* | string | ID del elemento de Work |
Respuesta 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 un elemento Work como abierto
Registra que el propietario abrió este elemento Work en su versión actual, lo que quita su marcador de no leído hasta que el elemento cambie de nuevo. Requiere el ámbito assistant:write.
Parámetros
| id* | string |
Respuesta 200
| ok | boolean | |
| opened_at | string | |
| unread | boolean |
/api/assistant/learnedLo que el asistente aprendió sobre ti
Las reglas de silencio que el asistente propone después de que el mismo remitente u organización fue ignorado cada vez que volvió, los silencios vigentes (un remitente, un dominio o una situación que el asistente mantiene fuera de Hoy), cada uno con su motivo, y las etiquetas confirmadas una vez, cada una aplicada al próximo asunto del mismo proyecto sin preguntar. Acepta una regla de silencio mediante el endpoint suggestions; olvida un silencio con el endpoint mutes, una etiqueta con el endpoint tags.
Respuesta 200
| mutes | object[] | Los silenciados en vigor, más recientes primero. |
| suggestions | AssistantSuggestion[] | Las reglas de silencio abiertas: acepta una a través del endpoint de sugerencias para establecer el silencio que lleva. |
| tags | object[] | Las etiquetas confirmadas una vez (CT-01b), las más recientes primero: cada una se aplica al próximo asunto del mismo proyecto sin preguntar hasta que se olvida. |
/api/assistant/learned/mutesOlvidar un silencio
El siguiente correo de ese remitente, dominio o situación vuelve a ser un ítem.
Cuerpo de la solicitud
| kind* | string(sender | sender_domain | situation) | |
| value* | string | La dirección, el dominio o la clave de situación, como la vista learned lo lista. |
Respuesta 200
| ok | boolean | |
| kind | string | |
| value | string |
/api/assistant/learned/tagsOlvidar una etiqueta
Ya no se aplica nada sin preguntar: el próximo asunto de ese proyecto propone la etiqueta de nuevo. Los asuntos que la llevan la conservan.
Cuerpo de la solicitud
| name* | string | La etiqueta, tal como la lista la vista learned. |
Respuesta 200
| ok | boolean | |
| name | string |
/api/assistant/work-items/{id}/investigateInvestigar un asunto: lo que dicen el registro y los enlaces
Lee, en ese instante, los hechos que la infraestructura pública tiene sobre el dominio del remitente (su fecha de registro y registrador, su postura SPF y DMARC, si recibe correo), a dónde realmente va cada enlace del mensaje fuente (las redirecciones seguidas un salto a la vez, el host final y los hechos del dominio), y lo que cada adjunto realmente es (sus primeros bytes contra el nombre y el tipo declarado). Responde el dossier con las señales que los hechos agregan (un dominio registrado hace días, un enlace que aterriza en otro lugar, un dominio del remitente que no protege nada, un programa nombrado como un documento). Sin proveedor, sin cuenta, nada almacenado; una búsqueda que falla es un hecho en sí mismo.
Parámetros
| id* | string |
Respuesta 200
| work_item_id | string | |
| source | string | Si el mensaje de origen fue leído, o solo la dirección del remitente. |
| checked_at | string | |
| sender | object | |
| links | object[] | |
| attachments | object[] | Lo que cada adjunto realmente es, leído desde sus primeros bytes contra lo que su nombre y tipo declarado prometen. |
| signals | object[] | Lo que los hechos añaden a la evaluación, una oración cada uno. |
/api/assistant/work-items/{id}/senderQuién está detrás de un asunto: la organización, las personas involucradas, el historial
Responde la ficha del remitente de un asunto: la organización del remitente tal como la conoce el perfil de dominio almacenado (nombre, razón social, categoría, sitio web, fecha de registro, postura de correo; null para un dominio de correo compartido como gmail.com o un dominio nunca analizado, y nunca un análisis en vivo), las personas que los mensajes de la historia llevan en from, to y cc con sus roles y si pertenecen a la misma organización (los propios buzones del lector excluidos), y la relación: cuánto correo llegó desde esta dirección en los buzones del lector (contado hasta 50), cuándo por primera y última vez, los otros asuntos del remitente y los asuntos planteados por colegas del mismo dominio. Requiere el scope assistant:read.
Parámetros
| id* | string |
Respuesta 200
| work_item_id | string | |
| sender | object | null | |
| organisation | object | null | Null para un dominio de correo compartido o un dominio nunca analizado. |
| participants | object[] | |
| relationship | object | |
| generated_at | string (date-time) |
/api/assistant/work-items/{id}/interactionsRegistrar una Decision humana delimitada
Elegir una opción, dar una instrucción, tomar el control, posponer, ignorar, corregir, reportar el veredicto de confianza (phishing o legítimo), o aprobar o rechazar un plan en espera (un plan aprobado se ejecuta de inmediato, con sus recibos en la respuesta). La llamada está delimitada por work_item_version y se repite de forma idempotente mediante idempotency_key. Elegir o instruir prepara un borrador exacto que aún pasa por el flujo de respuesta normal; este endpoint nunca envía correo. Requiere el scope assistant:write.
Parámetros
| id* | string |
Cuerpo de la solicitud
| scope | string(item | sender | sender_domain | situation) | Con tipo ignore: también silenciar el remitente, su dominio o esta situación recurrente para que nunca vuelva. |
| verdict | string(phishing | legitimate) | Con type report: el veredicto de la persona sobre las señales de confianza. Phishing cierra el asunto, silencia al remitente y cierra sus otros asuntos activos; legítimo elimina el veredicto de sospechoso y sus razones. |
| plan_id | string | Con type approve o reject: el plan de acción en espera (propuesto o escalado). |
| reason | string | Con type reject: por qué, mantenido en el plan. |
| type* | string(choose | instruct | take_over | snooze | ignore | correct | delegate | approve | reject | report | tag) | |
| add | string[] | Con type tag: etiquetas para poner en el asunto (una propuesta confirmada, o una a mano; minúsculas, letras, dígitos y guiones). Una etiqueta añadida una vez se aprende: el próximo asunto del mismo proyecto la recibe sin preguntar. |
| remove | string[] | Con type tag: etiquetas para quitar del asunto (una propuesta nombrada aquí se rechaza). La página learned olvida una etiqueta definitivamente. |
| agent_slug | string | null | Con el tipo delegate: el slug de tu agente al que confiar el elemento, o null para recuperarlo. |
| member_id | string | null | Con type delegate: el id de usuario de un miembro de tu espacio de trabajo a quien entregar el elemento en lugar de un agente; lo encuentran bajo handed_to_you en su Today y lo trabajan a través de los endpoints de tareas bajo su propio acceso. |
| 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 |
Respuesta 200
| ok | boolean | |
| work_item | AssistantWorkItem | |
| plan_id | string | null |
/api/assistant/action-plans/{id}Obtener la vista previa exacta de la acción por ID opaco
Devuelve la identidad de respuesta exacta, destinatarios, cuerpo, compromisos y efectos secundarios de un plan de acción preparado, además de su vencimiento y revisión de origen, para que un cliente pueda mostrar qué sucederá antes de que el usuario envíe a través del endpoint de respuesta existente con assistant_plan_id. Requiere el scope assistant:read.
Parámetros
| id* | string | ID de plan de acción opaco |
Respuesta 200
| id | string | |
| status | string | |
| expires_at | string | |
| source_revision | integer | |
| effects | object[] |
/api/assistant/activityObtener actividad del asistente con contenido minimizado
Lista las interacciones y recibos recientes atribuidos al llamador sin los cuerpos de los mensajes. Requiere el scope assistant:read.
Parámetros
| limit | integer |
Respuesta 200
| type | string | |
| as_of | string | |
| events | object[] |
/api/assistant/dataExportar datos derivados del asistente
Exporta análisis, reclamaciones aceptadas, decisiones, interacciones, recibos y uso del modelo como un adjunto JSON. Nunca incluye los cuerpos de correo electrónico de origen ni los bytes de adjuntos. Requiere el scope assistant:write. También requiere email:auth_secrets (de lo contrario, 403 INSUFFICIENT_SCOPE): el estado derivado puede contener lo que el asistente extrajo del correo de autenticación antes de que ese correo quedara excluido de él.
Respuesta 200
| format | string | |
| exported_at | string | |
| note | string |
/api/assistant/dataEliminar datos derivados del asistente
Elimina de forma idempotente inteligencia derivada, trabajos, uso del modelo, dispositivos, importaciones y configuraciones mientras preserva el correo de origen. Requiere el permiso assistant:write.
Respuesta 200
| ok | boolean | |
| deleted | object | |
| source_mail_deleted | boolean |
Ejemplo de respuesta
{
"ok": true,
"deleted": {
"work_items": 12,
"claims": 40,
"entities": 9,
"jobs": 52
},
"source_mail_deleted": false
}/api/assistant/devicesRegistrar un dispositivo para alertas Now anonimizadas
Registra o rota un token push cifrado para una instalación de aplicación y entorno. Solo la aplicación nativa llama a esto; requiere un asistente activo y el permiso assistant:write.
Cuerpo de la solicitud
| installation_id* | string | |
| platform* | string(ios | android) | |
| environment* | string(development | preview | production) | |
| push_token* | string | |
| locale* | string | |
| lock_screen_detail | string(redacted | sender_only) |
Respuesta 200
| ok | boolean | |
| device | object |
/api/assistant/devicesRevocar un registro de dispositivo
Revoca todos los registros push de una instalación, por ejemplo al cerrar sesión. Requiere el permiso assistant:write.
Parámetros
| installation_id* | string |
Respuesta 200
| ok | boolean |
Correo
/api/domains/{domain}/email/checkVerifique el estado del DNS del correo electrónico (MX, SPF, DMARC, DKIM)
Comprueba la configuración DNS del correo electrónico para un dominio: registros MX, SPF, DMARC y DKIM. Detecta automáticamente el proveedor de correo electrónico a partir de registros MX (Google Workspace, Proton, Fastmail).
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| provider | string | null | Proveedor de correo electrónico detectado automáticamente (google-workspace, proton, fastmail) o null |
| mx | object | |
| spf | object | |
| dmarc | object | |
| dkim | object |
Ejemplo de respuesta
{
"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"
]
}
}Ejemplo
curl https://domani.run/api/domains/mysite.com/email/check \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/email/deliverabilityObtenga un estado de entregabilidad de correo electrónico específico para el propietario
Separa la preparación determinista de autenticación, los resultados de entrega de 30 días ponderados por destinatario, el estado de seguridad de la cuenta y la ubicación medida por proveedor. La puntuación de preparación no es una probabilidad de bandeja de entrada; la ubicación no medida se devuelve como not_tested.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| status | string | |
| confidence | string | |
| checked_at | string (date-time) | |
| window_days | integer | |
| readiness | object | Preparación determinista de la configuración DNS. La puntuación no es una probabilidad de la bandeja de entrada. |
| sending_health | object | |
| placement | object | |
| actions | object[] | |
| caveats | string[] |
Ejemplo
curl https://domani.run/api/domains/mysite.com/email/deliverability \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/email/setupConfigurar el correo electrónico en un dominio
Preconfigure el DNS de correo electrónico en un dominio (opcional). create_mailbox lo llama automáticamente cuando es necesario. Pase force=true para anular el proveedor de correo electrónico existente (Google Workspace, Fastmail, Proton).
Parámetros
| domain* | string | Nombre de dominio |
Cuerpo de la solicitud
| force | boolean | Anule el proveedor de correo electrónico existente (Google Workspace, Fastmail, Proton). Predeterminado: falso |
Respuesta 200
| domain | string | |
| status | string | |
| verified_at | string | null | |
| receiving_verified | boolean | Verdadero cuando el MX del dominio apunta al receptor de la plataforma, de modo que el correo de sus direcciones se acepta. |
| sending_configured | boolean | |
| sending_verified | boolean | |
| records | DnsRecord[] | |
| hint | string |
/api/domains/{domain}/email/setupEliminar correo electrónico de un dominio
Elimine el correo electrónico de un dominio, elimine todos los buzones y mensajes y establezca emailEnabled en falso. Cambia el correo de todo el dominio, por lo que un token confinado a buzones recibe 403 MAILBOX_CONFINED.
Parámetros
| domain* | string | Nombre de dominio |
/api/domains/{domain}/email/statusVerificar el estado del DNS del correo electrónico
Verifique el estado de verificación de DNS del correo electrónico para un dominio. Devuelve si el dominio está verificado y listo, los detalles del registro DNS y el recuento de buzones.
Parámetros
| domain* | string | Nombre de dominio |
Respuesta 200
| domain | string | |
| enabled | boolean | |
| verified | boolean | Verdadero solo cuando se verifican tanto la recepción como el envío saliente |
| receiving_verified | boolean | Verdadero cuando el MX del dominio apunta al receptor de la plataforma, de modo que el correo de sus direcciones se acepta. |
| sending_configured | boolean | |
| sending_verified | boolean | |
| records | DnsRecord[] | |
| mailbox_count | integer | |
| dns_managed | boolean | Verdadero cuando Domani escribe la zona del dominio por sí mismo: los registros pendientes se publican y reparan mediante una auditoría cada hora, sin nada que añadir a mano. Falso para una zona externa, donde los registros pendientes deben añadirse en el proveedor de DNS. |
| unreachable_addresses | string[] | Direcciones del dominio que su MX de recepción rechaza (buzones api en un dominio alojado aún no registrados en el host de correo). Vacío cuando todas las direcciones pueden recibir; el registro se reintenta automáticamente. |
| provider_status | string | |
| mailbox_plan_key | string | La clave del plan del espacio de trabajo que rige aquí los buzones con dominio propio (la suscripción del propio espacio de trabajo, no necesariamente el plan personal del usuario que inició sesión). |
| mailbox_limit | integer | null | Buzones con dominio propio que el plan permite en todo el espacio de trabajo. null significa ilimitado. |
| mailbox_limit_reached | boolean | Verdadero cuando el espacio de trabajo alcanza el límite de buzones de su plan: otro buzón en este dominio requiere antes mejorar el plan. |
| mailbox_upgrade_plan | object | null | El plan más barato que dejaría espacio para otro buzón. null si ya es ilimitado. |
| hint | string |
/api/emailCrear un buzón en domani.run
Cree una dirección de correo electrónico gratuita en domani.run (por ejemplo, hello@domani.run). No se requiere propiedad de dominio. Limitado a 1 buzón @domani.run gratuito por usuario. Muchas babosas comunes están reservadas.
Cuerpo de la solicitud
| slug* | string | Parte local de la dirección de correo electrónico (por ejemplo, 'hello' para hello@domani.run) |
| name | string | Nombre para mostrar (por defecto, slug en mayúscula) |
Respuesta 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 si al menos una persona distinta del solicitante puede leer este buzón |
| message_count | integer | |
| webhook_url | string | null | |
| header_names | string[] | Nombres de encabezado de autenticación de webhook configurados; los valores nunca se devuelven |
| forward_to | string | null | |
| signing_secret | string | null | |
| created_at | string (date-time) | |
| hint | string |
/api/emailListar todos los buzones
Enumere todos los buzones de correo a los que puede acceder el identidad solicitante en todos los dominios, incluidas las concesiones de espacio de trabajo.
Parámetros
| domain | string | Filtrar por dominio |
Respuesta 200
| mailboxes | object[] |
/api/emailsCrear un buzón
Cree una dirección de correo electrónico (buzón). Proporcione una dirección completa como "hello@mysite.com". El DNS del correo electrónico se configura automáticamente en el primer uso. Pase force=true para anular un proveedor de correo electrónico existente. La capacidad del buzón de correo de dominio personalizado está determinada por la cuenta activa o el plan de espacio de trabajo. Cada cuenta puede crear un buzón @domani.run gratuito por separado con POST /api/email. Pase workspace_id para crear el buzón dentro de un espacio de trabajo de su propiedad. Para un dominio personalizado, esto adopta explícita y atómicamente el dominio y todos sus buzones hermanos sin ámbito en ese espacio de trabajo; un dominio nunca se puede dividir en espacios de trabajo. Pase kind="hosted" para crear un buzón IMAP/SMTP real en su propio dominio (conecte Apple Mail, Thunderbird o cualquier cliente) en lugar del buzón API predeterminado (enviar/recibir a través de API + webhooks). Los buzones de correo alojados devuelven registros DNS para publicar, configuraciones del cliente de correo y una contraseña de aplicación única. Requiere un dominio de su propiedad.
Cuerpo de la solicitud
| address* | string | Dirección de correo electrónico completa, p. hello@mysite.com |
| name | string | Nombre para mostrar para correos electrónicos salientes (por ejemplo, "John Doe") |
| force | boolean | Anula los registros MX existentes. Predeterminado: falso |
| kind | string(api | hosted) | "api" (predeterminado: enviar/recibir a través de API + webhooks) o "hosted" (buzón IMAP/SMTP real en su dominio) |
| workspace_id | string | Espacio de trabajo para poseer el buzón. Sólo el propietario del espacio de trabajo puede adoptar recursos. |
Respuesta 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 si al menos una persona distinta del solicitante puede leer este buzón |
| message_count | integer | |
| webhook_url | string | null | |
| header_names | string[] | Nombres de encabezado de autenticación de webhook configurados; los valores nunca se devuelven |
| forward_to | string | null | |
| signing_secret | string | null | Secreto HMAC para verificar cargas útiles de webhook entrantes (se muestra una vez en la creación) |
| host_id | string | ID principal del host de correo para un buzón alojado |
| 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 todos los buzones
Enumere todos los buzones de correo a los que puede acceder el identidad solicitante, incluidas las concesiones de espacio de trabajo. Igual que GET /api/email.
Parámetros
| domain | string | Filtrar por dominio |
Respuesta 200
| mailboxes | object[] |
/api/emails/{address}Obtener detalles del buzón
Obtenga detalles de un buzón de correo específico por su dirección de correo electrónico completa (codificada en URL, por ejemplo, hola%40misitio.com).
Parámetros
| address* | string | Dirección de correo electrónico completa (codificada en URL, por ejemplo, hola%40misitio.com) |
Respuesta 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 | Secreto HMAC para gerentes; nulo para espectadores/respondedores |
| 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}Actualizar buzón
Actualice el nombre para mostrar de un buzón, la URL del webhook o la dirección de correo electrónico de reenvío por su dirección de correo electrónico completa. Establezca en nulo para deshabilitar/borrar.
Parámetros
| address* | string | Dirección de correo electrónico completa (codificada en URL) |
Cuerpo de la solicitud
| name | string | null | Nombre para mostrar del buzón. Establezca en nulo para borrar. |
| webhook_url | string | null | URL HTTPS para webhook de correo electrónico entrante o nulo para borrar |
| forward_to | string | null | Dirección de correo electrónico para reenviar correos electrónicos entrantes o nula para borrar |
| drop_spam | boolean | Eliminar (no almacenar ni webhook) mensajes entrantes marcados como spam |
| tone_notes | string | null | Indicaciones de voz que los agentes leen antes de redactar desde este buzón (tono, firma, qué decir y qué evitar al formular). Establezca en nulo para borrar. |
Respuesta 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 | Secreto de HMAC para verificar cargas útiles de webhooks entrantes |
/api/emails/{address}Eliminar un buzón
Eliminar un buzón por su dirección de correo electrónico completa. Requiere confirm=true en el cuerpo. Sin confirmación, devuelve una vista previa con message_count.
Parámetros
| address* | string | Dirección de correo electrónico completa (codificada en URL) |
Cuerpo de la solicitud
| confirm | boolean | Debe ser verdadero para eliminarlo. Omitir para obtener una vista previa. |
/api/emails/{address}/sendenviar un correo electrónico
Envía un correo desde un buzón identificado por su dirección completa. El servidor ejecuta primero una política versionada obligatoria: rechaza los fallos objetivos de seguridad y devuelve como advertencias los problemas de reputación y calidad del contenido. Para una respuesta colaborativa en un hilo, pasa el lease de composición, el reply_version observado y una clave de idempotencia estable; el servidor rechaza atómicamente las respuestas obsoletas o duplicadas justo antes del envío. Máximo 20 destinatarios únicos por mensaje. Límite: 100 destinatarios por hora y buzón.
Parámetros
| address* | string | Dirección de correo electrónico del remitente (codificada en URL) |
Cuerpo de la solicitud
| to* | any | Dirección(es) de correo electrónico del destinatario |
| cc | any | Destinatarios CC |
| bcc | any | Destinatarios CCO |
| subject | string | |
| text | string | Cuerpo de texto sin formato |
| html | string | cuerpo HTML |
| reply_to | string | Dirección de respuesta |
| in_reply_to | string | ID de mensaje del correo electrónico al que se responde (para subprocesos) |
| references | string | Cadena de ID de mensaje separada por espacios (para subprocesos) |
| idempotency_key | string | Clave estable que evita envíos duplicados |
| send_at | string (date-time) | Programe el envío (ISO 8601, entre 30 segundos y 30 días de antelación). El mensaje se almacena con el estado 'scheduled' y se despacha del lado del servidor; muévalo a la papelera antes de ese momento para cancelarlo. Los archivos adjuntos aún no son compatibles con send_at. |
| coordination | object | Requerido para una respuesta colaborativa cautelosa. |
| allow_risky_content | boolean | Campo de compatibilidad obsoleto. Se permiten enlaces de autenticación públicos HTTPS de terceros con una advertencia; Los bloqueos de seguridad objetivos no se pueden anular. |
| attachments | object[] | Archivos adjuntos (máximo 10, máximo 40 MB en total). El contenido debe estar codificado en base64. |
Respuesta 200
| id | string | |
| message_id | string | ID de mensaje RFC 5322 |
| from | string | |
| to | string | |
| bcc | string | null | Destinatario(s) Bcc a los que enviaste, devueltos solo en tu propio mensaje saliente; nunca se entregan como encabezado y nunca aparecen en un mensaje recibido. |
| status | string | |
| attachments_count | integer | |
| suppressed | string[] | |
| deliverability | object | Informe de política versionado aplicado a este envío; inspeccionar decisiones y controles categorizados |
/api/emails/{address}/deliverability-checkRealice una verificación previa de un correo electrónico saliente
Ejecute la política del lado del servidor versionada exactamente utilizada por el punto final de envío sin enviar ni consumir cuota de correo electrónico. Se permiten enlaces de autenticación HTTPS públicos en dominios de terceros con una advertencia de reputación. Se bloquean las URL locales/privadas, los enlaces de autenticación que no sean HTTPS y los archivos adjuntos ejecutables; Los cuerpos de más de 102 KB producen una advertencia de recorte.
Parámetros
| address* | string | Dirección de correo electrónico del remitente (codificada en URL) |
Cuerpo de la solicitud
| subject | string | |
| text | string | |
| html | string | |
| idempotency_key | string | |
| allow_risky_content | boolean | Campo de compatibilidad obsoleto; Los bloqueos de seguridad objetivos no se pueden anular. |
| attachments | object[] |
Respuesta 200
| policy_version | string | |
| decision | string | |
| safe_to_send | boolean | Equivalente booleano compatible con versiones anteriores a decisión! = negar |
| risk | string | |
| score | integer | |
| authentication_message | boolean | |
| checks | object[] | |
| blocked_reasons | string[] | |
| warnings | string[] | |
| override_used | boolean |
/api/emails/{address}/messagesListar correos electrónicos
Enumere los correos electrónicos en una carpeta canónica o vista virtual. El valor predeterminado es Bandeja de entrada. La ubicación de la carpeta es independiente de la dirección del mensaje y del veredicto de spam. El correo de autenticación (OTP/códigos de verificación, restablecimientos de contraseña y enlaces mágicos) se etiqueta como security: "auth". Los tokens sin el scope email:auth_secrets ven esos mensajes con el asunto y el cuerpo ocultos (redacted: true); los metadatos (remitente y fecha) siguen visibles. Los filtros subject, q y attachments coinciden con lo que quien llama puede leer: sin el alcance, ese mensaje solo coincide por su asunto y su cuerpo ocultos, así que una consulta por un código que contiene no encuentra nada.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| cursor | string | Cursor de paginación de la respuesta anterior |
| limit | integer | Máximo de mensajes para devolver |
| direction | string(in | out | all) | Filtrar por dirección (predeterminado: todos) |
| folder | string(inbox | archive | sent | spam | trash) | Carpeta del sistema. Mutuamente excluyentes con vista. El valor predeterminado es la bandeja de entrada. |
| label | string | Etiquetas separadas por comas: solo mensajes que tengan alguna de ellas |
| view | string(starred | all | needs_human | scheduled) | Vista virtual. Mutuamente excluyentes con carpeta. |
| since | string | Marca de tiempo ISO: devuelve solo mensajes creados después de esta fecha |
| until | string | Marca de tiempo ISO: devuelve solo mensajes creados antes de esta fecha |
| from | string | Filtrar por dirección del remitente |
| to | string | Filtrar por dirección del destinatario |
| subject | string | Filtrar por tema |
| q | string | Búsqueda amplia que no distingue entre mayúsculas y minúsculas en remitente, destinatario, asunto y cuerpo de texto sin formato |
| unread | boolean | Devolver solo mensajes no leídos |
| attachments | boolean | Devolver mensajes que contengan archivos adjuntos únicamente |
| spam | boolean | Filtrar por marca de spam (pase falso para ocultar las entradas marcadas como spam) |
Respuesta 200
| messages | object[] | |
| next_cursor | string | null |
/api/emails/searchBuscar correo por significado y por palabras
Busca en los buzones que puedes leer, o en un buzón con mailbox. Híbrido por defecto: el embedding del mensaje (pgvector, coseno) y el índice de palabras ponderadas se fusionan por rango recíproco con un pequeño impulso de recencia, en una sola sentencia; why indica qué rama coincidió. Operadores de Gmail en q: from: to: cc: subject: label: filename: mailbox: is:unread|read|starred|unstarred has:attachment in:inbox|archive|sent|spam|trash|anywhere after:2026/08/01 before: newer_than:7d older_than:2w (h/d/w/m/y), "a phrase", -word o -from: para excluir, a OR b. Una consulta formada solo por operadores lista los mensajes coincidentes del más reciente al más antiguo (why: filter). Los códigos y enlaces de inicio de sesión, el spam y el correo del sistema nunca se indexan; los buzones listados en search_opt_out_mailbox_ids del asistente se buscan solo por palabras. Un token vinculado a una identidad de agente busca solo en los buzones que opera su agente. Requiere email:read. Sin email:auth_secrets, el correo de autenticación entrante se excluye antes de la clasificación: ninguna palabra, operador o filtro coincide con él, así que una búsqueda de un código de inicio de sesión no encuentra nada.
Parámetros
| mailbox | string | Restringir a una dirección de buzón (slug@domain). |
| q* | string | Lo que estás buscando, en cualquier idioma: un nombre, una referencia o una descripción del correo, más operadores de Gmail (`from:dave is:unread newer_than:7d -invoice "exact phrase"`). |
| mode | string(hybrid | semantic | keyword) | hybrid fusiona el embedding y las palabras por rango; semantic usa solo el significado; keyword solo las palabras. |
| limit | integer | Resultados a devolver. |
| since | string | Solo correo recibido después de esta marca de tiempo ISO. |
| until | string | Solo correo recibido antes de esta marca de tiempo ISO. |
| folder | string(inbox | archive | sent | spam | trash | anywhere) | Una carpeta. Trash se excluye a menos que se nombre o con `anywhere`. |
| from | string | La dirección del remitente contiene. |
| label | string | Etiquetas separadas por comas: solo mensajes que tengan alguna de ellas |
Respuesta 200
| results | object[] | |
| mode | string | |
| query | string | |
| took_ms | integer | |
| hint | string |
Ejemplo
curl "https://domani.run/api/emails/search?q=facture+tucows+ao%C3%BBt&limit=5" \ -H "Authorization: Bearer domani_sk_xxx"
/api/emails/connect/gmailComenzar a conectar una bandeja de entrada de Gmail
Devuelve la URL de consentimiento de Google vinculada a tu cuenta y al límite de importación. Ábrela en un navegador; después del consentimiento, la bandeja de entrada se convierte en un buzón conectado en su propia dirección, el correo recibido después del límite se importa (predeterminado: las últimas 24 horas), y el correo nuevo sigue a medida que llega. Nunca toda la bandeja de entrada: amplía más tarde con POST /api/emails/{address}/import. Requiere email:write. Google OAuth debe estar configurado en el servidor.
Cuerpo de la solicitud
| access | string(read | write) | read (el predeterminado) lee la bandeja de entrada; write también permite que la plataforma cambie etiquetas y el estado de lectura y envíe como la persona, para los efectos de una delegación permanente. Reconecta con write para ampliar un grant de solo lectura. |
| since | string (date-time) | Importar el correo recibido después de este instante |
| window | string(24h | 7d | 30d | 1y) | Un preset en lugar de since; predeterminado 24h |
| workspace_id | string | Workspace al que pertenece el buzón; tu workspace personal por defecto |
| login_hint | string | La cuenta de Google a preseleccionar |
| return_to | string | Ruta de la app a la que enviar el navegador después del consentimiento |
Respuesta 200
| auth_url | string | |
| state | string | |
| import_since | string (date-time) | |
| expires_in | integer | |
| access | string |
/api/emails/connect/outlookComenzar a conectar una bandeja de entrada de Outlook
Devuelve la URL de consentimiento de Microsoft vinculada a tu cuenta y al límite de importación. Ábrela en un navegador; después del consentimiento, la bandeja de entrada se convierte en un buzón conectado en su propia dirección, se importa el correo recibido después del límite (predeterminado: las últimas 24 horas), y el correo nuevo sigue a medida que llega. Nunca la bandeja de entrada completa: amplía más tarde con POST /api/emails/{address}/import. Requiere email:write. Microsoft OAuth debe estar configurado en el servidor.
Cuerpo de la solicitud
| access | string(read | write) | read (el predeterminado) lee la bandeja de entrada; write también permite que la plataforma cambie etiquetas y el estado de lectura y envíe como la persona, para los efectos de una delegación permanente. Reconecta con write para ampliar un grant de solo lectura. |
| since | string (date-time) | Importar el correo recibido después de este instante |
| window | string(24h | 7d | 30d | 1y) | Un preset en lugar de since; predeterminado 24h |
| workspace_id | string | Workspace al que pertenece el buzón; tu workspace personal por defecto |
| login_hint | string | La cuenta de Microsoft a preseleccionar |
| return_to | string | Ruta de la app a la que enviar el navegador después del consentimiento |
Respuesta 200
| auth_url | string | |
| state | string | |
| import_since | string (date-time) | |
| expires_in | integer | |
| access | string |
/api/emails/connect/providersLista las formas en que se puede conectar una bandeja de entrada
Una fila por proveedor (Gmail, Outlook, cualquier bandeja de entrada mediante reenvío, una dirección alojada aquí): cómo comienza la conexión (una pantalla de consentimiento, una regla de reenvío, una dirección creada), qué puede hacer la conexión (leer, o leer y escribir), si importa correo más antiguo, y si este servidor está configurado para ello. Muestra un botón de conectar solo cuando configured es true; reason nombra la variable faltante para el operador. Requiere email:read.
Respuesta 200
| providers | MailProvider[] |
/api/emails/connect/forwardingConectar una bandeja de entrada mediante reenvío
Crea un buzón conectado en la propia dirección de la bandeja de entrada y responde con una dirección de reenvío en el dominio de reenvío de la plataforma, con los pasos para Gmail, Outlook y otros proveedores. Agrega una regla de reenvío en el proveedor; lo que llega a esa dirección se desenvuelve (remitente original, fecha, asunto) y se almacena bajo el buzón conectado. Gmail pide a la dirección de reenvío que confirme: el código y el enlace aparecen en la conexión. El primer correo que regresa, o una prueba (POST /api/emails/{address}/connector/verify), hace que la conexión esté activa. Solo el correo nuevo llega de esta manera; el correo antiguo no se puede importar. Requiere email:write. El dominio de reenvío debe estar configurado en el servidor.
Cuerpo de la solicitud
| address* | string | La bandeja de entrada a conectar, por ejemplo someone@gmail.com |
| workspace_id | string | Workspace al que pertenece el buzón; tu workspace personal por defecto |
Respuesta 200
| address | string | |
| mailbox_id | string | |
| status | string | |
| forwarding_address | string | |
| instructions | object | |
| guide | ForwardingGuide |
/api/emails/{address}/connector/verifyEnviar una prueba a través de la regla de reenvío
Envía un correo a la bandeja de entrada conectada; cuando la regla de reenvío lo trae de vuelta a la dirección de reenvío, la conexión se vuelve activa. Solo para una conexión mediante reenvío. Requiere email:write.
Parámetros
| address* | string | La dirección conectada, por ejemplo someone@gmail.com |
Respuesta 200
| sent_to | string | |
| forwarding_address | string |
/api/emails/{address}/connectorLeer la conexión de un buzón conectado
Tipo, estado, el límite de importación, la fase de sincronización (el escaneo de importación, luego historial), el progreso de importación (escaneados, copiados, por analizar, analizados), la última sincronización y el último error. Requiere email:read. La confirmación de reenvío (el código y el enlace de Gmail) es correo de autenticación: sin email:auth_secrets, su código y su url son null y lleva redacted: true. Un token confinado a buzones solo encuentra sus propios buzones (404 en caso contrario).
Parámetros
| address* | string | La dirección conectada, por ejemplo someone@gmail.com |
Respuesta 200
| address | string | |
| mailbox_id | string | |
| kind | string | |
| status | string | |
| import_since | string (date-time) | null | El límite de la primera importación: ningún correo recibido antes de él se copia |
| phase | string | lista mientras el escaneo de importación recorre el correo después del límite, historial una vez que el nuevo correo sigue el historial de la fuente |
| paused_reason | string | null | |
| import_run | object | null | La ejecución de importación actual o última de este buzón |
| source_messages_total | integer | null | Lo que la fuente reporta para toda la bandeja 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 | El gasto de modelo permitido por ejecución de importación, en USD |
| access | string | null | Para una conexión de Gmail: qué permite el grant; write significa etiquetas en ambas direcciones y enviar como la persona |
| forwarding | object | null | Para una conexión mediante reenvío: la dirección de reenvío, lo que llegó, la confirmación de Gmail, la prueba, los pasos |
/api/emails/{address}/connectorDesconectar un buzón conectado
Elimina las copias propias de la persona (messages, attachments, filas de búsqueda, trabajos pendientes) y la credencial; mantiene la fila del buzón, el enlace marcado como desconectado, y lo que los agentes hicieron (receipts). Solo un buzón conectado puede ser desconectado. Requiere email:write.
Parámetros
| address* | string |
Respuesta 200
| disconnected | boolean | |
| address | string | |
| removed_messages | integer | |
| removed_attachments | integer |
/api/emails/{address}/importImportar correo más antiguo de un buzón conectado
Amplía la importación a una fecha anterior: una nueva ejecución de importación copia el correo entre el nuevo límite y el actual, en orden de llegada, bajo su propio límite de costo. Se rechaza mientras un escaneo de importación aún está en ejecución. Requiere email:write.
Parámetros
| address* | string |
Cuerpo de la solicitud
| since* | string (date-time) | El nuevo límite, anterior al actual |
Respuesta 200
| import_run_id | string | |
| import_since | string (date-time) | |
| import_until | string (date-time) |
/api/emails/{address}/searchBuscar en un buzón por significado y por palabras
La misma búsqueda que GET /api/emails/search, restringida a este buzón. Requiere email:read. Sin email:auth_secrets, el correo de autenticación entrante se excluye antes de la clasificación: ninguna palabra, operador o filtro coincide con él, así que una búsqueda de un código de inicio de sesión no encuentra nada.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| q* | string | Lo que estás buscando, en cualquier idioma: un nombre, una referencia o una descripción del correo, más operadores de Gmail (`from:dave is:unread newer_than:7d -invoice "exact phrase"`). |
| mode | string(hybrid | semantic | keyword) | hybrid fusiona el embedding y las palabras por rango; semantic usa solo el significado; keyword solo las palabras. |
| limit | integer | Resultados a devolver. |
| since | string | Solo correo recibido después de esta marca de tiempo ISO. |
| until | string | Solo correo recibido antes de esta marca de tiempo ISO. |
| folder | string(inbox | archive | sent | spam | trash | anywhere) | Una carpeta. Trash se excluye a menos que se nombre o con `anywhere`. |
| from | string | La dirección del remitente contiene. |
| label | string | Etiquetas separadas por comas: solo mensajes que tengan alguna de ellas |
Respuesta 200
| results | object[] | |
| mode | string | |
| query | string | |
| took_ms | integer | |
| hint | string |
/api/emails/{address}/threadsListar las conversaciones de un buzón
Mensajes agrupados de la forma en que los clientes de correo los agrupan: una respuesta se une al hilo del mensaje que responde (In-Reply-To, luego la cadena References), el correo sin encabezados utilizables se une al hilo más reciente con el mismo asunto y un corresponsal en común dentro de treinta días, todo lo demás inicia un hilo cuyo id es el id de su primer mensaje. Los hilos se ordenan por última actividad; la papelera y el spam nunca participan a menos que se nombren como la carpeta. folder=inbox|archive|sent mantiene los hilos que tienen un mensaje allí pero aún cuenta toda la conversación.
Parámetros
| address* | string | |
| folder | string(all | inbox | archive | sent | spam | trash) | |
| since | string | Solo hilos con actividad después de esta hora |
| limit | integer | |
| cursor | string | next_cursor de la página anterior |
| label | string | Etiquetas separadas por comas: solo hilos con un mensaje que tenga alguna de ellas |
Respuesta 200
| threads | EmailThread[] | |
| next_cursor | string | null | |
| has_more | boolean |
/api/emails/{address}/threads/{id}Leer una conversación, mensaje más antiguo primero
Cada mensaje del hilo (papelera incluida, para que no falte nada de la historia) con su texto, el más antiguo primero, más los participantes y el conteo de no leídos. El correo de autenticación se redacta de la forma en que se leen los mensajes.
Parámetros
| address* | string | |
| id* | string | Id del hilo (el thread_id de cualquiera de sus mensajes) |
Respuesta 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 del buzón (eventos enviados por el servidor)
Responde text/event-stream. Sin un cursor la transmisión comienza en el presente; con since (un cursor de /api/email/changes o el id de cualquier evento anterior) primero reproduce cada cambio después de ese punto, luego sigue el diario del buzón en vivo: cada frame lleva el tipo del cambio como el nombre del evento (message.received, message.updated, message.deleted, message.moved, message.status, mailbox.resync_required, assistant.item.delegated, assistant.item.recalled, ...), el cambio como datos JSON con su cursor reanudable, y ese mismo cursor como el id del frame. El primer frame es ready con el cursor desde el cual reanudar; un comentario de keep-alive llega cada 20 segundos; la conexión se cierra después de aproximadamente 5 minutos con un frame close y una sugerencia retry:. Reconecte con Last-Event-ID (o since) para reanudar sin brecha y sin duplicado. Los tokens de agente están confinados a los buzones que el agente opera. Una entrada sobre un elemento de trabajo creado a partir de un correo de autenticación lleva su title y su ask ocultos para un token sin email:auth_secrets.
Parámetros
| address* | string | |
| since | string | Cursor desde el cual reproducir; el `cursor` de cualquier evento anterior o un next_cursor de /api/email/changes |
/api/emails/{address}/foldersListar carpetas de correo electrónico y recuentos
Devuelva recuentos derivados del servidor para carpetas del sistema y vistas virtuales, además de capacidades de ciclo de vida para el backend del buzón.
Parámetros
| address* | string |
Respuesta 200
| folders | object[] | |
| views | object[] | |
| capabilities | object |
/api/emails/{address}/messages/actionsAplicar una acción de ciclo de vida a los mensajes.
Mueve, restaura, marca como leído, destaca o elimina permanentemente hasta 100 ID de mensajes explícitos. Pasar a la Papelera es reversible. La eliminación permanente requiere email:delete y solo acepta mensajes que ya están en la Papelera. Cada respuesta es un recibo de operación duradero con un resultado por identificación solicitada. Proporcione una clave estable en el encabezado estándar Idempotency-Key o en el campo JSON heredado idempotency_key y reutilícela después de los tiempos de espera; un reintento exacto devuelve el recibo almacenado sin otra mutación. Si se proporcionan ambos formularios, deben coincidir. Reutilizar una clave con una solicitud diferente devuelve 409. Cuando se omite, el servidor crea una clave y la devuelve en el cuerpo y en el encabezado Idempotency-Key. Devuelve 207 cuando solo una parte del lote tiene éxito.
Parámetros
| address* | string |
Cuerpo de la solicitud
| 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: etiquetas a agregar |
| remove | string[] | label: etiquetas a eliminar |
| set | string[] | label: reemplazar cada etiqueta (tiene prioridad sobre agregar y eliminar) |
| idempotency_key | string | Clave estable para este lote lógico exacto. Reutilizar después de un tiempo de espera. |
Respuesta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Verdadero cuando esta respuesta reutilizó el recibo completado inmutable y no realizó ninguna mutación nueva. |
| action | string | |
| status | string | |
| results | object[] | |
| summary | object | |
| created_at | string (date-time) | |
| completed_at | string (date-time) | null |
/api/emails/{address}/messages/readMarcar mensajes como leídos o no leídos
Punto final de compatibilidad para actualizaciones de estado de lectura seguras para reintentos. Devuelve el recibo de operación canónico duradero por artículo más el recuento heredado. Proporcione y reutilice el encabezado Idempotency-Key o el campo de compatibilidad idempotency_key después de los tiempos de espera.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Cuerpo de la solicitud
| message_ids* | string[] | ID de mensajes para marcar |
| read* | boolean | verdadero para marcar como leído, falso para marcar como no leído |
| idempotency_key | string |
Respuesta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Verdadero cuando esta respuesta reutilizó el recibo completado inmutable y no realizó ninguna mutación nueva. |
| 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/deleteEliminar mensajes en masa
Punto final de compatibilidad que mueve los mensajes a la Papelera con reintentos seguros. Devuelve el recibo de operación canónico duradero por artículo más el recuento heredado. Proporcione y reutilice el encabezado Idempotency-Key o el campo de compatibilidad idempotency_key después de los tiempos de espera.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Cuerpo de la solicitud
| message_ids* | string[] | ID de mensajes para eliminar |
| idempotency_key | string |
Respuesta 200
| operation_id | string | |
| idempotency_key | string | |
| idempotent_replay | boolean | Verdadero cuando esta respuesta reutilizó el recibo completado inmutable y no realizó ninguna mutación nueva. |
| 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}Recibe un mensaje
Obtenga un único mensaje por ID de un buzón identificado por su dirección de correo electrónico completa. Los mensajes clasificados como correo de autenticación (OTP, restablecimiento de contraseña, enlace mágico) regresan con el asunto/cuerpo oculto a menos que el token tenga el alcance email:auth_secrets.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| id* | string | ID de mensaje |
Respuesta 200
| id | string | |
| thread_id | string | Id de conversación compartido por cada mensaje del hilo (el id del mensaje raíz) |
| labels | string[] | Cada etiqueta en el mensaje; `label` es la primera |
| thread_key | string | Clave de conversación canónica con espacio de nombres de backend |
| thread_aliases | string[] | Claves de flujo de trabajo heredadas para devolver al cambiar el estado de la conversación |
| message_id | string | null | |
| direction | string | |
| from | string | El nombre para mostrar y la dirección del remitente tomados del encabezado From (p. ej. 'Alice <alice@example.com>'), o la dirección sola cuando el correo no llevaba nombre. |
| avatar_url | string (uri) | null | URL proxy Domani que preserva la privacidad para el avatar del remitente |
| to | string | Todos los destinatarios To del encabezado, con sus nombres para mostrar, en el orden en que el remitente los escribió (no solo la dirección de sobre que enrutó este correo al buzón). |
| cc | string | null | Todos los destinatarios Cc del encabezado, con sus nombres para mostrar, o null cuando el correo no llevaba Cc. |
| bcc | string | null | Destinatarios Bcc, presentes solo en tu propio mensaje saliente (nunca en uno recibido, y nunca entregados como encabezado). |
| 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}Eliminar un mensaje
Mueve un mensaje a la Papelera. Es reversible. Usa la acción de ciclo de vida delete_permanently y un token con email:delete para borrar un mensaje que ya esté en la Papelera.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| id* | string | ID de mensaje |
Respuesta 200
| id | string | |
| deleted | boolean |
/api/emails/{address}/messages/{id}/replyResponder a un mensaje
Responde a un mensaje en un buzón identificado por su dirección completa. Los encabezados del hilo se completan automáticamente, y el original se cita debajo de la respuesta como hacen los clientes de correo (línea de atribución en el idioma de la cuenta, líneas > en el texto, un bloque gmail_quote en el HTML), salvo que quote sea false. Los clientes colaborativos deben pasar el lease de composición, el reply_version observado y una clave de idempotencia estable; el servidor rechaza atómicamente una respuesta obsoleta o duplicada justo antes del envío.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| id* | string | ID del mensaje al que responder |
Cuerpo de la solicitud
| text | string | Cuerpo de respuesta en texto plano |
| html | string | cuerpo de respuesta HTML |
| cc | any | Destinatarios CC adicionales |
| all | boolean | Responder a todos: completar automáticamente el CC desde el Para/CC original |
| quote | boolean | Cita el original debajo de la respuesta; false envía solo el texto o el HTML indicado |
| idempotency_key | string | Forma de compatibilidad corporal de Idempotency-Key |
| coordination | object |
Respuesta 200
| id | string | |
| message_id | string | |
| from | string | |
| to | string | |
| status | string | |
| reply_version | integer | Generación reservada para una respuesta cautelosa |
/api/emails/{address}/messages/{id}/forwardReenviar un mensaje
Reenviar un mensaje desde un buzón identificado por su dirección de correo electrónico completa a otro destinatario. El reenvío de correo de autenticación (OTP, restablecimiento de contraseña, enlace mágico) requiere el alcance email:auth_secrets; exfiltraría el secreto.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| id* | string | ID de mensaje para reenviar |
Cuerpo de la solicitud
| to* | string | Dirección de correo electrónico del destinatario |
| text | string | Nota opcional para anteponer |
Respuesta 200
| id | string | |
| message_id | string | |
| from | string | |
| to | string | |
| status | string |
/api/emails/{address}/avatarObtener información del avatar del buzón
Devuelve la URL de Gravatar (si está configurada) y el enlace de registro para un buzón identificado por su dirección de correo electrónico completa.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Respuesta 200
| address | string | |
| gravatar_url | string | null | |
| gravatar_signup | string | |
| has_avatar | boolean | |
| hint | string |
/api/emails/{address}/webhookObtener la configuración del webhook del buzón
Devuelve la URL del webhook, el secreto de firma, los nombres de los encabezados de autenticación configurados y el estado de un buzón. Los valores del encabezado nunca se devuelven.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Respuesta 200
| address | string | |
| webhook_url | string | null | |
| signing_secret | string | null | |
| has_webhook | boolean | |
| events | string[] | Eventos que transporta este webhook: email.received, cualquier veredicto de entrega en correo saliente (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) y los avisos de traspaso de agente (assistant.item.delegated, assistant.item.recalled); vacío sin un webhook |
| header_names | string[] | Nombres de encabezado de autenticación configurados; los valores nunca se devuelven |
| hint | string |
/api/emails/{address}/webhookEstablecer webhook de buzón
Configure el destino HTTPS para los eventos de buzón firmados por HMAC: el correo entrante de forma predeterminada, más (opcional mediante events) el veredicto de entrega del correo enviado DESDE el buzón: un rebote llega al remitente segundos después de aceptarse el envío, en lugar de vivir solo en el historial del mensaje. Las entregas entrantes en vivo se almacenan de forma duradera, se intentan inmediatamente y se reintentan hasta tres veces. Cada intento incluye X-Domani-Delivery-Attempt a partir de 1. Los valores opcionales de autorización o X-API-Key se cifran y nunca se devuelven; los operadores humanos deben enviarlos fuera del contexto del modelo a través de las opciones de variables de entorno de la CLI.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Cuerpo de la solicitud
| url* | string | URL del webhook HTTPS |
| events | string[] | Eventos a enviar (assistant.item.delegated y assistant.item.recalled le indican a un agente que el propietario le entregó un elemento de Today o se lo quitó; el webhook de cada buzón que opera el agente los recibe). Omitido mantiene la suscripción actual (solo entrante para un webhook nuevo). Los veredictos de entrega en correo enviado DESDE el buzón son opcionales y llegan a la misma URL con la misma firma: {event, mailbox, email, message: {id, message_id, to, subject, status, detail}}. |
| headers | object | Encabezados de autenticación cifrados opcionales. Sólo se aceptan Autorización y X-API-Key; enviar {} para borrar. No pase valores a través del contexto del modelo; la CLI admite --authorization-env y --api-key-env. |
Respuesta 200
| address | string | |
| webhook_url | string | |
| signing_secret | string | |
| has_webhook | boolean | |
| events | string[] | Eventos que transporta este webhook: email.received, cualquier veredicto de entrega en correo saliente (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) y los avisos de traspaso de agente (assistant.item.delegated, assistant.item.recalled); vacío sin un webhook |
| header_names | string[] | Nombres de encabezado de autenticación configurados; los valores nunca se devuelven |
| hint | string |
Ejemplo
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}/webhookQuitar webhook del buzón
Elimine la URL del webhook y el secreto de firma de un buzón. Sólo se almacenarán los correos electrónicos entrantes.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Respuesta 200
| address | string | |
| webhook_url | string | null | |
| signing_secret | string | null | |
| has_webhook | boolean | |
| events | string[] | Eventos que transporta este webhook: email.received, cualquier veredicto de entrega en correo saliente (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed) y los avisos de traspaso de agente (assistant.item.delegated, assistant.item.recalled); vacío sin un webhook |
| header_names | string[] | |
| hint | string |
/api/emails/{address}/webhook/rotateRotar el secreto de firma del webhook
Vuelva a generar el secreto de firma HMAC-SHA256 para un webhook de buzón. El viejo secreto queda inmediatamente invalidado.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Respuesta 200
| address | string | |
| webhook_url | string | |
| signing_secret | string | |
| has_webhook | boolean | |
| hint | string |
/api/emails/{address}/webhook/testProbar el webhook del buzón
Envíe una carga útil de prueba firmada a la URL del webhook del buzón. Devuelve el estado HTTP y si la entrega se realizó correctamente. Las pruebas no se vuelven a intentar; las entregas entrantes en vivo se reintentan hasta tres veces.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Respuesta 200
| address | string | |
| webhook_url | string | |
| status | integer | |
| success | boolean | |
| hint | string |
/api/emails/{address}/aliasesListar alias de buzones
Enumere todas las direcciones de alias que se entregan en un buzón. Los alias permiten que varias direcciones (ventas@, hola@, contacto@) compartan una bandeja de entrada sin utilizar una ranura de buzón.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Respuesta 200
| mailbox | string | |
| aliases | object[] | |
| hint | string |
/api/emails/{address}/aliasesAgregar un alias de buzón
Agregue una dirección de alias que entregue en este buzón, sin utilizar una ranura de buzón. El alias debe estar en el mismo dominio que el buzón. Proporcione un slug ("sales") o una dirección completa ("sales@mysite.com").
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Cuerpo de la solicitud
| alias* | string | Dirección de alias: un slug simple o un slug@domain completo en el mismo dominio |
Respuesta 201
| address | string | |
| mailbox | string | |
| created_at | string (date-time) | |
| hint | string |
/api/emails/{address}/aliases/{alias}Eliminar un alias de buzón
Eliminar un alias de un buzón. El correo electrónico a esa dirección deja de entregarse.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| alias* | string | Dirección de alias para eliminar (codificada en URL o un slug simple) |
Respuesta 200
| address | string | |
| deleted | boolean | |
| hint | string |
/api/emails/{address}/client-settingsObtener la configuración del cliente de correo (alojado)
Obtenga la configuración de conexión IMAP/SMTP para un buzón alojado, para configurar Apple Mail, Thunderbird o cualquier cliente de correo. El nombre de usuario es la dirección completa; la contraseña es una contraseña de aplicación (cree una con POST /api/emails/{address}/credentials). Buzones de correo alojados únicamente.
Parámetros
| address* | string | Dirección de buzón alojado (codificada en URL) |
Respuesta 200
| mailbox | string | |
| username | string | |
| imap | object | |
| smtp | object | |
| hint | string |
/api/emails/{address}/credentialsListar contraseñas de aplicaciones (alojadas)
Enumere las contraseñas de la aplicación para un buzón alojado. Los secretos se muestran sólo una vez en la creación; esto devuelve etiquetas y metadatos únicamente. Buzones de correo alojados únicamente.
Parámetros
| address* | string | Dirección de buzón alojado (codificada en URL) |
Respuesta 200
| mailbox | string | |
| credentials | object[] | |
| hint | string |
/api/emails/{address}/credentialsCrear una contraseña de aplicación (alojada)
Cree una contraseña de aplicación para un buzón alojado, utilizada como contraseña en un cliente de correo (IMAP/SMTP). El secreto se devuelve una vez; guárdelo ahora. Buzones de correo alojados únicamente.
Parámetros
| address* | string | Dirección de buzón alojado (codificada en URL) |
Cuerpo de la solicitud
| label | string | Etiqueta para identificar la contraseña de esta aplicación, p. "Correo portátil" |
Respuesta 201
| id | string | |
| label | string | |
| password | string | La contraseña de la aplicación: se muestra una vez, guárdela ahora |
| client_settings | object | |
| hint | string |
/api/emails/{address}/credentials/{id}Revocar la contraseña de una aplicación (alojada)
Revocar la contraseña de una aplicación. Cualquier cliente de correo que lo utilice deja de conectarse inmediatamente. Buzones de correo alojados únicamente.
Parámetros
| address* | string | Dirección de buzón alojado (codificada en URL) |
| id* | string | ID de contraseña de la aplicación (desde el punto final de la lista) |
Respuesta 200
| id | string | |
| revoked | boolean | |
| hint | string |
/api/emails/{address}/messages/{id}/escalateMarcar un mensaje para un humano
Escale un mensaje al humano de la cuenta (o borre la marca con clear=true). Establece needs_human en el mensaje, retiene su conversación en el estado needs_human y dispara el webhook email.escalated + una notificación dentro de la aplicación. La primitiva del producto detrás de 'answer the easy ones, stop on the one the human must decide' (responder las fáciles y detenerse en la que debe decidir el humano).
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| id* | string | ID del mensaje a marcar |
Cuerpo de la solicitud
| reason | string | Por qué se necesita al humano - se muestra en la notificación |
| clear | boolean | Borrar la marca en lugar de establecerla (el humano tomó el control) |
Respuesta 200
| id | string | |
| needs_human | boolean | |
| escalation_reason | string | null | |
| thread_key | string |
/api/emails/{address}/messages/{id}/remindEstablecer un recordatorio de seguimiento
Establezca (o borre con clear=true) un recordatorio de seguimiento de un solo uso en un mensaje. Cuando llega remind_at y el mensaje sigue sin respuesta (entrante: no se envió respuesta; saliente: no se recibió respuesta entrante), email.reminder_due se dispara como webhook + notificación dentro de la aplicación y el recordatorio se borra solo.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| id* | string | ID del mensaje a vigilar |
Cuerpo de la solicitud
| remind_at | string (date-time) | Hora ISO 8601 del recordatorio (entre 1 minuto y 90 días de antelación) |
| note | string | Contexto que se muestra cuando se dispara el recordatorio |
| clear | boolean | Borrar un recordatorio pendiente |
Respuesta 200
| id | string | |
| remind_at | string | null | |
| reminder_note | string | null |
/api/contactsListar contactos
La libreta de direcciones de la cuenta, alimentada automáticamente por el tráfico de correo: corresponsales, recuentos de mensajes, última actividad y notas. Por defecto, los más recientemente activos primero (order=recent), para mostrar: un contacto que recibe correo nuevo durante un recorrido paginado pasa por delante del cursor, así que ese recorrido puede omitirlo. Para sincronizar la libreta completa, pase order=created: los más antiguos primero por fecha de creación y luego por id, una clave que nunca cambia, así que cada contacto que existe durante todo el recorrido se devuelve exactamente una vez y los contactos creados mientras tanto llegan al final. Un cursor solo continúa el orden del que proviene (400 INVALID_CURSOR en caso contrario). Agrega datos de todos los buzones, por lo que los tokens confinados a un buzón se rechazan (400 MAILBOX_CONFINED).
Parámetros
| q | string | Filtrar por subcadena de dirección o nombre |
| limit | integer | Contactos a devolver (predeterminado 50) |
| cursor | string | Cursor de paginación de una respuesta anterior |
| order | string(recent | created) | Orden. recent (predeterminado): los más recientemente activos primero, para mostrar. created: los más antiguos primero por fecha de creación y luego por id, estable para un recorrido completo. Cualquier otro valor devuelve 400 INVALID_ORDER. |
Respuesta 200
| contacts | object[] | |
| next_cursor | string | null |
/api/contactsCrear o actualizar un contacto
Guarde un contacto: establezca un nombre para mostrar y adjunte notas ('prefers short emails', 'decision maker at Acme'). El tráfico de correo sigue alimentando los recuentos de mensajes de todos modos.
Cuerpo de la solicitud
| address* | string | La dirección de correo electrónico del contacto |
| name | string | null | Nombre para mostrar (nulo lo borra) |
| notes | string | null | Notas que los agentes y los humanos leen como contexto (nulo las borra) |
/api/contacts/{address}Eliminar un contacto
Elimine un contacto de la libreta de direcciones. El tráfico de correo lo volverá a crear como contacto automático si vuelve a escribir.
Parámetros
| address* | string | La dirección de correo electrónico del contacto (codificada en URL) |
/api/emails/{address}/rulesListar reglas de correo entrante
Enumere las reglas de filtrado entrante de un buzón, en el orden de prioridad en que se aplican (la primera coincidencia gana).
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Respuesta 200
| mailbox | string | |
| rules | MailRule[] | |
| hint | string |
/api/emails/{address}/rulesAgregar una regla de correo entrante
Añade una regla para mensajes entrantes que coincidan con un campo (from/to/subject/body). Acciones: drop, mark_read, forward (action_arg = dirección), webhook_only (omite el reenvío) y label (action_arg = etiqueta). Las reglas se aplican por prioridad ascendente; gana la primera coincidencia.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
Cuerpo de la solicitud
| 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 | Dirección de reenvío (para forward), valor de etiqueta (para label) o motivo que se muestra al humano (para escalate) |
| priority | integer | La parte inferior se ejecuta primero (por defecto 0) |
| enabled | boolean | Verdadero predeterminado |
Respuesta 201
| id | string | |
| priority | integer | Las carreras más bajas primero |
| 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}Eliminar una regla de correo entrante
Eliminar una regla de filtrado entrante de un buzón.
Parámetros
| address* | string | Dirección de correo electrónico del buzón (codificada en URL) |
| ruleId* | string | La identificación de la regla |
Respuesta 200
| id | string | |
| deleted | boolean | |
| hint | string |
/api/domains/{domain}/email/catch-allEstablecer dominio general
Enrute cada correo electrónico enviado a una dirección no coincidente en el dominio a un buzón designado. Todo lo que no coincida con un buzón, una subdirección o un alias se incluye en el cuadro general. El buzón ya debe existir en el dominio. Cambia el correo de todo el dominio, por lo que un token confinado a buzones recibe 403 MAILBOX_CONFINED.
Parámetros
| domain* | string | Nombre de dominio |
Cuerpo de la solicitud
| mailbox* | string | Buzón general: un slug simple o una dirección completa en este dominio |
Respuesta 200
| domain | string | |
| catch_all | string | null | |
| hint | string |
/api/domains/{domain}/email/catch-allBorrar dominio general
Elimine el comodín en un dominio. El correo electrónico a direcciones no coincidentes se eliminará nuevamente. Cambia el correo de todo el dominio, por lo que un token confinado a buzones recibe 403 MAILBOX_CONFINED.
Parámetros
| domain* | string | Nombre de dominio |
Respuesta 200
| domain | string | |
| catch_all | string | null | |
| hint | string |
/api/email/changesSincronizar incrementalmente un buzón
Llame sin cursor para capturar una línea de base antes de una instantánea completa limitada. Luego pase next_cursor para reproducir las mutaciones que ocurrieron durante y después de esa instantánea. Los cursores son opacos, están firmados, están vinculados al buzón y caducan después de 30 días. Las notificaciones automáticas son sólo sugerencias de invalidación; este diario es la fuente de recuperación duradera. Una entrada sobre un elemento de trabajo creado a partir de un correo de autenticación lleva su title y su ask ocultos para un token sin email:auth_secrets.
Parámetros
| mailbox_id* | string | |
| cursor | string | Opaco next_cursor de una respuesta anterior |
| limit | integer |
Respuesta 200
| changes | MailboxChange[] | |
| next_cursor | string | |
| has_more | boolean | |
| requires_full_sync | boolean | |
| reason | string |
/api/suppressionsListar direcciones suprimidas
Incluya direcciones en su lista de supresión: rebotes permanentes y quejas (ingeridas automáticamente a partir de eventos de entrega) además de entradas manuales. Los envíos a estas direcciones se omiten. Paginado por cursor.
Parámetros
| cursor | string | Cursor de paginación de una respuesta anterior |
| limit | integer | Entradas máximas (predeterminado 50, máximo 100) |
Respuesta 200
| suppressions | object[] | |
| next_cursor | string | null | |
| hint | string |
/api/suppressionsAgregar una supresión
Agregue manualmente una dirección a su lista de supresión para que los envíos futuros la omitan. Los rebotes duros y las quejas se agregan automáticamente; Úselo para las direcciones a las que desea dejar de enviar correos electrónicos. Idempotente.
Cuerpo de la solicitud
| address* | string | Dirección de correo electrónico para suprimir |
| reason | string(manual | hard_bounce | complaint) | Motivo (predeterminado: manual) |
Respuesta 201
| address | string | |
| reason | string | |
| source | string | |
| created_at | string (date-time) | |
| hint | string |
/api/suppressions/{address}Eliminar una supresión
Elimine una dirección de su lista de supresión para poder enviarla por correo electrónico nuevamente (por ejemplo, después de que el destinatario arregló su buzón).
Parámetros
| address* | string | Dirección de correo electrónico suprimida (codificada en URL) |
Respuesta 200
| address | string | |
| deleted | boolean | |
| hint | string |
Collaboration
/api/workspaces/{id}/ownership-transferSolicitar una transferencia de propiedad del espacio de trabajo
Sólo propietario. Envía un enlace de aceptación de 48 horas a un miembro existente. Nada se mueve hasta que ese miembro autenticado acepte.
Parámetros
| id* | string |
Cuerpo de la solicitud
| membership_id* | string |
/api/workspaces/{id}/ownership-transfer/{transferId}Revocar una transferencia de propiedad pendiente
Parámetros
| id* | string | |
| transferId* | string |
/api/workspaces/ownership-transfers/acceptAceptar la propiedad del espacio de trabajo
Sólo objetivo. Transfiere atómicamente el espacio de trabajo, los dominios de ámbito y los buzones de correo; el propietario anterior se convierte en administrador y el pagador existente permanece sin cambios.
Cuerpo de la solicitud
| token* | string |
Autenticación
/api/auth/registerPúblicoCrea una nueva cuenta
Empieza a crear una cuenta nueva (o inicia sesión en una existente) enviando un enlace de inicio de sesión por correo; aquí no se devuelve ninguna clave de API. Una persona que haga clic en ese enlace desde un navegador llega al panel ya con la sesión iniciada. Una CLI o un agente sin sesión de navegador debe usar en su lugar el flujo de inicio de sesión por dispositivo (POST /api/auth/cli y luego sondear GET /api/auth/cli/poll), que envía por correo la misma aprobación y devuelve una clave de API una vez aprobada - la respuesta lo indica en next_steps. Pasar un código ref vincula de forma permanente al nuevo usuario con un referente - el referente gana una comisión sobre todas las futuras compras de dominios de este usuario.
Cuerpo de la solicitud
| email* | string (email) | |
| ref | string | Código de referencia: vincula permanentemente a este usuario con el referente. El referente gana una comisión por cada compra de dominio. |
Respuesta 202
| ok | boolean | |
| verification_required | boolean | |
| message | string | |
| hint | string | |
| next_steps | string[] |
Ejemplo de respuesta
{
"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."
]
}Ejemplo
curl -X POST https://domani.run/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "dev@example.com"}'/api/auth/loginPúblicoEnviar un correo electrónico de inicio de sesión con enlace mágico
Envía un enlace de inicio de sesión al correo electrónico proporcionado. Si el usuario no existe, primero crea una cuenta. El enlace mágico redirige al panel con credenciales de autenticación. Para acceso API programático, use POST /api/auth/register para obtener una clave API directamente.
Cuerpo de la solicitud
| email* | string (email) |
Respuesta 200
| ok | boolean | |
| message | string |
Ejemplo de respuesta
{
"ok": true,
"message": "Check your email for a sign-in link."
}Ejemplo
curl -X POST https://domani.run/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "dev@example.com"}'/api/auth/verifyPúblicoVerificar un token de enlace mágico
Valida el token de enlace mágico y lo redirige al panel con credenciales de autenticación. Utilizado por el correo electrónico de enlace mágico; normalmente los agentes no lo llaman directamente. Los agentes deberían usar POST /api/auth/register en su lugar.
Parámetros
| token* | string | Token de enlace mágico del correo electrónico (codificado en base64url) |
/api/auth/handoffGenerar un código de inicio de sesión de un solo uso entre hosts
Solo para el navegador: permite que una persona con sesión iniciada en domani.run o mailzero.run retome su sesión en el otro host sin un segundo enlace mágico. Devuelve una URL cuyo fragmento lleva un código de un solo uso, válido 60 segundos y vinculado al host; el código nunca se registra ni se envía en una cadena de consulta. No sirve fuera de una sesión de navegador, por lo que no se expone como herramienta de agente.
Cuerpo de la solicitud
| target* | string(mail | domani) | |
| path* | string |
Respuesta 200
| url | string |
Ejemplo de respuesta
{
"url": "https://mailzero.run/auth/handoff#code=xxx&next=%2Finbox"
}/api/auth/handoff/redeemPúblicoCanjear un código de inicio de sesión de un solo uso entre hosts
Solo para el navegador: lo llama la página /auth/handoff en el host de destino para canjear el código del fragmento de la URL por una sesión, exactamente como hace GET /api/auth/verify con un enlace mágico. El código debe coincidir con el Host al que llegó esta solicitud. No es una herramienta de agente.
Cuerpo de la solicitud
| code* | string |
Respuesta 200
| ok | boolean | |
| next | string |
Ejemplo de respuesta
{
"ok": true,
"next": "/inbox"
}Cuenta
/api/meObtener detalles de la cuenta actual
Devuelve la información de la cuenta del usuario autenticado, incluido el correo electrónico, el estado del pago, el estado de la información de contacto, el código de referencia y el recuento de uso. Los agentes deben llamar a esto después de la autenticación para verificar has_payment_method y has_contact antes de intentar realizar compras.
Respuesta 200
| id | string | |
| string (email) | ||
| plan | string | Clave del plan Domani personal activo |
| workspace_plans | string[] | Distintas claves activas del plan Mailzero en espacios de trabajo a los que el usuario puede acceder |
| has_payment_method | boolean | Si el usuario tiene una tarjeta registrada (requerido antes de comprar dominios) |
| preferred_payment_method | string | null | |
| preferred_locale | string | Configuración regional utilizada por las interfaces Domani y las comunicaciones transaccionales |
| has_contact | boolean | Si el usuario ha configurado su información de contacto WHOIS. Opcional para compras (mientras no esté configurada, el contacto de Domani mantiene los nuevos dominios en nombre del usuario), obligatoria para una transferencia entrante. |
| contact | RegistrantContact | Información de contacto del registrante (nula si no está configurada) |
| referral_code | string | Su código de referencia único |
| referral_rate | integer | Porcentaje de comisión sobre compras referidas |
| balance | number | Saldo de crédito del Marketplace en USD (obtenido de las ventas) |
| domain_count | integer | Número de dominios poseídos |
| token_count | integer | Número de tokens API activos |
| features | string[] | Indicadores de funciones habilitados para esta cuenta (funciones GA más las funciones de vista previa otorgadas al usuario), por ejemplo, mailzero_assistant |
| can_manage_assistant | boolean | Indica si el token que realiza la llamada tiene el alcance assistant:read. Independiente de `features`: un indicador de función dice que la cuenta es apta para el asistente, esto indica si este token específico (acceso completo, o un token con ámbito CLI/OAuth/delegado) puede leer o cambiar su configuración. |
| is_admin | boolean | |
| mailbox_entitlement | object | Capacidad de buzones con dominio propio en el espacio de trabajo personal de la cuenta. Tiene su propio plan, no el `plan` de arriba: un espacio de trabajo puede tener su propia suscripción a Mailzero mientras el plan del usuario sigue siendo gratuito. |
| created_at | string (date-time) |
Ejemplo de respuesta
{
"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"
}Ejemplo
curl https://domani.run/api/me \ -H "Authorization: Bearer domani_sk_xxx"
/api/meActualizar preferencias de cuenta
Actualice el método de pago preferido del usuario autenticado y/o la configuración regional de BCP 47. Las respuestas de la API permanecen estructuradas y no se traducen.
Cuerpo de la solicitud
| preferred_payment_method | string | null(card | usdc) | Método de pago predeterminado para compras (card, usdc o null para selección automática) |
| preferred_locale | string(en | fr | es | pt-BR | ja | zh-Hans | it) | Configuración regional utilizada por las interfaces Domani y las comunicaciones transaccionales |
Respuesta 200
| preferred_payment_method | string | null | |
| preferred_locale | string | |
| hint | string |
/api/meEliminar cuenta (bloqueada mientras se mantienen los dominios)
Elimine permanentemente la cuenta, los tokens, los webhooks, los buzones de correo y otros datos de la aplicación del usuario autenticado. Los dominios registrados NO se eliminan con la cuenta: la solicitud falla con 409 HAS_DOMAINS hasta que se transfieren todos los dominios. Esta acción no se puede deshacer.
Respuesta 200
| deleted | boolean | |
| hint | string |
/api/me/activationObtenga un estado de activación veraz y las siguientes acciones recomendadas
Devuelve hitos del producto derivados del servidor y acciones siguientes teniendo en cuenta la capacidad. Se excluyen deliberadamente la creación y el uso de tokens, las visitas a páginas y el estado de la lista de verificación del cliente.
Respuesta 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 |
Ejemplo
curl https://domani.run/api/me/activation \ -H "Authorization: Bearer domani_sk_xxx"
/api/me/activationDescartar o restaurar la guía de primera ejecución
Almacena únicamente la preferencia de presentación. No puede completar un hito del producto.
Cuerpo de la solicitud
| dismissed_version* | integer |
Respuesta 200
| dismissed_version | integer | |
| hint | string |
/api/me/contactObtener información de contacto del registrante
Devuelve la información de contacto WHOIS del titular del usuario autenticado. Opcional para compras (mientras no esté configurada, el contacto de Domani mantiene los nuevos dominios en nombre del usuario), obligatoria para una transferencia entrante.
Respuesta 200
| has_contact | boolean | |
| contact | RegistrantContact |
Ejemplo de respuesta
{
"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"
}
}Ejemplo
curl https://domani.run/api/me/contact \ -H "Authorization: Bearer domani_sk_xxx"
/api/me/contactEstablecer información de contacto del registrante
Configura o actualiza tu información de contacto WHOIS del titular. Opcional para compras, obligatoria para una transferencia entrante. Se convierte en el contacto titular y de facturación de tus dominios: mientras no esté configurada, el contacto de Domani los mantiene en tu nombre. Al actualizarla, el nuevo contacto se envía a todos tus dominios activos en los registradores que admiten cambios de contacto, lo que te convierte en su titular; el registrador puede pedirte por correo que lo confirmes en un plazo de 15 días.
Respuesta 200
| contact | RegistrantContact |
Ejemplo
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 verificación de correo electrónico de contacto
Vuelva a enviar el correo de verificación a la dirección de contacto de la cuenta. Limitado a un envío cada 15 minutos por dirección.
Cuerpo de la solicitud
| string (email) | Dirección de correo electrónico para verificar (el valor predeterminado es el correo electrónico de contacto de la cuenta) |
Respuesta 200
| sent | boolean | |
| already_verified | boolean | |
| hint | string |
/api/sessionsListar los dispositivos conectados
Cada navegador, app móvil y terminal con la sesión iniciada en la cuenta, primero la sesión de quien llama (current). Cada inicio de sesión abre su propia sesión, así que iniciar sesión en un dispositivo nuevo nunca cierra la de otro. La ubicación es desde donde inició sesión el dispositivo (país y ciudad según su IP), ausente si se desconoce. Las claves de API no son sesiones: lístalas con GET /api/tokens.
Respuesta 200
| sessions | object[] | |
| hint | string |
Ejemplo de respuesta
{
"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."
}Ejemplo
curl https://domani.run/api/sessions \ -H "Authorization: Bearer domani_sk_xxx"
/api/sessionsCerrar la sesión en todos los demás dispositivos
Cierra todas las sesiones de la cuenta excepto la que hace la solicitud. Esos dispositivos deberán iniciar sesión de nuevo en su próxima solicitud. Las claves de API no cambian.
Respuesta 200
| revoked | integer | |
| hint | string |
Ejemplo de respuesta
{
"revoked": 2,
"hint": "Every other device is signed out. API keys are unchanged."
}Ejemplo
curl -X DELETE https://domani.run/api/sessions \ -H "Authorization: Bearer domani_sk_xxx"
/api/sessions/{id}Cerrar la sesión de un dispositivo
Cierra una sesión. current designa la sesión que hace la solicitud (cerrar la propia sesión no requiere alcance); cualquier otra sesión requiere tokens:write.
Parámetros
| id* | string | ID de la sesión (de GET /api/sessions), o `current` |
Respuesta 200
| success | boolean | |
| current | boolean | Verdadero cuando quien llama cerró su propia sesión: su clave ya no funciona |
| hint | string |
Ejemplo de respuesta
{
"success": true,
"current": false,
"hint": "That device is signed out and will be asked to sign in again."
}Ejemplo
curl -X DELETE https://domani.run/api/sessions/cm5ses456 \ -H "Authorization: Bearer domani_sk_xxx"
tokens API
/api/agents/identity/{slug}/tokensListar los tokens de API de una identidad de agente
Los tokens vinculados a esta identidad de agente (claves enmascaradas, scopes, confinamiento de buzones, último uso). Un token vinculado a un agente es la vista de ese agente sobre cada superficie de asistente y correo.
Parámetros
| slug* | string | El identificador de la identidad de agente. |
/api/agents/identity/{slug}/tokensDar a un agente su propia clave de API en una sola llamada
Crea un token vinculado a esta identidad de agente, confinado a los buzones que el agente opera, con los scopes mínimos que un agente necesita (assistant:read, assistant:write, email:read, email:write). Con esa clave el agente lee solo su propio Today, sus buzones y los elementos que se le entregan; nombrar otro agente responde 403 y las rutas exclusivas del propietario (settings, backfill, export) lo rechazan. La clave completa se devuelve solo en esta respuesta. Requiere tokens:write. Un agente que no opera ningún buzón no recibe alcances de correo por defecto, y pedirlos responde 400 AGENT_MAILBOXES_REQUIRED: una clave sin buzones alcanzaría todos los buzones de la cuenta.
Parámetros
| slug* | string | El identificador de la identidad de agente. |
Cuerpo de la solicitud
| name | string | Por defecto '<slug> agent'. |
| scopes | string[] | Por defecto assistant:read, assistant:write, email:read, email:write. No puede exceder los scopes propios del llamador. |
| mailboxes | string[] | Direcciones de buzones a las que el token está confinado. Por defecto los buzones que el agente opera. |
| expires_in | integer | Segundos hasta la expiración (máximo un año). |
Respuesta 201
| success | boolean | |
| token | object | |
| agent | object | |
| hint | string |
Ejemplo
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}Revocar un token de API de un agente
Revoca un token vinculado a esta identidad de agente. Deja de funcionar inmediatamente. Requiere tokens:write.
Parámetros
| slug* | string | |
| id* | string |
Respuesta 200
| success | boolean | |
| hint | string |
/api/tokensEnumere sus tokens API
Devuelve todos los tokens de API para el usuario autenticado. Las claves están enmascaradas por seguridad (los primeros 12 + últimos 4 caracteres son visibles). Utilice esto para auditar tokens activos.
Respuesta 200
| tokens | TokenInfo[] |
Ejemplo de respuesta
{
"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"
}
]
}Ejemplo
curl https://domani.run/api/tokens \ -H "Authorization: Bearer domani_sk_xxx"
/api/tokensCrear un nuevo token API
Crea un nuevo token de API. La clave completa se devuelve solo en esta respuesta; guárdela de forma segura. Puede crear varios tokens para separar el acceso a diferentes aplicaciones.
Cuerpo de la solicitud
| name | string | Nombre legible por humanos para identificar este token |
| expires_in | integer | Vida útil del token en segundos (mínimo 3600 = 1 h, máximo 31536000 = 1 año). Omitir sin vencimiento. |
| expires_at | string (date-time) | Fecha de caducidad absoluta (ISO 8601). Alternativa a expires_in. |
| scopes | string[] | Ámbitos de permiso para este token. Utilice ['*'] para acceso completo (predeterminado). Un token solo puede otorgar alcances que ya tiene (atenuación de alcance). Ámbitos: 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 (implica pago, incluye compras en el 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 (Elimina permanentemente los mensajes que ya están en la Papelera. Mover mensajes a la Papelera solo requiere email:write. Otorgue este alcance solo a los agentes autorizados a borrar irreversiblemente el contenido del correo electrónico), email:manage_mailboxes (Crea buzones (POST /api/emails) y nada más. El alcance administrativo restringido para agentes que pueden crear direcciones para nuevos proyectos (partners@, launch@) sin poder leer ni enviar correo, administrar dominios ni tocar tokens), email:auth_secrets (Lee mensajes clasificados como correo de autenticación (OTP / códigos de verificación, restablecimientos de contraseña, enlaces mágicos). Sin él, email:read todavía los enumera, pero el asunto y el cuerpo quedan ocultos - por lo que un token de agente robado no puede recolectar códigos 2FA. Otorgue solo a agentes que realmente necesitan completar inicios de sesión), 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 (Leer configuración del asistente Mailzero, la cola Today, elementos de Work, vistas previas de acciones exactas, progreso de importación de historial y Activity con contenido minimizado), assistant:write (Cambiar configuración del asistente Mailzero, registrar consentimiento e iniciar importaciones de historial, registrar Decisiones humanas sobre elementos de Work, reintentar importaciones y exportar o eliminar datos derivados del asistente. Nunca envía correo). |
| max_per_tx | number | Límite de gasto por transacción en USD. Cualquier cargo por encima de este falla con 403 SPEND_CAP_EXCEEDED. Un token solo puede otorgar límites iguales o inferiores al suyo (CAP_ESCALATION en caso contrario). |
| max_per_month | number | Límite de gasto móvil por mes calendario en USD en todas las operaciones pagas realizadas con este token. |
| agent_identity_id | string | Identificación opcional de una identidad de agente propiedad de esta cuenta. Las acciones de correo realizadas con el token se atribuyen a ese agente. |
| http_route_policy | object | Autoridad estructurada obligatoria para un token con ámbito que incluya http-routes:read o http-routes:write. |
| mailboxes | string[] | Confine el token a estas direcciones de buzón (slug@domain). Un token confinado solo ve y actúa sobre esos buzones; un solicitante confinado solo puede delegar un subconjunto de los suyos (400 MAILBOX_ESCALATION en caso contrario). |
Respuesta 201
| id | string | |
| name | string | |
| key | string | Clave API completa: guárdela, no se volverá a mostrar |
| expiresAt | string (date-time) | null | Cuando este token caduca (nulo = nunca) |
| scopes | string[] | Ámbitos de permiso otorgados a este token |
| createdAt | string (date-time) | |
| max_per_tx | number | null | Límite de gasto por transacción en USD (nulo = sin límite) |
| max_per_month | number | null | Límite de gasto mensual en USD (nulo = sin límite) |
| mailbox_ids | string[] | IDs de buzón a los que está confinado este token |
| http_route_policy | HttpRoutePolicy | |
| agent_identity | object | null |
Ejemplo de respuesta
{
"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
}Ejemplo
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}Revocar un token de API
Revoca permanentemente un token API. Cualquier aplicación que utilice este token perderá el acceso inmediatamente. Esta acción no se puede deshacer.
Parámetros
| id* | string | ID de token (de la respuesta GET /api/tokens) |
Respuesta 200
| success | boolean |
Ejemplo de respuesta
{
"success": true
}Ejemplo
curl -X DELETE https://domani.run/api/tokens/cm5abc123 \ -H "Authorization: Bearer domani_sk_xxx"
/api/auditListar eventos de auditoría de seguridad
Devuelve el registro de auditoría de seguridad de la cuenta, del más reciente al más antiguo: ciclo de vida del token (creación, revocación, intentos de escalada), denegaciones por límite de gasto y max_price, cargos, solicitudes de pago y eliminaciones de cuenta bloqueadas. Úsalo para supervisar la actividad de los tokens de tus agentes.
Parámetros
| limit | integer | Eventos por página |
| cursor | string | Cursor de paginación (next_cursor de la página anterior) |
| type | string | Filtrar por tipo de evento (por ejemplo, token.creado, compra.cargado, compra.denied_cap) |
Respuesta 200
| events | object[] | |
| next_cursor | string | null | |
| hint | string |
Ejemplo de respuesta
{
"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."
}Ejemplo
curl "https://domani.run/api/audit?limit=50" \ -H "Authorization: Bearer domani_sk_xxx"
Webhooks
/api/webhooksListar webhooks
Enumere todos los puntos finales de webhook configurados para su cuenta. Devuelve la URL, los eventos suscritos y el estado activo de cada webhook. Los secretos nunca se devuelven después de la creación. Un token confinado a buzones solo ve los webhooks confinados a sus propios buzones.
Respuesta 200
| webhooks | object[] | |
| hint | string |
Ejemplo de respuesta
{
"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)."
}Ejemplo
curl https://domani.run/api/webhooks \ -H "Authorization: Bearer domani_sk_xxx"
/api/webhooksCrear webhook
Registre un nuevo punto final de webhook HTTPS. Los valores de autorización opcional o clave X-API se cifran en reposo y se incluyen en cada entrega. El secreto de firma se devuelve sólo una vez. Máximo 5 webhooks por cuenta. Un webhook creado por un token confinado a buzones queda confinado a los mismos buzones: no recibe ningún evento de correo de otro buzón.
Cuerpo de la solicitud
| url* | string (uri) | URL HTTPS que recibirá solicitudes POST de webhook |
| events* | string[] | Tipos de eventos a los que suscribirse. Utilice GET /api/webhooks/events para enumerar los tipos disponibles. |
| headers | object | Encabezados de autenticación cifrados opcionales. Solo se aceptan autorización y clave X-API. |
Respuesta 200
| id | string | |
| url | string (uri) | |
| events | string[] | |
| secret | string | Secreto de firma HMAC-SHA256 (se muestra una vez) |
| active | boolean | |
| header_names | string[] | Nombres de encabezado de autenticación configurados; los valores nunca se devuelven |
| created_at | string (date-time) | |
| hint | string |
Ejemplo de respuesta
{
"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."
}Ejemplo
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}Actualizar webhook
Actualice la URL de un webhook, los eventos suscritos, el estado activo o los encabezados de autenticación cifrados. Envíe sólo los campos que desee cambiar. Un token confinado a buzones solo alcanza los webhooks confinados a sus propios buzones (404 en caso contrario).
Parámetros
| id* | string | ID de webhook |
Cuerpo de la solicitud
| url | string (uri) | Nueva URL HTTPS |
| events | string[] | Nueva lista de tipos de eventos |
| active | boolean | Establecer falso para pausar, verdadero para reanudar |
| headers | object | Reemplace los encabezados de autenticación cifrados; enviar {} para borrar. Solo se aceptan autorización y clave X-API. |
Respuesta 200
| id | string | |
| url | string (uri) | |
| events | string[] | |
| active | boolean | |
| header_names | string[] | Nombres de encabezado de autenticación configurados; los valores nunca se devuelven |
| hint | string |
/api/webhooks/{id}Eliminar webhook
Eliminar un punto final de webhook. Todas las entregas pendientes serán canceladas. Esto no se puede deshacer. Un token confinado a buzones solo alcanza los webhooks confinados a sus propios buzones (404 en caso contrario).
Parámetros
| id* | string | ID de webhook |
Respuesta 200
| success | boolean | |
| hint | string |
/api/webhooks/{id}/deliveriesListar entregas de webhooks
Obtenga intentos de entrega recientes para un webhook. Muestra el tipo de evento, el estado de HTTP, el número de intentos y cualquier error. Útil para depurar entregas fallidas. Un token confinado a buzones solo alcanza los webhooks confinados a sus propios buzones (404 en caso contrario).
Parámetros
| id* | string | ID de webhook |
| limit | integer | Número máximo de entregas a devolver |
Respuesta 200
| deliveries | object[] | |
| hint | string |
Ejemplo de respuesta
{
"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}/replayReproducir una entrega de webhook
Clona y vuelve a entregar inmediatamente un evento de webhook inmutable. La carga útil del evento y el ID del evento permanecen idénticos; la firma HMAC recibe una nueva marca de tiempo. Una clave de idempotencia requerida garantiza que los reintentos de la persona que llama nunca se envíen dos veces. Un token confinado a buzones solo alcanza los webhooks confinados a sus propios buzones (404 en caso contrario). Una excepción a la carga útil idéntica: un asunto copiado de un correo de autenticación se envía oculto, ya que la URL del webhook puede haber cambiado desde el primer envío.
Parámetros
| id* | string | ID de webhook |
| deliveryId* | string | ID de entrega original |
Cuerpo de la solicitud
| idempotency_key* | string |
Respuesta 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
Enumere todos los tipos de eventos de webhook disponibles con descripciones. No se requiere autenticación.
Respuesta 200
| events | object[] |
Ejemplo de respuesta
{
"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"
}
]
}Ejemplo
curl https://domani.run/api/webhooks/events
Notificaciones
/api/notificationsLista de notificaciones
Enumere sus notificaciones dentro de la aplicación con paginación basada en cursor. Incluye eventos de transacciones, actualizaciones de listados y alertas del sistema. Requiere alcance notifications:read. Una notificación escrita antes de que los asuntos de correo se ocultaran al escribirse se lee con el asunto del correo de autenticación oculto, en body y data.subject, para un token sin email:auth_secrets.
Parámetros
| limit | integer | Notificaciones máximas para regresar |
| cursor | string | Cursor para paginación (del next_cursor de la respuesta anterior) |
Respuesta 200
| notifications | object[] | |
| has_more | boolean | |
| next_cursor | string | null |
/api/notifications/countObtener recuento de notificaciones no leídas
Punto final ligero para sondear el recuento de notificaciones no leídas. Requiere alcance notifications:read.
Respuesta 200
| unread_count | integer |
Ejemplo de respuesta
{
"unread_count": 3
}/api/notifications/{id}Marcar notificación como leída
Marcar una sola notificación como leída. Requiere alcance notifications:read.
Parámetros
| id* | string | ID de notificación |
Cuerpo de la solicitud
| read* | boolean | Establecer en verdadero para marcar como leído |
Respuesta 200
| ok | boolean |
/api/notifications/read-allMarcar todas las notificaciones como leídas
Marcar todas las notificaciones no leídas como leídas. Requiere alcance notifications:read.
Respuesta 200
| ok | boolean | |
| count | integer | Número de notificaciones marcadas como leídas |
/api/notifications/preferencesObtener preferencias de notificación
Devuelve las preferencias de notificación del usuario para cada categoría y canal (in_app, email). Las preferencias que faltan están habilitadas de forma predeterminada. Requiere alcance notifications:read.
Respuesta 200
| preferences | object[] | |
| expiry_alert_days | integer[] | Días antes del vencimiento, el usuario recibe recordatorios de renovación (predeterminado 30/7/1). Vacío = sin recordatorios de vencimiento. |
/api/notifications/preferencesActualizar preferencias de notificación
Actualice las preferencias de notificación para categorías y canales específicos. Requiere alcance notifications:read.
Cuerpo de la solicitud
| preferences | object[] | |
| expiry_alert_days | integer[] | Días antes del vencimiento para recibir recordatorios de renovación. Matriz vacía = sin recordatorios de vencimiento. |
Respuesta 200
| ok | boolean |
TLD
/api/tldsPúblicoEnumerar los TLD que vende Domani, con precios
Devuelve los TLD que vende Domani, con precios de registro, renovación y transferencia. Es el catálogo de nuestros registradores, no todos los TLD que existen: algunos TLD de la zona raíz, como gov o edu, no se pueden registrar a través de Domani. Cada entrada tiene un kind: tld (un TLD de la zona raíz de IANA), second_level (una oferta bajo uno de ellos, como co.uk) o alt_root (un nombre fuera de la zona raíz, que no se resuelve en el DNS público). Las entradas alt_root se omiten salvo que el parámetro kind las pida. Admite filtrado por rango de precios, búsqueda por nombre de TLD, ordenación y paginación mediante limit/offset. Cuando está paginado, incluye un encabezado Link con la URL de la página siguiente. Punto final público: no se requiere autenticación. Las solicitudes autenticadas obtienen límites de velocidad más altos (60/min frente a 30/min).
Parámetros
| max_price | number | Precio máximo de inscripción en USD |
| min_price | number | Precio mínimo de inscripción en USD |
| sort | string(tld | price | renewal) | Campo de clasificación: 'tld' (alfabético), 'price' (registro) o 'renewal' |
| order | string(asc | desc) | orden de clasificación |
| search | string | Filtrar nombres de TLD que contengan esta cadena |
| limit | integer | Resultados máximos por página |
| offset | integer | Número de resultados a omitir |
| kind | string | Tipos que se devuelven, separados por comas: `tld`, `second_level`, `alt_root`. Por defecto: `tld,second_level`, las entradas que se resuelven en el DNS público. Las entradas `alt_root` (fuera de la zona raíz de IANA) solo se devuelven cuando se piden. |
Respuesta 200
| tlds | TldInfo[] | |
| total | integer | Total de TLD coincidentes (antes de la paginación) |
| offset | integer | |
| limit | integer | null |
Ejemplo de respuesta
{
"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
}Ejemplo
curl https://domani.run/api/tlds?max_price=10&sort=price
Búsqueda de Dominio
/api/domains/searchPúblicoConsulta disponibilidad y precios de dominios
Comprueba la disponibilidad y los precios de uno o más dominios a través de RDAP + precios minoristas. Después, un nombre que RDAP considera no registrado se comprueba con el registrador: un nombre premium o reservado por el registro se devuelve con available: false, registry_status y un reason. Utilice q para un solo dominio (devuelve un objeto plano) o domains para múltiples (devuelve una matriz). Admite transmisión SSE a través del encabezado Accept: text/event-stream: al cerrar la conexión se cancelan todas las búsquedas RDAP en curso en el lado del servidor. Máximo 200 dominios por solicitud. Punto final público: no se requiere autenticación. Las solicitudes autenticadas obtienen límites de velocidad más altos (60/min frente a 20/min).
Parámetros
| q | string | Dominio único que incluye TLD (taquigrafía: devuelve un objeto plano). Mutuamente excluyentes con `domains`. |
| domains | string | Lista separada por comas de nombres de dominio completos para verificar (máximo 200). Devuelve el resultado de la matriz. |
| max_price | number | Solo incluye dominios bajo este precio (USD) |
| sort | string(price | tld) | Ordenar resultados por precio o nombre de TLD |
| source | string(all | primary | secondary) | Filtre los resultados por fuente: 'primary' (solo disponibilidad del registrador), 'secondary' (solo listados del mercado Domani) o 'all' (ambas) |
| order | string(asc | desc) |
Respuesta 200
| available | boolean | Si el dominio está disponible para registro |
| domain | string | Nombre de dominio completo, incluido TLD |
| price | number | Precio de registro en la moneda especificada |
| currency | string | Código de moneda ISO 4217 (siempre USD) |
| error | boolean | Verdadero si falló la búsqueda de RDAP (disponibilidad desconocida) |
| for_sale | object | Presente cuando el dominio está a la venta (ya sea en el mercado de Domani o detectado en un mercado secundario externo) |
| tld_kind | string | Tipo, según la zona raíz, del sufijo del dominio: `tld`, `second_level` o `alt_root`. Un dominio `alt_root` está fuera de la zona raíz de IANA y no se resuelve en el DNS público: no se comprueba, y `reason` explica por qué. |
| registry_status | string | Presente cuando el registro retiene un nombre que RDAP considera no registrado: `premium` (el registro fija su propio precio, véase `registry_price`) o `reserved` (no se puede registrar). Un resultado así tiene `available: false`, ya que `POST /api/domains/buy` no puede registrarlo, y `reason` explica por qué. |
| registry_price | number | Presente en los resultados `premium` cuando el registrador lo indicó: el precio del primer año fijado por el registro, en USD. `price` sigue siendo el precio estándar del TLD, que no se aplica a este nombre. |
| renewal_price | number | Lo que cuesta cada año después del primero, en USD, en el registrador que registraría el nombre: lo que se factura al renovarlo. Ausente cuando se desconoce. En un resultado `premium` es, como `price`, el precio estándar del TLD. |
| reason | string | Por qué no se ofrece el dominio: un nombre fuera del DNS público (`tld_kind` `alt_root`) o un nombre que el registro retiene (`registry_status`). |
Ejemplo
curl "https://domani.run/api/domains/search?q=mysite.com"
/api/domains/suggestPúblicoSugerencias de dominios basadas en IA con disponibilidad
Dada una descripción del proyecto, genera nombres de dominio completos con TLD creativos (por ejemplo, codebuddy.dev, wavify.fm), verifica la disponibilidad y devuelve solo los dominios disponibles con precios. Utiliza un bucle agente que reintenta hasta que se encuentran suficientes dominios disponibles. Admite transmisión SSE a través de Accept: text/event-stream: cerrar la conexión cancela la generación de LLM en vuelo y las búsquedas RDAP en el lado del servidor. Punto final público: no se requiere autenticación.
Parámetros
| prompt* | string | Descripción del proyecto o palabras clave para generar sugerencias de dominio (mínimo 3 caracteres) |
| count | integer | Número de dominios disponibles para devolver (predeterminado 10) |
| exclude | string | Lista de dominios separados por comas para excluir de las sugerencias (por ejemplo, de un lote anterior) |
| tlds | string | TLD preferidos separados por comas (sin puntos). Los resultados favorecerán fuertemente a estos TLD. |
| style | string(single | creative | short | brandable | keyword) | Preferencia de estilo de nombre: "single" (una palabra), "creative" (evocador/metafórico), "short" (3-6 caracteres), "brandable" (inventado), "keyword" (descriptivo). |
| lang | string(japanese | spanish | french | italian | latin | nordic | arabic | sanskrit) | Inspiración lingüística/cultural para los nombres. Los nombres se basarán en las palabras, la estética y la cultura de este idioma. |
Respuesta 200
| suggestions | object[] | Nombres de dominio disponibles con precios |
| checked | integer | Total de dominios comprobados |
| iterations | integer | Número de rondas de LLM |
Ejemplo de respuesta
{
"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
}Ejemplo
curl "https://domani.run/api/domains/suggest?prompt=AI+coding+assistant"
/api/domains/dns-checkPúblicoComprobación rápida de existencia de dominio basada en DNS
Prueba si un nombre de dominio se utiliza en muchos TLD a la vez mediante consultas DNS (más rápido que la búsqueda, sin precio). Devuelve matrices 'taken' (definitivamente registradas) y 'candidates' (potencialmente disponibles). Utilice esto para limitar antes de llamar a la búsqueda para conocer los precios. Punto final público: no se requiere autenticación.
Parámetros
| name* | string | Nombre de dominio sin TLD, p.e. 'myapp' |
| tlds* | string | TLD separados por comas para verificar, p. 'com,dev,ai,io' |
Respuesta 200
| name | string | |
| taken | string[] | TLD que están definitivamente registrados |
| candidates | string[] | TLD que están potencialmente disponibles |
Dominios
/api/domainsLista todos tus dominios registrados
Devuelve todos los dominios propiedad del usuario autenticado, ordenados por fecha de compra (los más nuevos primero). Incluye nombre de dominio, estado, fecha de compra y fecha de vencimiento.
Respuesta 200
| domains | DomainRecord[] |
Ejemplo de respuesta
{
"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
}
]
}Ejemplo
curl https://domani.run/api/domains \ -H "Authorization: Bearer domani_sk_xxx"
/api/agents/identityReclamar una identidad de agente libre (<handle>.domani.run)
Le brinda al agente una identidad gratuita en <slug>.domani.run: una página de perfil activa, sin compra de dominio, al instante. La forma más sencilla de empezar; actualice a un dominio de propiedad real más adelante. Requiere account:write.
Cuerpo de la solicitud
| slug* | string | El identificador se convierte en <slug>.domani.run |
| name | string | Nombre para mostrar |
| bio | string | |
| emoji | string | emojis de avatar |
| string (email) | Contacto público (por ejemplo, su bandeja de entrada gratuita @domani.run) | |
| links | object[] |
Respuesta 200
| id | string | ID de identidad estable utilizada para vincular tokens de API con ámbito |
| slug | string | |
| url | string | El subdominio de identidad (canónico) |
| page_url | string | Ruta alternativa que siempre funciona |
| name | string | null | |
| bio | string | null | |
| emoji | string | null | |
| string | null | ||
| links | object[] | |
| views | integer | |
| created_at | string (date-time) |
Ejemplo de respuesta
{
"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"
}Ejemplo
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/identityEnumere las identidades de sus agentes
Enumera las identidades gratuitas (<handle>.domani.run) que has reclamado. Requiere account:read.
Respuesta 200
| identities | AgentIdentity[] |
/api/agents/identity/{slug}Actualizar la identidad de un agente
Actualiza los campos name/bio/emoji/email/links de una identidad gratuita. Requiere account:write.
Parámetros
| slug* | string | El identificador para actualizar |
Cuerpo de la solicitud
| name | string | |
| bio | string | |
| emoji | string | |
| string | ||
| links | object[] |
Respuesta 200
| id | string | ID de identidad estable utilizada para vincular tokens de API con ámbito |
| slug | string | |
| url | string | El subdominio de identidad (canónico) |
| page_url | string | Ruta alternativa que siempre 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 la identidad de un agente
Libera un identificador de identidad gratuito para que vuelva a estar disponible. Requiere account:write.
Parámetros
| slug* | string | El mango para soltar |
Respuesta 200
| success | boolean | |
| slug | string | |
| released | boolean |
/api/agents/provisionProporcione una identidad de agente completa en una sola llamada
Proporciona a un agente de IA una identidad completa en Internet en una sola solicitud: compra el dominio (si aún no lo posee), configura DNS de correo electrónico, crea un buzón y, opcionalmente, registra un webhook autenticado para correo electrónico entrante y eventos de dominio. webhook_headers acepta solo Authorization y X-API-Key; los valores se cifran en reposo y nunca se devuelven. Al repetir el mismo dominio, buzón de correo y URL de webhook, se reutilizan esos recursos. Cada entrada de webhook se valida antes de la compra o el cargo de un dominio. La compra del dominio es el único paso que puede cobrar y el único requisito previo estricto: si falla, falla toda la llamada (402 para pago, 409 si se realiza con otra cuenta). La configuración del correo electrónico, la creación de buzones de correo y el registro de webhooks son los mejores esfuerzos: los problemas transitorios (por ejemplo, DNS aún propagándose) se devuelven en warnings en lugar de fallar la llamada, por lo que el agente siempre obtiene su dominio. El pago funciona exactamente como POST /api/domains/buy (tarjeta, saldo del mercado o USDC a través del encabezado PAYMENT-SIGNATURE/flujo de dos pasos).
Cuerpo de la solicitud
| domain* | string | Dominio para entregar al agente. Comprado si aún no lo posee. |
| slug | string | Parte local del buzón (hi@domain). Predeterminado "hi". |
| name | string | Nombre para mostrar del correo electrónico saliente. |
| webhook_url | string (uri) | URL HTTPS opcional para recibir correo electrónico entrante + eventos de dominio. |
| webhook_headers | object | Autenticación de entrega opcional. Los valores se cifran en reposo y nunca se devuelven; las respuestas exponen únicamente header_names. |
| webhook_events | string[] | Tipos de eventos de webhook. El valor predeterminado es email.received/delivered/bounced. |
| payment_method | string(card | usdc | balance) | Cómo pagar el dominio. |
| payment_tx | string | Hash USDC tx (flujo de dos pasos). |
| payment_chain | string(base | ethereum) | |
| years | integer | |
| max_price | number | Tope en USD para el cargo del dominio. Si el precio real lo supera, la solicitud falla con 400 PRICE_ABOVE_MAX y no se cobra nada. El campo `price` del error es el total a aceptar; confírmalo con el usuario antes de reintentar con ese max_price. |
Respuesta 200
| domain | string | |
| domain_status | string | |
| mailbox | object | null | |
| webhook | object | null | |
| warnings | string[] | |
| hint | string | |
| next_steps | string[] |
Ejemplo
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/buyCompra uno o más dominios
Compra uno o más dominios y los registra inmediatamente. Envíe {"domain": "..."} para un solo envío o {"domains": ["...", "..."]} para envíos masivos (máximo 10). Si el dominio está a la venta en el mercado de Domani, este punto final se dirige automáticamente a una compra en el mercado en lugar de a un nuevo registro. La respuesta incluye years: 0 y marketplace_purchase: true para distinguirla de un registro. Las compras en Marketplace son únicamente de dominio único. El comprador paga el precio total indicado; el vendedor recibe el precio menos la comisión de la plataforma (por defecto, 10%). Las compras masivas procesan cada dominio de forma independiente; las fallas no bloquean otras compras. La respuesta incluye results (exitosos), errors (fallidos) y summary con recuentos. Acepta tres métodos de pago: 1. Tarjeta (predeterminada): requiere una tarjeta registrada a través de POST /api/billing/setup. Cobrado por dominio. 2. USDC (dos pasos): Primera llamada sin pago para obtener un 402 con payment_options.crypto (dirección de billetera, monto, cadenas). Envíe USDC en cadena, luego vuelva a intentarlo con payment_tx y payment_chain en el cuerpo de la solicitud. 3. x402 USDC (atómico): incluya un encabezado PAYMENT-SIGNATURE con un pago en USDC firmado en Base. Las compras al por mayor requieren una tarjeta registrada (USDC no es compatible con múltiples dominios). Si no se proporciona ningún pago para un solo dominio, devuelve HTTP 402 con instrucciones de pago.
Cuerpo de la solicitud
| domain | string | Dominio único para comprar (por ejemplo, mysite.com) |
| domains | string[] | Variedad de dominios para comprar (máximo 10, requiere tarjeta registrada) |
| payment_method | string(card | usdc | balance) | Método de pago: 'card' (predeterminado), 'usdc' (x402; la primera llamada devuelve 402 con instrucciones de pago) o 'balance' (gastar crédito del mercado). |
| payment_tx | string | Hash de transacción de un pago en USDC ya enviado en cadena. Requerido en la segunda convocatoria del flujo USDC de dos pasos. |
| payment_chain | string(base | ethereum) | Cadena por la que se envió el pago en USDC (por ejemplo, 'base' o 'ethereum'). |
| years | integer | Número de años para registrarse (1-10, predeterminado 1). El precio se multiplica por años. |
| max_price | number | Tope en USD para el cargo total. Si el precio real lo supera, la solicitud falla con 400 PRICE_ABOVE_MAX y no se cobra nada: un cinturón de seguridad para agentes autónomos. Sin max_price, el tope es el precio que mostró la búsqueda: cuando solo un registrador más caro puede tomar el nombre, la compra falla igual. El `price` del error es el total que hay que aceptar, con `listed_price` y `renewal_price` al lado; confírmalos con el usuario antes de reintentar con ese max_price. |
| ref | string | Código de referencia (opcional): el referente gana una comisión |
Ejemplo
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}Obtenga información detallada sobre un dominio de su propiedad
Devuelve información completa sobre un dominio: estado, fecha de compra, vencimiento, método de pago, bloqueo de seguridad, privacidad de WHOIS, estado de renovación automática y fechas de registro. El objeto registrar puede ser null si los datos extendidos no están disponibles.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| status | string | |
| auto_renew | boolean | Si la renovación automática está habilitada |
| purchased_at | string (date-time) | |
| expires_at | string (date-time) | |
| days_until_expiry | integer | Días hasta el vencimiento del dominio |
| renewal_price | number | null | Lo que cuesta un año de renovación en USD en el registrador que tiene el dominio; renovar N años cuesta N veces esto. Null cuando domani no puede renovar el dominio o su precio es desconocido. |
| payment_method | string | Cómo se pagó el dominio |
| payment_tx | string | null | Hash de transmisión en cadena (pagos en USDC) |
| registrant | string | Quién figura en el registro como titular del dominio. `customer`: tus propios datos de contacto (de set_contact). `domani`: el contacto predeterminado de Domani, que mantiene el dominio en tu nombre hasta que añadas los tuyos con set_contact, lo que te convierte en el titular. `unknown`: aún no comprobado. La privacidad WHOIS oculta los datos en ambos casos. |
| transfer_out | object | Traslado del dominio a otro registrador. `mode` `api`: get_auth_code devuelve el código. `manual`: el registrador no tiene API para ello, así que el equipo de Domani lo obtiene manualmente en 1 día hábil. null: no disponible para este dominio. |
| registrar_status | string | Si los datos del registrador en vivo se actualizaron o se administraron externamente |
| registrar_checked_at | string (date-time) | Cuando se intentó la actualización del registrador |
| registrar | object | null | Detalles de registro de dominio (nulo si no está disponible) |
Ejemplo de respuesta
{
"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"
}
}Ejemplo
curl https://domani.run/api/domains/mysite.com \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/settingsActualizar la configuración del dominio
Actualice la configuración de un dominio de su propiedad. Admite auto_renew, whois_privacy y security_lock. Se debe proporcionar al menos un campo.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| auto_renew | boolean | Si se debe habilitar la renovación automática para este dominio |
| whois_privacy | boolean | Si se debe habilitar la protección de privacidad de WHOIS |
| security_lock | boolean | Si bloquear el dominio contra transferencias |
Respuesta 200
| domain | string | |
| auto_renew | boolean | |
| whois_privacy | boolean | |
| security_lock | boolean | |
| hint | string |
Ejemplo
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}/parkingActualizar la configuración de parking
Actualice la configuración de parking y listado para un dominio de su propiedad. Habilite/deshabilite la página de parking y establezca un precio de publicación de 'En venta'. Cuando el parking está habilitado, los visitantes del dominio ven una página de marca. Cuando se establece un precio de cotización, los visitantes ven una página "En venta" con un formulario de contacto.
Parámetros
| domain* | string | Nombre de dominio |
Cuerpo de la solicitud
| enabled | boolean | Ya sea para habilitar la página de parking |
| listing_price | number | null | Precio de venta en USD o nulo para eliminar el listado |
Respuesta 200
| domain | string | |
| parking_enabled | boolean | |
| listing_price | number | null | |
| hint | string |
/api/domains/{domain}/redirectReenviar un dominio a una URL
Reenvía un dominio de tu propiedad a otra URL (por ejemplo, brand.com -> https://brand.dev): útil para marcas con varios TLD. El dominio debe apuntar a los servidores de nombres/IP de parking de domani para que se realice la redirección. Permanente (308) por defecto o temporal (307). Requiere alcance domains:write.
Parámetros
| domain* | string | Nombre de dominio |
Cuerpo de la solicitud
| url* | string | URL de destino (o dominio simple) al que reenviar, p. https://marca.dev |
| permanent | boolean | verdadero = permanente (308, predeterminado), falso = temporal (307) |
Respuesta 200
| domain | string | |
| redirect_url | string | null | |
| permanent | boolean |
/api/domains/{domain}/redirectDejar de reenviar un dominio
Elimina la redirección de un dominio para que vuelva a la página de parking. Requiere alcance domains:write.
Parámetros
| domain* | string | Nombre de dominio |
Respuesta 200
| domain | string | |
| redirect_url | string | null |
/api/domains/{domain}/for-salePoner un dominio en venta
Incluya un dominio de su propiedad a la venta en el mercado de Domani. Los compradores pueden comprarlo directamente a través de la API. El dominio debe estar activo y no estar incluido en la anuncio. Tarifas: Domani cobra una comisión de plataforma (predeterminada, 10%) sobre las ventas exitosas. El vendedor recibe el precio indicado menos la comisión. El comprador paga el precio total indicado. Requiere alcance domains:write.
Parámetros
| domain* | string | Nombre de dominio para poner a la venta |
Cuerpo de la solicitud
| price* | number | Precio de venta en USD |
| description | string | Descripción de listado opcional |
Respuesta 200
| listing | object | |
| hint | string |
Ejemplo de respuesta
{
"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-saleActualizar una anuncio de dominio
Actualice el precio y/o la descripción de un listado activo del mercado. Se debe proporcionar al menos un campo. Requiere alcance domains:write.
Parámetros
| domain* | string | Nombre de dominio con listado activo |
Cuerpo de la solicitud
| price | number | Nuevo precio de venta en USD |
| description | string | null | Nueva descripción (nula para borrar) |
Respuesta 200
| listing | object | |
| hint | string |
Ejemplo de respuesta
{
"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 un listado de dominio
Elimine una anuncio activa de venta de un dominio de su propiedad. El dominio permanece en su cuenta pero ya no está disponible para su compra en el mercado. Requiere alcance domains:write.
Parámetros
| domain* | string | Nombre de dominio para eliminar de la lista |
Respuesta 200
| domain | string | |
| status | string | |
| hint | string |
Ejemplo de respuesta
{
"domain": "example.com",
"status": "cancelled",
"hint": "Listing for example.com has been cancelled."
}/api/domains/{domain}/analyticsObtenga análisis de parking
Obtenga análisis de visitantes para un dominio en parking: visitas a la página, consultas, tasa de conversión, desglose diario de 30 días y consultas recientes.
Parámetros
| domain* | string | Nombre de dominio |
Respuesta 200
| domain | string | |
| views_7d | integer | Vistas totales de la página en los últimos 7 días |
| views_30d | integer | Total de visitas a la página en los últimos 30 días |
| inquiries_30d | integer | Total de consultas en los últimos 30 días |
| conversion_rate | number | Relación entre consultas y vistas como porcentaje |
| daily_views | object[] | Recuentos de vistas diarias de los últimos 30 días |
| recent_inquiries | object[] | 5 consultas más recientes |
| hint | string |
Ejemplo de respuesta
{
"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-codeObtener código de autenticación EPP
Obtén el código EPP/auth necesario para transferir un dominio a otro registrador. Desbloquea automáticamente el dominio si está bloqueado. Quien tenga el código de autorización puede llevarse el dominio, y su correo con él: leerlo requiere el alcance email:auth_secrets y un token no limitado a buzones (si no, 403 INSUFFICIENT_SCOPE o 403 MAILBOX_CONFINED), y cada lectura queda registrada en el registro de auditoría. Algunos registradores no tienen API para el código: la primera llamada responde entonces 202 con status: "requested" mientras el equipo de Domani desbloquea el dominio y obtiene el código manualmente (en 1 día hábil, expected_by); el usuario recibe un correo cuando está listo, y una llamada posterior responde 200 con status: "ready" y el código. En los 60 días siguientes a un registro o una transferencia entrante, ese dominio responde 409 TRANSFER_LOCKED con available_at.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| status | string | `ready`: el código está en auth_code. `requested`: el equipo de Domani lo está obteniendo del registrador; el usuario recibe un correo cuando está listo. |
| auth_code | string | null | Código de autorización EPP para dar al nuevo registrador. null mientras el estado es requested. |
| was_unlocked | boolean | Si el dominio se desbloqueó para permitir la transferencia |
| requested_at | string (date-time) | Cuándo se solicitó el código (registradores sin API para ello) |
| expected_by | string (date-time) | Cuándo tendrá el equipo de Domani el código como muy tarde (estado requested) |
| hint | string | |
| next_steps | string[] |
/api/domains/{domain}/transfer-awayObtener el estado de la transferencia saliente
Consulta el estado de una transferencia de dominio saliente. Úsalo después de obtener un código de autorización e iniciar la transferencia en el nuevo registrador. No disponible para un dominio cuyo transfer_out.mode es manual.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| status | string | |
| gaining_registrar | string | |
| request_date | string (date-time) | |
| hint | string |
/api/domains/{domain}/transfer-statusVerificar el estado de la transferencia entrante
Verifique el estado de una transferencia de dominio entrante. Devuelve un estado detallado con sugerencias prácticas. Úselo después de iniciar una transferencia con POST /api/domains/transfer.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| status | string | |
| timestamp | string | Marca de tiempo de la última actualización de estado |
| hint | string | Orientación práctica basada en el estado actual |
| continuity | object | Delegación capturada y verificación post-transferencia para traslados seguros. |
/api/domains/importImportar un dominio externo
Importe un dominio que posea en otro registrador (GoDaddy, Namecheap, Cloudflare, etc.) para administrarlo a través de domani.run. Gratis, no se necesita transferencia. Devuelve un registro TXT para la verificación de propiedad basada en DNS.
Cuerpo de la solicitud
| domain* | string | Dominio para importar |
Respuesta 200
| domain | string | |
| status | string | |
| token | string | |
| txt_record | object | |
| hint | string |
/api/domains/import/verifyVerificar y completar la importación del dominio
Verifique el registro DNS TXT y complete la importación del dominio. Llame después de agregar el registro TXT devuelto por POST /api/domains/import. Utiliza Cloudflare DNS-over-HTTPS para comprobar la propagación.
Cuerpo de la solicitud
| domain* | string | Dominio a verificar |
Respuesta 201
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| registrar | string | |
| payment_method | string | |
| hint | string |
/api/domains/adoption-planPlanificar cómo adoptar un dominio existente
Inspección de solo lectura de un dominio existente antes de conectarlo o transferirlo. Devuelve el registrador actual, los servidores de nombres autorizados, el proveedor de DNS, el estado de DNSSEC, el estado de la cuenta, el precio de transferencia, las invariantes de seguridad y las próximas acciones exactas de la API. Llame a esto antes de solicitar un código EPP. La conexión deja el registrador y el DNS sin cambios. La transferencia preserva los servidores de nombres y no migra DNS.
Parámetros
| domain* | string | Dominio existente para inspeccionar, p.e. misitio.com |
Respuesta 200
| version | integer | |
| domain | string | |
| registered | boolean | |
| account_state | string | |
| recommended_action | string | |
| current | object | |
| options | object | |
| invariants | string[] | |
| warnings | string[] |
/api/domains/transfer-checkVerificar previamente la elegibilidad para la transferencia
Verifique si un dominio es elegible para transferencia antes de iniciar. Devuelve el precio de transferencia, el estado de elegibilidad y cualquier bloqueador (TLD no compatible, período de espera de ICANN, dominio bloqueado). Llame a esto antes de POST /api/domains/transfer.
Parámetros
| domain* | string | Dominio a comprobar, p.e. misitio.com |
Respuesta 200
| domain | string | |
| tld | string | |
| eligible | boolean | |
| price | number | null | Precio de transferencia en USD (nulo si TLD no es compatible) |
| currency | string | |
| renewal_price | number | Solo si es elegible: lo que cuesta cada año después de la transferencia, en USD, en el registrador al que se traslada. Ausente cuando se desconoce. |
| reason | string | Razón legible por humanos si no es elegible |
| code | string | |
| eligible_at | string (date) | Fecha ISO en la que el dominio se vuelve elegible (período de espera de ICANN) |
| hint | string |
/api/domains/transfer-watchVer un dominio para determinar la elegibilidad de transferencia
Supervise un dominio y reciba una notificación (correo electrónico + webhook transfer.eligible) cuando pueda transferirse. Utiliza RDAP para comprobar los códigos de estado EPP y los periodos de bloqueo de 60 días de ICANN. Si ya cumple los requisitos, responde de inmediato sin crear una supervisión.
Cuerpo de la solicitud
| domain* | string | Dominio a vigilar, p. misitio.com |
Respuesta 200
| domain | string | |
| eligible | boolean | Si el dominio es actualmente elegible para transferencia |
| eligible_at | string (date) | Fecha ISO en la que el dominio se vuelve elegible (si aún no es elegible) |
| hint | string | Orientación práctica |
| watching | boolean | Si se ha configurado una notificación |
/api/domains/transferTransferir dominio de otro proveedor
Inicie una transferencia de dominio después de planDomainAdoption y la confirmación explícita del precio. Requiere la autorización/código EPP del proveedor actual. Los servidores de nombres autorizados existentes se conservan y verifican. La migración de DNS nunca es implícita. La transferencia suele tardar entre 1 y 5 días en completarse. El pago se cobra por adelantado mediante tarjeta o USDC.
Cuerpo de la solicitud
| domain* | string | Dominio a transferir, p.e. misitio.com |
| auth_code* | string | Código de autorización/EPP del proveedor actual |
| payment_method | string(card | usdc | balance) | Método de pago: 'card' (predeterminado), 'usdc' o 'balance' (crédito del mercado). |
| payment_tx | string | Hash de transacción de un pago en USDC ya enviado en cadena. |
| payment_chain | string(base | ethereum) | Cadena en la que se envió el pago en USDC. |
| extra_subdomains | string[] | Subdominios adicionales para incluir en la instantánea de DNS previa a la transferencia. Descubrimos subdominios automáticamente a través de registros CT, SPF, inferencia MX/DKIM y una lista de palabras común; use esto para cualquier subdominio personalizado que podamos pasar por alto. |
| max_price | number | Tope en USD para el cargo de la transferencia. Si el precio real lo supera, la solicitud falla con 400 PRICE_ABOVE_MAX y no se cobra nada. Sin max_price, el tope es el precio de transferencia mostrado: cuando solo un registrador más caro puede tomarla, la transferencia falla igual. El `price` del error es el total que hay que aceptar; confírmalo con el usuario antes de reintentar con ese max_price. |
Respuesta 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 | Resumen de la copia de seguridad de recuperación capturado antes de la transferencia. No se aplica a menos que se necesite una operación de recuperación explícita. |
| nameservers_preserved | boolean | |
| dns_migration | string | |
| continuity | object |
Ejemplo
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 un dominio
Renueva un dominio de tu propiedad por años adicionales (1-10). El pago se cobra por adelantado. La nueva fecha de vencimiento se devuelve en la respuesta. Cuando el registrador del dominio rechaza la renovación (renovado en los últimos 30 días, o un plazo que no vende), la solicitud falla con 400 RENEWAL_NOT_ELIGIBLE antes de cualquier cargo. El precio es renewal_price de GET /api/domains/{domain} multiplicado por years: envía ese total como max_price para que un cambio de precio falle antes de cualquier cargo.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| years | integer | Número de años para renovar (predeterminado 1) |
| payment_method | string(card | usdc | balance) | Método de pago: 'card' (predeterminado), 'usdc' o 'balance' (crédito del mercado). |
| payment_tx | string | Hash de transacción de un pago en USDC ya enviado en cadena. |
| payment_chain | string(base | ethereum) | Cadena en la que se envió el pago en USDC. |
| max_price | number | Tope en USD para el cargo de renovación. Si el precio real lo supera, la solicitud falla con 400 PRICE_ABOVE_MAX y no se cobra nada. El campo `price` del error es el total a aceptar; confírmalo con el usuario antes de reintentar con ese max_price. |
Respuesta 200
| domain | string | |
| renewed_years | integer | |
| new_expiry | string (date-time) | |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string |
Ejemplo
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-aftermarketComprar un dominio de mercado secundario
Compre un dominio ya registrado que esté a la venta en un mercado secundario (Afternic / Sedo) a su precio de compra ahora, a través de Domani. El precio de cotización se vuelve a verificar en vivo antes de cobrar; pase max_price para limitar lo que pagará. Los listados de solo oferta no se pueden comprar aquí; en su lugar, utilice el corredor (POST /api/broker) para negociar un precio. El pago funciona como un registro: tarjeta, USDC on Base (x402) o saldo del mercado. Requiere el alcance domains:transfer. Si tiene éxito, el dominio llega a su cuenta (status: active o provisioning mientras finaliza una transferencia por etapas).
Parámetros
| domain* | string | El dominio que figura en el mercado secundario para comprar |
Cuerpo de la solicitud
| max_price | number | Precio máximo estricto en USD. El valor predeterminado es el precio de compra inmediata del anuncio; la compra se rechaza si el precio en vivo excede este. |
| payment_method | string(card | usdc | balance) | Método de pago: 'card' (predeterminado), 'usdc' o 'balance' (crédito del mercado). |
| payment_tx | string | Hash de transacción de un pago en USDC ya enviado en cadena. |
| payment_chain | string(base | ethereum) | Cadena en la que se envió el pago en USDC. |
Respuesta 201
| domain | string | |
| status | string | 'active' cuando se completa la compra, o 'provisioning' mientras finaliza una transferencia por etapas. |
| price | number | |
| currency | string | |
| payment_method | string | |
| payment_tx | string | |
| marketplace | string | mercado secundario en el que se compró el dominio (por ejemplo, 'Afternic', 'Sedo'). |
| hint | string | |
| next_steps | string[] |
Ejemplo
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}/dnsObtenga registros DNS para un dominio de su propiedad
Devuelve todos los registros DNS configurados para un dominio de su propiedad (A, AAAA, CNAME, MX, TXT, NS, ...), cada uno con un id estable, más un token zone_version (también enviado como encabezado ETag). Vuelva a pasar zone_version en PUT para detectar cambios de zona simultáneos.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| records | DnsRecord[] | |
| zone_version | string | Token de concurrencia optimista para toda la zona. Vuelva a pasarlo en PUT (body zone_version o encabezado If-Match) para que falle con 409 DNS_VERSION_CONFLICT en lugar de bloquear un cambio simultáneo. |
Ejemplo de respuesta
{
"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"
}Ejemplo
curl https://domani.run/api/domains/mysite.com/dns \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dnsEstablecer registros DNS para un dominio de su propiedad
Actualiza los registros DNS en el nivel de inicio: para cada (tipo, nombre) presente en la carga útil, los registros existentes en ese (tipo, nombre) se reemplazan por los que usted envía; Los conjuntos de datos NO mencionados en la carga útil se conservan y los registros NS nunca se tocan. Se realiza una copia de seguridad automática de la zona en el lado del servidor antes de cada escritura. Concurrencia: pase la zone_version de un GET anterior (campo de cuerpo o encabezado If-Match). Si la zona cambió desde entonces, la escritura falla con 409 DNS_VERSION_CONFLICT y devuelve los registros actuales + la versión para que pueda volver a fusionarlos y volver a intentarlo. Enrutamiento del correo: un cambio en el destino al que se entrega el correo del dominio (sus registros MX o NS, los registros de dirección a través de los que se resuelve un host MX dentro de la zona, o los de un host que recibe correo de Domani y no publica ningún MX) requiere el alcance email:auth_secrets, ya que quien recibe el correo recibe sus códigos de inicio de sesión. Sin él, la solicitud responde 403 INSUFFICIENT_SCOPE antes de que cambie nada, y un token confinado a buzones responde 403 MAILBOX_CONFINED incluso con él. Los demás registros solo requieren domains:write. Cada cambio de enrutamiento queda anotado en el registro de auditoría.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| records* | DnsRecord[] | |
| zone_version | string | El zone_version de un GET anterior. Si no coincide, la escritura se rechaza con 409 DNS_VERSION_CONFLICT (no se escribe nada). Se recomienda siempre que otro actor pueda editar la misma zona. |
Respuesta 200
| success | boolean | |
| domain | string | |
| records | DnsRecord[] |
Ejemplo de respuesta
{
"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
}
]
}Ejemplo
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}/dnssecEnumere los registros DNSSEC DS de un dominio de su propiedad
Devuelve los registros del firmante de delegación (DS) de DNSSEC publicados en el registro para un dominio de su propiedad y si DNSSEC está habilitado. Se empareja con registros TLSA (establecidos a través del punto final DNS) para DANE.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| enabled | boolean | Verdadero cuando se publica al menos un registro DS |
| records | DsRecord[] |
Ejemplo de respuesta
{
"domain": "mysite.com",
"enabled": true,
"records": [
{
"keyTag": "12345",
"algorithm": "13",
"digestType": "2",
"digest": "A1B2C3..."
}
]
}Ejemplo
curl https://domani.run/api/domains/mysite.com/dnssec \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dnssecPublicar un registro DNSSEC DS (habilitar DNSSEC)
Publica un registro de firmante de delegación (DS) en el registro, lo que habilita DNSSEC para el dominio. Obtenga los valores DS de su proveedor de DNS/zona después de firmar la zona.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| success | boolean | |
| domain | string | |
| enabled | boolean | |
| records | DsRecord[] |
Ejemplo
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}/dnssecEliminar un registro DNSSEC DS (deshabilitar DNSSEC)
Elimina un registro de firmante de delegación (DS) en el registro por su etiqueta de clave. La eliminación de todos los registros DS deshabilita DNSSEC para el dominio.
Parámetros
| domain* | string | Nombre de dominio que posee |
| keyTag* | string | Etiqueta clave del registro DS para eliminar |
Respuesta 200
| success | boolean | |
| domain | string | |
| enabled | boolean | |
| records | DsRecord[] |
Ejemplo
curl -X DELETE "https://domani.run/api/domains/mysite.com/dnssec?keyTag=12345" \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dns/snapshotCapturar una instantánea de DNS
Captura todos los registros DNS de un dominio mediante búsquedas de DNS públicas (Cloudflare DoH). Descubre subdominios a partir de registros de transparencia de certificados, registros SPF y nombres comunes. La instantánea también se almacena en el servidor como copia de seguridad.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| extra_subdomains | string[] | Subdominios adicionales para incluir en la instantánea |
Respuesta 200
| domain | string | |
| records | DnsRecord[] | |
| subdomains | string[] | |
| sources | string[] | |
| capturedAt | string (date-time) |
Ejemplo de respuesta
{
"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"
}Ejemplo
curl -X POST https://domani.run/api/domains/mysite.com/dns/snapshot \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dns/restoreRestaurar DNS desde una instantánea
Aplica registros DNS de una instantánea al registrador actual del dominio. Utiliza un algoritmo de diferenciación para evitar duplicar registros que ya existen. Si no se proporciona ninguna instantánea en el cuerpo, se restaura desde la copia de seguridad del lado del servidor (creada mediante instantánea o transferencia). Enrutamiento del correo: un cambio en el destino al que se entrega el correo del dominio (sus registros MX o NS, los registros de dirección a través de los que se resuelve un host MX dentro de la zona, o los de un host que recibe correo de Domani y no publica ningún MX) requiere el alcance email:auth_secrets, ya que quien recibe el correo recibe sus códigos de inicio de sesión. Sin él, la solicitud responde 403 INSUFFICIENT_SCOPE antes de que cambie nada, y un token confinado a buzones responde 403 MAILBOX_CONFINED incluso con él. Los demás registros solo requieren domains:write. Cada cambio de enrutamiento queda anotado en el registro de auditoría.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| snapshot | object | Un objeto de instantánea DNS (según lo devuelto por el punto final de la instantánea). Si se omite, se utiliza la copia de seguridad almacenada en el servidor. |
| dry_run | boolean | Solo vista previa: devuelve lo que la restauración crearía (would_apply) y omitiría, sin escribir nada. |
Respuesta 200
| domain | string | |
| applied | integer | Número de registros creados |
| skipped | integer | Número de registros ya presentes |
| recordCount | integer | Registros totales en la instantánea |
| errors | string[] | |
| dry_run | boolean | Cierto cuando esto era una vista previa: no se escribió nada. |
| would_apply | DnsRecord[] | Solo ejecución en seco: los registros que crearía la restauración |
Ejemplo de respuesta
{
"domain": "mysite.com",
"applied": 5,
"skipped": 2,
"recordCount": 7,
"errors": []
}Ejemplo
curl -X POST https://domani.run/api/domains/mysite.com/dns/restore \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/dns/cloneClonar el DNS de otro dominio en este
Copia la configuración de DNS de un dominio de origen de su propiedad en este dominio; útil para marcas de múltiples TLD (brand.com → brand.dev) que comparten el mismo A/CNAME/MX. Fusiona de forma predeterminada (los registros de origen ganan en cualquier colisión de tipo+nombre, los demás registros de este dominio se conservan); establezca replace: true para un espejo exacto. Enrutamiento del correo: un cambio en el destino al que se entrega el correo del dominio (sus registros MX o NS, los registros de dirección a través de los que se resuelve un host MX dentro de la zona, o los de un host que recibe correo de Domani y no publica ningún MX) requiere el alcance email:auth_secrets, ya que quien recibe el correo recibe sus códigos de inicio de sesión. Sin él, la solicitud responde 403 INSUFFICIENT_SCOPE antes de que cambie nada, y un token confinado a buzones responde 403 MAILBOX_CONFINED incluso con él. Los demás registros solo requieren domains:write. Cada cambio de enrutamiento queda anotado en el registro de auditoría.
Parámetros
| domain* | string | Dominio de destino (DNS está escrito aquí) |
Cuerpo de la solicitud
| from* | string | Dominio de origen del que copiar DNS (debe ser tuyo) |
| replace | boolean | Espejo exacto: elimine los registros de destino que la fuente no tiene. Predeterminado: fusionar |
Respuesta 200
| success | boolean | |
| from_domain | string | |
| to_domain | string | |
| records | DnsRecord[] |
Ejemplo
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}/nameserversObtener servidores de nombres para un dominio
Devuelve los servidores de nombres autorizados configurados para un dominio de su propiedad. Si está vacío, las operaciones de DNS (parking, correo electrónico, conexión) fallarán hasta que se asignen servidores de nombres.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| nameservers | string[] | |
| default_nameservers | string[] | Los servidores de nombres desde los que se sirve la zona del dominio: el alojamiento de zona cuando Domani aloja la zona allí; de lo contrario, los predeterminados del registrador (null si se desconocen) |
| dns_provider | string | Quién responde por la zona del dominio: el DNS propio del registrador, una zona que Domani aloja en Cloudflare o un proveedor externo para un dominio importado |
| hint | string |
Ejemplo de respuesta
{
"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."
}Ejemplo
curl https://domani.run/api/domains/mysite.com/nameservers \ -H "Authorization: Bearer domani_sk_xxx"
/api/domains/{domain}/nameserversConfigurar servidores de nombres para un dominio
Reemplace los servidores de nombres de un dominio de su propiedad. Requiere entre 2 y 13 nombres de host válidos. Valores comunes: OpenSRS DNS (ns1.systemdns.com, ns2.systemdns.com, ns3.systemdns.com). Los servidores de nombres deciden adónde va todo el correo del dominio, incluidos los códigos de inicio de sesión: cambiarlos requiere el alcance email:auth_secrets y un token no confinado a buzones (de lo contrario, 403 INSUFFICIENT_SCOPE o 403 MAILBOX_CONFINED), y cada cambio queda anotado en el registro de auditoría.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| nameservers* | string[] | Nombres de host del servidor de nombres (se requieren entre 2 y 13) |
Respuesta 200
| success | boolean | |
| domain | string | |
| nameservers | string[] | |
| hint | string |
Ejemplo de respuesta
{
"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."
}Ejemplo
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}/connectConectar un dominio a un proveedor de hosting o correo electrónico
Conecta un dominio a un proveedor de alojamiento o correo electrónico detectando automáticamente el proveedor desde una URL de destino o aceptando un nombre de proveedor explícito. Para los dominios administrados a través de la plataforma, los registros DNS se configuran automáticamente (estado: dns_set). Para dominios importados (registrador externo), devuelve los registros como instrucciones para agregarlos manualmente en su registrador (estado: manual_setup_required, los registros tienen estado pending). Proveedores de alojamiento compatibles: vercel, netlify, cloudflare-pages, github-pages, railway, fly. Proveedores de correo electrónico compatibles: google-workspace, fastmail, proton. Utilice GET /api/domains/{domain}/connect para enumerar todos los proveedores y métodos disponibles. Enrutamiento del correo: un cambio en el destino al que se entrega el correo del dominio (sus registros MX o NS, los registros de dirección a través de los que se resuelve un host MX dentro de la zona, o los de un host que recibe correo de Domani y no publica ningún MX) requiere el alcance email:auth_secrets, ya que quien recibe el correo recibe sus códigos de inicio de sesión. Sin él, la solicitud responde 403 INSUFFICIENT_SCOPE antes de que cambie nada, y un token confinado a buzones responde 403 MAILBOX_CONFINED incluso con él. Los demás registros solo requieren domains:write. Cada cambio de enrutamiento queda anotado en el registro de auditoría.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| target | string | URL de destino para la detección automática (por ejemplo, my-app.vercel.app) |
| provider | string | Nombre explícito del proveedor (por ejemplo, vercel, google-workspace) |
| method | string | Método de conexión si el proveedor tiene varios (por ejemplo, solo cname) |
| dry_run | boolean | Solo vista previa: devuelve las diferencias (create/replace/already_set/keep) sin escribir nada. |
| confirm_replace_mx | boolean | Se requiere cuando la conexión reemplaza los registros MX existentes que apuntan a otro proveedor (409 MX_REPLACEMENT_REQUIRES_CONFIRMATION en caso contrario): redirige el correo electrónico del dominio. |
Respuesta 200
| domain | string | |
| provider | string | |
| category | string | |
| method | string | |
| records | DnsRecord[] | |
| docs | string (uri) | |
| status | string | dns_set = registros escritos automáticamente. manual_setup_required = dominio importado, agregue registros en su registrador. dry_run = solo vista previa, nada escrito. |
| hint | string | |
| next_steps | string[] | Acciones específicas del proveedor que se deben completar después de configurar los registros DNS |
| diff | object | Solo simulación: indica qué haría la escritura: create, replace (registros existentes que se eliminarían), already_set y keep (rrsets intactos). |
Ejemplo
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 proveedores disponibles para conectar un dominio
Devuelve todos los proveedores de correo electrónico y hosting compatibles con sus métodos de conexión. Utilice esto para descubrir qué proveedores están disponibles antes de llamar a POST.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| providers | object |
/api/domains/{domain}/verifyVerificar que la conexión de un proveedor esté funcionando
Ejecuta la verificación de verificación del proveedor para confirmar que los registros DNS se han propagado y la conexión está activa. Úselo después de POST /api/domains/{domain}/connect para verificar.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| target | string | Objetivo para la detección automática |
| provider | string | Nombre del proveedor |
| method | string | Nombre del método |
Respuesta 200
| domain | string | |
| provider | string | |
| method | string | |
| verified | boolean | |
| message | string | |
| hint | string | |
| next_steps | string[] | Pasos de solución de problemas específicos del proveedor (solo cuando se verifica que es falso) |
Ejemplo
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 el estado del dominio: DNS, SSL, correo electrónico, vencimiento
Comprueba el estado de un dominio a través de DNS sobre HTTPS: registros A/AAAA/CNAME/MX/TXT/NS, estado del certificado SSL, configuración de correo electrónico y fecha de vencimiento. Admite transmisión SSE a través de Accept: text/event-stream: al cerrar la conexión se cancelan las comprobaciones DNS/SSL en curso en el lado del servidor. Úselo después de conectarse para verificar la propagación de DNS.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| status | string | |
| expires | string (date-time) | |
| days_until_expiry | integer | |
| dns | object | |
| ssl | object | |
| object |
Ejemplo de respuesta
{
"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": []
}
}Ejemplo
curl https://domani.run/api/domains/mysite.com/status \ -H "Authorization: Bearer domani_sk_xxx"
Verificar servicio
/api/domains/{domain}/verify-serviceAgregue registros DNS para verificar la propiedad del dominio para un servicio de terceros
Agrega los registros DNS correctos (TXT, CNAME) para demostrar la propiedad del dominio a un servicio de terceros. Admite Stripe, Google Search Console, AWS SES, Postmark, Resend, Facebook, HubSpot y Microsoft 365. Los nombres de servicios desconocidos recurren a un registro TXT genérico. Los registros se fusionan con el DNS existente; los registros existentes se conservan. Enrutamiento del correo: un cambio en el destino al que se entrega el correo del dominio (sus registros MX o NS, los registros de dirección a través de los que se resuelve un host MX dentro de la zona, o los de un host que recibe correo de Domani y no publica ningún MX) requiere el alcance email:auth_secrets, ya que quien recibe el correo recibe sus códigos de inicio de sesión. Sin él, la solicitud responde 403 INSUFFICIENT_SCOPE antes de que cambie nada, y un token confinado a buzones responde 403 MAILBOX_CONFINED incluso con él. Los demás registros solo requieren domains:write. Cada cambio de enrutamiento queda anotado en el registro de auditoría.
Parámetros
| domain* | string | Nombre de dominio que posee |
Cuerpo de la solicitud
| service* | string | Nombre del servicio (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365) |
| token* | string | Token de verificación proporcionado por el servicio |
Respuesta 200
| domain | string | |
| service | string | |
| service_display_name | string | |
| known_service | boolean | |
| records_added | DnsRecord[] | |
| total_records | integer | |
| docs | string (uri) | null | |
| hint | string |
Ejemplo de respuesta
{
"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."
}Ejemplo
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 los servicios compatibles para la verificación de dominio
Devuelve todos los servicios conocidos con sus nombres, descripciones y URL de documentación. Los servicios desconocidos recurren a un registro TXT genérico.
Parámetros
| domain* | string | Nombre de dominio que posee |
Respuesta 200
| domain | string | |
| services | object[] | |
| hint | string |
Descubrimiento
/api/domains/{domain}/profilePúblicoObtener un perfil de dominio público
Devuelve el expediente público más reciente, seguro para la privacidad y respaldado por evidencia, para un dominio. Este punto final nunca devuelve observaciones ocultas ni detalles de contacto de registro sin procesar.
Parámetros
| domain* | string |
Respuesta 200
| profile | PublicDomainProfile |
/api/domains/{domain}/profilePúblicoInvestigar o actualizar un perfil de dominio público
Ejecuta un análisis limitado utilizando registros públicos, DNS, sitios en vivo, datos estructurados y fuentes de archivos, luego almacena el perfil de privacidad segura para la página pública canónica. La profundidad instantánea se utiliza para un primer renderizado rápido; profundo es el valor predeterminado y agrega investigación histórica.
Parámetros
| domain* | string | |
| depth | string(instant | deep) | Profundidad de la investigación. El valor predeterminado es profundo. |
Respuesta 201
| profile | PublicDomainProfile |
/api/domains/whoisPúblicoBuscar datos de registro de dominio a través de RDAP
Consulta la red RDAP (Protocolo de acceso a datos de registro) para obtener datos de registro de dominio. Devuelve registrador, fechas de creación/vencimiento/actualización, días hasta el vencimiento, códigos de estado, servidores de nombres, estado de DNSSEC e información de contacto (registrante, contacto administrativo, contacto técnico, contacto de facturación y contacto antiabuso). Funciona para cualquier dominio, no se requiere propiedad. RDAP es el reemplazo moderno y nativo de JSON para WHOIS. Vuelve a WHOIS (puerto 43) para TLD sin RDAP y complementa RDAP con datos de referencia de WHOIS cuando faltan contactos (común después del GDPR). La información de contacto puede estar parcial o totalmente oculta debido al RGPD o a los servicios de protección de la privacidad. Punto final público: no se requiere autenticación. Las solicitudes autenticadas obtienen límites de velocidad más altos (30/min frente a 10/min).
Parámetros
| q* | string | Dominio a buscar (por ejemplo, ejemplo.com) |
Respuesta 200
| domain | string | |
| registered | boolean | Si el dominio está actualmente registrado |
| registrar | string | null | Nombre del registrador actual |
| registrar_url | string | null | URL del sitio web del registrador |
| registrar_iana_id | string | null | ID de IANA del registrador (de RDAP publicIds) |
| created | string | null | Fecha de registro (YYYY-MM-DD) |
| expires | string | null | Fecha de vencimiento (YYYY-MM-DD) |
| updated | string | null | Fecha de última actualización (YYYY-MM-DD) |
| days_until_expiry | integer | null | Días hasta el vencimiento (nulo si no está registrado) |
| status | string[] | Códigos de estado del EPP |
| nameservers | string[] | Servidores de nombres autorizados |
| dnssec | boolean | Si DNSSEC está habilitado |
| redacted | boolean | Si los datos de WHOIS/RDAP están ocultos por razones de privacidad (GDPR) |
| contacts | object | Información de contacto por función (nula cuando no hay datos disponibles, los campos pueden ser nulos cuando están ocultos) |
Ejemplo
curl "https://domani.run/api/domains/whois?q=google.com"
/api/domains/{domain}/ogPúblicoObtener metadatos de vista previa del sitio web para un dominio
Devuelve metadatos de Open Graph (título, descripción, imagen, favicon) para un dominio. Los datos se obtienen de forma diferida y se almacenan en caché durante 7 días. La primera solicitud de un dominio puede tardar entre 1 y 5 segundos (búsqueda en vivo); las solicitudes posteriores son instantáneas (acierto de caché). Devuelve campos nulos si no se puede acceder al sitio o no tiene etiquetas OG. Punto final público: no se requiere autenticación.
Parámetros
| domain* | string | Dominio para recuperar metadatos (por ejemplo, google.com) |
Respuesta 200
| title | string | null | Título de la página (og:title > twitter:title > <título>) |
| description | string | null | Descripción de la página (og:description > meta descripción) |
| image | string | null | URL de la imagen OG (absoluta) |
| favicon | string | null | URL de favicon (absoluta) |
Ejemplo
curl "https://domani.run/api/domains/google.com/og"
Facturación
/api/billing/setupObtener una URL para agregar un método de pago
Siempre devuelve tanto una url de Stripe Checkout como un client_secret de SetupIntent para agregar una tarjeta de crédito. Un agente que no puede ejecutar Stripe.js debe abrir url en un navegador y decirle al usuario que agregue su tarjeta ahí; un frontend que integra Stripe Elements directamente (como el panel de Domani) usa client_secret en su lugar. Esto es necesario antes de comprar dominios con tarjeta. Después de que el usuario completa el pago, se le redirige de nuevo al panel.
Cuerpo de la solicitud
| mode | string(setup_intent | checkout) | Obsoleto: tanto `url` como `client_secret` siempre se devuelven sin importar este valor. Se mantiene por compatibilidad con versiones anteriores. |
Respuesta 200
| url | string (uri) | URL de Stripe Checkout: ábrela en un navegador para agregar una tarjeta |
| client_secret | string | Secreto de cliente de Stripe SetupIntent, para un frontend que usa Stripe.js directamente |
| hint | string | Guía de próximos pasos |
Ejemplo de respuesta
{
"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."
}Ejemplo
curl -X POST https://domani.run/api/billing/setup \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/cardEliminar método de pago guardado
Separa la tarjeta de crédito guardada del usuario de su cuenta. Después de la eliminación, se debe agregar una nueva tarjeta antes de comprar dominios.
Respuesta 200
| removed | boolean |
Ejemplo de respuesta
{
"removed": true
}Ejemplo
curl -X DELETE https://domani.run/api/billing/card \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/connectObtener el estado de pago del mercado
Devuelve el estado de incorporación de Stripe Connect del vendedor y el saldo disponible en el mercado. payouts_enabled es verdadero una vez que se completa la incorporación y el vendedor puede recibir pagos bancarios.
Respuesta 200
| onboarded | boolean | El vendedor ha enviado los detalles de incorporación de Connect |
| payouts_enabled | boolean | Los pagos bancarios están activos |
| details_submitted | boolean | |
| balance_cents | integer | Saldo disponible del mercado en centavos |
Ejemplo de respuesta
{
"onboarded": true,
"payouts_enabled": true,
"details_submitted": true,
"balance_cents": 45000
}Ejemplo
curl https://domani.run/api/billing/connect \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/connectIniciar la incorporación de pagos bancarios
Crea (o reanuda) la incorporación de Stripe Connect Express para un vendedor del mercado y devuelve una URL de incorporación alojada para redirigir al usuario. Requerido antes de que un vendedor pueda retirar ganancias a su banco.
Respuesta 200
| url | string (uri) | URL de incorporación alojada en Stripe |
Ejemplo de respuesta
{
"url": "https://connect.stripe.com/setup/e/acct_123/..."
}Ejemplo
curl -X POST https://domani.run/api/billing/connect \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/connect/payoutRetirar el saldo del mercado al banco
Transfiere todo el saldo disponible del mercado del vendedor a su cuenta bancaria conectada. Requiere la incorporación de pagos completada (POST /api/billing/connect). El saldo se reserva antes de la transferencia y se restablece si falla, por lo que en caso de falla nunca se pierden fondos.
Respuesta 200
| amount_cents | integer | Monto transferido en centavos |
| transfer_id | string | ID de transferencia de Stripe |
Ejemplo de respuesta
{
"amount_cents": 45000,
"transfer_id": "tr_123"
}Ejemplo
curl -X POST https://domani.run/api/billing/connect/payout \ -H "Authorization: Bearer domani_sk_xxx"
/api/billing/invoicesListar facturas de pago
Devuelve una lista de facturas pagadas con número de factura, monto, fecha y enlaces para ver o descargar el PDF. Las facturas se generan automáticamente por cada compra, renovación y transferencia de dominio.
Parámetros
| limit | integer | Máximo de facturas a devolver |
Respuesta 200
| invoices | object[] | |
| has_more | boolean | |
| hint | string |
Ejemplo
curl https://domani.run/api/billing/invoices \ -H "Authorization: Bearer domani_sk_xxx"
Referencias
/api/referralsObtenga ganancias e historial de referencias
Devuelve su código de referencia único, tasa de comisión (20%), desglose de ganancias (totales, pagadas, pendientes) y un historial de todas las compras recomendadas. Comparta su código de referencia con otras personas: cuando se registren con su código (a través del parámetro ref), usted ganará automáticamente una comisión por todas sus futuras compras de dominio.
Respuesta 200
| referral_code | string | Su código de referencia único para compartir |
| referral_rate | integer | Porcentaje de comisión (actualmente 20%) |
| total_earned_cents | integer | Ganancias totales en centavos |
| total_paid_cents | integer | Total pagado en centavos |
| total_pending_cents | integer | Pago pendiente en centavos |
| referrals | object[] |
Ejemplo de respuesta
{
"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"
}
]
}Ejemplo
curl https://domani.run/api/referrals \ -H "Authorization: Bearer domani_sk_xxx"
Reservas pendientes
/api/backordersRealizar un reserva en un dominio ya registrado
Supervisa un dominio registrado por otra persona e intenta registrarlo automáticamente para ti cuando queda disponible. La disponibilidad se comprueba cada pocos minutos para actuar rápidamente tras la liberación. Solo se te cobra si el registro se completa, sin pago inicial. Un límite te protege frente a una subida del precio de registro antes de la liberación. Requiere un método de pago guardado (tarjeta) o payment_method: "balance" para pagar el registro si se completa. Sin garantía de éxito: un servicio especializado puede registrar primero un dominio disputado.
Cuerpo de la solicitud
| domain* | string | Dominio actualmente registrado que se supervisará para intentar registrarlo cuando quede libre. |
| max_price | number | Importe máximo en USD que pagarás para registrarlo. El valor predeterminado es el precio de registro actual. Debe ser >= al precio actual. |
| payment_method | string(card | balance) | Método de pago que se usará si el registro se completa. El predeterminado es tu método preferido. |
Respuesta 201
| backorder | Backorder | |
| hint | string |
Ejemplo
curl -X POST https://domani.run/api/backorders \
-H "Authorization: Bearer domani_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"domain": "taken.com"}'/api/backordersEnumere sus reservas
Devuelve tus backorders, del más reciente al más antiguo. Filtra por status (watching, caught, failed, cancelled, expired).
Parámetros
| status | string(watching | caught | failed | cancelled | expired) | Filtrar por estado. |
Respuesta 200
| backorders | Backorder[] |
/api/backorders/{id}Obtener un reserva
Parámetros
| id* | string | ID de reserva. |
Respuesta 200
| backorder | Backorder |
/api/backorders/{id}Cancelar un reserva
Deja de mirar un dominio. Sólo se pueden cancelar los reservas en el estado watching.
Parámetros
| id* | string | ID de reserva. |
Respuesta 200
| id | string | |
| status | string | |
| hint | string |
Mercado
/api/domains/sellPoner un dominio a la venta (mercado abierto)
Incluya cualquier dominio a la venta en el mercado de Domani, incluidos dominios de otros registradores. Los dominios que ya están en su cuenta Domani se verifican automáticamente y se enumeran inmediatamente (estado active). Los dominios externos requieren verificación de propiedad de TXT (estado pending_verification). Tarifas: 10 % de comisión de plataforma por ventas exitosas. Requiere alcance deals:write.
Cuerpo de la solicitud
| domain* | string | Nombre de dominio para poner a la venta |
| price* | number | Precio de venta en USD |
| description | string | Descripción de listado opcional |
Respuesta 201
| listing | object | |
| txt_record | object | null | Registro TXT para agregar para verificación de propiedad (solo para dominios externos) |
| hint | string |
/api/domains/sell/verifyVerificar la propiedad de TXT para listado externo
Verifique que se haya agregado el registro de propiedad TXT para una anuncio de dominio externo. En caso de éxito, el estado del listado cambia de pending_verification a active y se vuelve comprable. Requiere alcance deals:write.
Cuerpo de la solicitud
| domain* | string | Nombre de dominio para verificar |
Respuesta 200
| listing | object | |
| hint | string |
/api/domains/sell/statusVerifique el listado y el estado de la transacciones
Verifique el estado de una anuncio de dominio y cualquier transacciones activa. Devuelve detalles de la anuncio, estado del proceso de negociación y sugerencias contextuales. Requiere alcance deals:read.
Parámetros
| domain* | string | Nombre de dominio para comprobar |
Respuesta 200
| listing | object | null | |
| deal | object | null | |
| hint | string |
/api/dealsLista tus transacciones
Enumere las transacciones del mercado en las que usted es el comprador o el vendedor. Filtrar por rol o estado. Requiere alcance deals:read.
Parámetros
| role | string(buyer | seller) | Filtrar por rol |
| status | string(active | escrow_held | epp_pending | transfer_started | completed | refunded | expired) | Filtrar por estado ('active' = todo no terminal) |
| domain | string | Filtrar por nombre de dominio |
| limit | integer | Número de transacciones a devolver (predeterminado 50, máximo 100) |
| cursor | string | Cursor de paginación de una respuesta anterior |
Respuesta 200
| deals | object[] | |
| has_more | boolean | Si hay más resultados disponibles |
| next_cursor | string | null | Cursor para la página siguiente |
/api/dealsComprar un dominio externo (crear transacción)
Cree una transacción de depósito en garantía para comprar un dominio que figura en el mercado. El pago del comprador se mantiene en depósito de garantía hasta que se complete la transferencia del dominio. Se notifica al vendedor y tiene 7 días para proporcionar el código de autenticación/EPP. Requiere alcance domains:transfer.
Cuerpo de la solicitud
| domain* | string | Nombre de dominio para comprar |
| payment_method | string(card | usdc | balance) | Método de pago: 'card' (predeterminado), 'usdc' o 'balance' (crédito del mercado). |
Respuesta 201
| deal | object | |
| hint | string | |
| next_steps | string[] |
/api/deals/{id}Obtenga detalles de la transacción con cronograma
Obtenga todos los detalles de una transacción, incluidos el desglose de precios, los plazos y la cronología de eventos. Tanto el comprador como el vendedor pueden acceder a sus transacciones. Requiere el alcance deals:read.
Parámetros
| id* | string | ID de transacciones |
Respuesta 200
| deal | object | |
| hint | string |
/api/deals/{id}Proporcionar EPP/código de autenticación (vendedor)
El vendedor proporciona el EPP/código de autorización para iniciar la transferencia del dominio. El código se cifra en reposo y se utiliza para iniciar la transferencia del registrador. Máximo 3 intentos. Requiere alcance deals:write.
Parámetros
| id* | string | ID de transacciones |
Cuerpo de la solicitud
| auth_code* | string | EPP/código de autorización del registrador actual |
Respuesta 200
| deal | object | |
| hint | string |
/api/deals/{id}/invoiceObtenga un recibo/estado de cuenta de la transacción
Devuelve una factura basada en roles para una transacciones de mercado. Los compradores obtienen un recibo de compra; los vendedores reciben un estado de cuenta que muestra la venta, la línea de comisión de la plataforma y el pago neto. Funciona para todos los métodos de pago (tarjeta/USDC/saldo). Requiere alcance deals:read.
Parámetros
| id* | string |
Respuesta 200
| invoice | DealInvoice |
/api/negotiationsEnumere sus negociaciones
Enumera las negociaciones de precios en las que usted es el comprador o el vendedor. Las contrapartes son anónimas (solo roles). Requiere alcance deals:read.
Parámetros
| role | string(buyer | seller) | Filtrar por tu rol |
| status | string | Filtrar por estado (open|agreed|completed|declined|expired|cancelled|all) |
Respuesta 200
| negotiations | Negotiation[] |
/api/negotiationsHacer una oferta en un anuncio
Abre una negociación de precios anónima en un dominio que cotiza activamente con una oferta inicial. El vendedor puede hacer una contraoferta, aceptar o rechazar. Tras la aceptación, el comprador finaliza el pago y se crea un trato al precio acordado. Requiere alcance deals:write.
Cuerpo de la solicitud
| domain* | string | El dominio listado para negociar |
| offer* | number | Oferta inicial en USD |
| message | string | Mensaje opcional al vendedor. |
Respuesta 201
| negotiation | Negotiation |
Ejemplo
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}Obtener un hilo de negociación
Devuelve una negociación con su hilo de oferta completo, anónimo (las ofertas están etiquetadas como "you" o "counterparty"). Requiere alcance deals:read.
Parámetros
| id* | string |
Respuesta 200
| negotiation | Negotiation |
/api/negotiations/{id}hacer una contraoferta, aceptar o rechazar
Responde a la oferta actual sobre la mesa cuando sea tu turno. counter requiere una nueva cantidad; accept bloquea el precio en la cantidad actualmente sobre la mesa; El decline pone fin a la negociación. Requiere alcance deals:write.
Parámetros
| id* | string |
Cuerpo de la solicitud
| action* | string(counter | accept | decline) | |
| counter | number | Nuevo monto en USD (obligatorio cuando acción=contador) |
| message | string |
Respuesta 200
| negotiation | Negotiation |
/api/negotiations/{id}Retirar una negociación
El comprador retira una negociación abierta o acordada. Requiere alcance deals:write.
Parámetros
| id* | string |
Respuesta 200
| cancelled | boolean |
/api/negotiations/{id}/finalizeFinalizar una negociación acordada (pago)
El comprador paga el precio acordado para crear la transacción de depósito en garantía y luego se ejecuta el flujo de transferencia estándar. Acepta los mismos métodos de pago que una compra en el mercado (tarjeta, USDC, x402). Devuelve 402 con instrucciones de pago si no se realiza ningún pago. Para una adquisición realizada por un corredor, si el precio acordado está por encima del max_budget que estableció, devuelve 409 BUDGET_EXCEEDED; vuelva a enviarlo con confirm_over_budget: true para continuar. Requiere alcance domains:transfer.
Parámetros
| id* | string |
Cuerpo de la solicitud
| payment_method | string(card | usdc | balance) | |
| payment_signature | string | null | |
| payment_tx | string | |
| payment_chain | string | |
| confirm_over_budget | boolean | Para transacciones con intermediario: continúa aunque el precio acordado supere el max_budget establecido. |
/api/brokerEnumere sus solicitudes de corredor
Enumera sus solicitudes de adquisición de dominio y su estado. Requiere alcance deals:read.
Parámetros
| status | string | Filtrar por estado o 'all' |
Respuesta 200
| requests | BrokerRequest[] |
/api/brokerSolicitar adquisición de un dominio ya registrado
Pídale a domani que adquiera un dominio no listado específico en su nombre. Los agentes buscan al propietario a través de RDAP, se comunican de forma anónima y negocian: solo por comisión, sin cargo inicial. El interés del propietario abre una negociación anónima. Nota: muchos propietarios son inalcanzables (WHOIS oculto según GDPR); la solicitud finaliza como no_contact. Requiere alcance deals:write.
Cuerpo de la solicitud
| domain* | string | El dominio ya registrado que deseas |
| max_budget | number | Tu techo en USD (opcional) |
Respuesta 201
| request | BrokerRequest |
Ejemplo
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}Obtenga una solicitud de corredor
Devuelve una de las solicitudes de su corredor. Requiere alcance deals:read.
Parámetros
| id* | string |
Respuesta 200
| request | BrokerRequest |
/api/broker/{id}Cancelar una solicitud de corredor
Cancela una solicitud de adquisición de dominio activa. Requiere alcance deals:write.
Parámetros
| id* | string |
Respuesta 200
| cancelled | boolean |
/api/broker/respondPúblicoLeer el estado de la consulta de un corredor (lado del propietario)
La ruta de lectura propietario-agente: sondea el estado actual y anónimo de una consulta con tu token antes de actuar. Devuelve el dominio, la oferta del comprador sobre la mesa, de quién es el movimiento y las acciones disponibles en ese momento. Nunca expone la identidad del comprador ni su presupuesto. Autorizado por token.
Parámetros
| token* | string | El token de divulgación de su correo electrónico de consulta. |
Respuesta 200
| domain | string | |
| status | string | |
| your_turn | boolean | Ya sea que sea la mudanza del propietario. |
| current_offer_usd | number | null | La oferta del comprador sobre la mesa. |
| agreed_price_usd | number | null | |
| actions | string[] | Acciones disponibles ahora (subconjunto de offer/counter/accept/decline/opt_out). |
Ejemplo
curl "https://domani.run/api/broker/respond?token=<from your inbox>"
/api/broker/respondPúblicoResponder a una consulta de corredor (lado del propietario)
La ruta propietario-agente: responda a la consulta de adquisición de un corredor utilizando el token del correo electrónico de divulgación enviado a su bandeja de entrada: la alternativa totalmente autónoma a responder por correo electrónico o hacer clic en el enlace de reclamo humano. offer/counter abrir o avanzar en una negociación anónima al precio solicitado; decline y opt_out finalizarlo. Autorizado por token (el token es la capacidad): no se requiere cuenta ni alcance.
Cuerpo de la solicitud
| token* | string | El token de divulgación de su correo electrónico de consulta (la respuesta es broker+<token>@). |
| action* | string(offer | counter | accept | decline | opt_out) | offer/counter para indicar un precio; accept para aceptar la oferta actual del comprador; decline para rechazarla; opt_out para no volver a recibir contacto. |
| price | number | Su precio de venta en USD (obligatorio para la oferta/contraventana). |
Respuesta 200
| handled | boolean | |
| outcome | string | Valores de estado: opted_out | declined | negotiation_opened | countered | ignored_not_your_turn | unclear |
| status | string | |
| negotiation_id | string | |
| domain | string |
Ejemplo
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 un cliente OAuth (RFC 7591)
Registro dinámico de clientes para clientes MCP compatibles con OAuth (conectores de Claude.ai, ChatGPT y Grok Bot). Registro abierto: por sí solo no otorga nada - cada autorización sigue pasando por la pantalla de consentimiento del usuario. Los clientes públicos (token_endpoint_auth_method=none) deben usar PKCE S256. Descubrimiento: /.well-known/oauth-authorization-server.
Cuerpo de la solicitud
| redirect_uris* | string[] | URI de redirección exactos (https, http en loopback o un esquema personalizado nativo) |
| client_name | string | Se muestra en la pantalla de consentimiento |
| token_endpoint_auth_method | string(none | client_secret_post | client_secret_basic) | |
| client_uri | string | |
| logo_uri | string |
Respuesta 201
| client_id | string | |
| client_name | string | |
| redirect_uris | string[] | |
| token_endpoint_auth_method | string | |
| grant_types | string[] | |
| response_types | string[] | |
| client_id_issued_at | integer | |
| client_secret | string | Solo para clientes confidenciales; se devuelve una sola vez |
/api/oauth/tokenPunto final de token OAuth
Intercambie un código de autorización (con el code_verifier de PKCE) por un token de acceso, o rote con grant_type=refresh_token. Los tokens de acceso son tokens de API de domani ordinarios que llevan los alcances aprobados y el confinamiento de buzón. Los códigos son de un solo uso; los tokens de actualización rotan en cada uso.
Respuesta 200
| access_token | string | |
| token_type | string | |
| expires_in | integer | |
| refresh_token | string | |
| scope | string |