6 min leestijdEngineering

TinyURL-migratie-importer: hoe hij werkt en wat ontbreekt

Hoe de TinyURL-migratie-importer van Elido werkt: token erin, aliassen eruit, conflictregels, limieten en de bekende bug van een endpoint dat TinyURL mist.

Marius Voß
DevRel · edge infra
Pijplijndiagram: een TinyURL-API-token dat de Elido-importworker voedt, die links naar de linkstabel schrijft volgens de conflictregels suffix, skip of fail

De TinyURL-migratie-importer neemt een API-token, een Elido-doeldomein en een conflictstrategie, en kopieert je TinyURL-links dan als één achtergrondjob naar Elido. Hij heeft één ernstig bekend defect: hij roept GET /aliases aan op api.tinyurl.com, en dat pad staat niet in de gepubliceerde API van TinyURL. Dit artikel behandelt wat de importer doet, wat we hebben geverifieerd en wat niet.

Wil je de how-to voor het plannen van een verhuizing weg van TinyURL (wat kan worden doorgestuurd, CSV-mapping, cutoverchecklist), lees dan Migreren van TinyURL. Dit is de engineeringkant.

De bekende bug

De paginaophaling van de importer bouwt dit verzoek:

GET https://api.tinyurl.com/aliases?page=1&per_page=100
Authorization: Bearer <token>

en verwacht {"data": [{alias, url, title, tags}], "meta": {"total", "has_more"}} terug.

De OpenAPI-specificatie van TinyURL (geraadpleegd op 2026-10-02) definieert geen pad /aliases. Opsommen gaat met GET /urls/{type}, waarbij type available of archived is, met optionele filters from, to en search (een prefix alias: of tag:). De specificatie definieert geen parameters page of per_page en geen rate limits. Aliasbewerkingen staan onder /alias/{domain}/{alias}.

Het pagineringscontract in onze code is dus nooit van TinyURL overgenomen. Onze unittest serveert een met de hand geschreven antwoord in die vorm en slaagt, wat bewijst dat de parser bij onze aanname past en niets zegt over TinyURL. We hebben de importer nooit tegen een live TinyURL-account gedraaid, omdat daarvoor een token van een betaald abonnement nodig is. Tot we dat doen, plan je migratie er dus niet omheen. De oplossing wordt bijgehouden in onze interne backlog: overstappen op /urls/available (en /urls/archived achter een vlag), door from/to-vensters bladeren, defensief parsen en testen tegen een echt vastgelegd antwoord. Of het echte antwoord een lijst of één enkel object bevat, laat de specificatie onduidelijk.

Wat de worker doet nadat hij een pagina heeft

De integratiepagina van het Elido-dashboard in een demo-workspace, waar migratiebronnen worden gestart

De integratiepagina in een DEMO-workspace met synthetische data. De TinyURL-migratie wordt hier gestart.

Alles na de HTTP-aanroep staat los van de endpointvraag. Dit deel kunnen we uit de code vaststellen.

  • Start. POST met token, target_domain_id en optioneel conflict_strategy. De handler weigert een leeg token, een ontbrekend domein en elke strategie buiten suffix, skip, fail, antwoordt dan met 202 plus de job en draait de worker in een achtergrond-goroutine die van het verzoek is losgekoppeld.
  • Per link. Een rij zonder URL of zonder alias telt als mislukt met een reden. Anders wordt de alias de slug, worden bestemming en titel gekopieerd (titel afgekapt op 200 tekens) en worden tags gekopieerd met imported:tinyurl erachter.
  • Voortgang. Tellers worden elke 50 links naar de jobrij weggeschreven. Per job worden maximaal 1.000 foutrijen gelogd.
  • Auth- en ratefouten. Een 401 of 403 laat de job mislukken met de melding "check the bearer token", een 429 laat hem mislukken als rate-limited. Er is geen retry of backoff: de job stopt.

Conflictregels

De linklijst van Elido in een demo-workspace met korte links, bestemmingen, tags, klikken van de afgelopen 30 dagen en status

De linklijst in een DEMO-workspace. Geïmporteerde links dragen de tag imported:tinyurl, zodat je een batch kunt filteren om na te kijken.

Voor elke insert doet de worker één geïndexeerde lookup op (domain, slug).

  • suffix (standaard) probeert alias-2, alias-3, tot alias-50, en laat de rij mislukken als ze allemaal bezet zijn.
  • skip laat de bestaande Elido-link met rust en logt de bronrij.
  • fail laat de job bij het eerste conflict mislukken.

TinyURL noemt dit aliassen, Elido noemt ze slugs. Hetzelfde: de tekens na de host. Als je doeldomein leeg is, gaan aliassen ongewijzigd mee.

Limieten

Eén gedeelde set constanten, door elke migratieleverancier gebruikt: 50.000 links per run, een budget van 30 minuten, voortgang elke 50 links, 1.000 gelogde fouten.

Twee gedragingen zijn het kennen waard. Wanneer de limiet van 50.000 wordt bereikt, stopt de lus gewoon en wordt de job voltooid; hij mislukt niet en zegt niet dat je iemand moet benaderen. Vergelijk de eindaantallen met het totaal van je bron. Wanneer het budget van 30 minuten op is, wordt de job als mislukt gemarkeerd met het aantal tot dan toe geïmporteerde links.

De worker leeft binnen api-core. Een deploy of crash halverwege een run beëindigt hem, en een sweep die elke vijf minuten draait, zet jobs zonder voortgang gedurende 30 minuten om naar failed. Er is geen opgeslagen cursor, dus je start de job opnieuw. Opnieuw draaien is veilig onder suffix of skip, al maakt suffix -2-kopieën van links die de eerste run al schreef, dus geef bij een herhaalrun de voorkeur aan skip.

Tokenafhandeling

Het token gaat van de requestbody naar de goroutine en nergens anders heen. De jobrij registreert geen token, en niets wordt at rest versleuteld omdat er niets wordt opgeslagen. De requestbody wordt gelezen met een limiet van 4 KB.

Wat de code niet doet: hij valideert het token niet voor de start en controleert het abonnement niet. Een slecht token verschijnt als mislukte job na het eerste verzoek, niet als formulierfout. Eerdere versies van dit artikel beschreven een preflightstap tegen een domeinen-endpoint. Die stap bestaat niet in de code, en de specificatie van TinyURL heeft zo'n pad ook niet.

Wat niet wordt gemigreerd

  • Klikgeschiedenis. De importer leest alleen linkvelden. Nieuwe klikken tellen vanaf het moment dat een link live is in Elido.
  • QR-opmaak, sjablonen, instellingen van branded domeinen. Niet gelezen. Een branded hostnaam is een aparte stap: voeg hem toe als Elido-domein en wijzig de DNS, behandeld in eigen domeinen voor korte links.
  • Links zonder account. Geen enkel token kan ze opsommen.

De importer maakt het domein niet voor je aan, verwerkt geen TinyURL-veld domain en heeft geen eigen CSV-upload. Voor bestandsgebaseerde verhuizingen gebruik je het formulier voor bulkimport of de uitleg in bulkimport vanuit Google Sheets.

Testen en omzeilen

Twee praktische secties volgen. De importer testen. Verhuizen zonder de importer.

Een veilige manier om een import te controleren

Zodra het endpoint is gerepareerd, of als je de importer zelf eerder test, doe het dan klein. Maak een wegwerpworkspace aan, voeg een leeg domein toe en draai de job eerst met de strategie fail. Een leeg domein betekent geen conflicten, dus elke fout is een parsing- of authprobleem en geen botsing. Vergelijk dan drie getallen: het brontotaal in TinyURL, de total die de job meldt en de tellers geïmporteerd plus overgeslagen plus mislukt. Omdat de worker meta.total uit het antwoord neemt dat hij verwacht, is een verschil tussen total en je echte aantal het eerste teken dat de vorm van het antwoord afwijkt van wat de parser aanneemt.

Filter daarna de linklijst op imported:tinyurl en open tien willekeurige links. Controleer bestemming, slug en titel tegen TinyURL. Schakel daarna voor elke herhaalrun over op skip.

Hoe je uit TinyURL exporteert zonder de importer

De gedocumenteerde opsommingsaanroep is GET /urls/available met een bearer-token, en GET /urls/archived voor gearchiveerde links. Beperk het resultaat met de datetimes from en to als het account groot is, aangezien de specificatie geen paginaparameters geeft. Schrijf de uitvoer naar een bestand voordat je iets anders doet, reduceer hem tot destination, slug, title en laad hem met het bulkformulier. Details van die mapping staan in de how-to-gids. We hebben de live antwoordvorm ook niet geverifieerd, dus bekijk één antwoord met de hand voordat je ertegen scripts schrijft.

Wat er daarna komt

De volgorde is: het endpoint repareren, een echt vastgelegd antwoord als testfixture toevoegen en dan elk cijfer in de how-to-gids en op de migratielandingspagina opnieuw controleren. Paginering en de echte limiet per verzoek moeten opnieuw worden gemeten tegen een live account, aangezien de specificatie geen van beide geeft. Moet je eerder van TinyURL af, vergelijk dan opties in Elido vs TinyURL en TinyURL-alternatieven, en gebruik de CSV-route.

Gerelateerd op de blog

Veelgestelde vragen

Werkt de TinyURL-importer van Elido nu?

Beschouw hem als niet geverifieerd. De worker vraagt GET /aliases?page=N&per_page=100 op api.tinyurl.com. De OpenAPI-specificatie van TinyURL (geraadpleegd op 2026-10-02) heeft geen pad /aliases; links worden opgesomd met GET /urls/{type}. De meegeleverde unittest controleert alleen de vorm van het antwoord die wij veronderstelden. Een oplossing staat op onze backlog, en tot die er is, is de betrouwbare route een CSV of bulk plakken.

Wat kopieert de importer van elke TinyURL-link?

Bestemmings-URL, alias (gebruikt als slug), titel en tags, plus een tag imported:tinyurl op elke link die hij aanmaakt. Hij kopieert geen klikgeschiedenis, QR-opmaak of iets anders.

Wat gebeurt er als een alias al bestaat in Elido?

Je kiest per job een strategie. Suffix probeert alias-2, alias-3 enzovoort tot alias-50, skip laat de bestaande link staan en logt de rij, fail markeert de job als mislukt bij het eerste conflict. De standaard is suffix.

Wordt mijn TinyURL-token opgeslagen?

Nee. Het startverzoek draagt het token naar een achtergrond-goroutine, en de jobrij slaat geen tokenverwijzing op. Het token bestaat tijdens de run alleen in het procesgeheugen.

Is er een limiet aan hoeveel links één import afhandelt?

Ja. Een run stopt na 50.000 links of 30 minuten, wat het eerst komt. Bij de linklimiet eindigt de job als voltooid met de eerste 50.000 afgehandeld, dus vergelijk de aantallen met je bron.

Kan ik migreren vanaf een gratis TinyURL-account?

TinyURL koppelt het opsommen van links aan een API-token, en links die zonder inloggen zijn gemaakt, horen bij geen enkel account, dus er is niets om op te sommen. Stel zelf een lijst met bestemmingen samen en gebruik bulkimport.

Probeer Elido

Plak een URL, krijg een werkende korte link

Geen aanmelding nodig. Link blijft 30 dagen actief. Meld je aan om hem voor altijd te bewaren.

Gratis, geen aanmelding nodig · 2 per dag

Probeer Elido

In de EU gehoste URL-shortener met aangepaste domeinen, uitgebreide analyses en een open API. Gratis abonnement - geen creditcard nodig.

Tags
tinyurl migration
url shortener
go worker
data migration
engineering
tier 3 integrations

Verder lezen