
# Subir un artefacto de soporte

`POST /v1/support-artifacts` · permiso `support-artifacts:write`

Adjunta un archivo HAR o un registro a un ticket de soporte. Los artefactos solo se suben desde la página Soporte del panel; las claves de API y los clientes de máquina reciben `403 insufficient_permissions`. El panel elimina los secretos en su navegador antes de la subida, y el servidor vuelve a analizar el artefacto: las cabeceras `Cookie`, `Set-Cookie`, `Authorization` y `DPoP`, los campos de token de OAuth, OIDC y SAML, las cookies `__Host-`, los JWT y los secretos con prefijo KeenAuth se reemplazan por `[redacted]`. Una clave de API de gestión (`idp_sk_`, `idp_rk_`) encontrada en el artefacto se revoca de inmediato; si la revocación falla, no se almacena nada y la subida devuelve `503`. Solo se guarda el contenido limpio, cifrado con la clave de datos del entorno, y se elimina a los 30 días. La respuesta nunca contiene el contenido ni los valores eliminados.

## Solicitud

| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| `ticket_ref` | query | sí | Referencia del ticket de soporte: 1-64 caracteres, letras, dígitos y `_ . : -`, que empiece por una letra o un dígito. |
| `kind` | query | sí | `har` (un documento JSON HAR 1.2) o `log` (texto plano). |
| `Content-Type` | header | sí | `application/octet-stream`. |
| `Content-Encoding` | header | no | `gzip` para enviar un artefacto comprimido. |
| `Idempotency-Key` | header | no | Opcional. 16-64 caracteres `[A-Za-z0-9_-]`; repetir la misma clave con el mismo cuerpo devuelve el mismo artefacto. |

El cuerpo es el propio artefacto: como máximo 50 MB sin comprimir. El cuerpo de la solicitud en la red está limitado a 11 MiB, así que comprima con gzip los artefactos más grandes. Un ticket contiene como máximo 10 artefactos.

## Respuesta

`201 Created` con el artefacto almacenado. `findings` cuenta los valores eliminados por tipo; `revocations_triggered` es el número de credenciales revocadas porque aparecían en el artefacto.

```json
{
  "id": "sart_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "ticket_ref": "SUP-48213",
  "kind": "har",
  "size_bytes": 482113,
  "sha256": "9f2b5c7d1e3a4f60718293a4b5c6d7e8f90123456789abcdef0123456789abcd",
  "findings": {"authorization": 2, "cookie": 5, "host_cookie": 3, "oauth_param": 1},
  "revocations_triggered": 0,
  "created_at": "2026-11-10T09:30:00.123456Z",
  "expires_at": "2026-12-10T09:30:00.123456Z"
}
```

## Errores

| HTTP | código | Cuándo |
|---|---|---|
| 400 | `malformed_request` | No se pudo leer el cuerpo, el flujo gzip no es válido o el `Idempotency-Key` tiene formato incorrecto. |
| 401 | `unauthenticated` | La credencial falta, no es válida o fue revocada. |
| 403 | `insufficient_permissions` | La solicitud no se hizo desde el panel, o el rol del panel no tiene `support-artifacts:write`. |
| 403 | `quota_exceeded` | El ticket ya tiene 10 artefactos. |
| 413 | `payload_too_large` | El artefacto supera 50 MB, o el cuerpo de la solicitud supera 11 MiB. |
| 415 | `unsupported_media_type` | `Content-Type` no es `application/octet-stream`, o la codificación del contenido no es `gzip`. |
| 422 | `validation_failed` | `ticket_ref` o `kind` falta o no es válido, el cuerpo está vacío, o un artefacto `har` no es un documento HAR (`/body` `invalid_har`). |
| 422 | `idempotency_key_reuse` | El `Idempotency-Key` ya se usó con un cuerpo distinto. |
| 429 | `rate_limited` | Se están procesando demasiadas subidas o se superó el límite de frecuencia; vuelva a intentarlo tras el tiempo indicado en `Retry-After`. |
| 503 | `service_unavailable` | El artefacto no se almacenó (no se pudo revocar una credencial o el almacenamiento no está disponible); vuelva a intentarlo tras el tiempo indicado en `Retry-After`. |

## Ejemplo

Las subidas son una acción del panel. La solicitud que envía el panel:

```http
POST /v1/support-artifacts?ticket_ref=SUP-48213&kind=har
Content-Type: application/octet-stream
Content-Encoding: gzip
Idempotency-Key: 2f1c9a7e-5b3d-4e8f-9a6c-1d2e3f4a5b6c

<archivo HAR comprimido con gzip>
```
