Servicio que permite cancelar de manera masiva facturas de retenciones e información de pagos con sus complementos a través de un Web Service de tipo REST. Esto se realiza enviando un archivo XML o utilizando Certificados de Sellos Digitales (CSD).
URL´s
💡 Para este servicio también puedes utilizar los CSD de pruebas proporcionados por el SAT.
ℹ️ Nota: Estos endpoints corresponden al servicio de cancelación masiva de retenciones (/retencion/cancel/masiva/). Son independientes a los endpoint de cancelación de retenciones convencional.
Valores válidos del campo motivo
El campo motivo es requerido en todos los métodos de cancelación. Los valores aceptados son:
Tabla con los motivos.
| Clave | Descripción | ¿Requiere “FolioSustitución”? |
|---|---|---|
| 01 | Comprobante emitido con errores con relación | ✅ Sí, obligatorio |
| 02 | Comprobante emitido con errores sin relación | ❌ No enviarse |
| 03 | No se llevó a cabo la operación | ❌ No enviarse |
| 04 | Operación nominativa relacionada en factura global | ❌ No enviarse |
⚠️ Importante: folioSustitucion solo es requerido cuando motivo = "01". Para cualquier otro motivo, este campo debe enviarse como null u omitirse.
Cancelación masiva por XML
Servicio para cancelar enviando un XML con la información y folios de las facturas a cancelar.
🔗 Endpoint
| Método | Ruta |
|---|---|
| POST | /retencion/cancel/masiva/xml |
🔐 Autenticación y Headers
| Header | Value |
|---|---|
| Authorization | Bearer Token |
| Content-Type | multipart/form-data |
📋 Parámetros Form-Data
| Propiedad | Uso | Descripción |
|---|---|---|
xml | Requerido | XML estructurado conforme al estándar anexo 20 (pág. 62, en el portal oficial del SAT), con la información de los comprobantes a cancelar |
Ejemplo Request
curl --request POST \ --url https://services.test.sw.com.mx/retencion/cancel/masiva/xml \ --header 'Authorization: Bearer $token' \ --form 'xml=@/ruta/cancelacion.xml'
<Cancelacion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.sat.gob.mx/esquemas/retencionpago/1" Fecha="2026-06-25T10:35:00" RfcEmisor="EKU9003173C9">
<Folios>
<Folio UUID="c15da76c-94a8-43ee-9a1d-ca591985d587" Motivo="02" FolioSustitucion=""/>
</Folios>
<Folios>
<Folio UUID="9bac1b97-3130-4a04-b027-84747f099e10" Motivo="01" FolioSustitucion="1fae5735-ca51-4be4-9180-827c44fdb227"/>
</Folios>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>Rndk9QwYQRV/rZVWv/YUzIYgSzk=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>B63iL57kj7QBJNoc/1zNVCFIuxt0sxGrJgAHPidlfzQdMurY+BLXR3DuNYbL6hlQTbcP4OCWLi/0ATt139hrEeMrNr4R4YTlZJLNReB8bGXj0dnFhjN9/zQxEg0Sk6FRYSCrGR8P8LChRNeATYLduBGC92Sws4ORMd+EyFR0UBu4xPB/seS0M61aARYd6/Npod60cV7T9dFGV5J2/W+AlEJYOtBu1GxATeiKo9VdANHFLi8b/Ywum8HfRpqLODk601wn9u+sV6ORpvXQ9yXUZ7GvnCbf+2j6tRMqfBIk42ixGwXhJxPfiRxKmFRzvGn37Z/QfYg2CRDQYJ0L1pwGwA==</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIIFsDCCA5igAwIBAgIUMzAwMDEwMDAwMDA1MDAwMDM0MTYwDQYJKoZIhvcNAQELBQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFETUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0wGwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWxpejEOMAwGA1UEEQwFMDYzNzAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhDT1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3BvbnNhYmxlOiBBQ0RNQS1TQVQwHhcNMjMwNTE4MTE0MzUxWhcNMjcwNTE4MTE0MzUxWjCB1zEnMCUGA1UEAxMeRVNDVUVMQSBLRU1QRVIgVVJHQVRFIFNBIERFIENWMScwJQYDVQQpEx5FU0NVRUxBIEtFTVBFUiBVUkdBVEUgU0EgREUgQ1YxJzAlBgNVBAoTHkVTQ1VFTEEgS0VNUEVSIFVSR0FURSBTQSBERSBDVjElMCMGA1UELRMcRUtVOTAwMzE3M0M5IC8gVkFEQTgwMDkyN0RKMzEeMBwGA1UEBRMVIC8gVkFEQTgwMDkyN0hTUlNSTDA1MRMwEQYDVQQLEwpTdWN1cnNhbCAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtmecO6n2GS0zL025gbHGQVxznPDICoXzR2uUngz4DqxVUC/w9cE6FxSiXm2ap8Gcjg7wmcZfm85EBaxCx/0J2u5CqnhzIoGCdhBPuhWQnIh5TLgj/X6uNquwZkKChbNe9aeFirU/JbyN7Egia9oKH9KZUsodiM/pWAH00PCtoKJ9OBcSHMq8Rqa3KKoBcfkg1ZrgueffwRLws9yOcRWLb02sDOPzGIm/jEFicVYt2Hw1qdRE5xmTZ7AGG0UHs+unkGjpCVeJ+BEBn0JPLWVvDKHZAQMj6s5Bku35+d/MyATkpOPsGT/VTnsouxekDfikJD1f7A1ZpJbqDpkJnss3vQIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAFaUgj5PqgvJigNMgtrdXZnbPfVBbukAbW4OGnUhNrA7SRAAfv2BSGk16PI0nBOr7qF2mItmBnjgEwk+DTv8Zr7w5qp7vleC6dIsZFNJoa6ZndrE/f7KO1CYruLXr5gwEkIyGfJ9NwyIagvHHMszzyHiSZIA850fWtbqtythpAliJ2jF35M5pNS+YTkRB+T6L/c6m00ymN3q9lT1rB03YywxrLreRSFZOSrbwWfg34EJbHfbFXpCSVYdJRfiVdvHnewN0r5fUlPtR9stQHyuqewzdkyb5jTTw02D2cUfL57vlPStBj7SEi3uOWvLrsiDnnCIxRMYJ2UA2ktDKHk+zWnsDmaeleSzonv2CHW42yXYPCvWi88oE1DJNYLNkIjua7MxAnkNZbScNw01A6zbLsZ3y8G6eEYnxSTRfwjd8EP4kdiHNJftm7Z4iRU7HOVh79/lRWB+gd171s3d/mI9kte3MRy6V8MMEMCAnMboGpaooYwgAmwclI2XZCczNWXfhaWe0ZS5PmytD/GDpXzkX0oEgY9K/uYo5V77NdZbGAjmyi8cE2B2ogvyaN2XfIInrZPgEffJ4AB7kFA2mwesdLOCh0BLD9itmCve3A1FGR4+stO2ANUoiI3w3Tv2yQSg4bjeDlJ08lXaaFCLW2peEXMXjQUk7fmpb5MNuOUTW6BE=</X509Certificate>
<X509IssuerSerial>
<X509IssuerName>CN=AC UAT, O=SERVICIO DE ADMINISTRACION TRIBUTARIA, OU=SAT-IES Authority, E=oscar.martinez@sat.gob.mx, STREET=3ra cerrada de caliz, PostalCode=06370, C=MX, ST=CIUDAD DE MEXICO, L=COYOACAN, OID.2.5.4.45=2.5.4.45, OID.1.2.840.113549.1.9.2=responsable: ACDMA-SAT</X509IssuerName>
<X509SerialNumber>3330303031303030303030353030303033343136</X509SerialNumber>
</X509IssuerSerial>
</X509Data>
</KeyInfo>
</Signature>
</Cancelacion>
Ejemplo Response
{
"data": {
"folioSeguimiento": "1C4C60BC-0BA1-40FF-8D1F-F4DC80B52E25"
},
"status": "success"
}
{
"message": "CACFDI33 - Problemas con los campos.",
"messageDetail": "La solicitud no puede ser nula.",
"data": null,
"status": "error"
}
| Atributo | Tipo | Descripción |
|---|---|---|
| message | String | Código regresado cuando existe un error. |
| messageDetail | String | Mensaje más descriptivo del error cuando existe uno. |
| data | object/null | Contiene la información del resultado de la cancelación masiva. |
| status | String | “success” o “error” |
Cancelación masiva por CSD
Cancelación masiva enviando los certificados CSD del emisor en Base64 directamente en el body del request, junto con el arreglo de folios a cancelar.
🔗 Endpoint
| Método | Ruta |
|---|---|
| POST | /retencion/cancel/masiva/csd |
🔐 Autenticación y Headers
| Header | Value |
|---|---|
| Authorization | Bearer Token |
| Content-Type | application/json |
🧾 Parámetros JSON
| Propiedad | Uso | Descripción |
|---|---|---|
| rfc | Requerido | RFC del emisor |
| b64Cer | Requerido | Certificado .cer del emisor en Base64 |
| b64Key | Requerido | Llave privada .key del emisor en Base64 |
| password | Requerido | Contraseña del certificado |
| folios | Requerido | Arreglo de folios a cancelar |
| folios[].uuid | Requerido | UUID de la retención a cancelar |
| folios[].motivo | Requerido | Clave del motivo de cancelación |
| folios[].folioSustitucion | Condicional | UUID del comprobante que sustituye. Requerido solo cuando motivo = “01” |
Ejemplo Request
curl --request POST \
--url https://services.test.sw.com.mx/retencion/cancel/masiva/csd \
--header 'Authorization: Bearer $token' \
--header 'Content-Type: application/json' \
--data '{
"rfc": "EKU9003173C9",
"b64Cer": "$cer",
"b64Key": "$key",
"password": "12345678a",
"folios": [
{
"uuid": "286C2251-C152-4530-9D80-B7E3376B2D17",
"motivo": "01",
"folioSustitucion": "FE4E71B0-8959-4FB9-8091-F5AC4FB0FEF8"
}
]
}'
curl --request POST \
--url https://services.test.sw.com.mx/retencion/cancel/masiva/csd \
--header 'Authorization: Bearer $token' \
--header 'Content-Type: application/json' \
--data '{
"rfc": "EKU9003173C9",
"b64Cer": "$cer",
"b64Key": "$key",
"password": "12345678a",
"folios": [
{
"uuid": "286C2251-C152-4530-9D80-B7E3376B2D17",
"motivo": "02",
"folioSustitucion": null
}
]
}'
Ejemplo Response
{
"data": {
"folioSeguimiento": "1C4C60BC-0BA1-40FF-8D1F-F4DC80B52E25"
},
"status": "success"
}
{
"message": "CACFDI33 - Problemas con los campos.",
"messageDetail": "La solicitud no puede ser nula.",
"data": null,
"status": "error"
}
| Atributo | Tipo | Descripción |
|---|---|---|
| message | String | Código regresado cuando existe un error. |
| messageDetail | String | Mensaje más descriptivo del error cuando existe uno. |
| data | object/null | Contiene la información del resultado de la cancelación masiva. |
| status | String | “success” o “error” |
Cancelación masiva por PFX
Cancelación masiva enviando el archivo PFX (combinación de certificado y llave privada) en Base64, junto con el arreglo de folios a cancelar.
🔗 Endpoint
| Método | Ruta |
|---|---|
| POST | /retencion/cancel/masiva/pfx |
🔐 Autenticación y Headers
| Header | Value |
|---|---|
| Authorization | Bearer Token |
| Content-Type | application/json |
🧾 Parámetros JSON
| Propiedad | Uso | Descripción |
|---|---|---|
| rfc | Requerido | RFC del emisor |
| b64Pfx | Requerido | Archivo PFX del emisor en Base64 (combina .cer y .key) |
| password | Requerido | Contraseña del archivo PFX |
| folios | Requerido | Arreglo de folios a cancelar |
| folios[].uuid | Requerido | UUID de la retención a cancelar |
| folios[].motivo | Requerido | Clave del motivo de cancelación |
| folios[].folioSustitucion | Condicional | UUID del comprobante que sustituye. Requerido solo cuando motivo = “01” |
Ejemplo Request
curl --request POST \
--url https://services.test.sw.com.mx/retencion/cancel/masiva/pfx \
--header 'Authorization: Bearer $token' \
--header 'Content-Type: application/json' \
--data '{
"rfc": "EKU9003173C9",
"b64Pfx": "$pfx",
"password": "12345678a",
"folios": [
{
"uuid": "286C2251-C152-4530-9D80-B7E3376B2D17",
"motivo": "01",
"folioSustitucion": "FE4E71B0-8959-4FB9-8091-F5AC4FB0FEF8"
}
]
}'
curl --request POST \
--url https://services.test.sw.com.mx/retencion/cancel/masiva/pfx \
--header 'Authorization: Bearer $token' \
--header 'Content-Type: application/json' \
--data '{
"rfc": "EKU9003173C9",
"b64Pfx": "$pfx",
"password": "12345678a",
"folios": [
{
"uuid": "286C2251-C152-4530-9D80-B7E3376B2D17",
"motivo": "02",
"folioSustitucion": null
}
]
}'
Ejemplo Response
{
"data": {
"folioSeguimiento": "1C4C60BC-0BA1-40FF-8D1F-F4DC80B52E25"
},
"status": "success"
}
{
"message": "CACFDI33 - Problemas con los campos.",
"messageDetail": "La solicitud no puede ser nula.",
"data": null,
"status": "error"
}
| Atributo | Tipo | Descripción |
|---|---|---|
| message | String | Código regresado cuando existe un error. |
| messageDetail | String | Mensaje más descriptivo del error cuando existe uno. |
| data | object/null | Contiene la información del resultado de la cancelación masiva. |
| status | String | “success” o “error” |
Cancelación masiva por UUID
Cancelación masiva utilizando el certificado del emisor previamente cargado en la cuenta. El RFC del emisor se incluye directamente en la ruta del endpoint.
⚠️ Importante: El rfc del emisor va en la ruta de la petición (/retencion/cancel/masiva/{rfc}), no en el body.
🔗 Endpoint
| Método | Ruta |
|---|---|
| POST | /retencion/cancel/masiva/{rfc} |
🔐 Autenticación y Headers
| Header | Value |
|---|---|
| Authorization | Bearer Token |
| Content-Type | application/json |
📍 Parámetros Path
| Propiedad | Uso | Descripción |
|---|---|---|
| rfc | Requerido | RFC del emisor |
🧾 Parámetros JSON (Body)
| Propiedad | Uso | Descripción |
|---|---|---|
| folios | Requerido | Arreglo de folios a cancelar |
| folios[].uuid | Requerido | UUID de la retención a cancelar |
| folios[].motivo | Requerido | Clave del motivo de cancelación |
| folios[].folioSustitucion | Condicional | UUID del comprobante que sustituye. Requerido solo cuando motivo = “01” |
Ejemplo Request
curl --request POST \
--url https://services.test.sw.com.mx/retencion/cancel/masiva/EKU9003173C9 \
--header 'Authorization: Bearer $token' \
--header 'Content-Type: application/json' \
--data '{
"folios": [
{
"uuid": "286C2251-C152-4530-9D80-B7E3376B2D17",
"motivo": "01",
"folioSustitucion": "FE4E71B0-8959-4FB9-8091-F5AC4FB0FEF8"
}
]
}'
curl --request POST \
--url https://services.test.sw.com.mx/retencion/cancel/masiva/EKU9003173C9 \
--header 'Authorization: Bearer $token' \
--header 'Content-Type: application/json' \
--data '{
"folios": [
{
"uuid": "286C2251-C152-4530-9D80-B7E3376B2D17",
"motivo": "02",
"folioSustitucion": null
}
]
}'
Ejemplo Response
{
"data": {
"folioSeguimiento": "1C4C60BC-0BA1-40FF-8D1F-F4DC80B52E25"
},
"status": "success"
}
{
"message": "CACFDI33 - Problemas con los campos.",
"messageDetail": "La solicitud no puede ser nula.",
"data": null,
"status": "error"
}
| Atributo | Tipo | Descripción |
|---|---|---|
| message | String | Código regresado cuando existe un error. |
| messageDetail | String | Mensaje más descriptivo del error cuando existe uno. |
| data | object/null | Contiene la información del resultado de la cancelación masiva. |
| status | String | “success” o “error” |
Consulta de acuse de cancelación
Consulta el acuse de cancelación emitido por el SAT a partir del folioSeguimiento obtenido en la respuesta de cualquier método de cancelación masiva.
ℹ️ Nota: El parámetro folioSeguimiento se envía como query param en la URL.
🔗 Endpoint
| Método | Ruta |
|---|---|
| POST | /retencion/cancel/acuse?folioSeguimiento={uuid} |
🔐 Autenticación y Headers
| Header | Value |
|---|---|
| Authorization | Bearer Token |
🔎 Query Params
| Parámetro | Uso | Descripción |
|---|---|---|
folioSeguimiento | Requerido | UUID de seguimiento obtenido en la respuesta de la cancelación masiva |
Ejemplo Request
curl --request POST \ --url 'https://services.test.sw.com.mx/retencion/cancel/acuse?folioSeguimiento=1C4C60BC-0BA1-40FF-8D1F-F4DC80B52E25' \ --header 'Authorization: Bearer $token'
Ejemplo Response
{
"data": {
"acuse": "<?xml version=\"1.0\"?><Acuse xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" Fecha=\"2026-06-08T22:21:12.5363998\" RfcEmisor=\"XAXX010101000\" WorkProcessId=\"50a3b377-ef54-4d56-b908-b598b8d50114\" xmlns=\"http://www.sat.gob.mx/esquemas/retencionpago/1\"><Folios><UUID>286C2251-C152-4530-9D80-B7E3376B2D17</UUID><EstatusUUID>1201</EstatusUUID><Motivo>02</Motivo><Extemporaneo>false</Extemporaneo></Folios><Signature Id=\"SelloSAT\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#hmac-sha512\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\"><XPath>not(ancestor-or-self::*[local-name()='Signature'])</XPath></Transform></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha512\" /><DigestValue>LvwvRFg1m0qMEsFucy+CTHgcpPcvMeNBgcu/Q0Bnhm9IydrvFDvYSbZcXC06AHFXt/bDPgw4WUCOX5rEfV9s+Q==</DigestValue></Reference></SignedInfo><SignatureValue>7+kgxLMbZ0Srn6EiMY7v9P5I2n7hnhROjHX2KdQwXhjxtedIAt7GQJwAGb0HARuEsA9eIdMusk2CCi6ZWJANfQ==</SignatureValue><KeyInfo><KeyName>30001000000500002554</KeyName><KeyValue><RSAKeyValue><Modulus>kaqT7gZEh0uBLPcVUR2uOFkJN7hiOmNLhpjUi+DvS1Q0dYpZv+nLQK1IZZHpfJlo54x1QQqU0UGZuXTlQpYrVNzjVmtLZQ9JhB9N4x7stjk9+RQQo6m4RrSPjcqW1oy2aQKnflKEPUypzP88/B+tvKKI2toAk+NJukbQy0cI1y35z3msCspUTYsBJ4E67UKGnbQYK9u6kUCL9Ydt9tlJsXjTLdEiKGRDi259suZCYt4qIPw91HzTQrt7a8fAYXQPdR6OgnPog0+zyvVrsL3/sCQqG2m/tTlElrqCgJp8zjLiDfdhe9Y3S7NnYmLUn0RJrENotSweqEu9f3UkUFD/eQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo></Signature></Acuse>",
"uuid": {
"286C2251-C152-4530-9D80-B7E3376B2D17": "1201"
}
},
"status": "success"
}
{
"message": "CR1006 - CR1006 - Mensaje SAT.",
"messageDetail": "El folio de seguimiento no es un identificador válido.",
"data": null,
"status": "error"
}
| Atributo | Tipo | Descripción |
|---|---|---|
| message | String | Código regresado cuando existe un error. |
| messageDetail | String | Mensaje más descriptivo del error cuando existe uno. |
| data | object/null | Objeto con el resultado del acuse de cancelación. |
| data.acuse | String | XML del acuse de cancelación emitido por el SAT. |
| data.uuid | Object | Diccionario donde la clave es el UUID cancelado y el valor es el código de estatus SAT (e.g. “1201”). |
| status | String | “success” o “error” |
Códigos de respuesta de folios
Códigos que el SAT puede devolver en el campo EstatusUUID del acuse, o como parte del mensaje de respuesta al procesar la cancelación de cada folio.
Tabla de códigos de respuesta.
| Código | Mensaje |
|---|---|
1201 | Solicitud de cancelación recibida. |
1202 | UUID Previamente cancelado. |
1203 | No encontrado corresponde al emisor. |
1205 | UUID No existe. |
1300 | Autenticación no válida. |
1301 | XML mal formado. |
1302 | Estructura de folio no válida. |
1303 | Estructura de RFC no válida. |
1304 | Estructura de fecha no válida. |
1305 | Certificado no corresponde al emisor. |
1306 | Certificado no vigente. |
1307 | Uso de e.firma no permitido. |
1308 | Certificado revocado o caduco. |
1309 | Firma mal formada o inválida. |
En SW® somos mejores para TI, es por ello que tu opinión es muy importante, por favor ayúdanos calificando este articulo y dejando tus comentarios.