Elido
Choisissez l'angle qui convient à votre équipe
For developers

The shortener you can read the source of.

Vous mesurez la latence, les taux d'erreur et le temps moyen de résolution. Elido est le raccourcisseur dont vous pouvez lire la source.

  • 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
POST /v1/links
201 Created · 38 ms
Request
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"
  }'
Response
{
  "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"
}
Idempotent · safe to retry Live spec
OpenAPI 3.1
Format de spécification
3
SDK natifs
5 ms
Redirection p50 (cache HIT)
Apache 2.0
Licence auto-hébergée

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.

Trace · 7f3a91 · GET / → 302
5 spans · 5.2 ms wall
edge.redirect
fasthttp · server
4.8 ms
cache.lookup (L1 → L2)
in-process LRU + Redis
0.6 ms
rule.evaluate
smart-link first-match
0.3 ms
response.write
302 + click_id header
1.0 ms
click.publish (async)
Redpanda · fire-and-forget
0.4 ms
Wall time
5.2 ms
Cache
L1 hit
Exporter
OTLP/gRPC

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 truth
    Spec checked in. SDKs regenerated on every release.
  • Typed error responses
    Rate-limit, validation, conflict — all typed, never stringly-caught.
  • Idempotency keys
    Header-based on every write endpoint, replayed on retry.
  • Built-in retries
    Exponential backoff with Retry-After honoured per language.
All six SDKs →
Canonical create — same call, three SDKs
generated from spec
TypeScriptcreate-link.ts
1import { Elido } from
2 "@elido/sdk";
3 
4const elido = new Elido({
5 apiKey: process.env.ELIDO_API_KEY!,
6});
7 
8const link = await elido.links.create({
9 destinationUrl: dest,
10 slug: "q2-launch",
11});
Gocreate-link.go
1import "github.com/elido/sdk-go"
2 
3client := elido.NewClient(
4 elido.WithAPIKey(key),
5)
6 
7link, err := client.Links.Create(ctx,
8 &elido.CreateLinkRequest{
9 DestinationURL: dest,
10 Slug: "q2-launch",
11 })
Pythoncreate_link.py
1from elido import Elido
2 
3elido = Elido(
4 api_key=os.environ["ELIDO_API_KEY"],
5)
6 
7link = elido.links.create(
8 destination_url=dest,
9 slug="q2-launch",
10 idempotency_key=build_id,
11)
sdk-ts@2.4 · sdk-go@2.4 · sdk-py@2.4 in sync

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.

link_service.proto
buf · v1
1syntax = "proto3";
2 
3package elido.api.v1;
4 
5option go_package = "github.com/elido/proto/api/v1;apiv1";
6 
7service 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}
13 
14message 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}
21 
22message Link {
23 string id = 1;
24 string short_url = 2;
25 string destination_url = 3;
26 google.protobuf.Timestamp created_at = 4;
27}
served from api-core:9090 stable
mTLSservice-mesh native

Authenticate with workload identity via SPIFFE/SPIRE or your mesh's built-in mTLS. API keys still work for non-mesh callers.

Same handlersREST and gRPC

One implementation in api-core. Connect-Go transcoding means the REST surface is generated, not separately maintained.

Streamingserver-side events

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

Ce que l'API Elido offre réellement

Une spécification OpenAPI et un jeton Bearer sont le minimum syndical. Les fonctionnalités ci-dessous sont ce qui distingue un raccourcisseur sur lequel on peut bâtir d'un outil contre lequel vous vous battrez à 2 heures du matin.

REST prévisible
01

OpenAPI 3.1 avec 44 points de terminaison documentés — aucune surface non documentée

Chaque point de terminaison en production est décrit dans la spécification OpenAPI 3.1. Pas de routes fantômes, pas de paramètres non documentés oubliés par l'équipe de documentation. La spécification est intégrée au dépôt et versionnée aux côtés de l'API ; les changements de rupture suivent SemVer et bénéficient d'une fenêtre de dépréciation d'au moins 90 jours. La spécification est rendue de manière interactive avec Scalar dans la documentation — collez votre clé API et testez les appels sans quitter le navigateur. Trois SDK (TypeScript, Python, Go) sont générés à partir de la même spécification à chaque version, ils ne peuvent donc pas diverger de ce que le serveur accepte réellement. Les méthodes des SDK acceptent des objets de requête typés et renvoient des objets de réponse typés ; les erreurs sont typées, pas simplement capturées comme des chaînes. Les clés d'idempotence sont prises en charge sur les points de terminaison d'écriture — passez un en-tête `Idempotency-Key` et la réponse est rejouée en cas de nouvelle tentative sans création de doublon.

Contrôle programmatique des slugs
02

Slugs déterministes, création en masse et idempotence pour les pipelines CI

POST /v1/workspaces/{ws}/links accepte un champ slug — vous obtenez le slug demandé ou une erreur de conflit avec l'ID du lien existant pour que votre pipeline puisse décider quoi faire. La création en masse (POST .../links/bulk) accepte jusqu'à 100 spécifications de liens par appel ; la réponse inclut un résultat par ligne d'entrée avec soit un lien créé, soit une erreur, afin que les échecs partiels ne soient pas masqués. Les deux points de terminaison acceptent des clés d'idempotence : soumettez à nouveau la même requête avec la même clé et vous obtiendrez la même réponse, sans doublons de lignes. C'est le modèle pour les pipelines CI/CD qui génèrent des liens courts lors du déploiement — déterministe, sûr à rejouer, cohérent entre les environnements. L'espace de noms des slugs est par domaine personnalisé : le même slug sur deux domaines différents correspond à deux liens différents, pas à un conflit.

Webhooks et firehose
03

Webhooks signés par HMAC avec tentative automatique et file d'attente de messages non distribués

Chaque événement d'espace de travail (lien créé, lien cliqué, lien supprimé, entrée d'audit, conversion attribuée) est disponible via un webhook. Les charges utiles sont signées avec HMAC-SHA256 à l'aide d'un secret rotatif ; la clé de signature est distincte de votre clé API afin que la rotation de l'une n'invalide pas l'autre. Sémantique de livraison : au moins une fois, avec un backoff exponentiel (1s, 5s, 30s, 5m, 30m) et une fenêtre de tentative configurable (24h par défaut). Les événements qui épuisent les tentatives atterrissent dans une file d'attente de messages non distribués (DLQ) visible dans le tableau de bord ; vous pouvez les rejouer à partir de là. Pour les pipelines d'événements à haut volume, le firehose Kafka/Redpanda contourne entièrement la livraison HTTP — consommez les événements de clic et les journaux d'audit directement depuis le flux. Le firehose est une fonctionnalité Business ; la livraison par webhook est disponible sur Pro et supérieur.

Protocole MCP
04

Serveur Model Context Protocol : les outils Elido dans n'importe quel client MCP

Le serveur Elido MCP open-source (licence MIT) expose les points de terminaison de liens, QR et analytics en tant qu'outils MCP typés. L'installation prend 30 secondes : ajoutez le bloc serveur à votre configuration Claude Desktop ou Cursor, définissez ELIDO_API_KEY, redémarrez. Le catalogue d'outils est auto-découvert à partir du serveur — pas de définitions d'outils écrites à la main qui dérivent. La lecture seule est la portée par défaut ; les opérations d'écriture nécessitent une autorisation explicite dans les paramètres de l'espace de travail. Chaque appel d'outil apparaît dans le journal d'audit de l'espace de travail avec la clé d'appel et les arguments, de sorte que les mutations pilotées par agent sont traçables. Le serveur communique via stdio et SSE ; il applique les mêmes limites de débit et codes d'erreur que l'API REST, y compris Retry-After sur 429 pour que votre agent puisse ralentir proprement. La source est sur GitHub ; les forks courants ajoutent des outils spécifiques à l'espace de travail ou un enrichissement de métadonnées sans avoir besoin qu'Elido fusionne en amont.

Auto-hébergement
05

Chart Helm (Apache 2.0) : exécutez le niveau de redirection dans votre propre VPC

Le niveau de redirection (service edge-redirect) est le seul composant sur le chemin critique de chaque redirection. C'est un binaire Go unique — aucune dépendance d'exécution au-delà de Redis pour le cache L2. Le chart Helm est livré avec des paramètres par défaut sains pour l'autoscaling horizontal de pods Kubernetes ; il s'adapte en fonction du CPU et du taux de requêtes. La configuration se fait par variables d'environnement ; le chart inclut un fichier values.yaml avec des valeurs par défaut saines et une liste documentée de chaque variable. Le reste de la pile (api-core, tableau de bord) peut rester sur le SaaS géré par Elido — vous n'avez pas besoin de tout auto-héberger. Le découpage courant est : niveau de redirection auto-hébergé dans votre VPC (latence plus faible pour vos utilisateurs, pas de facturation de sortie), tableau de bord et analytics sur le cloud d'Elido. Utilisez votre propre KMS pour le chiffrement au repos du cache Redis local si votre posture de sécurité l'exige. Comparé à Bitly (pas d'option d'auto-hébergement) et à la création d'un raccourcisseur personnalisé, l'option du chart Helm vous offre les performances de redirection et la surface d'API gérée sans repartir de zéro.

Stack you'll touch

  • SDK TypeScript
  • SDK Python
  • SDK Go
  • Flux de webhooks
  • Spécification OpenAPI 3.1
  • Chart Helm auto-hébergé

Ce que vous allez mesurer

Latence de redirection p50
5 ms cache HIT
SLA de disponibilité API
99,95 % sur Business
RTO auto-hébergé
<1 heure

Les équipes d'ingénierie qui bâtissent sur Elido

Les noms sont des espaces réservés pour le moment — les noms réels des clients seront affichés au fur et à mesure de la publication des études de cas.

Nous auto-hébergeons le niveau de redirection dans notre propre cluster Kubernetes et utilisons l'API gérée pour tout le reste. La latence de redirection p50 est passée de 45 ms à 6 ms après avoir déplacé le service edge dans la même région que nos utilisateurs. Le chart Helm était suffisamment clair pour que nous puissions déployer sans consulter le support.

É
Équipe d'ingénierie de plateforme, SaaS mid-market, Vilnius
Ingénieur Staff

Le serveur MCP a été le facteur décisif. Notre équipe travaille dans Cursor toute la journée ; pouvoir créer des liens courts tagués pour les notes de mise à jour depuis l'IDE sans quitter le flux de travail est le genre de gain de DX qui fait vraiment la différence.

É
Équipe DevRel, entreprise d'outils pour développeurs, Berlin
Responsable des Relations Développeurs

Les clés d'idempotence sur la création en masse nous permettent de générer des liens courts en CI sans paranoïa quant aux doublons lors des tentatives. Le SDK Go typé signifie que notre code de pipeline compile ou échoue — pas de mauvaises requêtes silencieuses au moment de l'exécution.

É
Équipe plateforme backend, fintech, Amsterdam
Ingénieur Backend Senior

API Elido vs API Bitly vs construire votre propre raccourcisseur

Deux options externes et l'alternative de construction interne. Honnête sur les points où l'API de Bitly est plus mature et où un raccourcisseur personnalisé gagne en contrôle.

CapabilityElidoAPI BitlyRaccourcisseur personnalisé
Format de spécification APIOpenAPI 3.1, intégré au dépôtDocumentation personnalisée v4 (pas OpenAPI)Ce que vous écrivez
SDK natifsTypeScript, Python, Go — générés à partir de la spécificationJavaScript, Python, Ruby, JavaVous les construisez
Clés d'idempotence sur les écrituresOui — basées sur l'en-tête, tous les points de terminaison d'écritureNon documentéVous l'implémentez
Création en masse100 par appel, échec partiel par ligneAucun point de terminaison en masse natif documentéVotre schéma, vos règles
Livraison de webhookAu moins une fois, HMAC-SHA256, DLQDisponible sur EnterpriseVous le construisez
Serveur MCPOpen-source MIT, installation en 30sNon disponibleVous le construisez
Auto-hébergement du niveau de redirectionChart Helm Apache 2.0Non disponibleContrôle total, coût total
Latence de redirection p505 ms cache HITComparable (servi à l'edge)Dépend de votre infrastructure

Questions des développeurs

Où se trouve la spécification OpenAPI ?

Sur /docs/api-reference — Scalar la rend de manière interactive. Le YAML brut est sur /openapi.yaml. C'est la même spécification que celle utilisée pour générer les SDK, pas un document maintenu séparément.

Comment obtenir un slug déterministe en CI ?

Passez `slug` dans le corps de la requête. Si le slug est déjà pris par un lien différent, l'API renvoie 409 avec l'ID du lien en conflit. S'il est pris par la même URL de destination (re-création idempotente), elle renvoie le lien existant. Utilisez l'en-tête Idempotency-Key pour sécuriser les tentatives.

Que comprend le chart Helm pour l'auto-hébergement ?

Le service edge-redirect (binaire Go), la configuration Redis, les paramètres HPA et un fichier values.yaml avec toutes les variables de configuration documentées. Il n'inclut pas api-core ni le tableau de bord — ceux-ci peuvent rester sur le SaaS d'Elido. Licence Apache 2.0 ; pas de CLA requis pour les forks.

Comment consommer les événements de clic sans polling ?

Deux options : les webhooks (HTTPS, signés HMAC, au moins une fois) ou le firehose Kafka/Redpanda (consommateur direct, niveau Business). Les webhooks conviennent parfaitement pour l'audit et l'alerte ; le firehose est la solution adaptée aux pipelines d'événements à haut volume où la surcharge de livraison HTTP par événement est critique.

Quelle est la limite de débit ?

100 requêtes/sec en continu, 200 en rafale par clé API, avec une erreur 429 et un en-tête Retry-After. Les points de terminaison d'écriture sont comptés séparément des lectures. Le serveur MCP transmet l'erreur 429 comme une erreur d'outil ; les SDK exposent la valeur Retry-After comme un champ typé dans l'erreur de limite de débit.

Puis-je utiliser le serveur MCP dans l'automatisation de production, pas seulement de manière interactive ?

Oui — le serveur MCP est un processus stdio ou SSE standard. Vous pouvez l'invoquer depuis un script, une étape CI ou un pipeline d'agent. Lecture seule par défaut ; la portée d'écriture nécessite un paramètre explicite dans l'espace de travail. Chaque appel est audité.

Quelle politique de changement de rupture utilisez-vous ?

SemVer sur le préfixe de version de l'API (/v1/, /v2/). Les changements de rupture bénéficient d'une fenêtre de dépréciation de 90 jours avec les deux versions actives simultanément. Les ajouts non disruptifs (nouveaux champs, nouveaux points de terminaison) se font sans changement de version. Le journal des modifications sur /changelog documente chaque changement avec le point de terminaison concerné.

Existe-t-il un mode de développement local sans interroger l'API réelle ?

Les SDK TypeScript et Python acceptent une surcharge de baseUrl pointant vers votre propre instance — utile pour l'auto-hébergement. Il n'y a pas encore de serveur de simulation officiel ; pour les tests locaux, le modèle est d'utiliser un espace de travail de test avec une clé API séparée, pas un mock. C'est sur la feuille de route.

Pas sûr de l'angle qui convient ?

La plupart des équipes commencent par un et évoluent vers les quatre. Notre équipe commerciale peut examiner votre pile spécifique en 20 minutes.

Pour les développeurs — REST simple. Trois SDKs. Un chart Helm auto-hébergé. · Elido