Retenciones
Listar Retenciones
Importante
Es importante tomar en cuenta que la retención es un CFDI por lo que para listar las retenciones se utiliza el mismo método para listar los CFDI, y para buscar una retención en particular utilizaremos el UID correspondiente a nuestra retención
A continuación se explica como listar los CFDI's , con un ejemplo y la muestra de posibles respuestas obtenidas.
Podemos consultar los CFDI's filtrando por los siguientes parámetros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
month | number | Opcional | Induca el número de mes que deseas consultar. Éste debe estar escrito en 2 dígitos. Ejemplo: Enero = 01, Diciembre = 12, etc. |
year | number | Opcional | Indica el año que deseas consultar. Éste debe estar escrito en 4 dígitos. Ejemplo: 2017. |
rfc | string | Opcional | Indica un RFC para traer todos los CFDI's timbrados al mismo. Ejemplo: XAXX010101000. |
type_dpcument | string | Opcional | Indica un tipo de CFDI para listar solo los CFDI's de ese tipo. Para ello enviar la clave indicada en el catálogo de Tipos de CFDI. Ejemplo: factura Consulta el catálogo de tipos de CFDIs. |
page | int | Opcional | Indica número de página a consultar, por default posiciona en la página 1. |
per_page | int | Opcional | Indica el limite de resultados para mostrar, por default retorna 100 registros. |
Construcción de la URL para listar retenciones
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi/list
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi/list
Tip
Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta, e Tu Secret key por el SECRET KEY correspondiente.
Ejemplo.
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi/list',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi/list',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi/list"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi/list")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Respuestas de listar retenciones
Ejemplo de respuesta exitosa.
{
"total": 20,
"per_page": 100,
"current_page": 1,
"last_page": 1,
"from": 1,
"to": 100,
"data": [
{
"RazonSocialReceptor": "ALBA XKARAJAM MENDEZ",
"Folio": "RT 34",
"UID": "6261b15bd717b",
"UUID": "a197519a-435a-42ce-a52d-2ec1d1a42cc0",
"Subtotal": "0.000000",
"Total": "123.000000",
"ReferenceClient": 0,
"NumOrder": null,
"Receptor": "XAMA620210DQ5",
"FechaTimbrado": "2022-04-21",
"Status": "enviada",
"Version": "4.0"
},
{
"RazonSocialReceptor": "ALBA XKARAJAM MENDEZ",
"Folio": "RT 33",
"UID": "6261b13471ae8",
"UUID": "f75195cf-5b36-43b6-a087-0053332439a2",
"Subtotal": "0.000000",
"Total": "123.000000",
"ReferenceClient": 0,
"NumOrder": null,
"Receptor": "XAMA620210DQ5",
"FechaTimbrado": "2022-04-21",
"Status": "enviada",
"Version": "4.0"
},
{
"RazonSocialReceptor": "PRUEBAS",
"Folio": "F 98",
"UID": "61d4c0197fbfd",
"UUID": "42ffe80d-3c8f-46f6-af64-513656615bb4",
"Subtotal": "229.900000",
"Total": "259.780000",
"ReferenceClient": 0,
"NumOrder": null,
"Receptor": "XAXX010101000",
"FechaTimbrado": "2022-01-04",
"Status": "cancelada",
"Version": "4.0"
}
]
}
Ejemplo de respuesta erronea.
{
"status": "error",
"message": "La cuenta que intenta autenticarse no existe",
"Data": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
"Secret": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq"
}
Crear retención
A continuación se explica el método con el cual podremos crear una retención
Podemos crear una retención haciendo uso de los siguientes parametros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
LugarExpedicion | String | Requerido | Se utiliza para indicar el lugar de expedicion de la retención, en este campo se ingresa el codigo postal correspondiente al domicilio fiscal |
CveRetenc | String | Requerido | Indica el tipo de retención que es. Ésta puedes consultarla en el Catálogo de Claves de Retención. Ejemplo:
|
RegimenFiscal | number | Opcional | Indica la clave del régimen fiscal del emisor, si este campo no se manda, se usará la clave del régimen que está en la configuración de la empresa. Ver listado de claves de régimen fiscal. Ejemplo:
|
DescRetenc | Numerico | Opcional | Se utiliza para introducir la descripcion de la retencion en caso de no pertenecer algun tipo definido |
Relacionado | Arreglo | Opcional | Contiene los datos del CFDI a el que esta relacionado la retención |
TipoRelacion | String | Opcional | Indica la clave del tipo de relación que tiene con el CFDI |
UUID | String | Opcional | Se ingresa el folio fiscal correspondiente a el CFDI que se relacionara con la retención |
Receptor | Arreglo | Requerido | Contiene los datos relacionados a el receptor de la retención |
UID | String | Requerido | Indica el identificador unico que corresponde a el cliente a el cual generaremos la retención |
RegimenFiscalR | number | Opcional | Indica la clave del régimen fiscal del receptor, si este campo no se manda, se usará la clave del régimen que está guardado en el catálogo de clientes. Ejemplo: "RegimenFiscalR": "612" |
NacionalidadR | String | Opcional | Indica la nacionalidad del cliente para la retención Los valores admitidos aqui son: "Nacional" y "Extranjero" |
Nacional | Arreglo | Opcional | Contiene los datos correspondientes a cuando el cliente es nacional Este valor se utiliza para modifcar algun dato del cliente, si no se envia se utiliza el valor que tiene el cliente guardado en la base de datos |
RfcR | String | Opcional | Indica el RFC del cliente a el cual se genera la retención Este valor se utiliza para modifcar algun dato del cliente, si no se envia se utiliza el valor que tiene el cliente guardado en la base de datos |
NomDenRazSocR | String | Opcional | Indica la razon social del cliente a el cual se genera la retención Este valor se utiliza para modifcar algun dato del cliente, si no se envia se utiliza el valor que tiene el cliente guardado en la base de datos |
CURPR | String | Opcional | Indica la CURP del cliente a el cual se genera la retención Este valor se utiliza para modifcar algun dato del cliente, si no se envia se utiliza el valor que tiene el cliente guardado en la base de datos |
DomicilioFiscalR | String | Opcional | Indica el domicilio fiscal del cliente a el cual se genera la retención Este valor se utiliza para modifcar algun dato del cliente, si no se envia se utiliza el valor que tiene el cliente guardado en la base de datos |
Extranjero | Arreglo | Opcional | Contiene los datos correspondientes a cuando el cliente es extranjero Este valor se utiliza para modifcar algun dato del cliente, si no se envia se utiliza el valor que tiene el cliente guardado en la base de datos |
NumRegIdTrib | String | Opcional | Indica el número de identificación o registro fiscal del cliente a el cual se genera la retención Este valor se utiliza para modifcar algun dato del cliente, si no se envia se utiliza el valor que tiene el cliente guardado en la base de datos |
NomDenRazSocR | String | Opcional | Indica la razon social del cliente el que se genera la retención Este valor se utiliza para modifcar algun dato del cliente, si no se envia se utiliza el valor que tiene el cliente guardado en la base de datos |
Periodo | Arreglo | Requerido | Contiene la informacion del periodo de tiempo que abarca la retención |
MesIni | String | Requerido | Indica el mes en el que inicia el periodo de la retención, es necesario ingresar los meses con su valor numerico ejemplo: Febrero - "02" Marzo - "03" . . |
MesFin | String | Requerido | Indica el mes en el que termina el periodo de la retención, es necesario ingresar los meses con su valor numerico ejemplo: Enero - "01" Febrero - "02" Marzo - "03" . . |
Ejercicio | String | Requerido | Indica el año en el que realiza la retención ejemplo: "2022" |
Totales | Arreglo | Requerido | Contiene la informacion correspondiente a las cantidades correspondientes a la retención |
MontoTotOperacion | Numerico | Requerido | Indica el monto total de la operacion a la cual se genera la retención |
MontoTotGrav | Numerico | Requerido | Indica el monto gravable de la retención |
MontoTotExent | Numerico | Requerido | Indica el monto exento de la retención |
MontoTotRet | Numerico | Requerido | Indica el monto total de la retención |
UtilidadBimestral | Numerico | Requerido | Indica la utilidad bimestral correpsondiente a la retención |
ISRCorrespondiente | Numerico | Opcional | Indica el monto correspondiente por ISR de la retención |
ImpRetenidos | Arreglo | Requerido | Contiene la informacion de los impuestos |
BaseRet | Numerico | Requerido | Indica la base del impuesto a aplicar en la retención |
ImpuestoRet | String | Requerido | Es el identificador del impuesto que se define en la retención ejemplo: "ImpuestoRet": "002" Admite los siguientes valores: "001" - para Retencion ISR "002" - para Retencion IVA "003" - para Retencion IEPS |
MontoRet | Numerico | Requerido | Indica el monto de retención del impuesto |
TipoPagoRet | String | Requerido | Indica el tipo de pago del impuesto ejemplo: "TipoPagoRet": "01" Admite los siguientes valores "01" - para Pago definitivo IVA "02" - para Pago definitivo IEPS "03" - para Pago definitivo ISR plataformas "04" - para Pago provisional ISR |
Construcción de la URL para crear una retención
Importante
El método que se utiliza para la creación de una retención de tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo para crear una nueva retención
<<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"LugarExpedicion": "26015",
"CveRetenc": "03",
"DescRetenc": 100,
"RegimenFiscal": "606",
"Relacionado": {
"TipoRelacion": "01",
"UUID": "1084d341-996a-43d7-a115-e15a98a5b3cf"
},
"Receptor": {
"UID": "61af9fdc030e2",
"NacionalidadR": "Nacional",
"Nacional": {
"RfcR": "XAXX010101000",
"NomDenRazSocR": "Razon de pruebas",
"CURPR": "XEXX010101HNEXXXA4",
"DomicilioFiscalR": "44680"
}
},
"Periodo": {
"MesIni": "01",
"MesFin": "03",
"Ejercicio": "2022"
},
"Totales": {
"MontoTotOperacion": 0,
"MontoTotGrav": 0,
"MontoTotExent": 0,
"MontoTotRet": 123,
"UtilidadBimestral": 1,
"ISRCorrespondiente": 1,
"ImpRetenidos": [
{
"BaseRet": 12,
"ImpuestoRet": "001",
"MontoRet": 123,
"TipoPagoRet": "03"
}
]
}
} ',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/cfdi40/retenciones',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"LugarExpedicion": "26015",
"CveRetenc": "03",
"DescRetenc": 100,
"RegimenFiscal": "606",
"Relacionado": {
"TipoRelacion": "01",
"UUID": "1084d341-996a-43d7-a115-e15a98a5b3cf"
},
"Receptor": {
"UID": "61af9fdc030e2",
"NacionalidadR": "Nacional",
"Nacional": {
"RfcR": "XAXX010101000",
"NomDenRazSocR": "Razon de pruebas",
"CURPR": "XEXX010101HNEXXXA4",
"DomicilioFiscalR": "44680"
}
},
"Periodo": {
"MesIni": "01",
"MesFin": "03",
"Ejercicio": "2022"
},
"Totales": {
"MontoTotOperacion": 0,
"MontoTotGrav": 0,
"MontoTotExent": 0,
"MontoTotRet": 123,
"UtilidadBimestral": 1,
"ISRCorrespondiente": 1,
"ImpRetenidos": [
{
"BaseRet": 12,
"ImpuestoRet": "001",
"MontoRet": 123,
"TipoPagoRet": "03"
}
]
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones"
payload = json.dumps({
"LugarExpedicion": "26015",
"CveRetenc": "03",
"DescRetenc": 100,
"RegimenFiscal": "606",
"Relacionado": {
"TipoRelacion": "01",
"UUID": "1084d341-996a-43d7-a115-e15a98a5b3cf"
},
"Receptor": {
"UID": "61af9fdc030e2",
"NacionalidadR": "Nacional",
"Nacional": {
"RfcR": "XAXX010101000",
"NomDenRazSocR": "Razon de pruebas",
"CURPR": "XEXX010101HNEXXXA4",
"DomicilioFiscalR": "44680"
}
},
"Periodo": {
"MesIni": "01",
"MesFin": "03",
"Ejercicio": "2022"
},
"Totales": {
"MontoTotOperacion": 0,
"MontoTotGrav": 0,
"MontoTotExent": 0,
"MontoTotRet": 123,
"UtilidadBimestral": 1,
"ISRCorrespondiente": 1,
"ImpRetenidos": [
{
"BaseRet": 12,
"ImpuestoRet": "001",
"MontoRet": 123,
"TipoPagoRet": "03"
}
]
}
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"LugarExpedicion": "26015",
"CveRetenc": "03",
"DescRetenc": 100,
"RegimenFiscal": "606",
"Relacionado": {
"TipoRelacion": "01",
"UUID": "1084d341-996a-43d7-a115-e15a98a5b3cf"
},
"Receptor": {
"UID": "61af9fdc030e2",
"NacionalidadR": "Nacional",
"Nacional": {
"RfcR": "XAXX010101000",
"NomDenRazSocR": "Razon de pruebas",
"CURPR": "XEXX010101HNEXXXA4",
"DomicilioFiscalR": "44680"
}
},
"Periodo": {
"MesIni": "01",
"MesFin": "03",
"Ejercicio": "2022"
},
"Totales": {
"MontoTotOperacion": 0,
"MontoTotGrav": 0,
"MontoTotExent": 0,
"MontoTotRet": 123,
"UtilidadBimestral": 1,
"ISRCorrespondiente": 1,
"ImpRetenidos": [
{
"BaseRet": 12,
"ImpuestoRet": "001",
"MontoRet": 123,
"TipoPagoRet": "03"
}
]
}
})
response = http.request(request)
puts response.read_body
Respuestas de crear una nueva retención
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Factura creada y enviada satisfactoriamente",
"UUID": "c8fe8ac4-fe9c-41de-9b82-34db25d5a6a4",
"uid": "6262208ade698",
"SAT": {
"UUID": "c8fe8ac4-fe9c-41de-9b82-34db25d5a6a4",
"FechaTimbrado": "2022-04-21T22:25:38",
"NoCertificadoSAT": "30001000000400002495",
"Version": "1.1",
"SelloSAT": "OBOtcB6gWSxqu7Uf3otpt7Wi8RL7yIb8pSR5LiSZxAsgteqf8SZHHQmmb1Ovr7ebCbWZtcF+BBOeASZeIl57Q64S52wnyOWHyx6KT/1yc8s+65rbyFnSdPmNhKBudNGNlijygJkIcLBx8rO9/N05YJp3esTl9biIQy2Qo2nJU44xOA6F895E5c3Z5v8KLOl+S2Wg/RSeRg1HXytnFDzoNpa7wivljDZQlJJwNlLqwMQdcWjdfx782REaCLp/ByMdmJhwCrDdUPIYMPqvRAxmJpKcnkVo8NLFe/l0vXBV4r1VwG67NpA9cozIP7XWZyw+44/zV6+fqHGJDKg+6atD8w==",
"SelloCFD": "Wi+CrUlaTQ3HvBGPgsCaZdyRGK0x5zHQ/wFFZv617KwT9wrBzmrOp+Vy7RH60Fv7I5rI4oPqsA2WA/Js9KdrSfNvaf9+DkuB+OEPoTGCLTPDP+A9QgaM85d/qZpDkozvvUXhycecQN84NqPXPcckVaLj79IMMX2JqVL2zrdcHzSbtmHVBcD1aOcWrMFiGcS19t9c+iC1D7mVF79OhGAaS4wh2T4zY5cS0zYy8oHFYyaYsrRm4U26M1kTZOc+EYEbi0gBk3MK+wXrT+SZOI0+RiUFnUNSSHsDJN4PvNRpnXKOlxBCWq2mI/DJknbg/0qpMN4MBY630ngWZ9bq/VGpWg=="
},
"INV": {
"Serie": "RT",
"Folio": 37
},
"invoice_uid": "6262208ade698"
}
Ejemplo de respuesta erronea
{
"status": "error",
"message": "La cuenta que intenta autenticarse no existe",
"Data": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
"Secret": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq"
}
Aviso
El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta. Te sugerimos leer cuidadosamente el mensaje del error ya que en el mismo se indica donde es necesario corregir la información.
Cancelar una retención
A continuación se explica el método con el cual podremos cancelar una retención.
Podemos cancelar una retención utilizando los siguientes parametros
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
UID | String | Requerido | Es el identificador unico asignado a la retención que deseamos cancelar |
motivo | String | Requerido | Indica motivo por el cual es solicitada la cancelación del CFDI. Ejemplo: 01 |
folioSustituto | String | Requerido | Indica el UID o UUID del CFDI que reemplazara el CFDI cancelado. Ejemplo: 3336cbb9-ebd4-45e8-b60b-e7bfa6f6b5e0 |
Construcción de la URL para cancelar una retención
Importante
El método que se utiliza para cancelar una retención es de tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones/UID/cancel
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/UID/cancel
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo para cancelar una retención
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/cancel',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"motivo": "02",
"folioSustituto": "6206eec5d7cd4"
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/cancel',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"motivo": "02",
"folioSustituto": "6206eec5d7cd4"
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/cancel"
payload = json.dumps({
"motivo": "02",
"folioSustituto": "6206eec5d7cd4"
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/cancel")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"motivo": "02",
"folioSustituto": "6206eec5d7cd4"
})
response = http.request(request)
puts response.read_body
Respuestas de cancelar una retención
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Estimado cliente tu CFDI F66(a80387be-bb02-45c4-ac33-c85ed48a49ab) se canceló exitosamente",
"respuestaapi": {
"response": "success",
"acuse": "<?xml version=\"1.0\" encoding=\"utf-8\"?><Acuse xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" Fecha=\"2021-12-28T14:30:48.3934087\" RfcEmisor=\"XOJI740919U48\"><Folios xmlns=\"http://cancelacfd.sat.gob.mx\"><UUID>A80387BE-BB02-45C4-AC33-C85ED48A49AB</UUID><EstatusUUID>201</EstatusUUID></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>pyf1Z8DeV/R934tgx7duakRCDSK0rlY+1Ql3pfc6OMXLMJnthgDyfNY20jXzxncIsJR1JGRKjj08AcGuLM4r1Q==</DigestValue></Reference></SignedInfo><SignatureValue>vagn0h0kJ9UJf0g5+fX6s7uSUnor7+by0Uj/CdYiEba8KM6a5HO2/DxUZqw8XovbxKrVyducZpqBamLXDTrG5w==</SignatureValue><KeyInfo><KeyName>BF66E582888CC845</KeyName><KeyValue><RSAKeyValue><Modulus>n5YsGT0w5Z70ONPbqszhExfJU+KY3Bscftc2jxUn4wxpSjEUhnCuTd88OK5QbDW3Mupoc61jr83lRhUCjchFAmCigpC10rEntTfEU+7qtX8ud/jJJDB1a9lTIB6bhBN//X8IQDjhmHrfKvfen3p7RxLrFoxzWgpwKriuGI5wUlU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo></Signature></Acuse>"
}
}
Ejemplo de respuesta erronea.
{
"status": "error",
"message": "La cuenta que intenta autenticarse no existe",
"Data": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
"Secret": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq"
}
Aviso
El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta. Te sugerimos leer cuidadosamente el mensaje del error ya que en el mismo se indica donde es necesario corregir la información.
Re cancelar una retención
Importante
Es importante tomar en cuenta que el método de re-cancelar es un método forzado de cancelación el cual no toma en cuenta el estado de la retención y lo trata de cancelar
Este método es util cuando existen problemas con la aceptación de la cancelación por ejemplo, con este método podremos realizar un intento extra para cancelar la retención
A continuación se explica el método con el cual podremos re-cancelar una retención.
Podemos re-cancelar una retención utilizando los siguientes parametros
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
UID | String | Requerido | Es el identificador unico asignado a la retención que deseamos re-cancelar |
motivo | String | Requerido | Indica motivo por el cual es solicitada la cancelación del CFDI. Ejemplo: 01 |
folioSustituto | String | Requerido | Indica el UID o UUID del CFDI que reemplazara el CFDI cancelado. Ejemplo: 3336cbb9-ebd4-45e8-b60b-e7bfa6f6b5e0 |
Construcción de la URL para cancelar una retención
Importante
El método que se utiliza para cancelar una retención es de tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones/UID/re-cancel
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/UID/re-cancel
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo para re-cancelar una retención
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/re-cancel',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"motivo": "02",
"folioSustituto": "6206eec5d7cd4"
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/re-cancel',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"motivo": "02",
"folioSustituto": "6206eec5d7cd4"
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/re-cancel"
payload = json.dumps({
"motivo": "02",
"folioSustituto": "6206eec5d7cd4"
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/re-cancel")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"motivo": "02",
"folioSustituto": "6206eec5d7cd4"
})
response = http.request(request)
puts response.read_body
Respuestas de re-cancelar una retención
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Estimado cliente tu CFDI F66(a80387be-bb02-45c4-ac33-c85ed48a49ab) se canceló exitosamente",
"respuestaapi": {
"response": "success",
"acuse": "<?xml version=\"1.0\" encoding=\"utf-8\"?><Acuse xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" Fecha=\"2021-12-28T14:30:48.3934087\" RfcEmisor=\"XOJI740919U48\"><Folios xmlns=\"http://cancelacfd.sat.gob.mx\"><UUID>A80387BE-BB02-45C4-AC33-C85ED48A49AB</UUID><EstatusUUID>201</EstatusUUID></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>pyf1Z8DeV/R934tgx7duakRCDSK0rlY+1Ql3pfc6OMXLMJnthgDyfNY20jXzxncIsJR1JGRKjj08AcGuLM4r1Q==</DigestValue></Reference></SignedInfo><SignatureValue>vagn0h0kJ9UJf0g5+fX6s7uSUnor7+by0Uj/CdYiEba8KM6a5HO2/DxUZqw8XovbxKrVyducZpqBamLXDTrG5w==</SignatureValue><KeyInfo><KeyName>BF66E582888CC845</KeyName><KeyValue><RSAKeyValue><Modulus>n5YsGT0w5Z70ONPbqszhExfJU+KY3Bscftc2jxUn4wxpSjEUhnCuTd88OK5QbDW3Mupoc61jr83lRhUCjchFAmCigpC10rEntTfEU+7qtX8ud/jJJDB1a9lTIB6bhBN//X8IQDjhmHrfKvfen3p7RxLrFoxzWgpwKriuGI5wUlU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo></Signature></Acuse>"
}
}
Ejemplo de respuesta erronea
{
"status": "error",
"message": "La cuenta que intenta autenticarse no existe",
"Data": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
"Secret": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq"
}
Aviso
El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta. Te sugerimos leer cuidadosamente el mensaje del error ya que en el mismo se indica donde es necesario corregir la información.
Descargar retención
A continuación se explica como descargar una retención
Cada retención puede ser descargads a través de nuestra API en dos tipos de archivo distintos:
- XML
Para obtener uno u otro solo es necesario cambiar el endpoint al que estamos apuntando:
- /xml
Tambien para descargar una retención es necesario el uso del siguiente parámetro el cual se utiliza en la construcción del enpoint para identificar el CFDI que deseamos descargar:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
cfdi_uid | String | Requerido | Indica el UID o UUID del CFDI que deseas descargar. Ejemplo: 55c0fdc67593d |
Contrucción de la URL para descargar retenciones
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint PDF: /v4/cfdi40/retenciones/{cfdi_uid}/pdf Endpoint XML: /v4/cfdi40/retenciones/{cfdi_uid}/xml
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/¡55c0fdc67593d/pdf
Tip
Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta e Tu Secret key por el SECRET KEY correspondiente.
Además de reemplazar cfdi_uid por el UID del CFDI que deseas descargar.
jemplo para descargar retenciones en formato PDF
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/pdf',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/pdf',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/pdf"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones/61e1ec792ac76/pdf")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Ejemplo para descargar retenciones en formato XML
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/xml',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/xml',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/xml"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/xml")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Enviar una retención por email
A continuación se explica el método con el cual podremos enviar por email una retención.
Podemos enviar una retención utilizando los siguientes parametros
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
UID | String | Requerido | Es el identificador unico asignado a la retención que deseamos enviar |
Construcción de la URL para enviar una retención
Importante
El método que se utiliza para enviar una retención es de tipo GET
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones/UID/email
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/UID/email
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo para enviar una retención
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/email',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/email',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/email"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/email")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Respuestas de enviar una retención por email
Ejemplo de respuesta exitosa.
{
"response": "success",
"uid": "61af9fdc030e2",
"message": "Hemos enviado tu Nomina con exito al e-mail: [email protected]"
}
Ejemplo de respuesta erronea.
{
"status": "error",
"message": "La cuenta que intenta autenticarse no existe",
"Data": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
"Secret": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq"
}
Aviso
El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta. Te sugerimos leer cuidadosamente el mensaje del error ya que en el mismo se indica donde es necesario corregir la información.
Enviar el acuse de cancelación de una retención por email
A continuación se explica el método con el cual podremos enviar por email el acuse de una retención.
Podemos enviar el acuse de una retención utilizando los siguientes parametros
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
UID | String | Requerido | Es el identificador unico asignado a la retención que deseamos enviar |
Construcción de la URL para enviar el acuse de una retención
Importante
El método que se utiliza para enviar una retención es de tipo GET
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones/UID/sendAcuse
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/UID/sendAcuse
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo para enviar el acuse de una retención
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/senAcuse',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/sendAcuse',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/sendAcuse"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones/625f36d0c43f6/sendAcuse")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Respuestas de enviar el acuse de una retención por email
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Hemos enviado el acuse de tu Factura con exito al e-mail's [email protected]"
}
Ejemplo de respuesta erronea.
{
"status": "error",
"message": "La cuenta que intenta autenticarse no existe",
"Data": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
"Secret": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq"
}
Aviso
El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta. Te sugerimos leer cuidadosamente el mensaje del error ya que en el mismo se indica donde es necesario corregir la información.
Descargar acuse de una Retención
A continuación se explica el método con el cual podremos descargar el acuse de cancelación de una retención.
Podemos descargar el acuse de una retención utilizando los siguientes parametros
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
UID | String | Requerido | Es el identificador unico asignado a la retención que deseamos enviar |
Construcción de la URL para descargar el acuse de una retención
Importante
El método que se utiliza para descargar el acuse de una retención es de tipo GET
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones/UID/acuse
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/UID/acuse
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo para descargar el acuse de una retención
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones/62150a9f80dec/acuse',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi40/retenciones/62150a9f80dec/acuse',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones/62150a9f80dec/acuse"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones/62150a9f80dec/acuse")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Respuestas al descargar el acuse de una retención
Ejemplo de respuesta exitosa.
<?xml version="1.0" encoding="utf-8"?>
<Acuse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Fecha="2022-04-11T15:06:00.8822769" RfcEmisor="XOJI740919U48">
<Folios xmlns="http://cancelacfd.sat.gob.mx">
<UUID>9728D285-A060-47DB-B261-EAE9AB39DAE8</UUID>
<EstatusUUID>201</EstatusUUID>
</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>3mh05i9bjnBDjK61RU2om6y8dNWo3TKzcWWCoiJV26h1klWiz2cdOKptxG4U90ffMM4Ajvz8b2IPtUWgaU/McQ==</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>qux5QPlwYbASZCVNW9vzyl1DITHGUgEroc9DMzcBwXiG15XL8+r8u8Q02iEJkxgbqEaykHqys2OQMBhOBCaj3w==</SignatureValue>
<KeyInfo>
<KeyName>BF66E582888CC845</KeyName>
<KeyValue>
<RSAKeyValue>
<Modulus>n5YsGT0w5Z70ONPbqszhExfJU+KY3Bscftc2jxUn4wxpSjEUhnCuTd88OK5QbDW3Mupoc61jr83lRhUCjchFAmCigpC10rEntTfEU+7qtX8ud/jJJDB1a9lTIB6bhBN//X8IQDjhmHrfKvfen3p7RxLrFoxzWgpwKriuGI5wUlU=</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
</KeyValue>
</KeyInfo>
</Signature>
</Acuse>
Ejemplo de respuesta erronea
{
"status": "error",
"message": "La cuenta que intenta autenticarse no existe",
"Data": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
"Secret": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq"
}
Aviso
El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta. Te sugerimos leer cuidadosamente el mensaje del error ya que en el mismo se indica donde es necesario corregir la información.
Consultar estatus de cancelación de una retención
A continuación se explica como consultar el estatus de la cancelación de una retención con un ejemplo de como hacerlo.
Podemos consultar el estatus de una retención haciendo uso del siguiente parámetro:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
UUID | String | Requerido | Indica el UID o UUID del CFDI que deseas consultar. Ejemplo: 55c0fdc67593d |
Construcción de la URL para consultar estatus de retención
Importante
El método que se utiliza para descargar el acuse de una retención es de tipo GET
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones/UID/cancel_status
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/c55df8b4-37b3-47cf-9e35-efdb4c3261b4/cancel_status
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/616db823c6a77/cancel_status
Tip
Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta, e Tu Secret key por el SECRET KEY correspondiente. Además de reemplazar uid por el UID o UUID del CFDI que deseas consultar.
Ejemplo de estatus de retención
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi33/retenciones/616db823c6a77/cancel_status',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi33/retenciones/616db823c6a77/cancel_status',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi33/retenciones/616db823c6a77/cancel_status"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi33/retenciones/616db823c6a77/cancel_status")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Respuesta de estatus de retención
Importante
El mensaje de respuesta puede variar dependiendo de el estatus en el que se encuentre el CFDI.
Estatus vigente cancelable
{
"response": "success",
"data": {
"CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
"Estado": "Vigente",
"EsCancelable": "Cancelable sin aceptación",
"EstatusCancelacion": []
}
}
Estatus cancelado
{
"response": "success",
"data": {
"CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
"Estado": "Cancelado",
"EsCancelable": "Cancelable sin aceptación",
"EstatusCancelacion": "Cancelado sin aceptación"
}
}
Estatus vigente no cancelable
{
"response": "success",
"data": {
"CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
"Estado": "Vigente",
"EsCancelable": "No Cancelable",
"EstatusCancelacion": []
}
}
Consultar fecha de cancelación de una retención
A continuación se explica como consultar la fecha de cancelación de una retención con un ejemplo de como hacerlo.
Podemos consultar la fecha de cancelación de una retención haciendo uso del siguiente parámetro:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
UUID | String | Requerido | Indica el UUID de la retención que deseas consultar. Ejemplo: 8ed60417-5e9f-449c-8314-f991746b2fcc |
Construcción de la URL para consultar la fecha de cancelación de una retención
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones/UID/cancel_date
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/UID/cancel_date
Tip
Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta, e Tu Secret key por el SECRET KEY correspondiente. Además de reemplazar uid por el UUID del CFDI que deseas consultar.
Ejemplo de consulta de fecha de cancelación de retención
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/retenciones/8ed60417-5e9f-449c-8314-f991746b2fcc/cancel_date',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi40/retenciones/8ed60417-5e9f-449c-8314-f991746b2fcc/cancel_date',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/retenciones/8ed60417-5e9f-449c-8314-f991746b2fcc/cancel_date"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/retenciones/8ed60417-5e9f-449c-8314-f991746b2fcc/cancel_date")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Respuesta de consulta de fecha de cancelación
Importante
El mensaje de respuesta puede variar dependiendo de el estatus en el que se encuentre el CFDI.
Estatus cancelado
{
"response": "success",
"data": {
"UUID": "9366360e-a71e-4912-b07a-2f8a638a85d7",
"Estatus": "cancelada",
"FechaCancelacion": "2022-01-01",
"Acuse": "<?xml version=\"1.0\" encoding=\"utf-8\"?><Acuse xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" Fecha=\"2021-12-31T18:24:12.0699398\" RfcEmisor=\"XOJI740919U48\"><Folios xmlns=\"http://cancelacfd.sat.gob.mx\"><UUID>9366360E-A71E-4912-B07A-2F8A638A85D7</UUID><EstatusUUID>201</EstatusUUID></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>QdQwj4NZP4xG7jp6eCfvhgtggVsjaXwtb9UW0DQ0F7efvhsDyrGRIvEeVk5fOCBcjHOjB0RgAlZF+SqU09Jo9Q==</DigestValue></Reference></SignedInfo><SignatureValue>bHXN1SrwOZfazyn591X32t/4IZ+Jw+D00Yj5WZOlv4AMSdTKHOxOpD5YUxae/jZW+42S1CFu6TXRc77vRb/i1w==</SignatureValue><KeyInfo><KeyName>BF66E582888CC845</KeyName><KeyValue><RSAKeyValue><Modulus>n5YsGT0w5Z70ONPbqszhExfJU+KY3Bscftc2jxUn4wxpSjEUhnCuTd88OK5QbDW3Mupoc61jr83lRhUCjchFAmCigpC10rEntTfEU+7qtX8ud/jJJDB1a9lTIB6bhBN//X8IQDjhmHrfKvfen3p7RxLrFoxzWgpwKriuGI5wUlU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo></Signature></Acuse>"
}
}
Estatus no cancelado
{
"response": "error",
"message": "CFDI no cancelado"
}
Consultar relacionados de una retención
A continuación se explica como consultar los documentos relacionados de una retención con un ejemplo de como hacerlo.
Podemos consultar los relacionados de una retención haciendo uso del siguiente parámetro:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
UUID | String | Requerido | Indica el UUID de la retención que deseas consultar. Ejemplo: 8ed60417-5e9f-449c-8314-f991746b2fcc |
Construcción de la URL para consultar los relacionados de una retención
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/retenciones/UID/relacionado
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/retenciones/UID/relacionado
Tip
Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta, e Tu Secret key por el SECRET KEY correspondiente. Además de reemplazar uid por el UUID del CFDI que deseas consultar.
Ejemplo de consulta de relacionado de una retención
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi33/retenciones/65c13426-91bb-4aca-b8a1-daf94e01763d/relacionado',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': '{ HOST }/v4/cfdi33/retenciones/65c13426-91bb-4aca-b8a1-daf94e01763d/relacionado',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi33/retenciones/65c13426-91bb-4aca-b8a1-daf94e01763d/relacionado"
payload = ""
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi33/retenciones/65c13426-91bb-4aca-b8a1-daf94e01763d/relacionado")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
response = http.request(request)
puts response.read_body
Respuesta de consulta de relacionados de una retención
Importante
El mensaje de respuesta puede variar dependiendo de el estatus en el que se encuentre el CFDI.
Con documentos relacionados
{
"response": "success",
"data": {
"uuidConsultado": "9366360e-a71e-4912-b07a-2f8a638a85d7",
"Resultado": "WS COnsulta CFDI relacionados RfcEmisor: XAXX010101000 - folio fiscal: 63389b0d-ef60-428d-9292-e5544b3a85d7",
"uuidsRelacionadosPadres": [
{
"uuidsRelacionadosPadres": "63389b0d-ef60-428d-9292-e5544b3a85d7",
"rfcEmisor": "XAXX010101000",
"rfcReceptor": "XAXX010101000"
}
]
}
}
Sin documentos relacionados
{
"response": "success",
"data": null,
"message": "No se encontraron CFDI relacionados. "
}