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

# Generar un JWT

> Genera un JSON Web Token (JWT) para usarlo con single sign on.

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="/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="/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="/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} />

Genera un JSON Web Token (JWT) para usarlo con single sign on.

Consulta la [Visión general de Generate JWT](/apis/profiles/generate-jwt-overview) para más detalles.

<Note>
  La URL del JWT es válida durante **5 minutos**. Pasados 5 minutos deberás generar una nueva URL de JWT.
  Consulta el `expiresIn` de Max Pack para [opciones adicionales](/apis/profiles/generate-jwt-overview#jwt-expires-in).
</Note>

## Parámetros de cabecera

<HeaderAPI noProfileKey />

<ParamField header="X-Twitter-OAuth1-Api-Key" type="string">
  Tu X API Key (Consumer Key) del X Developer Portal. Alternativa al parámetro `twitterApiKey` del cuerpo. Cuando se proporciona, la URL del JWT generada usará tu X Developer App para la vinculación mediante OAuth.
</ParamField>

<ParamField header="X-Twitter-OAuth1-Api-Secret" type="string">
  Tu X API Secret (Consumer Secret) del X Developer Portal. Alternativa al parámetro `twitterApiSecret` del cuerpo. Obligatorio cuando se proporciona `X-Twitter-OAuth1-Api-Key`.
</ParamField>

<Info>
  **Recomendado:** pasa tus credenciales de X mediante cabeceras (`X-Twitter-OAuth1-Api-Key` y `X-Twitter-OAuth1-Api-Secret`) para mantener la coherencia con todos los demás endpoints de la API de Ayrshare. Los parámetros de cuerpo `twitterApiKey` y `twitterApiSecret` siguen siendo compatibles por retrocompatibilidad.
</Info>

## Parámetros del cuerpo

<ParamField body="domain" type="string" required>
  Dominio de la aplicación. Utiliza el dominio exacto proporcionado durante el onboarding.
</ParamField>

<ParamField body="privateKey" type="string" required>
  Private Key utilizada para el cifrado.
</ParamField>

<ParamField body="profileKey" type="string" required>
  User Profile Key. La API Key no se puede usar en este campo.
</ParamField>

<ParamField body="logout" type="boolean" default={false}>
  Cierra automáticamente la sesión actual. Recomendamos no usarlo en producción, ya que afecta al rendimiento.

  Consulta [Cierre de sesión automático de una sesión de perfil](/multiple-users/api-integration-business#automatic-logout-of-a-profile-session) para más información.
</ParamField>

<ParamField body="redirect" type="string">
  Especifica una URL a la que redirigir cuando se haga clic en el botón "Done" o en la imagen del logo. La URL se acortará automáticamente en la URL del JWT devuelta. [Redirige la ventana origin](/multiple-users/api-integration-business#opening-and-closing-the-social-linking-url) que abrió el enlace añadiendo el parámetro de consulta `origin=true` a la URL de redirección.
</ParamField>

<ParamField body="allowedSocial" type="array">
  Especifica las redes sociales que se mostrarán en la página de vinculación. Esto sobrescribirá las redes sociales configuradas en la página [Social Networks](/multiple-users/manage-user-profiles#set-social-networks-access).

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

<ParamField body="instagramLinkMethod" type="string">
  Sobrescribe el flujo de vinculación de Instagram que se usa cuando un usuario hace clic en el botón de Instagram en la página de vinculación social para esta URL. Valores válidos:

  * `instagram`: Instagram Login directo, no requiere Facebook Page.
  * `facebook`: vincula Instagram a través de una Facebook Page conectada.

  ```json Force direct Instagram Login for this linking session theme={"system"}
  {
    "instagramLinkMethod": "instagram"
  }
  ```

  Cuando se omite, la página de vinculación utiliza tu ajuste global de cuenta [Instagram Login](/multiple-users/manage-user-profiles#instagram-login).

  Consulta [Método de vinculación de Instagram](/apis/profiles/generate-jwt-overview#instagram-link-method) para más información.
</ParamField>

<ParamField body="verify" type="boolean" default={false}>
  Verifica que el token generado sea válido. Recomendamos usarlo solo en entornos que no sean de producción.

  Consulta [Apertura y cierre de la URL de vinculación social](/multiple-users/api-integration-business#opening-and-closing-the-social-linking-url) para más información.
</ParamField>

<ParamField body="base64" type="boolean" default={false}>
  Si la private key está codificada en base64, establece en `true`.

  Codifica el archivo private.key en base64 y pasa el String de una sola línea en el campo `privateKey`.

  Por ejemplo, en Linux: `cat private.key | base64`
</ParamField>

<ParamField body="expiresIn" type="number" default={5}>
  Establece la duración del token en minutos. Rango: de 1 minuto a 2880 minutos.

  Consulta [JWT Expires In](/apis/profiles/generate-jwt-overview#jwt-expires-in) para más información.
</ParamField>

<ParamField body="email" type="object" default={5}>
  Envía un correo Connect Accounts con un enlace para que los usuarios accedan directamente a su página de vinculación social.

  Consulta [Connect Accounts Email](/apis/profiles/generate-jwt-overview#connect-accounts-email) para más información.
</ParamField>

<Info>
  Cuando incluyes tus credenciales de la X API, la URL del JWT generada iniciará la vinculación mediante OAuth usando tu propia X Developer App. Tus usuarios finales verán el nombre de tu app en la pantalla de consentimiento de X.
</Info>

<Warning>
  **Obligatorio:** antes de usar esta funcionalidad, debes añadir estas URL de callback a los ajustes de tu X Developer App (en Authentication settings > Callback URI / Redirect URL):

  * `https://profile.ayrshare.com/social-accounts`
  * `https://app.ayrshare.com/social-accounts`

  Sin ellas, el flujo OAuth fallará con un error `403 Callback URL not approved`.
</Warning>

<RequestExample>
  ```javascript cURL theme={"system"}
  curl \
  -H "Authorization: Bearer API_KEY" \
  -H 'Content-Type: application/json' \
  -H "X-Twitter-OAuth1-Api-Key: YOUR_CONSUMER_KEY" \
  -H "X-Twitter-OAuth1-Api-Secret: YOUR_CONSUMER_SECRET" \
  -d '{"domain": "ACME", "privateKey": "-----BEGIN RSA PRIVATE KEY...", "profileKey": "PROFILE_KEY"}' \
  -X POST https://api.ayrshare.com/api/profiles/generateJWT
  ```

  ```javascript JavaScript theme={"system"}
  const fs = require('fs');
  const API_KEY = "API_KEY";
  const PROFILE_KEY = "PROFILE_KEY";

  // Read in local private.key files - also can read from a DB
  const privateKey = fs.readFileSync('private.key', 'utf8');

  fetch("https://api.ayrshare.com/api/profiles/generateJWT", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "Authorization": `Bearer ${API_KEY}`,
          "X-Twitter-OAuth1-Api-Key": "YOUR_CONSUMER_KEY",
          "X-Twitter-OAuth1-Api-Secret": "YOUR_CONSUMER_SECRET"
        },
        body: JSON.stringify({
          domain: "ACME",          // required
          privateKey,              // required
          profileKey: PROFILE_KEY, // required
        }),
      })
        .then((res) => res.json())
        .then((json) => console.log(json))
        .catch(console.error);
  ```

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

  # Read in local private.key files - also can read from a DB
  with open('.private.key') as f:
      profileKey = f.read()

  payload = {'domain': 'ACME',
          'privateKey': profileKey,
          'profileKey': 'PROFILE_KEY' }
  headers = {'Content-Type': 'application/json',
          'Authorization': 'Bearer API_KEY',
          'X-Twitter-OAuth1-Api-Key': 'YOUR_CONSUMER_KEY',
          'X-Twitter-OAuth1-Api-Secret': 'YOUR_CONSUMER_SECRET'}

  r = requests.post('https://api.ayrshare.com/api/profiles/generateJWT',
      json=payload,
      headers=headers)

  print(r.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/post',
      [
          'headers' => [
              'Content-Type'  => 'application/json',
              'Authorization' => 'Bearer API_KEY'
          ],
          'json' => [
              'domain' => 'ACME',
              'privateKey' => '-----BEGIN RSA PRIVATE KEY...', // required
              'profileKey' => 'PROFILE_KEY', // requires
          ]
      ]
  );

  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 System.IO;
  using Newtonsoft.Json;

  namespace GenerateJWTRequest_csharp
  {
    class GenerateJWT
    {
        static async Task Main(string[] args)
        {
            string API_KEY = "API_KEY";
            string url = "https://api.ayrshare.com/api/profiles/generateJWT";

            try
            {
                string privateKey = await File.ReadAllTextAsync("./private.key");

                var sendData = new
                {
                    domain = "domain",
                    privateKey = privateKey,
                    profileKey = "PROFILE_KEY"
                };

                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + API_KEY);

                    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 (FileNotFoundException e)
            {
                Console.WriteLine($"Private key file not found: {e.Message}");
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine($"HTTP request error: {e.Message}");
            }
            catch (Exception e)
            {
                Console.WriteLine($"Unexpected error: {e.Message}");
            }
        }
    }
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200: Success theme={"system"}
  {
      "status": "success",
      "title": "User Profile Title",
      "token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXkiOiJBSjNQR1cxLThIWk04UjQtR0NXVFZKVy1ZRTE1M1BFIiwicHJvZmlsZUtleSI6IjhKNDY4UFktSjM5TVlXRC1IWEpLVlIyLVBRMjBQUlMiLCJpYXQiOjE2MTQyMjYwNDksImV4cCI6MTYxNDIyNjM0OSwiYXVkIjoiaHR0cHM6Ly9hcHAuYXlyc2hhcmUuY29tIiwiaXNzIjoiYm9uZGJyYW5kbG95YWx0eS5jb20iLCJzdWIiOiJzdXBwb3J0QGF5cnNoYXJlLmNvbSJ9.Se387OyhJIdaDkFkvAe0Dwo3pQrHBwdg2bbjqKYn7BZuVDxPboJmTsd7rra8N-Z6b9_fJOtwlRFGBLW1CvgLGU4RSisTVqjqhAkb3KNhpA7cZ673IJbRX-ST7tYadKKzmd9GNrZW9rhxHOlgMJ9uOboc4dcaDbNmzb_yCrfLY-E"
      "url": "https://profile.ayrshare.com?domain=PROVIDED_DOMAIN&jwt=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlLZXkiOiJBSjNQR1cxLThIWk04UjQtR0NXVFZKVy1ZRTE1M1BFIiwicHJvZmlsZUtleSI6IjhKNDY4UFktSjM5TVlXRC1IWEpLVlIyLVBRMjBQUlMiLCJpYXQiOjE2MTQyMjYwNDksImV4cCI6MTYxNDIyNjM0OSwiYXVkIjoiaHR0cHM6Ly9hcHAuYXlyc2hhcmUuY29tIiwiaXNzIjoiYm9uZGJyYW5kbG95YWx0eS5jb20iLCJzdWIiOiJzdXBwb3J0QGF5cnNoYXJlLmNvbSJ9.Se387OyhJIdaDkFkvAe0Dwo3pQrHBwdg2bbjqKYn7BZuVDxPboJmTsd7rra8N-Z6b9_fJOtwlRFGBLW1CvgLGU4RSisTVqjqhAkb3KNhpA7cZ673IJbRX-ST7tYadKKzmd9GNrZW9rhxHOlgMJ9uOboc4dcaDbNmzb_yCrfLY-E",
      "emailSent": true,    
      "expiresIn": "30m"    
  }
  ```

  ```json 400: Private Key Formatted Incorrectly theme={"system"}
  {
    "action": "JWT",
    "status": "error",
    "code": 189,
    "message": "Error generating JWT. Check the sent parameters, such as the privateKey has no extra tabs, spaces, or newlines. Error: error:0909006C:PEM routines:get_name:no start line"
  }
  ```

  ```json 400: Partial Twitter API Keys theme={"system"}
  {
    "action": "JWT",
    "status": "error",
    "code": 188,
    "message": "Both twitterApiKey and twitterApiSecret are required. You provided only one."
  }
  ```

  ```json 400: Duplicate X/Twitter Credentials theme={"system"}
  {
      "action": "JWT",
      "status": "error",
      "code": 434,
      "message": "X/Twitter API credentials were provided in both the request headers and the request body. Please use the headers only. See https://www.ayrshare.com/docs/apis/profiles/generate-jwt"
  }
  ```
</ResponseExample>
