El importador de migración de TinyURL toma un token de API, un dominio de Elido de destino y una estrategia de conflictos, y luego copia tus enlaces de TinyURL a Elido como un único trabajo en segundo plano. Tiene un defecto conocido grave: llama a GET /aliases en api.tinyurl.com, y esa ruta no figura en la API publicada de TinyURL. Este artículo cubre qué hace el importador, qué hemos verificado y qué no.
Si quieres la guía práctica para planificar una salida de TinyURL (qué se puede redirigir, mapeo de CSV, lista de verificación del traspaso), lee Migrar desde TinyURL. Esto es el lado de ingeniería.
El fallo conocido
La obtención de página del importador construye esta solicitud:
GET https://api.tinyurl.com/aliases?page=1&per_page=100
Authorization: Bearer <token>
y espera recibir {"data": [{alias, url, title, tags}], "meta": {"total", "has_more"}}.
La especificación OpenAPI de TinyURL (consultada el 2026-10-02) no define ninguna ruta /aliases. El listado es GET /urls/{type}, donde type es available o archived, con filtros opcionales from, to y search (un prefijo alias: o tag:). La especificación no define parámetros page ni per_page ni límites de tasa. Las operaciones con alias viven bajo /alias/{domain}/{alias}.
Así que el contrato de paginación de nuestro código nunca se tomó de TinyURL. Nuestra prueba unitaria sirve una respuesta escrita a mano con esa forma y pasa, lo que demuestra que el analizador coincide con nuestra suposición y nada sobre TinyURL. No hemos ejecutado el importador contra una cuenta real de TinyURL, porque eso requiere un token de un plan de pago. Hasta que lo hagamos, no planifiques una migración en torno a él. La corrección está registrada en nuestro backlog interno: pasar a /urls/available (y /urls/archived tras un indicador), recorrer ventanas from/to, analizar de forma defensiva y probar con una respuesta real capturada. Si la respuesta real trae una lista o un único objeto es algo que la especificación deja poco claro.
Qué hace el worker después de recibir una página
La página de integraciones en un espacio de trabajo DEMO con datos sintéticos. La migración de TinyURL se inicia desde aquí.
Todo lo posterior a la llamada HTTP es independiente de la cuestión del endpoint. Esta parte podemos afirmarla a partir del código.
- Inicio.
POSTcontoken,target_domain_idyconflict_strategyopcional. El manejador rechaza un token vacío, un dominio ausente y cualquier estrategia fuera desuffix,skip,fail, y luego responde202con el trabajo y ejecuta el worker en una goroutine en segundo plano desligada de la solicitud. - Por enlace. Una fila sin URL o sin alias cuenta como fallida con un motivo. En caso contrario, el alias pasa a ser el slug, se copian el destino y el título (título truncado a 200 caracteres), y se copian las etiquetas añadiendo
imported:tinyurl. - Progreso. Los contadores se vuelcan a la fila del trabajo cada 50 enlaces. Se registran como máximo 1.000 filas de error por trabajo.
- Errores de autenticación y de tasa. Un 401 o 403 hace fallar el trabajo con un mensaje de "comprueba el token bearer", un 429 lo hace fallar por límite de tasa. No hay reintento ni espera progresiva: el trabajo se detiene.
Reglas de conflicto
La lista de enlaces en un espacio de trabajo DEMO. Los enlaces importados llevan la etiqueta imported:tinyurl, así que puedes filtrar un lote para revisarlo.
Antes de cada inserción, el worker hace una consulta indexada de (domain, slug).
- suffix (por defecto) prueba
alias-2,alias-3, hastaalias-50, y hace fallar la fila si todos están ocupados. - skip deja en paz el enlace de Elido existente y registra la fila de origen.
- fail hace fallar el trabajo en el primer conflicto.
TinyURL los llama alias, Elido los llama slugs. Es lo mismo: los caracteres después del host. Si tu dominio de destino está vacío, los alias se trasladan sin cambios.
Límites
Un único conjunto de constantes compartido por todos los proveedores de migración: 50.000 enlaces por ejecución, un presupuesto de 30 minutos, progreso cada 50 enlaces, 1.000 errores registrados.
Conviene conocer dos comportamientos. Cuando se alcanza el límite de 50.000, el bucle simplemente se detiene y el trabajo se completa; no falla y no te dice que contactes con nadie. Compara los recuentos finales con el total de tu origen. Cuando se agota el presupuesto de 30 minutos, el trabajo se marca como fallido con el número importado hasta ese momento.
El worker vive dentro de api-core. Un despliegue o una caída a mitad de ejecución lo mata, y un barrido que se ejecuta cada cinco minutos pasa a failed los trabajos sin progreso durante 30 minutos. No hay un cursor guardado, así que reinicias el trabajo. Volver a ejecutar es seguro con suffix o skip, aunque con suffix creará copias -2 de los enlaces que la primera ejecución ya escribió, así que prefiere skip para una nueva ejecución.
Gestión del token
El token pasa del cuerpo de la solicitud a la goroutine y a ningún otro sitio. La fila del trabajo no registra ningún token, y nada se cifra en reposo porque nada se almacena. El cuerpo de la solicitud se lee con un límite de 4 KB.
Lo que el código no hace: no valida el token antes de empezar y no comprueba el plan. Un token incorrecto aparece como un trabajo fallido tras la primera solicitud, no como un error de formulario. Versiones anteriores de este artículo describían un paso previo de comprobación contra un endpoint de dominios. Ese paso no existe en el código, y la especificación de TinyURL tampoco tiene esa ruta.
Qué no se migra
- Historial de clics. El importador lee solo campos de los enlaces. Los clics nuevos cuentan desde el momento en que un enlace está activo en Elido.
- Estilo de QR, plantillas, ajustes de dominio de marca. No se leen. Un nombre de host de marca es un paso aparte: añádelo como dominio de Elido y cambia el DNS, tal como se explica en dominios personalizados para enlaces cortos.
- Enlaces sin cuenta. Ningún token puede listarlos.
El importador no crea el dominio por ti, no gestiona un campo domain de TinyURL y no tiene una carga de CSV propia. Para traslados basados en archivos usa el formulario de importación masiva o la guía de importación masiva desde Google Sheets.
Probarlo y sortearlo
Siguen dos secciones prácticas. Probar el importador. Migrar sin él.
Una forma segura de comprobar una importación
Cuando se corrija el endpoint, o si pruebas tú mismo el importador antes, hazlo a pequeña escala. Crea un espacio de trabajo desechable, añade un dominio vacío y ejecuta primero el trabajo con la estrategia fail. Un dominio vacío significa que no hay conflictos, así que cualquier fallo es un problema de análisis o de autenticación y no una colisión. Luego compara tres números: el recuento de origen en TinyURL, el total que informa el trabajo, y los contadores de importados más omitidos más fallidos. Como el worker toma meta.total de la respuesta que espera, una discrepancia entre total y tu recuento real es la primera señal de que la forma de la respuesta difiere de lo que supone el analizador.
Después filtra la lista de enlaces por imported:tinyurl y abre diez enlaces al azar. Comprueba el destino, el slug y el título contra TinyURL. Tras eso, cambia a skip para cualquier nueva ejecución.
Cómo exportar desde TinyURL sin el importador
La llamada de listado documentada es GET /urls/available con un token bearer, y GET /urls/archived para los enlaces archivados. Acota el resultado con fechas from y to si la cuenta es grande, ya que la especificación no ofrece parámetros de página. Escribe la salida en un archivo antes de hacer nada más, redúcela a destination, slug, title y cárgala con el formulario masivo. Los detalles de ese mapeo están en la guía práctica. Tampoco hemos verificado la forma de la respuesta real, así que inspecciona una respuesta a mano antes de automatizar nada con ella.
Qué viene después
La secuencia es: corregir el endpoint, añadir una respuesta real capturada como fixture de prueba y luego volver a comprobar cada cifra de la guía práctica y de la página de migración. La paginación y el límite real por solicitud hay que volver a medirlos contra una cuenta real, ya que la especificación no da ninguno. Si necesitas salir de TinyURL antes de eso, compara opciones en Elido vs TinyURL y alternativas a TinyURL, y usa la vía del CSV.
Relacionado en el blog
Preguntas frecuentes
¿Funciona hoy el importador de TinyURL de Elido?
Trátalo como no verificado. El worker solicita GET /aliases?page=N&per_page=100 en api.tinyurl.com. La especificación OpenAPI de TinyURL (consultada el 2026-10-02) no tiene ninguna ruta /aliases; los enlaces se listan con GET /urls/{type}. La prueba unitaria entregada solo comprueba la forma de respuesta que supusimos. Hay una corrección en nuestro backlog, y hasta que llegue la vía fiable es un CSV o un pegado masivo.
¿Qué copia el importador de cada enlace de TinyURL?
La URL de destino, el alias (usado como slug), el título y las etiquetas, además de una etiqueta imported:tinyurl en cada enlace que crea. No copia el historial de clics, el estilo de los QR ni nada más.
¿Qué pasa cuando un alias ya existe en Elido?
Eliges una estrategia por trabajo. Suffix prueba alias-2, alias-3 y así hasta alias-50, skip deja el enlace existente y registra la fila, fail marca el trabajo como fallido en el primer conflicto. El valor por defecto es suffix.
¿Se almacena mi token de TinyURL?
No. La solicitud de inicio lleva el token a una goroutine en segundo plano, y la fila del trabajo no guarda ninguna referencia al token. El token existe en la memoria del proceso durante la ejecución.
¿Hay un límite de cuántos enlaces gestiona una importación?
Sí. Una ejecución se detiene tras 50.000 enlaces o 30 minutos, lo que ocurra primero. Al llegar al límite de enlaces, el trabajo termina como completado con los primeros 50.000 gestionados, así que compara los recuentos con tu origen.
¿Puedo migrar desde una cuenta gratuita de TinyURL?
TinyURL liga el listado de enlaces a un token de API, y los enlaces creados sin iniciar sesión no pertenecen a ninguna cuenta, así que no hay nada que listar. Reconstruye tú mismo una lista de destinos y usa la importación masiva.
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
Seguir leyendo
- IngenieríaLanzamiento de la migración de Rebrandly: paginación de 25 por página y un presupuesto de 30 minutos
- IngenieríaLanzando la migración desde Bitly: un worker, un token, un presupuesto de 30 minutos
- IngenieríaCodificación de URL explicada: qué caracteres hay que escapar
- IngenieríaGestiona tus enlaces cortos como Terraform