# Cadastrar certificado

`POST /v1/cofre/certificados`

Envia o certificado A1 (`.pfx`) e a senha para o cofre. O arquivo e a senha não ficam no Sync: a resposta traz só os metadados. Um certificado ativo por titular — para renovar, revogue o antigo antes.

## Corpo (`multipart/form-data`)

| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| `arquivo` | arquivo | sim | Arquivo `.pfx` do certificado A1 (até 1 MB) |
| `rotulo` | texto | não | Nome para reconhecer o certificado na Conta (padrão `Certificado A1`) |
| `senha` | texto | sim | Senha do certificado |

## Respostas

| HTTP | Significa |
|---|---|
| 201 | Criado |
| 422 | Corpo ou parâmetros com formato inválido (`detail` lista os campos) |

### Exemplo de resposta

```json
{
  "id": "5b1e7c2a-3f4d-4c8e-9a1b-2d6f0e8c7a15",
  "tipo": "certificado",
  "rotulo": "A1 Dra. Fulana",
  "criada_em": "2026-09-26T12:00:00+00:00",
  "padrao": false,
  "titular": "FULANA DE TAL",
  "valido_ate": "2027-03-01",
  "autenticacoes": [],
  "autenticacoes_recusadas": []
}
```

## Erros

Recusas vêm como `{"detail": {"erro": "<código>", "mensagem": "…"}}`.

| HTTP | `erro` | Significa |
|---|---|---|
| 401 | — | Chave ausente ou inválida |
| 409 | `titular_ja_cadastrado` | Já há certificado ativo deste titular. Revogue o antigo antes |
| 413 | `arquivo_grande_demais` | O arquivo passa de 1 MB |
| 422 | `dados_invalidos` | O cofre recusou o arquivo ou a senha; a `mensagem` diz o motivo |
| 502 | `cofre_indisponivel` | O cofre não respondeu agora. Tente de novo em instantes |

## Exemplos de requisição

### Bash

```bash
curl -X POST 'https://sync.lops.com.br/v1/cofre/certificados' \
  -H "Authorization: Bearer $SYNC_CHAVE" \
  -F arquivo=@certificado.pfx \
  -F senha='****' \
  -F rotulo='A1 Dra. Fulana'
```

### JavaScript

```javascript
import { readFileSync } from "node:fs";

const form = new FormData();
form.append("arquivo", new Blob([readFileSync("certificado.pfx")]), "certificado.pfx");
form.append("senha", "****");
form.append("rotulo", "A1 Dra. Fulana");

const resposta = await fetch("https://sync.lops.com.br/v1/cofre/certificados", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SYNC_CHAVE}`,
  },
  body: form,
});
console.log(resposta.status, await resposta.json());
```

### Python

```python
import os

import requests

resposta = requests.post(
    "https://sync.lops.com.br/v1/cofre/certificados",
    headers={"Authorization": f"Bearer {os.environ['SYNC_CHAVE']}"},
    files={"arquivo": open("certificado.pfx", "rb")},
    data={
        "senha": "****",
        "rotulo": "A1 Dra. Fulana",
    },
)
print(resposta.status_code, resposta.json())
```

### PHP

```php
<?php
$ch = curl_init('https://sync.lops.com.br/v1/cofre/certificados');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('SYNC_CHAVE'),
    ],
    CURLOPT_POSTFIELDS => [
        'arquivo' => new CURLFile('certificado.pfx'),
        'senha' => '****',
        'rotulo' => 'A1 Dra. Fulana',
    ],
]);
$corpo = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
var_dump($status, json_decode($corpo, true));
```
