
# Conceder acceso al soporte

`POST /v1/support-access-grants` · permiso `support-access-grants:write`

Concede al personal de soporte de KeenAuth acceso limitado en el tiempo a este entorno, por ejemplo mientras trabaja en un ticket de soporte. El acceso es de solo lectura (`read`) o puede además modificar la configuración (`read_write_config`); el personal de soporte nunca escribe datos de usuarios finales. Cada uso de la autorización y cada acción del personal se registra en el registro de auditoría de gestión, y se publica un evento `support_access_grant.created`. Las autorizaciones solo pueden crearlas desde el panel un `owner` o `admin` que haya vuelto a iniciar sesión en los últimos 5 minutos; las claves de API y los clientes de máquina reciben `403 insufficient_permissions`.

## Solicitud

| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| `Idempotency-Key` | header | no | Opcional. 16-64 caracteres `[A-Za-z0-9_-]`; repetir la misma clave con el mismo cuerpo devuelve la misma autorización. |
| `scope` | string | sí | `read` (solo lectura) o `read_write_config` (también puede modificar la configuración). |
| `duration_hours` | integer | sí | Duración en horas, 1-72. |
| `ticket_ref` | string | sí | Referencia del ticket de soporte: 1-200 caracteres ASCII imprimibles, sin espacios al principio ni al final. |
| `allowed_regions_of_staff` | array \| null | no | Solo Enterprise. Solo el personal ubicado en estas regiones (`eu`, `us`) puede usar la autorización; si se omite o es `null`, no hay restricción. |

Cuerpo de la solicitud:

```json
{
  "scope": "read",
  "duration_hours": 24,
  "ticket_ref": "SUP-48213",
  "allowed_regions_of_staff": ["eu"]
}
```

## Respuesta

`201 Created` con la nueva autorización.

```json
{
  "id": "sag_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "scope": "read",
  "status": "active",
  "ticket_ref": "SUP-48213",
  "allowed_regions_of_staff": ["eu"],
  "granted_by": "du_01j9xk2p5n7q9s1t3v5w7y9z1b",
  "created_at": "2026-10-12T09:30:00.123456Z",
  "expires_at": "2026-10-13T09:30:00.123456Z",
  "revoked_at": null
}
```

## Errores

| HTTP | código | Cuándo |
|---|---|---|
| 400 | `malformed_request` | El cuerpo no es JSON válido o el `Idempotency-Key` tiene formato incorrecto. |
| 403 | `insufficient_permissions` | La solicitud no se hizo desde el panel por un `owner` o `admin`, o la credencial no tiene el permiso requerido. |
| 403 | `plan_feature_unavailable` | `allowed_regions_of_staff` requiere el plan Enterprise. |
| 422 | `validation_failed` | Un campo no es válido (`scope`, `duration_hours` fuera de 1-72, `ticket_ref`, `allowed_regions_of_staff`). |
| 422 | `idempotency_key_reuse` | El `Idempotency-Key` ya se usó con un cuerpo distinto. |
| 401 | `unauthenticated` | La credencial falta, no es válida o fue revocada. |
| 429 | `rate_limited` | Se superó el límite de frecuencia; vuelva a intentarlo tras el tiempo indicado en `Retry-After`. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; vuelva a intentarlo tras el tiempo indicado en `Retry-After`. |

## Ejemplo

Crear y revocar son acciones del panel. La solicitud que envía el panel:

```http
POST /v1/support-access-grants
Content-Type: application/json
Idempotency-Key: 2f1c9a7e-5b3d-4e8f-9a6c-1d2e3f4a5b6c

{
  "scope": "read",
  "duration_hours": 24,
  "ticket_ref": "SUP-48213",
  "allowed_regions_of_staff": ["eu"]
}
```
