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

# Guía de migración

export const Button = ({href, children}) => {
  return <div className="not-prose group">
    <a href={href}>
      <button className="flex items-center space-x-2.5 py-1 px-4 bg-primary-dark dark:bg-white text-white dark:text-gray-950 rounded-full group-hover:opacity-[0.9] font-medium">
        <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>;
};

<div id="blocks-lookup-standard-v11-compared-to-x-api-v2">
  ### Consulta de bloqueos: estándar v1.1 frente a X API v2
</div>

Si has trabajado con los endpoints estándar v1.1 [GET blocks/ids](https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/mute-block-report-users/api-reference/get-blocks-ids) y [GET blocks/list](https://developer.x.com/en/docs/twitter-api/v1/accounts-and-users/mute-block-report-users/api-reference/get-blocks-list), el objetivo de esta guía es ayudarte a entender las similitudes y diferencias entre los endpoints de consulta de bloqueos de la v1.1 estándar y de X API v2.

* **Similitudes**
  * Autenticación
* **Diferencias**
  * URLs de los endpoints

  * Límites de usuarios por solicitud

  * Requisitos de la App y del Project

  * Formatos de datos de respuesta

  * Parámetros de la solicitud

<div id="similarities">
  #### Similitudes
</div>

**Autenticación**

Tanto los endpoints de consulta de bloqueos estándar v1.1 como los de X API v2 utilizan [OAuth 1.0a User Context](/es/resources/fundamentals/authentication#oauth-1-0a-2). Por lo tanto, si antes utilizabas uno de los endpoints de consulta de bloqueos estándar v1.1, puedes seguir utilizando el mismo método de autenticación si migras a la versión de X API v2. 

<div id="differences">
  #### Diferencias
</div>

**URLs de endpoints**

* Endpoints estándar v1.1:
  * GET [https://api.x.com/1.1/blocks/ids.json](https://api.x.com/1.1/blocks/ids.json)
    (lista de id de usuarios que están bloqueados por el usuario especificado)
  * GET [https://api.x.com/1.1/blocks/lists.json](https://api.x.com/1.1/blocks/lists.json)
    (lista de usuarios que están bloqueados por el usuario especificado)
* Endpoint de X API v2:
  * GET [https://api.x.com/2/users/:id/blocking](https://api.x.com/2/users/:id/blocking)
    (lista de usuarios que están bloqueados por el id de usuario especificado)
     

**Límites de usuarios por solicitud**

Los endpoints estándar v1.1 te permiten recuperar hasta 5000 usuarios por solicitud. Los nuevos endpoints v2 te permiten recuperar hasta 1000 usuarios por solicitud. Para recuperar los 1000 usuarios completos, deberás pasar max\_results=1000 como parámetro de consulta; luego puedes pasar el next\_token devuelto en la carga de respuesta al parámetro de consulta pagination\_token en tu siguiente solicitud.
 

**Requisitos de App y Project**

Los endpoints de X API v2 requieren que utilices credenciales de una [developer App](/es/resources/fundamentals/developer-apps) que esté asociada con un [Project](/es/resources/fundamentals/developer-apps) al autenticar tus solicitudes. Todos los endpoints de X API v1.1 pueden usar credenciales de Apps o de Apps asociadas a un Project.

**Formato de datos de la respuesta**

Una de las mayores diferencias entre las versiones de endpoints estándar v1.1 y X API v2 es cómo seleccionas qué campos se devuelven en tu carga.

Para los endpoints estándar, recibes muchos de los campos de la respuesta de forma predeterminada y luego tienes la opción de usar parámetros para identificar qué campos o conjuntos de campos deben devolverse en la carga.

La versión de X API v2 solo entrega de forma predeterminada los campos user id, name y username. Para solicitar campos u objetos adicionales, necesitarás usar los parámetros [fields](/es/x-api/fundamentals/fields) y [expansions](/es/x-api/fundamentals/expansions). Cualquier campo de usuario que solicites desde este endpoint se devolverá en el objeto de usuario principal. Cualquier objeto de Publicación expandido y sus campos se devolverán en un objeto includes dentro de tu respuesta. Luego puedes hacer coincidir cualquier objeto expandido con el objeto de usuario haciendo coincidir los id ubicados tanto en el usuario como en el objeto de Publicación expandido. 

Te recomendamos leer más sobre estos nuevos parámetros en sus guías respectivas o leyendo nuestra guía sobre [cómo usar fields y expansions](/es/x-api/fundamentals/data-dictionary#how-to-use-fields-and-expansions). 

También hemos preparado una [guía de migración de formato de datos](/es/x-api/migrate/data-format-migration#migrating-from-standard-v1-1s-data-format-to-v2), que puede ayudarte a mapear campos estándar v1.1 con los campos más recientes de v2. Esta guía también te proporcionará el parámetro específico de expansión y de campo que necesitarás pasar con tu solicitud v2 para devolver campos específicos. 
 

Además de los cambios en cómo solicitas ciertos campos, X API v2 también está introduciendo nuevos diseños de JSON para los objetos devueltos por las APIs, incluidos los objetos de [P](/es/x-api/fundamentals/data-dictionary#tweet)ublicación y de [user](/es/x-api/fundamentals/data-dictionary#user).

* En el nivel raíz de JSON, los endpoints estándar devuelven objetos de Publicación en un arreglo statuses, mientras que X API v2 devuelve un arreglo data. 
* En lugar de hacer referencia a "statuses" Retweeted y Quoted, el JSON de X API v2 hace referencia a Tweets Retweeted y Quoted. Muchos campos heredados y obsoletos, como contributors y user.translator\_type, se están eliminando. 
* En lugar de usar tanto favorites (en el objeto de Publicación) como favourites (en el objeto de usuario), X API v2 usa el término like. 
* X está adoptando la convención de que los valores JSON sin valor (por ejemplo, null) no se escriben en la carga. Los atributos de Publicación y de usuario solo se incluyen si tienen valores no nulos. 
   

También incorporamos un nuevo conjunto de campos al [objeto de Publicación](/es/x-api/fundamentals/data-dictionary#tweet), incluidos los siguientes:

* Un campo [conversation\_id](/es/x-api/fundamentals/conversation-id)
* Dos nuevos campos de [annotations](/es/x-api/fundamentals/post-annotations), incluidos context y entities
* Varios campos nuevos de [metrics](/es/x-api/fundamentals/metrics) 
* Un nuevo campo reply\_setting, que te muestra quién puede responder a una Publicación determinada

**Parámetros de solicitud**

Los siguientes parámetros de solicitud estándar de la v1.1 aceptaban dos parámetros de consulta (`user_id` o `screen_name`). La X API v2 solo acepta el id de usuario numérico y debe incluirse como parte de la ruta del endpoint.

***

<div id="code-examples">
  ## Ejemplos de código
</div>

<div id="get-blocked-users-v2">
  ### Obtener usuarios bloqueados (v2)
</div>

<CodeGroup dropdown>
  ```bash cURL theme={null}
  curl "https://api.x.com/2/users/123456789/blocking?user.fields=username,verified&max_results=100" \
    -H "Authorization: OAuth ..."
  ```

  ```python Python theme={null}
  # Requiere autenticación OAuth 1.0a con contexto de usuario (User Context)
  import requests
  from requests_oauthlib import OAuth1

  auth = OAuth1(
      "API_KEY", "API_SECRET",
      "ACCESS_TOKEN", "ACCESS_TOKEN_SECRET"
  )

  url = "https://api.x.com/2/users/123456789/blocking"
  params = {"user.fields": "username,verified", "max_results": 100}

  response = requests.get(url, auth=auth, params=params)
  print(response.json())
  ```

  ```python Python SDK 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)

  # Obtener usuarios bloqueados con paginación
  for page in client.users.get_blocking(
      "123456789",
      user_fields=["username", "verified"],
      max_results=100
  ):
      for user in page.data:
          print(f"{user.username} - Verified: {user.verified}")
  ```

  ```javascript JavaScript SDK 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 });

  // Obtener usuarios bloqueados con paginación
  const paginator = client.users.getBlocking("123456789", {
    userFields: ["username", "verified"],
    maxResults: 100,
  });

  for await (const page of paginator) {
    page.data?.forEach((user) => {
      console.log(`${user.username} - Verified: ${user.verified}`);
    });
  }
  ```
</CodeGroup>

<div id="block-a-user-v2">
  ### Bloquear a un usuario (v2)
</div>

<CodeGroup dropdown>
  ```bash cURL theme={null}
  curl -X POST "https://api.x.com/2/users/123456789/blocking" \
    -H "Authorization: OAuth ..." \
    -H "Content-Type: application/json" \
    -d '{"target_user_id": "2244994945"}'
  ```

  ```python Python theme={null}
  # Requiere autenticación OAuth 1.0a con contexto de usuario
  import requests
  from requests_oauthlib import OAuth1

  auth = OAuth1(
      "API_KEY", "API_SECRET",
      "ACCESS_TOKEN", "ACCESS_TOKEN_SECRET"
  )

  url = "https://api.x.com/2/users/123456789/blocking"
  response = requests.post(url, auth=auth, json={"target_user_id": "2244994945"})
  print(response.json())
  ```

  ```python Python SDK 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)

  # Bloquear a un usuario
  response = client.users.block(
      source_user_id="123456789",
      target_user_id="2244994945"
  )
  print(f"Blocking: {response.data.blocking}")
  ```

  ```javascript JavaScript SDK 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 });

  // Bloquear a un usuario
  const response = await client.users.block("123456789", {
    targetUserId: "2244994945",
  });
  console.log(`Blocking: ${response.data?.blocking}`);
  ```
</CodeGroup>
