6 min di letturaIngegneria

Migrazione da Dub.co a Elido: cosa fa davvero l'importer

Uno sguardo al codice dell'importer Dub.co di Elido: le chiamate API, i campi che porta con sé, cosa salta (cartelle, link archiviati) e i suoi limiti.

Marius Voß
DevRel · edge infra
Diagramma della pipeline: l'API REST di Dub.co a sinistra che passa attraverso il worker di importazione di Elido fino alla tabella dei link, con un pannello laterale che elenca i limiti (50k link, budget di 30 minuti, 100 per pagina)

L'importer Dub.co di Elido legge i tuoi link tramite l'API REST di Dub, 100 per richiesta, e li crea su un dominio Elido con lo stesso slug. Porta con sé lo slug, l'URL di destinazione, il titolo e i nomi dei tag. Non porta con sé cartelle, link archiviati, storico dei clic né alcuna impostazione dei link. Sono questi i fatti che contano se stai pianificando un passaggio.

Una versione precedente di questo articolo sosteneva che le cartelle di Dub si appiattiscono in tag. Ho riletto l'importer per questo aggiornamento e quell'affermazione era sbagliata: il codice non legge mai le cartelle. Questa versione descrive ciò che services/api-core/internal/imports/dub.go fa oggi, verificato rispetto alla specifica API pubblicata da Dub (consultata il 2026-10-02).

Cosa chiede l'importer a Dub

Il worker invia GET https://api.dub.co/links?page=N&pageSize=100 con la tua chiave come bearer token. Secondo la documentazione sulle chiavi API di Dub (consultata il 2026-10-02), una chiave è legata a un solo workspace e può essere creata in sola lettura. Una chiave in sola lettura è tutto ciò che serve a questa importazione, perché il worker si limita a elencare i link e non scrive mai su Dub.

La risposta è un semplice array JSON. Non c'è un flag "ci sono altri risultati", quindi il worker continua a richiedere pagine finché non ne arriva una con meno di 100 elementi, o vuota:

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

Una precisazione dalla specifica di Dub stessa: il parametro page è segnato come deprecato a favore della paginazione a cursore con startingAfter. Funziona ancora oggi, e pageSize accetta fino a 100. Se Dub rimuoverà page, l'importer avrà bisogno di una piccola modifica, e mi aspetto che si manifesti come un job fallito con un chiaro errore HTTP e non come una perdita silenziosa di dati.

La pagina sui rate limit di Dub (consultata il 2026-10-02) indica 60 richieste al minuto sul piano Free e 600 su Pro. L'importer inserisce i link uno per uno in Postgres tra una richiesta e l'altra, quindi in pratica non si avvicina al limite del piano Free. Non ha nemmeno un retry: un HTTP 429 o qualsiasi risposta diversa da 200 chiude il job come fallito, con il codice di stato nel messaggio.

Cosa arriva in Elido, campo per campo

Campo di DubIn ElidoNote
keySlugSoggetto alla strategia di conflitto qui sotto
urlURL di destinazioneUn link senza URL o senza key viene contato come fallito
titleTitoloTroncato a 200 caratteri
tags[].nameTagSolo i nomi, i colori non vengono portati
(nessuno)tag imported:dubAggiunto a ogni link importato
domain, folderId, archived, altriNon lettiVedi le prossime due sezioni

Tutto il resto di un link di Dub viene scartato: descrizione, immagine di anteprima social, scadenza, password, targeting geografico e per dispositivo, campi UTM, destinazioni iOS e Android, flag di tracciamento delle conversioni. Se un link dipende da uno di questi elementi, ricostruiscilo dopo l'importazione. Elido ha le proprie regole degli smart link per il targeting, ma nulla mappa automaticamente le regole di Dub.

La pipeline di importazione di Dub dall'API REST attraverso il worker di Elido fino alla tabella dei link, con un elenco affiancato di ciò che viene portato e di ciò che non lo viene

Tre concetti di Dub non vengono gestiti, e ciascuno può sorprenderti.

Cartelle. Nello schema dei link di Dub, una cartella compare solo come stringa folderId. L'importer non ha un campo per essa e non fa una seconda chiamata per risolvere i nomi delle cartelle. Elido ha tag, non cartelle, quindi anche un importer futuro dovrebbe appiattirle. Oggi la struttura delle cartelle va persa. Se conta, annota la cartella di ciascuno slug prima di iniziare, poi applica i tag al lotto importato (filtra su imported:dub) a mano o con l'API.

Link archiviati. L'endpoint di elenco di Dub accetta un parametro showArchived che per impostazione predefinita è false. L'importer non lo imposta mai, quindi i link archiviati non vengono restituiti né importati. È un'impostazione ragionevole per una migrazione, ma devi saperlo se tieni di proposito vecchi link di campagna archiviati.

Domini dei link. Un workspace di Dub può contenere link su più domini. L'importer li legge tutti, ignora il campo domain e crea ogni link sull'unico dominio Elido che scegli. Se due domini di Dub usano la stessa key, il secondo incontra un conflitto. La strategia di conflitto decide cosa succede dopo, quindi sceglila tenendolo presente.

Conflitti, limiti e il contratto del worker

Scegli una strategia di conflitto quando avvii il job:

  • suffix prova mylink-2, mylink-3 e così via fino a -50, poi rinuncia a quel link e lo conta come fallito.
  • skip lascia stare il link Elido esistente e registra lo slug come saltato.
  • fail ferma l'intero job al primo conflitto.

Per esecuzione, il worker si ferma a 50.000 link (MaxLinksPerImport) o dopo 30 minuti (ImportRunBudget), a seconda di quale arrivi prima. I progressi vengono salvati ogni 50 link e la dashboard li interroga. Il log degli errori conserva al massimo 1.000 voci. Ogni controllo dello slug è una ricerca indicizzata su (domain_id, slug).

Non ho eseguito benchmark delle importazioni da Dub su un account grande, quindi non citerò una cifra di link al minuto. Il ciclo è una pagina HTTP da 100 link seguita da 100 inserimenti sequenziali, quindi la durata dipende da quanto velocemente risponde Dub e dal tuo database. Prova prima con un workspace piccolo.

Gestione del token e cosa succede durante un deploy

La chiave viaggia nel corpo della richiesta di POST /imports/dub, è tenuta nella memoria del worker in esecuzione e non viene mai salvata: il source_token_id della riga del job resta vuoto. Solo il testo facoltativo workspace_id finisce nella colonna source_filter del job.

Il worker gira in una goroutine staccata dalla richiesta HTTP con context.WithoutCancel. Questo lo mantiene vivo dopo la risposta, e significa anche che un deploy o un riavvio lo uccide a metà esecuzione. Un job dello scheduler gira ogni 5 minuti e segna come fallita qualsiasi importazione running senza progressi da 30 minuti. Rieseguire è sicuro con suffix (ottieni copie -2 di ciò che è già stato importato) e con skip (gli slug già importati vengono saltati). Per ora nulla riprende dall'ultima pagina.

Elenco dei link di Elido in un workspace demo con short link, destinazioni, clic e colonne dei tag, dove i link Dub importati si possono filtrare con il tag imported:dub

L'elenco dei link in un workspace demo con dati sintetici. Dopo un'importazione, filtra sul tag imported:dub per trovare il lotto.

Una breve checklist prima di eseguirlo

  1. Crea una chiave API in sola lettura nel tuo workspace Dub.
  2. Disarchivia i link archiviati che vuoi conservare e annota la struttura di cartelle su cui fai affidamento.
  3. Aggiungi il dominio di destinazione in Elido e scegli skip o suffix sapendo che tutti i domini di Dub confluiscono in questo.
  4. Esegui l'importazione dalla pagina di integrazione della dashboard, oppure POST /imports/dub con token, target_domain_id e conflict_strategy.
  5. Controlla a campione slug e destinazioni rispetto a Dub, poi aggiorna il DNS per ogni dominio personalizzato che possiedi. Il playbook di cutover da Bitly spiega l'ordine del DNS, che è lo stesso per qualsiasi fornitore.

Se stai ancora decidendo se cambiare del tutto, Elido vs Dub confronta piani e funzionalità, e GDPR per gli URL shortener spiega il lato della residenza dei dati. La guida rivolta al fornitore si trova nella pagina di migrazione da Dub.

Correlati sul blog

Domande frequenti

Cosa porta in Elido l'importer di Dub.co?

Per ogni link che legge, l'importer porta con sé lo slug (la key di Dub), l'URL di destinazione, il titolo (tagliato a 200 caratteri) e i nomi dei tag, e aggiunge un tag imported:dub. Dal record di Dub non viene letto nient'altro: niente descrizione, scadenza, password, campi UTM, regole di targeting o conteggi dei clic.

Le mie cartelle di Dub sopravvivono all'importazione?

No. L'endpoint di elenco di Dub restituisce solo un folderId per ogni link, non il nome della cartella, e l'importer non cerca le cartelle. I link importati mantengono i tag ma arrivano senza informazioni sulla cartella. Se fai affidamento sulle cartelle, annota quale tag o schema di slug corrisponde a ciascuna cartella prima di iniziare.

I link archiviati di Dub vengono importati?

Non per impostazione predefinita. L'endpoint di elenco di Dub esclude i link archiviati a meno che non venga inviato un parametro showArchived, e l'importer non lo invia. Disarchivia ciò che vuoi conservare, o ricrealo a mano, prima di avviare l'importazione.

Posso limitare l'importazione a un solo workspace di Dub?

Una chiave API di Dub appartiene a un singolo workspace, quindi la chiave limita già ciò che viene elencato. L'API accetta un campo facoltativo workspace_id e lo inoltra a Dub come parametro di query, ma i parametri di elenco documentati da Dub non lo includono. Il modulo della dashboard non ha un campo del genere, quindi consideralo un no-op.

Quanti link può importare un'esecuzione e quanto può durare?

Un'esecuzione si ferma a 50.000 link o a 30 minuti, a seconda di quale arrivi prima, e legge 100 link per richiesta. Oltre, il job viene segnato come fallito con un messaggio di budget nel punto in cui si è fermato. Anche un'esecuzione che non fa progressi per 30 minuti viene portata a fallita dallo sweep.

L'importer funziona con un Dub self-hosted?

Non oggi. La base dell'API è fissata a https://api.dub.co nel codice e non c'è alcuna impostazione o variabile d'ambiente per cambiarla. Un'istanza Dub self-hosted non può essere indicata dalla dashboard. Esporta i tuoi link dal tuo database e ricreali tramite l'API di Elido.

Prova Elido

Incolla un URL, ottieni un link breve

Senza registrazione. Il link vive 30 giorni. Iscriviti per conservarlo.

Gratis, nessuna registrazione richiesta · 2 al giorno

Prova Elido

Accorciatore di URL ospitato nell'UE: domini personalizzati, analisi approfondite e API aperta. Piano gratuito - senza carta di credito.

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

Continua a leggere