---
title: Subir certificado
description: El .p12 de tu PSC queda cifrado con envelope encryption — paso a paso por dashboard, API y CLI.
url: https://notta.cl/docs/onboarding-cert
related:
  - https://notta.cl/docs
  - https://notta.cl/docs/authentication
  - https://notta.cl/docs/errors
---

> Documentación de Notta en markdown. Índice completo: https://notta.cl/llms.txt — corpus entero: https://notta.cl/llms-full.txt

# Subir certificado

El certificado digital `.p12` es lo que Notta usa para firmar cada DTE en
nombre tuyo. Sin él, no se puede emitir.

## Requisitos

- Archivo `.p12` o `.pfx` válido emitido por un PSC (Acepta, eCertChile,
  IDOK, eFactor, etc).
- Password del `.p12` — el mismo que te entregó el PSC.
- La organización donde subes el cert debe matchear el RUT del titular del
  certificado.

## Vía dashboard

1. Abre [app.notta.cl/app/certificates](https://app.notta.cl/app/certificates).
2. Arrastra tu `.p12` al recuadro de carga.
3. Ingresa el password.
4. Etiqueta el cert ("Producción", "Backup", etc).
5. Click **Subir**.

Vas a ver un check con la fecha de expiración y el RUT del titular. El sistema
te avisa 30 días antes de que expire.

## Vía API

Este endpoint hoy autentica con tu sesión del dashboard, no con API key — el
upload programático con Bearer está en camino (mientras tanto, un Bearer responde
`412 org.required`). El shape del request y la respuesta:

```bash
curl -X POST https://app.notta.cl/api/v1/certificates \
  -H "Authorization: Bearer ntt_cert_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -F "file=@./mi-cert.p12" \
  -F "password=********" \
  -F "label=Producción"
```

Salida esperada (`201 Created`):

```json
{
  "data": {
    "id": "01957a91-0b50-7000-8000-cccc00000001",
    "label": "Producción",
    "not_after": "2027-03-12T00:00:00.000Z"
  }
}
```

El `id` de la respuesta es el que va en el header `X-Cert-Id` al emitir —
anótalo (también lo ves en el dashboard).

## Vía CLI

```bash
notta cert upload ./mi-cert.p12 \
  --password ******** \
  --label "Producción"
```

El binario `notta` está en proceso de publicación en npm; mientras tanto el
dashboard y la API cubren el flujo completo. Los comandos están en
[CLI Reference](/docs/cli-reference).

## Seguridad

- Tu `.p12` se cifra **antes** de tocar disco con AES-256-GCM.
- El password nunca se persiste — sólo se usa en memoria.
- Cada operación que descifra el cert escribe un entry en `audit_log`.
- Rotar la KEK no requiere re-subir el cert — sólo re-wrapping del DEK.

## Errores comunes

| Código | Cuándo | Acción |
|---|---|---|
| `cert.invalid_request` | Falta `file`, `password` o `label` en el form-data | Manda los tres campos y reintenta |
| `cert.duplicate` | El mismo `.p12` ya está subido en tu org | Usa el cert existente o sube uno distinto |
| `org.required` | Tu cuenta todavía no tiene organización | Completa el onboarding de la org primero |
| `cert_expired` | El cert venció (se detecta al emitir) | Sube el cert renovado |

## Próximos pasos

- **[Tu primer DTE](/docs)** — sigue el quickstart desde el paso 2: cargar folios (CAF) y emitir tu primera Factura 33.
- [Autenticación](/docs/authentication) — API keys, prefijos por entorno, scopes y rotación.
- [Errores](/docs/errors) — catálogo completo con `next_action` por código.
