AhaSend · Agentic Access

AhaSend Agentic Access

x-agentic-access generated

AhaSend exposes 44 API operations that an AI agent could call, of which 25 are state-changing ‘acting’ operations. This is a recommended x-agentic-access execution contract — the scope, audience, consequence tier, short-lived token constraints, and escalation each action should carry before it is handed to an autonomous agent.

By consequence: 19 read and 25 physical.

Contracts are classified heuristically from the provider’s OpenAPI and refresh on every APIs.io network build; audience is bound per deployment. The model follows Curity’s Access Intelligence (apidays Munich 2026). Browse every provider’s agent contracts at agentic-access.apis.io.

EmailTransactional EmailDeveloper ToolsSMTPWebhooks
Operations: 44 Acting: 25 Human-in-the-loop: 0 Method: generated

By consequence

read 19 physical 25

Highest-consequence actions

The physical and safety-critical operations an agent could invoke — the ones that most warrant scoped tokens, tight TTLs, and escalation. Full per-operation contracts are in the source below.

MethodPathConsequenceHuman-in-loop
POST /email/send physical conditional
PUT /v2/accounts/{account_id} physical conditional
POST /v2/accounts/{account_id}/api-keys physical conditional
PUT /v2/accounts/{account_id}/api-keys/{key_id} physical conditional
DELETE /v2/accounts/{account_id}/api-keys/{key_id} physical conditional
POST /v2/accounts/{account_id}/domains physical conditional
PUT /v2/accounts/{account_id}/domains/{domain} physical conditional
DELETE /v2/accounts/{account_id}/domains/{domain} physical conditional
POST /v2/accounts/{account_id}/domains/{domain}/check-dns physical conditional
POST /v2/accounts/{account_id}/members physical conditional
DELETE /v2/accounts/{account_id}/members/{user_id} physical conditional
POST /v2/accounts/{account_id}/messages physical conditional
POST /v2/accounts/{account_id}/messages/conversation physical conditional
DELETE /v2/accounts/{account_id}/messages/{message_id}/cancel physical conditional
POST /v2/accounts/{account_id}/routes physical conditional
PUT /v2/accounts/{account_id}/routes/{route_id} physical conditional
DELETE /v2/accounts/{account_id}/routes/{route_id} physical conditional
POST /v2/accounts/{account_id}/smtp-credentials physical conditional
DELETE /v2/accounts/{account_id}/smtp-credentials/{smtp_credential_id} physical conditional
POST /v2/accounts/{account_id}/suppressions physical conditional
DELETE /v2/accounts/{account_id}/suppressions physical conditional
DELETE /v2/accounts/{account_id}/suppressions/all physical conditional
POST /v2/accounts/{account_id}/webhooks physical conditional
PUT /v2/accounts/{account_id}/webhooks/{webhook_id} physical conditional
DELETE /v2/accounts/{account_id}/webhooks/{webhook_id} physical conditional

Source

Agentic Access

Raw ↑
generated: '2026-07-15'
method: generated
source: openapi/ahasend-openapi-v2.yaml, openapi/ahasend-openapi.yml
description: Recommended x-agentic-access execution contracts, classified heuristically from
  the OpenAPI. A governance starting point for exposing this API to AI agents — review and bind
  audience per deployment. See research/curity/agentic-governance/.
summary:
  operations: 44
  by_action_class:
    connected: 19
    acting: 25
  by_consequence:
    read: 19
    physical: 25
  human_in_the_loop_required: 0
operations:
- path: /v2/ping
  method: get
  operationId: ping
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/api-keys
  method: get
  operationId: getAPIKeys
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - api-keys:read
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/api-keys
  method: post
  operationId: createAPIKey
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - api-keys:write
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/api-keys/{key_id}
  method: get
  operationId: getAPIKey
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - api-keys:read
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/api-keys/{key_id}
  method: put
  operationId: updateAPIKey
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - api-keys:write
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/api-keys/{key_id}
  method: delete
  operationId: deleteAPIKey
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - api-keys:delete
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/domains
  method: get
  operationId: getDomains
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - domains:read
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/domains
  method: post
  operationId: createDomain
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - domains:write
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/domains/{domain}
  method: get
  operationId: getDomain
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - domains:read
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/domains/{domain}
  method: put
  operationId: updateDomain
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - domains:write
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/domains/{domain}
  method: delete
  operationId: deleteDomain
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - domains:delete:all
    - domains:delete:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/domains/{domain}/check-dns
  method: post
  operationId: checkDomainDNS
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - domains:write
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/messages
  method: get
  operationId: getMessages
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - messages:read:all
    - messages:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/messages
  method: post
  operationId: createMessage
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - messages:send:all
    - messages:send:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/messages/conversation
  method: post
  operationId: createConversationMessage
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - messages:send:all
    - messages:send:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/messages/{message_id}
  method: get
  operationId: getMessage
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - messages:read:all
    - messages:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/messages/{message_id}/cancel
  method: delete
  operationId: cancelMessage
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - messages:cancel:all
    - messages:cancel:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}
  method: get
  operationId: getAccount
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - accounts:read
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}
  method: put
  operationId: updateAccount
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - accounts:write
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/members
  method: get
  operationId: getAccountMembers
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - accounts:members:read
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/members
  method: post
  operationId: addAccountMember
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - accounts:members:add
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/members/{user_id}
  method: delete
  operationId: removeAccountMember
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - accounts:members:remove
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/suppressions
  method: get
  operationId: getSuppressions
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - suppressions:read
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/suppressions
  method: post
  operationId: createSuppression
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - suppressions:write
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/suppressions
  method: delete
  operationId: deleteSuppression
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - suppressions:delete
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/suppressions/all
  method: delete
  operationId: deleteAllSuppressions
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - suppressions:wipe
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/routes
  method: get
  operationId: getRoutes
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - routes:read:all
    - routes:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/routes
  method: post
  operationId: createRoute
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - routes:write:all
    - routes:write:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/routes/{route_id}
  method: get
  operationId: getRoute
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - routes:read:all
    - routes:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/routes/{route_id}
  method: put
  operationId: updateRoute
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - routes:write:all
    - routes:write:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/routes/{route_id}
  method: delete
  operationId: deleteRoute
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - routes:delete:all
    - routes:delete:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/webhooks
  method: get
  operationId: getWebhooks
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - webhooks:read:all
    - webhooks:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/webhooks
  method: post
  operationId: createWebhook
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - webhooks:write:all
    - webhooks:write:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/webhooks/{webhook_id}
  method: get
  operationId: getWebhook
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - webhooks:read:all
    - webhooks:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/webhooks/{webhook_id}
  method: put
  operationId: updateWebhook
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - webhooks:write:all
    - webhooks:write:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/webhooks/{webhook_id}
  method: delete
  operationId: deleteWebhook
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - webhooks:delete:all
    - webhooks:delete:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/smtp-credentials
  method: get
  operationId: getSMTPCredentials
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - smtp-credentials:read:all
    - smtp-credentials:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/smtp-credentials
  method: post
  operationId: createSMTPCredential
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - smtp-credentials:write:all
    - smtp-credentials:write:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/smtp-credentials/{smtp_credential_id}
  method: get
  operationId: getSMTPCredential
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - smtp-credentials:read:all
    - smtp-credentials:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/smtp-credentials/{smtp_credential_id}
  method: delete
  operationId: deleteSMTPCredential
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - smtp-credentials:delete:all
    - smtp-credentials:delete:{domain}
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required
- path: /v2/accounts/{account_id}/statistics/transactional/deliverability
  method: get
  operationId: getDeliverabilityStatistics
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - statistics-transactional:read:all
    - statistics-transactional:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/statistics/transactional/bounce
  method: get
  operationId: getBounceStatistics
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - statistics-transactional:read:all
    - statistics-transactional:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /v2/accounts/{account_id}/statistics/transactional/delivery-time
  method: get
  operationId: getDeliveryTimeStatistics
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    scope:
    - statistics-transactional:read:all
    - statistics-transactional:read:{domain}
    token:
      max-ttl: 3600
    audit: none
- path: /email/send
  method: post
  operationId: sendEmail
  x-agentic-access:
    action-class: acting
    consequence: physical
    subject: required
    scope:
    - read:email
    - write:email
    audience: null
    token:
      max-ttl: 300
      exchange: true
      purpose-required: true
    escalation:
      human-in-the-loop: conditional
      triggers:
      - abnormal
      - high-value
    audit: required