---
title: "Identificar la llave y la cuenta (whoami)"
method: GET
path: "/me"
tags: ["account"]
---

# Identificar la llave y la cuenta (whoami)

`GET /me`

## Request

- Base URL: `https://api.enviadores.com.mx/api/v1`
- URL: `https://api.enviadores.com.mx/api/v1/me`
- Auth: HTTP bearer

Quién eres desde el punto de vista de la API: la cuenta, si la conexión es de **prueba** (`ek_test_`) o de **producción** (`ek_live_`), los scopes que la llave realmente porta en ESTA petición, el saldo disponible y las capacidades de la superficie.

Es el endpoint de autodiagnóstico: cuando algo responde `403 INSUFFICIENT_SCOPE`, compara `key.scopes` con el scope que nombró el error; cuando dudes si una guía es real, mira `account.mode`.

**Cualquier llave válida puede llamarlo, sin importar sus scopes** — un whoami que pudiera responder 403 por falta de permiso no serviría para su único propósito. Aun así no expone nada nuevo: `balance.available` es el mismo número de `GET /balance` (misma lectura), y el resto son hechos sobre tu propia llave. **Nunca** devuelve el secreto ni su hash ni su prefijo, ni la allowlist de PDVs, ni correo/teléfono/rol.

`key.scopes` es el conjunto EFECTIVO: una llave creada con "los permisos por omisión" (`scopes_mode: default`) se re-resuelve contra los scopes por omisión vigentes en cada petición, así que aquí ves lo que el gate acaba de aplicar. Una llave que alguien restringió a mano (`scopes_mode: explicit`) queda congelada como se creó.

`account.tier_label` es el escalón de verificación de las cuentas de registro propio (`T1`…`T4`); es `null` para cuentas creadas por nuestro equipo, que no están en esa escalera, y también si la consulta de verificación no está disponible.

`capabilities` describe la superficie, no la cuenta: `pickups` sigue el interruptor de recolecciones (siempre `true` en sandbox), y `international`/`multi_package` se derivan de las mismas validaciones que aplica `POST /shipments`, así que no pueden desincronizarse de la realidad.

En modo de prueba, `balance.available` es el saldo COMPUTADO del sandbox.

## Headers

- `X-PDV-ID` string

## Response `200`

Identidad de la llave y la cuenta.

- object
  - `success` unknown, required
  - `data` object, required
    - `account` object, required
      - `id` string, required: Id del usuario dueño de la llave.
      - `name` string, nullable, required: Nombre visible de la cuenta (razón social, nombre de la persona, o el usuario). Nunca correo ni teléfono.
      - `mode` 'test' | 'live', required: `test` = sandbox (nada es real); `live` = producción.
      - `account_type` 'customer' | 'staff', required: Dos valores públicos: cuenta de cliente, o cuenta de nuestro mostrador. El rol interno no se expone.
      - `tier_label` 'T0' | 'T1' | 'T2' | 'T3' | 'T4' | 'null', nullable, required: Escalón de verificación de una cuenta de registro propio. `null` si la cuenta no está en la escalera (creada por nuestro equipo) o si la consulta no está disponible.
    - `key` object, required
      - `id` string, required: Id público de la llave (no es el secreto).
      - `label` string, nullable, required: Etiqueta que le puso su dueño.
      - `mode` 'test' | 'live', required
      - `scopes` string[], required: Los scopes EFECTIVOS de esta petición — lo que el gate acaba de aplicar.
      - `scopes_mode` 'default' | 'explicit', required: `default`: la llave se creó con los permisos por omisión y se actualiza sola cuando aparecen nuevos. `explicit`: alguien la restringió al crearla; queda congelada así.
      - `spend_cap_daily_mxn` number, nullable, required: Tope de gasto en ventana móvil de 24 h, o `null` si no tiene.
      - `rate_limit_tier` 'standard' | 'elevated', required
    - `balance` object, required
      - `available` number, required: Lo gastable ahora mismo — el mismo número que `GET /balance`. Para el desglose (`held`, total, `scope`) usa ese endpoint.
      - `currency` 'MXN', required
    - `capabilities` object, required
      - `pickups` boolean, required: Si esta conexión puede solicitar recolecciones. Siempre `true` en sandbox.
      - `international` boolean, required: Si la API acepta destinos fuera de México. Hoy `false` (v1 es doméstico MX).
      - `multi_package` boolean, required: Si una solicitud puede llevar más de un paquete. Se deriva de la misma validación que aplica `POST /shipments`.
      - `webhooks` boolean, required: Si existen webhooks salientes en esta superficie. Hoy `false`: consulta con `GET /shipments` o `GET /tracking/{guia}`.
  - `requestId` string, required: Correlación de logs; también en el header `X-Request-Id`.

## Other responses

- `401`: `UNAUTHORIZED` — credencial Bearer ausente/mal formada o llave desconocida/revocada (respuesta idéntica en ambos casos).
- `403`: `INSUFFICIENT_SCOPE` — a la llave le falta el scope requerido · `PDV_NOT_ALLOWED` — violación del carril X-PDV-ID. Nota de orden: el limitador por llave corre ANTES del gate de scope, así que una petición con scope incorrecto y el bucket agotado responde `429 RATE_LIMITED` (el 429 tiene precedencia sobre este 403).
- `404`: `NOT_FOUND` — ruta desconocida, recurso ajeno/inexistente, o la API pública no está habilitada (respuestas indistinguibles por diseño).
- `429`: `RATE_LIMITED` — bucket de la llave agotado. Espera `Retry-After` s (`details.retry_after_ms` para el hint fino). El limitador corre antes del gate de scope, por lo que un 429 tiene precedencia sobre un 403 `INSUFFICIENT_SCOPE`.
- `500`: `SERVER_ERROR` — falla interna (p. ej. lectura de base de datos). Es transitoria; reintenta con backoff.

---

[API](https://skmtc.dev/enviadores/apis/enviadores-public-api.md) · [All operations](https://skmtc.dev/enviadores/apis/enviadores-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/enviadores/apis/enviadores-public-api/revisions/3633f08c889c?raw)
