Ir al contenido

POST /api/emisores/certificado/cargar/

POST /api/emisores/certificado/cargar/

Sube un certificado .p12 a Backblaze B2 y crea el registro.

POST /api/emisores/certificado/cargar/ (multipart con emisor, archivo y clave).

El .p12 es material criptográfico sensible: se almacena siempre en B2 (dev y prod), nunca en disco local. Si B2 no está configurado se rechaza la subida (400) para no escribir el certificado en disco.

Antes de almacenarlo se valida el .p12 (integridad, clave, vigencia, que la llave sea RSA y que el NIT corresponda al emisor); ver validar_pkcs12. Las fechas de vigencia se toman del propio certificado.

Cada emisor tiene un certificado, y lo impone la base (el emisor del certificado es OneToOne). Si ya hay uno, la carga se rechaza con un 400 que dice cuál borrar: renovar es dos pasos explícitos, no un reemplazo silencioso, porque subir un .p12 no debería destruir el que estaba sin que nadie lo pida.

operationId: emisores_certificado_cargar_create

Cualquiera de estas credenciales:

  • LlaveApi — Llave de API de una integración. El valor completo es Api-Key <prefijo>.<secreto>, tal como lo imprime manage.py crear_llave_api. La llave alcanza exactamente los mismos emisores que la persona a cuyo nombre se creó.

Tipo de contenido: application/json · obligatorio.

CampoTipoObligatorioDescripción
emisorinteger
aliasstringno
archivostring (binary)
clavestring
vigente_desdestring (date)noAdmite null.
vigente_hastastring (date)noAdmite null.
Ventana de terminal
curl -X POST "https://api.rededoc.uk/api/emisores/certificado/cargar/" \
-H "Authorization: <llaveapi>" \
-H "Content-Type: application/json" \
-d '{
"emisor": 1,
"alias": "texto",
"archivo": "texto",
"clave": "texto",
"vigente_desde": "2026-01-31",
"vigente_hasta": "2026-01-31"
}'
CódigoDescripción
200
400Error
401Error
429Error
CampoTipoDescripción
idintegerSolo lectura.
emisorinteger
aliasstring
nombre_archivostringSolo lectura.
vigente_desdestring (date)Admite null.
vigente_hastastring (date)Admite null.
{
"id": 1,
"emisor": 1,
"alias": "texto",
"nombre_archivo": "texto",
"vigente_desde": "2026-01-31",
"vigente_hasta": "2026-01-31"
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}

RedEDoc es un servicio de Semántica Digital S.A.S.