The shortener you can read the source of.
Mides la latencia, las tasas de error y el tiempo hasta MTTR. Elido es el acortador del que puedes leer el código fuente.
- REST + gRPC: pick the surface your service mesh prefers
- OpenTelemetry spans on every redirect, every API call
- Six SDKs: TypeScript, Go, Python, Ruby, PHP, .NET
- Apache 2.0 self-host with a one-command Helm chart
curl -X POST https://api.elido.app/v1/links -H "Authorization: Bearer $ELIDO_API_KEY" -H "Idempotency-Key: ci-2026-05-08-build-4419" -d '{ "destination_url": "https://shop.example.com/launch", "slug": "q2-launch", "workspace_id": "ws_8f3c" }'
{ "id": "link_01HQ3X...", "short_url": "https://b.elido.me/q2-launch", "click_tracker": "https://api.elido.app/v1/links/link_01HQ3X/clicks", "expires_at": "2026-08-08T00:00:00Z", "created_at": "2026-05-08T11:24:01Z" }
Observability — built in, not bolted on
Every redirect emits an OpenTelemetry span. Every span lands in your collector.
The edge service is instrumented end-to-end with OTel. Point your OTLP collector at the redirect tier and you get the full waterfall — cache lookup, rule evaluation, response, and the async click-event publish — without writing a single instrumentation line yourself.
SDKs
Same canonical call. Six languages. All generated from one spec.
Every SDK ships from the same OpenAPI 3.1 spec. New endpoint added on the server? Run the generator, ship the SDKs, done. No hand-maintained client that drifts from the API. Idempotency keys, retries with exponential backoff, and typed error responses are surfaced consistently across all six languages.
- OpenAPI 3.1 source of truthSpec checked in. SDKs regenerated on every release.
- Typed error responsesRate-limit, validation, conflict — all typed, never stringly-caught.
- Idempotency keysHeader-based on every write endpoint, replayed on retry.
- Built-in retriesExponential backoff with Retry-After honoured per language.
create-link.ts1import { Elido } from2 "@elido/sdk";34const elido = new Elido({5 apiKey: process.env.ELIDO_API_KEY!,6});78const link = await elido.links.create({9 destinationUrl: dest,10 slug: "q2-launch",11});
create-link.go1import "github.com/elido/sdk-go"23client := elido.NewClient(4 elido.WithAPIKey(key),5)67link, err := client.Links.Create(ctx,8 &elido.CreateLinkRequest{9 DestinationURL: dest,10 Slug: "q2-launch",11 })
create_link.py1from elido import Elido23elido = Elido(4 api_key=os.environ["ELIDO_API_KEY"],5)67link = elido.links.create(8 destination_url=dest,9 slug="q2-launch",10 idempotency_key=build_id,11)
gRPC contract
Same surface in protobuf — for service-mesh natives.
The api-core service serves both REST and gRPC from the same handlers. If your platform speaks proto natively (Envoy, Istio, Linkerd, Connect-Go), skip the JSON layer. The .proto files are published; generate clients in any language buf or protoc supports.
1syntax = "proto3";23package elido.api.v1;45option go_package = "github.com/elido/proto/api/v1;apiv1";67service LinkService {8 rpc Create(CreateLinkRequest) returns (Link);9 rpc Resolve(ResolveLinkRequest) returns (ResolveLinkResponse);10 rpc List(ListLinksRequest) returns (ListLinksResponse);11 rpc Delete(DeleteLinkRequest) returns (google.protobuf.Empty);12}1314message CreateLinkRequest {15 string workspace_id = 1;16 string destination_url = 2;17 optional string slug = 3;18 optional google.protobuf.Timestamp expires_at = 4;19 repeated KeyValue tags = 5;20}2122message Link {23 string id = 1;24 string short_url = 2;25 string destination_url = 3;26 google.protobuf.Timestamp created_at = 4;27}
Authenticate with workload identity via SPIFFE/SPIRE or your mesh's built-in mTLS. API keys still work for non-mesh callers.
One implementation in api-core. Connect-Go transcoding means the REST surface is generated, not separately maintained.
ResolveLinkResponse streams click events for hot links — useful for internal dashboards without webhook plumbing.
What you get out of the box
- REST + gRPC: pick the surface your service mesh prefers
- OpenTelemetry spans on every redirect, every API call
- Six SDKs: TypeScript, Go, Python, Ruby, PHP, .NET
- Apache 2.0 self-host with a one-command Helm chart
- Webhook firehose with HMAC-SHA256 signing
- Prometheus /metrics endpoint on every service
Lo que la API de Elido ofrece realmente
Una especificación OpenAPI y un token Bearer son lo básico. Las características a continuación son las que distinguen a un acortador sobre el cual puedes construir de uno con el que estarás luchando a las 2 AM.
OpenAPI 3.1 con 44 endpoints documentados — sin superficies no documentadas
Cada endpoint en producción está descrito en la especificación OpenAPI 3.1. Sin rutas ocultas, ni parámetros no documentados que el equipo de documentación olvidó. La especificación se incluye en el repositorio y se versiona junto con la API; los cambios disruptivos siguen SemVer y cuentan con un periodo de depreciación de al menos 90 días. La especificación se renderiza interactivamente con Scalar en la documentación — pega tu API key y prueba llamadas sin salir del navegador. Tres SDKs oficiales (TypeScript, Python, Go) se generan desde la misma especificación en cada lanzamiento, por lo que no pueden diferir de lo que el servidor realmente acepta. Los métodos de los SDKs aceptan objetos de solicitud tipados y devuelven objetos de respuesta tipados; los errores están tipados, no se capturan como simples cadenas. Las claves de idempotencia son compatibles en los endpoints de escritura — pasa un encabezado `Idempotency-Key` y la respuesta se repite al reintentar sin crear un duplicado.
Slugs deterministas, creación masiva e idempotencia para pipelines de CI
POST /v1/workspaces/{ws}/links acepta un campo slug — obtienes el slug que solicitaste, o un error de conflicto con el ID del enlace existente para que tu pipeline pueda decidir qué hacer. La creación masiva (POST .../links/bulk) acepta hasta 100 especificaciones de enlaces por llamada; la respuesta incluye un resultado por fila de entrada con un enlace creado o un error, para que los fallos parciales no se oculten. Ambos endpoints aceptan claves de idempotencia: vuelve a enviar la misma solicitud con la misma clave y obtendrás la misma respuesta, sin filas duplicadas. Este es el patrón para pipelines de CI/CD que generan enlaces cortos al desplegar — determinista, seguro de reintentar, consistente en todos los entornos. El espacio de nombres de los slugs es por dominio personalizado: el mismo slug en dos dominios diferentes son dos enlaces diferentes, no un conflicto.
Webhooks firmados con HMAC con reintento automático y una dead-letter queue
Cada evento del espacio de trabajo (enlace creado, enlace clickeado, enlace eliminado, entrada de auditoría, conversión atribuida) está disponible como un webhook. Los payloads están firmados con HMAC-SHA256 utilizando un secreto rotable; la clave de firma es independiente de tu API key para que la rotación de una no invalide la otra. Semántica de entrega: al menos una vez, con backoff exponencial (1s, 5s, 30s, 5m, 30m) y una ventana de reintento configurable (por defecto 24h). Los eventos que agotan los reintentos terminan en una dead-letter queue visible en el dashboard; puedes retransmitirlos desde allí. Para pipelines de eventos de alto volumen, el firehose de Kafka/Redpanda omite la entrega por HTTP por completo — consume eventos de clics y registros de auditoría directamente desde el flujo. El firehose es una característica de Business; la entrega de webhooks está disponible en Pro y superiores.
Servidor Model Context Protocol: herramientas de Elido en cualquier cliente MCP
El servidor MCP de Elido de código abierto (licencia MIT) expone los endpoints de enlaces, QR y analíticas como herramientas MCP tipadas. La instalación toma 30 segundos: añade el bloque del servidor a tu configuración de Claude Desktop o Cursor, establece ELIDO_API_KEY y reinicia. El catálogo de herramientas se auto-descubre desde el servidor — sin definiciones de herramientas escritas a mano que se desincronicen. El acceso de solo lectura es el alcance predeterminado; las operaciones de escritura requieren una concesión explícita en la configuración del espacio de trabajo. Cada llamada a una herramienta aparece en el registro de auditoría del espacio de trabajo con la clave de llamada y los argumentos, por lo que las mutaciones impulsadas por agentes son trazables. El servidor utiliza stdio y SSE; aplica los mismos límites de tasa y códigos de error que la API REST, incluyendo Retry-After en 429 para que tu agente pueda retroceder limpiamente. El código fuente está en GitHub; los forks comunes añaden herramientas específicas del espacio de trabajo o enriquecimiento de metadatos sin necesidad de que Elido los integre.
Helm chart (Apache 2.0): ejecuta la capa de redirección en tu propia VPC
La capa de redirección (servicio edge-redirect) es el único componente en la ruta crítica de cada redirección. Es un binario único en Go — sin dependencias de tiempo de ejecución más allá de Redis para la caché L2. El Helm chart se entrega con configuraciones predeterminadas lógicas para el autoescalado horizontal de pods de Kubernetes; escala según el uso de CPU y la tasa de solicitudes. La configuración se realiza mediante variables de entorno; el chart incluye un archivo values.yaml con valores predeterminados lógicos y una lista documentada de cada variable. El resto del stack (api-core, dashboard) puede permanecer en el SaaS gestionado por Elido — no tienes que auto-hospedarlo todo. La división común es: capa de redirección auto-hospedada en tu VPC (menor latencia para tus usuarios, sin facturación por salida de datos), dashboard y analíticas en la nube de Elido. Trae tu propio KMS para el cifrado en reposo de la caché local de Redis si tu postura de seguridad lo requiere. En comparación con Bitly (sin opción de auto-hospedaje) y la construcción de un acortador personalizado, la opción del Helm chart te brinda el rendimiento de redirección y la superficie de API gestionada sin empezar desde cero.
Stack you'll touch
- SDK de TypeScript
- SDK de Python
- SDK de Go
- Flujo de webhooks
- Especificación OpenAPI 3.1
- Helm chart autoalojado
Qué vas a medir
- Latencia p50 de redireccionamiento
- 5 ms HIT de caché
- SLA de tiempo de actividad de la API
- 99.95% en Business
- RTO de autoalojamiento
- <1 hora
Equipos de ingeniería construyendo sobre esto
Los nombres son marcadores de posición por ahora — los nombres de clientes reales aparecerán aquí a medida que se publiquen los casos de estudio.
“Auto-hospedamos la capa de redirección en nuestro propio clúster de Kubernetes y usamos la API gestionada para todo lo demás. La latencia p50 de redirección bajó de 45ms a 6ms después de mover el servicio edge a la misma región que nuestros usuarios. El Helm chart fue lo suficientemente legible como para que hiciéramos el despliegue sin consultar a soporte.”
“El servidor MCP fue el factor decisivo. Nuestro equipo trabaja en Cursor todo el día; poder crear enlaces cortos etiquetados para notas de lanzamiento desde dentro del IDE sin salir del flujo de trabajo es el tipo de mejora en DX que realmente perdura.”
“Las claves de idempotencia en la creación masiva nos permiten generar enlaces cortos en CI sin la paranoia de que los reintentos creen duplicados. El SDK de Go tipado significa que nuestro código de pipeline compila o falla — sin solicitudes incorrectas silenciosas en tiempo de ejecución.”
API de Elido vs API de Bitly vs construir tu propio acortador
Dos opciones externas y la alternativa de construirlo tú mismo. Honestidad sobre dónde la API de Bitly es más madura y dónde un acortador personalizado gana en control.
| Capability | Elido | API de Bitly | Acortador personalizado |
|---|---|---|---|
| Formato de especificación de API | OpenAPI 3.1, incluido en el repositorio | Documentación v4 personalizada (no OpenAPI) | Lo que tú escribas |
| SDKs oficiales | TypeScript, Python, Go — generados desde la especificación | JavaScript, Python, Ruby, Java | Tú los construyes |
| Claves de idempotencia en escrituras | Sí — basadas en encabezados, todos los endpoints de escritura | No documentado | Tú lo implementas |
| Creación masiva | 100 por llamada, fallo parcial por fila | Sin endpoint nativo masivo documentado | Tu esquema, tus reglas |
| Entrega de webhooks | Al menos una vez, HMAC-SHA256, dead-letter queue | Disponible en Enterprise | Tú lo construyes |
| Servidor MCP | Código abierto MIT, instalación en 30s | No disponible | Tú lo construyes |
| Auto-hospedar capa de redirección | Helm chart Apache 2.0 | No disponible | Control total, coste total |
| Latencia p50 de redirección | 5 ms cache HIT | Comparable (servido desde el edge) | Depende de tu infraestructura |
Preguntas de desarrolladores
¿Dónde está la especificación OpenAPI?
En /docs/api-reference — Scalar la renderiza de forma interactiva. El YAML sin procesar está en /openapi.yaml. Es la misma especificación desde la que se generan los SDKs, no un documento mantenido por separado.
¿Cómo obtengo un slug determinista en CI?
Pasa `slug` en el cuerpo de la solicitud. Si el slug ya está ocupado por un enlace diferente, la API devuelve 409 con el ID del enlace en conflicto. Si está ocupado por la misma URL de destino (recreación idempotente), devuelve el enlace existente. Usa el encabezado Idempotency-Key para que los reintentos sean seguros.
¿Qué incluye el Helm chart de auto-hospedaje?
El servicio edge-redirect (binario Go), configuración de Redis, ajustes de HPA y un archivo values.yaml con todas las variables de configuración documentadas. No incluye api-core ni el dashboard — esos pueden permanecer en el SaaS de Elido. Licencia Apache 2.0; no se requiere CLA para forks.
¿Cómo consumo eventos de clics sin polling?
Dos opciones: webhooks (HTTPS, firmados con HMAC, al menos una vez) o el firehose de Kafka/Redpanda (consumidor directo, nivel Business). Los webhooks son adecuados para auditoría y alertas; el firehose es el camino correcto para pipelines de eventos de alto volumen donde la sobrecarga de entrega HTTP por evento importa.
¿Cuál es el límite de tasa?
100 req/seg sostenidos, ráfaga de 200 por API key, con un 429 y encabezado Retry-After. Los endpoints de escritura cuentan por separado de los de lectura. El servidor MCP pasa el 429 como un error de herramienta; los SDKs exponen el valor Retry-After como un campo tipado en el error de límite de tasa.
¿Puedo usar el servidor MCP en automatización de producción, no solo de forma interactiva?
Sí — el servidor MCP es un proceso estándar stdio o SSE. Puedes invocarlo desde un script, un paso de CI o un pipeline de agentes. Solo lectura por defecto; el alcance de escritura requiere una configuración explícita del espacio de trabajo. Cada llamada es auditada.
¿Qué política de cambios disruptivos utilizan?
SemVer en el prefijo de versión de la API (/v1/, /v2/). Los cambios disruptivos tienen una ventana de depreciación de 90 días con ambas versiones activas simultáneamente. Las adiciones no disruptivas (nuevos campos, nuevos endpoints) ocurren sin un cambio de versión. El registro de cambios en /changelog documenta cada cambio con el endpoint afectado.
¿Existe un modo de desarrollo local sin consultar la API real?
Los SDKs de TypeScript y Python aceptan una anulación de baseUrl que apunta a tu propia instancia — útil para quienes optan por el auto-hospedaje. Todavía no hay un servidor de simulación (mock) oficial; para pruebas locales, el patrón es un espacio de trabajo de prueba con una API key independiente, no un simulacro. Está en el mapa de ruta.
Developer's reading list
OpenAPI 3.1 spec, six first-party SDKs, and what each one ships.
HMAC-signed events, retry policy, dead-letter queue, Kafka firehose.
Edge rule engine — useful when your routing logic doesn't belong in your service.
Guides, references, and architecture notes — written by the team that ships the code.
Interactive Scalar-rendered OpenAPI spec, all 44 endpoints.
Slack, Zapier, Make, n8n, and the source of every connector.
¿No estás seguro de qué enfoque se adapta?
La mayoría de los equipos comienzan como uno y crecen hasta abarcar los cuatro. Nuestro equipo de ventas puede revisar tu stack específico en 20 minutos.