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

# Conversión de IDs

Convierte entre nombres de usuario de X (antes Twitter), IDs numéricos y URL de perfil. Tres endpoints sencillos, una solicitud cada uno. Las cuentas nuevas incluyen 100 solicitudes gratuitas, sin tarjeta, para empezar de inmediato.

> **Nota:** consulta más detalles en [Conversión de nombres, IDs y enlaces de perfil](https://api.sorsa.io/blog/twitter-id-converter).

> **Sin código:** para conversiones puntuales, utiliza [Sorsa ID Converter](https://api.sorsa.io/playground/id-converter). Pega un nombre, ID o URL y obtén el resultado sin clave de API.

***

## Por qué importan los IDs

El nombre de usuario puede cambiar y, al quedar libre, otra persona puede ocuparlo. El ID se asigna al crear la cuenta y permanece estable. Si guardas referencias a cuentas, utiliza IDs:

* **Los cambios de nombre no rompen tu sistema.** El ID sigue apuntando a la misma cuenta.
* **Conserva el ID completo.** Utiliza cadenas en JSON y JavaScript. Si la base de datos usa enteros, verifica que su rango admita los IDs sin pérdida de precisión.
* **Las uniones entre periodos son fiables.** Los IDs son la clave segura para relacionar conjuntos recopilados en momentos distintos.
* **Algunos endpoints utilizan IDs.** `/info-batch` acepta `user_ids` y también `usernames`. Las listas y comunidades se identifican por sus IDs numéricos.

## Formato de los IDs

X utiliza IDs Snowflake: enteros de 64 bits que combinan una marca temporal, un identificador de máquina y un número de secuencia. Las publicaciones utilizan este formato desde 2010.

Los IDs de usuario son distintos: X siguió asignando enteros secuenciales durante años y migró a Snowflake aproximadamente en 2020. Por eso las cuentas antiguas tienen IDs cortos, como `12` para Jack Dorsey, y las posteriores a 2020 tienen 19 dígitos. No puedes deducir la fecha de creación de IDs antiguos; consulta el perfil y lee `created_at`.

***

## Endpoint 1: Nombre de usuario a ID

```http theme={null}
GET /v3/username-to-id/{user_handle}
```

Convierte un nombre sin @ en su ID numérico permanente.

```bash theme={null}
curl "https://api.sorsa.io/v3/username-to-id/elonmusk" \
  -H "ApiKey: YOUR_API_KEY"
```

```json theme={null}
{"id": "44196397"}
```

```python theme={null}
import requests

API_KEY = "YOUR_API_KEY"

def username_to_id(handle: str) -> str:
    resp = requests.get(
        f"https://api.sorsa.io/v3/username-to-id/{handle}",
        headers={"ApiKey": API_KEY},
    )
    resp.raise_for_status()
    return resp.json()["id"]

print(username_to_id("elonmusk"))  # "44196397"
```

```javascript theme={null}
async function usernameToId(handle) {
  const resp = await fetch(
    `https://api.sorsa.io/v3/username-to-id/${handle}`,
    { headers: { "ApiKey": "YOUR_API_KEY" } }
  );
  return (await resp.json()).id;
}
```

## Endpoint 2: ID a nombre de usuario

```http theme={null}
GET /v3/id-to-username/{user_id}
```

Resuelve el ID al nombre actual. Es útil para mostrar nombres legibles o detectar cambios desde la última consulta.

```bash theme={null}
curl "https://api.sorsa.io/v3/id-to-username/44196397" \
  -H "ApiKey: YOUR_API_KEY"
```

```json theme={null}
{"handle": "elonmusk"}
```

```python theme={null}
def id_to_username(user_id: str) -> str:
    resp = requests.get(
        f"https://api.sorsa.io/v3/id-to-username/{user_id}",
        headers={"ApiKey": API_KEY},
    )
    resp.raise_for_status()
    return resp.json()["handle"]
```

## Endpoint 3: Enlace de perfil a ID

```http theme={null}
GET /v3/link-to-id?link={profile_url}
```

Obtiene el ID permanente desde una URL completa. Sirve para normalizar enlaces de hojas de cálculo, marcadores o páginas recopiladas.

```bash theme={null}
curl "https://api.sorsa.io/v3/link-to-id?link=https://x.com/elonmusk" \
  -H "ApiKey: YOUR_API_KEY"
```

```json theme={null}
{"id": "44196397"}
```

```python theme={null}
def link_to_id(profile_url: str) -> str:
    resp = requests.get(
        "https://api.sorsa.io/v3/link-to-id",
        headers={"ApiKey": API_KEY},
        params={"link": profile_url},
    )
    resp.raise_for_status()
    return resp.json()["id"]
```

> **Consejo:** si necesitas el ID y el perfil completo, utiliza directamente [`/info`](https://docs.sorsa.io/es/api-reference/usuarios/perfil-de-usuario) con `username`. Devuelve el perfil, incluido `id`, en una solicitud. Consulta [Optimización del uso de la API](https://docs.sorsa.io/es/optimizing-api-usage).

***

## Patrones habituales

### Conversión de una lista

Para convertir nombres procedentes de un CRM, lista de competidores u hoja de cálculo:

```python theme={null}
import requests
import time

API_KEY = "YOUR_API_KEY"
BASE = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": API_KEY}


def batch_username_to_id(handles, pause=0.05):
    """
    Resolve a list of handles to user IDs.
    Returns: dict mapping handle -> id (or None if lookup failed).
    """
    results = {}
    for handle in handles:
        handle = handle.strip().lstrip("@")
        try:
            resp = requests.get(f"{BASE}/username-to-id/{handle}", headers=HEADERS, timeout=10)
            if resp.status_code == 200:
                results[handle] = resp.json()["id"]
            elif resp.status_code == 404:
                results[handle] = None  # Account does not exist or is suspended
            elif resp.status_code == 429:
                time.sleep(1)
                retry = requests.get(f"{BASE}/username-to-id/{handle}", headers=HEADERS, timeout=10)
                results[handle] = retry.json()["id"] if retry.status_code == 200 else None
            else:
                results[handle] = None
        except requests.RequestException:
            results[handle] = None
        time.sleep(pause)
    return results


handles = ["NASA", "SpaceX", "Tesla", "OpenAI", "stripe"]
id_map = batch_username_to_id(handles)

for handle, uid in id_map.items():
    print(f"@{handle} -> {uid or '(not found)'}")
```

Para la dirección inversa, usa `/id-to-username/{user_id}` y lee `handle`. Es útil para actualizar nombres antiguos en una base de datos.

### Normalizar entradas mixtas

Si los usuarios envían nombres, URL e IDs, normalízalos a IDs. Este ejemplo evita llamar a la API cuando la entrada ya es un ID:

```python theme={null}
def normalize_to_id(value: str) -> str:
    """
    Accepts a handle, an @handle, a profile URL, or a numeric ID.
    Returns the numeric user ID.
    """
    value = value.strip().lstrip("@")

    if value.isdigit():
        return value

    if "x.com/" in value or "twitter.com/" in value:
        return link_to_id(value)

    return username_to_id(value)


# All four return the same ID
for source in ["elonmusk", "@elonmusk", "https://x.com/elonmusk", "44196397"]:
    print(normalize_to_id(source))
```

Utilízalo al inicio del flujo para que los siguientes pasos trabajen con un identificador estable.

### Detectar cambios de nombre

Si guardaste ID y nombre al recopilar los datos, vuelve a resolver periódicamente los IDs y detecta cambios:

```python theme={null}
def detect_renames(records):
    """
    records: list of {"user_id": str, "stored_handle": str}
    Returns: list of accounts that have renamed.
    """
    changes = []
    for record in records:
        try:
            current = id_to_username(record["user_id"])
        except requests.HTTPError:
            continue  # Deleted, suspended, or transient error

        if current and current.lower() != record["stored_handle"].lower():
            changes.append({
                "user_id": record["user_id"],
                "old_handle": record["stored_handle"],
                "new_handle": current,
            })
        time.sleep(0.05)
    return changes
```

Para una auditoría más completa, [`/about`](https://docs.sorsa.io/es/api-reference/usuarios/informaci%C3%B3n-de-la-cuenta) devuelve `username_change_count` y `last_username_change_at`: número de cambios y fecha del más reciente.

***

## Próximos pasos

* [Seguidores y cuentas seguidas](https://docs.sorsa.io/es/followers-and-following): muchos flujos comienzan con la conversión de IDs.
* [Geografía de la audiencia](https://docs.sorsa.io/es/Audience-Geography): `/about` acepta `user_id` y devuelve país e historial de cambios de nombre.
* [Optimización del uso de la API](https://docs.sorsa.io/es/optimizing-api-usage): evita conversiones innecesarias si necesitas el perfil completo.
* [Referencia de la API](https://docs.sorsa.io/es/api-reference-guide): especificaciones de conversión y otros endpoints.
