# Autenticación · Referencia

> OAuth2 `client_credentials`: un token opaco de una hora.

Página: https://safeonuba.com/desarrolladores/referencia/autenticacion · API de SafeOnuba v1 (`api_version: "2026-09-24"`), en vista previa: el contrato puede cambiar.

## Pedir un token (client_credentials)

`POST /v1/oauth/token` · sin token · [ver en la web](https://safeonuba.com/desarrolladores/referencia/autenticacion#createToken)

OAuth2 `client_credentials`. El token es opaco, dura una hora y se revoca al instante al dar de baja al cliente.

### Cuerpo (`application/x-www-form-urlencoded`, esquema `TokenRequest`)

- `grant_type` (string, obligatorio) Valores: `client_credentials`.
- `client_id` (string, obligatorio)
- `client_secret` (string, obligatorio)
- `scope` (string): Separados por espacios; subconjunto de los del cliente. Sin él, todos los del cliente.

### Respuestas

- `200`: Token emitido. → `TokenResponse` (`application/json`)
- `400`: Petición mal formada o scope no permitido. → `OAuthError` (`application/json`)
- `401`: Cliente o secreto incorrectos. → `OAuthError` (`application/json`)

### Ejemplo de petición (sandbox)

```bash
curl -X POST https://sandbox.api.safeonuba.com/v1/oauth/token \
  -d grant_type=client_credentials \
  -d client_id="$SAFEONUBA_CLIENT_ID" \
  -d client_secret="$SAFEONUBA_CLIENT_SECRET" \
  -d scope="alerts:read musters:read"
```

### Respuesta de ejemplo (`200`)

```json
{
  "access_token": "at_9c1e…",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "alerts:read alerts:write musters:read"
}
```
