---
title: "API LinkPilot pro vývojáře | Krátké a tajné odkazy"
url: https://uselinkpilot.com/cs/developers
description: "Krátké odkazy a tajné zprávy, které se po přečtení zničí, přímo z kódu: REST API s klíčem, limity tarifů, veřejné cesty bez klíče pro CLI a OpenAPI 3.1."
lang: cs
---

Integrační API v1

# 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.

Vytvořit klíč API: https://uselinkpilot.com/app/api-keys
Specifikace OpenAPI: https://uselinkpilot.com/openapi.yaml?v=20261002

**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

npm (https://www.npmjs.com/package/@uselinkpilot/sdk)

Typovaný 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/sdk
```

### Příkazový řádek

npm (https://www.npmjs.com/package/linkpilot)

Tajnou 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 1h
```

### Server MCP

npm (https://www.npmjs.com/package/@uselinkpilot/mcp)

Umož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 (https://github.com/TetraCoreHQ/linkpilot-cli) (SDK a CLI) a linkpilot-mcp (https://github.com/TetraCoreHQ/linkpilot-mcp).

## 1. Ověření

Klíč vytvořte na /app/api-keys (https://uselinkpilot.com/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 (https://uselinkpilot.com/openapi.yaml?v=20261002), kolekce pro Postman (https://uselinkpilot.com/linkpilot-api-v1.postman_collection.json) a psaná referenční dokumentace (https://uselinkpilot.com/docs/api-v1.md?v=20261002). 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>`) s `enc_version: 1`. Požadavek s polem `payload` API 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 (https://uselinkpilot.com/cs/security-architecture).

## 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`.

Porovnat tarify: https://uselinkpilot.com/cs/pricing

## 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.

Přejít na klíče API: https://uselinkpilot.com/app/api-keys
Vytvořit pracovní prostor zdarma: https://uselinkpilot.com/signup

## Structured data

```json
[
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Které tarify zahrnují API?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "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."
        }
      },
      {
        "@type": "Question",
        "name": "Je obsah tajných zpráv chráněn koncovým šifrováním (end-to-end)?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "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."
        }
      },
      {
        "@type": "Question",
        "name": "Lze vytvářet odkazy bez klíče API?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "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."
        }
      },
      {
        "@type": "Question",
        "name": "Co se stane, když narazím na limit?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "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."
        }
      },
      {
        "@type": "Question",
        "name": "Je API stabilní?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "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é."
        }
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "name": "Domů",
        "item": "https://uselinkpilot.com/cs"
      },
      {
        "@type": "ListItem",
        "position": 2,
        "name": "Vývojáři",
        "item": "https://uselinkpilot.com/cs/developers"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "SoftwareApplication",
    "@id": "https://uselinkpilot.com/#software",
    "name": "LinkPilot",
    "applicationCategory": "BusinessApplication",
    "operatingSystem": "Web",
    "description": "LinkPilot is a secure link management platform for creating branded short links, tracking engagement, and sharing secrets with expiring, protected, self-destructing links.",
    "url": "https://uselinkpilot.com",
    "offers": [
      {
        "@type": "Offer",
        "name": "Free",
        "price": "0",
        "priceCurrency": "USD",
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Pro",
        "price": "29",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "29",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency",
        "price": "299",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "299",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency Plus",
        "price": "799",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "799",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Pro (yearly)",
        "price": "288",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "288",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency (yearly)",
        "price": "2988",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "2988",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency Plus (yearly)",
        "price": "7980",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "7980",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Enterprise",
        "priceSpecification": {
          "@type": "PriceSpecification",
          "priceCurrency": "USD"
        },
        "url": "https://uselinkpilot.com/pricing"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "Organization",
    "@id": "https://uselinkpilot.com/#organization",
    "name": "LinkPilot",
    "alternateName": "LinkPilot by TetraCore",
    "url": "https://uselinkpilot.com",
    "contactPoint": {
      "@type": "ContactPoint",
      "contactType": "customer support",
      "email": "support@uselinkpilot.com",
      "url": "https://uselinkpilot.com/support"
    },
    "parentOrganization": {
      "@type": "Organization",
      "@id": "https://tetracorehq.com/#organization",
      "name": "TetraCore",
      "url": "https://tetracorehq.com/"
    },
    "logo": {
      "@type": "ImageObject",
      "url": "https://uselinkpilot.com/logo-512.png",
      "width": 512,
      "height": 512
    },
    "description": "LinkPilot is a secure link management platform for creating branded short links, tracking engagement, and sharing secrets with expiring, protected, self-destructing links.",
    "sameAs": [
      "https://x.com/uselinkpilot",
      "https://www.linkedin.com/company/uselinkpilot",
      "https://facebook.com/uselinkpilot",
      "https://github.com/TetraCoreHQ/linkpilot-cli",
      "https://github.com/TetraCoreHQ/linkpilot-mcp",
      "https://www.npmjs.com/package/linkpilot",
      "https://www.npmjs.com/package/@uselinkpilot/sdk",
      "https://www.npmjs.com/package/@uselinkpilot/mcp",
      "https://chromewebstore.google.com/detail/linkpilot-short-links-and/mnmppadihpcncicldpkmgknhnjkondad",
      "https://addons.mozilla.org/en-US/firefox/addon/uselinkpilot/"
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "WebSite",
    "name": "LinkPilot",
    "url": "https://uselinkpilot.com",
    "potentialAction": {
      "@type": "SearchAction",
      "target": "https://uselinkpilot.com/blog?q={search_term_string}",
      "query-input": "required name=search_term_string"
    }
  }
]
```