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

# Optimización del uso de la API

Reduce solicitudes innecesarias reutilizando perfiles incluidos en las respuestas, agrupando consultas y guardando resultados por ID estable. Estos ejemplos muestran cuándo aplicar cada enfoque.

> **Consejo:** las 100 solicitudes gratuitas, sin tarjeta ni caducidad, permiten probar estos patrones y medir el consumo real antes de elegir un plan.

***

## Configuración de los ejemplos

Los ejemplos de Python utilizan `requests` (`python -m pip install requests`) y se ejecutan en tu backend. Sustituye la clave y los IDs de ejemplo. `search_results` representa una lista de publicaciones de una solicitud anterior.

```python theme={null}
import requests

API_KEY = "YOUR_API_KEY"
```

## Principio 1: Las publicaciones ya incluyen datos del usuario

Todos los endpoints de publicaciones, como `/search-tweets`, `/user-tweets`, `/list-tweets`, `/comments`, `/quotes` y `/mentions`, incluyen el **perfil completo del autor** dentro de cada objeto.

```json theme={null}
{
  "tweets": [
    {
      "id": "2029914600217473314",
      "full_text": "Great thread on API design patterns...",
      "likes_count": 142,
      "user": {
        "id": "1422280682240450563",
        "username": "dev_sarah",
        "display_name": "Sarah Chen",
        "description": "Staff engineer @stripe. APIs, distributed systems.",
        "followers_count": 12400,
        "followings_count": 890,
        "tweets_count": 4521,
        "verified": true,
        "location": "San Francisco",
        "created_at": "2021-02-01T09:15:22Z"
      }
    }
  ]
}
```

`user` contiene los mismos datos que una consulta a `/info`: ID, nombres, biografía, seguidores, cuentas seguidas, publicaciones, verificación, ubicación, creación, imagen y más.

**Aplicación práctica:** si buscas publicaciones sobre un tema para crear una lista de autores, no necesitas llamar a `/info` por cada uno. Extrae los datos de la respuesta:

```python theme={null}
# Collect unique users from a tweet search - zero extra API calls
seen_ids = set()
unique_users = []

for tweet in search_results:
    user = tweet["user"]
    if user["id"] not in seen_ids:
        seen_ids.add(user["id"])
        unique_users.append(user)

print(f"Found {len(unique_users)} unique users from {len(search_results)} tweets")
```

Este patrón puede evitar cientos o miles de solicitudes innecesarias.

***

## Principio 2: Utiliza endpoints por lotes

Las variantes por lotes de las consultas habituales reducen considerablemente las llamadas.

### `/info-batch` en lugar de repetir `/info`

Obtén hasta 100 perfiles a la vez:

```python theme={null}
# A separate /info call for each account would use 10 requests.

# Efficient: 10 accounts = 1 request
resp = requests.get(
    "https://api.sorsa.io/v3/info-batch",
    headers={"ApiKey": API_KEY},
    params={"usernames": ["NASA", "SpaceX", "Tesla", "OpenAI", "stripe",
                           "shopify", "vercel", "github", "notion", "linear"]},
)
resp.raise_for_status()
profiles = resp.json().get("users", [])
```

**Ahorro:** 10 cuentas requieren 1 solicitud en lugar de 10. La reducción aumenta hasta 100 cuentas por llamada.

### `/tweet-info-bulk` en lugar de repetir `/tweet-info`

Si tienes IDs procedentes de un archivo, exportación o marcadores, consulta sus métricas actuales y autores en lotes de hasta 100:

```python theme={null}
# A separate /tweet-info call for each tweet would use up to 100 requests.

# Efficient: 100 tweets = 1 request
resp = requests.post(
    "https://api.sorsa.io/v3/tweet-info-bulk",
    headers={"ApiKey": API_KEY, "Content-Type": "application/json"},
    json={
        "tweet_links": [
            "https://x.com/user/status/111111",
            "https://x.com/user/status/222222",
            # ... up to 100 links
        ]
    },
)
resp.raise_for_status()
tweets = resp.json().get("tweets", [])
```

**Ahorro:** 100 publicaciones en 1 solicitud en lugar de 100: un 99 % menos.

***

## Principio 3: Utiliza `/list-tweets` para varias cuentas

Agrupa cuentas en una lista de X y consulta su actividad reciente combinada con una llamada, en lugar de consultar cada cuenta.

```python theme={null}
# Separate /user-tweets calls would use 30 requests per polling cycle.
LIST_ID = "YOUR_LIST_ID"

# Efficient: 1 request covers all 30 accounts
resp = requests.get(
    f"https://api.sorsa.io/v3/list-tweets?list_id={LIST_ID}",
    headers={"ApiKey": API_KEY},
    timeout=30,
)
resp.raise_for_status()
```

**Estimación para primeras páginas:** una lista cada 10 segundos consume 259.200 solicitudes en 30 días, frente a 7.776.000 para 30 cronologías por separado. Las páginas adicionales y los reintentos aumentan ambos totales; una lista muy activa puede requerir paginación en cada ciclo.

Consulta [Supervisión en tiempo real](https://docs.sorsa.io/es/real-time-monitoring) y [Listas y comunidades](https://docs.sorsa.io/es/lists-and-communities).

***

## Principio 4: Utiliza `/info` para resolver perfiles

`/info` acepta nombre, ID o enlace de perfil y devuelve el perfil completo con el ID permanente. Es una opción flexible para normalizar entradas mixtas.

Si necesitas perfiles completos, llama una vez por cuenta a `/info`, en lugar de convertir con `/username-to-id` o `/link-to-id` y después consultar el perfil:

```python theme={null}
# Resolving an ID and then fetching its profile would use two requests.

# Efficient: 1 request per account
response = requests.get(
    "https://api.sorsa.io/v3/info",
    headers={"ApiKey": API_KEY},
    params={"username": "stripe"},       # accepts username, user_id, or user_link
    timeout=30,
)
response.raise_for_status()
profile = response.json()
# profile already contains the user ID, plus everything else
```

**Cuándo usar conversiones por separado:** cuando solo necesitas el ID o el nombre, sin el perfil completo; por ejemplo, convertir 1.000 nombres a IDs para almacenarlos. Si ya tienes el perfil, reutiliza `id` sin otra solicitud. Consulta [Conversión de IDs](https://docs.sorsa.io/es/ID-Conversion).

***

## Principio 5: Elimina duplicados en la base de datos

El mismo usuario aparecerá en búsquedas, seguidores, menciones y cronologías. Utiliza su ID permanente como clave y actualiza registros existentes en lugar de insertar duplicados.

```python theme={null}
import sqlite3

db = sqlite3.connect("audience.db")
db.execute("""
    CREATE TABLE IF NOT EXISTS users (
        user_id TEXT PRIMARY KEY, username TEXT, display_name TEXT,
        description TEXT, followers_count INTEGER, tweets_count INTEGER,
        verified INTEGER, updated_at TEXT
    )
""")

def upsert_user(db, user):
    """Insert or update a user record keyed by permanent User ID."""
    db.execute("""
        INSERT INTO users (user_id, username, display_name, description,
                          followers_count, tweets_count, verified, updated_at)
        VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'))
        ON CONFLICT(user_id) DO UPDATE SET
            username = excluded.username,
            display_name = excluded.display_name,
            description = excluded.description,
            followers_count = excluded.followers_count,
            tweets_count = excluded.tweets_count,
            verified = excluded.verified,
            updated_at = datetime('now')
    """, (
        user["id"], user["username"], user.get("display_name", ""),
        user.get("description", ""), user.get("followers_count", 0),
        user.get("tweets_count", 0), user.get("verified", False),
    ))
    db.commit()


# Every time you encounter a user in any API response, upsert:
for tweet in search_results:
    upsert_user(db, tweet["user"])
    # The user's profile data stays fresh without separate /info calls
```

Así actualizas el perfil cada vez que aparece en una respuesta. Las cuentas que no vuelvan a aparecer no se actualizarán con este método. Programa actualizaciones por lotes si tu aplicación requiere una antigüedad máxima de datos.

***

## Principio 6: No vuelvas a consultar datos que ya tienes

En flujos de varios pasos, transmite los datos de un paso al siguiente.

**Geografía de audiencias.** Primero obtienes seguidores y después consultas `/about` para cada uno. Ya tienes su perfil completo: no vuelvas a llamar a `/info`. Solo necesitas `/about` para el país, que no está en el perfil estándar. Consulta [Geografía de la audiencia](https://docs.sorsa.io/es/Audience-Geography).

**Verificación de campañas.** Si `/check-comment` devuelve `commented: true`, incluye el comentario completo. Extrae su texto de esa respuesta para evaluar la calidad; no lo busques de nuevo con `/search-tweets` o `/comments`.

**Lista de usuarios desde una búsqueda.** Si ya obtuviste 500 usuarios únicos de los objetos `user`, filtra localmente cuáles tienen más de 10.000 seguidores. No realices 500 llamadas a `/info`.

***

## Referencia rápida: elegir el endpoint

| Tienes…                           | Necesitas…                                  | Utiliza                                          | Evita                               |
| :-------------------------------- | :------------------------------------------ | :----------------------------------------------- | :---------------------------------- |
| Una lista de nombres              | Perfiles completos                          | `GET /info-batch`, una solicitud                 | `/info` en un bucle                 |
| Una lista de URL de publicaciones | Publicaciones y autores                     | `POST /tweet-info-bulk`, hasta 100 por solicitud | `/tweet-info` en un bucle           |
| 30 cuentas que supervisar         | Publicaciones recientes de todas            | `GET /list-tweets`, una solicitud                | `/user-tweets` × 30                 |
| Un nombre de usuario              | ID, biografía, contadores y perfil completo | `GET /info`                                      | `/username-to-id` y después `/info` |
| Resultados de búsqueda            | Perfiles de autores                         | Extraer `tweet["user"]`                          | `/info` por autor                   |
| Lista de seguidores               | Perfiles de seguidores                      | Ya están en `/followers`                         | `/info` por seguidor                |

***

## Estimar el presupuesto de solicitudes

Calcula el volumen antes de empezar:

| Tarea                                                 | Método eficiente             | Solicitudes       |
| :---------------------------------------------------- | :--------------------------- | :---------------- |
| Perfiles de 50 cuentas                                | `/info-batch`                | Aproximadamente 1 |
| 10.000 seguidores                                     | `/followers`, 200 por página | 50                |
| País de esos 10.000 seguidores                        | `/about` por usuario         | 10.000            |
| Métricas actuales de 100 publicaciones                | `/tweet-info-bulk`           | 1                 |
| Supervisar 50 cuentas cada 10 segundos durante un día | `/list-tweets`               | 8.640             |
| Verificar 5 tareas para 1.000 participantes           | 5 comprobaciones por usuario | 5.000             |

Un flujo combinado puede consumir 50 + 10.000 + 1 + 8.640 + 5.000 = unas 23.700 solicitudes. A 20 por segundo, el mínimo teórico de procesamiento ronda los 20 minutos. Sin embargo, la supervisión abarca un día completo; la paginación secuencial, latencia y reintentos añaden tiempo. Consulta [Precios](https://api.sorsa.io/pricing) para estimar el coste.

***

## Próximos pasos

* [Límites de solicitudes](https://docs.sorsa.io/es/rate-limits): errores 429 y rendimiento.
* [Paginación](https://docs.sorsa.io/es/pagination): cursores para grandes volúmenes.
* [Precios](https://api.sorsa.io/pricing): coste por solicitud y presupuesto.
* [Referencia de la API](https://docs.sorsa.io/es/api-reference-guide): especificaciones de lotes y demás endpoints.
