Une plateforme de liens avec une API REST simple.
Vous mesurez la latence, les taux d'erreur et le temps moyen de résolution. Elido vous offre REST + gRPC, des SDK en quatre langages (TypeScript, Go, Python, Ruby), des spans OpenTelemetry sur chaque redirection, et l'auto-hébergement par contrat (Enterprise) si le SaaS n'est pas la bonne forme.
- REST + gRPC : choisissez la surface que préfère votre service mesh
- Spans OpenTelemetry sur chaque redirection, chaque appel API
- Quatre SDK : TypeScript, Go, Python, Ruby
- Auto-hébergement par contrat (Enterprise)
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" }
Observabilité - intégrée, pas ajoutée après coup
Chaque redirection émet un span OpenTelemetry. Chaque span arrive dans votre collecteur.
Le service edge est instrumenté de bout en bout avec OTel. Pointez votre collecteur OTLP vers le tier de redirection et vous obtenez la cascade complète - recherche en cache, évaluation de règles, réponse, et la publication asynchrone de l'événement de clic - sans écrire une seule ligne d'instrumentation vous-même.
SDKs
Même appel canonique. Six langages. Tous générés depuis une seule spec.
Chaque SDK est généré depuis la même spec OpenAPI 3.1. Un endpoint ajouté côté serveur ? Lancez le générateur, livrez les SDKs, c'est fait. Pas de client maintenu manuellement qui dérive de l'API. Les clés d'idempotence, les relances avec backoff exponentiel, et les réponses d'erreur typées sont exposées de manière cohérente dans les six langages.
- Source de vérité OpenAPI 3.1Spec versionnée. SDKs régénérés à chaque release.
- Réponses d'erreur typéesRate-limit, validation, conflit - tous typés, jamais capturés comme chaînes.
- Clés d'idempotenceBasées sur les en-têtes pour chaque endpoint d'écriture, rejouées lors des relances.
- Relances intégréesBackoff exponentiel avec Retry-After respecté dans chaque langage.
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 "elido"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)
Contrat gRPC
Même surface en protobuf - pour les natifs du service mesh.
Notre API sert REST et gRPC depuis les mêmes handlers. Si votre plateforme parle nativement proto (Envoy, Istio, Linkerd, Connect-Go), passez la couche JSON. Les fichiers .proto sont publiés ; générez des clients dans n'importe quel langage supporté par buf ou protoc.
1syntax = "proto3";23package elido.api.v1;45option java_multiple_files = true;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.
Ce que vous obtenez d'emblée
- REST + gRPC : choisissez la surface que préfère votre service mesh
- Spans OpenTelemetry sur chaque redirection, chaque appel API
- Quatre SDK : TypeScript, Go, Python, Ruby
- Auto-hébergement par contrat (Enterprise)
- Firehose de webhooks avec signature HMAC-SHA256
- Endpoint Prometheus /metrics sur chaque 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.
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.
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 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 compatible Kafka 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.
Serveur Model Context Protocol : les outils Elido dans n'importe quel client MCP
Le serveur Elido MCP 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. Le serveur n'est pas encore publié publiquement : la publication est prévue prochainement ; contactez le support pour un accès anticipé.
Auto-hébergement par contrat (Enterprise)
Un chart Helm pour Kubernetes existe dans le dépôt. Les conditions de licence et le modèle d’auto-hébergement pris en charge sont fixés par contrat ; contactez [email protected] avant de vous appuyer sur l’auto-hébergement.
Stack que vous utiliserez
- SDK TypeScript
- SDK Python
- SDK Go
- Flux de webhooks
- Spécification OpenAPI 3.1
Ce que vous allez mesurer
- Latence de redirection p50
- 5 ms cache HIT
- SLA de disponibilité API
- 99,95 % sur Business
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.
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.
Y a-t-il une option self-host ?
Un chart Helm pour Kubernetes existe dans le dépôt. Les conditions de licence et le modèle d’auto-hébergement pris en charge sont fixés par contrat ; contactez [email protected] avant de vous appuyer sur l’auto-hébergement.
Comment consommer les événements de clic sans polling ?
Deux options : les webhooks (HTTPS, signés HMAC, au moins une fois) ou le firehose compatible Kafka (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. 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.
Lecture recommandée pour les développeurs
Spécification OpenAPI 3.1, quatre SDK officiels et le contenu de chacun.
Événements signés HMAC, politique de relance, file morte, firehose Kafka.
Moteur de règles edge - utile quand votre logique de routage n'appartient pas à votre service.
Guides, références et notes d'architecture - rédigés par l'équipe qui livre le code.
Spec OpenAPI interactive rendue par Scalar, 44 endpoints au total.
Slack, Zapier, Make, n8n, et plus encore.
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.