Postman
Postman
  • Documentación

    • Información general
    • Entornos
    • Primeros pasos
    • Listar CFDI's
    • Buscar CFDI
    • Crear CFDI 4.0
    • Crear CFDI Global 4.0
    • Borradores CFDI 4.0
    • Descargar CFDI
    • Cancelar CFDI 4.0
    • Descargar acuse CFDI 4.0
    • Enviar CFDI
    • Consultar estatus de cancelación de un CFDI
    • Grupos de empleados
    • Empleados
    • Nóminas
    • Complementos
    • Retenciones
    • Complementos de retenciones
    • Carta porte v3.1
    • Catálogos
    • Clientes
    • Empresas
    • Migraciones
    • Series
    • Productos
    • Addendas
    • Fundamentos legales del SAT

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ámetroTipoRequeridoDetalles
monthnumberOpcional Induca el número de mes que deseas consultar. Éste debe estar escrito en 2 dígitos.
Ejemplo: Enero = 01, Diciembre = 12, etc.
yearnumberOpcional Indica el año que deseas consultar. Éste debe estar escrito en 4 dígitos. Ejemplo: 2017.
rfcstringOpcional Indica un RFC para traer todos los CFDI's timbrados al mismo. Ejemplo: XAXX010101000.
type_dpcumentstringOpcional 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.
pageintOpcional Indica número de página a consultar, por default posiciona en la página 1.
per_pageintOpcional 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ámetroTipoRequeridoDetalles
LugarExpedicionStringRequeridoSe utiliza para indicar el lugar de expedicion de la retención, en este campo se ingresa el codigo postal correspondiente al domicilio fiscal
CveRetencStringRequeridoIndica el tipo de retención que es.

Ésta puedes consultarla en el Catálogo de Claves de Retención.

Ejemplo:
"CveRetenc": "01"
RegimenFiscalnumberOpcionalIndica 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:
"RegimenFiscal": "601"
DescRetencNumericoOpcionalSe utiliza para introducir la descripcion de la retencion en caso de no pertenecer algun tipo definido
RelacionadoArregloOpcionalContiene los datos del CFDI a el que esta relacionado la retención
TipoRelacionStringOpcionalIndica la clave del tipo de relación que tiene con el CFDI
UUIDStringOpcionalSe ingresa el folio fiscal correspondiente a el CFDI que se relacionara con la retención
ReceptorArregloRequeridoContiene los datos relacionados a el receptor de la retención
UIDStringRequeridoIndica 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"
NacionalidadRStringOpcional

Indica la nacionalidad del cliente para la retención

Los valores admitidos aqui son: "Nacional" y "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

NacionalArregloOpcional

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

RfcRStringOpcional

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

NomDenRazSocRStringOpcional

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

CURPRStringOpcional

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

DomicilioFiscalRStringOpcional

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

ExtranjeroArregloOpcional

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

NumRegIdTribStringOpcional

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

NomDenRazSocRStringOpcional

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

PeriodoArregloRequeridoContiene la informacion del periodo de tiempo que abarca la retención
MesIniStringRequerido

Indica el mes en el que inicia el periodo de la retención, es necesario ingresar los meses con su valor numerico ejemplo:
Enero - "01"

Febrero - "02"

Marzo - "03"

.

.

MesFinStringRequerido

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"

.

.

EjercicioStringRequeridoIndica el año en el que realiza la retención ejemplo: "2022"
TotalesArregloRequeridoContiene la informacion correspondiente a las cantidades correspondientes a la retención
MontoTotOperacionNumericoRequeridoIndica el monto total de la operacion a la cual se genera la retención
MontoTotGravNumericoRequeridoIndica el monto gravable de la retención
MontoTotExentNumericoRequeridoIndica el monto exento de la retención
MontoTotRetNumericoRequeridoIndica el monto total de la retención
UtilidadBimestralNumericoRequeridoIndica la utilidad bimestral correpsondiente a la retención
ISRCorrespondienteNumericoOpcionalIndica el monto correspondiente por ISR de la retención
ImpRetenidosArregloRequeridoContiene la informacion de los impuestos
BaseRetNumericoRequeridoIndica la base del impuesto a aplicar en la retención
ImpuestoRetStringRequerido

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

MontoRetNumericoRequeridoIndica el monto de retención del impuesto
TipoPagoRetStringRequerido

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ámetroTipoRequeridoDetalles
UIDStringRequeridoEs el identificador unico asignado a la retención que deseamos cancelar
motivoStringRequerido Indica motivo por el cual es solicitada la cancelación del CFDI.

Ejemplo:
01
folioSustitutoStringRequerido 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ámetroTipoRequeridoDetalles
UIDStringRequeridoEs el identificador unico asignado a la retención que deseamos re-cancelar
motivoStringRequerido Indica motivo por el cual es solicitada la cancelación del CFDI.

Ejemplo:
01
folioSustitutoStringRequerido 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:

  • PDF
  • XML

Para obtener uno u otro solo es necesario cambiar el endpoint al que estamos apuntando:

  • /pdf
  • /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ámetroTipoRequeridoDetalles
cfdi_uidStringRequerido 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ámetroTipoRequeridoDetalles
UIDStringRequeridoEs 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ámetroTipoRequeridoDetalles
UIDStringRequerido 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ámetroTipoRequeridoDetalles
UIDStringRequeridoEs 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ámetroTipoRequeridoDetalles
UUIDStringRequerido 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ámetroTipoRequeridoDetalles
UUIDStringRequerido 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ámetroTipoRequeridoDetalles
UUIDStringRequerido 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. "
}

Last Updated:
Prev
Complementos
Next
Complementos de retenciones