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.

AlcanceOtorga acceso a
domains:readGET /api/domains, GET /api/domains/{domain}, GET /api/domains/{domain}/dns, /dnssec, /status, /email/check, /auth-code, /transfer-away, /transfer-status, /analytics
domains:writePUT /api/domains/{domain}/dns, POST/DELETE /api/domains/{domain}/dnssec, POST /connect, POST /verify, PUT /settings, PUT /parking, PUT/DELETE /api/domains/{domain}/for-sale, POST /api/domains/import, POST /import/verify
domains:transferPOST /api/domains/buy, POST /transfer, POST /renew (implica pago, incluye compras en el mercado)
tokens:readGET /api/tokens
tokens:writePOST /api/tokens, DELETE /api/tokens/{id}
webhooks:readGET /api/webhooks, GET /api/webhooks/{id}/deliveries
webhooks:writePOST /api/webhooks, PATCH /api/webhooks/{id}, DELETE /api/webhooks/{id}
email:readGET /api/emails, /api/emails/{address}, /api/emails/{address}/messages, /api/emails/{address}/aliases, /api/email/changes, /api/domains/{domain}/email/status, /api/domains/{domain}/email/deliverability, /api/suppressions, GET /api/contacts
email:writePOST /api/emails, POST /api/emails/{address}/send, POST /api/domains/{domain}/email/setup, aliases + catch-all, POST/DELETE /api/suppressions, POST/DELETE /api/contacts
email:deleteElimina 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_mailboxesCrea 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_secretsLeer 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:readGET /api/me, GET /api/agents/identity
account:writeDELETE /api/me, POST /api/billing/setup, POST /api/billing/subscribe, POST /api/billing/cancel, POST /api/me/resend-verification, POST/PATCH/DELETE /api/agents/identity
billing:readGET /api/billing/invoices
searchGET /api/domains/search, /suggest, /whois, /dns-check, GET /api/tlds
deals:readGET /api/deals, GET /api/deals/{id}
deals:writePOST /api/domains/sell, PATCH /api/deals/{id}
notifications:readGET /api/notifications, GET /api/notifications/count
backorders:readGET /api/backorders, GET /api/backorders/{id}
backorders:writePOST /api/backorders, DELETE /api/backorders/{id}
assistant:readRead Mailzero assistant settings, the Today queue, Work items, exact action previews, history-import progress, and content-minimized Activity
assistant:writeChange Mailzero assistant settings, record consent and start history imports, record human Decisions on Work items, retry imports, and export or delete derived assistant data. Never sends mail

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_AUTH

Los 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ódigoHTTP
MISSING_API_KEY401
INVALID_API_KEY401
EXPIRED_API_KEY401
MISSING_PARAMETER400
INVALID_DOMAIN400
PAYMENT_REQUIRED402
DOMAIN_UNAVAILABLE409
RATE_LIMIT_EXCEEDED429
USER_EXISTS409
NOT_FOUND404
UNKNOWN_PROVIDER400
UNKNOWN_METHOD400
TARGET_REQUIRED400
INVALID_PARAMETER400
CONTACT_REQUIRED400
INVALID_CONTACT400
INSUFFICIENT_SCOPE403
SCOPE_ESCALATION400
MAILBOX_CONFINED400
DOMAIN_EXISTS400
DOMAIN_NOT_ACTIVE400
UNSUPPORTED_TLD400
TLD_NOT_IN_PUBLIC_DNS400
NOT_AVAILABLE400
ALREADY_REGISTERED400
TRANSFER_NOT_ELIGIBLE400
RENEWAL_NOT_ELIGIBLE400
ALREADY_LISTED400
LISTING_SOLD400
SELF_PURCHASE400
DESCRIPTION_TOO_LONG400
DEAL_NOT_FOUND400
INVALID_DEAL_STATE400
EPP_ATTEMPTS_EXCEEDED400
ACTIVE_DEAL_EXISTS400
AGENT_IDENTITY_NOT_FOUND400
AGENT_IDENTITY_ESCALATION400
AGENT_MAILBOXES_REQUIRED400
CREDENTIAL_REVOKE_FAILED400
INVALID_IDEMPOTENCY_KEY400
IDEMPOTENCY_KEY_MISMATCH400
IDEMPOTENCY_KEY_REUSED400
OPERATION_IN_PROGRESS400
OPERATION_SUPERSEDED400
INVALID_OPERATION_RECEIPT400
WORKSPACE_ADMIN_REQUIRED400
WORKSPACE_OWNER_REQUIRED400
PRINCIPAL_NOT_IN_WORKSPACE400
MAILBOX_NOT_IN_WORKSPACE400
GROUP_NOT_IN_WORKSPACE400
COLLECTION_NOT_IN_WORKSPACE400
ACCESS_VERSION_CONFLICT400
ACCESS_OFFER_INVALID400
ACCESS_OFFER_EMAIL_MISMATCH400
MAIL_DOMAIN_CAPACITY_EXHAUSTED400
MAIL_PROVIDER_ERROR400
INVALID_HTTP_ROUTE_HOSTNAME400
INVALID_HTTP_ROUTE_UPSTREAM400
INVALID_HTTP_ROUTE_UPSTREAM_HEADERS400
INVALID_HTTP_ROUTE_LEASE400
INVALID_HTTP_ROUTE_POLICY400
INVALID_HOSTNAME_BINDING400
HTTP_ROUTE_HOSTNAME_NOT_ALLOWED400
HTTP_ROUTE_HOSTNAME_REQUIRED400
HTTP_ROUTE_HOSTNAME_RESERVED400
HTTP_ROUTE_HOSTNAME_UNAVAILABLE400
HTTP_ROUTE_CONCURRENCY_LIMIT400
HTTP_ROUTE_WORKSPACE_LIMIT400
HTTP_ROUTE_DOMAIN_NOT_OWNED400
HTTP_ROUTE_TERMINAL400
HTTP_ROUTE_VERIFICATION_NOT_ENABLED400
HTTP_ROUTE_VERIFICATION_REQUIRES_HTTPS400
HTTP_ROUTE_POLICY_WITHOUT_SCOPE400
HTTP_ROUTE_POLICY_REQUIRED400
HTTP_ROUTE_AGENT_IDENTITY_REQUIRED400
HTTP_ROUTE_POLICY_ESCALATION400
HOSTNAME_BINDING_NOT_ACTIVE400
HOSTNAME_BINDING_DNS_CONFLICT400
HOSTNAME_BINDING_ACK_REQUIRED400
HOSTNAME_BINDING_BROWSER_MODE_MISMATCH400
HOSTNAME_DNS_CONFLICT400
ZONE_READ_FAILED400
DNS_VERSION_CONFLICT400
UNAUTHORIZED400
APEX_WEB_MODE_CONFLICT400
APEX_DELEGATION_ACK_REQUIRED400
VERIFICATION_COOLDOWN400
VERIFICATION_SEND_FAILED400
UPGRADE_REQUIRED400
FREE_LIMIT_EXCEEDED400

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

GET/api/assistant/rules

Listar 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

rulesAssistantRule[]
POST/api/assistant/rules

Crear 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

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

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

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

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

deletedboolean
released_itemsinteger
POST/api/assistant/rules/test

Probar 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*stringLa clave del elemento de trabajo, por ejemplo org:tucows:invoice
sender_addressstring | null
sender_kindstring(human | automated)
subjectstring | null
labelsstring[]
occurrencesinteger
confidenceobjectLa probabilidad del clasificador por etiqueta, para una regla con minConfidence

Respuesta 200

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

Probar 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
matterobject
atstring (date-time)El instante en el que verificar el horario; ahora por defecto
approved_bystring[]Ids de miembros que ya aprobaron

Respuesta 200

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

Leer 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_daysinteger

Respuesta 200

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

Listar 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

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

Enumerar 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

statusstring(open | accepted | dismissed)

Respuesta 200

suggestionsAssistantSuggestion[]
POST/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

suggestionAssistantSuggestion
ruleAssistantRuleInput
GET/api/assistant/grants

Listar 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

grantsAssistantAssigneeGrants[]
PUT/api/assistant/grants

Establecer 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*stringEl slug de identidad del agente, o el id de usuario del miembro
grants*AssistantGrants

Respuesta 200

assigneeobject
grantsAssistantGrants
created_atstring (date-time)
updated_atstring (date-time)
DELETE/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

deletedboolean
GET/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*stringEl id del elemento de trabajo

Respuesta 200

idstringEl id del elemento de trabajo
versioninteger
statusstring
deadlinestring (date-time) | null
youobject
delegationobject
leaseAssistantTaskLease
briefobject | nullEl resumen del asunto, como GET /api/assistant/work-items/{id}/brief lo responde
factsobject | nullLos hechos del asunto, como GET /api/assistant/work-items/{id}/facts los responde
plansobject
escalationsobject[]Las preguntas realizadas en la tarea, las más recientes primero, con sus respuestas
POST/api/assistant/tasks/{id}/lease

Tomar 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_secondsinteger

Respuesta 200

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

Devolver 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_idstring
releasedboolean
leaseAssistantTaskLease
POST/api/assistant/tasks/{id}/effects

Solicitar 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
notestringQué quiere el asignado que el propietario sepa sobre esta solicitud

Respuesta 200

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

Detener 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
optionsobject[]
evidence_refsstring[]

Respuesta 200

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

Reportar 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_refsstring[]
claimsobject[]

Respuesta 200

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

Lee 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*stringID de mensaje

Respuesta 200

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

Extrae 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*stringID de mensaje

Cuerpo de la solicitud

schema*objectEsquema JSON de los campos a extraer: un objeto de primitivos, arrays y objetos anidados, menor a 8 KB, sin $ref
instructionsstringOrientación opcional, por ejemplo, cantidades en EUR

Respuesta 200

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

Obtener 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

enabledboolean
shadow_enabledboolean
pausedboolean
mailbox_idsstring[]
agent_mailbox_idsstring[]Buzones operados por tus agentes. Sus elementos aparecen en la sección de agentes de Today en lugar de en Needs you.
agentsobject[]Tus identidades de agente, para delegar.
search_opt_out_mailbox_idsstring[]Buzones cuyo correo se busca solo por palabras: sus mensajes nunca se envían al modelo de embedding.
brief_opt_out_mailbox_idsstring[]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_daysinteger
privacy_routestring
attachment_visionboolean
community_signalsbooleanTus 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_versionstring
consentobject
mailboxesobject[]

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"
    }
  ]
}
PUT/api/assistant/settings

Actualizar 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

enabledbooleanMostrar Decisiones de Today y generar borradores bajo demanda
shadow_enabledbooleanAnalizar correo sin mostrar Decisiones
pausedboolean
mailbox_idsstring[]IDs de buzones propios a procesar; un array vacío deshabilita todo
agent_mailbox_idsstring[]Buzones operados por tus agentes. Sus elementos aparecen en la sección de agentes de Today en lugar de en Needs you.
history_window_daysinteger
attachment_visionboolean

Respuesta 200

okboolean
enabledboolean
shadow_enabledboolean
pausedboolean
mailbox_idsstring[]

Ejemplo de respuesta

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

Consentir 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_daysinteger
consent*boolean(true)
consent_version*string(mailzero-personal-ai.v1)

Respuesta 200

okboolean
previewobject

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"
  }
}
GET/api/assistant/backfill

Obtener 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

backfillobject | 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
  }
}
POST/api/assistant/backfill

Reintentar 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

okboolean
retriedinteger

Ejemplo de respuesta

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

Obtener 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

agentstringSolo 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.
categorystringSolo 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.
tagstringSolo 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

typestring
as_ofstring
projection_lag_msinteger
categorystring | nullEl tipo de asunto al que se limita la vista (el parámetro category), o null para todos los tipos.
categoriesobjectCada tipo de asunto presente en la vista, antes del filtro, con cuántos elementos contiene.
tagstring | nullLa etiqueta a la que se limita la vista (el parámetro tag), o null para todos los asuntos.
tagsobjectCada etiqueta de la persona en la vista, antes del filtro, con cuántos asuntos la llevan.
sectionsobject

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": []
  }
}
GET/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*stringID del elemento Work de la cola Today

Respuesta 200

idstring
versioninteger
statusstring
titlestring
summarystring
askstring | nullLo único que el propietario debe hacer o decidir, o null.
categorystring | nullEl 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>.
tagsstring[]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_tagsstring[]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.
suspectbooleanLas 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_reasonsstring[]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).
senderobject | null
recurrenceobjectCuántas veces volvió esta misma situación: un elemento, N mensajes.
mailboxobject
opened_atstring | null
delegated_tostring | nullEl slug del agente al que el propietario confió este elemento, o null.
delegation_ruleobject | nullLa delegación permanente que entregó este elemento, y por qué coincidió; suspendida una vez que el propietario recuperó el elemento.
unreadbooleanVerdadero hasta que el propietario abra el elemento después de su último cambio.
messagesobject[]Los mensajes de origen detrás de este elemento, del más reciente al más antiguo.
historyobject[]Lo que ya ocurrió en este asunto, del más antiguo al más reciente: una línea por cada mensaje anterior.
sourceobject
attentionobject
analysisobject
evidence_refsstring[]
entity_refsstring[]
snoozed_untilstring | null
decisionobject | null
planobject | null
GET/api/assistant/work-items/{id}/brief

Leer 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*stringID del elemento de Work
synthesisbooleanEstablecer 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

idstring
versioninteger
generated_atstring (date-time)
titlestring
summarystring
askstring | null
mailboxobject
delegated_tostring | null
situationobject
storyobject[]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
factsobject[]
entitiesobject[]
commitmentsobject[]Promesas abiertas hechas por el lado del propietario
expectationsobject[]Cosas abiertas esperadas de otros
settledobject[]Ciclos cerrados y recibos, del más reciente al más antiguo
awaitingobject[]
decisionobject | nullLa Decisión preparada actual con sus opciones
summary_sourcestringSi el resumen es la lectura del modelo de la evidencia o la propia oración del pipeline
suggested_nextobject | null
open_questionsstring[]Lo que solo el propietario puede decidir antes de la siguiente acción, como máximo tres preguntas
synthesisobject | nullLa llamada al modelo que escribió el resumen y la siguiente acción, null cuando el brief es solo determinístico
evidenceobject[]
owner_repliesobject[]
evidence_refsstring[]
GET/api/assistant/brief

Leer 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*stringLa dirección de correo electrónico de la persona
mailboxstringRestringir a una dirección de buzón (slug@domain)

Respuesta 200

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

Lee 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*stringID del elemento de Work

Respuesta 200

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

Marcar 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

okboolean
opened_atstring
unreadboolean
GET/api/assistant/learned

Lo 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

mutesobject[]Los silenciados en vigor, más recientes primero.
suggestionsAssistantSuggestion[]Las reglas de silencio abiertas: acepta una a través del endpoint de sugerencias para establecer el silencio que lleva.
tagsobject[]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.
DELETE/api/assistant/learned/mutes

Olvidar 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*stringLa dirección, el dominio o la clave de situación, como la vista learned lo lista.

Respuesta 200

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

Olvidar 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*stringLa etiqueta, tal como la lista la vista learned.

Respuesta 200

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

Investigar 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_idstring
sourcestringSi el mensaje de origen fue leído, o solo la dirección del remitente.
checked_atstring
senderobject
linksobject[]
attachmentsobject[]Lo que cada adjunto realmente es, leído desde sus primeros bytes contra lo que su nombre y tipo declarado prometen.
signalsobject[]Lo que los hechos añaden a la evaluación, una oración cada uno.
GET/api/assistant/work-items/{id}/sender

Quié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_idstring
senderobject | null
organisationobject | nullNull para un dominio de correo compartido o un dominio nunca analizado.
participantsobject[]
relationshipobject
generated_atstring (date-time)
POST/api/assistant/work-items/{id}/interactions

Registrar 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

scopestring(item | sender | sender_domain | situation)Con tipo ignore: también silenciar el remitente, su dominio o esta situación recurrente para que nunca vuelva.
verdictstring(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_idstringCon type approve o reject: el plan de acción en espera (propuesto o escalado).
reasonstringCon type reject: por qué, mantenido en el plan.
type*string(choose | instruct | take_over | snooze | ignore | correct | delegate | approve | reject | report | tag)
addstring[]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.
removestring[]Con type tag: etiquetas para quitar del asunto (una propuesta nombrada aquí se rechaza). La página learned olvida una etiqueta definitivamente.
agent_slugstring | nullCon el tipo delegate: el slug de tu agente al que confiar el elemento, o null para recuperarlo.
member_idstring | nullCon 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_idstring
decision_versioninteger
option_idstring
instructionstring
untilstring (date-time)
remind_atstring (date-time)
fieldstring
correctionstring
idempotency_key*string

Respuesta 200

okboolean
work_itemAssistantWorkItem
plan_idstring | null
GET/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*stringID de plan de acción opaco

Respuesta 200

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

Obtener 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

limitinteger

Respuesta 200

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

Exportar 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

formatstring
exported_atstring
notestring
DELETE/api/assistant/data

Eliminar 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

okboolean
deletedobject
source_mail_deletedboolean

Ejemplo de respuesta

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

Registrar 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_detailstring(redacted | sender_only)

Respuesta 200

okboolean
deviceobject
DELETE/api/assistant/devices

Revocar 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

okboolean

Correo

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

Verifique 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*stringNombre de dominio que posee

Respuesta 200

domainstring
providerstring | nullProveedor de correo electrónico detectado automáticamente (google-workspace, proton, fastmail) o null
mxobject
spfobject
dmarcobject
dkimobject

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"
GET/api/domains/{domain}/email/deliverability

Obtenga 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*stringNombre de dominio que posee

Respuesta 200

domainstring
statusstring
confidencestring
checked_atstring (date-time)
window_daysinteger
readinessobjectPreparación determinista de la configuración DNS. La puntuación no es una probabilidad de la bandeja de entrada.
sending_healthobject
placementobject
actionsobject[]
caveatsstring[]

Ejemplo

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

Configurar 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*stringNombre de dominio

Cuerpo de la solicitud

forcebooleanAnule el proveedor de correo electrónico existente (Google Workspace, Fastmail, Proton). Predeterminado: falso

Respuesta 200

domainstring
statusstring
verified_atstring | null
receiving_verifiedbooleanVerdadero cuando el MX del dominio apunta al receptor de la plataforma, de modo que el correo de sus direcciones se acepta.
sending_configuredboolean
sending_verifiedboolean
recordsDnsRecord[]
hintstring
DELETE/api/domains/{domain}/email/setup

Eliminar 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*stringNombre de dominio
GET/api/domains/{domain}/email/status

Verificar 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*stringNombre de dominio

Respuesta 200

domainstring
enabledboolean
verifiedbooleanVerdadero solo cuando se verifican tanto la recepción como el envío saliente
receiving_verifiedbooleanVerdadero cuando el MX del dominio apunta al receptor de la plataforma, de modo que el correo de sus direcciones se acepta.
sending_configuredboolean
sending_verifiedboolean
recordsDnsRecord[]
mailbox_countinteger
dns_managedbooleanVerdadero 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_addressesstring[]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_statusstring
mailbox_plan_keystringLa 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_limitinteger | nullBuzones con dominio propio que el plan permite en todo el espacio de trabajo. null significa ilimitado.
mailbox_limit_reachedbooleanVerdadero 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_planobject | nullEl plan más barato que dejaría espacio para otro buzón. null si ya es ilimitado.
hintstring
POST/api/email

Crear 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*stringParte local de la dirección de correo electrónico (por ejemplo, 'hello' para hello@domani.run)
namestringNombre para mostrar (por defecto, slug en mayúscula)

Respuesta 201

idstring
addressstring
namestring | null
slugstring
domainstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
collaboration_enabledboolean
sharedbooleanIndica si al menos una persona distinta del solicitante puede leer este buzón
message_countinteger
webhook_urlstring | null
header_namesstring[]Nombres de encabezado de autenticación de webhook configurados; los valores nunca se devuelven
forward_tostring | null
signing_secretstring | null
created_atstring (date-time)
hintstring
GET/api/email

Listar 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

domainstringFiltrar por dominio

Respuesta 200

mailboxesobject[]
POST/api/emails

Crear 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*stringDirección de correo electrónico completa, p. hello@mysite.com
namestringNombre para mostrar para correos electrónicos salientes (por ejemplo, "John Doe")
forcebooleanAnula los registros MX existentes. Predeterminado: falso
kindstring(api | hosted)"api" (predeterminado: enviar/recibir a través de API + webhooks) o "hosted" (buzón IMAP/SMTP real en su dominio)
workspace_idstringEspacio de trabajo para poseer el buzón. Sólo el propietario del espacio de trabajo puede adoptar recursos.

Respuesta 201

idstring
addressstring
namestring | null
domainstring
slugstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
collaboration_enabledboolean
sharedbooleanIndica si al menos una persona distinta del solicitante puede leer este buzón
message_countinteger
webhook_urlstring | null
header_namesstring[]Nombres de encabezado de autenticación de webhook configurados; los valores nunca se devuelven
forward_tostring | null
signing_secretstring | nullSecreto HMAC para verificar cargas útiles de webhook entrantes (se muestra una vez en la creación)
host_idstringID principal del host de correo para un buzón alojado
dns_recordsDnsRecord[]
dns_statusstring
receiving_statusstring
sending_statusstring
sending_errorobject
client_settingsobject
credentialobject
storage_quota_bytesinteger
created_atstring (date-time)
hintstring
GET/api/emails

Listar 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

domainstringFiltrar por dominio

Respuesta 200

mailboxesobject[]
GET/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*stringDirección de correo electrónico completa (codificada en URL, por ejemplo, hola%40misitio.com)

Respuesta 200

idstring
addressstring
slugstring
domainstring
kindstring
workspace_idstring | null
access_rolestring
effective_capabilitiesMailboxEffectiveCapabilities
webhook_urlstring | null
forward_tostring | null
signing_secretstring | nullSecreto HMAC para gerentes; nulo para espectadores/respondedores
message_countinteger
storage_quota_bytesinteger | null
storage_used_bytesinteger | null
storage_measured_atstring (date-time) | null
created_atstring (date-time)
PATCH/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*stringDirección de correo electrónico completa (codificada en URL)

Cuerpo de la solicitud

namestring | nullNombre para mostrar del buzón. Establezca en nulo para borrar.
webhook_urlstring | nullURL HTTPS para webhook de correo electrónico entrante o nulo para borrar
forward_tostring | nullDirección de correo electrónico para reenviar correos electrónicos entrantes o nula para borrar
drop_spambooleanEliminar (no almacenar ni webhook) mensajes entrantes marcados como spam
tone_notesstring | nullIndicaciones 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

idstring
addressstring
slugstring
domainstring
namestring | null
webhook_urlstring | null
forward_tostring | null
tone_notesstring | null
signing_secretstringSecreto de HMAC para verificar cargas útiles de webhooks entrantes
DELETE/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*stringDirección de correo electrónico completa (codificada en URL)

Cuerpo de la solicitud

confirmbooleanDebe ser verdadero para eliminarlo. Omitir para obtener una vista previa.
POST/api/emails/{address}/send

enviar 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*stringDirección de correo electrónico del remitente (codificada en URL)

Cuerpo de la solicitud

to*anyDirección(es) de correo electrónico del destinatario
ccanyDestinatarios CC
bccanyDestinatarios CCO
subjectstring
textstringCuerpo de texto sin formato
htmlstringcuerpo HTML
reply_tostringDirección de respuesta
in_reply_tostringID de mensaje del correo electrónico al que se responde (para subprocesos)
referencesstringCadena de ID de mensaje separada por espacios (para subprocesos)
idempotency_keystringClave estable que evita envíos duplicados
send_atstring (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.
coordinationobjectRequerido para una respuesta colaborativa cautelosa.
allow_risky_contentbooleanCampo 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.
attachmentsobject[]Archivos adjuntos (máximo 10, máximo 40 MB en total). El contenido debe estar codificado en base64.

Respuesta 200

idstring
message_idstringID de mensaje RFC 5322
fromstring
tostring
bccstring | nullDestinatario(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.
statusstring
attachments_countinteger
suppressedstring[]
deliverabilityobjectInforme de política versionado aplicado a este envío; inspeccionar decisiones y controles categorizados
POST/api/emails/{address}/deliverability-check

Realice 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*stringDirección de correo electrónico del remitente (codificada en URL)

Cuerpo de la solicitud

subjectstring
textstring
htmlstring
idempotency_keystring
allow_risky_contentbooleanCampo de compatibilidad obsoleto; Los bloqueos de seguridad objetivos no se pueden anular.
attachmentsobject[]

Respuesta 200

policy_versionstring
decisionstring
safe_to_sendbooleanEquivalente booleano compatible con versiones anteriores a decisión! = negar
riskstring
scoreinteger
authentication_messageboolean
checksobject[]
blocked_reasonsstring[]
warningsstring[]
override_usedboolean
GET/api/emails/{address}/messages

Listar 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*stringDirección de correo electrónico del buzón (codificada en URL)
cursorstringCursor de paginación de la respuesta anterior
limitintegerMáximo de mensajes para devolver
directionstring(in | out | all)Filtrar por dirección (predeterminado: todos)
folderstring(inbox | archive | sent | spam | trash)Carpeta del sistema. Mutuamente excluyentes con vista. El valor predeterminado es la bandeja de entrada.
labelstringEtiquetas separadas por comas: solo mensajes que tengan alguna de ellas
viewstring(starred | all | needs_human | scheduled)Vista virtual. Mutuamente excluyentes con carpeta.
sincestringMarca de tiempo ISO: devuelve solo mensajes creados después de esta fecha
untilstringMarca de tiempo ISO: devuelve solo mensajes creados antes de esta fecha
fromstringFiltrar por dirección del remitente
tostringFiltrar por dirección del destinatario
subjectstringFiltrar por tema
qstringBúsqueda amplia que no distingue entre mayúsculas y minúsculas en remitente, destinatario, asunto y cuerpo de texto sin formato
unreadbooleanDevolver solo mensajes no leídos
attachmentsbooleanDevolver mensajes que contengan archivos adjuntos únicamente
spambooleanFiltrar por marca de spam (pase falso para ocultar las entradas marcadas como spam)

Respuesta 200

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

Buscar 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

mailboxstringRestringir a una dirección de buzón (slug@domain).
q*stringLo 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"`).
modestring(hybrid | semantic | keyword)hybrid fusiona el embedding y las palabras por rango; semantic usa solo el significado; keyword solo las palabras.
limitintegerResultados a devolver.
sincestringSolo correo recibido después de esta marca de tiempo ISO.
untilstringSolo correo recibido antes de esta marca de tiempo ISO.
folderstring(inbox | archive | sent | spam | trash | anywhere)Una carpeta. Trash se excluye a menos que se nombre o con `anywhere`.
fromstringLa dirección del remitente contiene.
labelstringEtiquetas separadas por comas: solo mensajes que tengan alguna de ellas

Respuesta 200

resultsobject[]
modestring
querystring
took_msinteger
hintstring

Ejemplo

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

Comenzar 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

accessstring(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.
sincestring (date-time)Importar el correo recibido después de este instante
windowstring(24h | 7d | 30d | 1y)Un preset en lugar de since; predeterminado 24h
workspace_idstringWorkspace al que pertenece el buzón; tu workspace personal por defecto
login_hintstringLa cuenta de Google a preseleccionar
return_tostringRuta de la app a la que enviar el navegador después del consentimiento

Respuesta 200

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

Comenzar 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

accessstring(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.
sincestring (date-time)Importar el correo recibido después de este instante
windowstring(24h | 7d | 30d | 1y)Un preset en lugar de since; predeterminado 24h
workspace_idstringWorkspace al que pertenece el buzón; tu workspace personal por defecto
login_hintstringLa cuenta de Microsoft a preseleccionar
return_tostringRuta de la app a la que enviar el navegador después del consentimiento

Respuesta 200

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

Lista 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

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

Conectar 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*stringLa bandeja de entrada a conectar, por ejemplo someone@gmail.com
workspace_idstringWorkspace al que pertenece el buzón; tu workspace personal por defecto

Respuesta 200

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

Enviar 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*stringLa dirección conectada, por ejemplo someone@gmail.com

Respuesta 200

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

Leer 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*stringLa dirección conectada, por ejemplo someone@gmail.com

Respuesta 200

addressstring
mailbox_idstring
kindstring
statusstring
import_sincestring (date-time) | nullEl límite de la primera importación: ningún correo recibido antes de él se copia
phasestringlista 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_reasonstring | null
import_runobject | nullLa ejecución de importación actual o última de este buzón
source_messages_totalinteger | nullLo que la fuente reporta para toda la bandeja de entrada, para escala
last_sync_atstring (date-time) | null
last_errorstring | null
backoff_untilstring (date-time) | null
verified_atstring (date-time) | null
connected_atstring (date-time)
cost_cap_usdnumberEl gasto de modelo permitido por ejecución de importación, en USD
accessstring | nullPara una conexión de Gmail: qué permite el grant; write significa etiquetas en ambas direcciones y enviar como la persona
forwardingobject | nullPara una conexión mediante reenvío: la dirección de reenvío, lo que llegó, la confirmación de Gmail, la prueba, los pasos
DELETE/api/emails/{address}/connector

Desconectar 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

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

Importar 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_idstring
import_sincestring (date-time)
import_untilstring (date-time)
GET/api/emails/{address}/search

Buscar 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*stringDirección de correo electrónico del buzón (codificada en URL)
q*stringLo 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"`).
modestring(hybrid | semantic | keyword)hybrid fusiona el embedding y las palabras por rango; semantic usa solo el significado; keyword solo las palabras.
limitintegerResultados a devolver.
sincestringSolo correo recibido después de esta marca de tiempo ISO.
untilstringSolo correo recibido antes de esta marca de tiempo ISO.
folderstring(inbox | archive | sent | spam | trash | anywhere)Una carpeta. Trash se excluye a menos que se nombre o con `anywhere`.
fromstringLa dirección del remitente contiene.
labelstringEtiquetas separadas por comas: solo mensajes que tengan alguna de ellas

Respuesta 200

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

Listar 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
folderstring(all | inbox | archive | sent | spam | trash)
sincestringSolo hilos con actividad después de esta hora
limitinteger
cursorstringnext_cursor de la página anterior
labelstringEtiquetas separadas por comas: solo hilos con un mensaje que tenga alguna de ellas

Respuesta 200

threadsEmailThread[]
next_cursorstring | null
has_moreboolean
GET/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*stringId del hilo (el thread_id de cualquiera de sus mensajes)

Respuesta 200

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

Transmitir eventos 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
sincestringCursor desde el cual reproducir; el `cursor` de cualquier evento anterior o un next_cursor de /api/email/changes
GET/api/emails/{address}/folders

Listar 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

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

Aplicar 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)
destinationstring(inbox | archive | sent | spam | trash)
readboolean
starredboolean
addstring[]label: etiquetas a agregar
removestring[]label: etiquetas a eliminar
setstring[]label: reemplazar cada etiqueta (tiene prioridad sobre agregar y eliminar)
idempotency_keystringClave estable para este lote lógico exacto. Reutilizar después de un tiempo de espera.

Respuesta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVerdadero cuando esta respuesta reutilizó el recibo completado inmutable y no realizó ninguna mutación nueva.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
PATCH/api/emails/{address}/messages/read

Marcar 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*stringDirección de correo electrónico del buzón (codificada en URL)

Cuerpo de la solicitud

message_ids*string[]ID de mensajes para marcar
read*booleanverdadero para marcar como leído, falso para marcar como no leído
idempotency_keystring

Respuesta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVerdadero cuando esta respuesta reutilizó el recibo completado inmutable y no realizó ninguna mutación nueva.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
countinteger
POST/api/emails/{address}/messages/delete

Eliminar 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*stringDirección de correo electrónico del buzón (codificada en URL)

Cuerpo de la solicitud

message_ids*string[]ID de mensajes para eliminar
idempotency_keystring

Respuesta 200

operation_idstring
idempotency_keystring
idempotent_replaybooleanVerdadero cuando esta respuesta reutilizó el recibo completado inmutable y no realizó ninguna mutación nueva.
actionstring
statusstring
resultsobject[]
summaryobject
created_atstring (date-time)
completed_atstring (date-time) | null
countinteger
GET/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*stringDirección de correo electrónico del buzón (codificada en URL)
id*stringID de mensaje

Respuesta 200

idstring
thread_idstringId de conversación compartido por cada mensaje del hilo (el id del mensaje raíz)
labelsstring[]Cada etiqueta en el mensaje; `label` es la primera
thread_keystringClave de conversación canónica con espacio de nombres de backend
thread_aliasesstring[]Claves de flujo de trabajo heredadas para devolver al cambiar el estado de la conversación
message_idstring | null
directionstring
fromstringEl 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_urlstring (uri) | nullURL proxy Domani que preserva la privacidad para el avatar del remitente
tostringTodos 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).
ccstring | nullTodos los destinatarios Cc del encabezado, con sus nombres para mostrar, o null cuando el correo no llevaba Cc.
bccstring | nullDestinatarios Bcc, presentes solo en tu propio mensaje saliente (nunca en uno recibido, y nunca entregados como encabezado).
reply_tostring | null
subjectstring
textstring | null
htmlstring | null
in_reply_tostring | null
referencesstring | null
attachmentsobject[]
statusstring
is_readboolean
read_atstring | null
eventsobject[]
created_atstring (date-time)
DELETE/api/emails/{address}/messages/{id}

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*stringDirección de correo electrónico del buzón (codificada en URL)
id*stringID de mensaje

Respuesta 200

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

Responder 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*stringDirección de correo electrónico del buzón (codificada en URL)
id*stringID del mensaje al que responder

Cuerpo de la solicitud

textstringCuerpo de respuesta en texto plano
htmlstringcuerpo de respuesta HTML
ccanyDestinatarios CC adicionales
allbooleanResponder a todos: completar automáticamente el CC desde el Para/CC original
quotebooleanCita el original debajo de la respuesta; false envía solo el texto o el HTML indicado
idempotency_keystringForma de compatibilidad corporal de Idempotency-Key
coordinationobject

Respuesta 200

idstring
message_idstring
fromstring
tostring
statusstring
reply_versionintegerGeneración reservada para una respuesta cautelosa
POST/api/emails/{address}/messages/{id}/forward

Reenviar 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*stringDirección de correo electrónico del buzón (codificada en URL)
id*stringID de mensaje para reenviar

Cuerpo de la solicitud

to*stringDirección de correo electrónico del destinatario
textstringNota opcional para anteponer

Respuesta 200

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

Obtener 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*stringDirección de correo electrónico del buzón (codificada en URL)

Respuesta 200

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

Obtener 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*stringDirección de correo electrónico del buzón (codificada en URL)

Respuesta 200

addressstring
webhook_urlstring | null
signing_secretstring | null
has_webhookboolean
eventsstring[]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_namesstring[]Nombres de encabezado de autenticación configurados; los valores nunca se devuelven
hintstring
PUT/api/emails/{address}/webhook

Establecer 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*stringDirección de correo electrónico del buzón (codificada en URL)

Cuerpo de la solicitud

url*stringURL del webhook HTTPS
eventsstring[]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}}.
headersobjectEncabezados 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

addressstring
webhook_urlstring
signing_secretstring
has_webhookboolean
eventsstring[]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_namesstring[]Nombres de encabezado de autenticación configurados; los valores nunca se devuelven
hintstring

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"]}'
DELETE/api/emails/{address}/webhook

Quitar 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*stringDirección de correo electrónico del buzón (codificada en URL)

Respuesta 200

addressstring
webhook_urlstring | null
signing_secretstring | null
has_webhookboolean
eventsstring[]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_namesstring[]
hintstring
POST/api/emails/{address}/webhook/rotate

Rotar 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*stringDirección de correo electrónico del buzón (codificada en URL)

Respuesta 200

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

Probar 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*stringDirección de correo electrónico del buzón (codificada en URL)

Respuesta 200

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

Listar 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*stringDirección de correo electrónico del buzón (codificada en URL)

Respuesta 200

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

Agregar 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*stringDirección de correo electrónico del buzón (codificada en URL)

Cuerpo de la solicitud

alias*stringDirección de alias: un slug simple o un slug@domain completo en el mismo dominio

Respuesta 201

addressstring
mailboxstring
created_atstring (date-time)
hintstring
DELETE/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*stringDirección de correo electrónico del buzón (codificada en URL)
alias*stringDirección de alias para eliminar (codificada en URL o un slug simple)

Respuesta 200

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

Obtener 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*stringDirección de buzón alojado (codificada en URL)

Respuesta 200

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

Listar 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*stringDirección de buzón alojado (codificada en URL)

Respuesta 200

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

Crear 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*stringDirección de buzón alojado (codificada en URL)

Cuerpo de la solicitud

labelstringEtiqueta para identificar la contraseña de esta aplicación, p. "Correo portátil"

Respuesta 201

idstring
labelstring
passwordstringLa contraseña de la aplicación: se muestra una vez, guárdela ahora
client_settingsobject
hintstring
DELETE/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*stringDirección de buzón alojado (codificada en URL)
id*stringID de contraseña de la aplicación (desde el punto final de la lista)

Respuesta 200

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

Marcar 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*stringDirección de correo electrónico del buzón (codificada en URL)
id*stringID del mensaje a marcar

Cuerpo de la solicitud

reasonstringPor qué se necesita al humano - se muestra en la notificación
clearbooleanBorrar la marca en lugar de establecerla (el humano tomó el control)

Respuesta 200

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

Establecer 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*stringDirección de correo electrónico del buzón (codificada en URL)
id*stringID del mensaje a vigilar

Cuerpo de la solicitud

remind_atstring (date-time)Hora ISO 8601 del recordatorio (entre 1 minuto y 90 días de antelación)
notestringContexto que se muestra cuando se dispara el recordatorio
clearbooleanBorrar un recordatorio pendiente

Respuesta 200

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

Listar 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

qstringFiltrar por subcadena de dirección o nombre
limitintegerContactos a devolver (predeterminado 50)
cursorstringCursor de paginación de una respuesta anterior
orderstring(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

contactsobject[]
next_cursorstring | null
POST/api/contacts

Crear 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*stringLa dirección de correo electrónico del contacto
namestring | nullNombre para mostrar (nulo lo borra)
notesstring | nullNotas que los agentes y los humanos leen como contexto (nulo las borra)
DELETE/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*stringLa dirección de correo electrónico del contacto (codificada en URL)
GET/api/emails/{address}/rules

Listar 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*stringDirección de correo electrónico del buzón (codificada en URL)

Respuesta 200

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

Agregar 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*stringDirecció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_argstringDirección de reenvío (para forward), valor de etiqueta (para label) o motivo que se muestra al humano (para escalate)
priorityintegerLa parte inferior se ejecuta primero (por defecto 0)
enabledbooleanVerdadero predeterminado

Respuesta 201

idstring
priorityintegerLas carreras más bajas primero
match_fieldstring
match_opstring
match_valuestring
actionstring
action_argstring | null
enabledboolean
created_atstring (date-time)
DELETE/api/emails/{address}/rules/{ruleId}

Eliminar una regla de correo entrante

Eliminar una regla de filtrado entrante de un buzón.

Parámetros

address*stringDirección de correo electrónico del buzón (codificada en URL)
ruleId*stringLa identificación de la regla

Respuesta 200

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

Establecer 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*stringNombre de dominio

Cuerpo de la solicitud

mailbox*stringBuzón general: un slug simple o una dirección completa en este dominio

Respuesta 200

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

Borrar 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*stringNombre de dominio

Respuesta 200

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

Sincronizar 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
cursorstringOpaco next_cursor de una respuesta anterior
limitinteger

Respuesta 200

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

Listar 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

cursorstringCursor de paginación de una respuesta anterior
limitintegerEntradas máximas (predeterminado 50, máximo 100)

Respuesta 200

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

Agregar 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*stringDirección de correo electrónico para suprimir
reasonstring(manual | hard_bounce | complaint)Motivo (predeterminado: manual)

Respuesta 201

addressstring
reasonstring
sourcestring
created_atstring (date-time)
hintstring
DELETE/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*stringDirección de correo electrónico suprimida (codificada en URL)

Respuesta 200

addressstring
deletedboolean
hintstring

Collaboration

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

Solicitar 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
DELETE/api/workspaces/{id}/ownership-transfer/{transferId}

Revocar una transferencia de propiedad pendiente

Parámetros

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

Aceptar 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

POST/api/auth/registerPúblico

Crea 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)
refstringCódigo de referencia: vincula permanentemente a este usuario con el referente. El referente gana una comisión por cada compra de dominio.

Respuesta 202

okboolean
verification_requiredboolean
messagestring
hintstring
next_stepsstring[]

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"}'
POST/api/auth/loginPúblico

Enviar 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

okboolean
messagestring

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"}'
POST/api/auth/handoff

Generar 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

urlstring

Ejemplo de respuesta

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

Canjear 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

okboolean
nextstring

Ejemplo de respuesta

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

Cuenta

GET/api/me

Obtener 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

idstring
emailstring (email)
planstringClave del plan Domani personal activo
workspace_plansstring[]Distintas claves activas del plan Mailzero en espacios de trabajo a los que el usuario puede acceder
has_payment_methodbooleanSi el usuario tiene una tarjeta registrada (requerido antes de comprar dominios)
preferred_payment_methodstring | null
preferred_localestringConfiguración regional utilizada por las interfaces Domani y las comunicaciones transaccionales
has_contactbooleanSi 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.
contactRegistrantContactInformación de contacto del registrante (nula si no está configurada)
referral_codestringSu código de referencia único
referral_rateintegerPorcentaje de comisión sobre compras referidas
balancenumberSaldo de crédito del Marketplace en USD (obtenido de las ventas)
domain_countintegerNúmero de dominios poseídos
token_countintegerNúmero de tokens API activos
featuresstring[]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_assistantbooleanIndica 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_adminboolean
mailbox_entitlementobjectCapacidad 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_atstring (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"
PUT/api/me

Actualizar 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_methodstring | null(card | usdc)Método de pago predeterminado para compras (card, usdc o null para selección automática)
preferred_localestring(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_methodstring | null
preferred_localestring
hintstring
DELETE/api/me

Eliminar 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

deletedboolean
hintstring
GET/api/me/activation

Obtenga 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

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

Ejemplo

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

Descartar 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_versioninteger
hintstring
GET/api/me/contact

Obtener 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_contactboolean
contactRegistrantContact

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"
PUT/api/me/contact

Establecer 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

contactRegistrantContact

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"}'
POST/api/me/resend-verification

Reenviar 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

emailstring (email)Dirección de correo electrónico para verificar (el valor predeterminado es el correo electrónico de contacto de la cuenta)

Respuesta 200

sentboolean
already_verifiedboolean
hintstring
GET/api/sessions

Listar 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

sessionsobject[]
hintstring

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"
DELETE/api/sessions

Cerrar 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

revokedinteger
hintstring

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"
DELETE/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*stringID de la sesión (de GET /api/sessions), o `current`

Respuesta 200

successboolean
currentbooleanVerdadero cuando quien llama cerró su propia sesión: su clave ya no funciona
hintstring

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

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

Listar 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*stringEl identificador de la identidad de agente.
POST/api/agents/identity/{slug}/tokens

Dar 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*stringEl identificador de la identidad de agente.

Cuerpo de la solicitud

namestringPor defecto '<slug> agent'.
scopesstring[]Por defecto assistant:read, assistant:write, email:read, email:write. No puede exceder los scopes propios del llamador.
mailboxesstring[]Direcciones de buzones a las que el token está confinado. Por defecto los buzones que el agente opera.
expires_inintegerSegundos hasta la expiración (máximo un año).

Respuesta 201

successboolean
tokenobject
agentobject
hintstring

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

successboolean
hintstring
GET/api/tokens

Enumere 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

tokensTokenInfo[]

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"
POST/api/tokens

Crear 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

namestringNombre legible por humanos para identificar este token
expires_inintegerVida útil del token en segundos (mínimo 3600 = 1 h, máximo 31536000 = 1 año). Omitir sin vencimiento.
expires_atstring (date-time)Fecha de caducidad absoluta (ISO 8601). Alternativa a expires_in.
scopesstring[]Á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_txnumberLí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_monthnumberLímite de gasto móvil por mes calendario en USD en todas las operaciones pagas realizadas con este token.
agent_identity_idstringIdentificació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_policyobjectAutoridad estructurada obligatoria para un token con ámbito que incluya http-routes:read o http-routes:write.
mailboxesstring[]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

idstring
namestring
keystringClave API completa: guárdela, no se volverá a mostrar
expiresAtstring (date-time) | nullCuando este token caduca (nulo = nunca)
scopesstring[]Ámbitos de permiso otorgados a este token
createdAtstring (date-time)
max_per_txnumber | nullLímite de gasto por transacción en USD (nulo = sin límite)
max_per_monthnumber | nullLímite de gasto mensual en USD (nulo = sin límite)
mailbox_idsstring[]IDs de buzón a los que está confinado este token
http_route_policyHttpRoutePolicy
agent_identityobject | 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"}'
DELETE/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*stringID de token (de la respuesta GET /api/tokens)

Respuesta 200

successboolean

Ejemplo de respuesta

{
  "success": true
}

Ejemplo

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

Listar 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

limitintegerEventos por página
cursorstringCursor de paginación (next_cursor de la página anterior)
typestringFiltrar por tipo de evento (por ejemplo, token.creado, compra.cargado, compra.denied_cap)

Respuesta 200

eventsobject[]
next_cursorstring | null
hintstring

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

GET/api/webhooks

Listar 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

webhooksobject[]
hintstring

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"
POST/api/webhooks

Crear 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.
headersobjectEncabezados de autenticación cifrados opcionales. Solo se aceptan autorización y clave X-API.

Respuesta 200

idstring
urlstring (uri)
eventsstring[]
secretstringSecreto de firma HMAC-SHA256 (se muestra una vez)
activeboolean
header_namesstring[]Nombres de encabezado de autenticación configurados; los valores nunca se devuelven
created_atstring (date-time)
hintstring

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"}}'
PATCH/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*stringID de webhook

Cuerpo de la solicitud

urlstring (uri)Nueva URL HTTPS
eventsstring[]Nueva lista de tipos de eventos
activebooleanEstablecer falso para pausar, verdadero para reanudar
headersobjectReemplace los encabezados de autenticación cifrados; enviar {} para borrar. Solo se aceptan autorización y clave X-API.

Respuesta 200

idstring
urlstring (uri)
eventsstring[]
activeboolean
header_namesstring[]Nombres de encabezado de autenticación configurados; los valores nunca se devuelven
hintstring
DELETE/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*stringID de webhook

Respuesta 200

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

Listar 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*stringID de webhook
limitintegerNúmero máximo de entregas a devolver

Respuesta 200

deliveriesobject[]
hintstring

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."
}
POST/api/webhooks/{id}/deliveries/{deliveryId}/replay

Reproducir 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*stringID de webhook
deliveryId*stringID de entrega original

Cuerpo de la solicitud

idempotency_key*string

Respuesta 200

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

Listar tipos de eventos de webhook

Enumere todos los tipos de eventos de webhook disponibles con descripciones. No se requiere autenticación.

Respuesta 200

eventsobject[]

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

GET/api/notifications

Lista 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

limitintegerNotificaciones máximas para regresar
cursorstringCursor para paginación (del next_cursor de la respuesta anterior)

Respuesta 200

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

Obtener 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_countinteger

Ejemplo de respuesta

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

Marcar notificación como leída

Marcar una sola notificación como leída. Requiere alcance notifications:read.

Parámetros

id*stringID de notificación

Cuerpo de la solicitud

read*booleanEstablecer en verdadero para marcar como leído

Respuesta 200

okboolean
POST/api/notifications/read-all

Marcar todas las notificaciones como leídas

Marcar todas las notificaciones no leídas como leídas. Requiere alcance notifications:read.

Respuesta 200

okboolean
countintegerNúmero de notificaciones marcadas como leídas
GET/api/notifications/preferences

Obtener 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

preferencesobject[]
expiry_alert_daysinteger[]Días antes del vencimiento, el usuario recibe recordatorios de renovación (predeterminado 30/7/1). Vacío = sin recordatorios de vencimiento.
PUT/api/notifications/preferences

Actualizar 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

preferencesobject[]
expiry_alert_daysinteger[]Días antes del vencimiento para recibir recordatorios de renovación. Matriz vacía = sin recordatorios de vencimiento.

Respuesta 200

okboolean

TLD

GET/api/tldsPúblico

Enumerar 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_pricenumberPrecio máximo de inscripción en USD
min_pricenumberPrecio mínimo de inscripción en USD
sortstring(tld | price | renewal)Campo de clasificación: 'tld' (alfabético), 'price' (registro) o 'renewal'
orderstring(asc | desc)orden de clasificación
searchstringFiltrar nombres de TLD que contengan esta cadena
limitintegerResultados máximos por página
offsetintegerNúmero de resultados a omitir
kindstringTipos 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

tldsTldInfo[]
totalintegerTotal de TLD coincidentes (antes de la paginación)
offsetinteger
limitinteger | 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

Dominios

GET/api/domains

Lista 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

domainsDomainRecord[]

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"
POST/api/agents/identity

Reclamar 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*stringEl identificador se convierte en <slug>.domani.run
namestringNombre para mostrar
biostring
emojistringemojis de avatar
emailstring (email)Contacto público (por ejemplo, su bandeja de entrada gratuita @domani.run)
linksobject[]

Respuesta 200

idstringID de identidad estable utilizada para vincular tokens de API con ámbito
slugstring
urlstringEl subdominio de identidad (canónico)
page_urlstringRuta alternativa que siempre funciona
namestring | null
biostring | null
emojistring | null
emailstring | null
linksobject[]
viewsinteger
created_atstring (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": "🤖"}'
GET/api/agents/identity

Enumere las identidades de sus agentes

Enumera las identidades gratuitas (<handle>.domani.run) que has reclamado. Requiere account:read.

Respuesta 200

identitiesAgentIdentity[]
PATCH/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*stringEl identificador para actualizar

Cuerpo de la solicitud

namestring
biostring
emojistring
emailstring
linksobject[]

Respuesta 200

idstringID de identidad estable utilizada para vincular tokens de API con ámbito
slugstring
urlstringEl subdominio de identidad (canónico)
page_urlstringRuta alternativa que siempre funciona
namestring | null
biostring | null
emojistring | null
emailstring | null
linksobject[]
viewsinteger
created_atstring (date-time)
DELETE/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*stringEl mango para soltar

Respuesta 200

successboolean
slugstring
releasedboolean
POST/api/agents/provision

Proporcione 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*stringDominio para entregar al agente. Comprado si aún no lo posee.
slugstringParte local del buzón (hi@domain). Predeterminado "hi".
namestringNombre para mostrar del correo electrónico saliente.
webhook_urlstring (uri)URL HTTPS opcional para recibir correo electrónico entrante + eventos de dominio.
webhook_headersobjectAutenticación de entrega opcional. Los valores se cifran en reposo y nunca se devuelven; las respuestas exponen únicamente header_names.
webhook_eventsstring[]Tipos de eventos de webhook. El valor predeterminado es email.received/delivered/bounced.
payment_methodstring(card | usdc | balance)Cómo pagar el dominio.
payment_txstringHash USDC tx (flujo de dos pasos).
payment_chainstring(base | ethereum)
yearsinteger
max_pricenumberTope 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

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

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"}}'
POST/api/domains/buy

Compra 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

domainstringDominio único para comprar (por ejemplo, mysite.com)
domainsstring[]Variedad de dominios para comprar (máximo 10, requiere tarjeta registrada)
payment_methodstring(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_txstringHash de transacción de un pago en USDC ya enviado en cadena. Requerido en la segunda convocatoria del flujo USDC de dos pasos.
payment_chainstring(base | ethereum)Cadena por la que se envió el pago en USDC (por ejemplo, 'base' o 'ethereum').
yearsintegerNúmero de años para registrarse (1-10, predeterminado 1). El precio se multiplica por años.
max_pricenumberTope 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.
refstringCó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"}'
GET/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*stringNombre de dominio que posee

Respuesta 200

domainstring
statusstring
auto_renewbooleanSi la renovación automática está habilitada
purchased_atstring (date-time)
expires_atstring (date-time)
days_until_expiryintegerDías hasta el vencimiento del dominio
renewal_pricenumber | nullLo 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_methodstringCómo se pagó el dominio
payment_txstring | nullHash de transmisión en cadena (pagos en USDC)
registrantstringQuié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_outobjectTraslado 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_statusstringSi los datos del registrador en vivo se actualizaron o se administraron externamente
registrar_checked_atstring (date-time)Cuando se intentó la actualización del registrador
registrarobject | nullDetalles 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"
PUT/api/domains/{domain}/settings

Actualizar 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*stringNombre de dominio que posee

Cuerpo de la solicitud

auto_renewbooleanSi se debe habilitar la renovación automática para este dominio
whois_privacybooleanSi se debe habilitar la protección de privacidad de WHOIS
security_lockbooleanSi bloquear el dominio contra transferencias

Respuesta 200

domainstring
auto_renewboolean
whois_privacyboolean
security_lockboolean
hintstring

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}'
PUT/api/domains/{domain}/parking

Actualizar 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*stringNombre de dominio

Cuerpo de la solicitud

enabledbooleanYa sea para habilitar la página de parking
listing_pricenumber | nullPrecio de venta en USD o nulo para eliminar el listado

Respuesta 200

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

Reenviar 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*stringNombre de dominio

Cuerpo de la solicitud

url*stringURL de destino (o dominio simple) al que reenviar, p. https://marca.dev
permanentbooleanverdadero = permanente (308, predeterminado), falso = temporal (307)

Respuesta 200

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

Dejar 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*stringNombre de dominio

Respuesta 200

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

Poner 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*stringNombre de dominio para poner a la venta

Cuerpo de la solicitud

price*numberPrecio de venta en USD
descriptionstringDescripción de listado opcional

Respuesta 200

listingobject
hintstring

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."
}
PATCH/api/domains/{domain}/for-sale

Actualizar 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*stringNombre de dominio con listado activo

Cuerpo de la solicitud

pricenumberNuevo precio de venta en USD
descriptionstring | nullNueva descripción (nula para borrar)

Respuesta 200

listingobject
hintstring

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."
}
DELETE/api/domains/{domain}/for-sale

Cancelar 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*stringNombre de dominio para eliminar de la lista

Respuesta 200

domainstring
statusstring
hintstring

Ejemplo de respuesta

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

Obtenga 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*stringNombre de dominio

Respuesta 200

domainstring
views_7dintegerVistas totales de la página en los últimos 7 días
views_30dintegerTotal de visitas a la página en los últimos 30 días
inquiries_30dintegerTotal de consultas en los últimos 30 días
conversion_ratenumberRelación entre consultas y vistas como porcentaje
daily_viewsobject[]Recuentos de vistas diarias de los últimos 30 días
recent_inquiriesobject[]5 consultas más recientes
hintstring

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)."
}
GET/api/domains/{domain}/auth-code

Obtener 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*stringNombre de dominio que posee

Respuesta 200

domainstring
statusstring`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_codestring | nullCódigo de autorización EPP para dar al nuevo registrador. null mientras el estado es requested.
was_unlockedbooleanSi el dominio se desbloqueó para permitir la transferencia
requested_atstring (date-time)Cuándo se solicitó el código (registradores sin API para ello)
expected_bystring (date-time)Cuándo tendrá el equipo de Domani el código como muy tarde (estado requested)
hintstring
next_stepsstring[]
GET/api/domains/{domain}/transfer-away

Obtener 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*stringNombre de dominio que posee

Respuesta 200

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

Verificar 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*stringNombre de dominio que posee

Respuesta 200

domainstring
statusstring
timestampstringMarca de tiempo de la última actualización de estado
hintstringOrientación práctica basada en el estado actual
continuityobjectDelegación capturada y verificación post-transferencia para traslados seguros.
POST/api/domains/import

Importar 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*stringDominio para importar

Respuesta 200

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

Verificar 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*stringDominio a verificar

Respuesta 201

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

Planificar 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*stringDominio existente para inspeccionar, p.e. misitio.com

Respuesta 200

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

Verificar 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*stringDominio a comprobar, p.e. misitio.com

Respuesta 200

domainstring
tldstring
eligibleboolean
pricenumber | nullPrecio de transferencia en USD (nulo si TLD no es compatible)
currencystring
renewal_pricenumberSolo 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.
reasonstringRazón legible por humanos si no es elegible
codestring
eligible_atstring (date)Fecha ISO en la que el dominio se vuelve elegible (período de espera de ICANN)
hintstring
POST/api/domains/transfer-watch

Ver 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*stringDominio a vigilar, p. misitio.com

Respuesta 200

domainstring
eligiblebooleanSi el dominio es actualmente elegible para transferencia
eligible_atstring (date)Fecha ISO en la que el dominio se vuelve elegible (si aún no es elegible)
hintstringOrientación práctica
watchingbooleanSi se ha configurado una notificación
POST/api/domains/transfer

Transferir 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*stringDominio a transferir, p.e. misitio.com
auth_code*stringCódigo de autorización/EPP del proveedor actual
payment_methodstring(card | usdc | balance)Método de pago: 'card' (predeterminado), 'usdc' o 'balance' (crédito del mercado).
payment_txstringHash de transacción de un pago en USDC ya enviado en cadena.
payment_chainstring(base | ethereum)Cadena en la que se envió el pago en USDC.
extra_subdomainsstring[]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_pricenumberTope 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

domainstring
statusstring
expiresstring (date-time)
pricenumber
currencystring
payment_methodstring
payment_txstring
auto_renewboolean
hintstring
dns_snapshotobjectResumen 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_preservedboolean
dns_migrationstring
continuityobject

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"}'
POST/api/domains/{domain}/renew

Renovar 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*stringNombre de dominio que posee

Cuerpo de la solicitud

yearsintegerNúmero de años para renovar (predeterminado 1)
payment_methodstring(card | usdc | balance)Método de pago: 'card' (predeterminado), 'usdc' o 'balance' (crédito del mercado).
payment_txstringHash de transacción de un pago en USDC ya enviado en cadena.
payment_chainstring(base | ethereum)Cadena en la que se envió el pago en USDC.
max_pricenumberTope 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

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

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}'
POST/api/domains/{domain}/buy-aftermarket

Comprar 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*stringEl dominio que figura en el mercado secundario para comprar

Cuerpo de la solicitud

max_pricenumberPrecio 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_methodstring(card | usdc | balance)Método de pago: 'card' (predeterminado), 'usdc' o 'balance' (crédito del mercado).
payment_txstringHash de transacción de un pago en USDC ya enviado en cadena.
payment_chainstring(base | ethereum)Cadena en la que se envió el pago en USDC.

Respuesta 201

domainstring
statusstring'active' cuando se completa la compra, o 'provisioning' mientras finaliza una transferencia por etapas.
pricenumber
currencystring
payment_methodstring
payment_txstring
marketplacestringmercado secundario en el que se compró el dominio (por ejemplo, 'Afternic', 'Sedo').
hintstring
next_stepsstring[]

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

GET/api/domains/{domain}/dns

Obtenga 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*stringNombre de dominio que posee

Respuesta 200

domainstring
recordsDnsRecord[]
zone_versionstringToken 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"
PUT/api/domains/{domain}/dns

Establecer 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*stringNombre de dominio que posee

Cuerpo de la solicitud

records*DnsRecord[]
zone_versionstringEl 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

successboolean
domainstring
recordsDnsRecord[]

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}
  ]}'
GET/api/domains/{domain}/dnssec

Enumere 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*stringNombre de dominio que posee

Respuesta 200

domainstring
enabledbooleanVerdadero cuando se publica al menos un registro DS
recordsDsRecord[]

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"
POST/api/domains/{domain}/dnssec

Publicar 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*stringNombre de dominio que posee

Respuesta 200

successboolean
domainstring
enabledboolean
recordsDsRecord[]

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..."}'
DELETE/api/domains/{domain}/dnssec

Eliminar 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*stringNombre de dominio que posee
keyTag*stringEtiqueta clave del registro DS para eliminar

Respuesta 200

successboolean
domainstring
enabledboolean
recordsDsRecord[]

Ejemplo

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

Capturar 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*stringNombre de dominio que posee

Cuerpo de la solicitud

extra_subdomainsstring[]Subdominios adicionales para incluir en la instantánea

Respuesta 200

domainstring
recordsDnsRecord[]
subdomainsstring[]
sourcesstring[]
capturedAtstring (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"
POST/api/domains/{domain}/dns/restore

Restaurar 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*stringNombre de dominio que posee

Cuerpo de la solicitud

snapshotobjectUn 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_runbooleanSolo vista previa: devuelve lo que la restauración crearía (would_apply) y omitiría, sin escribir nada.

Respuesta 200

domainstring
appliedintegerNúmero de registros creados
skippedintegerNúmero de registros ya presentes
recordCountintegerRegistros totales en la instantánea
errorsstring[]
dry_runbooleanCierto cuando esto era una vista previa: no se escribió nada.
would_applyDnsRecord[]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"
POST/api/domains/{domain}/dns/clone

Clonar 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*stringDominio de destino (DNS está escrito aquí)

Cuerpo de la solicitud

from*stringDominio de origen del que copiar DNS (debe ser tuyo)
replacebooleanEspejo exacto: elimine los registros de destino que la fuente no tiene. Predeterminado: fusionar

Respuesta 200

successboolean
from_domainstring
to_domainstring
recordsDnsRecord[]

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"}'
GET/api/domains/{domain}/nameservers

Obtener 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*stringNombre de dominio que posee

Respuesta 200

domainstring
nameserversstring[]
default_nameserversstring[]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_providerstringQuié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
hintstring

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"
PUT/api/domains/{domain}/nameservers

Configurar 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*stringNombre 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

successboolean
domainstring
nameserversstring[]
hintstring

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

POST/api/domains/{domain}/connect

Conectar 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*stringNombre de dominio que posee

Cuerpo de la solicitud

targetstringURL de destino para la detección automática (por ejemplo, my-app.vercel.app)
providerstringNombre explícito del proveedor (por ejemplo, vercel, google-workspace)
methodstringMétodo de conexión si el proveedor tiene varios (por ejemplo, solo cname)
dry_runbooleanSolo vista previa: devuelve las diferencias (create/replace/already_set/keep) sin escribir nada.
confirm_replace_mxbooleanSe 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

domainstring
providerstring
categorystring
methodstring
recordsDnsRecord[]
docsstring (uri)
statusstringdns_set = registros escritos automáticamente. manual_setup_required = dominio importado, agregue registros en su registrador. dry_run = solo vista previa, nada escrito.
hintstring
next_stepsstring[]Acciones específicas del proveedor que se deben completar después de configurar los registros DNS
diffobjectSolo 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"}'
GET/api/domains/{domain}/connect

Listar 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*stringNombre de dominio que posee

Respuesta 200

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

Verificar 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*stringNombre de dominio que posee

Cuerpo de la solicitud

targetstringObjetivo para la detección automática
providerstringNombre del proveedor
methodstringNombre del método

Respuesta 200

domainstring
providerstring
methodstring
verifiedboolean
messagestring
hintstring
next_stepsstring[]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

GET/api/domains/{domain}/status

Verifique 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*stringNombre de dominio que posee

Respuesta 200

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

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

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

Agregue 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*stringNombre de dominio que posee

Cuerpo de la solicitud

service*stringNombre del servicio (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365)
token*stringToken de verificación proporcionado por el servicio

Respuesta 200

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

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"}'
GET/api/domains/{domain}/verify-service

Listar 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*stringNombre de dominio que posee

Respuesta 200

domainstring
servicesobject[]
hintstring

Descubrimiento

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

Obtener 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

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

Investigar 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
depthstring(instant | deep)Profundidad de la investigación. El valor predeterminado es profundo.

Respuesta 201

profilePublicDomainProfile
GET/api/domains/whoisPúblico

Buscar 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*stringDominio a buscar (por ejemplo, ejemplo.com)

Respuesta 200

domainstring
registeredbooleanSi el dominio está actualmente registrado
registrarstring | nullNombre del registrador actual
registrar_urlstring | nullURL del sitio web del registrador
registrar_iana_idstring | nullID de IANA del registrador (de RDAP publicIds)
createdstring | nullFecha de registro (YYYY-MM-DD)
expiresstring | nullFecha de vencimiento (YYYY-MM-DD)
updatedstring | nullFecha de última actualización (YYYY-MM-DD)
days_until_expiryinteger | nullDías hasta el vencimiento (nulo si no está registrado)
statusstring[]Códigos de estado del EPP
nameserversstring[]Servidores de nombres autorizados
dnssecbooleanSi DNSSEC está habilitado
redactedbooleanSi los datos de WHOIS/RDAP están ocultos por razones de privacidad (GDPR)
contactsobjectInformació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"
GET/api/domains/{domain}/ogPúblico

Obtener 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*stringDominio para recuperar metadatos (por ejemplo, google.com)

Respuesta 200

titlestring | nullTítulo de la página (og:title > twitter:title > <título>)
descriptionstring | nullDescripción de la página (og:description > meta descripción)
imagestring | nullURL de la imagen OG (absoluta)
faviconstring | nullURL de favicon (absoluta)

Ejemplo

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

Facturación

POST/api/billing/setup

Obtener 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

modestring(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

urlstring (uri)URL de Stripe Checkout: ábrela en un navegador para agregar una tarjeta
client_secretstringSecreto de cliente de Stripe SetupIntent, para un frontend que usa Stripe.js directamente
hintstringGuí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"
DELETE/api/billing/card

Eliminar 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

removedboolean

Ejemplo de respuesta

{
  "removed": true
}

Ejemplo

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

Obtener 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

onboardedbooleanEl vendedor ha enviado los detalles de incorporación de Connect
payouts_enabledbooleanLos pagos bancarios están activos
details_submittedboolean
balance_centsintegerSaldo 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"
POST/api/billing/connect

Iniciar 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

urlstring (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"
POST/api/billing/connect/payout

Retirar 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_centsintegerMonto transferido en centavos
transfer_idstringID 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"
GET/api/billing/invoices

Listar 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

limitintegerMáximo de facturas a devolver

Respuesta 200

invoicesobject[]
has_moreboolean
hintstring

Ejemplo

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

Referencias

GET/api/referrals

Obtenga 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_codestringSu código de referencia único para compartir
referral_rateintegerPorcentaje de comisión (actualmente 20%)
total_earned_centsintegerGanancias totales en centavos
total_paid_centsintegerTotal pagado en centavos
total_pending_centsintegerPago pendiente en centavos
referralsobject[]

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

POST/api/backorders

Realizar 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*stringDominio actualmente registrado que se supervisará para intentar registrarlo cuando quede libre.
max_pricenumberImporte máximo en USD que pagarás para registrarlo. El valor predeterminado es el precio de registro actual. Debe ser >= al precio actual.
payment_methodstring(card | balance)Método de pago que se usará si el registro se completa. El predeterminado es tu método preferido.

Respuesta 201

backorderBackorder
hintstring

Ejemplo

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

Enumere sus reservas

Devuelve tus backorders, del más reciente al más antiguo. Filtra por status (watching, caught, failed, cancelled, expired).

Parámetros

statusstring(watching | caught | failed | cancelled | expired)Filtrar por estado.

Respuesta 200

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

Obtener un reserva

Parámetros

id*stringID de reserva.

Respuesta 200

backorderBackorder
DELETE/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*stringID de reserva.

Respuesta 200

idstring
statusstring
hintstring

Mercado

POST/api/domains/sell

Poner 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*stringNombre de dominio para poner a la venta
price*numberPrecio de venta en USD
descriptionstringDescripción de listado opcional

Respuesta 201

listingobject
txt_recordobject | nullRegistro TXT para agregar para verificación de propiedad (solo para dominios externos)
hintstring
POST/api/domains/sell/verify

Verificar 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*stringNombre de dominio para verificar

Respuesta 200

listingobject
hintstring
GET/api/domains/sell/status

Verifique 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*stringNombre de dominio para comprobar

Respuesta 200

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

Lista 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

rolestring(buyer | seller)Filtrar por rol
statusstring(active | escrow_held | epp_pending | transfer_started | completed | refunded | expired)Filtrar por estado ('active' = todo no terminal)
domainstringFiltrar por nombre de dominio
limitintegerNúmero de transacciones a devolver (predeterminado 50, máximo 100)
cursorstringCursor de paginación de una respuesta anterior

Respuesta 200

dealsobject[]
has_morebooleanSi hay más resultados disponibles
next_cursorstring | nullCursor para la página siguiente
POST/api/deals

Comprar 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*stringNombre de dominio para comprar
payment_methodstring(card | usdc | balance)Método de pago: 'card' (predeterminado), 'usdc' o 'balance' (crédito del mercado).

Respuesta 201

dealobject
hintstring
next_stepsstring[]
GET/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*stringID de transacciones

Respuesta 200

dealobject
hintstring
PATCH/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*stringID de transacciones

Cuerpo de la solicitud

auth_code*stringEPP/código de autorización del registrador actual

Respuesta 200

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

Obtenga 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

invoiceDealInvoice
GET/api/negotiations

Enumere 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

rolestring(buyer | seller)Filtrar por tu rol
statusstringFiltrar por estado (open|agreed|completed|declined|expired|cancelled|all)

Respuesta 200

negotiationsNegotiation[]
POST/api/negotiations

Hacer 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*stringEl dominio listado para negociar
offer*numberOferta inicial en USD
messagestringMensaje opcional al vendedor.

Respuesta 201

negotiationNegotiation

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}'
GET/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

negotiationNegotiation
POST/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)
counternumberNuevo monto en USD (obligatorio cuando acción=contador)
messagestring

Respuesta 200

negotiationNegotiation
DELETE/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

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

Finalizar 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_methodstring(card | usdc | balance)
payment_signaturestring | null
payment_txstring
payment_chainstring
confirm_over_budgetbooleanPara transacciones con intermediario: continúa aunque el precio acordado supere el max_budget establecido.
GET/api/broker

Enumere sus solicitudes de corredor

Enumera sus solicitudes de adquisición de dominio y su estado. Requiere alcance deals:read.

Parámetros

statusstringFiltrar por estado o 'all'

Respuesta 200

requestsBrokerRequest[]
POST/api/broker

Solicitar 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*stringEl dominio ya registrado que deseas
max_budgetnumberTu techo en USD (opcional)

Respuesta 201

requestBrokerRequest

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}'
GET/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

requestBrokerRequest
DELETE/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

cancelledboolean
GET/api/broker/respondPúblico

Leer 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*stringEl token de divulgación de su correo electrónico de consulta.

Respuesta 200

domainstring
statusstring
your_turnbooleanYa sea que sea la mudanza del propietario.
current_offer_usdnumber | nullLa oferta del comprador sobre la mesa.
agreed_price_usdnumber | null
actionsstring[]Acciones disponibles ahora (subconjunto de offer/counter/accept/decline/opt_out).

Ejemplo

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

Responder 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*stringEl 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.
pricenumberSu precio de venta en USD (obligatorio para la oferta/contraventana).

Respuesta 200

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

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

POST/api/oauth/register

Registrar 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_namestringSe muestra en la pantalla de consentimiento
token_endpoint_auth_methodstring(none | client_secret_post | client_secret_basic)
client_uristring
logo_uristring

Respuesta 201

client_idstring
client_namestring
redirect_urisstring[]
token_endpoint_auth_methodstring
grant_typesstring[]
response_typesstring[]
client_id_issued_atinteger
client_secretstringSolo para clientes confidenciales; se devuelve una sola vez
POST/api/oauth/token

Punto 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_tokenstring
token_typestring
expires_ininteger
refresh_tokenstring
scopestring