Provision private email aliases, inspect forwarding telemetry, update delivery rules, and manage address lifecycles.
Quick Reference
| Endpoint | Method | Scope | Purpose |
|---|---|---|---|
/v1/aliases | GET | aliases:read | List active, paused, or trashed aliases |
/v1/aliases | POST | aliases:write | Create a new alias with custom or randomized local parts |
/v1/aliases/check-availability | GET | aliases:read | Check whether a specific alias address is available |
/v1/aliases/stats | GET | aliases:read | Retrieve aggregate counts (active, paused, trashed) |
/v1/aliases/:id | GET | aliases:read | Retrieve detailed configuration and metrics for a single alias |
/v1/aliases/:id | PATCH | aliases:write | Update alias state, label, note, or destination routing |
/v1/aliases/:id | DELETE | aliases:write | Move an alias to trash (soft-delete) or purge permanently |
/v1/aliases/:id/restore | POST | aliases:write | Restore a trashed alias back to active routing |
GET /v1/aliases — List Aliases
Scope: aliases:read · Rate Limit: 60/min · Idempotent: Yes
Retrieves a paginated list of email aliases for your workspace. Results can be filtered by operational status, category folder, or domain.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
status | string | No | active | Filter by status: 'active', 'paused', 'trash', or 'all'. |
page | integer | No | 1 | Page number to retrieve (1-indexed). |
limit | integer | No | 20 | Number of items per page (min 1, max 100). |
domain_id | string | No | — | Filter aliases under a specific domain (dom_...). |
category_id | string | No | — | Filter aliases assigned to a category (acat_...). |
search | string | No | — | Fuzzy search across local_part, label, or note. |
Example Request
curl -X GET "https://api.aliasfleet.com/v1/aliases?status=active&limit=2" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e" \
-H "Accept: application/json"
Response (200 OK)
{
"aliases": [
{
"id": "al_6c5J5LMXd5E3Yq1Wx1zN",
"address": "billing-support@company.com",
"local_part": "billing-support",
"domain": "company.com",
"domain_id": "dom_bXm9kLpQr2nVwYz3",
"label": "Billing Inquiries",
"note": "Shared alias for customer invoices",
"is_active": true,
"status": "active",
"emails_forwarded": 142,
"emails_blocked": 3,
"emails_replied": 12,
"emails_sent": 0,
"forward_to_email": "ops@company.com",
"category_id": "acat_cYn0mMqRs3oWxZa4",
"created_at": "2026-07-01T12:00:00.000Z",
"updated_at": "2026-08-15T09:30:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 2,
"total": 48,
"total_pages": 24,
"has_more": true
}
}
Errors
| Status | Code | Cause & Resolution |
|---|---|---|
401 Unauthorized | UNAUTHORIZED | Missing or invalid API key. |
429 Too Many Requests | RATE_LIMIT_EXCEEDED | Request threshold reached. |
POST /v1/aliases — Create Alias
Scope: aliases:write · Rate Limit: 10/min · Idempotent: Yes (with Idempotency-Key)
Provisions a new email alias. If local_part is omitted, the API generates a cryptographically random 8-character string. If destinations or forward_to_email is omitted, the alias routes to your account's default destination.
Request Body Parameters
| Parameter | Type | Required | Constraints | Description |
|---|---|---|---|---|
local_part | string | No | 1–64 chars; [a-z0-9._-] | Desired address prefix. If omitted, generates random string. |
domain_id | string | No | Valid dom_ ID | Target domain. If omitted, uses default account domain. |
domain | string | No | Valid FQDN | Alternative to domain_id. Matches by domain name. |
forward_to_email | string | No | Valid email address | Primary destination inbox. Must be verified on account. |
destinations | array | No | Array of strings | Multi-inbox forward targets (verified emails or dest_ IDs). |
label | string | No | Max 100 chars | Human-readable alias title. |
note | string | No | Max 500 chars | Internal contextual description. |
category_id | string | No | Valid acat_ ID | Folder category to assign the alias to. |
Example Request
curl -X POST "https://api.aliasfleet.com/v1/aliases" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: e6b48325-1e9a-4c26-8ff5-0e31846b9a21" \
-d '{
"local_part": "stripe-billing",
"domain_id": "dom_bXm9kLpQr2nVwYz3",
"label": "Stripe Invoices",
"forward_to_email": "finance@company.com"
}'
Response (201 Created)
{
"alias": {
"id": "al_6c5J5LMXd5E3Yq1Wx1zN",
"address": "stripe-billing@company.com",
"local_part": "stripe-billing",
"domain": "company.com",
"domain_id": "dom_bXm9kLpQr2nVwYz3",
"label": "Stripe Invoices",
"note": null,
"is_active": true,
"status": "active",
"forward_to_email": "finance@company.com",
"emails_forwarded": 0,
"emails_blocked": 0,
"emails_replied": 0,
"emails_sent": 0,
"created_at": "2026-09-04T12:00:00.000Z"
}
}
Errors
| Status | Code | Cause & Resolution |
|---|---|---|
400 Bad Request | INVALID_FORMAT | Local part contains uppercase letters, spaces, or illegal punctuation. |
400 Bad Request | RESERVED_PREFIX | System prefixes (admin, support, abuse) are blocked on shared domains. |
403 Forbidden | QUOTA_EXCEEDED | Active alias limit reached for your plan tier. Upgrade plan to expand headroom. |
409 Conflict | ALIAS_EXISTS | The specified local_part and domain combination is already registered. |
422 Unprocessable | UNVERIFIED_DESTINATION | The target forwarding inbox has not completed OTP verification. |
429 Too Many Requests | RATE_LIMIT_EXCEEDED | Exceeded 10 alias creations / minute limit. Check Retry-After. |
GET /v1/aliases/check-availability — Check Availability
Scope: aliases:read · Rate Limit: 60/min · Idempotent: Yes
Pre-flight endpoint to verify whether a desired alias address is available before attempting creation.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
local_part | string | Yes | Prefix to check (e.g. newsletter). |
domain_id | string | No | Domain to check against. If omitted, uses default domain. |
domain | string | No | Domain name string alternative to domain_id. |
Example Request
curl -X GET "https://api.aliasfleet.com/v1/aliases/check-availability?local_part=newsletter&domain=company.com" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e" \
-H "Accept: application/json"
Response (200 OK)
{
"available": true,
"address": "newsletter@company.com",
"local_part": "newsletter",
"domain": "company.com"
}
GET /v1/aliases/stats — Aggregate Statistics
Scope: aliases:read · Rate Limit: 60/min · Idempotent: Yes
Retrieves summary totals of your workspace aliases partitioned by operational status.
Example Request
curl -X GET "https://api.aliasfleet.com/v1/aliases/stats" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e" \
-H "Accept: application/json"
Response (200 OK)
{
"total": 52,
"active": 45,
"paused": 4,
"trash": 3
}
GET /v1/aliases/:id — Retrieve Alias
Scope: aliases:read · Rate Limit: 60/min · Idempotent: Yes
Retrieves the full record and forwarding telemetry for a specific alias.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique alias identifier (al_...). |
Example Request
curl -X GET "https://api.aliasfleet.com/v1/aliases/al_6c5J5LMXd5E3Yq1Wx1zN" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e" \
-H "Accept: application/json"
Response (200 OK)
{
"alias": {
"id": "al_6c5J5LMXd5E3Yq1Wx1zN",
"address": "stripe-billing@company.com",
"local_part": "stripe-billing",
"domain": "company.com",
"domain_id": "dom_bXm9kLpQr2nVwYz3",
"label": "Stripe Invoices",
"note": "Billing receipts",
"is_active": true,
"status": "active",
"forward_to_email": "finance@company.com",
"emails_forwarded": 38,
"emails_blocked": 1,
"emails_replied": 0,
"emails_sent": 0,
"created_at": "2026-07-01T12:00:00.000Z"
}
}
Errors
| Status | Code | Cause & Resolution |
|---|---|---|
404 Not Found | ALIAS_NOT_FOUND | Alias does not exist or belongs to another workspace. |
PATCH /v1/aliases/:id — Update Alias
Scope: aliases:write · Rate Limit: 60/min · Idempotent: Yes
Modifies metadata, destination routing, or delivery status for an alias.
Request Body Parameters
| Parameter | Type | Description |
|---|---|---|
is_active | boolean | Set false to pause forwarding, true to resume. |
label | string | null | Display name for the alias. Max 100 chars. Set null to clear. |
note | string | null | Internal notes. Max 500 chars. Set null to clear. |
category_id | string | null | Folder category ID (acat_...). Set null to unassign. |
forward_to_email | string | New destination inbox. Must be verified on your account. |
Example Request
curl -X PATCH "https://api.aliasfleet.com/v1/aliases/al_6c5J5LMXd5E3Yq1Wx1zN" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e" \
-H "Content-Type: application/json" \
-d '{
"is_active": false,
"label": "Paused Billing Alias"
}'
Response (200 OK)
{
"alias": {
"id": "al_6c5J5LMXd5E3Yq1Wx1zN",
"address": "stripe-billing@company.com",
"is_active": false,
"status": "paused",
"label": "Paused Billing Alias"
}
}
Errors
| Status | Code | Cause & Resolution |
|---|---|---|
400 Bad Request | ALIAS_TRASHED | Cannot modify settings on an alias in trash. Restore it first. |
404 Not Found | ALIAS_NOT_FOUND | Alias ID does not exist. |
DELETE /v1/aliases/:id — Delete or Trash Alias
Scope: aliases:write · Rate Limit: 60/min · Idempotent: Yes
Moves an alias to trash (soft-delete) or purges it permanently. Trashed aliases drop incoming emails immediately but can be restored.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
permanent | boolean | No | false | When true, permanently deletes the alias and purges all records. |
Example: Move to Trash (Soft-Delete)
curl -X DELETE "https://api.aliasfleet.com/v1/aliases/al_6c5J5LMXd5E3Yq1Wx1zN" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e"
{
"success": true,
"message": "Alias moved to trash",
"alias": {
"id": "al_6c5J5LMXd5E3Yq1Wx1zN",
"status": "trash",
"deleted_at": "2026-09-04T12:30:00.000Z"
}
}
Example: Permanent Purge
curl -X DELETE "https://api.aliasfleet.com/v1/aliases/al_6c5J5LMXd5E3Yq1Wx1zN?permanent=true" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e"
{
"success": true,
"message": "Alias permanently deleted"
}
Permanent deletion purges routing rules and analytics history. The address cannot be recovered once purged.
POST /v1/aliases/:id/restore — Restore Trashed Alias
Scope: aliases:write · Rate Limit: 60/min · Idempotent: Yes
Restores an alias from trash back to active status, re-enabling email forwarding and metrics tracking.
Example Request
curl -X POST "https://api.aliasfleet.com/v1/aliases/al_6c5J5LMXd5E3Yq1Wx1zN/restore" \
-H "Authorization: Bearer afp_4a8f9c1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e"
Response (200 OK)
{
"success": true,
"message": "Alias restored successfully",
"alias": {
"id": "al_6c5J5LMXd5E3Yq1Wx1zN",
"is_active": true,
"status": "active",
"deleted_at": null
}
}
Errors
| Status | Code | Cause & Resolution |
|---|---|---|
400 Bad Request | NOT_IN_TRASH | The alias is not currently in trash. |
403 Forbidden | QUOTA_EXCEEDED | Cannot restore alias because active plan quota has been reached. |
404 Not Found | ALIAS_NOT_FOUND | Alias ID does not exist. |