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

# Guía de integración

> Esta página cubre las herramientas y conceptos clave para integrar los endpoints de manage Posts en. Referencia del nivel estándar de X API v2 sobre manage tweets.

export const Button = ({href, children}) => {
  return <div className="not-prose">
    <a href={href}>
      <button className="x-btn">
        <span>{children}</span>
        <svg width="3" height="24" viewBox="0 -9 3 24" class="h-6 rotate-0 overflow-visible"><path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></path></svg>
      </button>
    </a>
  </div>;
};

Esta página cubre las herramientas y los conceptos clave para integrar los endpoints de manage Posts en tu sistema.

## Herramientas útiles

Antes de sumergirnos en algunos conceptos clave que te ayudarán a integrar este endpoint, te recomendamos que te familiarices con:

### Postman

Postman es una excelente herramienta que puedes usar para probar un endpoint. Cada solicitud de Postman incluye todos los parámetros de ruta y de cuerpo para ayudarte a comprender rápidamente lo que tienes disponible. Para obtener más información sobre nuestras colecciones de Postman, visita nuestra página ["Usando Postman"](/tutorials/postman-getting-started).

### Ejemplos de código

¿Te interesa configurar este endpoint con código en tu lenguaje de programación preferido? Contamos con varios ejemplos de código diferentes disponibles que puedes usar como punto de partida en nuestra [página de Github](https://github.com/xdevplatform/Twitter-API-v2-sample-code).

### Bibliotecas de terceros

Aprovecha las [bibliotecas de terceros](/tools-and-libraries) de nuestra comunidad para ayudarte a comenzar. Puedes encontrar una biblioteca que funcione con los endpoints v2 buscando la etiqueta de versión adecuada.

## Conceptos clave

### Autenticación

Todos los endpoints de X API v2 requieren que autentiques tus solicitudes con un conjunto de credenciales, también conocidas como keys y tokens.

Estos endpoints específicos requieren el uso de [OAuth 1.0a User Context](/resources/fundamentals/authentication), lo que significa que debes usar un conjunto de API keys y user Access Tokens para hacer una solicitud exitosa. Los Access Tokens deben estar asociados con el usuario en cuyo nombre estás realizando la solicitud. Si deseas generar un conjunto de Access Tokens para otro usuario, éste debe autorizar o autenticar tu App usando el [flujo 3-legged OAuth](/resources/fundamentals/authentication#obtaining-access-tokens-using-3-legged-oauth-flow).

Ten en cuenta que OAuth 1.0a puede ser difícil de usar. Si no estás familiarizado con este método de autenticación, te recomendamos que uses una [biblioteca](/tools-and-libraries), una herramienta como Postman o que uses OAuth 2.0 para autenticar tus solicitudes.

[OAuth 2.0 Authorization Code with PKCE](/resources/fundamentals/authentication#oauth-2-0-authorization-code-flow-with-pkce-2) permite un mayor control sobre el alcance de una aplicación y flujos de autorización en múltiples dispositivos. OAuth 2.0 te permite elegir scopes específicos y detallados que te otorgan permisos específicos en nombre de un usuario.

Para habilitar OAuth 2.0 en tu App, debes habilitarlo en la configuración de autenticación de tu App que se encuentra en la sección de configuración de la App de la Developer Console.

### Developer Console, Projects y developer Apps

Para obtener un conjunto de credenciales de autenticación que funcionen con los endpoints de X API v2, debes tener una [cuenta de desarrollador](/resources/fundamentals/developer-portal), configurar un [Project](/resources/fundamentals/developer-apps) dentro de esa cuenta y crear una [developer App](/resources/fundamentals/developer-apps) dentro de ese Project. Luego, puedes encontrar tus keys y tokens dentro de tu developer App.

### Restricciones de creación de Post (self-serve)

Las siguientes restricciones aplican solo a clientes self-serve (Pay Per Use) de la API. Los clientes Enterprise API no están sujetos a estos límites.

**Restricciones de respuesta**

Las respuestas a través de la API solo se permiten si la cuenta que responde ha sido convocada explícitamente por el autor del post original. Esto significa que se debe cumplir una de las siguientes condiciones:

* El autor original @menciona al usuario/cuenta que responde en su post.
* El autor original cita un post del usuario/cuenta que responde.

Si no se cumple ninguna condición, la solicitud de respuesta será rechazada.

**Límite de cashtag**

Los Posts creados a través de la API están limitados a un máximo de 1 cashtag (por ejemplo, `$TICKER`) por post. Las solicitudes que incluyan más de 1 cashtag serán rechazadas.

### Límites de tasa

Cada día, miles de desarrolladores realizan solicitudes a la X API. Para ayudar a gestionar el gran volumen de estas solicitudes, se colocan [límites de tasa](https://developer.x.com/x-api/fundamentals/rate-limits) en cada endpoint que limitan el número de solicitudes que puedes realizar en nombre de tu app o en nombre de un usuario autenticado.

Estos endpoints tienen un límite de tasa a nivel de usuario, lo que significa que el usuario autenticado en cuyo nombre estás realizando la solicitud solo puede llamar al endpoint un cierto número de veces en cualquier developer App. Hay un límite de tasa de usuario de 200 solicitudes por 15 minutos para el método POST. El método DELETE tiene un límite de tasa de 50 solicitudes por 15 minutos. Además, hay un límite de [300 solicitudes por 3 horas](https://blog.x.com/developer/en_us/topics/tools/2018/new-developer-requirements-to-protect-our-platform), incluidos los Posts creados con manage Posts o manage Retweets.

### Etiquetas de origen

El nombre de tu App y la URL del sitio web se mostrarán como la [etiqueta de origen](https://help.x.com/en/using-twitter/how-to-tweet#source-labels) dentro de los metadatos de cualquier Post creado programáticamente por tu aplicación. Si cambias el caso de uso de una X App, asegúrate de actualizar el caso de uso en esta configuración para asegurar que estás en cumplimiento con los [Developer Terms](https://developer.x.com/content/developer-twitter/en/developer-terms/agreement-and-policy).

### Configuración de perfil

Solo puedes agregar una ubicación a los Posts si tienes la función geo habilitada en tu configuración de perfil. Si no tienes la función geo habilitada, aún puedes agregar un parámetro de ubicación en el cuerpo de tu solicitud, pero no se adjuntará a tu Post. Lo mismo también es cierto para etiquetar usuarios en imágenes. Si el usuario que estás etiquetando no tiene la función de etiquetado de fotos habilitada, sus nombres no aparecerán en la lista de usuarios etiquetados aunque el Post se cree con éxito.

### Añadir media a un Post

Actualmente, no hay una forma de subir completamente media usando la v2 de la X API. Sin embargo, puedes adjuntar media previamente subido a un Post. Puedes usar media IDs que ya se han [subido usando el endpoint de media upload](/x-api/media/upload-media) o [X Media Studio](https://media.x.com/en/articles/products/2018/media-studio). Estos media ids deben ser tuyos o de un usuario autenticado.

***

## Ejemplos de código

### Crear un Post

<CodeGroup dropdown>
  ```bash cURL theme={null}
  curl -X POST "https://api.x.com/2/tweets" \
    -H "Authorization: OAuth ..." \
    -H "Content-Type: application/json" \
    -d '{"text": "Hello world!"}'
  ```

  ```python title="Python SDK" lines wrap icon="python" theme={null}
  from xdk import Client
  from xdk.oauth1_auth import OAuth1

  oauth1 = OAuth1(
      api_key="YOUR_API_KEY",
      api_secret="YOUR_API_SECRET",
      access_token="YOUR_ACCESS_TOKEN",
      access_token_secret="YOUR_ACCESS_TOKEN_SECRET"
  )

  client = Client(auth=oauth1)

  # Crear un Post
  response = client.posts.create(text="Hello world!")
  print(f"Created Post: {response.data.id}")
  ```

  ```javascript title="JavaScript SDK" lines wrap icon="square-js" theme={null}
  import { Client, OAuth1 } from "@xdevplatform/xdk";

  const oauth1 = new OAuth1({
    apiKey: "YOUR_API_KEY",
    apiSecret: "YOUR_API_SECRET",
    accessToken: "YOUR_ACCESS_TOKEN",
    accessTokenSecret: "YOUR_ACCESS_TOKEN_SECRET",
  });

  const client = new Client({ oauth1 });

  // Crear un Post
  const response = await client.posts.create({ text: "Hello world!" });
  console.log(`Created Post: ${response.data?.id}`);
  ```
</CodeGroup>

### Crear una respuesta

<CodeGroup dropdown>
  ```bash cURL theme={null}
  curl -X POST "https://api.x.com/2/tweets" \
    -H "Authorization: OAuth ..." \
    -H "Content-Type: application/json" \
    -d '{"text": "This is a reply!", "reply": {"in_reply_to_tweet_id": "1234567890"}}'
  ```

  ```python title="Python SDK" lines wrap icon="python" theme={null}
  from xdk import Client
  from xdk.oauth1_auth import OAuth1

  oauth1 = OAuth1(
      api_key="YOUR_API_KEY",
      api_secret="YOUR_API_SECRET",
      access_token="YOUR_ACCESS_TOKEN",
      access_token_secret="YOUR_ACCESS_TOKEN_SECRET"
  )

  client = Client(auth=oauth1)

  # Crear una respuesta
  response = client.posts.create(
      text="This is a reply!",
      reply={"in_reply_to_tweet_id": "1234567890"}
  )
  print(f"Created reply: {response.data.id}")
  ```

  ```javascript title="JavaScript SDK" lines wrap icon="square-js" theme={null}
  import { Client, OAuth1 } from "@xdevplatform/xdk";

  const oauth1 = new OAuth1({
    apiKey: "YOUR_API_KEY",
    apiSecret: "YOUR_API_SECRET",
    accessToken: "YOUR_ACCESS_TOKEN",
    accessTokenSecret: "YOUR_ACCESS_TOKEN_SECRET",
  });

  const client = new Client({ oauth1 });

  // Crear una respuesta
  const response = await client.posts.create({
    text: "This is a reply!",
    reply: { inReplyToTweetId: "1234567890" },
  });
  console.log(`Created reply: ${response.data?.id}`);
  ```
</CodeGroup>

### Eliminar un Post

<CodeGroup dropdown>
  ```bash cURL theme={null}
  curl -X DELETE "https://api.x.com/2/tweets/1234567890" \
    -H "Authorization: OAuth ..."
  ```

  ```python title="Python SDK" lines wrap icon="python" theme={null}
  from xdk import Client
  from xdk.oauth1_auth import OAuth1

  oauth1 = OAuth1(
      api_key="YOUR_API_KEY",
      api_secret="YOUR_API_SECRET",
      access_token="YOUR_ACCESS_TOKEN",
      access_token_secret="YOUR_ACCESS_TOKEN_SECRET"
  )

  client = Client(auth=oauth1)

  # Eliminar un Post
  response = client.posts.delete("1234567890")
  print(f"Deleted: {response.data.deleted}")
  ```

  ```javascript title="JavaScript SDK" lines wrap icon="square-js" theme={null}
  import { Client, OAuth1 } from "@xdevplatform/xdk";

  const oauth1 = new OAuth1({
    apiKey: "YOUR_API_KEY",
    apiSecret: "YOUR_API_SECRET",
    accessToken: "YOUR_ACCESS_TOKEN",
    accessTokenSecret: "YOUR_ACCESS_TOKEN_SECRET",
  });

  const client = new Client({ oauth1 });

  // Eliminar un Post
  const response = await client.posts.delete("1234567890");
  console.log(`Deleted: ${response.data?.deleted}`);
  ```
</CodeGroup>

**Próximos pasos**

[Referencia de la API](/x-api/posts/manage-tweets#manage-tweets-api-reference-index)
