> ## Documentation Index
> Fetch the complete documentation index at: https://www.ayrshare.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Eine Link Session erstellen

> Erstellen Sie eine Social-Linking-URL für ein User Profile, ohne einen Private Key zu senden.

export const PlansAvailable = ({plans = [], maxPackRequired}) => {
  let displayPlans = plans;
  if (plans && plans.length === 1) {
    const lowerCasePlan = plans[0].toLowerCase();
    if (lowerCasePlan === "business") {
      displayPlans = ["Launch", "Business", "Enterprise"];
    } else if (lowerCasePlan === "premium") {
      displayPlans = ["Premium", "Launch", "Business", "Enterprise"];
    }
  }
  return <Note>
Available on {displayPlans.length === 1 ? "the " : ""}
{displayPlans.join(", ").replace(/\b\w/g, l => l.toUpperCase())}{" "}
{displayPlans.length > 1 ? "plans" : "plan"}.

{maxPackRequired && <span onClick={() => window.open('https://www.ayrshare.com/docs/additional/maxpack', '_self')} className="flex items-center mt-2 cursor-pointer">
 <span className="px-1.5 py-0.5 rounded text-sm" style={{
    backgroundColor: '#C264B6',
    color: 'white',
    fontSize: '12px'
  }}>
   Max Pack required
 </span>
</span>}
</Note>;
};

export const HeaderAPI = ({noProfileKey, profileKeyRequired}) => <>
    <ParamField header="Authorization" type="string" required>
      <a href="/docs/apis/overview#authorization">API Key</a> of the Primary Profile.
      <br />
      <br />
      Format: <code>Authorization: Bearer API_KEY</code>
    </ParamField>
    {!noProfileKey && (profileKeyRequired ? <ParamField header="Profile-Key" type="string" required>
          <a href="/docs/apis/overview#profile-key-format">Profile Key</a> of a User Profile.
          <br />
          <br />
          Format: <code>Profile-Key: PROFILE_KEY</code>
        </ParamField> : <ParamField header="Profile-Key" type="string">
          <a href="/docs/apis/overview#profile-key-format">Profile Key</a> of a User Profile.
          <br />
          <br />
          Format: <code>Profile-Key: PROFILE_KEY</code>
        </ParamField>)}
  </>;

<PlansAvailable plans={["business"]} maxPackRequired={false} />

Erstellen Sie eine Social-Linking-URL für ein User Profile. Senden Sie die zurückgegebene
`url` an Ihren Nutzer; er öffnet sie, um seine Social-Media-Konten zu verbinden.

Dies ist der empfohlene Weg, eine Linking-URL zu erstellen. Es werden nur Ihr API Key und
ein `Profile-Key` benötigt — es gibt keinen Private Key zu senden und nichts zu signieren.
Anders als eine bisher erstellte Linking-URL wird eine Link Session gespeichert, sodass
Sie prüfen können, ob sie verwendet wurde, und sie widerrufen können, bevor sie abläuft.

Die zurückgegebene `url` meldet Ihren Nutzer in seinem Profil an — behandeln Sie sie daher
wie ein Passwort und senden Sie jede nur an einen einzelnen Nutzer. Siehe
[Die Linking-URL versenden](/docs/apis/profiles/social-linking-overview#sending-the-linking-url).

<Note>
  Die URL ist standardmäßig **5 Minuten** gültig. Verwenden Sie `expiresIn`, um ein
  anderes Zeitfenster festzulegen, bis zu 2880 Minuten (48 Stunden).
</Note>

<Info>
  [Linking-URL erzeugen](/docs/apis/profiles/generate-jwt) führt denselben Vorgang aus und
  funktioniert unverändert weiter. Er akzeptiert die Legacy-Parameter `privateKey`,
  `base64` und `verify` und ignoriert sie. `domain` wird auf keinem der beiden Endpunkte
  ignoriert — es bleibt optional und wird weiterhin validiert. Neue Integrationen sollten
  diesen Endpunkt verwenden.

  Ein Unterschied in der Antwort: `generateJWT` gibt aus Gründen der Abwärtskompatibilität
  ein `token` auf oberster Ebene zurück, und dieser Endpunkt gibt keines **neben** einer
  `url` zurück — das Token einer `url` steckt in ihr. Wenn Sie migrieren und Ihr Code
  `token` liest, lesen Sie stattdessen `url`. (Der [Connect Mode](#connect-mode) für das
  eingebettete Widget ist die eine Form, die ein reines `token` zurückgibt, weil sie keine
  URL zurückgibt, in der das Token stecken könnte.)
</Info>

## Header-Parameter

<HeaderAPI profileKeyRequired={true} />

<Note>
  Der `Profile-Key` ist auf diesem Endpunkt ein Header — es gibt keinen Body-Parameter
  `profileKey`. Fehlt er, erhalten Sie `code: 188`, dessen Meldung `privateKey`,
  `profileKey` und andere Legacy-Feldnamen auflistet, weil sie mit
  [Linking-URL erzeugen](/docs/apis/profiles/generate-jwt) geteilt wird. Lesen Sie sie als
  „der Profile-Key-Header fehlt oder ist falsch“; keiner der anderen darin genannten Namen
  ist ein Parameter dieses Endpunkts.
</Note>

<ParamField header="X-Twitter-OAuth1-Api-Key" type="string">
  Ihr X-API-Key (Consumer Key) aus dem X Developer Portal. Wenn angegeben, verwendet die
  Linking-URL Ihre eigene X Developer App für die OAuth-Verknüpfung.
</ParamField>

<ParamField header="X-Twitter-OAuth1-Api-Secret" type="string">
  Ihr X-API-Secret (Consumer Secret) aus dem X Developer Portal. Erforderlich, wenn
  `X-Twitter-OAuth1-Api-Key` angegeben ist.
</ParamField>

## Body-Parameter

<ParamField body="mode" type="string" default="grid">
  Welche Verknüpfungsoberfläche diese Session bedient.

  * `grid` — die gehostete Verknüpfungsseite, die jedes von Ihnen erlaubte Netzwerk zeigt. Das ist
    der Standard, eine Anfrage ohne `mode` erstellt also eine solche Session.
  * `connect` — ein Netzwerk nach dem anderen, geöffnet aus Ihrem eigenen Dashboard. Siehe
    [Connect Mode](#connect-mode) unten und [Direct Mode](/docs/multiple-users/connect-direct-mode).

  Wird nie abgeleitet: Das Übergeben von `origin` oder `network` versetzt Sie nicht in den Connect
  Mode, eine Grid-Session kann also nicht versehentlich zu einer zugangsbeschränkten werden. Jeder
  andere Wert gibt `code: 188` zurück, wobei `details` die beiden gültigen benennt.
</ParamField>

<ParamField body="expiresIn" type="number" default={5}>
  Gültigkeitsdauer des Links in Minuten. Bereich: 1 bis 2880 Minuten.

  Erfordert das Max Pack.

  Weitere Informationen finden Sie unter [Link-Gültigkeit](/docs/apis/profiles/social-linking-overview#jwt-expires-in).
</ParamField>

<ParamField body="logout" type="boolean" default={false}>
  Automatisches Abmelden der aktuellen Sitzung. Wird in der Produktion nicht empfohlen,
  da dies die Performance beeinflusst.

  Siehe [Automatische Abmeldung einer Profilsitzung](/docs/multiple-users/api-integration-business#automatic-logout-of-a-profile-session).
</ParamField>

<ParamField body="redirect" type="string">
  Eine URL, zu der weitergeleitet wird, wenn die Schaltfläche „Done“ (Fertig) oder das
  Logo angeklickt wird. Fügen Sie den Query-Parameter `origin=true` hinzu, um das
  Öffnerfenster weiterzuleiten.
</ParamField>

<ParamField body="allowedSocial" type="array">
  Die auf der Verknüpfungsseite anzuzeigenden sozialen Netzwerke. Überschreibt die auf der
  Seite [Soziale Netzwerke](/docs/multiple-users/manage-user-profiles#set-social-networks-access)
  konfigurierten Netzwerke.

  ```json Only display Facebook, X/Twitter, LinkedIn, and TikTok theme={"system"}
  {
    "allowedSocial": ["facebook", "twitter", "linkedin", "tiktok"]
  }
  ```
</ParamField>

<ParamField body="network" type="string">
  Nur Connect Mode. Das einzelne soziale Netzwerk, das diese Session verbindet — genau das macht
  sie zu einer **Direct-Mode**-Session. Lassen Sie es weg für eine Session, die Ihr eigenes
  Dashboard über mehrere Netzwerke hinweg bedient.

  Eines von `bluesky`, `facebook`, `gmb`, `instagram`, `instagramApi`, `linkedin`, `pinterest`,
  `reddit`, `snapchat`, `telegram`, `threads`, `tiktok`, `twitter`, `whatsapp`, `x`, `youtube`.
  Alles andere gibt `code: 508` zurück — einschließlich `fbg`, das hier kein Verknüpfungsziel ist.

  Kann nicht mit `allowedSocial` kombiniert werden (`code: 507`): Eine Session für ein einzelnes
  Netzwerk ist bereits ihre eigene Allowlist. Ein Netzwerk, das Ihr Account nicht aktiviert hat,
  gibt `code: 509` zurück — bewusst eine andere Antwort als 508, weil Sie das auf Ihrer Seite
  [Soziale Netzwerke](/docs/multiple-users/manage-user-profiles#set-social-networks-access) selbst
  beheben können.

  Im Grid Mode wird es ignoriert.
</ParamField>

<ParamField body="instagramLinkMethod" type="string">
  Überschreibt, welcher Instagram-Verknüpfungsablauf für diesen Link verwendet wird.
  Gültige Werte:

  * `instagram`: Direktes Instagram Login, keine Facebook-Seite erforderlich.
  * `facebook`: Instagram über eine verbundene Facebook-Seite verknüpfen.

  Wenn weggelassen, verwendet die Verknüpfungsseite Ihre kontoweite
  [Instagram-Login-Einstellung](/docs/multiple-users/manage-user-profiles#instagram-login).
</ParamField>

<ParamField body="origin" type="string">
  Die exakte Origin der Seite, die das Verknüpfungsfenster geöffnet hat, damit ihr
  mitgeteilt werden kann, wann die Verknüpfung abgeschlossen ist.

  Wenn gesetzt, sendet die Verknüpfungsseite mit `window.postMessage` Events an diese
  Origin, während Ihr Nutzer die Konten verbindet, und Ihre Seite kann ohne Polling
  reagieren. Events werden ausschließlich an genau diesen Wert gesendet — er muss also
  Zeichen für Zeichen der Origin Ihrer Seite entsprechen, einschließlich Schema und
  eventuellem Port.

  Drei Formen werden akzeptiert: eine `https`-Origin (`https://app.example.com`),
  `http://localhost:3000` für die lokale Entwicklung und ein natives Custom Scheme
  (`myapp://connected`). Alles andere — eine reine `http://`-Origin außer localhost oder
  etwas, das gar keine Origin ist — wird auf den Links, die dieser Endpunkt erstellt,
  ignoriert: Der Link funktioniert weiterhin, er sendet nur keine Events. Der Parameter
  ist optional, das Weglassen ist also ebenfalls kein Fehler.

  Von den dreien empfangen nur die ersten beiden Events. Ein Custom Scheme ist ein
  Rücksprungziel für eine mobile App und **kann keine empfangen**, weil es kein
  Browserfenster gibt, an das gesendet werden könnte; native Apps pollen stattdessen
  [Eine Link Session abrufen](/docs/apis/profiles/get-link-session).

  Siehe [Link-Completion-Events](/docs/multiple-users/link-completion-events).

  **Im Connect Mode ist `origin` erforderlich, und es wird geprüft.** Die Nachsicht oben ist
  Grid-Mode-Verhalten. Mit `mode: "connect"` gibt das Weglassen `code: 505` zurück, und ein Wert,
  der keiner der drei akzeptierten Formen entspricht, gibt `code: 506` zurück, dessen `details`
  die gesendete Form wiederholen.
</ParamField>

<ParamField body="domain" type="string">
  Optional. Ihre Linking-Domain, wenn Ihr Account mehr als eine hat. Wird die Angabe
  weggelassen, wird die eigene Domain Ihres Accounts verwendet. Eine nicht für Ihren
  Account registrierte Domain wird abgelehnt.
</ParamField>

<ParamField body="email" type="object">
  Senden Sie eine Connect-Accounts-E-Mail mit dem Link, damit Ihr Nutzer seine
  Verknüpfungsseite direkt erreichen kann. Erfordert eine `to`-Adresse.

  Erfordert das Max Pack. Die Antwort meldet das Ergebnis in `emailSent`, und ein
  Sendefehler gibt `code: 333` statt einer Erfolgsantwort zurück.

  Siehe [Connect-Accounts-E-Mail](/docs/apis/profiles/social-linking-overview#connect-accounts-email).
</ParamField>

<h2 id="connect-mode">
  Connect Mode
</h2>

`mode: "connect"` erstellt eine Session für eine Verknüpfungsoberfläche, die Sie selbst hosten,
statt für die gehostete Verknüpfungsseite. Welche der beiden Connect-Formen Sie erhalten, hängt von
einer Sache ab — ob Sie `network` übergeben:

| Sie senden                           | Sie erhalten zurück                                                     | Was Sie damit tun                                                                          |
| ------------------------------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| `mode: "connect"` und ein `network`  | eine `url`, die auf eine Connect-Seite für ein einzelnes Netzwerk zeigt | öffnen Sie sie in einem Popup — das ist [Direct Mode](/docs/multiple-users/connect-direct-mode) |
| `mode: "connect"` und kein `network` | ein `token` und gar keine URL                                           | reichen Sie es an Ihr eigenes Frontend weiter                                              |

<Note>
  **Die Antwort trägt das Geheimnis genau einmal.** Eine Antwort hat entweder eine `url` oder ein
  `token`, nie beides und nie zwei URLs. Das Token einer Direct-Mode-Session steckt in der `url`,
  genau wie im Grid Mode; eine Session ohne URL, die es tragen könnte, gibt stattdessen das reine
  `token` zurück. Alles andere ist in allen drei Modi gleich: `sessionId`, `expiresAt`,
  `emailSent` und `title`, wenn das User Profile einen hat.
</Note>

### Was Connect Mode erfordert

Keines von beiden ist ein eigenes Body-Feld — das erste ist eine Account-Berechtigung und das
zweite der [`origin`](#body-parameters)-Parameter oben, den der Connect Mode verpflichtend macht.

**Der [Max Pack](/docs/additional/maxpack).** Ohne ihn gibt der Aufruf `code: 504` zurück, geprüft vor
den Connect-Mode-Parametern — das Korrigieren von `origin` oder `network` ändert die Antwort also
nicht. Kontaktieren Sie den Support, wenn Sie den Connect Mode auf einem Account ohne Max Pack
aktivieren müssen.

**Ein `origin`, auf jeder Session.** Es gibt keine Allowlist und keinen Registrierungsschritt —
Sie senden ihn bei jedem Aufruf, und er wird auf der Session gespeichert, eine neue Umgebung
braucht also keine Einrichtung auf unserer Seite. Drei Formen werden akzeptiert:

* eine `https`-Origin — `https://app.example.com`
* ein natives Custom Scheme — `myapp://connected`
* `http://localhost` oder `http://localhost:3000`, für die lokale Entwicklung

Nur die Origin: kein Pfad, keine Query, kein Fragment und keine Zugangsdaten darin. Das Weglassen
gibt `code: 505` zurück, und alles, was keine der drei Formen ist, gibt `code: 506` zurück.

<Warning>
  `email` kann nicht mit einer Session ohne `network` verwendet werden, weil es keinen Link gibt,
  der in die E-Mail könnte — diese Form gibt ein Token für Ihr eigenes Frontend zurück. Der Aufruf
  gibt `code: 510` zurück. Fügen Sie ein `network` für eine Direct-Mode-Session hinzu, die eine URL
  hat, oder lassen Sie `email` weg.
</Warning>

Jeder oben genannte Code steht in der Referenz
[Link-Session-Fehler](/docs/errors/errors-ayrshare#link-session-errors).

<RequestExample>
  ```bash cURL theme={"system"}
  curl \
  -H "Authorization: Bearer API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Profile-Key: PROFILE_KEY' \
  -d '{"expiresIn": 60}' \
  -X POST https://api.ayrshare.com/api/profiles/link-sessions
  ```

  ```javascript JavaScript theme={"system"}
  const API_KEY = "API_KEY";
  const PROFILE_KEY = "PROFILE_KEY";

  fetch("https://api.ayrshare.com/api/profiles/link-sessions", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${API_KEY}`,
      "Profile-Key": PROFILE_KEY,
    },
    body: JSON.stringify({ expiresIn: 60 }),
  })
    .then((res) => res.json())
    .then((json) => console.log(json))
    .catch(console.error);
  ```

  ```python Python theme={"system"}
  import requests

  payload = {'expiresIn': 60}
  headers = {'Content-Type': 'application/json',
          'Authorization': 'Bearer API_KEY',
          'Profile-Key': 'PROFILE_KEY'}

  response = requests.post('https://api.ayrshare.com/api/profiles/link-sessions',
                           json=payload, headers=headers)
  print(response.json())
  ```

  ```php PHP theme={"system"}
  <?php
  require 'vendor/autoload.php';    // Composer auto-loader using Guzzle. See .../guzzlephp.org/en/stable/overview.html

  $client = new GuzzleHttp\Client();
  $res = $client->request(
      'POST',
      'https://api.ayrshare.com/api/profiles/link-sessions',
      [
          'headers' => [
              'Content-Type'  => 'application/json',
              'Authorization' => 'Bearer API_KEY',
              'Profile-Key'   => 'PROFILE_KEY'
          ],
          'json' => [
              'expiresIn' => 60,
          ]
      ]
  );

  echo json_encode(json_decode($res->getBody()), JSON_PRETTY_PRINT);
  ```

  ```csharp C# theme={"system"}
  using System;
  using System.Net.Http;
  using System.Text;
  using System.Threading.Tasks;
  using Newtonsoft.Json;

  namespace CreateLinkSession_csharp
  {
    class CreateLinkSession
    {
        static async Task Main(string[] args)
        {
            string API_KEY = "API_KEY";
            string PROFILE_KEY = "PROFILE_KEY";
            string url = "https://api.ayrshare.com/api/profiles/link-sessions";

            try
            {
                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + API_KEY);
                    client.DefaultRequestHeaders.Add("Profile-Key", PROFILE_KEY);

                    var sendData = new { expiresIn = 60 };
                    string jsonData = JsonConvert.SerializeObject(sendData);
                    var content = new StringContent(jsonData, Encoding.UTF8, "application/json");

                    HttpResponseMessage response = await client.PostAsync(url, content);
                    response.EnsureSuccessStatusCode();

                    string responseBody = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(responseBody);
                }
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine($"HTTP request error: {e.Message}");
            }
        }
    }
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={"system"}
  {
      "status": "success",
      "sessionId": "c7a2434e72e91bde27579efde0fd6dd0b74ceee29a471fd368407f273708c2e8",  // Identifier for this link. Use it with Get and Revoke a Link Session.
      "url": "https://profile.ayrshare.com?session=ayr_ls_kJ8mQ2vX9pLnR4tYwZ6aBcD1eFgH3iJkLmN0oPqRsTu&domain=YOUR_DOMAIN",  // Send this to your user exactly as returned. The token exists only in here.
      "expiresAt": "2026-09-02T08:03:26.838Z",  // When the link stops working, as an ISO 8601 timestamp.
      "emailSent": false,  // Whether the connect-accounts email was sent. false means none was requested; a send failure returns code: 333 instead.
      "title": "Acme Client"  // The User Profile's title. Omitted when the profile has none.
  }
  ```

  ```json 200: Direct Mode (mode: "connect" with a network) theme={"system"}
  {
      "status": "success",
      "sessionId": "c7a2434e72e91bde27579efde0fd6dd0b74ceee29a471fd368407f273708c2e8",
      "url": "https://profile.ayrshare.com/connect?session=ayr_ls_kJ8mQ2vX9pLnR4tYwZ6aBcD1eFgH3iJkLmN0oPqRsTu",  // Open this in a popup. One network, no domain parameter.
      "expiresAt": "2026-09-02T08:03:26.838Z",
      "emailSent": false,
      "title": "Acme Client"
  }
  ```

  ```json 200: Connect Mode Without a Network theme={"system"}
  {
      "status": "success",
      "sessionId": "c7a2434e72e91bde27579efde0fd6dd0b74ceee29a471fd368407f273708c2e8",
      "token": "ayr_ls_kJ8mQ2vX9pLnR4tYwZ6aBcD1eFgH3iJkLmN0oPqRsTu",  // No url: this shape returns the bare token instead. Treat it like a password.
      "expiresAt": "2026-09-02T08:03:26.838Z",
      "emailSent": false,  // Always false here - email needs a link to send, so it returns code: 510.
      "title": "Acme Client"
  }
  ```

  ```json 401: Connect Mode Requires the Max Pack theme={"system"}
  {
    "action": "link session",
    "status": "error",
    "code": 504,
    "message": "Connect mode requires the Max Pack. Activate it on your Account page: https://app.ayrshare.com/account"
  }
  ```

  ```json 400: Missing Profile-Key Header theme={"system"}
  {
    "action": "JWT",
    "status": "error",
    "code": 188,
    "message": "Missing or incorrect privateKey, profileKey, domain, email 'to', or expiresIn fields."
  }
  ```

  ```json 400: Domain Not Registered to Your Account theme={"system"}
  {
    "action": "JWT",
    "status": "error",
    "code": 189,
    "message": "Error generating JWT. Check the sent parameters.",
    "details": "Missing or incorrect domain."
  }
  ```

  ```json 403: expiresIn Requires the Max Pack theme={"system"}
  {
    "action": "JWT",
    "status": "error",
    "code": 340,
    "message": "Max Pack required. Go to your dashboard to add the Max Pack."
  }
  ```
</ResponseExample>
