Every API 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 apis
7 MCP tools reach this
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.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/deadsimple-email:deadsimple-email-usage-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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.
openapi: 3.2.0
info:
title: Dead Simple Email Usage API
version: 0.1.0
description: 'Email API for AI agents. Create inboxes, send and receive email,
manage threads, and get real-time webhook notifications.
## Authentication
All authenticated endpoints use Bearer token auth:
```
Authorization: Bearer dse_your_api_key
```
## Agent self-signup
Autonomous agents can provision an account, a key, and a live inbox in one
unauthenticated call — no human, no verification email:
```
POST /v1/auth/agent-signup
```
That returns a `trial` account (1 inbox, 10 sends/hour, 25 sends/day) with a
scoped key. `POST /v1/auth/claim` attaches a verified email and moves it to
the Free plan, keeping the same key, inboxes and history.
## Sign in with Dead Simple (OpenID Connect)
`https://id.deadsimple.email` is an OpenID Connect provider where the
identity is an agent''s inbox: `sub` is the `inbox_id`, `email` is the inbox
address. Discovery at `/.well-known/openid-configuration`, JWKS at
`/.well-known/jwks.json`, ES256 id_tokens, authorization-code + PKCE S256,
RFC 7591 registration at `/register`. Open clients (client_id = the app''s
https origin) need no registration. An agent authenticates at `/authorize`
with `Authorization: Bearer dse_...` plus `inbox_id=`, or with an ES256
assertion signed by a key enrolled via `/v1/inboxes/{inbox_id}/identity/keys`;
the one-call helper `POST /v1/inboxes/{inbox_id}/identity/sign-in` wraps
this for SDKs and the MCP server. Endpoints on the `id.deadsimple.email`
host are tagged **Identity Provider** below and carry their own `servers`
entry.
## Pay per request (no API key)
Twelve priced routes can be called with no credentials at all. They answer
`402 Payment Required` carrying an x402 v2 `PAYMENT-REQUIRED` header (USDC
on Base, Polygon or Solana, `exact` scheme, PayAI facilitator; the same
JSON is repeated in the body for v1 clients) and, on `POST /v1/inboxes`,
a `WWW-Authenticate: Payment` challenge for Stripe''s Machine Payments
Protocol. Retry with `PAYMENT-SIGNATURE` (x402 v2), `X-PAYMENT` (v1) or
`Authorization: Payment ` (MPP). x402 payments are verified
before the work and settled after it; MPP charges first and refunds if
the work fails. Prices: inbox $1.00, send/reply/reply-all/forward $0.01,
reads $0.005. The paying wallet keys a `payg` account, and the first paid
inbox returns `credentials` (an API key) in the response so later reads
and sends within the plan are free. See the reusable `402` response and
https://deadsimple.email/pay-per-request.html.
## Idempotency
POST endpoints accept an `Idempotency-Key` header. Same key within 24h
returns the cached response without re-executing.
## Rate Limits
Every response includes rate limit headers:
- `X-RateLimit-Limit` — requests per window
- `X-RateLimit-Remaining` — remaining requests
- `X-RateLimit-Reset` — window reset timestamp
On `429`, a `Retry-After` header gives the seconds to wait. Per-account
limits scale with plan (`rate_limit_rpm`); public/unauthenticated endpoints
are additionally limited per IP.
## Webhook Reliability
Every event is a durable delivery: the first attempt runs immediately and
failures are retried on an exponential-backoff schedule (configurable per
webhook via `/v1/webhooks/{id}/config`; default `[1, 30, 300, 1800, 7200,
86400]` seconds). Deliveries are HMAC-SHA256 signed on **all plans**. The
per-webhook delivery log (`/v1/webhooks/{id}/deliveries`) records every
attempt with status and error, and any delivery can be replayed. Endpoints
that fail repeatedly are auto-disabled.
## WebSocket Streaming
Connect to `wss://ws.deadsimple.email?api_key=dse_...` for real-time events.
After connecting, subscribe to specific inboxes/events:
```json
{"action": "subscribe", "inbox_ids": ["..."], "events": ["message.received"]}
```
Events are pushed as JSON with the same payload as webhooks. Send `{"action": "ping"}`
to keep the connection alive (10-minute idle timeout).'
contact:
url: https://deadsimple.email
license:
name: MIT
servers:
- url: https://api.deadsimple.email
description: Production
security:
- BearerAuth: []
tags:
- name: Usage
paths:
/v1/usage:
get:
summary: Get usage metrics
tags:
- Usage
parameters:
- $ref: '#/components/parameters/WorkspaceHeader'
responses:
'200':
description: Current billing period usage stats
operationId: getV1Usage
x-operation-id-source: derived
/v1/metrics:
get:
summary: Metrics time series
description: 'Activity bucketed into fixed UTC intervals: messages sent and received, bounces, complaints, first opens and first clicks of tracked sends, webhook deliveries and terminal failures, and inbound messages the prompt-injection scanner flagged (medium or high). Derived live from the account''s rows; outcomes are attributed to messages created inside the window, and opens/clicks count once per message. Requires `usage.read`. Honours workspace scoping and inbox-scoped API keys.'
tags:
- Usage
parameters:
- $ref: '#/components/parameters/WorkspaceHeader'
- name: from
in: query
required: false
schema:
type: string
description: 'Start of the window, inclusive. ISO date (`2026-09-01`) or datetime (`2026-09-01T12:00:00Z`; naive means UTC). Default: 30 days before `to`.
'
- name: to
in: query
required: false
schema:
type: string
description: 'End of the window, exclusive. A date-only value means the end of that day, so `from=2026-09-01&to=2026-09-07` is seven whole days. Default: now. The window may span at most 92 days.
'
- name: interval
in: query
required: false
schema:
type: string
enum:
- day
- hour
default: day
description: Bucket size. `hour` is allowed only for windows of 7 days or less.
- name: inbox_id
in: query
required: false
schema:
type: string
description: 'Comma-separated inbox ids (max 100) to restrict the series to. Each must belong to the account and be visible to the key; otherwise 404.
'
responses:
'200':
description: Bucketed series plus totals over the whole window
content:
application/json:
schema:
$ref: '#/components/schemas/Metrics'
example:
interval: day
from: '2026-09-01T00:00:00Z'
to: '2026-09-03T00:00:00Z'
series:
- start: '2026-09-01T00:00:00Z'
sent: 42
received: 17
bounced: 1
complained: 0
opened: 12
clicked: 4
webhook_deliveries: 59
webhook_failures: 0
injection_flagged: 2
- start: '2026-09-02T00:00:00Z'
sent: 38
received: 21
bounced: 0
complained: 0
opened: 9
clicked: 3
webhook_deliveries: 59
webhook_failures: 1
injection_flagged: 0
totals:
sent: 80
received: 38
bounced: 1
complained: 0
opened: 21
clicked: 7
webhook_deliveries: 118
webhook_failures: 1
injection_flagged: 2
'400':
description: Bad window (from after to, over 92 days, hour over 7 days, unparseable date) or interval
'404':
description: An inbox in `inbox_id` is not visible to this key
operationId: getV1Metrics
x-operation-id-source: derived
/v1/deliverability:
get:
summary: Deliverability report
description: Aggregated delivery outcomes for outbound mail over a time window — delivery, bounce, and complaint rates for the whole account/workspace, broken down per inbox and per sending domain, plus a hard/soft bounce breakdown and suppressed-address count. See exactly what's landing without dedicated IPs or infra to manage.
tags:
- Usage
parameters:
- $ref: '#/components/parameters/WorkspaceHeader'
- name: days
in: query
schema:
type: integer
default: 30
description: Lookback window in days (1–90).
- name: inbox_id
in: query
schema:
type: string
description: Restrict the report to a single inbox.
- name: domain
in: query
schema:
type: string
description: Restrict the report to a single sending domain.
responses:
'200':
description: Deliverability aggregates for the window.
content:
application/json:
schema:
type: object
properties:
period:
type: object
properties:
days:
type: integer
since:
type: string
format: date-time
until:
type: string
format: date-time
totals:
type: object
description: Status counts plus total, delivery_rate, bounce_rate, complaint_rate.
bounce_breakdown:
type: object
properties:
hard:
type: integer
soft:
type: integer
by_subtype:
type: object
additionalProperties:
type: integer
by_inbox:
type: array
items:
type: object
by_domain:
type: array
items:
type: object
suppressed_addresses:
type: integer
operationId: getV1Deliverability
x-operation-id-source: derived
components:
schemas:
Metrics:
type: object
properties:
interval:
type: string
enum:
- day
- hour
from:
type: string
format: date-time
to:
type: string
format: date-time
series:
type: array
items:
$ref: '#/components/schemas/MetricsBucket'
totals:
$ref: '#/components/schemas/MetricsBucket'
MetricsBucket:
type: object
properties:
start:
type: string
format: date-time
description: Bucket start, UTC.
sent:
type: integer
received:
type: integer
bounced:
type: integer
complained:
type: integer
opened:
type: integer
description: Messages opened for the first time in this bucket (tracked sends only).
clicked:
type: integer
description: Messages whose first link click fell in this bucket (tracked sends only).
webhook_deliveries:
type: integer
description: Webhook deliveries that reached the endpoint.
webhook_failures:
type: integer
description: Deliveries that exhausted their retry budget.
injection_flagged:
type: integer
description: Inbound messages rated medium or high by the prompt-injection scanner.
parameters:
WorkspaceHeader:
name: X-Workspace-Id
in: header
required: false
schema:
type: string
format: uuid
description: Target a specific workspace. Required for account-wide API keys that want workspace-scoped results.
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: API key (dse_...), session token (JWT), or OAuth 2.1 access token (dse_oat_..., obtained via the authorization-code + PKCE flow below)
OAuth2:
type: oauth2
description: OAuth 2.1 for MCP clients. Public clients only (PKCE S256 required, no client secret). Supports RFC 7591 dynamic client registration at /oauth/register and discovery via /.well-known/oauth-authorization-server. Access tokens carry inbox/message permissions only (no billing, team, or API-key administration).
flows:
authorizationCode:
authorizationUrl: https://api.deadsimple.email/oauth/authorize
tokenUrl: https://api.deadsimple.email/oauth/token
refreshUrl: https://api.deadsimple.email/oauth/token
scopes:
email: Send, receive, and manage email inboxes
OpenIDConnect:
type: openIdConnect
openIdConnectUrl: https://id.deadsimple.email/.well-known/openid-configuration
description: 'Sign in with Dead Simple. Relying parties use this to authenticate an agent by its inbox; it is not used to call the Dead Simple API itself. Scopes: openid, email, profile (open clients); owner_email, org, offline_access (registered clients only).'