6 min de leituraEngenharia

Migração do Dub.co para o Elido: o que o importador faz

Um olhar no código do importador do Dub.co do Elido: as chamadas de API, os campos que ele traz, o que ignora (pastas, links arquivados) e seus limites.

Marius Voß
DevRel · edge infra
Diagrama de pipeline: a API REST do Dub.co à esquerda, passando pelo worker de importação do Elido até a tabela de links, com um painel lateral listando os limites (50 mil links, orçamento de 30 minutos, 100 por página)

O importador do Dub.co do Elido lê os seus links pela API REST do Dub, 100 por requisição, e os cria em um domínio do Elido com o mesmo slug. Ele traz o slug, a URL de destino, o título e os nomes das tags. Não traz pastas, links arquivados, histórico de cliques nem nenhuma configuração dos links. Esses são os fatos que importam se você está planejando uma migração.

Uma versão anterior deste post afirmava que as pastas do Dub se achatam em tags. Reli o importador para esta atualização e isso estava errado: o código nunca lê pastas. Esta versão descreve o que services/api-core/internal/imports/dub.go faz hoje, conferido com a especificação de API publicada do Dub (acessada em 2026-10-02).

O que o importador pede ao Dub

O worker envia GET https://api.dub.co/links?page=N&pageSize=100 com a sua chave como bearer token. Segundo a documentação de chaves de API do Dub (acessada em 2026-10-02), uma chave é vinculada a um único workspace e pode ser criada como somente leitura. Uma chave somente leitura é tudo de que esta importação precisa, porque o worker apenas lista links e nunca escreve no Dub.

A resposta é um array JSON simples. Não há uma flag de "tem mais", então o worker continua pedindo páginas até que uma volte com menos de 100 itens, ou vazia:

if len(links) == 0 { break }
// ... import each link ...
if len(links) < dubPageSize { break } // last page
page++

Uma ressalva da própria especificação do Dub: o parâmetro page está marcado como obsoleto em favor da paginação por cursor com startingAfter. Ele ainda funciona hoje, e pageSize aceita até 100. Se o Dub remover page, o importador precisará de uma pequena mudança, e eu esperaria que isso aparecesse como um job falho com um erro HTTP claro, e não como perda silenciosa de dados.

A página de limites de taxa do Dub (acessada em 2026-10-02) lista 60 requisições por minuto no plano Free e 600 no Pro. O importador insere os links um a um no Postgres entre as requisições, então na prática não chega perto do limite do Free. Também não há nova tentativa: um HTTP 429 ou qualquer resposta diferente de 200 encerra o job como falho, com o código de status na mensagem.

O que chega ao Elido, campo a campo

Campo do DubNo ElidoObservações
keySlugSujeito à estratégia de conflito abaixo
urlURL de destinoUm link sem URL ou sem key é contado como falho
titleTítuloTruncado em 200 caracteres
tags[].nameTagsApenas os nomes, as cores não são trazidas
(nenhum)Tag imported:dubAdicionada a todo link importado
domain, folderId, archived, outrosNão lidosVeja as próximas duas seções

Todo o resto em um link do Dub é descartado: descrição, imagem de pré-visualização social, expiração, senha, segmentação por região e dispositivo, campos UTM, destinos para iOS e Android, flags de rastreamento de conversão. Se um link depende de algum desses itens, reconstrua-o depois da importação. O Elido tem as suas próprias regras de smart links para segmentação, mas nada mapeia automaticamente as regras do Dub.

O pipeline de importação do Dub, da API REST pelo worker do Elido até a tabela de links, com uma lista lado a lado do que é trazido e do que não é

Três conceitos do Dub não são tratados, e cada um pode surpreender.

Pastas. No esquema de links do Dub, uma pasta aparece apenas como uma string folderId. O importador não tem campo para isso e não faz uma segunda chamada para resolver os nomes das pastas. O Elido tem tags, não pastas, então até um importador futuro teria de achatá-las. Hoje a estrutura de pastas se perde. Se ela importa, anote a pasta de cada slug antes de começar e depois marque o lote importado (filtre por imported:dub) à mão ou pela API.

Links arquivados. O endpoint de listagem do Dub aceita um parâmetro showArchived cujo padrão é falso. O importador nunca o define, então os links arquivados não são devolvidos nem importados. É um padrão razoável para uma migração, mas você deve saber disso se mantém links de campanhas antigas arquivados de propósito.

Domínios dos links. Um workspace do Dub pode ter links em vários domínios. O importador lê todos, ignora o campo domain e cria todos os links no único domínio do Elido que você escolher. Se dois domínios do Dub usam a mesma key, o segundo gera um conflito. A estratégia de conflito decide o que acontece em seguida, então escolha-a pensando nisso.

Conflitos, limites e o contrato do worker

Você escolhe uma estratégia de conflito ao iniciar o job:

  • suffix tenta mylink-2, mylink-3 e assim por diante até -50, depois desiste desse link e o conta como falho.
  • skip deixa o link existente do Elido em paz e registra o slug como ignorado.
  • fail interrompe o job inteiro no primeiro conflito.

Por execução, o worker para em 50.000 links (MaxLinksPerImport) ou após 30 minutos (ImportRunBudget), o que vier primeiro. O progresso é salvo a cada 50 links e o painel o consulta. O log de erros guarda no máximo 1.000 entradas. Cada verificação de slug é uma consulta indexada em (domain_id, slug).

Não fiz benchmark de importações do Dub com uma conta grande, então não vou citar um número de links por minuto. O laço é uma página HTTP de 100 links seguida de 100 inserções sequenciais, então a duração depende da rapidez com que o Dub responde e do seu banco de dados. Teste primeiro com um workspace pequeno.

Tratamento do token e o que acontece em um deploy

A chave viaja no corpo da requisição de POST /imports/dub, fica na memória do worker em execução e nunca é armazenada: o source_token_id da linha do job permanece vazio. Apenas o texto opcional workspace_id vai para a coluna source_filter do job.

O worker roda em uma goroutine desacoplada da requisição HTTP com context.WithoutCancel. Isso o mantém vivo depois da resposta, e também significa que um deploy ou reinício o mata no meio da execução. Um job do agendador roda a cada 5 minutos e marca como falha qualquer importação running sem progresso há 30 minutos. Executar de novo é seguro com suffix (você recebe cópias -2 de tudo que já foi importado) e com skip (os slugs já importados são ignorados). Nada retoma ainda a partir da última página.

Lista de links do Elido em um workspace de demonstração, com links curtos, destinos, cliques e colunas de tags, onde os links importados do Dub podem ser filtrados pela tag imported:dub

A lista de links em um workspace de demonstração com dados sintéticos. Depois de uma importação, filtre pela tag imported:dub para encontrar o lote.

Uma lista rápida antes de executar

  1. Crie uma chave de API somente leitura no seu workspace do Dub.
  2. Desarquive os links arquivados que quiser manter e anote qualquer estrutura de pastas da qual você dependa.
  3. Adicione o domínio de destino no Elido e escolha skip ou suffix sabendo que todos os domínios do Dub se reúnem nele.
  4. Execute a importação pela página de integração do painel, ou com POST /imports/dub passando token, target_domain_id e conflict_strategy.
  5. Confira por amostragem os slugs e destinos em relação ao Dub e depois atualize o DNS de qualquer domínio personalizado que você tenha. O playbook de transição do Bitly cobre a ordem do DNS, que é a mesma para qualquer fornecedor.

Se você ainda está decidindo se vale mudar, Elido vs Dub compara planos e recursos, e GDPR para encurtadores de URL explica o lado da residência de dados. O passo a passo voltado ao fornecedor está na página de migração do Dub.

Relacionados no blog

Perguntas frequentes

O que o importador do Dub.co traz para o Elido?

Para cada link que lê, o importador traz o slug (a key do Dub), a URL de destino, o título (cortado em 200 caracteres) e os nomes das tags, e adiciona uma tag imported:dub. Nada mais é lido do registro do Dub: nem descrição, nem expiração, nem senha, nem campos UTM, nem regras de segmentação, nem contagem de cliques.

As minhas pastas do Dub sobrevivem à importação?

Não. O endpoint de listagem do Dub devolve apenas um folderId para cada link, não o nome da pasta, e o importador não consulta as pastas. Os links importados mantêm as tags, mas chegam sem nenhuma informação de pasta. Se você depende de pastas, anote qual tag ou padrão de slug corresponde a cada pasta antes de começar.

Os links arquivados do Dub são importados?

Não por padrão. O endpoint de listagem do Dub deixa de fora os links arquivados, a menos que um parâmetro showArchived seja enviado, e o importador não o envia. Desarquive o que quiser manter, ou recrie à mão, antes de executar a importação.

Posso limitar a importação a um workspace do Dub?

Uma chave de API do Dub pertence a um único workspace, então a própria chave já limita o que é listado. A API aceita um campo opcional workspace_id e o repassa ao Dub como parâmetro de consulta, mas os parâmetros de listagem documentados pelo Dub não o incluem. O formulário do painel não tem esse campo, então trate-o como uma operação sem efeito.

Quantos links uma execução importa e quanto tempo pode levar?

Uma execução para em 50.000 links ou 30 minutos, o que vier primeiro, e lê 100 links por requisição. Acima disso, o job é marcado como falho com uma mensagem de orçamento no ponto em que parou. Uma execução que não avança por 30 minutos também é varrida para o estado de falha.

O importador funciona com um Dub self-hosted?

Hoje não. A base da API está fixada em https://api.dub.co no código e não há configuração nem variável de ambiente para alterá-la. Uma instância self-hosted do Dub não pode ser apontada pelo painel. Exporte os seus links do seu próprio banco de dados e recrie-os pela API do Elido.

Experimente Elido

Cole uma URL, obtenha um link curto

Sem cadastro. O link vive 30 dias. Cadastre-se para mantê-lo para sempre.

Grátis, sem necessidade de registo · 2 por dia

Experimente o Elido

Encurtador de URL hospedado na UE: domínios personalizados, análises profundas e API aberta. Plano gratuito - sem cartão de crédito.

Tags
dub.co migration
migrate from dub
dub api export
dub folders
url shortener import
go import worker

Continuar lendo