Commencer
Bienvenue dans l'API Développeur TempMail. Nous avons de superbes fonctionnalités, telles que...
- Aucune inscription de clé API requise (pour le niveau gratuit)
- Domaines personnalisés pour les utilisateurs Plus et Ultra
- Et bien plus encore ! Consultez notre page de tarification pour plus d'informations.
Si vous n'utilisez pas de bibliothèque, toutes les requêtes POST doivent avoir l'en-tête Content-Type défini sur application/json !
Sélectionnez votre bibliothèque

Python
NodeJS

Java
HTTP
$ pip3 install tempmail-lolTypes d'API
Un objet e-mail, qui est renvoyé lorsque vous vérifiez votre boîte de réception.
| Nom | Type | Description |
|---|---|---|
| from | string | L'expéditeur de l'e-mail |
| to | string | Le destinataire (votre e-mail temporaire) |
| subject | string | Objet de l'e-mail |
| body | string | Corps en texte brut, peut être vide |
| html | ?string | HTML de l'e-mail (peut être nul) |
| date | number | Le timestamp Unix de la réception de l'e-mail |
Boîte de réception
Un objet boîte de réception, contenant l'adresse e-mail et le jeton d'accès.
| Nom | Type | Description |
|---|---|---|
| address | string | L'adresse e-mail créée |
| token | string | Le jeton d'accès utilisé pour consulter la boîte de réception |
Durée de vie de la boîte de réception
Les boîtes de réception ont des durées de vie différentes en fonction du niveau de votre abonnement.
| Niveau d'abonnement | Durée de vie |
|---|---|
| Gratuit (sans abonnement) | Une heure |
| TempMail Plus | Dix heures |
| TempMail Ultra | Trente heures |
Les durées de vie des boîtes de réception peuvent être prolongées (uniquement pour les domaines personnalisés) en redemandant simplement la méthode de création de boîte de réception.
Créer une boîte de réception
La méthode Create Inbox peut être utilisée avec GET ou POST. La méthode POST vous permet de personnaliser des options, telles que le préfixe et le domaine de la boîte de réception.
La méthode GET existe actuellement uniquement pour des raisons de compatibilité.
from TempMail import TempMail
tmp = TempMail("optional-api-key")
inb = tmp.createInbox()
# Or... use a prefix
inb = tmp.createInbox(prefix = "joe")
# You can use a setup custom domain here
inb = tmp.createInbox(domain = "mycustomdomain.com", prefix = "optional")
Corps
| Paramètre | Type | Description | Défaut |
|---|---|---|---|
| domain | ?string | Le domaine de la boîte de réception, ou aléatoire. Peut être un domaine personnalisé. | null |
| prefix | ?string | Le préfixe de la boîte de réception, ou aléatoire. | null |
Réponse (201)
| Nom | Type | Description |
|---|---|---|
| address | string | L'adresse e-mail de la boîte de réception. |
| token | string | Le jeton de la boîte de réception. |
Récupérer les e-mails
Récupérez les e-mails à l'aide du jeton reçu lors de la création de l'e-mail. Si vous perdez votre jeton, vous ne pourrez plus accéder à l'e-mail, sauf si c'est un domaine personnalisé (veuillez ne pas contacter le support à ce sujet, nous ne pouvons pas vous fournir l'adresse e-mail pour des raisons légales).
from TempMail import TempMail
tmp = TempMail("optional-api-key")
inb = tmp.createInbox()
emails = tmp.getEmails(inb.token)
print("Emails:")
for email in emails:
print("\tSender: " + email.sender)
print("\tRecipient: " + email.recipient)
print("\tSubject: " + email.subject)
print("\tBody: " + email.body)
print("\tHTML: " + str(email.html)) # may be None
print("\tDate: " + str(email.date)) # Unix timestamp in milliseconds
Requête
| Paramètre | Type | Description | Défaut |
|---|---|---|---|
| token | string | Le jeton utilisé pour accéder à la boîte de réception | null |
Réponse (200)
| Nom | Type | Description |
|---|---|---|
| emails | Email[] | Le tableau des e-mails reçus du serveur |
| expired | boolean | Vrai si la boîte de réception est expirée (voir durée de vie de la boîte de réception) |
Préparer un domaine personnalisé
Avant qu'un domaine personnalisé puisse être utilisé sur TempMail, vous devez configurer quelques enregistrements. Il est recommandé de le faire sur la page des comptes, cependant vous pouvez également le faire via l'API.
Les domaines personnalisés nécessitent un abonnement TempMail Plus ou Ultra.
Corps
| Paramètre | Type | Description | Défaut |
|---|---|---|---|
| domain | string | Le domaine à enregistrer sur TempMail | null |
Response (200)
| Nom | Type | Description |
|---|---|---|
| uuid | string | Le UUID à définir pour votre enregistrement de domaine (voir ci-dessous) |
Ajoutez cet enregistrement à votre domaine sous [uuid].yourdomain.com et définissez la valeur sur tm-custom-domain-verification.
Si vous utilisez un sous-domaine à la place, définissez-le sur [uuid].subdomain.yourdomain.com.
Réponse (4xx)
| Nom | Type | Description |
|---|---|---|
| error | string | L'erreur expliquant pourquoi le domaine n'a pas pu être configuré. |
Créer une adresse de domaine personnalisé
Créez une boîte de réception de domaine personnalisé de la même manière que vous créez des boîtes de réception normales, mais avec votre domaine !
Notes :
- Vous devez utiliser le même compte qui a été utilisé pour créer le UUID pour le domaine
- Le paramètre
prefixdéfinira le préfixe normal sans chiffres en tête
from TempMail import TempMail
tmp = TempMail("API Key required for custom domains")
inb = tmp.createInbox()
inb = tmp.createInbox(domain = "mycustomdomain.com", prefix = "optional")
Corps
| Paramètre | Type | Description | Défaut |
|---|---|---|---|
| domain | string | Votre domaine personnalisé. | null |
| prefix | ?string | L'adresse e-mail (avant le @) de la boîte de réception, ou aléatoire. | null |
Réponse (201)
| Nom | Type | Description |
|---|---|---|
| address | string | L'adresse e-mail de la boîte de réception. |
| token | string | Le jeton de la boîte de réception. |
Si vous perdez le jeton de la boîte de réception, appelez à nouveau la méthode avec le même préfixe. La durée de vie de la boîte de réception sera prolongée en fonction de votre abonnement. Vous pouvez prolonger un nombre infini de fois.
Consultez la boîte de réception en utilisant la méthode Fetch Emails.
Webhooks privés
Définir des webhooks privés pour que tous les e-mails de votre domaine soient redirigés vers votre webhook.
Nécessite un abonnement actif TempMail Ultra.
Vous devez avoir déjà configuré votre domaine pour les domaines personnalisés ([uuid].domain.com).
Body
| Paramètre | Type | Description | Défaut |
|---|---|---|---|
| domain | string | Le domaine sur lequel définir votre webhook | null |
| url | string | L'URL du webhook vers lequel les e-mails seront transférés | null |
Réponse (200)
| Nom | Type | Description |
|---|---|---|
| success | true | Toujours vrai |
| message | string | Message d'information sur le succès |
Réponse (4xx)
| Nom | Type | Description |
|---|---|---|
| error | string | Message contenant des détails sur l'erreur |
Vous pouvez également SUPPRIMER /private_webhook avec le domaine comme paramètre de requête pour le supprimer.
Webhooks standard
Définir des webhooks standard sur chaque e-mail standard que vous créez. Les e-mails seront redirigés vers votre webhook.
Nécessite un abonnement actif TempMail Ultra.
Cela ne s'appliquera pas rétroactivement aux e-mails existants.
Corps
| Paramètre | Type | Description | Défaut |
|---|---|---|---|
| url | string | L'URL du webhook vers laquelle les e-mails seront transférés | null |
Réponse (200)
| Nom | Type | Description |
|---|---|---|
| success | true | Toujours vrai |
Réponse (4xx)
| Nom | Type | Description |
|---|---|---|
| error | string | Message contenant des détails sur l'erreur |
Vous pouvez également SUPPRIMER /webhook pour le supprimer de votre compte.
API v3 Overview NEW
API v3 is the new, consistent TempMail API. It adds account-level inbox management, a wait-for-email long poll, raw .eml downloads, per-inbox webhooks with automatic retries and delivery logs, custom domain management, a list of TempMail's own domains, scoped API keys, and a usage endpoint.
What changed from v2:
- Fetches consume exactly what they return. Emails you receive in a response are deleted; emails excluded by your filters (
since,from,limit) stay in the inbox. v2 wipes the whole inbox on every read. - Errors are consistent. Every error is
{ "error": { "code", "message" } }with a matching HTTP status-never a 200. - Rate limits are visible. Responses carry
x-ratelimit-limit,x-ratelimit-remainingandx-ratelimit-resetheaders (reset is a unix timestamp in seconds). 429 responses includeretry-after. - v2 stays supported. Inboxes are shared between versions; v3 has its own create and fetch endpoints, but tokens work on both.
Base URL: https://api.tempmail.lol/v3
# account endpoints accept either key type:
Authorization: Bearer tempmail.20260101.abcdef... # primary key
Authorization: Bearer tempmail.sk.abcdef... # scoped key
# error envelope (here: HTTP 403)
{
"error": {
"code": "insufficient_scope",
"message": "This API key does not have the required scope: domains:read",
"required_scope": "domains:read"
}
}Scoped API Keys
Create additional API keys that can only do specific things, so your CI pipeline or a third-party integration never holds your full account credential. The key secret is returned once on creation and only a hash is stored.
Keys are managed with your primary API key (or the website), a scoped key can never manage keys.
Scopes
| Scope | Grants |
|---|---|
| inboxes:create | Create inboxes (works on v1/v2 create endpoints too) |
| inboxes:read | List your inboxes |
| webhooks:read | Read webhook config and delivery logs |
| webhooks:write | Set/remove per-inbox webhooks |
| domains:read | List/inspect custom domains |
| domains:write | Register/verify/remove custom domains |
| usage:read | Read usage & quota |
/v3/keyslist keys/v3/keyscreate a key/v3/keys/:idrename / re-scope / revoke/v3/keys/:iddelete a keycurl -X POST https://api.tempmail.lol/v3/keys \
-H "Authorization: Bearer $PRIMARY_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "ci key", "scopes": ["inboxes:create", "inboxes:read"]}'
# 201 -> { "key": "tempmail.sk....", "id": "...", "scopes": [...], ... }
# the "key" field is shown ONCE. store it nowCreate & Manage Inboxes
Create inboxes anonymously (free tier, per-IP limits) or with an API key (per-account limits, longer lifespans, account ownership). Inboxes created with a key belong to your account and can be listed with the inboxes:read scope; per-inbox endpoints are authorized by the inbox token itself.
POST /v3/inboxes - body (all optional)
| Parameter | Type | Description | Default |
|---|---|---|---|
| prefix | ?string | Local part prefix (a-z, 0-9, _, -) | random |
| domain | ?string | A TempMail domain (see TempMail Domains), or a custom domain verified to your account. Plus/Ultra accounts draw random domains from their own premium pool. | random |
| community | ?boolean | Prefer a community domain | false |
GET /v3/inboxes - query
| Parameter | Type | Description | Default |
|---|---|---|---|
| limit | ?number | Page size (max 200) | 50 |
| cursor | ?string | next_cursor from the previous page | null |
| include_expired | ?boolean | Also return expired inboxes | false |
/v3/inboxescreate an inbox/v3/inboxeslist your inboxes/v3/inboxes/:tokenmetadata + email count/v3/inboxes/:tokendelete inbox + its emailscurl -X POST https://api.tempmail.lol/v3/inboxes \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"prefix": "ci-run-42"}'
# 201
{
"address": "[email protected]",
"token": "...",
"created_at": "2026-07-16T00:22:22.000Z",
"expires_at": 1784269342568,
"expired": false,
"webhook_configured": false
}Fetch Emails & Raw .eml
Fetching emails consumes what it returns: emails in the response are deleted, while emails excluded by since or limit stay in the inbox (v2 deletes everything on read).
Raw RFC822 source is a TempMail Ultra feature. For Ultra-owned inboxes each fetched email includes a raw field with the exact MIME source received over SMTP (null if it was not captured). The standalone /raw endpoint downloads a .eml for an email that has NOT been consumed yet - useful with the email_id from webhook delivery logs. If the verbatim source is unavailable, a reconstructed .eml is served (marked with x-tempmail-reconstructed: true).
GET /v3/inboxes/:token/emails - query
| Parameter | Type | Description | Default |
|---|---|---|---|
| since | ?number | Only emails with date >= this unix ms timestamp | 0 |
| limit | ?number | Max emails returned (max 200) | 100 |
/v3/inboxes/:token/emailsfetch + consume/v3/inboxes/:token/emails/:iddelete without reading/v3/inboxes/:token/emails/:id/rawdownload .eml (Ultra)curl -OJ https://api.tempmail.lol/v3/inboxes/$TOKEN/emails/$ID/raw
# -> Content-Type: message/rfc822
# Content-Disposition: attachment; filename="<id>.eml"
# x-tempmail-reconstructed: false
# without Ultra -> 403
# { "error": { "code": "tier_required", "required_tier": "ultra", ... } }Wait for Email (long poll)
Blocks until an email matching your filters arrives, or the timeout passes - one request instead of a polling loop. Perfect for signup flows and CI: request the OTP, then wait for it.
Matched emails are returned and consumed; emails that do not match the from/since filters stay in the inbox untouched.
Query
| Parameter | Type | Description | Default |
|---|---|---|---|
| timeout | ?number | Seconds to wait (max 60) | 30 |
| from | ?string | Sender filter, wildcards allowed (*@example.com) | null |
| since | ?number | Ignore emails older than this unix ms timestamp | 0 |
At most 2 concurrent /wait requests per inbox. A timeout is still HTTP 200, with "timed_out": true and an empty emails array.
curl "https://api.tempmail.lol/v3/inboxes/$TOKEN/wait?\
from=*@example.com&timeout=30"
# matched emails are consumed on return
{
"emails": [{
"id": "6a58244f...",
"from": "[email protected]",
"subject": "Your verification code is 482913",
"body": "Code: 482913",
"raw": "From: [email protected]\r\n...", // Ultra only
...
}],
"timed_out": false,
"waited_ms": 2311
}Per-Inbox Webhooks & Delivery Logs
Attach a webhook to a single inbox (TempMail Ultra): new mail to that inbox is POSTed to your URL. Failed deliveries are retried automatically with backoff - 30s, 5m, 30m, 2h after the initial attempt (5 attempts total).
Every delivery and each attempt (status code, error, duration) is logged for 7 days and queryable - this covers account-wide (v2) webhooks, private domain webhooks, and per-inbox webhooks alike.
GET /v3/webhooks/deliveries - query
| Parameter | Type | Description |
|---|---|---|
| status | ?string | pending | success | failed |
| address / domain | ?string | Filter by recipient inbox or domain |
| limit / cursor | ?number / ?string | Pagination (max 200) |
/v3/inboxes/:token/webhookset webhook (Ultra)/v3/inboxes/:token/webhookread webhook/v3/inboxes/:token/webhookremove webhook/v3/webhooks/deliveriesdelivery log{
"deliveries": [{
"url": "https://example.com/hook",
"event": "email.received",
"address": "[email protected]",
"status": "success",
"attempt_count": 2,
"attempts": [
{ "at": "...", "status_code": 500, "error": "HTTP 500", "duration_ms": 12 },
{ "at": "...", "status_code": 200, "error": null, "duration_ms": 45 }
],
"created_at": "..."
}],
"next_cursor": null
}Custom Domains
Register a custom domain to your account, get the exact DNS records to create, and re-run verification whenever you like - with structured per-record results instead of a single pass/fail. Requires TempMail Plus or Ultra.
DNS records returned by the API
| Type | Name | Value |
|---|---|---|
| TXT | <hash>.yourdomain.com | tm-custom-domain-verification |
| A | mx.yourdomain.com | (returned by the API) |
| MX | yourdomain.com | mx.yourdomain.com (priority 10, must be the only MX) |
The exact TXT name/value pair is account-specific - always read it from the API response.
POST /v3/domains/verify re-checks up to 100 of your domains in one call, least recently checked first, and returns the same per-domain results. It can run once every 10 minutes per account; calling it sooner returns 429 rate_limited with a retry-after header.
/v3/domainslist your domains/v3/domainsregister + verify/v3/domains/:domaindetails + DNS records/v3/domains/:domain/verifyre-run verification/v3/domains/verifyre-verify all (once per 10 min)/v3/domains/:domainunregister{
"domain": { "domain": "yourdomain.com", "verified": true, ... },
"checks": {
"txt": { "pass": true, "detail": "Ownership TXT record found." },
"mx": { "pass": false, "records": [...],
"expected": "mx.yourdomain.com",
"detail": "Expected a single MX record..." }
},
"dns": { "ownership_txt_options": [...], "mail_records": [...] }
}TempMail Domains
List every domain TempMail itself serves, split into the premium pool that only Plus/Ultra accounts can create inboxes on and the free pool that any tier can use. Pass any of them as domain when creating an inbox. Requires TempMail Plus or Ultra and the domains:read scope; free accounts get a tier_required error.
Response fields
| Field | Type | Description |
|---|---|---|
| domains_premium | string[] | The premium pool. Random Plus/Ultra inboxes are drawn from here. |
| domains_free | string[] | The free pool, including community domains. Usable by every tier. |
An entry starting with *. is a wildcard: both the bare domain and any subdomain of it are accepted, so *.example.com lets you create [email protected] or [email protected]. The lists change over time as domains are rotated in and out, so re-fetch them rather than caching them for long.
/v3/domains/poollist TempMail domains (Plus/Ultra)curl https://api.tempmail.lol/v3/domains/pool \
-H "Authorization: Bearer tempmail.sk...."
{
"domains_premium": [
"*.plusonly.example",
"premium.example"
],
"domains_free": [
"*.free.example",
"community.example"
]
}Usage & Quota
See your tier, how much of the inbox-creation window you have used, and counts of your active inboxes, keys, and domains. Requires the usage:read scope.
{
"tier": "ultra",
"inbox_creation": {
"window_seconds": 300,
"limit": 5000,
"used": 2,
"remaining": 4998,
"resets_at": 1784161500000,
"limited_by": "account"
},
"inboxes_active": 2,
"api_keys_active": 1,
"custom_domains": 0,
"webhook_deliveries_last_7d": 14
}Assistance API
Besoin d'aide avec l'API ? Rejoignez notre serveur Discord ! Nous sommes heureux de vous aider, alors faites-le nous savoir si vous avez un problème, ou si vous avez simplement besoin d'aide pour comprendre quelque chose avec notre API.