---
title: "Linkkiskannerit ja kertakäyttöiset salaisuudet | LinkPilot-blogi"
url: https://uselinkpilot.com/fi/blog/link-scanners-and-one-time-secrets
description: "GET-pyynnöstä tuhoutuva kertakäyttölinkki kuolee Slackin tai sähköpostiyhdyskäytävän esikatseluun. Palauta GET:lle metatiedot, tuhoa vasta näytettäessä."
lang: fi
---

Tietoturva (https://uselinkpilot.com/fi/blog/category/security)

# Linkkiskannerit ja kertakäyttöiset salaisuudet

GET-pyynnöstä tuhoutuva kertakäyttölinkki kuolee Slackin tai sähköpostiyhdyskäytävän esikatseluun. Palauta GET:lle metatiedot, tuhoa vasta näytettäessä.

W. Miller (https://uselinkpilot.com/fi/author/w-miller)26. toukokuuta 2026 · Päivitetty 22. lokakuuta 2026 · Tietoa LinkPilotista (https://uselinkpilot.com/fi/about)

Kertakäyttölinkki, joka tuhoutuu pelkästä `GET`-pyynnöstä, kuolee heti, kun Slack, Teams tai sähköpostiyhdyskäytävä hakee sen esikatselua varten. Korjaus on palauttaa `GET`-pyyntöön vain metatiedot ja tuhota salaisuus vasta erillisellä `POST`-pyynnöllä, kun vastaanottaja valitsee näyttämisen. Varmistuksena toimii salalause, joka lähetetään toista kanavaa pitkin. Tämä kirjoitus kertoo, mitkä järjestelmät hakevat linkkejä kysymättä ja miten suunnittelu kestää ne kaikki.

LinkPilotin kertakäyttöisen salaisen linkin luontityökalu (https://uselinkpilot.com/fi/tools/free-secret-link-generator) on rakennettu näin: esikatseluhaku saa vain sivun rungon. Salaisuus haetaan ja avaus lasketaan vasta, kun selain suorittaa sivun.

## Tavallinen virhetilanne

Useimmat chat- ja sähköpostiohjelmat yrittävät näyttää esikatselun, kun ne huomaavat URL-osoitteen. Kulku on tällainen:

1. Käyttäjä liittää salaisen linkin Slackiin.
2. Slackin esikatselutoiminto (unfurler) hakee URL-osoitteen (lähettää `GET`-pyynnön; Slack dokumentoi toiminnan kohdassa link unfurling (https://api.slack.com/reference/messaging/link-unfurling)).
3. Näyttämisen käsittelijäsi pitää pyyntöä ihmisen avauksena, tuhoaa salaisuuden ja palauttaa sisällön.
4. Slack saa tuhotun sisällön (tai yleisen sivun) ja näyttää sen.
5. Ihminen napsauttaa linkkiä, näkee ilmoituksen ”already viewed” ja pyytää lähettäjältä uuden.

Esikatselutoiminnolla ei ollut pahoja aikeita. Käsittelijäsi sekoitti tapahtuman ”joku haki URL-osoitteen” tapahtumaan ”vastaanottaja luki salaisuuden”. Ne ovat eri tapahtumia, ja koko suunnitteluongelma on pitää ne erillään.

Vaiheessa 3 piilee vielä pahempi versio: jos esikatselutoiminnon `GET`-pyyntö sai varsinaisen sisällön, salaisuus on nyt kolmannen osapuolen esikatselujärjestelmässä. Parhaassa tapauksessa se hävitettiin, kun esikatselu oli valmis. Sitä et kuitenkaan voi mitenkään varmistaa, eikä mikään lokitapahtuma kerro, että näin kävi.

## Kuka hakee linkin ennen kuin vastaanottaja avaa sen?

Chat-palvelujen esikatselutoiminnot, sähköpostin tietoturvayhdyskäytävät, päätelaitteiden suojausohjelmat, yritysten välityspalvelimet ja esikatselulaajennukset, yleensä useampi kuin yksi niistä. ”Slack näyttää esikatseluja” vähättelee ongelmaa. Nykyaikaisella työpaikalla liitetyn URL-osoitteen hakee tyypillisesti usea järjestelmä ennen kuin yksikään ihminen napsauttaa sitä:

| Hakija | Milloin se hakee | Tunnistettavissa? |
| --- | --- | --- |
| Chat-palvelujen esikatselutoiminnot (Slack, Teams, iMessage, WhatsApp, LinkedIn) | Heti, kun viesti lähetetään | Yleensä: omat user agent -tunnisteet, kuten `Slackbot-LinkExpanding` |
| Sähköpostin tietoturvayhdyskäytävät (Mimecast, Proofpoint, Microsoft Defender) | Toimitettaessa ja usein uudelleen napsautushetkellä | Usein ei: monet esiintyvät oikean selaimen user agent -tunnisteella |
| Päätelaitteiden suojaus ja virustorjunta | Kun URL-osoite saapuu vastaanottajan koneelle | Harvoin |
| Yritysten välityspalvelimet | Napsautushetkellä, ennen kuin käyttäjän pyyntö välitetään eteenpäin | Harvoin |
| Linkkien esikatselun selainlaajennukset | Kun osoitin viedään linkin päälle tai sivu latautuu | Ei: ne käyttävät käyttäjän omaa selainistuntoa |

Taulukon tiedot palveluntarjoajien toiminnasta muuttuvat jatkuvasti, joten lue yksittäisiä yhdyskäytäviä koskevat tiedot näin: ”julkaistu heinäkuussa 2026, tarkista ajantasaisista ohjeista”. Yhteinen piirre ei kuitenkaan muutu: jokainen näistä järjestelmistä lähettää pelkän `GET`-pyynnön, koska se on ainoa turvallinen ja yleispätevä tapa katsoa URL-osoitetta, jota ei itse hallitse.

## Miten esikatselu estetään tuhoamasta kertakäyttölinkkiä?

Palauta `GET`-pyyntöön metatiedot ja tuhoa salaisuus vain erillisellä `POST`-pyynnöllä. HTTP:n semantiikka tukee tätä valmiiksi: RFC 9110, kohta 9.2.1 (https://www.rfc-editor.org/rfc/rfc9110#section-9.2.1) määrittelee `GET`-metodin turvalliseksi ja idempotentiksi, eli kuka tahansa saa lähettää sen vapaasti, koska sen ei kuulu muuttaa mitään. `POST` on toimintoa varten. Toteuta siis näyttäminen `POST`-toimintona näkyvän painikkeen takana:

```http
GET  /s/abc123   →  HTML page: "Click to reveal this secret"
POST /s/abc123   →  burns the secret, returns the payload
```

Nyt Slackin `GET`-pyyntö saa neutraalin metatietosivun. Salaisuus tuhoutuu vasta, kun ihminen napsauttaa painiketta. HTTP-semantiikkaa noudattava skanneri ei koske sisältöön lainkaan. Lähes kaikki noudattavat sitä, koska sivuvaikutuksia aiheuttavien `POST`-pyyntöjen lähettäminen mielivaltaisiin URL-osoitteisiin rikkoisi puolet verkosta.

## Esimerkki vaihe vaiheelta

Seurataan yhtä linkkiä alusta loppuun. Luot salaisuuden, jossa on asetus ”Tuhoa lukemisen jälkeen” ja salalause, ja liität URL-osoitteen Slackin yksityisviestiin ja sähköpostiin.

1. **Slackin esikatselutoiminto** lähettää pyynnön `GET /s/abc123`. Vastaus: pieni metatietosivu, jossa tila on ”active” (käytössä) ja salalause vaaditaan. Avausta ei kirjata. Salaisuus on tallessa.
2. **Vastaanottajan sähköpostiyhdyskäytävä** kirjoittaa sähköpostissa olevan URL-osoitteen uudelleen ja hakee sen toimitushetkellä mainetarkistusta varten. Sama `GET`, samat metatiedot. Salaisuus on yhä tallessa.
3. **Vastaanottaja napsauttaa sähköpostissa olevaa linkkiä.** Yhdyskäytävän napsautushetken skanneri hakee osoitteen vielä kerran (`GET`) ja ohjaa sitten selaimen eteenpäin.
4. **Selain lataa näyttämissivun**, jälleen `GET`-pyynnöllä. Sivulla on näyttämispainike ja salalausekenttä. Avausta ei vieläkään kirjata.
5. **Vastaanottaja kirjoittaa salalauseen ja napsauttaa näyttämispainiketta.** Selain lähettää pyynnön `POST /s/abc123`. Avaus kirjataan, sisältö palautetaan ja salaisuus tuhoutuu.
6. **Jokainen, joka hakee URL-osoitteen tämän jälkeen**, saa sisällön sijaan selvän vastauksen ”already viewed and destroyed”.

Viisi hakua, yksi näyttäminen. Suhde on yritysympäristössä tavallinen. Ratkaisu, joka ei kestä sitä, pettää ensimmäisenä päivänä, ja lähettäjä liittää salasanan sen sijaan suoraan chattiin.

## Puolustus kerroksittain

### GET- ja POST-pyyntöjen erottelu

Hoitaa jokaisen sääntöjä noudattavan esikatselutoiminnon ja skannerin, eli valtaosan automaattisesta liikenteestä. Tämä on perusta, ja kaikki alla oleva on lisäsuojaa.

### Salalause

Kattaa sen, mitä erottelu ei kata: JavaScriptiä suorittavat ja sivun kanssa toimivat hiekkalaatikot sekä ihmisten vahingossa tekemät napsautukset ja edelleen lähetetyt sähköpostit. Haittaohjelmia laukaiseva hiekkalaatikko voi napsauttaa näyttämispainiketta, mutta se ei voi antaa salalausetta, joka on kulkenut toista kanavaa pitkin. Lähetä linkki sähköpostilla ja salalause Slackin yksityisviestillä tai tekstiviestillä.

### Bottien suodatus user agent -tunnisteen perusteella

Pudota tunnetut esikatselutoiminnot (`Slackbot`, `LinkedInBot`, `Twitterbot`) pois ennen kuin ne pääsevät näyttämislogiikkaan. Se kannattaa tehdä lisävarmistuksena, mutta yksinään se ei koskaan riitä: tietoturvaskannerit esiintyvät rutiininomaisesti oikean selaimen user agent -tunnisteella juuri siksi, etteivät haitalliset sivut voi piiloutua analyysiltä.

### Lyhyt voimassaoloaika

Rajaa aikaa, jona vahinkoa voi syntyä. Kun linkki on voimassa vain viisitoista minuuttia, skannereille, lokitiedostoihin ja chat-historiaan jää URL-osoite, joka ei enää johda mihinkään.

### Cache-Control: no-store

Aseta se jokaiseen näyttämisvastaukseen, jotta mikään välissä oleva järjestelmä, kuten yrityksen välityspalvelin, CDN tai selaimen välimuisti, ei säilytä kopiota sisällöstä sen yhden oikean lukukerran jälkeen.

## Erityisesti sähköpostin tietoturvayhdyskäytävät

Yritysten yhdyskäytävät ansaitsevat oman osionsa, koska ne hakevat linkin kahdesti. Tämän luokan tuotteet (Microsoft Defender Safe Links (https://learn.microsoft.com/en-us/defender-office-365/safe-links-about) on dokumentoitu esimerkki) kirjoittavat saapuvan postin jokaisen URL-osoitteen uudelleen niin, että se kulkee niiden oman skannausverkkotunnuksen kautta. URL-osoite haetaan tyypillisesti kerran toimitushetkellä mainetarkistusta varten ja uudelleen napsautushetkellä, ennen kuin ihminen ohjataan varsinaiseen kohteeseen.

Jos kumpi tahansa haku tuhoaisi salaisuuden, vastaanottaja näkisi _aina_ kuolleen linkin. Käyttäjille vika näyttää satunnaiselta, mutta se on täysin ennustettava. `GET`/`POST`-erottelu kestää molemmat haut ilman lisätyötä, koska molemmat ovat pelkkiä `GET`-pyyntöjä. Napsautushetken uudelleenohjaus vie ihmisen sitten näyttämissivulle, jossa `POST` tapahtuu.

## Reunatapaukset, jotka yhä aiheuttavat ongelmia

- **JavaScriptiä suorittavat hiekkalaatikot.** Jotkin haittaohjelmien laukaisuympäristöt piirtävät sivun ja toimivat sen kanssa. Aggressiivinen hiekkalaatikko voi periaatteessa napsauttaa painiketta, jonka takana on `POST` _ilman salalausetta_. Salalause on varmistus tätä vastaan.
- **Linkki ja salalause samassa kanavassa.** Jos molemmat kulkevat samassa sähköpostissa, kaikki yllä olevat suojaukset kutistuvat toiveeksi, ettei kukaan lue sitä sähköpostia. Erota kanavat aina.
- **Edelleenlähetys.** Jokainen edelleenlähetys uuteen chat- tai sähköpostijärjestelmään käynnistää uuden kierroksen esikatseluhakuja. Erottelun ansiosta se on vaaratonta, mutta jokainen välivaihe on uusi joukko lokeja, joissa URL-osoite on tallessa. Sekin puoltaa lyhyttä voimassaoloaikaa.
- **Samanaikaiset näyttämiset.** Jos kaksi ihmistä napsauttaa näyttämispainiketta yhtä aikaa, lukemisen ja tuhoamisen on tapahduttava yhtenä vaiheena, jota ei voi jakaa osiin: tasan yksi pyyntö voittaa, ja toinen saa vastauksen ”already viewed”. Toteutus, jossa lukeminen ja tuhoaminen ovat erillisiä vaiheita, voi palauttaa sisällön kahdesti.

## Testaa oma työkalusi

Ennen kuin annat oikeita kirjautumistietoja minkään salaisuuksien jakopalvelun haltuun, tee tämä kahden minuutin tarkistus:

1. Luo kertakäyttöinen testisalaisuus, jossa on asetus ”Tuhoa lukemisen jälkeen” päällä.
2. Hae se päätteestä. Juuri näin esikatselutoiminto toimii: `curl -s -o /dev/null -w "%{http_code}" "<url>"`
3. Avaa linkki selaimessa. Jos näet ilmoituksen ”already viewed”, työkalu tuhoaa salaisuuden `GET`-pyynnöstä, eikä linkkiä ole turvallista liittää chattiin tai sähköpostiin.
4. Jos salaisuus säilyi, näytä se kunnolla selaimessa ja aja `curl` uudelleen. Nyt pitäisi tulla selvä vastaus siitä, että salaisuus on poissa tai tuhottu, eikä itse sisältö.

## Näin LinkPilot toteuttaa tämän

Tiedoksi: LinkPilotin Secret Links -toiminto käyttää juuri tätä mallia. `GET`-pyyntö näyttämisen päätepisteeseen palauttaa vain metatiedot (tilan ja tiedon siitä, vaaditaanko salalause). Avaus kirjataan vain erillisellä `POST`-pyynnöllä. Salalauseet tiivistetään SHA-256:lla jo selaimessa, ja yrityksiä rajoitetaan viiteen minuutissa IP-osoitetta ja salaisuutta kohden. Jokaisessa näyttämisvastauksessa on `Cache-Control: no-store`, tuhoutuneet ja vanhentuneet salaisuudet palauttavat HTTP-tilakoodin 410 ja tallennettu sisältö on ylikirjoitettu, ja tarkastusloki tallentaa jokaisen tapahtuman tiivistetyllä IP-osoitteella, jonka suola vaihtuu päivittäin. Alkuperäistä IP-osoitetta ei tallenneta koskaan. Kaikki yksityiskohdat ovat tietoturva-arkkitehtuuria (https://uselinkpilot.com/fi/security-architecture) käsittelevällä sivulla.

Kokeile ilmaiseksi, ei rekisteröitymistä

### Itsetuhoutuva viesti

Lähetä muistiinpano, joka katoaa, kun se on luettu kerran.

Avaa työkalu (https://uselinkpilot.com/fi/tools/burn-after-read-secret)

## Tämän mallin rajat

Rehellisesti sanottuna: mikään yllä olevista ei suojaa salaisuutta _sen jälkeen_, kun se on näytetty oikealle vastaanottajalle. Vastaanottaja voi kopioida sisällön, ottaa siitä kuvakaappauksen tai lähettää sen eteenpäin. Malli ei auta, jos salalause kulkee linkin mukana. Se ei myöskään estä ihmistä, jolle linkki lähetettiin vahingossa, avaamasta sitä ennen oikeaa vastaanottajaa. Sitä varten on tarkastusloki: näet odottamattoman avauksen ja vaihdat kirjautumistiedot.

## Lue myös

- Näin kertakäyttöiset salaiset linkit toimivat: https://uselinkpilot.com/fi/blog/how-one-time-secret-links-work
- Miksi URL-osoitteet vuotavat arkaluonteisia tietoja: https://uselinkpilot.com/fi/blog/why-urls-leak-sensitive-information
- LinkPilotin tietoturva-arkkitehtuuri: https://uselinkpilot.com/fi/security-architecture

## Lähteet

- IETF, RFC 9110: HTTP Semantics, section 9.2.1 Safe Methods (https://www.rfc-editor.org/rfc/rfc9110#section-9.2.1).
- Slack API, Unfurling links in messages (https://api.slack.com/reference/messaging/link-unfurling).
- Microsoft Learn, Safe Links in Microsoft Defender for Office 365 (https://learn.microsoft.com/en-us/defender-office-365/safe-links-about).

## Työkalut tähän artikkeliin

Itsetuhoutuva viesti

Lähetä muistiinpano, joka katoaa, kun se on luettu kerran.
https://uselinkpilot.com/fi/tools/burn-after-read-secret

Kertakäyttöisen salaisen linkin luontityökalu

Jaa salasana tai muistiinpano linkillä, joka avautuu vain kerran.
https://uselinkpilot.com/fi/tools/free-secret-link-generator

Vanhenevan linkin luontityökalu

Luo linkkejä, jotka lakkaavat toimimasta asettamanasi aikana.
https://uselinkpilot.com/fi/tools/temporary-link

## Usein kysytyt kysymykset

### Mitkä ohjelmat ovat pahimpia?

### Voiko esikatselutoiminnot tunnistaa user agent -tunnisteesta?

### Korjaako GET- ja POST-pyyntöjen erottelu ongelman kokonaan?

### Napsauttavatko sähköpostiskannerit koskaan sivun painikkeita?

### Miten testaan, kestääkö salaisuuksien jakotyökalu esikatselun?

## LinkPilot lähettää salaisen linkin, joka katoaa, kun se on avattu.

Salataan selaimessasi, näytetään kerran ja tuhotaan sitten. Tiliä ei tarvita.

Luo salainen linkki (https://uselinkpilot.com/fi/tools/free-secret-link-generator)

## Lue seuraavaksi

Tietoturva

### API-avainten jakaminen turvallisesti

Älä liitä API-avainta chattiin tai sähköpostiin. Lähetä selaimessasi salattu kertakäyttölinkki, joka tuhoutuu avattaessa, ja vaihda jo liitetyt avaimet.
https://uselinkpilot.com/fi/blog/how-to-share-api-keys-securely

Tietoturva

### Näin kertakäyttöiset salaiset linkit toimivat

Kertakäyttölinkki näyttää sisältönsä kerran. Selain salaa sen, palvelin tallentaa vain salatekstin ja ensimmäinen avaus tuhoaa tallennetun kopion.
https://uselinkpilot.com/fi/blog/how-one-time-secret-links-work

Tietoturva

### Vanhenevat linkit: salaisuus tuhotaan, ohjaus ei vain katkea

Vanheneva salainen linkki tuhoaa salaisuuden määräajan päättyessä, kuollut lyhytlinkki vain lakkaa ohjaamasta. Ajan valinta ja erikoistapaukset.
https://uselinkpilot.com/fi/blog/expiring-links-security

## Structured data

```json
[
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "name": "Etusivu",
        "item": "https://uselinkpilot.com/fi"
      },
      {
        "@type": "ListItem",
        "position": 2,
        "name": "Blogi",
        "item": "https://uselinkpilot.com/fi/blog"
      },
      {
        "@type": "ListItem",
        "position": 3,
        "name": "Linkkiskannerit ja kertakäyttöiset salaisuudet",
        "item": "https://uselinkpilot.com/fi/blog/link-scanners-and-one-time-secrets"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "@id": "https://uselinkpilot.com/fi/blog/link-scanners-and-one-time-secrets#article",
    "headline": "Linkkiskannerit ja kertakäyttöiset salaisuudet",
    "description": "GET-pyynnöstä tuhoutuva kertakäyttölinkki kuolee Slackin tai sähköpostiyhdyskäytävän esikatseluun. Palauta GET:lle metatiedot, tuhoa vasta näytettäessä.",
    "inLanguage": "fi",
    "datePublished": "2026-05-26",
    "dateModified": "2026-10-22",
    "image": "https://uselinkpilot.com/logo-512.png",
    "author": {
      "@type": "Person",
      "@id": "https://uselinkpilot.com/author/w-miller#person",
      "name": "W. Miller",
      "url": "https://uselinkpilot.com/fi/author/w-miller",
      "worksFor": {
        "@type": "Organization",
        "name": "LinkPilot",
        "url": "https://uselinkpilot.com"
      }
    },
    "publisher": {
      "@type": "Organization",
      "name": "LinkPilot",
      "url": "https://uselinkpilot.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://uselinkpilot.com/logo-512.png",
        "width": 512,
        "height": 512
      }
    },
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://uselinkpilot.com/fi/blog/link-scanners-and-one-time-secrets"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Mitkä ohjelmat ovat pahimpia?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Kaikki, jotka näyttävät URL-osoitteista esikatselun: Slack, Microsoft Teams, iMessage, LinkedInin yksityisviestit, WhatsAppin verkkoversion esikatselut ja useimmat sähköpostin tietoturvayhdyskäytävät (Mimecast, Proofpoint, Microsoft Defender). Ne kaikki hakevat URL-osoitteen heti, kun viesti saapuu."
        }
      },
      {
        "@type": "Question",
        "name": "Voiko esikatselutoiminnot tunnistaa user agent -tunnisteesta?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Osittain. Sääntöjä noudattavat botit lähettävät tunnistettavan user agent -tunnisteen (Slackbot-LinkExpanding, LinkedInBot, Twitterbot). Tietoturvaskannerit esiintyvät usein oikeina selaimina, joten pelkkä user agent -suodatus ei riitä."
        }
      },
      {
        "@type": "Question",
        "name": "Korjaako GET- ja POST-pyyntöjen erottelu ongelman kokonaan?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Esikatselutoimintojen osalta kyllä, koska ne lähettävät vain GET-pyyntöjä. Se ei auta, jos ihminen napsauttaa vahingossa ja tuhoaa salaisuuden. Siihen tarvitaan lisäksi salalause."
        }
      },
      {
        "@type": "Question",
        "name": "Napsauttavatko sähköpostiskannerit koskaan sivun painikkeita?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Jotkin haittaohjelmia laukaisevat hiekkalaatikot suorittavat JavaScriptiä ja voivat toimia sivun kanssa, joten pelkkä näyttämispainike ei ole tae. Siksi salalause on tärkeä: hiekkalaatikko ei voi antaa salalausetta, joka on kulkenut toista kanavaa pitkin."
        }
      },
      {
        "@type": "Question",
        "name": "Miten testaan, kestääkö salaisuuksien jakotyökalu esikatselun?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Luo kertakäyttöinen testisalaisuus, hae sen URL-osoite kerran curlilla (pelkkä GET-pyyntö, juuri sitä esikatselutoiminto tekee) ja avaa se sitten selaimessa. Jos selain näyttää ilmoituksen ”already viewed”, työkalu tuhoaa salaisuuden GET-pyynnöstä, eikä linkkiä ole turvallista liittää chattiin tai sähköpostiin."
        }
      }
    ],
    "inLanguage": "fi"
  },
  {
    "@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"
    }
  }
]
```