anonym.es

API ссылок

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

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

http://anonym.es/api/v1

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

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

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

Токен для этого вызова не требуется. Без него ссылка создаётся как гостевая в рамках квоты Free вашего IP-адреса.

С токеном аккаунта тот же вызов помещает ссылку в ваш кабинет и учитывает её в квоте тарифа:

curl -X POST http://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": "http://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Страница перехода без отсчёта, ждёт нажатия на адрес.
adultbooleanVisitors confirm being 18 or older before the forwarding page.
notestring | nullЗаметка на странице перехода.
tagsstring[]Теги в нижнем регистре.
clicksintegerПереходы за всё время жизни ссылки.
uniquesintegerУникальные посетители (один на адрес в сутки) за всё время жизни ссылки.

Авторизация

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

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

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

Пример:

curl http://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.

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

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

POST /api/v1/links

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

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

С токеном аккаунта ссылка принадлежит аккаунту и учитывается в квоте тарифа. Без токена это гостевая ссылка в квоте IP-адреса:

curl -X POST http://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 http://anonym.es/api/v1/links \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/article","name":"my-article"}'

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

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

curl "http://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 http://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 http://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Без отсчёта на странице перехода: нет таймера и автоматического перехода, посетитель нажимает на адрес. Платные тарифы.
adultbooleanAdult content (18+): visitors confirm their age on a page of its own before anything else is shown. Every plan.
tagsstringТеги через запятую (до 5, по 24 символа). Токен аккаунта на платном тарифе.
qrbooleanДобавить в ответ QR-код короткого адреса (base64).
qr_sizeintegerСторона изображения QR в пикселях, 100–1000 (по умолчанию 300, PNG округляется до целых модулей).
qr_formatstringpng (по умолчанию) или svg.
qr_logobooleanfalse = код без логотипа. Только платные тарифы, иначе игнорируется.

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

GET /api/v1/links

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

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

curl "http://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 "http://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 http://anonym.es/api/v1/links/lookup \
  -H "Authorization: Bearer YOUR_TOKEN" \
  --data-urlencode "short=http://anonym.es/k7m2q"

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

GET /api/v1/links/{id}

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

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

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

curl "http://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 http://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 = age confirmation (18+) before the forwarding page; false removes it.
tagsstringНовый список тегов через запятую, пусто удаляет все теги.

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

curl -X PATCH http://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 http://anonym.es/api/v1/links/4821 \
  -H "Authorization: Bearer YOUR_TOKEN"

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

Поля ответа:

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

QR-код

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

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

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

curl "http://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 http://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.

Ошибки

Ошибки возвращаются в едином 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.

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

Каждый вызов стоит единицы, а у каждого тарифа есть бюджет единиц в минуту (см. «Тарифы и ограничения»). Чтение стоит 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: http://anonym.es/api/v1/openapi.json

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