AhaSend · OAuth Scopes

AhaSend OAuth Scopes

OAuth 2.0 searched

AhaSend uses OAuth 2.0 but publishes no discrete scopes — access is governed by the grant itself (e.g. client-credentials or role-based authorization) rather than per-scope consent.

This index is generated from the provider’s OpenAPI security definitions (and, where available, its documented scope reference) and refreshes on every APIs.io network build. Browse every provider’s scopes at scopes.apis.io.

EmailTransactional EmailDeveloper ToolsSMTPWebhook
Scopes: 0 Flows: Method: searched

Scopes (0)

AhaSend implements OAuth 2.0 but publishes no discrete scopes — access is governed by the grant itself (client-credentials or role-based authorization) rather than per-scope consent.

Source

OAuth Scopes

Raw ↑
generated: '2026-08-30'
method: searched
source: https://ahasend.com/docs/api-reference/scopes
docs: https://ahasend.com/docs/api-reference/scopes
sources:
  - https://ahasend.com/docs/api-reference/scopes.md
  - https://ahasend.com/docs/security/scoped-credentials.md
  - https://ahasend.com/docs/api-reference/sub-accounts/overview.md
  - openapi/_original/ahasend-openapi-v2.yaml
provider: AhaSend
providerId: ahasend
scheme: api-key-scopes
oauth2: false
scheme_note: >-
  IMPORTANT — these are NOT OAuth 2.0 scopes. AhaSend declares a single `BearerAuth` HTTP bearer
  scheme in its OpenAPI and no oauth2 flow anywhere. What it does publish is a granular
  authorization model attached to each API key, and the OpenAPI carries those role names as the
  VALUES of its per-operation security requirements — the contract's own words: "Non-empty
  Security Requirement values are AhaSend API-key roles. Roles listed within one requirement
  object are jointly required; separate requirement objects are alternatives." The file is filed
  under scopes/ because that is what the model is; the label OAuthScopes on the apis.yml pointer
  is the catalog's canonical string, not a claim that AhaSend runs OAuth.
oidc:
  supported: true
  role: relying-party
  note: >-
    AhaSend supports OpenID Connect SSO (with PKCE and multi-domain support) for DASHBOARD login
    on the Max plan. It consumes a customer's identity provider; it does not issue OAuth tokens
    for its API.
  docs: https://ahasend.com/docs/security/sso.md
scope_kinds:
  - kind: static
    description: Fixed account-level permissions, e.g. accounts:read, domains:write.
  - kind: global
    description: Ends with :all, covering every domain in the account, e.g. messages:send:all.
  - kind: domain-specific
    description: Restricted to one domain, e.g. messages:send:{example.com}.
  - kind: wildcard
    value: '*'
    description: Grants everything. AhaSend advises using it only for development and testing.
scope_count: 51
scopes:
  - {name: 'accounts:read', description: Read account information}
  - {name: 'accounts:write', description: Update account settings}
  - {name: 'accounts:billing', description: Access billing information}
  - {name: 'accounts:members:read', description: View account members}
  - {name: 'accounts:members:add', description: Add new account members}
  - {name: 'accounts:members:update', description: Update member permissions}
  - {name: 'accounts:members:remove', description: Remove account members}
  - {name: 'domains:read', description: List and view domain information}
  - {name: 'domains:write', description: Add and update domains}
  - {name: 'domains:delete:{domain}', description: Delete a specific domain, kind: domain-specific, note: Domain deletion has no global form — a :all scope cannot delete a domain.}
  - {name: 'messages:send:all', description: Send messages from any domain, kind: global}
  - {name: 'messages:send:{domain}', description: Send messages from a specific domain, kind: domain-specific}
  - {name: 'messages:cancel:all', description: Cancel messages from any domain, kind: global}
  - {name: 'messages:cancel:{domain}', description: Cancel messages from a specific domain, kind: domain-specific}
  - {name: 'messages:read:all', description: Read messages from any domain, kind: global}
  - {name: 'messages:read:{domain}', description: Read messages from a specific domain, kind: domain-specific}
  - {name: 'webhooks:read:all', description: Read webhooks for all domains, kind: global}
  - {name: 'webhooks:write:all', description: Create/update webhooks for all domains, kind: global}
  - {name: 'webhooks:delete:all', description: Delete webhooks for all domains, kind: global}
  - {name: 'webhooks:read:{domain}', description: Read webhooks for a specific domain, kind: domain-specific}
  - {name: 'webhooks:write:{domain}', description: Create/update webhooks for a specific domain, kind: domain-specific}
  - {name: 'webhooks:delete:{domain}', description: Delete webhooks for a specific domain, kind: domain-specific}
  - {name: 'routes:read:all', description: Read routes for all domains, kind: global}
  - {name: 'routes:write:all', description: Create/update routes for all domains, kind: global}
  - {name: 'routes:delete:all', description: Delete routes for all domains, kind: global}
  - {name: 'routes:read:{domain}', description: Read routes for a specific domain, kind: domain-specific}
  - {name: 'routes:write:{domain}', description: Create/update routes for a specific domain, kind: domain-specific}
  - {name: 'routes:delete:{domain}', description: Delete routes for a specific domain, kind: domain-specific}
  - {name: 'smtp-credentials:read:all', description: Read SMTP credentials for all domains, kind: global}
  - {name: 'smtp-credentials:write:all', description: Create/update SMTP credentials for all domains, kind: global}
  - {name: 'smtp-credentials:delete:all', description: Delete SMTP credentials for all domains, kind: global}
  - {name: 'smtp-credentials:read:{domain}', description: Read SMTP credentials for a specific domain, kind: domain-specific}
  - {name: 'smtp-credentials:write:{domain}', description: Create/update SMTP credentials for a specific domain, kind: domain-specific}
  - {name: 'smtp-credentials:delete:{domain}', description: Delete SMTP credentials for a specific domain, kind: domain-specific}
  - {name: 'suppressions:read', description: View suppression lists}
  - {name: 'suppressions:write', description: Add suppressions}
  - {name: 'suppressions:delete', description: Remove specific suppressions}
  - {name: 'suppressions:wipe', description: Clear the entire suppression list, note: Separated from suppressions:delete on purpose — the wipe is irreversible.}
  - {name: 'api-keys:read', description: List and view API keys}
  - {name: 'api-keys:write', description: Create and update API keys}
  - {name: 'api-keys:delete', description: Delete API keys}
  - {name: 'sub-accounts:read', description: List and read sub accounts under the parent}
  - {name: 'sub-accounts:write', description: Create and update sub accounts}
  - {name: 'sub-accounts:delete', description: Soft-delete sub accounts}
  - {name: 'sub-accounts:suspend', description: Suspend and unsuspend sub accounts}
  - {name: 'sub-accounts:usage', description: Read per-sub-account usage and allocated cost}
  - {name: 'sub-account-api-keys:read', description: List and read API keys owned by sub accounts}
  - {name: 'sub-account-api-keys:write', description: Create and update API keys owned by sub accounts}
  - {name: 'sub-account-api-keys:delete', description: Delete API keys owned by sub accounts}
  - {name: 'statistics-transactional:read:all', description: Read statistics for all domains, kind: global}
  - {name: 'statistics-transactional:read:{domain}', description: Read statistics for a specific domain, kind: domain-specific}
enforcement_notes:
  - >-
    Scopes are enforced per operation and, for domain-scoped keys, per resource — a route or
    webhook is authorized against the domain it belongs to, not just against the caller.
  - >-
    Sub-account API keys are managed only with PARENT credentials holding the relevant
    sub-account-api-keys:* scope. A sub account's own credentials cannot create or manage its
    nested keys.
  - >-
    Scopes compose with IP allow lists: a key outside its allow list is rejected on every
    endpoint regardless of the scopes it holds.
  - >-
    A scope failure and an IP-allow-list failure both return HTTP 403 with a free-text message
    and no machine-distinguishable marker.
maintainers:
  - FN: Kin Lane
    email: kin@apievangelist.com

Work with this as data

Every scope set here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for oauth scopes

4 MCP tools reach this
  • find_scopesBrowse and filter every scope set in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This scope set
curl "https://apis.io/api/v1/scopes/ahasend-scopes"
All oauth scopes
curl "https://apis.io/api/v1/scopes?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.