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.
openapi: 3.2.0
info:
title: Email Spam Tester Inbox API
description: 'Test an email before you send it to anybody.
The loop is three calls. Ask for an address, send the message you were about to
send your list to that address, then read the report. No key, no account, no
limit per person on the first 100,000 reports.
curl -X POST https://email-spam-tester.com/api/v1/inbox
# send your message to the address it returns, then:
curl https://email-spam-tester.com/api/v1/tests/
The address accepts exactly one message and expires after an hour. The report
link is permanent and carries `report_url` inside the JSON, so a forwarded
report still says where it came from.
**Poll `/status`, not `/`.** The full report is several thousand lines of JSON
and the analysis takes a few seconds; the status endpoint is the cheap way to
find out whether it is worth fetching yet. `analysis_status` reaches
`checks_ready` first and the AI plan lands a minute or so later under
`ai_status`, so a caller that only wants the checks does not have to wait for
the plan.
**Agents:** there is an MCP server at `/mcp` with the same capability and a
blocking wait, which is a better fit than polling from a model.
Every finding carries `citations`: the section of the RFC it comes from, quoted,
and the page where Google states its own requirement. Those are curated by hand
rather than generated, so they can be relied on.'
contact:
name: Email Spam Tester
url: https://email-spam-tester.com/
version: 1.0.0
tags:
- name: Inbox
paths:
/api/v1/inbox:
post:
summary: Create Inbox
operationId: create_inbox_api_v1_inbox_post
parameters:
- name: lang
in: query
required: false
schema:
type: string
default: en
title: Lang
- name: probe
in: query
required: false
schema:
type: boolean
default: false
title: Probe
- name: account
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 64
pattern: ^[A-Za-z0-9_-]+$
- type: 'null'
title: Account
- name: domain
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 253
pattern: ^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$
- type: 'null'
title: Domain
- name: sender
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 320
pattern: ^[^@\s]{1,64}@(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$
- type: 'null'
title: Sender
- name: variant
in: query
required: false
schema:
anyOf:
- enum:
- standard
- own
- wordpress
type: string
- type: 'null'
title: Variant
- name: path
in: query
required: false
schema:
anyOf:
- enum:
- mailbox
- site
- store
type: string
- type: 'null'
title: Path
- name: email
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 64
pattern: ^[a-z0-9][a-z0-9_-]*$
- type: 'null'
title: Email
- name: mailer
in: query
required: false
schema:
anyOf:
- enum:
- mail
- smtp
- sendmail
- qmail
- api
- other
type: string
- type: 'null'
title: Mailer
- name: smtp_host
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 253
pattern: ^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$
- type: 'null'
title: Smtp Host
- name: smtp_plugin
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 64
pattern: ^[a-z0-9][a-z0-9_-]*$
- type: 'null'
title: Smtp Plugin
- name: envelope
in: query
required: false
schema:
anyOf:
- type: string
maxLength: 320
pattern: ^[^@\s]{1,64}@(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$
- type: 'null'
title: Envelope
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/InboxResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Inbox
components:
schemas:
InboxResponse:
properties:
address:
type: string
title: Address
slug:
type: string
title: Slug
expires_at:
type: string
format: date-time
title: Expires At
type: object
required:
- address
- slug
- expires_at
title: InboxResponse
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
input:
title: Input
ctx:
type: object
title: Context
type: object
required:
- loc
- msg
- type
title: ValidationError
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError