Импортёр Dub.co в Elido читает ваши ссылки через REST API Dub по 100 за запрос и создаёт их на одном домене Elido с тем же слагом. Он переносит слаг, целевой URL, заголовок и названия тегов. Он не переносит папки, архивные ссылки, историю кликов и любые настройки ссылок. Именно эти факты важны, если вы планируете переезд.
В более ранней версии этой статьи утверждалось, что папки Dub превращаются в теги. Я перечитал импортёр для этого обновления, и это было неверно: код папки вообще не читает. Эта версия описывает то, что services/api-core/internal/imports/dub.go делает сегодня, с проверкой по опубликованной спецификации API Dub (данные на 2026-10-02).
Что импортёр запрашивает у Dub
Воркер отправляет GET https://api.dub.co/links?page=N&pageSize=100 с вашим ключом в качестве bearer-токена. Согласно документации Dub по API-ключам (данные на 2026-10-02), ключ привязан к одному рабочему пространству и может быть создан только для чтения. Ключа только для чтения достаточно для этого импорта, потому что воркер лишь перечисляет ссылки и никогда ничего не пишет в Dub.
Ответ - простой JSON-массив. Флага "есть ещё" нет, поэтому воркер запрашивает страницы, пока не придёт страница короче 100 элементов или пустая:
if len(links) == 0 { break }
// ... import each link ...
if len(links) < dubPageSize { break } // last page
page++
Одна оговорка из собственной спецификации Dub: параметр page помечен устаревшим в пользу курсорной пагинации через startingAfter. Сегодня он ещё работает, а pageSize принимает до 100. Если Dub уберёт page, импортёру понадобится небольшая правка, и я ожидаю, что это проявится как неудавшаяся задача с понятной HTTP-ошибкой, а не как тихая потеря данных.
Страница лимитов Dub (данные на 2026-10-02) указывает 60 запросов в минуту на тарифе Free и 600 на Pro. Между запросами импортёр вставляет ссылки в Postgres по одной, так что на практике до лимита Free он не доходит. Повторных попыток у него нет: HTTP 429 или любой ответ не 200 завершает задачу как неудавшуюся с кодом статуса в сообщении.
Что попадает в Elido, поле за полем
| Поле Dub | В Elido | Примечания |
|---|---|---|
key | Слаг | Зависит от стратегии конфликтов ниже |
url | Целевой URL | Ссылка без URL или без ключа считается неудавшейся |
title | Заголовок | Обрезается до 200 символов |
tags[].name | Теги | Только названия, цвета не переносятся |
| (нет) | Тег imported:dub | Добавляется к каждой импортированной ссылке |
domain, folderId, archived, прочие | Не читаются | См. следующие два раздела |
Всё остальное в ссылке Dub отбрасывается: описание, превью для соцсетей, срок действия, пароль, гео- и девайс-таргетинг, поля UTM, цели для iOS и Android, флаги отслеживания конверсий. Если ссылка зависит от чего-то из этого, пересоберите её после импорта. У Elido есть собственные правила умных ссылок для таргетинга, но ничто не переносит правила Dub автоматически.
Папки, архивные ссылки и домены
Три понятия Dub не обрабатываются, и каждое может преподнести сюрприз.
Папки. В схеме ссылки Dub папка появляется только как строка folderId. У импортёра нет для неё поля, и он не делает второй вызов, чтобы получить названия папок. В Elido есть теги, а не папки, так что даже будущему импортёру пришлось бы их "сплющивать". Сегодня структура папок теряется. Если она важна, до начала запишите папку для каждого слага, а затем проставьте теги импортированной партии (фильтр по imported:dub) вручную или через API.
Архивные ссылки. Эндпоинт списка Dub принимает параметр showArchived, по умолчанию равный false. Импортёр его никогда не задаёт, поэтому архивные ссылки не возвращаются и не импортируются. Это разумное поведение по умолчанию для миграции, но знать о нём стоит, если вы намеренно держите старые кампанийные ссылки в архиве.
Домены ссылок. Рабочее пространство Dub может содержать ссылки на нескольких доменах. Импортёр читает все, игнорирует поле domain и создаёт каждую ссылку на единственном выбранном вами домене Elido. Если два домена Dub используют один и тот же ключ, второй попадает в конфликт. Дальше всё решает стратегия конфликтов, поэтому выбирайте её с учётом этого.
Конфликты, лимиты и контракт воркера
Стратегию конфликтов вы выбираете при запуске задачи:
suffixпробуетmylink-2,mylink-3и так далее до-50, затем отказывается от этой ссылки и считает её неудавшейся.skipне трогает существующую ссылку Elido и записывает слаг как пропущенный.failостанавливает всю задачу при первом конфликте.
За один запуск воркер останавливается на 50 000 ссылок (MaxLinksPerImport) или через 30 минут (ImportRunBudget), смотря что наступит раньше. Прогресс сохраняется каждые 50 ссылок, а панель его опрашивает. Журнал ошибок хранит не больше 1000 записей. Каждая проверка слага - один индексированный запрос по (domain_id, slug).
Я не замерял импорт из Dub на крупном аккаунте, поэтому не буду называть число ссылок в минуту. Цикл - это одна HTTP-страница из 100 ссылок и 100 последовательных вставок, так что длительность зависит от скорости ответа Dub и от вашей базы данных. Сначала проверьте на небольшом рабочем пространстве.
Обработка токена и что происходит при деплое
Ключ передаётся в теле запроса POST /imports/dub, хранится в памяти работающего воркера и нигде не сохраняется: поле source_token_id в строке задачи остаётся пустым. Только необязательный текст workspace_id попадает в колонку source_filter задачи.
Воркер работает в горутине, отделённой от HTTP-запроса через context.WithoutCancel. Это сохраняет его после ответа, а значит, деплой или перезапуск убьёт его посреди выполнения. Задача планировщика запускается каждые 5 минут и помечает как неудавшийся любой импорт в статусе running без прогресса в течение 30 минут. Повторный запуск безопасен при suffix (вы получите копии с -2 для всего, что уже импортировано) и при skip (уже импортированные слаги пропускаются). Возобновления с последней страницы пока нет.
Список ссылок в демо-пространстве с синтетическими данными. После импорта отфильтруйте по тегу imported:dub, чтобы найти партию.
Короткий чек-лист перед запуском
- Создайте API-ключ только для чтения в рабочем пространстве Dub.
- Верните из архива все архивные ссылки, которые хотите сохранить, и запишите структуру папок, на которую опираетесь.
- Добавьте целевой домен в Elido и выберите
skipилиsuffix, учитывая, что все домены Dub сольются в этот один. - Запустите импорт со страницы интеграции на панели или через
POST /imports/dubсtoken,target_domain_idиconflict_strategy. - Выборочно сверьте слаги и назначения с Dub, затем обновите DNS для любого собственного домена. Сценарий переключения с Bitly описывает порядок работы с DNS, он одинаков для любого вендора.
Если вы ещё решаете, переезжать ли вообще, Elido и Dub сравнивает тарифы и функции, а GDPR для сокращателей ссылок объясняет сторону резидентности данных. Пошаговое описание для вендора - на странице миграции с Dub.
Читайте также в блоге
Частые вопросы
Что импортёр Dub.co переносит в Elido?
Для каждой прочитанной ссылки импортёр переносит слаг (ключ Dub), целевой URL, заголовок (обрезанный до 200 символов) и названия тегов, а также добавляет тег imported:dub. Больше ничего из записи Dub не читается: ни описание, ни срок действия, ни пароль, ни поля UTM, ни правила таргетинга, ни счётчики кликов.
Сохранятся ли мои папки Dub при импорте?
Нет. Эндпоинт списка Dub возвращает для каждой ссылки только folderId, а не название папки, и импортёр папки не запрашивает. Импортированные ссылки сохраняют теги, но приходят без информации о папках. Если вы опираетесь на папки, до начала запишите, какой тег или шаблон слага соответствует каждой папке.
Импортируются ли архивные ссылки Dub?
По умолчанию нет. Эндпоинт списка Dub пропускает архивные ссылки, если не передан параметр showArchived, а импортёр его не передаёт. Верните из архива всё, что хотите сохранить, или создайте заново вручную, прежде чем запускать импорт.
Можно ли ограничить импорт одним рабочим пространством Dub?
API-ключ Dub принадлежит одному рабочему пространству, поэтому ключ уже ограничивает то, что попадает в список. API принимает необязательное поле workspace_id и передаёт его в Dub как параметр запроса, но среди документированных параметров списка Dub его нет. В форме на панели такого поля нет, так что считайте его пустой операцией.
Сколько ссылок можно импортировать за один запуск и сколько это займёт?
Запуск останавливается на 50 000 ссылок или через 30 минут, смотря что наступит раньше, и читает по 100 ссылок за запрос. При превышении задача помечается как неудавшаяся с сообщением о бюджете в точке остановки. Запуск без прогресса в течение 30 минут также принудительно помечается как неудавшийся.
Работает ли импортёр с self-hosted Dub?
Сегодня нет. База API жёстко задана как https://api.dub.co в коде, и нет ни настройки, ни переменной окружения, чтобы её изменить. Экземпляр self-hosted Dub нельзя указать через панель. Выгрузите ссылки из собственной базы данных и создайте их заново через API Elido.
Попробуйте Elido
Вставьте URL - получите короткую ссылку
Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.
Бесплатно, без регистрации · 2 в день