Inboxes
Create and manage temporary email inboxes. Each inbox has a unique address and automatically expires.
Response 201
| Field | Type | Description |
|---|---|---|
id | string | Unique inbox identifier |
address | string | Full email address |
domain | string | Email domain |
expiresAt | string | ISO 8601 expiration timestamp |
createdAt | string | ISO 8601 creation timestamp |
{
"id": "cpxNbXpHRKxH9U6ff8nBE",
"address": "tmp_8hf2@destroy.network",
"domain": "destroy.network",
"expiresAt": "2025-01-30T12:00:00.000Z",
"createdAt": "2025-01-29T12:00:00.000Z"
}Errors
| Status | Message |
|---|---|
| 403 | PLAN_LIMIT_EXCEEDED - active inbox count for the user's plan has been reached |
| 429 | RATE_LIMIT_EXCEEDED - anonymous hourly creation cap reached |
| 429 | ANON_ACTIVE_LIMIT - anonymous user already has an active inbox (cap of 1) |
| 429 | HOURLY_LIMIT_EXCEEDED - signed-in user hit the per-tier hourly creation cap |
Rate Limits
Code Examples
# Public (no auth required)
curl -X POST https://destroy.network/api/inbox
# With API key (higher limits)
curl -X POST https://destroy.network/api/inbox \
-H "Authorization: Bearer sk_live_your_api_key"When authenticated, inbox is linked to your account.
Anonymous: 3 active inboxes at a time, 3 created per hour per IP.
Free (signed in): 3 active, 5 created per hour.
Pro: 10 active, unlimited creations per hour.
Business: 50 active, unlimited creations per hour.
Error responses include signupCta: true (anonymous) or upgradeCta: true (authenticated free) to signal which CTA to surface.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Inbox ID |
Response 200
| Field | Type | Description |
|---|---|---|
id | string | Unique inbox identifier |
address | string | Full email address |
domain | string | Email domain |
expiresAt | string | ISO 8601 expiration timestamp |
createdAt | string | ISO 8601 creation timestamp |
extensionCount | number | Number of extensions used |
maxExtensions | number | null | Maximum extensions allowed (null = unlimited) |
canExtend | boolean | Whether more extensions are available |
forwardTo | string | null | Email address for forwarding (Pro/Business only) |
canForward | boolean | Whether forwarding is available on user's plan |
{
"id": "cpxNbXpHRKxH9U6ff8nBE",
"address": "tmp_8hf2@destroy.network",
"domain": "destroy.network",
"expiresAt": "2025-01-30T12:00:00.000Z",
"createdAt": "2025-01-29T12:00:00.000Z",
"extensionCount": 0,
"maxExtensions": 1,
"canExtend": true,
"forwardTo": null,
"canForward": true
}Errors
| Status | Message |
|---|---|
| 404 | Inbox not found |
| 410 | Inbox has expired |
Rate Limits
Code Examples
curl https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBEPath Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Inbox ID |
Response 200
{
"success": true
}Errors
| Status | Message |
|---|---|
| 404 | Inbox not found |
Rate Limits
Code Examples
curl -X DELETE https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE/api/inbox/{id}/extendExtend Inbox
Extend the expiration time of an inbox by 10 minutes.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Inbox ID |
Response 200
| Field | Type | Description |
|---|---|---|
extensionCount | number | Number of extensions used |
maxExtensions | number | null | Maximum extensions (null = unlimited) |
canExtend | boolean | Whether more extensions are available |
{
"id": "cpxNbXpHRKxH9U6ff8nBE",
"address": "tmp_8hf2@destroy.network",
"domain": "destroy.network",
"expiresAt": "2025-01-30T12:10:00.000Z",
"createdAt": "2025-01-29T12:00:00.000Z",
"extensionCount": 1,
"maxExtensions": 1,
"canExtend": false
}Errors
| Status | Message |
|---|---|
| 403 | EXTENSION_LIMIT_REACHED - count cap hit (Free / anonymous: 1 extension per inbox) |
| 403 | LIFETIME_LIMIT_REACHED - Pro/Business only: inbox aged past the plan's total lifetime ceiling (1 days Pro, 3 days Business) |
| 429 | EXTEND_TOO_EARLY - Pro/Business only: cooldown active, response includes `availableAt` so the UI can show a countdown |
| 404 | Inbox not found |
Rate Limits
Code Examples
# Public (1 extension limit)
curl -X POST https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE/extend
# With API key (unlimited on Pro/Business)
curl -X POST https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE/extend \
-H "Authorization: Bearer sk_live_your_api_key"Free / unauthenticated: 1 extension allowed of 10 minutes. The single count cap is the sole gate; there is no cooldown or lifetime ceiling on this tier. After the one allowed extension, canExtend becomes false and a follow-up call returns 403 EXTENSION_LIMIT_REACHED.
Pro: unlimited extensions of 30 minutes each. Cooldown: must have <=15 minutes remaining before each extend. Hard ceiling: 1 days total per inbox.
Business: unlimited extensions of 60 minutes each. Cooldown: must have <=30 minutes remaining before each extend. Hard ceiling: 3 days total per inbox.
After a successful extend on Pro/Business the cooldown is active, so canExtend: false is returned with extendAvailableAt set to the unlock time. On Free, canExtend: false reflects the count cap rather than a cooldown, and extendAvailableAt is null.
/api/inbox/{id}Set Forwarding
Configure email forwarding for an inbox. When enabled, all incoming emails are automatically forwarded to the specified address.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Inbox ID |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
forwardTo | string | null | Yes | Email address to forward to, or null to disable |
{
"forwardTo": "your@email.com"
}Response 200
| Field | Type | Description |
|---|---|---|
forwardTo | string | null | Current forwarding address |
message | string | Confirmation message |
{
"id": "cpxNbXpHRKxH9U6ff8nBE",
"address": "tmp_8hf2@destroy.network",
"domain": "destroy.network",
"forwardTo": "your@email.com",
"expiresAt": "2025-01-30T12:00:00.000Z",
"createdAt": "2025-01-29T12:00:00.000Z",
"message": "Emails will now be forwarded to your@email.com"
}Errors
| Status | Message |
|---|---|
| 401 | Email forwarding requires a logged-in account |
| 403 | Email forwarding is available on Pro and Business plans |
| 400 | INVALID_FORWARD_TARGET - target is one of our own disposable inboxes (loop) or a known third-party temporary email service (amplifier) |
| 404 | Inbox not found |
Rate Limits
Code Examples
# Enable forwarding
curl -X PATCH https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE \
-H "Authorization: Bearer sk_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{"forwardTo": "your@email.com"}'
# Disable forwarding
curl -X PATCH https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE \
-H "Authorization: Bearer sk_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{"forwardTo": null}'Requires authentication - anonymous inboxes cannot use forwarding.
Only available on Pro and Business plans.
Set forwardTo to null to disable forwarding.
Forwarding happens after the email is stored, so you keep a copy.
Each forward target is capped at 50 forwards per hour to prevent your inbox being used as an amplifier toward third parties.
Per-inbox inbound delivery cap (rejects messages past the cap): 200/hr anonymous, 500/hr Free signed-in, 1,000/hr Pro, 5,000/hr Business.
/api/inbox/{id}/streamStream Inbox (SSE)
Subscribe to real-time updates via Server-Sent Events. New messages are pushed immediately. API access requires Business plan.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Inbox ID |
Response 200
event: message
data: {"id":"Qm8fK2xvJN3pTa7bR1wYZ","fromAddress":"sender@example.com","subject":"Hello"}
event: heartbeat
data: {"timestamp":"2025-01-29T12:00:00.000Z"}Errors
| Status | Message |
|---|---|
| 403 | Real-time streaming via API is available on Business plan only |
| 404 | Inbox not found |
| 410 | Inbox has expired |
Rate Limits
Code Examples
# Stream messages in terminal (keeps connection open)
curl -N https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE/streamAPI access (Bearer token): Business plan only.
Web UI (session): Pro and Business plans.
Use EventSource API in JavaScript.
Heartbeat sent every 3 seconds to keep connection alive.
/api/inbox/{id}/aliasesList Aliases
Get all aliases for an inbox. Aliases are alternative email addresses that forward to the same inbox.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Inbox ID |
Response 200
| Field | Type | Description |
|---|---|---|
id | string | Alias ID |
aliasAddress | string | Full alias email address |
createdAt | string | ISO 8601 creation timestamp |
[
{
"id": "als_abc123",
"aliasAddress": "my-alias@destroy.network",
"createdAt": "2025-01-30T12:00:00.000Z"
},
{
"id": "als_def456",
"aliasAddress": "shopping@destroy.network",
"createdAt": "2025-01-30T11:00:00.000Z"
}
]Errors
| Status | Message |
|---|---|
| 401 | Aliases require a logged-in account |
| 404 | Inbox not found |
Rate Limits
Code Examples
curl https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE/aliases \
-H "Authorization: Bearer sk_live_your_api_key"Requires authentication - only inbox owner can list aliases.
Only available on Pro and Business plans.
/api/inbox/{id}/aliasesCreate Alias
Create a new alias for an inbox. Emails sent to this alias will appear in the parent inbox.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Inbox ID |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
alias | string | Yes | Alias name (lowercase alphanumeric with hyphens, e.g. 'my-alias') |
{
"alias": "my-shopping"
}Response 201
| Field | Type | Description |
|---|---|---|
id | string | Alias ID |
aliasAddress | string | Full alias email address |
inboxId | string | Parent inbox ID |
createdAt | string | ISO 8601 creation timestamp |
message | string | Confirmation message |
{
"id": "als_abc123",
"aliasAddress": "my-shopping@destroy.network",
"inboxId": "cpxNbXpHRKxH9U6ff8nBE",
"createdAt": "2025-01-30T12:00:00.000Z",
"message": "Alias my-shopping@destroy.network created. Emails to this address will appear in your inbox."
}Errors
| Status | Message |
|---|---|
| 401 | Aliases require a logged-in account |
| 403 | Inbox aliases are available on Pro and Business plans |
| 403 | You have reached the maximum of X aliases for this inbox |
| 400 | INVALID_ALIAS - alias is a reserved name (admin, support, noreply, etc.) |
| 404 | Inbox not found |
| 409 | This alias is already in use |
| 429 | RESOURCE_LIMIT_EXCEEDED - more than 30 aliases created in the last hour |
Rate Limits
Code Examples
curl -X POST https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE/aliases \
-H "Authorization: Bearer sk_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{"alias": "my-shopping"}'Alias must be lowercase alphanumeric with optional hyphens (not at start/end).
Reserved names (admin, support, noreply, etc.) are blocked to prevent phishing.
Pro plan: 5 aliases per inbox. Business plan: 25 aliases per inbox.
Per-account creation cap of 30 aliases per hour to prevent abuse cycles.
The full address is built using the inbox's domain.
/api/inbox/{id}/aliases/{aliasId}Delete Alias
Delete an alias from an inbox. Emails to this alias will no longer be received.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Inbox ID |
aliasId | string | Yes | Alias ID |
Response 200
{
"success": true,
"message": "Alias my-shopping@destroy.network deleted."
}Errors
| Status | Message |
|---|---|
| 404 | Inbox not found |
| 404 | Alias not found |
Rate Limits
Code Examples
curl -X DELETE https://destroy.network/api/inbox/cpxNbXpHRKxH9U6ff8nBE/aliases/als_abc123 \
-H "Authorization: Bearer sk_live_your_api_key"