API de enlaces y correo temporal
La API crea enlaces cortos anónimos, devuelve sus estadísticas de clics, cambia sus ajustes y los borra. Las peticiones y las respuestas usan JSON. CORS está habilitado, así que las llamadas funcionan también desde código del navegador. En Pro o superior también gestiona buzones temporales: crear una dirección, consultarla en busca de correo y responder a los mensajes recibidos.
Dirección base:
https://anonym.es/api/v1
Inicio rápido
Para crear un enlace corto, envía la dirección de destino:
curl -X POST https://anonym.es/api/v1/links \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/article"}'
Esta llamada no requiere token. Sin él, el enlace se crea como enlace de invitado dentro de la cuota Free de tu dirección IP.
Con un token de cuenta la misma llamada guarda el enlace en tu panel y lo cuenta en la cuota de tu plan:
curl -X POST https://anonym.es/api/v1/links \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/article"}'
La respuesta contiene la dirección corta, el id del enlace y el token que gestiona este enlace. Guarda el token: hará falta para leer o borrar el enlace más adelante.
{
"ok": true,
"link": {
"id": 4821,
"short": "https://anonym.es/k7m2q",
"url": "https://example.com/article",
"status": "active",
"password": false,
"created_at": "2026-09-05T14:02:11Z",
"expires_at": null,
"max_hits": null,
"self_destruct": false,
"delay": null,
"no_countdown": false,
"adult": false,
"note": null,
"tags": [],
"clicks": 0,
"uniques": 0
},
"token": "3f9c1b7e2d4a4c0e9b8f7a6d5c4b3a21",
"left": 4
}
Campos del objeto enlace
Todos los endpoints que devuelven un enlace usan esta estructura. Las marcas de tiempo son ISO 8601 en UTC. Los contadores clicks y uniques abarcan toda la vida del enlace.
| Campo | Tipo | Qué hace |
|---|---|---|
id | integer | Id numérico del enlace, usado por las demás llamadas. |
short | string | La dirección corta para compartir. |
url | string | null | El destino, null en un enlace de solo nota. |
status | string | active | expired | exhausted (límite de visitas alcanzado) | flagged (destino en una lista de seguridad) | banned. |
password | boolean | Los visitantes deben introducir una contraseña. |
created_at | string | ISO 8601, UTC. |
expires_at | string | null | Cuándo caduca el enlace, null = sin caducidad. |
max_hits | integer | null | Límite de visitas, null = sin límite. |
self_destruct | boolean | El enlace se borra solo, de forma definitiva, al alcanzar el límite o la duración. |
delay | integer | null | Segundos en la página de reenvío, null = valor del plan, 0 = inmediato. |
no_countdown | boolean | La página de reenvío no muestra cuenta atrás y espera un clic en la dirección. |
adult | boolean | Los visitantes confirman que tienen 18 años o más antes de la página de redirección. |
note | string | null | La nota mostrada en la página de reenvío. |
tags | string[] | Etiquetas, en minúsculas. |
clicks | integer | Visitas durante toda la vida del enlace. |
uniques | integer | Visitantes únicos (uno por dirección y día) durante toda la vida del enlace. |
Autorización
Las peticiones autorizadas llevan el token en la cabecera Authorization. Como alternativa se acepta la cabecera X-API-Key. Los tokens nunca se pasan en la query string.
Authorization: Bearer YOUR_TOKEN
| Token | Dónde obtenerlo | Para qué sirve |
|---|---|---|
| Token de cuenta | En el panel | Todos los enlaces de la cuenta, con los derechos del plan |
| Token de enlace | Se devuelve al crear un enlace | Un enlace concreto, con los derechos del plan Free |
Un token de cuenta empieza por anon_. Un token de enlace consta de 32 caracteres. Generar un nuevo token de cuenta invalida el anterior.
Ejemplo:
curl https://anonym.es/api/v1/me \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
Generar un token de cuenta en el panel
Endpoints
El cuerpo de la petición puede enviarse como application/json o como application/x-www-form-urlencoded. Los nombres de los parámetros y los códigos de error son idénticos en todos los endpoints.
| Método | Ruta | Token | Coste | Qué hace |
|---|---|---|---|---|
GET | /api/v1 | opcional | 1 | Sobre esta API: versión, direcciones de la documentación y del esquema. |
POST | /api/v1/links | opcional | 5 + 1/url | Crear un enlace, o hasta 50 a la vez. Sin token: como invitado, con la cuota Free. Devuelve el enlace con su token. |
GET | /api/v1/names/check | opcional | 2 | ¿Está disponible este nombre propio? Sugerencias cuando está ocupado. |
GET | /api/v1/links | de cuenta | 2 | Los enlaces de la cuenta, los más nuevos primero. |
GET | /api/v1/links/lookup | de enlace o de cuenta | 1 | Encontrar uno de tus enlaces por su dirección corta. |
GET | /api/v1/links/{id} | de enlace o de cuenta | 1 | Un enlace: ajustes, estado, clics y visitantes únicos de toda su vida. Los tokens de cuenta pueden añadir un informe de estadísticas. |
PATCH | /api/v1/links/{id} | de enlace o de cuenta | 3 | Cambiar ajustes. Solo cambian los campos enviados. Planes de pago (un token de enlace tiene derechos Free y no puede editar). |
DELETE | /api/v1/links/{id} | de enlace o de cuenta | 2 | Borrar el enlace. El nombre vuelve a quedar libre. |
GET | /api/v1/links/{id}/qr | de enlace o de cuenta | 3 | El código QR de la dirección corta como imagen (PNG o SVG). Necesita token, así que conviene al código del servidor. |
GET | /api/v1/qr | opcional | 3 | El código QR de una dirección corta como imagen, sin token: la propia dirección es la clave. Pensado para etiquetas <img>. |
GET | /api/v1/me | de cuenta | 1 | La cuenta: plan, límites, cuota restante, dominios extra, lo que permite el plan. |
GET | /api/v1/openapi.json | opcional | 1 | Esta API como documento OpenAPI 3.1. |
Correo temporal
| Método | Ruta | Token | Coste | Qué hace |
|---|---|---|---|---|
GET | /api/v1/mail/domains | de cuenta | 1 | Correo temporal: los dominios en los que el plan puede crear direcciones y cuáles de ellos admiten una dirección fijada (pinnable). |
GET | /api/v1/mail/limits | de cuenta | 1 | Correo temporal: cuántas direcciones da el plan a la vez y por hora, y cuántas quedan. |
GET | /api/v1/mail/addresses | de cuenta | 2 | Correo temporal: las direcciones activas de la cuenta con su tiempo restante. |
POST | /api/v1/mail/addresses | de cuenta | 5 | Correo temporal: crear una dirección desechable en uno de los dominios del plan. La respuesta trae una sola vez key, la clave secreta de la dirección. El correo se guarda cifrado y solo esta clave lo abre. Envíala como X-Mail-Key. |
GET | /api/v1/mail/addresses/{id} | de cuenta | 1 | Correo temporal: una dirección con su tiempo restante, prórrogas y cuota de envío de hoy. |
POST | /api/v1/mail/addresses/{id}/key | de cuenta | 3 | Correo temporal: emitir una clave nueva para una dirección creada mediante la API cuando se ha perdido la suya. El correo sellado con la clave anterior sigue cerrado y sigue llegando con encrypted = true. |
POST | /api/v1/mail/addresses/{id}/pin | de cuenta | 3 | Correo temporal: fijar la dirección. Una dirección fijada no tiene reloj, vive mientras el plan esté activo o mientras el dominio esté disponible. |
POST | /api/v1/mail/addresses/{id}/unpin | de cuenta | 3 | Correo temporal: hacer temporal una dirección fijada o en reserva. El reloj del plan empieza de inmediato. |
POST | /api/v1/mail/addresses/{id}/extend | de cuenta | 3 | Correo temporal: reiniciar el reloj de la dirección a la duración completa del plan (cuenta como prórroga). |
DELETE | /api/v1/mail/addresses/{id} | de cuenta | 2 | Correo temporal: eliminar la dirección con todo su contenido. |
GET | /api/v1/mail/addresses/{id}/messages | de cuenta | 2 | Correo temporal: los mensajes de una dirección, los más recientes primero, con marca de lectura y veredicto del remitente. Necesita X-Mail-Key. Sin ella las filas vuelven con encrypted = true y sin contenido. |
GET | /api/v1/mail/addresses/{id}/messages/{mid} | de cuenta | 1 | Correo temporal: un mensaje completo, con texto, HTML, adjuntos y resultados de autenticación. Lo marca como leído. Necesita X-Mail-Key. |
PATCH | /api/v1/mail/addresses/{id}/messages/{mid} | de cuenta | 3 | Correo temporal: marcar un mensaje como leído o no leído. |
DELETE | /api/v1/mail/addresses/{id}/messages/{mid} | de cuenta | 2 | Correo temporal: eliminar un mensaje. |
GET | /api/v1/mail/addresses/{id}/messages/{mid}/attachments/{n} | de cuenta | 1 | Correo temporal: un adjunto como descarga de archivo. Necesita X-Mail-Key. |
POST | /api/v1/mail/addresses/{id}/messages/{mid}/reply | de cuenta | 5 | Correo temporal: responder a un mensaje. Solo se permite si el remitente pasó la autenticación, y solo a ese remitente. Necesita X-Mail-Key. |
POST | /api/v1/mail/addresses/{id}/send | de cuenta | 5 | Correo temporal: enviar un mensaje a cualquier dirección (envíos libres del plan). |
GET | /api/v1/mail/addresses/{id}/sent | de cuenta | 2 | Correo temporal: mensajes enviados desde esta dirección. Para ver destinatario, asunto y texto hace falta X-Mail-Key. |
El coste se indica en unidades del límite de ritmo, véase Límites de ritmo.
Crear un enlace
POST /api/v1/links
La petición mínima contiene solo el campo url:
curl -X POST https://anonym.es/api/v1/links \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/article"}'
Con un token de cuenta el enlace pertenece a la cuenta y se cuenta en la cuota de su plan. Sin token es un enlace de invitado en la cuota de la IP:
curl -X POST https://anonym.es/api/v1/links \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/article"}'
Una petición correcta devuelve el estado 201 junto con el enlace, su token y el número de enlaces que quedan en el periodo de cuota actual.
Campos de la respuesta:
| Campo | Tipo | Qué hace |
|---|---|---|
link | object | El enlace creado. |
token | string | El token de enlace (32 caracteres), gestiona este enlace. |
left | integer | null | Enlaces que quedan en el periodo de cuota actual, null cuando el plan no tiene límite. |
qr | object | El código QR, presente cuando se envió qr=true. |
batch | boolean | true cuando se enviaron varias direcciones. |
results | array | Una entrada por dirección, en el orden enviado: {ok: true, link, token, qr} o {ok: false, url, error, message, field}. |
Enlace con nombre propio
La dirección corta recibe el nombre my-article si está libre y cumple las reglas siguientes.
curl -X POST https://anonym.es/api/v1/links \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/article","name":"my-article"}'
Reglas de los nombres:
- Letras latinas, dígitos, guion y guion bajo. Desde 5 caracteres en el plan Free y desde 3 en los planes de pago, hasta 32. No se distinguen mayúsculas: Promo y promo son el mismo enlace.
- Los nombres de páginas, los códigos de idioma y las palabras de servicio están reservados.
- Se rechazan los nombres de marcas y las palabras ofensivas. Los nombres pasan por una lista de palabras y una revisión automática. El número de nombres propios por hora está limitado según el plan.
- Un nombre ocupado devuelve el estado 409 con alternativas libres en suggest.
- Un nombre de subdominio (sub: true, plan Max) es una etiqueta DNS: letras, dígitos y guiones, sin guion en los extremos ni guion bajo. Nombres como www, mail o ns1 están reservados.
Un nombre puede comprobarse antes de crear el enlace:
curl "https://anonym.es/api/v1/names/check?name=my-article"
Campos de la respuesta de comprobación:
| Campo | Tipo | Qué hace |
|---|---|---|
available | boolean | true cuando el nombre puede usarse. |
name | string | El nombre comprobado. |
error | string | Por qué el nombre no está disponible: taken, reserved, too_short y los demás errores de nombre. |
message | string | El motivo en palabras. |
field | string | Siempre name. |
suggest | array | Alternativas libres cuando el nombre está ocupado. |
Varios enlaces a la vez
El campo urls acepta hasta 50 direcciones, como array JSON o como texto con una dirección por línea. Cada dirección se convierte en su propio enlace con su propio token, y los demás campos se aplican a todos. El nombre propio no está disponible en un lote.
curl -X POST https://anonym.es/api/v1/links \
-H "Content-Type: application/json" \
-d '{"urls":["https://example.com/a","https://example.com/b","https://example.com/c"]}'
La respuesta contiene batch: true y un array results con una entrada por dirección, en el orden enviado. Una dirección defectuosa produce una entrada con ok: false y el código de error sin detener el resto.
Ajustes adicionales
curl -X POST https://anonym.es/api/v1/links \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/article",
"name": "my-article",
"expires_days": 30,
"max_hits": 1000,
"self_destruct": true,
"password": "secret",
"note": "Available until the end of the month",
"delay": 5,
"tags": "blog,promo",
"qr": true,
"qr_size": 300,
"qr_format": "png"
}'
Las opciones marcadas como de pago se ignoran para invitados y en el plan Free. La respuesta refleja los ajustes que el enlace recibió realmente.
| Campo | Tipo | Qué hace |
|---|---|---|
url | string, obligatorio | El destino. O urls: varias direcciones, una por línea o como array JSON (hasta 50), cada una recibe su propio enlace. |
name | string | Nombre propio para un solo enlace (comprobado con las reglas y el filtro de nombres). |
domain | string | One of the alias domains, random, or random-alias (random among the alias domains only). Paid plans; default is random: links never sit on the main domain. Free and guests: anonymes.click. |
sub | boolean | Forma name.alias en lugar de alias/name. Plan Max, solo en los dominios extra. |
expires_days | integer | Duración en días. Planes de pago. |
max_hits | integer | Límite de visitas. Planes de pago. |
self_destruct | boolean | Borrar el enlace de forma definitiva al alcanzar el límite de visitas o la duración (requiere max_hits o expires_days). |
password | string | Contraseña que deben introducir los visitantes. Planes de pago. |
note | string | Texto mostrado en la página de reenvío. Planes de pago, longitud según el plan. |
note_only | boolean | El enlace abre la propia nota, sin destino. Pro+ y superiores. |
delay | integer | Segundos en la página de reenvío, 0 = inmediato. Planes de pago. |
no_countdown | boolean | Sin cuenta atrás en la página de reenvío: sin temporizador ni reenvío automático, el visitante pulsa la dirección. Planes de pago. |
adult | boolean | Contenido para adultos (18+): el visitante confirma su edad en una página aparte antes de ver nada más. En todos los planes. |
tags | string | Etiquetas separadas por comas (hasta 5, de 24 caracteres cada una). Tokens de cuenta en planes de pago. |
qr | boolean | Incluir en la respuesta el código QR de la dirección corta (base64). |
qr_size | integer | Lado de la imagen QR en píxeles, 100–1000 (por defecto 300, el PNG se redondea a módulos enteros). |
qr_format | string | png (por defecto) o svg. |
qr_logo | boolean | false = código sin logotipo. Solo planes de pago, en caso contrario se ignora. |
Listar enlaces
GET /api/v1/links
Requiere un token de cuenta.
Requiere un token de cuenta. Los enlaces se devuelven de más nuevo a más antiguo.
curl "https://anonym.es/api/v1/links?page=1&per=50" \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
| Campo | Tipo | Qué hace |
|---|---|---|
page | integer | Número de página (por defecto 1). |
per | integer | Enlaces por página, 1–100 (por defecto 50). |
q | string | Búsqueda en el nombre corto, el dominio y el destino (una lista plana, hasta 50). |
tag | string | Solo enlaces con esta etiqueta. |
La búsqueda y el filtro por etiqueta pueden combinarse:
curl "https://anonym.es/api/v1/links?q=example&tag=promo" \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
Campos de la respuesta:
| Campo | Tipo | Qué hace |
|---|---|---|
page | integer | Página actual. |
per | integer | Enlaces por página. |
total | integer | Número de enlaces encontrados. |
pages | integer | Número de páginas. |
links | array | Objetos enlace, los más nuevos primero. |
Buscar un enlace por su dirección corta
Un enlace se identifica por su id numérico (el campo id, por ejemplo 4821), no por el nombre de la dirección corta. Cuando solo se conoce la dirección corta, el id puede obtenerse con cualquier token que gestione ese enlace:
curl --get https://anonym.es/api/v1/links/lookup \ -H "Authorization: Bearer YOUR_TOKEN" \ --data-urlencode "short=https://anonym.es/k7m2q"
Detalles del enlace y estadísticas
GET /api/v1/links/{id}
Devuelve los ajustes del enlace, su estado, el número de visitas y el número de visitantes únicos durante toda su vida:
curl https://anonym.es/api/v1/links/4821 \ -H "Authorization: Bearer YOUR_TOKEN"
Con un token de cuenta, el parámetro stats añade un informe de visitas:
curl "https://anonym.es/api/v1/links/4821?stats=day" \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
| Valor | Periodo del informe |
|---|---|
day | Últimos 30 días, por día |
week | Últimas 26 semanas, por semana ISO |
month | Últimos 24 meses, por mes |
Campos de la respuesta: stats
| Campo | Tipo | Qué hace |
|---|---|---|
mode | string | day, week o month. |
from | string | Primer día del informe, AAAA-MM-DD. |
to | string | Último día del informe. |
series | array | Una entrada por periodo, los más antiguos primero: [from, to, visits, uniques]. |
summary | object | cur (el periodo actual), prev (el anterior), avg (la media de los periodos anteriores al actual), cada uno con hits y uniq. |
dims | object | Desglose del rango: ref, country, device, os, browser, hour, cada uno una lista de [valor, visitas]. |
Editar un enlace
PATCH /api/v1/links/{id}
Solo cambian los campos enviados:
curl -X PATCH https://anonym.es/api/v1/links/4821 \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"max_hits": 2000, "delay": 3, "tags": "blog,updated"}'
La edición requiere un plan de pago. Un token de enlace tiene los derechos del plan Free y no puede cambiar ajustes.
| Campo | Tipo | Qué hace |
|---|---|---|
url | string | Nuevo destino. Pro+ y superiores. |
name | string | Nuevo nombre (mismas reglas que un nombre propio). |
expires_days | integer | Nueva duración en días, vacío = sin caducidad. |
max_hits | integer | Nuevo límite de visitas, vacío = sin límite. |
self_destruct | boolean | Borrar de forma definitiva al alcanzar el límite o la duración, false lo desactiva. |
password | string | Nueva contraseña, una cadena vacía elimina la contraseña. |
note | string | Nueva nota, vacío la elimina (un enlace de solo nota sigue necesitando una). |
delay | integer | Segundos en la página de reenvío, vacío = valor por defecto del plan. |
no_countdown | boolean | true = sin cuenta atrás en la página de reenvío, false vuelve a activarla. |
adult | boolean | true = confirmación de edad (18+) antes de la página de redirección, false la quita. |
tags | string | Nueva lista de etiquetas separadas por comas, vacío elimina todas las etiquetas. |
Vaciar un valor
- password, note y tags: una cadena vacía elimina el valor.
- expires_days y max_hits: null, una cadena vacía o 0 quitan el límite. self_destruct se desactiva cuando no queda ni límite ni duración.
- delay: null o una cadena vacía restauran el valor por defecto del plan. 0 significa redirección inmediata.
- url no puede vaciarse, y un enlace de solo nota sigue necesitando una nota.
curl -X PATCH https://anonym.es/api/v1/links/4821 \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"password": "", "note": "", "expires_days": null, "max_hits": null, "delay": 0}'
Borrar un enlace
DELETE /api/v1/links/{id}
curl -X DELETE https://anonym.es/api/v1/links/4821 \ -H "Authorization: Bearer YOUR_TOKEN"
Tras el borrado, el nombre propio vuelve a quedar libre. Las estadísticas se borran junto con el enlace.
Campos de la respuesta:
| Campo | Tipo | Qué hace |
|---|---|---|
deleted | integer | El id del enlace borrado. |
Código QR
Para una etiqueta img de HTML, solicita el código por la dirección corta. Este endpoint no necesita token: la propia dirección corta es la clave, y cualquiera que la tenga puede generar el mismo código.
<img src="https://anonym.es/api/v1/qr?short=https%3A%2F%2Fanonym.es%2Fk7m2q&qr_size=400" alt="QR code" >
El código del lado del servidor también puede solicitar la imagen por id con un token, o recibirla en JSON codificada en base64 añadiendo qr=true a la llamada de creación o de detalles:
curl "https://anonym.es/api/v1/links/4821/qr?qr_size=400&qr_format=svg" \ -H "Authorization: Bearer YOUR_TOKEN" -o qr.svg
Parámetros de ambos endpoints de imagen:
| Campo | Tipo | Qué hace |
|---|---|---|
short | string, obligatorio | La dirección corta, por ejemplo https://anonym.es/abc12. |
qr_size | integer | Lado de la imagen QR en píxeles, 100–1000 (por defecto 300, el PNG se redondea a módulos enteros). |
qr_format | string | png (por defecto) o svg. |
qr_logo | boolean | false = código sin logotipo. Solo planes de pago, en caso contrario se ignora. |
El miembro qr en las respuestas JSON:
| Campo | Tipo | Qué hace |
|---|---|---|
format | string | png o svg. |
mime | string | image/png o image/svg+xml. |
size | integer | Longitud del lado solicitada en píxeles. |
logo | boolean | Si el logotipo se dibuja en el centro. |
base64 | string | La imagen, codificada en base64. |
Detalles de la cuenta
GET /api/v1/me
Requiere un token de cuenta. Devuelve el plan, sus límites y la cuota restante:
curl https://anonym.es/api/v1/me \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
| Campo | Tipo | Qué hace |
|---|---|---|
login | string | El login de la cuenta. |
plan | string | Clave del plan: free, pro, pro_plus, max o enterprise. |
plan_label | string | El nombre del plan tal como se muestra en el sitio. |
until | string | null | Cuándo termina el plan de pago, ISO 8601. null en Free o sin fecha de fin. |
limits | object | links (por periodo), per (day o month), ai_hourly (nombres propios por hora), name_min (nombre propio más corto), note_max (longitud de la nota), api_units (presupuesto de API por minuto). |
left | integer | null | Enlaces que quedan en el periodo de cuota actual, null sin límite. |
aliases | array | Los dominios extra que puede usar el plan. |
can | object | Un booleano por opción: password, ttl, edit, edit_url, tags, note, note_only, alias, sub, instant, qr_no_logo. |
API de correo temporal
Crea una dirección en uno de los dominios del plan, consúltala en busca de correo, lee los mensajes con sus resultados de autenticación, responde a los mensajes recibidos y elimina la dirección cuando termines. Hace falta un token de cuenta en Pro o superior. Se aplican los límites del plan.
Una dirección vive lo que permite el plan. Las cifras están en la tabla de más abajo. La llamada extend reinicia el reloj. Las respuestas y los envíos libres se cuentan por dirección y día UTC.
El correo de una dirección se guarda cifrado. La clave llega una sola vez, en el campo key de la respuesta que crea la dirección. El servidor no la conserva, así que guárdala tú. Envíala en la cabecera X-Mail-Key cuando pidas la lista, leas un mensaje, descargues un adjunto, pidas los enviados o respondas. El servidor abre el correo en memoria y solo para esa respuesta. Sin la cabecera, las filas vuelven con encrypted = true y sin contenido.
Crear una dirección
curl -X POST https://anonym.es/api/v1/mail/addresses \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"quiet-heron-41","domain":"anon.skin"}'
| Campo | Tipo | Qué hace |
|---|---|---|
name | string | Parte local, 3-30 letras, dígitos, puntos o guiones. Vacío = un nombre aleatorio. |
domain | string | Uno de los dominios del plan (ver /mail/domains). Por defecto, el primero. |
Campos de la respuesta: address
| Campo | Tipo | Qué hace |
|---|---|---|
id | integer | Id numérico de la dirección, usado por las demás llamadas. |
address | string | La dirección completa. |
domain | string | Su dominio. |
created_at | string | ISO 8601, UTC. |
expires_at | string | null | Cuándo desaparece la dirección, null en una dirección fijada. |
seconds_left | integer | null | Segundos hasta que desaparece, null = nunca. |
extends | integer | Prórrogas usadas. |
extends_left | integer | null | Extensiones restantes, null = sin límite. |
pinned | boolean | true cuando la dirección está fijada: sin reloj, vive mientras el plan esté activo. |
reserved | boolean | true cuando el plan ya no cubre esta dirección fijada. Conserva su nombre y recibe correo, y toda llamada que lee o envía responde address_reserved. |
reserved_left | integer | null | Segundos hasta que una dirección en reserva se elimine con su correo, null si no está en reserva. |
mails | integer | Messages in the inbox of the address. Only in the list of GET /mail/addresses. |
unread | integer | Unread messages among them. Only in the list of GET /mail/addresses. |
quota | object | Cuota de envío de hoy: replies, replies_left, sends, sends_left (día UTC). |
encrypted | boolean | true cuando el correo de la dirección se guarda cifrado. |
key | string | La clave secreta de la dirección, en base64. Solo llega en la respuesta a POST /mail/addresses y POST /mail/addresses/{id}/key. Se muestra una vez y no se guarda en el servidor. Envíala en la cabecera X-Mail-Key para leer correo, adjuntos y enviados y para responder. Pegada en el campo de clave de la dirección en el sitio, abre el correo también allí. Una clave perdida no se puede recuperar. |
Los dominios en los que tu plan puede crear direcciones:
curl https://anonym.es/api/v1/mail/domains \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
Cuántas direcciones da el plan a la vez y por hora, y cuántas quedan:
curl https://anonym.es/api/v1/mail/limits \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
Campos de la respuesta: limits
| Campo | Tipo | Qué hace |
|---|---|---|
addresses.limit | integer | null | Direcciones que el plan permite a la vez, null = sin límite. |
addresses.used | integer | Direcciones activas de la cuenta. |
new_per_hour.limit | integer | null | Direcciones nuevas que el plan permite por hora, null = sin límite. |
new_per_hour.left | integer | null | Direcciones nuevas que quedan en la hora actual, null = sin límite. |
new_per_hour.wait_min | integer | Minutos hasta poder crear una dirección nueva, 0 = ahora mismo. |
pinned.limit | integer | null | Cuántas direcciones permite fijar el plan, null = sin límite, 0 = ninguna. |
pinned.used | integer | Direcciones fijadas de la cuenta, incluidas las que están en reserva. |
pinned.reserved | integer | Cuántas de ellas esperan en reserva. |
¿Has perdido la clave? La llamada de abajo emite una nueva. El correo sellado con la clave anterior sigue cerrado.
curl -X POST https://anonym.es/api/v1/mail/addresses/17/key \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
Consultar la bandeja
curl https://anonym.es/api/v1/mail/addresses/17/messages \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \ -H "X-Mail-Key: ADDRESS_KEY"
Campos de la respuesta: messages[]
| Campo | Tipo | Qué hace |
|---|---|---|
id | integer | Id numérico del mensaje. |
from | string | Dirección del remitente. |
from_name | string | Nombre visible del remitente. |
subject | string | Asunto. |
preview | string | Primeros 140 caracteres del texto. |
received_at | string | ISO 8601, UTC. |
read | boolean | true cuando el mensaje se abrió (o se marcó como leído). |
verified | boolean | true cuando el dominio del remitente superó la autenticación (DMARC pass, o DKIM/SPF pass alineado con el dominio From); solo entonces se permite responder. |
verified_domain | string | null | El dominio autenticado, o null. |
attachments | integer | Número de adjuntos. |
encrypted | boolean | Presente y true cuando la petición no traía X-Mail-Key. La fila llega entonces sin contenido. Con la clave de la dirección, el servidor abre el mensaje en memoria para esta respuesta y no conserva ni la clave ni el texto. |
read es false hasta que el mensaje se obtiene completo o se marca como leído. Para mirar sin marcar, añade keep_unread=true a la petición completa.
Leer un mensaje
curl https://anonym.es/api/v1/mail/addresses/17/messages/2 \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \ -H "X-Mail-Key: ADDRESS_KEY"
El mensaje completo añade estos campos a los de la lista:
| Campo | Tipo | Qué hace |
|---|---|---|
text | string | Cuerpo en texto plano. |
html | string | Cuerpo HTML, si existe (mostrar en un entorno aislado). |
attachments | array | Adjuntos con n, name, type, size y url. La url es la dirección de descarga y necesita el mismo token. |
auth | object | Resultados de autenticación de Cloudflare: spf, dkim, dkim_domain, dmarc. |
Solo se permite responder cuando verified es true.
Marcar un mensaje como leído o no leído:
curl -X PATCH https://anonym.es/api/v1/mail/addresses/17/messages/2 \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"read": false}'
Responder
curl -X POST https://anonym.es/api/v1/mail/addresses/17/messages/2/reply \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "X-Mail-Key: ADDRESS_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Confirmed, thanks."}'
La respuesta va a la dirección From del mensaje, en el mismo hilo (In-Reply-To y References), y cuenta para las respuestas diarias del plan.
Enviar un mensaje
curl -X POST https://anonym.es/api/v1/mail/addresses/17/send \
-H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"to":"[email protected]","subject":"Hello","text":"Sent from a temporary address."}'
| Campo | Tipo | Qué hace |
|---|---|---|
to | string, obligatorio | Dirección del destinatario. |
subject | string, obligatorio | Asunto. |
text | string, obligatorio | Texto del mensaje (texto plano, hasta 4000 caracteres). |
Enviados
curl https://anonym.es/api/v1/mail/addresses/17/sent \ -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \ -H "X-Mail-Key: ADDRESS_KEY"
| Campo | Tipo | Qué hace |
|---|---|---|
id | integer | Id numérico del envío. |
kind | string | reply o free. |
to | string | Destinatario. |
subject | string | Asunto. |
text | string | El texto enviado. |
created_at | string | ISO 8601, UTC. |
reply_to | integer | null | Id del mensaje respondido; null en un envío libre. |
Correo temporal por plan
| Plan | Direcciones a la vez | Direcciones nuevas por hora | Duración | Prórrogas | Respuestas / día | Envíos libres / día | Dominios |
|---|---|---|---|---|---|---|---|
| Free | 1 | 10 | 2 h | 2 | 0 | 0 | 4 |
| Pro | 3 | 30 | 12 h | 6 | 1 | 0 | 9 |
| Pro+ | 10 | 60 | 2 d | 6 | 3 | 1 | 14 |
| Max | 30 | 150 | 7 d | 7 | 10 | 2 | 23 |
| Enterprise | sin límite | sin límite | 30 d | sin límite | sin límite | sin límite | 23 |
Errores
Los errores se devuelven en un único formato JSON:
{
"ok": false,
"error": "taken",
"message": "This name is already taken.",
"field": "name",
"suggest": ["my-article-26", "my-my-article", "my-article-link"]
}
field contiene el nombre del parámetro incorrecto, o null cuando el error no se refiere a un campo concreto. Un nombre ocupado añade suggest, una opción de pago añade upgrade, las cuotas y los límites de ritmo añaden la cabecera Retry-After.
| HTTP | Significado |
|---|---|
400 | Error en los parámetros de la petición |
401 | Token ausente o no válido |
403 | El plan o el tipo de token no permiten esta llamada |
404 | El enlace no existe o pertenece a otra persona |
405 | Método no permitido para esta ruta |
409 | El nombre propio está ocupado |
429 | Límite de ritmo o cuota agotados, véase Retry-After |
501 | PNG no está disponible en este servidor, solicita svg |
Todos los códigos de error
| Código | HTTP | Campo | Qué hace |
|---|---|---|---|
bad_request | 400 | Petición mal formada. | |
bad_url | 400 | url | Falta la dirección o no es una URL http(s) válida. |
blocked | 400 | url | No se puede enlazar a este destino. |
bad_name | 400 | name | Este nombre no está permitido. |
dirty | 400 | name | Este nombre no está permitido. |
brand | 400 | name | Este nombre parece una marca y no puede usarse. |
reserved | 400 | name | Este nombre está reservado. |
too_short | 400 | name | El nombre es demasiado corto para tu plan. |
sub_format | 400 | name | Un nombre de subdominio tiene de 3 a 32 letras, dígitos o guiones. |
sub_main | 400 | domain | Los enlaces de subdominio solo existen en los dominios extra. |
name_batch | 400 | name | Un nombre propio sirve para una sola dirección, no para un lote. |
taken | 409 | name | Este nombre ya está ocupado. |
note_long | 400 | note | La nota es más larga de lo que permite tu plan. |
note_required | 400 | note | Un enlace de solo nota necesita una nota. |
bad_tag | 400 | tags | Etiquetas: hasta 5, cada una de hasta 24 caracteres. |
pro_only | 403 | Esta opción requiere un plan de pago. | |
max_only | 403 | Los enlaces de subdominio requieren el plan Max. | |
account_only | 403 | Esta llamada requiere un token de cuenta. | |
limit | 429 | La cuota de enlaces de este periodo está agotada. | |
domain_limit | 429 | url | El límite diario de enlaces a este sitio sin cuenta se ha agotado. |
ai_limit | 429 | name | Demasiados nombres propios en esta hora, inténtalo más tarde. |
rate_limited | 429 | Demasiadas peticiones, reduce el ritmo. | |
busy | 429 | Se están creando demasiados enlaces a la vez, reinténtalo en un momento. | |
auth | 401 | Token ausente o no válido. | |
not_found | 404 | No existe ese enlace. | |
no_route | 404 | No existe ese endpoint. | |
method | 405 | Método no permitido. | |
fetch | 500 | No se pudo crear el enlace, inténtalo de nuevo. | |
qr_unavailable | 501 | qr_format | Los códigos QR en PNG no están disponibles en este servidor, solicita svg. |
no_address | 404 | No existe esa dirección. | |
no_message | 404 | No existe ese mensaje. | |
bad_domain | 400 | domain | Este dominio no está en tu plan. |
addr_limit | 429 | Se alcanzó el límite de direcciones del plan. Borra una primero. | |
new_rate | 429 | Se alcanzó el límite por hora de direcciones nuevas del plan. Inténtalo más tarde. | |
extend_limit | 429 | No quedan extensiones para esta dirección. | |
no_expiry | 400 | Esta dirección no caduca. | |
address_reserved | 409 | La dirección está en reserva: el plan ya no la cubre. Renueva el plan o haz temporal la dirección. | |
pin_plan | 403 | Las direcciones fijadas vienen con un plan de pago. | |
pin_limit | 429 | El plan no permite fijar más direcciones. | |
pin_domain | 400 | Las direcciones de este dominio no se pueden fijar. | |
temp_no_room | 429 | El plan no tiene sitio libre para esta dirección. Elimina antes una dirección. | |
unverified | 403 | El remitente de este mensaje no pasó la autenticación, así que no se puede responder. | |
reply_limit | 429 | Hoy no quedan respuestas para esta dirección. | |
send_limit | 429 | Hoy no quedan envíos libres para esta dirección. | |
send_off | 403 | El envío no forma parte de este plan. | |
bad_to | 400 | to | Indica una dirección de destinatario válida. |
bad_subject | 400 | subject | Hace falta un asunto. |
empty | 400 | text | El texto del mensaje está vacío. |
send_unavailable | 503 | El envío aún no está activado para esta dirección. | |
send_rejected | 422 | to | El servicio de correo rechazó este mensaje. Revisa la dirección del destinatario o inténtalo más tarde. |
send_failed | 502 | No se pudo enviar el mensaje. Inténtalo dentro de un minuto. | |
key_required | 403 | El correo de esta dirección está cifrado. Envía la clave de la dirección en la cabecera X-Mail-Key. | |
bad_key | 403 | La cabecera X-Mail-Key no contiene la clave de esta dirección. | |
site_address | 403 | Esta dirección se creó en el sitio. Su clave está en el navegador y la API no puede sustituirla. | |
worker | 502 | El servicio de correo no respondió. Inténtalo en un momento. |
Límites de ritmo
Cada llamada cuesta unidades y cada plan dispone de un presupuesto de unidades por minuto (véase Planes y límites). Una lectura cuesta 1 unidad, una página de lista 2, un código QR 3, una edición 3, un borrado 2, una creación 5 más 1 por dirección. Cada respuesta lleva estas cabeceras:
| Cabecera | Valor |
|---|---|
X-RateLimit-Limit | Presupuesto de unidades por minuto |
X-RateLimit-Remaining | Unidades que quedan en el minuto actual |
X-RateLimit-Reset | Segundos hasta que se renueva el presupuesto |
Retry-After | Con 429: segundos que esperar antes de reintentar |
En cualquier ventana de 10 segundos puede gastarse como máximo un cuarto del presupuesto por minuto, con un mínimo de 20 unidades. Cuando el presupuesto se agota, la API responde con el estado 429.
Planes y límites
Los límites exactos de cada plan. Los enlaces se cuentan por día y dirección IP en Free, y por mes y cuenta en los planes de pago. La última columna enumera los ajustes que puede usar cada plan.
| Plan | Enlaces | Nombres propios por hora | Nombre más corto | Longitud de la nota | Unidades por minuto | Ajustes |
|---|---|---|---|---|---|---|
| Free | 5 al día por dirección IP | 5 | 5 | 0 | 60 | ninguno |
| Pro | 500 al mes | 10 | 3 | 300 | 150 | password, expires_days, max_hits, edit, tags, note, domain, delay, qr_logo |
| Pro+ | 2,000 al mes | 50 | 3 | 2,000 | 400 | password, expires_days, max_hits, edit, edit url, tags, note, note_only, domain, delay, qr_logo |
| Max | 50,000 al mes | 200 | 3 | 5,000 | 1,000 | password, expires_days, max_hits, edit, edit url, tags, note, note_only, domain, sub, delay, qr_logo |
| Enterprise | sin límite | sin límite | 3 | 5,000 | 2,500 | password, expires_days, max_hits, edit, edit url, tags, note, note_only, domain, sub, delay, qr_logo |
Sin token de cuenta, la creación se contabiliza en la cuota Free de la dirección IP: 5 enlaces al día. Los enlaces a un dominio registrado hace menos de un año comparten un único cupo de invitado de 5 al día, quienquiera que los cree. Por cada llamante pueden estar creándose como máximo 2 enlaces al mismo tiempo.
Especificación OpenAPI
La descripción técnica completa como documento OpenAPI 3.1: https://anonym.es/api/v1/openapi.json
Contiene esquemas y ejemplos de todas las peticiones y respuestas, los límites de los planes, las reglas de los nombres y los códigos de error. Sirve para Swagger UI, Postman, Insomnia y generadores de clientes.