7 min de lecturaIngeniería

Migración de Dub.co a Elido: qué hace realmente el importador

Un vistazo al código del importador de Dub.co de Elido: las llamadas a la API, qué campos traslada, qué omite (carpetas, enlaces archivados) y sus límites.

Marius Voß
DevRel · edge infra
Diagrama de la canalización: la API REST de Dub.co a la izquierda, que fluye por el worker de importación de Elido hasta la tabla de enlaces, con un panel lateral que enumera los límites (50k enlaces, presupuesto de 30 minutos, 100 por página)

El importador de Dub.co de Elido lee tus enlaces a través de la API REST de Dub, 100 por solicitud, y los crea en un dominio de Elido con el mismo slug. Traslada el slug, la URL de destino, el título y los nombres de las etiquetas. No traslada carpetas, enlaces archivados, historial de clics ni ningún ajuste de los enlaces. Esos son los datos que importan si estás planeando una migración.

Una versión anterior de este artículo afirmaba que las carpetas de Dub se aplanaban en etiquetas. Releí el importador para esta actualización y eso era incorrecto: el código nunca lee las carpetas. Esta versión describe lo que hace hoy services/api-core/internal/imports/dub.go, contrastado con la especificación de API publicada por Dub (consultada el 2026-10-02).

Qué le pide el importador a Dub

El worker envía GET https://api.dub.co/links?page=N&pageSize=100 con tu clave como token bearer. Según la documentación de claves de API de Dub (consultada el 2026-10-02), una clave está ligada a un único espacio de trabajo y puede crearse de solo lectura. Una clave de solo lectura es todo lo que necesita esta importación, porque el worker solo lista enlaces y nunca escribe en Dub.

La respuesta es un array JSON simple. No hay un indicador de "hay más", así que el worker sigue solicitando páginas hasta que una llega con menos de 100 elementos, o vacía:

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

Una salvedad de la propia especificación de Dub: el parámetro page está marcado como obsoleto en favor de la paginación por cursor con startingAfter. Hoy sigue funcionando, y pageSize acepta hasta 100. Si Dub elimina page, el importador necesitará un pequeño cambio, y esperaría que se manifestara como un trabajo fallido con un error HTTP claro y no como una pérdida silenciosa de datos.

La página de límites de tasa de Dub (consultada el 2026-10-02) indica 60 solicitudes por minuto en el plan Free y 600 en Pro. El importador inserta los enlaces uno a uno en Postgres entre solicitudes, así que en la práctica no se acerca al límite de Free. Tampoco tiene reintentos: un HTTP 429 o cualquier respuesta distinta de 200 termina el trabajo como fallido con el código de estado en el mensaje.

Qué llega a Elido, campo por campo

Campo de DubEn ElidoNotas
keySlugSujeto a la estrategia de conflictos que se indica abajo
urlURL de destinoUn enlace sin URL o sin clave se cuenta como fallido
titleTítuloTruncado a 200 caracteres
tags[].nameEtiquetasSolo los nombres, los colores no se trasladan
(ninguno)Etiqueta imported:dubSe añade a cada enlace importado
domain, folderId, archived, otrosNo se leenConsulta las dos secciones siguientes

Todo lo demás de un enlace de Dub se descarta: descripción, imagen de vista previa social, caducidad, contraseña, segmentación por geografía y dispositivo, campos UTM, destinos para iOS y Android, indicadores de seguimiento de conversiones. Si un enlace depende de alguno de ellos, reconstrúyelo después de la importación. Elido tiene sus propias reglas de enlaces inteligentes para la segmentación, pero nada traslada automáticamente las reglas de Dub.

La canalización de importación de Dub desde la API REST, pasando por el worker de Elido, hasta la tabla de enlaces, con una lista comparada de lo que se traslada y lo que no

Carpetas, enlaces archivados y dominios

Tres conceptos de Dub no se gestionan, y cada uno puede sorprenderte.

Carpetas. En el esquema de enlaces de Dub, una carpeta aparece solo como una cadena folderId. El importador no tiene un campo para ella y no hace una segunda llamada para resolver los nombres de carpeta. Elido tiene etiquetas, no carpetas, así que incluso un importador futuro tendría que aplanarlas. Hoy la estructura de carpetas se pierde. Si te importa, anota la carpeta de cada slug antes de empezar y luego etiqueta el lote importado (filtra por imported:dub) a mano o con la API.

Enlaces archivados. El endpoint de listado de Dub acepta un parámetro showArchived que por defecto es falso. El importador nunca lo establece, así que los enlaces archivados no se devuelven ni se importan. Es un valor por defecto razonable para una migración, pero conviene que lo sepas si mantienes archivados a propósito enlaces de campañas antiguas.

Dominios de los enlaces. Un espacio de trabajo de Dub puede contener enlaces en varios dominios. El importador los lee todos, ignora el campo domain y crea cada enlace en el único dominio de Elido que elijas. Si dos dominios de Dub usan la misma clave, el segundo choca con un conflicto. La estrategia de conflictos decide qué ocurre a continuación, así que elígela teniéndolo en cuenta.

Conflictos, límites y el contrato del worker

Eliges una estrategia de conflictos al iniciar el trabajo:

  • suffix prueba mylink-2, mylink-3 y así hasta -50, y luego renuncia a ese enlace y lo cuenta como fallido.
  • skip deja en paz el enlace de Elido existente y registra el slug como omitido.
  • fail detiene todo el trabajo en el primer conflicto.

Por ejecución, el worker se detiene a los 50.000 enlaces (MaxLinksPerImport) o tras 30 minutos (ImportRunBudget), lo que ocurra primero. El progreso se guarda cada 50 enlaces y el panel lo consulta periódicamente. El registro de errores conserva como máximo 1.000 entradas. Cada comprobación de slug es una consulta indexada sobre (domain_id, slug).

No he medido importaciones de Dub con una cuenta grande, así que no citaré una cifra de enlaces por minuto. El bucle es una página HTTP de 100 enlaces seguida de 100 inserciones secuenciales, de modo que la duración depende de lo rápido que responda Dub y de tu base de datos. Prueba primero con un espacio de trabajo pequeño.

Gestión del token y qué pasa en un despliegue

La clave viaja en el cuerpo de la solicitud de POST /imports/dub, se mantiene en la memoria del worker en ejecución y nunca se almacena: el source_token_id de la fila del trabajo queda vacío. Solo el texto opcional workspace_id va a la columna source_filter del trabajo.

El worker se ejecuta en una goroutine desligada de la solicitud HTTP con context.WithoutCancel. Eso lo mantiene vivo después de la respuesta, y también significa que un despliegue o un reinicio lo mata a mitad de ejecución. Un trabajo del planificador se ejecuta cada 5 minutos y marca como fallida cualquier importación en running sin progreso durante 30 minutos. Volver a ejecutar es seguro con suffix (obtienes copias -2 de todo lo ya importado) y con skip (los slugs ya importados se omiten). Todavía nada se reanuda desde la última página.

Lista de enlaces de Elido en un espacio de trabajo de demostración con enlaces cortos, destinos, clics y columnas de etiquetas, donde los enlaces importados de Dub se pueden filtrar por la etiqueta imported:dub

La lista de enlaces en un espacio de trabajo de demostración con datos sintéticos. Tras una importación, filtra por la etiqueta imported:dub para encontrar el lote.

Una lista breve antes de ejecutarlo

  1. Crea una clave de API de solo lectura en tu espacio de trabajo de Dub.
  2. Desarchiva los enlaces archivados que quieras conservar y anota cualquier estructura de carpetas de la que dependas.
  3. Añade el dominio de destino en Elido y elige skip o suffix sabiendo que todos los dominios de Dub se funden en este.
  4. Ejecuta la importación desde la página de integración del panel, o POST /imports/dub con token, target_domain_id y conflict_strategy.
  5. Comprueba por muestreo los slugs y los destinos contra Dub, y luego actualiza el DNS de cualquier dominio personalizado que poseas. La guía de migración desde Bitly cubre el orden del DNS, que es el mismo para cualquier proveedor.

Si aún estás decidiendo si moverte, Elido vs Dub compara planes y funciones, y RGPD para acortadores de URL explica el lado de la residencia de datos. La guía orientada al proveedor está en la página de migración desde Dub.

Relacionado en el blog

Preguntas frecuentes

¿Qué trae el importador de Dub.co a Elido?

Por cada enlace que lee, el importador traslada el slug (la clave de Dub), la URL de destino, el título (recortado a 200 caracteres) y los nombres de las etiquetas, y añade una etiqueta imported:dub. No se lee nada más del registro de Dub: ni descripción, ni caducidad, ni contraseña, ni campos UTM, ni reglas de segmentación, ni recuentos de clics.

¿Sobreviven mis carpetas de Dub a la importación?

No. El endpoint de listado de Dub devuelve solo un folderId por cada enlace, no el nombre de la carpeta, y el importador no consulta las carpetas. Los enlaces importados conservan sus etiquetas pero llegan sin información de carpeta. Si dependes de las carpetas, anota qué etiqueta o patrón de slug corresponde a cada carpeta antes de empezar.

¿Se importan los enlaces archivados de Dub?

No por defecto. El endpoint de listado de Dub deja fuera los enlaces archivados a menos que se envíe un parámetro showArchived, y el importador no lo envía. Desarchiva todo lo que quieras conservar, o vuelve a crearlo a mano, antes de ejecutar la importación.

¿Puedo limitar la importación a un espacio de trabajo de Dub?

Una clave de API de Dub pertenece a un único espacio de trabajo, así que la clave ya limita lo que se lista. La API acepta un campo opcional workspace_id y lo reenvía a Dub como parámetro de consulta, pero los parámetros de listado documentados de Dub no lo incluyen. El formulario del panel no tiene ese campo, así que trátalo como una operación nula.

¿Cuántos enlaces puede importar una ejecución y cuánto puede tardar?

Una ejecución se detiene a los 50.000 enlaces o a los 30 minutos, lo que ocurra primero, y lee 100 enlaces por solicitud. Por encima de eso, el trabajo se marca como fallido con un mensaje de presupuesto en el punto en que se detuvo. Una ejecución que no avanza durante 30 minutos también se barre a fallida.

¿Funciona el importador con un Dub autoalojado?

Hoy no. La base de la API está fijada a https://api.dub.co en el código y no hay ningún ajuste ni variable de entorno para cambiarla. No se puede apuntar a una instancia de Dub autoalojada desde el panel. Exporta tus enlaces desde tu propia base de datos y vuelve a crearlos mediante la API de Elido.

Prueba Elido

Pega una URL, obtén un enlace corto

Sin registro. El enlace vive 30 días. Crea una cuenta para conservarlo.

Gratis, sin registro · 2 por día

Prueba Elido

Acortador de URL alojado en la UE: dominios personalizados, análisis profundo y API abierta. Plan gratuito - sin tarjeta de crédito.

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

Seguir leyendo