Saltar al contenido principal

Subir CSD

Sube los archivos del Certificado de Sello Digital (CSD) para una sucursal. Esto es necesario para poder sellar (firmar) las facturas.

Endpoint

POST https://api.lummy.io/v1/branches/{id}/csd
EntornoURL
Producciónhttps://api.lummy.io/v1/branches/{id}/csd
Sandboxhttps://sandbox.lummy.io/v1/branches/{id}/csd

Path Parameters

Path Parameters
{
"id": stringrequerido
Identificador único de la sucursal en formato UUID a la cual se le asignará el Certificado de Sello Digital. Este identificador se obtiene al crear la sucursal o mediante el endpoint de listado de sucursales.
Formato: uuid
Ejemplo: "789e8400-e29b-41d4-a716-446655449999"
}

Headers

Headers
{
"Authorization": string,requerido
Token de autenticación en formato Bearer (JWT) que valida la identidad del usuario. Este token debe ser enviado en cada petición para acceder a los recursos protegidos de la API.
Ejemplo: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
"x-organization-id": string,requerido
Identificador único en formato UUID de la organización a la cual pertenece la sucursal. Este identificador debe corresponder a una organización existente y el usuario debe tener permisos sobre ella.
Formato: uuid
Ejemplo: "550e8400-e29b-41d4-a716-446655440000"
"x-idempotency": string,requerido
Identificador único en formato UUID utilizado para garantizar la idempotencia de la operación. Si se envía el mismo UUID en una petición posterior, el sistema devolverá el resultado de la primera operación sin procesar los archivos nuevamente.
Formato: uuid
Ejemplo: "01936ff8-9c6a-7b2e-8000-123456789abc"
"Content-Type": stringrequerido
Tipo de contenido de la petición. Este endpoint requiere multipart/form-data para soportar la carga de los archivos del certificado y la llave privada.
Valores permitidos: "multipart/form-data"
Ejemplo: "multipart/form-data"
}

Body Parameters (Multipart)

Request Body
{
"cerFile": file,requerido
Archivo del certificado público del CSD en formato .cer (DER). Este archivo contiene el certificado digital emitido por el SAT y es requerido para el proceso de sellado de CFDIs. El certificado debe estar vigente y su RFC debe coincidir con el RFC de la organización. Tamaño máximo: 5MB.
Formato: binary
Ejemplo: "certificado.cer"
"keyFile": file,requerido
Archivo de la llave privada del CSD en formato .key (DER encriptado). Este archivo contiene la clave privada protegida con contraseña que se utilizará para firmar digitalmente los CFDIs. La llave debe corresponder al certificado proporcionado y será validada usando la contraseña especificada. Tamaño máximo: 5MB.
Formato: binary
Ejemplo: "llave_privada.key"
"password": stringrequerido
Contraseña de la llave privada del CSD. Esta contraseña es la misma que se configuró al momento de generar el CSD ante el SAT. Se utiliza para descifrar y validar la llave privada. La contraseña no se almacena en texto plano, solo se usa para validar y descifrar la llave durante el proceso de carga.
Longitud mínima: 1 caracteres
Ejemplo: "contraseña_secreta_123"
}

Ejemplos de Código

curl -X POST https://sandbox.lummy.io/branches/${BRANCH_ID}/csd \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "x-organization-id: ${LUMMY_ORG_ID}" \
-H "x-idempotency: $(uuidgen)" \
-F "cerFile=@/path/to/certificado.cer" \
-F "keyFile=@/path/to/llave.key" \
-F "password=contraseña_csd"
Variables de entorno

Define ACCESS_TOKEN, LUMMY_ORG_ID y BRANCH_ID en tu shell:

export ACCESS_TOKEN="your-access-token"
export LUMMY_ORG_ID="your-organization-id"
export BRANCH_ID="your-branch-id"

Respuestas

Todas las respuestas siguen el formato estándar StandardResponse.

201 Created

CSD subido y validado exitosamente.

{
"requestId": "abc123-def456",
"data": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"serialNumber": "00001000000123456789",
"validFrom": "2024-01-01T00:00:00.000Z",
"validTo": "2028-01-01T00:00:00.000Z",
"status": "active"
},
"timestamp": "2025-01-15T10:30:00.000Z",
"path": "/branches/789e8400-e29b-41d4-a716-446655449999/csd",
"method": "POST"
}

400 Bad Request

  • Archivos faltantes.
  • Contraseña incorrecta.
  • El RFC del certificado no coincide con el RFC de la sucursal.
  • Certificado caducado o revocado.
{
"requestId": "abc123-def456",
"error": {
"message": "El RFC del certificado no coincide con el RFC de la organización",
"code": "ValidationError",
"status": 400
},
"timestamp": "2025-01-15T10:30:00.000Z",
"path": "/branches/789e8400-e29b-41d4-a716-446655449999/csd",
"method": "POST"
}

404 Not Found

La sucursal especificada no existe.

{
"requestId": "abc123-def456",
"error": {
"message": "Branch not found",
"code": "NotFoundException",
"status": 404
},
"timestamp": "2025-01-15T10:30:00.000Z",
"path": "/branches/789e8400-e29b-41d4-a716-446655449999/csd",
"method": "POST"
}