Krátké odkazy a tajné zprávy přímo z kódu.
Jeden klíč typu bearer, prostý JSON a stejná pravidla tarifů jako v řídicím panelu. Pro rozšíření, CLI, servery MCP a interní nástroje.
Předběžný přístup. Endpointy v1 zapínáme postupně, pracovní prostor po pracovním prostoru. Pokud volání vrátí 503 s kódem disabled, API pro vás ještě není zapnuté. Klíče si můžete vytvořit už dnes a začnou fungovat, jakmile se API zapne.
Klientské knihovny
Tajné zprávy se šifrují ještě před odesláním, takže tuto část musí každý klient udělat sám. Tyto knihovny ji dělají správně a jsou ověřené proti stejným testovacím vektorům z repozitáře, které používá webová aplikace. Všechny tři mají licenci MIT, publikují se z CI s atestací npm provenance a nezávisí na ničem kromě standardní knihovny.
TypeScript SDK
npmTypovaný klient pro každý endpoint. Žádné závislosti, jen WebCrypto, takže beze změny běží na Node 20+, Deno, Bun, v prohlížečích i v edge prostředích.
npm i @uselinkpilot/sdkPříkazový řádek
npmTajnou zprávu předejte rourou, ne jako argument: argument se uloží do historie shellu a je vidět v seznamu procesů.
npm i -g linkpilot
echo 'db password: hunter2' | linkpilot secret --ttl 1hServer MCP
npmUmožní asistentovi AI předat někomu přihlašovací údaje, aniž by skončily v záznamu chatu. Přidejte tohle do Claude Desktop, Claude Code, Cursoru nebo jiného klienta MCP:
{
"mcpServers": {
"linkpilot": {
"command": "npx",
"args": ["-y", "@uselinkpilot/mcp"],
"env": { "LINKPILOT_API_KEY": "lp_live_..." }
}
}
}Než ho nainstalujete, počítejte s tím, že nešifrovaný text prochází kontextem asistenta, protože model musí tajnou zprávu vidět, aby ji mohl vytvořit. Server ji chrání při přenosu, v úložišti a tím, že se dá otevřít jen jednou. Před samotným modelem ji skrýt nedokáže.
Zdrojový kód: linkpilot-cli (SDK a CLI) a linkpilot-mcp.
1. Ověření
Klíč vytvořte na /app/api-keys (smějí to vlastníci a správci pracovního prostoru). Celý klíč se zobrazí jen jednou; LinkPilot si uchová pouze jeho hash SHA-256. Posílejte ho s každým požadavkem:
Authorization: Bearer lp_live_...Klíče patří ke konkrétnímu pracovnímu prostoru, takže nikde není parametr tenanta. Zneplatněné, neznámé a chybně formátované klíče i klíče s vypršelou platností vracejí stejnou chybu 401 unauthorized. Klíče se nikdy nezapisují do logů.
Základní URL: https://khiydxamyihofmtmgvjz.supabase.co/functions/v1/api-v1
2. Endpointy
| Metoda | Cesta | Co dělá |
|---|---|---|
| GET | /me | Pracovní prostor, tarif, limity, využití a zbývající limit požadavků vašeho klíče |
| POST | /links | Vytvoří krátký odkaz (url, volitelně slug, domain, title, tags) |
| GET | /links | Vypíše odkazy od nejnovějšího, se stránkováním přes kurzor |
| GET | /links/{id} | Načte jeden odkaz |
| DELETE | /links/{id} | Odstraní odkaz |
| POST | /secrets | Vytvoří tajný odkaz (ciphertext, enc_version, ttl_seconds, burn_after_read, passphrase_hash v tarifu Pro) |
| GET | /secrets | Vypíše metadata tajných zpráv (nikdy jejich obsah) |
| DELETE | /secrets/{id} | Zneplatní tajnou zprávu a zničí její obsah |
| POST | /public/links | Vytvoří anonymní odkaz s client_id, bez klíče |
| POST | /public/secrets | Vytvoří anonymní tajnou zprávu, která se po přečtení zničí, bez klíče |
Seznamy vracejí { data, next_cursor }; pro další stránku pošlete next_cursor zpět jako cursor. limit je 1 až 100.
3. Příklady
Vytvoření odkazu pomocí curl
curl -X POST "https://khiydxamyihofmtmgvjz.supabase.co/functions/v1/api-v1/links" \
-H "Authorization: Bearer $LINKPILOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/launch","slug":"launch","tags":["campaign"]}'Vytvoření tajné zprávy v JavaScriptu
const b64u = (b) => btoa(String.fromCharCode(...new Uint8Array(b)))
.replace(/+/g, "-").replace(///g, "_").replace(/=+$/, "");
// 1. Encrypt locally. This key is generated here and never sent anywhere.
const key = crypto.getRandomValues(new Uint8Array(32));
const iv = crypto.getRandomValues(new Uint8Array(12));
const k = await crypto.subtle.importKey("raw", key, "AES-GCM", false, ["encrypt"]);
const ct = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv, tagLength: 128 },
k,
new TextEncoder().encode("staging db password"),
);
const ciphertext = `v1.${b64u(iv)}.${b64u(ct)}`;
// 2. Store the blob. LinkPilot cannot read it.
const res = await fetch("https://khiydxamyihofmtmgvjz.supabase.co/functions/v1/api-v1/secrets", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LINKPILOT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ ciphertext, enc_version: 1, ttl_seconds: 3600 }),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const { secret_url } = await res.json();
// 3. Attach the key. Without this the link can never be opened, by anyone.
const shareUrl = `${secret_url}#k=${b64u(key)}`;Výpis odkazů v Pythonu
import os, requests
r = requests.get(
"https://khiydxamyihofmtmgvjz.supabase.co/functions/v1/api-v1/links",
params={"limit": 20},
headers={"Authorization": f"Bearer {os.environ['LINKPILOT_API_KEY']}"},
)
r.raise_for_status()
for link in r.json()["data"]:
print(link["short_url"], "->", link["url"])
print("remaining this hour:", r.headers["X-RateLimit-Remaining"])Vytvoření anonymního odkazu bez klíče
curl -X POST "https://khiydxamyihofmtmgvjz.supabase.co/functions/v1/api-v1/public/links" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","client_id":"my-cli-0123456789abcdef"}'Formální specifikace je zveřejněná tady, ne v repozitáři: dokument OpenAPI 3.1, kolekce pro Postman a psaná referenční dokumentace. Generátor kódu nasměrujte přímo na URL specifikace OpenAPI.
4. Jak se tajné zprávy ukládají
Tady chceme být přesní, protože klient API tu musí odvést skutečnou práci: nešifrovaný payload API vůbec nepřijme.
- Vy šifrujete, my ukládáme blob. Pošlete
ciphertext(AES-GCM-256,v1.<iv>.<ct>) senc_version: 1. Požadavek s polempayloadAPI odmítne, místo aby ho potichu přijalo. - Klíč musíte připojit sami. Adresa
secret_url, kterou vracíme, klíč neobsahuje a obsahovat nemůže: žádný jsme nikdy neviděli. Přidejte#k=<base64url key>. Prohlížeče část za znakem#nikdy neodesílají, takže příjemce dešifruje u sebe. - Obnova neexistuje. Když klíč ztratíte, tajná zpráva je pryč, pro vás i pro nás. Přesně tak má tahle záruka fungovat.
- Zničení po přečtení, po vypršení platnosti nebo po zneplatnění. Uložený šifrový text se na serveru přepíše.
- API ho nikdy nevrací. Žádný endpoint nevrací obsah ani šifrový text. Číst ho může jen stránka, na které si ho příjemce zobrazí, a ta zobrazení zaznamená.
- Heslové fráze (tarif Pro a vyšší) jsou skutečný druhý faktor: posilují se pomocí PBKDF2-SHA256 a pomocí HKDF se zapracují do klíče, takže samotný odkaz ani samotná heslová fráze obsah nedešifrují. Posílejte jen
passphrase_hash, tedy hex SHA-256 heslové fráze normalizované do NFKC. Nikdy neposílejte samotnou heslovou frázi, která je polovinou klíče. Klíč odvozujte ze stejné podoby NFKC, aby tajnou zprávu otevřela i heslová fráze napsaná na jiné klávesnici. - Co to nepokrývá. Kdo má celý odkaz, má i klíč, takže na krátké platnosti a zničení po přečtení pořád záleží. Přílohy se šifrují stejně, klíčem odvozeným ze stejného odkazu.
Formát přenášených dat popisuje referenční dokumentace API. Pokud ho nechcete implementovat ručně, @uselinkpilot/sdk obstará celou výměnu jedním voláním. Stejný model popisuje stránka bezpečnostní architektura.
5. Limity tarifů a limity požadavků
| Limit | Free | Pro | Agency |
|---|---|---|---|
| Odkazy | 50 | Neomezeně | Neomezeně |
| Aktivní tajné zprávy | 5 | 100 | 100 |
| Tajné zprávy s heslovou frází | Ne | Ano | Ano |
| Vlastní domény pro odkazy | Již ověřené domény | Až 5 | Neomezeně |
| Požadavky na klíč za hodinu | 60 | 1000 | 5000 |
API uplatňuje stejná pravidla tarifů jako řídicí panel a čte je ze stejného místa, takže i tady platí sdružení pracovních prostorů pod tarifem agentury. GET /me vrací aktuální čísla vašeho pracovního prostoru. Každá ověřená odpověď obsahuje X-RateLimit-Limit, X-RateLimit-Remaining a X-RateLimit-Reset.
6. Veřejné endpointy bez klíče
POST /public/links a POST /public/secrets jsou pro klienty, kteří nemohou zobrazit ověření v prohlížeči: CLI, servery MCP, spouštěč. Přijímají neprůhledné client_id (16 až 64 znaků, generuje se jednou pro každou instalaci) a vytvářejí záznamy ve stejném anonymním fondu jako bezplatné webové nástroje.
- 20 vytvoření na klienta denně a 60 na síť za hodinu, k tomu vlastní limity fondu pro jednotlivé sítě.
- Stejná kontrola podle zdrojů informací o hrozbách, kontrola URL v databázi hrozeb Google a plánované opakované kontroly jako u všech ostatních způsobů vytvoření.
- Bez vlastní domény, bez vlastního slugu, bez heslové fráze; veřejné tajné zprávy se vždy zničí po prvním přečtení a platnost jim vyprší do 24 hodin.
- Odpověď obsahuje
claim_token, aby přihlášený uživatel mohl záznam později přiřadit k pracovnímu prostoru. Zacházejte s ním jako s přihlašovacími údaji.
7. Chyby
Každá chyba má tvar { "error": { "code", "message", "upgrade_url"? } }. Chybové zprávy uvádějí název pole, nikdy vaše data. Prostředky v jiných pracovních prostorech vracejí 404, ne 403.
| Kód | HTTP | Kdy |
|---|---|---|
| unauthorized | 401 | Chybějící, chybně formátovaný, neznámý nebo zneplatněný klíč, případně klíč s vypršelou platností |
| disabled | 503 | API pro toto nasazení ještě není zapnuté |
| invalid_request | 400 | Chyba validace, blokovaný cíl, obsazený slug, neznámá doména |
| not_found | 404 | Endpoint neexistuje nebo prostředek není ve vašem pracovním prostoru |
| plan_limit | 402 | Vyčerpaný limit odkazů nebo aktivních tajných zpráv (včetně upgrade_url) |
| pro_required | 402 | Heslová fráze v tarifu, který ji nezahrnuje (včetně upgrade_url) |
| rate_limited | 429 | Vyčerpaný hodinový limit klíče nebo veřejný příděl (včetně Retry-After) |
Na co se ptají vývojáři
- Které tarify zahrnují API?
- Klíče API se vytvářejí v řídicím panelu na /app/api-keys. Každý klíč se řídí limity tarifu svého pracovního prostoru: Free má 50 odkazů, 5 aktivních tajných zpráv a 60 požadavků za hodinu; Pro má neomezený počet odkazů, 100 aktivních tajných zpráv, tajné zprávy chráněné heslovou frází a 1000 požadavků za hodinu; tarify Agency mají 5000 požadavků za hodinu.
- Je obsah tajných zpráv chráněn koncovým šifrováním (end-to-end)?
- Ano. API nešifrovaný text vůbec nepřijme. Šifrujete pomocí AES-GCM-256 a posíláte šifrový text; LinkPilot ukládá blob, ke kterému nemá klíč a který nedokáže dešifrovat. Protože váš klíč nikdy nevidíme, adresa secret_url, kterou vracíme, žádný klíč neobsahuje. Připojíte ho sami jako fragment #k=, který prohlížeče nikdy neodesílají. Když klíč ztratíte, tajnou zprávu už nikdo neobnoví, ani my. Přílohy se šifrují stejně, klíčem odvozeným ze stejného odkazu.
- Lze vytvářet odkazy bez klíče API?
- Ano. POST /public/links a POST /public/secrets místo klíče přijímají neprůhledné client_id a vytvářejí záznamy ve stejném anonymním fondu jako bezplatné webové nástroje: 20 vytvoření na klienta denně, 60 na síť za hodinu, bez vlastní domény, bez heslové fráze a platnost tajných zpráv vyprší do 24 hodin.
- Co se stane, když narazím na limit?
- Limity tarifu vracejí HTTP 402 s kódem plan_limit nebo pro_required a s upgrade_url. Limity požadavků vracejí 429 s hlavičkou Retry-After. Každá ověřená odpověď obsahuje X-RateLimit-Limit, X-RateLimit-Remaining a X-RateLimit-Reset, takže klienti mohou zpomalit dřív, než k tomu dojde.
- Je API stabilní?
- Endpointy v1 se nezmění způsobem, který by narušil kompatibilitu. Nekompatibilní změny vyjdou jako nová verze. Během předběžného přístupu se endpointy zapínají postupně, pracovní prostor po pracovním prostoru; odpověď 503 s kódem disabled znamená, že API pro váš pracovní prostor ještě není zapnuté.
Chcete začít?
Vytvořte klíč ve svém pracovním prostoru nebo začněte s tarifem Free.