The shortener you can read the source of.
Mierzysz opóźnienia, wskaźniki błędów i czas do MTTR. Elido to skracacz, którego źródło możesz czytać.
- 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
Co tak naprawdę oferuje API Elido
Specyfikacja OpenAPI i token Bearer to standard. Poniższe funkcje odróżniają skracacz, na którym można budować, od takiego, z którym będziesz walczyć o 2 rano.
OpenAPI 3.1 z 44 udokumentowanymi punktami końcowymi — brak niejawnych interfejsów
Każdy punkt końcowy w środowisku produkcyjnym jest opisany w specyfikacji OpenAPI 3.1. Brak ukrytych tras czy nieudokumentowanych parametrów, o których zapomniał zespół dokumentacji. Specyfikacja jest sprawdzana w repozytorium i wersjonowana wraz z API; zmiany przełamujące są zgodne z SemVer i mają co najmniej 90-dniowy okres przejściowy. Specyfikacja jest renderowana interaktywnie za pomocą Scalar w dokumentacji — wklej swój klucz API i testuj wywołania bez opuszczania przeglądarki. Trzy oficjalne SDK (TypeScript, Python, Go) są generowane z tej samej specyfikacji przy każdym wydaniu, więc nie mogą odbiegać od tego, co faktycznie akceptuje serwer. Metody SDK przyjmują typowane obiekty żądań i zwracają typowane obiekty odpowiedzi; błędy są typowane, a nie przechwytywane jako ciągi znaków. Klucze idempotencji są obsługiwane w punktach zapisu — przekaż nagłówek `Idempotency-Key`, a odpowiedź zostanie powtórzona przy ponownej próbie bez tworzenia duplikatu.
Deterministyczne slugi, masowe tworzenie i idempotencja dla potoków CI
POST /v1/workspaces/{ws}/links akceptuje pole slug — otrzymujesz taki slug, o jaki prosiłeś, lub błąd konfliktu z ID istniejącego linku, aby Twój potok mógł zdecydować, co zrobić. Masowe tworzenie (POST .../links/bulk) akceptuje do 100 specyfikacji linków na wywołanie; odpowiedź zawiera jeden wynik dla każdego wiersza wejściowego z utworzonym linkiem lub błędem, więc częściowe niepowodzenia nie są ukryte. Oba punkty końcowe akceptują klucze idempotencji: wyślij ponownie to samo żądanie z tym samym kluczem, a otrzymasz tę samą odpowiedź, bez duplikowania rekordów. To wzorzec dla potoków CI/CD, które generują krótkie linki podczas wdrożenia — deterministyczny, bezpieczny przy powtórzeniach i spójny między środowiskami. Przestrzeń nazw slugów jest definiowana dla każdej domeny niestandardowej: ten sam slug w dwóch różnych domenach to dwa różne linki, a nie konflikt.
Webhooki podpisane HMAC z automatycznymi ponowieniami i kolejką dead-letter
Każde zdarzenie w przestrzeni roboczej (utworzenie linku, kliknięcie, usunięcie, wpis w audycie, atrybucja konwersji) jest dostępne jako webhook. Dane są podpisane HMAC-SHA256 przy użyciu rotacyjnego sekretu; klucz podpisu jest oddzielony od klucza API, więc rotacja jednego nie unieważnia drugiego. Semantyka dostarczania: co najmniej raz (at-least-once), z wykładniczym czasem oczekiwania (1s, 5s, 30s, 5m, 30m) i konfigurowalnym oknem ponowień (domyślnie 24h). Zdarzenia, które wyczerpią limity ponowień, trafiają do kolejki dead-letter widocznej w panelu; możesz je stamtąd ponowić. Dla potoków zdarzeń o dużej objętości firehose Kafka/Redpanda całkowicie pomija dostarczanie przez HTTP — konsumuj zdarzenia kliknięć i logi audytowe bezpośrednio ze strumienia. Firehose jest funkcją planu Business; dostarczanie webhooków jest dostępne w planie Pro i wyższych.
Serwer Model Context Protocol: narzędzia Elido w każdym kliencie MCP
Serwer Elido MCP o otwartym kodzie źródłowym (licencja MIT) udostępnia punkty końcowe linków, QR i analityki jako typowane narzędzia MCP. Instalacja trwa 30 sekund: dodaj blok serwera do konfiguracji Claude Desktop lub Cursor, ustaw ELIDO_API_KEY i zrestartuj. Katalog narzędzi jest automatycznie wykrywany z serwera — brak ręcznie pisanych definicji, które mogą stać się nieaktualne. Domyślnym zakresem jest tylko odczyt; operacje zapisu wymagają wyraźnej zgody w ustawieniach przestrzeni roboczej. Każde wywołanie narzędzia pojawia się w logu audytu wraz z kluczem wywołującym i argumentami, dzięki czemu zmiany wprowadzane przez agentów są łatwe do śledzenia. Serwer komunikuje się przez stdio i SSE; stosuje te same limity zapytań i kody błędów co API REST, w tym nagłówek Retry-After przy błędzie 429, aby Twój agent mógł płynnie zwolnić tempo. Kod źródłowy jest dostępny na GitHub; popularne forki dodają specyficzne dla przestrzeni roboczej narzędzia lub wzbogacanie metadanych bez konieczności wprowadzania zmian w głównym projekcie Elido.
Helm chart (Apache 2.0): uruchom warstwę przekierowań we własnym VPC
Warstwa przekierowań (usługa edge-redirect) jest jedynym komponentem na ścieżce krytycznej każdego przekierowania. To pojedynczy plik binarny Go — bez zależności uruchomieniowych poza Redis dla pamięci podręcznej L2. Helm chart dostarczany jest z optymalnymi ustawieniami dla horyzontalnego skalowania podów w Kubernetes; skaluje się na podstawie zużycia procesora i liczby żądań. Konfiguracja odbywa się za pomocą zmiennych środowiskowych; arkusz zawiera plik values.yaml z rozsądnymi domyślnymi wartościami i dokumentacją każdej zmiennej. Reszta stosu (api-core, dashboard) może pozostać w zarządzanym SaaS Elido — nie musisz hostować wszystkiego samodzielnie. Typowy podział to: warstwa przekierowań hostowana samodzielnie w Twoim VPC (niższe opóźnienia dla użytkowników, brak opłat za transfer wychodzący), a panel i analityka w chmurze Elido. Użyj własnego KMS do szyfrowania lokalnego cache Redis w spoczynku, jeśli wymagają tego Twoje standardy bezpieczeństwa. W porównaniu do Bitly (brak opcji self-host) i budowania własnego rozwiązania, opcja Helm chart daje wydajność przekierowań i zarządzaną powierzchnię API bez konieczności budowania wszystkiego od zera.
Stack you'll touch
- TypeScript SDK
- Python SDK
- Go SDK
- Strumień webhooków
- Specyfikacja OpenAPI 3.1
- Wykres Helm do samodzielnego hostingu
Co będziesz mierzyć
- Opóźnienie przekierowania p50
- 5 ms trafienie w pamięć podręczną
- Uptime API SLA
- 99.95% na poziomie Business
- Samodzielny hosting RTO
- <1 godzina
Zespoły inżynierskie budujące na naszym rozwiązaniu
Nazwy są tymczasowe — prawdziwe nazwy klientów pojawią się wraz z publikacją studiów przypadku.
“Samodzielnie hostujemy warstwę przekierowań w naszym klastrze Kubernetes, a do wszystkiego innego używamy zarządzanego API. Opóźnienie przekierowania p50 spadło z 45ms do 6ms po przeniesieniu usługi edge do tego samego regionu, w którym są nasi użytkownicy. Helm chart był na tyle czytelny, że wdrożyliśmy go bez kontaktu ze wsparciem.”
“Serwer MCP był decydującym czynnikiem. Nasz zespół pracuje w Cursor przez cały dzień; możliwość tworzenia otagowanych krótkich linków do notatek z wydania bezpośrednio w IDE, bez przerywania pracy, to rodzaj wygranej w obszarze DX, która naprawdę robi różnicę.”
“Klucze idempotencji przy masowym tworzeniu pozwalają nam generować krótkie linki w CI bez obaw o duplikaty przy ponownych próbach. Typowane SDK Go sprawia, że nasz kod potoku albo się kompiluje, albo nie — brak cichych błędów żądań w czasie rzeczywistym.”
API Elido vs API Bitly vs budowa własnego skracacza
Dwie opcje zewnętrzne i alternatywa w postaci własnego rozwiązania. Szczerze o tym, gdzie API Bitly jest bardziej dojrzałe, a gdzie własny skracacz wygrywa pod względem kontroli.
| Capability | Elido | API Bitly | Własny skracacz |
|---|---|---|---|
| Format specyfikacji API | OpenAPI 3.1, sprawdzane w repo | Niestandardowa dokumentacja v4 (nie OpenAPI) | Taki, jaki napiszesz |
| Oficjalne SDK | TypeScript, Python, Go — generowane ze specyfikacji | JavaScript, Python, Ruby, Java | Musisz je zbudować |
| Klucze idempotencji przy zapisie | Tak — oparte na nagłówkach, wszystkie punkty zapisu | Brak dokumentacji | Musisz to zaimplementować |
| Masowe tworzenie | 100 na wywołanie, częściowe błędy dla wierszy | Brak udokumentowanego natywnego punktu masowego | Twój schemat, Twoje zasady |
| Dostarczanie webhooków | Co najmniej raz, HMAC-SHA256, DLQ | Dostępne w planie Enterprise | Musisz to zbudować |
| Serwer MCP | Open-source MIT, 30s instalacji | Niedostępne | Musisz to zbudować |
| Self-host warstwy przekierowań | Helm chart na licencji Apache 2.0 | Niedostępne | Pełna kontrola, pełny koszt |
| Opóźnienie przekierowania p50 | 5 ms (trafienie w cache) | Porównywalne (obsługiwane na brzegu sieci) | Zależy od Twojej infrastruktury |
Pytania programistów
Gdzie znajdę specyfikację OpenAPI?
Pod adresem /docs/api-reference — Scalar renderuje ją interaktywnie. Surowy plik YAML znajduje się pod /openapi.yaml. To ta sama specyfikacja, z której generowane są SDK, a nie oddzielnie utrzymywany dokument.
Jak uzyskać deterministyczny slug w CI?
Przekaż pole `slug` w treści żądania. Jeśli slug jest już zajęty przez inny link, API zwróci błąd 409 z ID kolidującego linku. Jeśli jest zajęty przez ten sam docelowy URL (idempotentne ponowne utworzenie), zwróci istniejący link. Użyj nagłówka Idempotency-Key, aby powtórzenia były bezpieczne.
Co zawiera Helm chart do samodzielnego hostowania?
Usługę edge-redirect (plik binarny Go), konfigurację Redis, ustawienia HPA oraz plik values.yaml z udokumentowanymi wszystkimi zmiennymi konfiguracyjnymi. Nie zawiera api-core ani dashboardu — te mogą pozostać w SaaS Elido. Licencja Apache 2.0; brak wymogu CLA dla forków.
Jak konsumować zdarzenia kliknięć bez odpytywania (polling)?
Dwie opcje: webhooki (HTTPS, podpisane HMAC, dostarczanie co najmniej raz) lub firehose Kafka/Redpanda (bezpośredni konsument, plan Business). Webhooki są odpowiednie dla audytu i alertów; firehose to właściwa droga dla potoków danych o dużej objętości, gdzie narzut HTTP na każde zdarzenie ma znaczenie.
Jakie są limity zapytań (rate limits)?
Stałe 100 zap./sek., 200 w piku na klucz API, z błędem 429 i nagłówkiem Retry-After. Punkty końcowe zapisu są liczone oddzielnie od odczytów. Serwer MCP przekazuje błąd 429 jako błąd narzędzia; SDK udostępniają wartość Retry-After jako typowane pole w błędzie limitu zapytań.
Czy mogę używać serwera MCP w automatyzacji produkcyjnej, a nie tylko interaktywnie?
Tak — serwer MCP to standardowy proces stdio lub SSE. Możesz go wywołać ze skryptu, kroku CI lub potoku agenta. Domyślnie tylko do odczytu; zakres zapisu wymaga wyraźnego ustawienia w przestrzeni roboczej. Każde wywołanie podlega audytowi.
Jaką politykę wprowadzania zmian przełamujących stosujecie?
Używamy SemVer dla prefiksu wersji API (/v1/, /v2/). Zmiany przełamujące mają 90-dniowy okres przejściowy, w którym obie wersje są dostępne jednocześnie. Nieprzełamujące dodatki (nowe pola, nowe punkty końcowe) pojawiają się bez zmiany wersji. Changelog pod adresem /changelog dokumentuje każdą zmianę wraz z dotkniętym punktem końcowym.
Czy istnieje lokalny tryb programistyczny bez uderzania w prawdziwe API?
SDK TypeScript i Python akceptują nadpisanie baseUrl wskazujące na własną instancję — przydatne dla osób korzystających z self-host. Nie mamy jeszcze oficjalnego serwera mocków; dla testów lokalnych zalecanym wzorcem jest testowa przestrzeń robocza z oddzielnym kluczem API. Mamy to w planach rozwoju.
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.
Nie wiesz, która perspektywa pasuje?
Większość zespołów zaczyna od jednej, a potem rozszerza się na wszystkie cztery. Nasz zespół sprzedaży może omówić Twój konkretny stos w 20 minut.