AhaSend SMTP Credentials API
Manage SMTP authentication credentials
Manage SMTP authentication credentials
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.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.curl "https://apis.io/api/v1/apis/ahasend-smtp-credentials-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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.
openapi: 3.2.0
info:
title: AhaSend API v2 Accounts SMTP Credentials API
description: 'The AhaSend API v2 allows you to send transactional emails, manage domains, webhooks, routes, API keys, and view statistics.
## Authentication
All API requests must be authenticated using a Bearer token in the Authorization header:
```
Authorization: Bearer aha-sk-64-CHARACTER-RANDOM-STRING
```
## Scopes
API keys have specific scopes that control access to different resources and actions:
### Message Scopes
- `messages:send:all` - Send messages from any domain in the account
- `messages:send:{domain}` - Send messages from a specific domain
- `messages:cancel:all` - Cancel messages from any domain
- `messages:cancel:{domain}` - Cancel messages from a specific domain
- `messages:read:all` - Read messages from any domain
- `messages:read:{domain}` - Read messages from a specific domain
### Domain Scopes
- `domains:read` - Read all domains
- `domains:write` - Create and update domains
- `domains:delete:all` - Delete any domain
- `domains:delete:{domain}` - Delete a specific domain
### Account Scopes
- `accounts:read` - Read account information
- `accounts:write` - Update account settings
- `accounts:billing` - Access billing information
- `accounts:members:read` - Read account members
- `accounts:members:add` - Add account members
- `accounts:members:update` - Update account members
- `accounts:members:remove` - Remove account members
### Webhook Scopes
- `webhooks:read:all` - Read all webhooks
- `webhooks:read:{domain}` - Read webhooks for a specific domain
- `webhooks:write:all` - Create and update webhooks
- `webhooks:write:{domain}` - Create and update webhooks for a specific domain
- `webhooks:delete:all` - Delete any webhook
- `webhooks:delete:{domain}` - Delete webhooks for a specific domain
### Route Scopes
- `routes:read:all` - Read all routes
- `routes:read:{domain}` - Read routes for a specific domain
- `routes:write:all` - Create and update routes
- `routes:write:{domain}` - Create and update routes for a specific domain
- `routes:delete:all` - Delete any route
- `routes:delete:{domain}` - Delete routes for a specific domain
### Suppression Scopes
- `suppressions:read` - Read suppressions
- `suppressions:write` - Create suppressions
- `suppressions:delete` - Delete suppressions
- `suppressions:wipe` - Delete all suppressions (dangerous)
### SMTP Credentials Scopes
- `smtp-credentials:read:all` - Read all SMTP credentials
- `smtp-credentials:read:{domain}` - Read SMTP credentials for a specific domain
- `smtp-credentials:write:all` - Create SMTP credentials
- `smtp-credentials:write:{domain}` - Create SMTP credentials for a specific domain
- `smtp-credentials:delete:all` - Delete any SMTP credentials
- `smtp-credentials:delete:{domain}` - Delete SMTP credentials for a specific domain
### Statistics Scopes
- `statistics-transactional:read:all` - Read all transactional statistics
- `statistics-transactional:read:{domain}` - Read transactional statistics for a specific domain
### API Key Scopes
- `api-keys:read` - Read API keys
- `api-keys:write` - Create and update API keys
- `api-keys:delete` - Delete API keys
## Rate Limiting
- General API endpoints: 100 requests per second, 200 burst
- Statistics endpoints: 1 request per second, 1 burst
## Pagination
List endpoints use cursor-based pagination with the following parameters:
- `limit`: Maximum number of items to return (default: 100, max: 100)
- `cursor`: Pagination cursor for the next page
## Time Formats
All timestamps must be in RFC3339 format, e.g., `2023-12-25T10:30:00Z`
## Idempotency
POST requests support idempotency through the optional `Idempotency-Key` header. When provided:
- The same request can be safely retried multiple times
- Duplicate requests return the same response with `Idempotent-Replayed: true`
- In-progress requests return HTTP 409 with `Idempotent-Replayed: false`
- Failed requests return HTTP 412 with `Idempotent-Replayed: false`
- Idempotency keys expire after 24 hours
'
version: 2.0.0
contact:
email: support@ahasend.com
license:
name: MIT
identifier: MIT
servers:
- url: https://api.ahasend.com
description: Production server
security:
- BearerAuth: []
tags:
- name: SMTP Credentials
description: Manage SMTP authentication credentials
paths:
/v2/accounts/{account_id}/smtp-credentials:
get:
summary: AhaSend Get SMTP Credentials
description: Returns a list of SMTP credentials for the account
operationId: getSMTPCredentials
tags:
- SMTP Credentials
parameters:
- name: account_id
in: path
required: true
description: Account ID
schema:
type: string
format: uuid
example: '500123'
- name: limit
in: query
description: Maximum number of items to return (1-100)
schema:
type: integer
minimum: 1
maximum: 100
default: 100
example: 1
- name: after
in: query
description: Pagination cursor for the next page. Provide the value provided in `next_cursor` from the response.
schema:
type: string
example: example_value
- name: before
in: query
description: Pagination cursor for the previous page.
schema:
type: string
example: example_value
security:
- BearerAuth:
- smtp-credentials:read:all
- smtp-credentials:read:{domain}
x-code-samples:
- lang: go
label: AhaSend Go SDK
source: "package main\n\nimport (\n \"context\"\n \"fmt\"\n \"log\"\n\n \"github.com/AhaSend/ahasend-go/api\"\n \"github.com/google/uuid\"\n)\n\nfunc main() {\n // Create API client with authentication\n client := api.NewAPIClient(\n api.WithAPIKey(\"aha-sk-your-64-character-key\"),\n )\n\n accountID := uuid.New()\n\n // Create context for the API call\n ctx := context.Background()\n\n // Call the ping endpoint\n response, httpResp, err := client.SMTPCredentialsAPI.GetSMTPCredentials(\n ctx,\n accountID,\n nil,\n nil,\n )\n if err != nil {\n log.Fatalf(\"Error getting SMTP credentials: %v\", err)\n }\n\n // Check response\n if httpResp.StatusCode == 200 {\n fmt.Printf(\"✅ Status: %d\\n\", httpResp.StatusCode)\n if response != nil {\n fmt.Printf(\"SMTP credentials: %#v\\n\", response)\n }\n } else {\n fmt.Printf(\"❌ Unexpected status code: %d\\n\", httpResp.StatusCode)\n }\n}\n"
responses:
'200':
description: List of SMTP credentials
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedSMTPCredentialsResponse'
examples:
getSMTPCredentials200Example:
summary: Default getSMTPCredentials 200 response
x-microcks-default: true
value:
object: list
data:
- {}
pagination:
has_more: {}
next_cursor: {}
previous_cursor: {}
'400':
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredentials400Example:
summary: Default getSMTPCredentials 400 response
x-microcks-default: true
value:
message: example_value
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredentials401Example:
summary: Default getSMTPCredentials 401 response
x-microcks-default: true
value:
message: example_value
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredentials403Example:
summary: Default getSMTPCredentials 403 response
x-microcks-default: true
value:
message: example_value
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredentials500Example:
summary: Default getSMTPCredentials 500 response
x-microcks-default: true
value:
message: example_value
x-microcks-operation:
delay: 0
dispatcher: FALLBACK
post:
summary: AhaSend Create SMTP Credential
description: Creates a new SMTP credential for SMTP authentication
operationId: createSMTPCredential
tags:
- SMTP Credentials
parameters:
- name: account_id
in: path
required: true
description: Account ID
schema:
type: string
format: uuid
example: '500123'
- $ref: '#/components/parameters/IdempotencyKey'
example: example
security:
- BearerAuth:
- smtp-credentials:write:all
- smtp-credentials:write:{domain}
x-code-samples:
- lang: go
label: AhaSend Go SDK
source: "package main\n\nimport (\n \"context\"\n \"fmt\"\n \"log\"\n\n \"github.com/AhaSend/ahasend-go/api\"\n \"github.com/AhaSend/ahasend-go/models/requests\"\n \"github.com/google/uuid\"\n)\n\nfunc main() {\n // Create API client with authentication\n client := api.NewAPIClient(\n api.WithAPIKey(\"aha-sk-your-64-character-key\"),\n )\n\n accountID := uuid.New()\n\n // Create context for the API call\n ctx := context.Background()\n\n // Call the ping endpoint\n response, httpResp, err := client.SMTPCredentialsAPI.CreateSMTPCredential(\n ctx,\n accountID,\n requests.CreateSMTPCredentialRequest{\n Name: \"My SMTP Credential\",\n Scope: \"global\",\n Sandbox: true,\n },\n )\n if err != nil {\n log.Fatalf(\"Error creating SMTP credentials: %v\", err)\n }\n\n // Check response\n if httpResp.StatusCode == 200 {\n fmt.Printf(\"✅ Status: %d\\n\", httpResp.StatusCode)\n if response != nil {\n fmt.Printf(\"Created SMTP credentials: %#v\\n\", response)\n }\n } else {\n fmt.Printf(\"❌ Unexpected status code: %d\\n\", httpResp.StatusCode)\n }\n}\n"
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateSMTPCredentialRequest'
responses:
'201':
description: SMTP credential created successfully
headers:
Idempotent-Replayed:
$ref: '#/components/headers/IdempotentReplayed'
content:
application/json:
schema:
$ref: '#/components/schemas/SMTPCredential'
examples:
createSMTPCredential201Example:
summary: Default createSMTPCredential 201 response
x-microcks-default: true
value:
object: smtp_credential
id: '500123'
created_at: '2025-03-15T14:30:00Z'
updated_at: '2025-03-15T14:30:00Z'
name: Example Name
'400':
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
createSMTPCredential400Example:
summary: Default createSMTPCredential 400 response
x-microcks-default: true
value:
message: example_value
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
createSMTPCredential401Example:
summary: Default createSMTPCredential 401 response
x-microcks-default: true
value:
message: example_value
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
createSMTPCredential403Example:
summary: Default createSMTPCredential 403 response
x-microcks-default: true
value:
message: example_value
'409':
$ref: '#/components/responses/IdempotencyConflict'
'412':
$ref: '#/components/responses/IdempotencyPreconditionFailed'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
createSMTPCredential500Example:
summary: Default createSMTPCredential 500 response
x-microcks-default: true
value:
message: example_value
x-microcks-operation:
delay: 0
dispatcher: FALLBACK
/v2/accounts/{account_id}/smtp-credentials/{smtp_credential_id}:
get:
summary: AhaSend Get SMTP Credential
description: Returns a specific SMTP credential by ID
operationId: getSMTPCredential
tags:
- SMTP Credentials
parameters:
- name: account_id
in: path
required: true
description: Account ID
schema:
type: string
format: uuid
example: '500123'
- name: smtp_credential_id
in: path
required: true
description: SMTP Credential ID
schema:
type: string
format: uuid
example: '500123'
security:
- BearerAuth:
- smtp-credentials:read:all
- smtp-credentials:read:{domain}
x-code-samples:
- lang: go
label: AhaSend Go SDK
source: "package main\n\nimport (\n \"context\"\n \"fmt\"\n \"log\"\n\n \"github.com/AhaSend/ahasend-go/api\"\n \"github.com/google/uuid\"\n)\n\nfunc main() {\n // Create API client with authentication\n client := api.NewAPIClient(\n api.WithAPIKey(\"aha-sk-your-64-character-key\"),\n )\n\n accountID := uuid.New()\n\n // Create context for the API call\n ctx := context.Background()\n\n // Call the ping endpoint\n response, httpResp, err := client.SMTPCredentialsAPI.GetSMTPCredential(\n ctx,\n accountID,\n 123,\n )\n if err != nil {\n log.Fatalf(\"Error getting SMTP credentials: %v\", err)\n }\n\n // Check response\n if httpResp.StatusCode == 200 {\n fmt.Printf(\"✅ Status: %d\\n\", httpResp.StatusCode)\n if response != nil {\n fmt.Printf(\"SMTP credentials: %#v\\n\", response)\n }\n } else {\n fmt.Printf(\"❌ Unexpected status code: %d\\n\", httpResp.StatusCode)\n }\n}\n"
responses:
'200':
description: SMTP credential details
content:
application/json:
schema:
$ref: '#/components/schemas/SMTPCredential'
examples:
getSMTPCredential200Example:
summary: Default getSMTPCredential 200 response
x-microcks-default: true
value:
object: smtp_credential
id: '500123'
created_at: '2025-03-15T14:30:00Z'
updated_at: '2025-03-15T14:30:00Z'
name: Example Name
'400':
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredential400Example:
summary: Default getSMTPCredential 400 response
x-microcks-default: true
value:
message: example_value
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredential401Example:
summary: Default getSMTPCredential 401 response
x-microcks-default: true
value:
message: example_value
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredential403Example:
summary: Default getSMTPCredential 403 response
x-microcks-default: true
value:
message: example_value
'404':
description: SMTP credential not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredential404Example:
summary: Default getSMTPCredential 404 response
x-microcks-default: true
value:
message: example_value
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
getSMTPCredential500Example:
summary: Default getSMTPCredential 500 response
x-microcks-default: true
value:
message: example_value
x-microcks-operation:
delay: 0
dispatcher: FALLBACK
delete:
summary: AhaSend Delete SMTP Credential
description: Deletes an SMTP credential
operationId: deleteSMTPCredential
tags:
- SMTP Credentials
parameters:
- name: account_id
in: path
required: true
description: Account ID
schema:
type: string
format: uuid
example: '500123'
- name: smtp_credential_id
in: path
required: true
description: SMTP Credential ID
schema:
type: string
format: uuid
example: '500123'
security:
- BearerAuth:
- smtp-credentials:delete:all
- smtp-credentials:delete:{domain}
x-code-samples:
- lang: go
label: AhaSend Go SDK
source: "package main\n\nimport (\n \"context\"\n \"fmt\"\n \"log\"\n\n \"github.com/AhaSend/ahasend-go/api\"\n \"github.com/google/uuid\"\n)\n\nfunc main() {\n // Create API client with authentication\n client := api.NewAPIClient(\n api.WithAPIKey(\"aha-sk-your-64-character-key\"),\n )\n\n accountID := uuid.New()\n\n // Create context for the API call\n ctx := context.Background()\n\n // Call the ping endpoint\n response, httpResp, err := client.SMTPCredentialsAPI.DeleteSMTPCredential(\n ctx,\n accountID,\n 123,\n )\n if err != nil {\n log.Fatalf(\"Error deleting SMTP credentials: %v\", err)\n }\n\n // Check response\n if httpResp.StatusCode == 200 {\n fmt.Printf(\"✅ Status: %d\\n\", httpResp.StatusCode)\n if response != nil {\n fmt.Printf(\"Deleted SMTP credentials: %#v\\n\", response)\n }\n } else {\n fmt.Printf(\"❌ Unexpected status code: %d\\n\", httpResp.StatusCode)\n }\n}\n"
responses:
'200':
description: SMTP credential deleted successfully
content:
application/json:
schema:
$ref: '#/components/schemas/SuccessResponse'
examples:
deleteSMTPCredential200Example:
summary: Default deleteSMTPCredential 200 response
x-microcks-default: true
value:
message: example_value
'400':
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
deleteSMTPCredential400Example:
summary: Default deleteSMTPCredential 400 response
x-microcks-default: true
value:
message: example_value
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
deleteSMTPCredential401Example:
summary: Default deleteSMTPCredential 401 response
x-microcks-default: true
value:
message: example_value
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
deleteSMTPCredential403Example:
summary: Default deleteSMTPCredential 403 response
x-microcks-default: true
value:
message: example_value
'404':
description: SMTP credential not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
deleteSMTPCredential404Example:
summary: Default deleteSMTPCredential 404 response
x-microcks-default: true
value:
message: example_value
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
deleteSMTPCredential500Example:
summary: Default deleteSMTPCredential 500 response
x-microcks-default: true
value:
message: example_value
x-microcks-operation:
delay: 0
dispatcher: FALLBACK
components:
schemas:
SuccessResponse:
type: object
required:
- message
properties:
message:
type: string
description: Success message
example: example_value
example:
message: Operation completed successfully
ErrorResponse:
type: object
required:
- message
properties:
message:
type: string
description: Error description
example: example_value
example:
message: Error message
SMTPCredential:
type: object
properties:
object:
type: string
enum:
- smtp_credential
description: Object type identifier
example: smtp_credential
id:
type: string
format: uuid
description: Unique identifier for the SMTP credential
example: '500123'
created_at:
type: string
format: date-time
description: When the credential was created
example: '2025-03-15T14:30:00Z'
updated_at:
type: string
format: date-time
description: When the credential was last updated
example: '2025-03-15T14:30:00Z'
name:
type: string
description: Credential name
example: Example Name
username:
type: string
description: SMTP username
example: Example Name
sandbox:
type: boolean
description: Whether this is a sandbox credential
example: true
scope:
type: string
enum:
- global
- scoped
description: Credential scope
example: global
domains:
type: array
items:
type: string
description: Domains this credential can send from
example:
- mail.example.com
required:
- object
- id
- created_at
- updated_at
- name
- username
- sandbox
- scope
PaginatedSMTPCredentialsResponse:
type: object
required:
- object
- data
- pagination
properties:
object:
type: string
enum:
- list
description: Object type identifier
example: list
data:
type: array
items:
$ref: '#/components/schemas/SMTPCredential'
description: Array of SMTP credentials
example:
- object: smtp_credential
id: '500123'
created_at: '2025-03-15T14:30:00Z'
updated_at: '2025-03-15T14:30:00Z'
name: Example Name
pagination:
$ref: '#/components/schemas/PaginationInfo'
PaginationInfo:
type: object
required:
- has_more
properties:
has_more:
type: boolean
description: Whether there are more items available
example: true
next_cursor:
type: string
description: Cursor for the next page of results
example: example_value
previous_cursor:
type: string
description: Cursor for the previous page of results
example: example_value
example:
has_more: true
next_cursor: eyJpZCI6MTIzNH0=
CreateSMTPCredentialRequest:
type: object
required:
- name
- scope
properties:
name:
type: string
maxLength: 255
description: Credential name
example: Example Name
sandbox:
type: boolean
description: Whether this is a sandbox credential
default: false
example: true
scope:
type: string
enum:
- global
- scoped
description: Credential scope - "global" or "scoped"
example: global
domains:
type: array
items:
type: string
description: Required if scope is "scoped"
example:
- mail.example.com
example:
name: Production SMTP
username: smtp_user
password: secure_password
scope: global
responses:
IdempotencyPreconditionFailed:
description: Original request failed - the request with this idempotency key previously failed and cannot be retried
headers:
Idempotent-Replayed:
$ref: '#/components/headers/IdempotentReplayed'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
message: The original request with this idempotency key failed and cannot be retried
IdempotencyConflict:
description: Request in progress - a request with this idempotency key is already being processed
headers:
Idempotent-Replayed:
$ref: '#/components/headers/IdempotentReplayed'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
message: A request with this idempotency key is already in progress
parameters:
IdempotencyKey:
name: Idempotency-Key
in: header
required: false
description: 'Optional idempotency key for safe request retries. Must be a unique string for each logical request.
Requests with the same key will return the same response. Keys expire after 24 hours.
'
schema:
type: string
maxLength: 255
example: user-12345-create-domain-20240101
headers:
IdempotentReplayed:
description: 'Indicates whether this response is replayed from a previous identical request.
- `true`: Response was replayed from cache (duplicate request)
- `false`: Response from original processing or error state
'
schema:
type: string
enum:
- true
- false
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: aha-sk-64-CHARACTER-RANDOM-STRING
description: API key for authentication