Cancelación por CSD
Solicita la cancelación de un CFDI firmando la petición con tus Certificados de Sello Digital (CSD).
Cancela un CFDI con tus Certificados de Sello Digital.
Request
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
uuid | string | Sí | UUID del CFDI que quieres cancelar. |
motivo | string | No | Motivo de cancelación del SAT. Por defecto 03. |
folio_sustituto | string | Condicional | UUID del CFDI que sustituye al cancelado. Obligatorio cuando motivo es 01. |
b64Cer | string | No | Certificado del emisor en formato PEM. Si se omite, se usa el CSD configurado en tu cuenta. |
b64Key | string | No | Llave privada del emisor en formato PEM. Si se omite, se usa el CSD configurado en tu cuenta. |
password | string | Condicional | Contraseña de la llave privada. Obligatoria si tu CSD tiene contraseña. |
Recomendado: usa el CSD de tu cuenta
Si ya cargaste tus CSD en el panel de Timbra, no envíes b64Cer, b64Key ni password. La API los toma automáticamente de tu cuenta. Es la forma más segura y evita manejar certificados en cada petición.
Motivos de cancelación
| Clave | Motivo |
|---|---|
01 | Comprobante emitido con errores con relación. Requiere folio_sustituto. |
02 | Comprobante emitido con errores sin relación. |
03 | No se llevó a cabo la operación. |
04 | Operación nominativa relacionada en una factura global. |
Ejemplo
json
{
"uuid": "A1B2C3D4-5E6F-7890-ABCD-EF1234567890",
"motivo": "02",
"folio_sustituto": ""
}Para cancelar con motivo 01:
json
{
"uuid": "A1B2C3D4-5E6F-7890-ABCD-EF1234567890",
"motivo": "01",
"folio_sustituto": "B2C3D4E5-6F70-8901-BCDE-F23456789012"
}Ejemplos
bash
curl -X POST "https://dashboard.timbra.com.mx/api/masivo/cfdi33/cancel/csd" \
-H "Authorization: Bearer tmb_live_tu_api_key_aqui" \
-H "Content-Type: application/json" \
-d '{
"uuid": "A1B2C3D4-5E6F-7890-ABCD-EF1234567890",
"motivo": "02",
"folio_sustituto": ""
}'js
const response = await fetch(
'https://dashboard.timbra.com.mx/api/masivo/cfdi33/cancel/csd',
{
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TIMBRA_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
uuid: 'A1B2C3D4-5E6F-7890-ABCD-EF1234567890',
motivo: '02',
folio_sustituto: ''
})
}
)
const result = await response.json()
if (!response.ok) {
throw new Error(result.message)
}
console.log('Acuse:', result.data.acuse)python
import os
import requests
response = requests.post(
"https://dashboard.timbra.com.mx/api/masivo/cfdi33/cancel/csd",
headers={
"Authorization": f"Bearer {os.environ['TIMBRA_API_KEY']}",
"Content-Type": "application/json",
},
json={
"uuid": "A1B2C3D4-5E6F-7890-ABCD-EF1234567890",
"motivo": "02",
"folio_sustituto": "",
},
)
result = response.json()
if response.status_code != 200:
raise Exception(result["message"])
print("Acuse:", result["data"]["acuse"])Response
json
{
"status": "success",
"data": {
"msg": "Se ha cancelado correctamente",
"uuid": "A1B2C3D4-5E6F-7890-ABCD-EF1234567890",
"acuse": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Acuse ...>"
}
}data.acuse contiene el acuse de cancelación en XML.
Errores
| HTTP | Causa |
|---|---|
400 | Falta uuid. |
400 | No hay CSD configurados en la cuenta y no se enviaron b64Cer y b64Key. |
400 | El SAT o el PAC rechazaron la cancelación. El detalle viene en message. |
401 | La API Key falta, es inválida o fue revocada. |
500 | Error interno al procesar la cancelación. |
Ejemplo cuando faltan los CSD:
json
{
"status": "error",
"message": "No se encontraron los Certificados de Sello Digital (CSD) para realizar la cancelación."
}Notas
- La cancelación no consume timbres.
- En modo Test, el RFC del emisor debe ser un RFC de prueba del SAT y el CSD debe ser de pruebas. No uses certificados de producción en Sandbox.
- Si no tienes tus CSD a la mano, usa Cancelación por UUID.
- Después de cancelar, guarda el acuse. Es el comprobante de que la operación se realizó correctamente.