anonym.es

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.

EnlacesCorreo temporalErrores

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.

CampoTipoQué hace
idintegerId numérico del enlace, usado por las demás llamadas.
shortstringLa dirección corta para compartir.
urlstring | nullEl destino, null en un enlace de solo nota.
statusstringactive | expired | exhausted (límite de visitas alcanzado) | flagged (destino en una lista de seguridad) | banned.
passwordbooleanLos visitantes deben introducir una contraseña.
created_atstringISO 8601, UTC.
expires_atstring | nullCuándo caduca el enlace, null = sin caducidad.
max_hitsinteger | nullLímite de visitas, null = sin límite.
self_destructbooleanEl enlace se borra solo, de forma definitiva, al alcanzar el límite o la duración.
delayinteger | nullSegundos en la página de reenvío, null = valor del plan, 0 = inmediato.
no_countdownbooleanLa página de reenvío no muestra cuenta atrás y espera un clic en la dirección.
adultbooleanLos visitantes confirman que tienen 18 años o más antes de la página de redirección.
notestring | nullLa nota mostrada en la página de reenvío.
tagsstring[]Etiquetas, en minúsculas.
clicksintegerVisitas durante toda la vida del enlace.
uniquesintegerVisitantes ú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
TokenDónde obtenerloPara qué sirve
Token de cuentaEn el panelTodos los enlaces de la cuenta, con los derechos del plan
Token de enlaceSe devuelve al crear un enlaceUn 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étodoRutaTokenCosteQué hace
GET/api/v1opcional1Sobre esta API: versión, direcciones de la documentación y del esquema.
POST/api/v1/linksopcional5 + 1/urlCrear 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/checkopcional2¿Está disponible este nombre propio? Sugerencias cuando está ocupado.
GET/api/v1/linksde cuenta2Los enlaces de la cuenta, los más nuevos primero.
GET/api/v1/links/lookupde enlace o de cuenta1Encontrar uno de tus enlaces por su dirección corta.
GET/api/v1/links/{id}de enlace o de cuenta1Un 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 cuenta3Cambiar 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 cuenta2Borrar el enlace. El nombre vuelve a quedar libre.
GET/api/v1/links/{id}/qrde enlace o de cuenta3El 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/qropcional3El 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/mede cuenta1La cuenta: plan, límites, cuota restante, dominios extra, lo que permite el plan.
GET/api/v1/openapi.jsonopcional1Esta API como documento OpenAPI 3.1.

Correo temporal

MétodoRutaTokenCosteQué hace
GET/api/v1/mail/domainsde cuenta1Correo 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/limitsde cuenta1Correo temporal: cuántas direcciones da el plan a la vez y por hora, y cuántas quedan.
GET/api/v1/mail/addressesde cuenta2Correo temporal: las direcciones activas de la cuenta con su tiempo restante.
POST/api/v1/mail/addressesde cuenta5Correo 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 cuenta1Correo temporal: una dirección con su tiempo restante, prórrogas y cuota de envío de hoy.
POST/api/v1/mail/addresses/{id}/keyde cuenta3Correo 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}/pinde cuenta3Correo 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}/unpinde cuenta3Correo temporal: hacer temporal una dirección fijada o en reserva. El reloj del plan empieza de inmediato.
POST/api/v1/mail/addresses/{id}/extendde cuenta3Correo 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 cuenta2Correo temporal: eliminar la dirección con todo su contenido.
GET/api/v1/mail/addresses/{id}/messagesde cuenta2Correo 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 cuenta1Correo 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 cuenta3Correo temporal: marcar un mensaje como leído o no leído.
DELETE/api/v1/mail/addresses/{id}/messages/{mid}de cuenta2Correo temporal: eliminar un mensaje.
GET/api/v1/mail/addresses/{id}/messages/{mid}/attachments/{n}de cuenta1Correo temporal: un adjunto como descarga de archivo. Necesita X-Mail-Key.
POST/api/v1/mail/addresses/{id}/messages/{mid}/replyde cuenta5Correo 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}/sendde cuenta5Correo temporal: enviar un mensaje a cualquier dirección (envíos libres del plan).
GET/api/v1/mail/addresses/{id}/sentde cuenta2Correo 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:

CampoTipoQué hace
linkobjectEl enlace creado.
tokenstringEl token de enlace (32 caracteres), gestiona este enlace.
leftinteger | nullEnlaces que quedan en el periodo de cuota actual, null cuando el plan no tiene límite.
qrobjectEl código QR, presente cuando se envió qr=true.
batchbooleantrue cuando se enviaron varias direcciones.
resultsarrayUna 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:

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:

CampoTipoQué hace
availablebooleantrue cuando el nombre puede usarse.
namestringEl nombre comprobado.
errorstringPor qué el nombre no está disponible: taken, reserved, too_short y los demás errores de nombre.
messagestringEl motivo en palabras.
fieldstringSiempre name.
suggestarrayAlternativas 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.

CampoTipoQué hace
urlstring, obligatorioEl destino. O urls: varias direcciones, una por línea o como array JSON (hasta 50), cada una recibe su propio enlace.
namestringNombre propio para un solo enlace (comprobado con las reglas y el filtro de nombres).
domainstringOne 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.
subbooleanForma name.alias en lugar de alias/name. Plan Max, solo en los dominios extra.
expires_daysintegerDuración en días. Planes de pago.
max_hitsintegerLímite de visitas. Planes de pago.
self_destructbooleanBorrar el enlace de forma definitiva al alcanzar el límite de visitas o la duración (requiere max_hits o expires_days).
passwordstringContraseña que deben introducir los visitantes. Planes de pago.
notestringTexto mostrado en la página de reenvío. Planes de pago, longitud según el plan.
note_onlybooleanEl enlace abre la propia nota, sin destino. Pro+ y superiores.
delayintegerSegundos en la página de reenvío, 0 = inmediato. Planes de pago.
no_countdownbooleanSin 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.
adultbooleanContenido para adultos (18+): el visitante confirma su edad en una página aparte antes de ver nada más. En todos los planes.
tagsstringEtiquetas separadas por comas (hasta 5, de 24 caracteres cada una). Tokens de cuenta en planes de pago.
qrbooleanIncluir en la respuesta el código QR de la dirección corta (base64).
qr_sizeintegerLado de la imagen QR en píxeles, 100–1000 (por defecto 300, el PNG se redondea a módulos enteros).
qr_formatstringpng (por defecto) o svg.
qr_logobooleanfalse = 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"
CampoTipoQué hace
pageintegerNúmero de página (por defecto 1).
perintegerEnlaces por página, 1–100 (por defecto 50).
qstringBúsqueda en el nombre corto, el dominio y el destino (una lista plana, hasta 50).
tagstringSolo 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:

CampoTipoQué hace
pageintegerPágina actual.
perintegerEnlaces por página.
totalintegerNúmero de enlaces encontrados.
pagesintegerNúmero de páginas.
linksarrayObjetos 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"
ValorPeriodo 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

CampoTipoQué hace
modestringday, week o month.
fromstringPrimer día del informe, AAAA-MM-DD.
tostringÚltimo día del informe.
seriesarrayUna entrada por periodo, los más antiguos primero: [from, to, visits, uniques].
summaryobjectcur (el periodo actual), prev (el anterior), avg (la media de los periodos anteriores al actual), cada uno con hits y uniq.
dimsobjectDesglose 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.

CampoTipoQué hace
urlstringNuevo destino. Pro+ y superiores.
namestringNuevo nombre (mismas reglas que un nombre propio).
expires_daysintegerNueva duración en días, vacío = sin caducidad.
max_hitsintegerNuevo límite de visitas, vacío = sin límite.
self_destructbooleanBorrar de forma definitiva al alcanzar el límite o la duración, false lo desactiva.
passwordstringNueva contraseña, una cadena vacía elimina la contraseña.
notestringNueva nota, vacío la elimina (un enlace de solo nota sigue necesitando una).
delayintegerSegundos en la página de reenvío, vacío = valor por defecto del plan.
no_countdownbooleantrue = sin cuenta atrás en la página de reenvío, false vuelve a activarla.
adultbooleantrue = confirmación de edad (18+) antes de la página de redirección, false la quita.
tagsstringNueva lista de etiquetas separadas por comas, vacío elimina todas las etiquetas.

Vaciar un valor

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:

CampoTipoQué hace
deletedintegerEl 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:

CampoTipoQué hace
shortstring, obligatorioLa dirección corta, por ejemplo https://anonym.es/abc12.
qr_sizeintegerLado de la imagen QR en píxeles, 100–1000 (por defecto 300, el PNG se redondea a módulos enteros).
qr_formatstringpng (por defecto) o svg.
qr_logobooleanfalse = código sin logotipo. Solo planes de pago, en caso contrario se ignora.

El miembro qr en las respuestas JSON:

CampoTipoQué hace
formatstringpng o svg.
mimestringimage/png o image/svg+xml.
sizeintegerLongitud del lado solicitada en píxeles.
logobooleanSi el logotipo se dibuja en el centro.
base64stringLa 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"
CampoTipoQué hace
loginstringEl login de la cuenta.
planstringClave del plan: free, pro, pro_plus, max o enterprise.
plan_labelstringEl nombre del plan tal como se muestra en el sitio.
untilstring | nullCuándo termina el plan de pago, ISO 8601. null en Free o sin fecha de fin.
limitsobjectlinks (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).
leftinteger | nullEnlaces que quedan en el periodo de cuota actual, null sin límite.
aliasesarrayLos dominios extra que puede usar el plan.
canobjectUn 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"}'
CampoTipoQué hace
namestringParte local, 3-30 letras, dígitos, puntos o guiones. Vacío = un nombre aleatorio.
domainstringUno de los dominios del plan (ver /mail/domains). Por defecto, el primero.

Campos de la respuesta: address

CampoTipoQué hace
idintegerId numérico de la dirección, usado por las demás llamadas.
addressstringLa dirección completa.
domainstringSu dominio.
created_atstringISO 8601, UTC.
expires_atstring | nullCuándo desaparece la dirección, null en una dirección fijada.
seconds_leftinteger | nullSegundos hasta que desaparece, null = nunca.
extendsintegerPrórrogas usadas.
extends_leftinteger | nullExtensiones restantes, null = sin límite.
pinnedbooleantrue cuando la dirección está fijada: sin reloj, vive mientras el plan esté activo.
reservedbooleantrue 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_leftinteger | nullSegundos hasta que una dirección en reserva se elimine con su correo, null si no está en reserva.
mailsintegerMessages in the inbox of the address. Only in the list of GET /mail/addresses.
unreadintegerUnread messages among them. Only in the list of GET /mail/addresses.
quotaobjectCuota de envío de hoy: replies, replies_left, sends, sends_left (día UTC).
encryptedbooleantrue cuando el correo de la dirección se guarda cifrado.
keystringLa 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

CampoTipoQué hace
addresses.limitinteger | nullDirecciones que el plan permite a la vez, null = sin límite.
addresses.usedintegerDirecciones activas de la cuenta.
new_per_hour.limitinteger | nullDirecciones nuevas que el plan permite por hora, null = sin límite.
new_per_hour.leftinteger | nullDirecciones nuevas que quedan en la hora actual, null = sin límite.
new_per_hour.wait_minintegerMinutos hasta poder crear una dirección nueva, 0 = ahora mismo.
pinned.limitinteger | nullCuántas direcciones permite fijar el plan, null = sin límite, 0 = ninguna.
pinned.usedintegerDirecciones fijadas de la cuenta, incluidas las que están en reserva.
pinned.reservedintegerCuá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[]

CampoTipoQué hace
idintegerId numérico del mensaje.
fromstringDirección del remitente.
from_namestringNombre visible del remitente.
subjectstringAsunto.
previewstringPrimeros 140 caracteres del texto.
received_atstringISO 8601, UTC.
readbooleantrue cuando el mensaje se abrió (o se marcó como leído).
verifiedbooleantrue 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_domainstring | nullEl dominio autenticado, o null.
attachmentsintegerNúmero de adjuntos.
encryptedbooleanPresente 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:

CampoTipoQué hace
textstringCuerpo en texto plano.
htmlstringCuerpo HTML, si existe (mostrar en un entorno aislado).
attachmentsarrayAdjuntos con n, name, type, size y url. La url es la dirección de descarga y necesita el mismo token.
authobjectResultados 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."}'
CampoTipoQué hace
tostring, obligatorioDirección del destinatario.
subjectstring, obligatorioAsunto.
textstring, obligatorioTexto 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"
CampoTipoQué hace
idintegerId numérico del envío.
kindstringreply o free.
tostringDestinatario.
subjectstringAsunto.
textstringEl texto enviado.
created_atstringISO 8601, UTC.
reply_tointeger | nullId del mensaje respondido; null en un envío libre.

Correo temporal por plan

PlanDirecciones a la vezDirecciones nuevas por horaDuraciónPrórrogasRespuestas / díaEnvíos libres / díaDominios
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.

HTTPSignificado
400Error en los parámetros de la petición
401Token ausente o no válido
403El plan o el tipo de token no permiten esta llamada
404El enlace no existe o pertenece a otra persona
405Método no permitido para esta ruta
409El nombre propio está ocupado
429Límite de ritmo o cuota agotados, véase Retry-After
501PNG no está disponible en este servidor, solicita svg
Todos los códigos de error
CódigoHTTPCampoQué hace
bad_request400Petición mal formada.
bad_url400urlFalta la dirección o no es una URL http(s) válida.
blocked400urlNo se puede enlazar a este destino.
bad_name400nameEste nombre no está permitido.
dirty400nameEste nombre no está permitido.
brand400nameEste nombre parece una marca y no puede usarse.
reserved400nameEste nombre está reservado.
too_short400nameEl nombre es demasiado corto para tu plan.
sub_format400nameUn nombre de subdominio tiene de 3 a 32 letras, dígitos o guiones.
sub_main400domainLos enlaces de subdominio solo existen en los dominios extra.
name_batch400nameUn nombre propio sirve para una sola dirección, no para un lote.
taken409nameEste nombre ya está ocupado.
note_long400noteLa nota es más larga de lo que permite tu plan.
note_required400noteUn enlace de solo nota necesita una nota.
bad_tag400tagsEtiquetas: hasta 5, cada una de hasta 24 caracteres.
pro_only403Esta opción requiere un plan de pago.
max_only403Los enlaces de subdominio requieren el plan Max.
account_only403Esta llamada requiere un token de cuenta.
limit429La cuota de enlaces de este periodo está agotada.
domain_limit429urlEl límite diario de enlaces a este sitio sin cuenta se ha agotado.
ai_limit429nameDemasiados nombres propios en esta hora, inténtalo más tarde.
rate_limited429Demasiadas peticiones, reduce el ritmo.
busy429Se están creando demasiados enlaces a la vez, reinténtalo en un momento.
auth401Token ausente o no válido.
not_found404No existe ese enlace.
no_route404No existe ese endpoint.
method405Método no permitido.
fetch500No se pudo crear el enlace, inténtalo de nuevo.
qr_unavailable501qr_formatLos códigos QR en PNG no están disponibles en este servidor, solicita svg.
no_address404No existe esa dirección.
no_message404No existe ese mensaje.
bad_domain400domainEste dominio no está en tu plan.
addr_limit429Se alcanzó el límite de direcciones del plan. Borra una primero.
new_rate429Se alcanzó el límite por hora de direcciones nuevas del plan. Inténtalo más tarde.
extend_limit429No quedan extensiones para esta dirección.
no_expiry400Esta dirección no caduca.
address_reserved409La dirección está en reserva: el plan ya no la cubre. Renueva el plan o haz temporal la dirección.
pin_plan403Las direcciones fijadas vienen con un plan de pago.
pin_limit429El plan no permite fijar más direcciones.
pin_domain400Las direcciones de este dominio no se pueden fijar.
temp_no_room429El plan no tiene sitio libre para esta dirección. Elimina antes una dirección.
unverified403El remitente de este mensaje no pasó la autenticación, así que no se puede responder.
reply_limit429Hoy no quedan respuestas para esta dirección.
send_limit429Hoy no quedan envíos libres para esta dirección.
send_off403El envío no forma parte de este plan.
bad_to400toIndica una dirección de destinatario válida.
bad_subject400subjectHace falta un asunto.
empty400textEl texto del mensaje está vacío.
send_unavailable503El envío aún no está activado para esta dirección.
send_rejected422toEl servicio de correo rechazó este mensaje. Revisa la dirección del destinatario o inténtalo más tarde.
send_failed502No se pudo enviar el mensaje. Inténtalo dentro de un minuto.
key_required403El correo de esta dirección está cifrado. Envía la clave de la dirección en la cabecera X-Mail-Key.
bad_key403La cabecera X-Mail-Key no contiene la clave de esta dirección.
site_address403Esta dirección se creó en el sitio. Su clave está en el navegador y la API no puede sustituirla.
worker502El 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:

CabeceraValor
X-RateLimit-LimitPresupuesto de unidades por minuto
X-RateLimit-RemainingUnidades que quedan en el minuto actual
X-RateLimit-ResetSegundos hasta que se renueva el presupuesto
Retry-AfterCon 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.

PlanEnlacesNombres propios por horaNombre más cortoLongitud de la notaUnidades por minutoAjustes
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.