anonym.es

API ссылок и временной почты

API создаёт анонимные короткие ссылки, возвращает статистику переходов, изменяет настройки и удаляет ссылки. Запросы и ответы передаются в формате JSON. CORS включён, поэтому вызовы работают и из кода в браузере. На тарифах Pro и выше он же управляет временной почтой: создать адрес, опросить его на новые письма, ответить на входящие письма.

СсылкиВременная почтаОшибки

Базовый адрес:

https://anonym.es/api/v1

Быстрый старт

Чтобы создать короткую ссылку, отправьте адрес назначения:

curl -X POST https://anonym.es/api/v1/links \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/article"}'

Токен для этого вызова не требуется. Без него ссылка создаётся как гостевая в рамках квоты Free вашего 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"}'

Ответ содержит короткий адрес, идентификатор ссылки и токен управления этой ссылкой. Сохраните токен: он понадобится, чтобы позже прочитать или удалить ссылку.

{
  "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
}

Поля объекта ссылки

Все эндпоинты, возвращающие ссылку, используют эту структуру. Время указано в формате ISO 8601 в UTC. Счётчики clicks и uniques охватывают весь срок жизни ссылки.

ПолеТипЧто делает
idintegerЧисловой идентификатор ссылки, используется в остальных вызовах.
shortstringКороткий адрес, которым делятся.
urlstring | nullАдрес назначения, null у ссылки-заметки.
statusstringactive | expired | exhausted (лимит переходов исчерпан) | flagged (назначение в списке безопасности) | banned.
passwordbooleanПосетителю нужен пароль.
created_atstringISO 8601, UTC.
expires_atstring | nullКогда ссылка истекает, null = без срока.
max_hitsinteger | nullЛимит переходов, null = без лимита.
self_destructbooleanСсылка удаляется безвозвратно по достижении лимита или срока жизни.
delayinteger | nullСекунды на странице перехода, null = значение тарифа, 0 = мгновенно.
no_countdownbooleanСтраница перехода без отсчёта, ждёт нажатия на адрес.
adultbooleanПосетители подтверждают, что им есть 18, перед страницей перехода.
notestring | nullЗаметка на странице перехода.
tagsstring[]Теги в нижнем регистре.
clicksintegerПереходы за всё время жизни ссылки.
uniquesintegerУникальные посетители (один на адрес в сутки) за всё время жизни ссылки.

Авторизация

Авторизованные запросы передают токен в заголовке Authorization. Как альтернатива принимается заголовок X-API-Key. В строке запроса токены не передаются.

Authorization: Bearer YOUR_TOKEN
ТокенГде получитьДля чего
Токен аккаунтаВ личном кабинетеВсе ссылки аккаунта с правами тарифа
Токен ссылкиВозвращается при создании ссылкиОдна конкретная ссылка с правами тарифа Free

Токен аккаунта начинается с anon_. Токен ссылки состоит из 32 символов. Создание нового токена аккаунта отменяет предыдущий.

Пример:

curl https://anonym.es/api/v1/me \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"

Создать токен аккаунта в личном кабинете

Эндпоинты

Тело запроса передаётся как application/json или application/x-www-form-urlencoded. Имена параметров и коды ошибок одинаковы для всех эндпоинтов.

МетодПутьТокенЦенаЧто делает
GET/api/v1не обязателен1Сведения об API: версия, адреса документации и схемы.
POST/api/v1/linksне обязателен5 + 1/urlСоздать ссылку или до 50 сразу. Без токена: как гость, в рамках квоты Free. Возвращает ссылку с её токеном.
GET/api/v1/names/checkне обязателен2Свободно ли это имя? Если занято, варианты.
GET/api/v1/linksаккаунта2Ссылки аккаунта, новые первыми.
GET/api/v1/links/lookupссылки или аккаунта1Найти свою ссылку по короткому адресу.
GET/api/v1/links/{id}ссылки или аккаунта1Одна ссылка: настройки, состояние, переходы и уникальные посетители за всё время. Токен аккаунта может добавить отчёт статистики.
PATCH/api/v1/links/{id}ссылки или аккаунта3Изменить настройки. Меняются только переданные поля. Платные тарифы (у токена ссылки права Free, редактировать он не может).
DELETE/api/v1/links/{id}ссылки или аккаунта2Удалить ссылку. Имя снова становится свободным.
GET/api/v1/links/{id}/qrссылки или аккаунта3QR-код короткого адреса картинкой (PNG или SVG). Требует токен, поэтому подходит серверному коду.
GET/api/v1/qrне обязателен3QR-код короткого адреса картинкой без токена: ключом служит сам адрес. Сделан для тегов <img>.
GET/api/v1/meаккаунта1Аккаунт: тариф, ограничения, остаток квоты, дополнительные домены, доступные настройки.
GET/api/v1/openapi.jsonне обязателен1Это API в виде документа OpenAPI 3.1.

Временная почта

МетодПутьТокенЦенаЧто делает
GET/api/v1/mail/domainsаккаунта1Временная почта: домены, на которых тариф может создавать адреса, и какие из них принимают закреплённый адрес (pinnable).
GET/api/v1/mail/limitsаккаунта1Временная почта: сколько адресов тариф даёт одновременно и за час и сколько осталось.
GET/api/v1/mail/addressesаккаунта2Временная почта: живые адреса аккаунта с оставшимся временем.
POST/api/v1/mail/addressesаккаунта5Временная почта: создать временный адрес на одном из доменов тарифа. В ответе один раз приходит key, секретный ключ адреса. Письма хранятся зашифрованными, и открывает их только этот ключ. Передавайте его заголовком X-Mail-Key.
GET/api/v1/mail/addresses/{id}аккаунта1Временная почта: один адрес с оставшимся временем, продлениями и квотой отправки на сегодня.
POST/api/v1/mail/addresses/{id}/keyаккаунта3Временная почта: выдать новый ключ адресу, созданному через API, если его ключ потерян. Письма под старым ключом остаются закрытыми и продолжают приходить с encrypted = true.
POST/api/v1/mail/addresses/{id}/pinаккаунта3Временная почта: закрепить адрес. У закреплённого адреса нет таймера, он живёт на время активного тарифа или пока доступен домен.
POST/api/v1/mail/addresses/{id}/unpinаккаунта3Временная почта: сделать закреплённый или резервный адрес временным. Таймер тарифа запускается сразу.
POST/api/v1/mail/addresses/{id}/extendаккаунта3Временная почта: сбросить таймер адреса на полный срок тарифа (считается продлением).
DELETE/api/v1/mail/addresses/{id}аккаунта2Временная почта: удалить адрес со всем содержимым.
GET/api/v1/mail/addresses/{id}/messagesаккаунта2Временная почта: письма адреса, новые первыми, с флагом прочтения и вердиктом по отправителю. Нужен X-Mail-Key. Без него строки приходят с encrypted = true и без содержимого.
GET/api/v1/mail/addresses/{id}/messages/{mid}аккаунта1Временная почта: письмо целиком, с текстом, HTML, вложениями и результатами аутентификации. Помечает прочитанным. Нужен X-Mail-Key.
PATCH/api/v1/mail/addresses/{id}/messages/{mid}аккаунта3Временная почта: пометить письмо прочитанным или непрочитанным.
DELETE/api/v1/mail/addresses/{id}/messages/{mid}аккаунта2Временная почта: удалить письмо.
GET/api/v1/mail/addresses/{id}/messages/{mid}/attachments/{n}аккаунта1Временная почта: одно вложение файлом. Нужен X-Mail-Key.
POST/api/v1/mail/addresses/{id}/messages/{mid}/replyаккаунта5Временная почта: ответить на письмо. Разрешено, только если отправитель прошёл аутентификацию, и только ему. Нужен X-Mail-Key.
POST/api/v1/mail/addresses/{id}/sendаккаунта5Временная почта: отправить письмо на любой адрес (свободные отправки тарифа).
GET/api/v1/mail/addresses/{id}/sentаккаунта2Временная почта: письма, отправленные с этого адреса. Чтобы увидеть получателя, тему и текст, нужен X-Mail-Key.

Стоимость указана в единицах лимита запросов, см. раздел «Лимиты запросов».

Создание ссылки

POST /api/v1/links

Минимальный запрос содержит только поле url:

curl -X POST https://anonym.es/api/v1/links \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/article"}'

С токеном аккаунта ссылка принадлежит аккаунту и учитывается в квоте тарифа. Без токена это гостевая ссылка в квоте 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"}'

Успешный запрос возвращает статус 201 вместе со ссылкой, её токеном и числом ссылок, оставшихся в текущем периоде квоты.

Поля ответа:

ПолеТипЧто делает
linkobjectСозданная ссылка.
tokenstringТокен ссылки (32 символа), управляет этой ссылкой.
leftinteger | nullСколько ссылок осталось в текущем периоде квоты, null у тарифа без ограничения.
qrobjectQR-код, есть в ответе, если передан qr=true.
batchbooleantrue, если передано несколько адресов.
resultsarrayПо записи на каждый адрес в порядке отправки: {ok: true, link, token, qr} либо {ok: false, url, error, message, field}.

Ссылка с собственным именем

Короткий адрес получит имя my-article, если оно свободно и соответствует правилам ниже.

curl -X POST https://anonym.es/api/v1/links \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/article","name":"my-article"}'

Правила имён:

Имя можно проверить до создания ссылки:

curl "https://anonym.es/api/v1/names/check?name=my-article"

Поля ответа проверки:

ПолеТипЧто делает
availablebooleantrue, если имя можно использовать.
namestringПроверенное имя.
errorstringПочему имя недоступно: taken, reserved, too_short и другие ошибки имён.
messagestringПричина словами.
fieldstringВсегда name.
suggestarrayСвободные варианты, если имя занято.

Несколько ссылок за один запрос

Поле urls принимает до 50 адресов в виде JSON-массива или текста с одним адресом в строке. Каждый адрес становится отдельной ссылкой со своим токеном, а остальные поля применяются ко всем. Собственное имя в пакете недоступно.

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"]}'

Ответ содержит batch: true и массив results с записью на каждый адрес в порядке отправки. Ошибочный адрес даёт запись с ok: false и кодом ошибки, не прерывая остальные.

Дополнительные настройки

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"
  }'

Опции, отмеченные как платные, игнорируются для гостей и на тарифе Free. Ответ отражает настройки, которые ссылка получила фактически.

ПолеТипЧто делает
urlstring, обязательноеАдрес назначения. Либо urls: несколько адресов, по одному в строке или JSON-массивом (до 50), каждый становится отдельной ссылкой.
namestringСобственное имя для одной ссылки (проверяется по правилам и фильтру имён).
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.
subbooleanАдрес вида name.alias вместо alias/name. Тариф Max, только на дополнительных доменах.
expires_daysintegerСрок действия в днях. Платные тарифы.
max_hitsintegerЛимит переходов. Платные тарифы.
self_destructbooleanУдалить ссылку безвозвратно по достижении лимита переходов или срока жизни (требует max_hits или expires_days).
passwordstringПароль, который вводит посетитель. Платные тарифы.
notestringТекст на странице перехода. Платные тарифы, длина по тарифу.
note_onlybooleanСсылка открывает саму заметку, без перехода. Pro+ и выше.
delayintegerСекунды на странице перехода, 0 = мгновенно. Платные тарифы.
no_countdownbooleanБез отсчёта на странице перехода: нет таймера и автоматического перехода, посетитель нажимает на адрес. Платные тарифы.
adultbooleanКонтент для взрослых (18+): посетитель подтверждает возраст на отдельной странице, прежде чем увидит что-либо ещё. Доступно на всех тарифах.
tagsstringТеги через запятую (до 5, по 24 символа). Токен аккаунта на платном тарифе.
qrbooleanДобавить в ответ QR-код короткого адреса (base64).
qr_sizeintegerСторона изображения QR в пикселях, 100–1000 (по умолчанию 300, PNG округляется до целых модулей).
qr_formatstringpng (по умолчанию) или svg.
qr_logobooleanfalse = код без логотипа. Только платные тарифы, иначе игнорируется.

Список ссылок

GET /api/v1/links

Требуется токен аккаунта.

Требуется токен аккаунта. Ссылки возвращаются от новых к старым.

curl "https://anonym.es/api/v1/links?page=1&per=50" \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
ПолеТипЧто делает
pageintegerНомер страницы (по умолчанию 1).
perintegerСсылок на странице, 1–100 (по умолчанию 50).
qstringПоиск по имени, домену и адресу назначения (один плоский список до 50).
tagstringТолько ссылки с этим тегом.

Поиск и фильтр по тегу можно сочетать:

curl "https://anonym.es/api/v1/links?q=example&tag=promo" \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"

Поля ответа:

ПолеТипЧто делает
pageintegerТекущая страница.
perintegerСсылок на странице.
totalintegerСколько ссылок найдено.
pagesintegerСколько страниц.
linksarrayОбъекты ссылок, новые первыми.

Поиск ссылки по короткому адресу

Ссылка адресуется числовым идентификатором (поле id, например 4821), а не именем из короткого адреса. Если известен только короткий адрес, идентификатор можно получить любым токеном, который управляет этой ссылкой:

curl --get https://anonym.es/api/v1/links/lookup \
  -H "Authorization: Bearer YOUR_TOKEN" \
  --data-urlencode "short=https://anonym.es/k7m2q"

Сведения о ссылке и статистика

GET /api/v1/links/{id}

Возвращает настройки ссылки, её состояние, число переходов и число уникальных посетителей за всё время:

curl https://anonym.es/api/v1/links/4821 \
  -H "Authorization: Bearer YOUR_TOKEN"

С токеном аккаунта параметр stats добавляет отчёт о переходах:

curl "https://anonym.es/api/v1/links/4821?stats=day" \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
ЗначениеПериод отчёта
dayПоследние 30 дней, по дням
weekПоследние 26 недель, по неделям ISO
monthПоследние 24 месяца, по месяцам

Поля ответа: stats

ПолеТипЧто делает
modestringday, week или month.
fromstringПервый день отчёта, ГГГГ-ММ-ДД.
tostringПоследний день отчёта.
seriesarrayПо записи на период, старые первыми: [from, to, visits, uniques].
summaryobjectcur (текущий период), prev (предыдущий), avg (среднее по периодам до текущего), в каждом hits и uniq.
dimsobjectРазбивка за диапазон: ref, country, device, os, browser, hour, в каждом список [значение, переходы].

Изменение ссылки

PATCH /api/v1/links/{id}

Изменяются только переданные поля:

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"}'

Изменение доступно на платных тарифах. Токен ссылки обладает правами тарифа Free и не позволяет менять настройки.

ПолеТипЧто делает
urlstringНовый адрес назначения. Pro+ и выше.
namestringНовое имя (правила те же, что у собственного имени).
expires_daysintegerНовый срок действия в днях, пусто = без срока.
max_hitsintegerНовый лимит переходов, пусто = без лимита.
self_destructbooleanУдалить безвозвратно по достижении лимита или срока, false отключает.
passwordstringНовый пароль, пустая строка удаляет пароль.
notestringНовая заметка, пусто удаляет её (ссылке-заметке заметка нужна всегда).
delayintegerСекунды на странице перехода, пусто = значение тарифа по умолчанию.
no_countdownbooleantrue = без отсчёта на странице перехода, false возвращает отсчёт.
adultbooleantrue = подтверждение возраста (18+) перед страницей перехода, false убирает его.
tagsstringНовый список тегов через запятую, пусто удаляет все теги.

Сброс значения

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}'

Удаление ссылки

DELETE /api/v1/links/{id}
curl -X DELETE https://anonym.es/api/v1/links/4821 \
  -H "Authorization: Bearer YOUR_TOKEN"

После удаления собственное имя снова становится свободным. Статистика удаляется вместе со ссылкой.

Поля ответа:

ПолеТипЧто делает
deletedintegerИдентификатор удалённой ссылки.

QR-код

Для HTML-тега img запрашивайте код по короткому адресу. Этот эндпоинт не требует токена: ключом служит сам короткий адрес, и любой, кто его знает, может получить такой же код.

<img
  src="https://anonym.es/api/v1/qr?short=https%3A%2F%2Fanonym.es%2Fk7m2q&qr_size=400"
  alt="QR code"
>

Серверный код может также запросить изображение по идентификатору с токеном или получить его в JSON в кодировке base64, добавив qr=true к запросу создания или сведений:

curl "https://anonym.es/api/v1/links/4821/qr?qr_size=400&qr_format=svg" \
  -H "Authorization: Bearer YOUR_TOKEN" -o qr.svg

Параметры обоих эндпоинтов изображения:

ПолеТипЧто делает
shortstring, обязательноеКороткий адрес, например https://anonym.es/abc12.
qr_sizeintegerСторона изображения QR в пикселях, 100–1000 (по умолчанию 300, PNG округляется до целых модулей).
qr_formatstringpng (по умолчанию) или svg.
qr_logobooleanfalse = код без логотипа. Только платные тарифы, иначе игнорируется.

Поле qr в ответах JSON:

ПолеТипЧто делает
formatstringpng или svg.
mimestringimage/png или image/svg+xml.
sizeintegerЗапрошенная сторона в пикселях.
logobooleanНарисован ли логотип в центре.
base64stringИзображение в кодировке base64.

Сведения об аккаунте

GET /api/v1/me

Требуется токен аккаунта. Возвращает тариф, его ограничения и остаток квоты:

curl https://anonym.es/api/v1/me \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"
ПолеТипЧто делает
loginstringЛогин аккаунта.
planstringКлюч тарифа: free, pro, pro_plus, max или enterprise.
plan_labelstringНазвание тарифа, как на сайте.
untilstring | nullКогда заканчивается платный тариф, ISO 8601. null на Free или без даты окончания.
limitsobjectlinks (за период), per (day или month), ai_hourly (собственных имён в час), name_min (минимальная длина имени), note_max (длина заметки), api_units (бюджет API в минуту).
leftinteger | nullСколько ссылок осталось в текущем периоде квоты, null без ограничения.
aliasesarrayДополнительные домены, доступные тарифу.
canobjectПо флагу на настройку: password, ttl, edit, edit_url, tags, note, note_only, alias, sub, instant, qr_no_logo.

API временной почты

Создайте адрес на одном из доменов тарифа, опрашивайте его на новые письма, читайте сообщения с результатами аутентификации, отвечайте на входящие письма и удаляйте адрес, когда он больше не нужен. Нужен токен аккаунта на тарифе Pro и выше. Действуют лимиты тарифа.

Адрес живёт столько, сколько позволяет тариф. Сроки - в таблице ниже. Вызов extend сбрасывает таймер. Ответы и свободные отправки считаются на адрес за сутки по UTC.

Письма адреса хранятся зашифрованными. Ключ приходит один раз, в поле key ответа на создание адреса. На сервере он не хранится, поэтому сохраните его у себя. Присылайте ключ заголовком X-Mail-Key, когда запрашиваете список, читаете письмо, скачиваете вложение, смотрите отправленные или отвечаете. Сервер открывает письма в памяти и только на время этого ответа. Без заголовка строки приходят с encrypted = true и без содержимого.

Создать адрес

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"}'
ПолеТипЧто делает
namestringЛокальная часть, 3-30 букв, цифр, точек или дефисов. Пусто = случайное имя.
domainstringОдин из доменов тарифа (см. /mail/domains). По умолчанию первый.

Поля ответа: address

ПолеТипЧто делает
idintegerЧисловой id адреса для остальных вызовов.
addressstringПолный адрес.
domainstringЕго домен.
created_atstringISO 8601, UTC.
expires_atstring | nullКогда адрес исчезнет, null у закреплённого адреса.
seconds_leftinteger | nullСекунд до исчезновения, null = никогда.
extendsintegerИспользовано продлений.
extends_leftinteger | nullОсталось продлений, null = без ограничений.
pinnedbooleantrue, если адрес закреплён: таймера нет, адрес живёт, пока активен тариф.
reservedbooleantrue, если тариф больше не покрывает этот закреплённый адрес. Имя сохраняется, письма принимаются, а любой вызов чтения или отправки отвечает address_reserved.
reserved_leftinteger | nullСекунд до удаления резервного адреса вместе с письмами, null, если адрес не в резерве.
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.
quotaobjectКвота отправки на сегодня: replies, replies_left, sends, sends_left (сутки по UTC).
encryptedbooleantrue, когда письма адреса хранятся зашифрованными.
keystringСекретный ключ адреса в base64. Приходит только в ответе на POST /mail/addresses и POST /mail/addresses/{id}/key. Показывается один раз и на сервере не хранится. Передавайте его заголовком X-Mail-Key, чтобы читать письма, вложения и отправленные и отвечать. Если вставить его в поле ключа этого адреса на сайте, почта откроется и там. Потерянный ключ восстановить нельзя.

Домены, на которых ваш тариф может создавать адреса:

curl https://anonym.es/api/v1/mail/domains \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"

Сколько адресов тариф даёт одновременно и за час и сколько ещё осталось:

curl https://anonym.es/api/v1/mail/limits \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"

Поля ответа: limits

ПолеТипЧто делает
addresses.limitinteger | nullСколько адресов тариф даёт одновременно, null = без ограничений.
addresses.usedintegerЖивые адреса аккаунта.
new_per_hour.limitinteger | nullСколько новых адресов тариф даёт за час, null = без ограничений.
new_per_hour.leftinteger | nullСколько новых адресов осталось в текущем часе, null = без ограничений.
new_per_hour.wait_minintegerМинут до момента, когда можно создать новый адрес, 0 = прямо сейчас.
pinned.limitinteger | nullСколько адресов тариф даёт закрепить, null = без ограничений, 0 = нисколько.
pinned.usedintegerЗакреплённые адреса аккаунта, вместе с резервными.
pinned.reservedintegerСколько из них ждёт в резерве.

Потеряли ключ? Вызов ниже выдаст новый. Письма под старым ключом останутся закрытыми.

curl -X POST https://anonym.es/api/v1/mail/addresses/17/key \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN"

Опросить входящие

curl https://anonym.es/api/v1/mail/addresses/17/messages \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
  -H "X-Mail-Key: ADDRESS_KEY"

Поля ответа: messages[]

ПолеТипЧто делает
idintegerЧисловой id письма.
fromstringАдрес отправителя.
from_namestringИмя отправителя.
subjectstringТема.
previewstringПервые 140 символов текста.
received_atstringISO 8601, UTC.
readbooleantrue, когда письмо открыто (или помечено прочитанным).
verifiedbooleantrue, если домен отправителя прошёл аутентификацию (DMARC pass либо DKIM/SPF pass с выравниванием по домену From); только тогда разрешён ответ.
verified_domainstring | nullПодтверждённый домен или null.
attachmentsintegerЧисло вложений.
encryptedbooleanПрисутствует и равно true, когда в запросе не было X-Mail-Key. Тогда строка приходит без содержимого. С ключом адреса сервер открывает письмо в памяти на время этого ответа и не сохраняет ни ключ, ни текст.

Поле read остаётся false, пока письмо не запрошено целиком или не помечено прочитанным. Чтобы заглянуть без пометки, добавьте keep_unread=true к полному запросу.

Прочитать письмо

curl https://anonym.es/api/v1/mail/addresses/17/messages/2 \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
  -H "X-Mail-Key: ADDRESS_KEY"

Полное письмо добавляет к полям списка следующие:

ПолеТипЧто делает
textstringТекстовое тело письма.
htmlstringHTML-тело, если есть (показывать в песочнице).
attachmentsarrayВложения с полями n, name, type, size и url. url ведёт на загрузку и требует тот же токен.
authobjectРезультаты аутентификации Cloudflare: spf, dkim, dkim_domain, dmarc.

Ответ разрешён только при verified = true.

Пометить письмо прочитанным или непрочитанным:

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}'

Ответить

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."}'

Ответ уходит на адрес From письма, в той же цепочке (In-Reply-To и References), и списывается из ответов тарифа за сутки.

Отправить письмо

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."}'
ПолеТипЧто делает
tostring, обязательноеАдрес получателя.
subjectstring, обязательноеТема.
textstring, обязательноеТекст письма (простой текст, до 4000 символов).

Отправленные

curl https://anonym.es/api/v1/mail/addresses/17/sent \
  -H "Authorization: Bearer anon_YOUR_ACCOUNT_TOKEN" \
  -H "X-Mail-Key: ADDRESS_KEY"
ПолеТипЧто делает
idintegerЧисловой id отправленного письма.
kindstringreply или free.
tostringПолучатель.
subjectstringТема.
textstringОтправленный текст.
created_atstringISO 8601, UTC.
reply_tointeger | nullId письма, на которое это ответ; null для свободной отправки.

Временная почта по тарифам

ТарифАдресов одновременноНовых адресов в часВремя жизниПродленийОтветов / суткиСвободных / суткиДоменов
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 без ограничений без ограничений 30 d без ограничений без ограничений без ограничений 23

Ошибки

Ошибки возвращаются в едином JSON-формате:

{
  "ok": false,
  "error": "taken",
  "message": "This name is already taken.",
  "field": "name",
  "suggest": ["my-article-26", "my-my-article", "my-article-link"]
}

field содержит имя некорректного параметра или null, если ошибка не относится к конкретному полю. Занятое имя добавляет suggest, платная опция добавляет upgrade, квоты и лимиты частоты добавляют заголовок Retry-After.

HTTPЗначение
400Ошибка в параметрах запроса
401Токен отсутствует или недействителен
403Тариф или тип токена не позволяет этот вызов
404Ссылка не существует или принадлежит другому пользователю
405Метод не поддерживается для этого пути
409Собственное имя занято
429Исчерпан лимит запросов или квота, см. Retry-After
501PNG недоступен на этом сервере, запросите svg
Все коды ошибок
КодHTTPПолеЧто делает
bad_request400Некорректный запрос.
bad_url400urlАдрес отсутствует или не является корректным URL http(s).
blocked400urlНа этот адрес ссылку создать нельзя.
bad_name400nameЭто имя недопустимо.
dirty400nameЭто имя недопустимо.
brand400nameИмя похоже на название бренда и недоступно.
reserved400nameЭто имя зарезервировано.
too_short400nameИмя слишком короткое для вашего тарифа.
sub_format400nameИмя сабдомена это 3–32 буквы, цифры или дефисы.
sub_main400domainСсылки-сабдомены есть только на дополнительных доменах.
name_batch400nameСобственное имя работает для одного адреса, не для пакета.
taken409nameЭто имя уже занято.
note_long400noteЗаметка длиннее, чем разрешает ваш тариф.
note_required400noteСсылке-заметке нужна заметка.
bad_tag400tagsТеги: до 5, каждый до 24 символов.
pro_only403Эта опция требует платного тарифа.
max_only403Ссылки-сабдомены требуют тарифа Max.
account_only403Этот вызов требует токена аккаунта.
limit429Квота ссылок на этот период исчерпана.
domain_limit429urlДневной лимит ссылок на этот сайт без аккаунта исчерпан.
ai_limit429nameСлишком много собственных имён за час, повторите позже.
rate_limited429Слишком много запросов, снизьте частоту.
busy429Слишком много ссылок создаётся одновременно, повторите через мгновение.
auth401Токен отсутствует или недействителен.
not_found404Такой ссылки нет.
no_route404Такого эндпоинта нет.
method405Метод не поддерживается.
fetch500Не удалось создать ссылку, повторите попытку.
qr_unavailable501qr_formatQR-коды PNG недоступны на этом сервере, запросите svg.
no_address404Такого адреса нет.
no_message404Такого письма нет.
bad_domain400domainЭтот домен не входит в ваш тариф.
addr_limit429Достигнут лимит адресов тарифа. Сначала удалите один.
new_rate429Достигнут часовой лимит новых адресов по тарифу. Повторите позже.
extend_limit429Продления для этого адреса закончились.
no_expiry400Этот адрес бессрочный.
address_reserved409Адрес в резерве: тариф его больше не покрывает. Продлите тариф или сделайте адрес временным.
pin_plan403Закрепление адресов доступно на платных тарифах.
pin_limit429Тариф больше не даёт закреплять адреса.
pin_domain400Адреса на этом домене закрепить нельзя.
temp_no_room429По тарифу нет свободного места для этого адреса. Сначала удалите один из адресов.
unverified403Отправитель этого письма не прошёл аутентификацию, поэтому ответить на него нельзя.
reply_limit429Ответов на сегодня для этого адреса не осталось.
send_limit429Свободных отправок на сегодня для этого адреса не осталось.
send_off403Отправка не входит в этот тариф.
bad_to400toУкажите корректный адрес получателя.
bad_subject400subjectНужна тема.
empty400textТекст письма пуст.
send_unavailable503Отправка для этого адреса пока не включена.
send_rejected422toПочтовый сервис отклонил это письмо. Проверьте адрес получателя или попробуйте позже.
send_failed502Не удалось отправить письмо. Попробуйте через минуту.
key_required403Письма этого адреса зашифрованы. Передайте ключ адреса заголовком X-Mail-Key.
bad_key403В заголовке X-Mail-Key не ключ этого адреса.
site_address403Этот адрес создан на сайте. Его ключ хранится в браузере, и API не может его заменить.
worker502Почтовый сервис не ответил. Попробуйте чуть позже.

Лимиты частоты

Каждый вызов стоит единицы, а у каждого тарифа есть бюджет единиц в минуту (см. «Тарифы и ограничения»). Чтение стоит 1 единицу, страница списка 2, QR-код 3, редактирование 3, удаление 2, создание 5 плюс 1 за каждый адрес. Каждый ответ содержит заголовки:

ЗаголовокЗначение
X-RateLimit-LimitБюджет единиц в минуту
X-RateLimit-RemainingСколько единиц осталось в текущей минуте
X-RateLimit-ResetЧерез сколько секунд бюджет обновится
Retry-AfterПри 429: через сколько секунд повторить запрос

В любом окне длиной 10 секунд можно потратить не более четверти минутного бюджета, но не менее 20 единиц. При исчерпании бюджета API отвечает статусом 429.

Тарифы и ограничения

Точные ограничения каждого тарифа. Ссылки считаются за сутки на IP-адрес на Free и за месяц на аккаунт на платных тарифах. Последний столбец перечисляет настройки, доступные тарифу.

ТарифСсылокСобственных имён в часМин. длина имениДлина заметкиЕдиниц в минутуНастройки
Free 5 в сутки на IP-адрес 5 5 0 60 нет
Pro 500 в месяц 10 3 300 150 password, expires_days, max_hits, edit, tags, note, domain, delay, qr_logo
Pro+ 2,000 в месяц 50 3 2,000 400 password, expires_days, max_hits, edit, edit url, tags, note, note_only, domain, delay, qr_logo
Max 50,000 в месяц 200 3 5,000 1,000 password, expires_days, max_hits, edit, edit url, tags, note, note_only, domain, sub, delay, qr_logo
Enterprise без ограничений без ограничений 3 5,000 2,500 password, expires_days, max_hits, edit, edit url, tags, note, note_only, domain, sub, delay, qr_logo

Без токена аккаунта создание учитывается в квоте Free для IP-адреса: 5 ссылок в сутки. Ссылки на домен, зарегистрированный меньше года назад, делят одну гостевую квоту в 5 ссылок в сутки, кто бы их ни создавал. Одновременно у одного вызывающего может создаваться не более 2 ссылок.

Спецификация OpenAPI

Полное техническое описание в виде документа OpenAPI 3.1: https://anonym.es/api/v1/openapi.json

Документ содержит схемы и примеры всех запросов и ответов, ограничения тарифов, правила имён и коды ошибок. Подходит для Swagger UI, Postman, Insomnia и генераторов клиентов.