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

Complementos de retenciones

En esta seccion se listan los complementos disponibles para las retenciones y los parametros correspondientes dentro de nuestra plataforma.

Importante

Recuerda que para utilizar los complementos deben enviarse en conjunto con el CFDI de tipo retención, por lo que recomendamos consultar tambien la documentación correspondiente a la creación de retenciones.

Complemento de plataformas tecnologicas

A continuación se explica el método con el cual podremos crear una retención incluyendo el complemento de plataformas tecnologicas

Podemos crear una retención a la cual incluiremos el complemeto de plataformas tecnologicas utilizando 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"
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
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 con complemento de plataformas tecnologicas

Importante

El método que se utiliza para la creación de una retención con complemento de plataformas tecnologicas es 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 cuando el receptor es nacional

<?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 =>'{
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
        "Ejercicio": "2022",
        "MesFin": "09",
        "MesIni": "09"
    },
    "Receptor": {
        "Nacional": {
            "CURPR": "XEXX010101HNEXXXA4",
            "DomicilioFiscalR": "63180",
            "NomDenRazSocR": "MARIA WATEMBER TORRES",
            "RfcR": "WATM640917J45"
        },
        "NacionalidadR": "Nacional",
        "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
        "TipoRelacion": "05",
        "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "ServiciosPlataformasTecnologicas": {
        "DifIVAEntregadoPrestServ": 8,
        "MonTotalContribucionGubernamental": 11,
        "MonTotalporUsoPlataforma": 10,
        "MonTotServSIVA": 100,
        "NumServ": 1,
        "Periodicidad": "03",
        "Servicios": {
            "DetallesDelServicio": [
                {
                    "ComisionDelServicio": {
                        "Base": "100",
                        "Importe": "10",
                        "Porcentaje": "0.10"
                    },
                    "ContribucionGubernamental": {
                        "EntidadDondePagaLaContribucion": "14",
                        "ImpContrib": "11"
                    },
                    "FechaServ": "2022-09-21",
                    "FormaPagoServ": "06",
                    "ImpuestosTrasladadosdelServicio": {
                        "Base": "100",
                        "Importe": 16,
                        "Impuesto": "02",
                        "TasaCuota": "0.160000",
                        "TipoFactor": "Tasa"
                    },
                    "PrecioServSinIVA": "100",
                    "RFCTerceroAutorizado": "",
                    "SubTipServ": "01",
                    "TipoDeServ": "01"
                }
            ]
        },
        "TotalISRRetenido": "0",
        "TotalIVARetenido": 8,
        "TotalIVATrasladado": 16
    },
    "Totales": {
        "ImpRetenidos": [
            {
                "BaseRet": 16,
                "ImpuestoRet": "002",
                "MontoRet": 8,
                "TipoPagoRet": "01"
            }
        ],
        "ISRCorrespondiente": "",
        "MontoTotExent": 0,
        "MontoTotGrav": 100,
        "MontoTotOperacion": 100,
        "MontoTotRet": 8
    }
}',
  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({
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
      "Ejercicio": "2022",
      "MesFin": "09",
      "MesIni": "09"
    },
    "Receptor": {
      "Nacional": {
        "CURPR": "XEXX010101HNEXXXA4",
        "DomicilioFiscalR": "63180",
        "NomDenRazSocR": "MARIA WATEMBER TORRES",
        "RfcR": "WATM640917J45"
      },
      "NacionalidadR": "Nacional",
      "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
      "TipoRelacion": "05",
      "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "ServiciosPlataformasTecnologicas": {
      "DifIVAEntregadoPrestServ": 8,
      "MonTotalContribucionGubernamental": 11,
      "MonTotalporUsoPlataforma": 10,
      "MonTotServSIVA": 100,
      "NumServ": 1,
      "Periodicidad": "03",
      "Servicios": {
        "DetallesDelServicio": [
          {
            "ComisionDelServicio": {
              "Base": "100",
              "Importe": "10",
              "Porcentaje": "0.10"
            },
            "ContribucionGubernamental": {
              "EntidadDondePagaLaContribucion": "14",
              "ImpContrib": "11"
            },
            "FechaServ": "2022-09-21",
            "FormaPagoServ": "06",
            "ImpuestosTrasladadosdelServicio": {
              "Base": "100",
              "Importe": 16,
              "Impuesto": "02",
              "TasaCuota": "0.160000",
              "TipoFactor": "Tasa"
            },
            "PrecioServSinIVA": "100",
            "RFCTerceroAutorizado": "",
            "SubTipServ": "01",
            "TipoDeServ": "01"
          }
        ]
      },
      "TotalISRRetenido": "0",
      "TotalIVARetenido": 8,
      "TotalIVATrasladado": 16
    },
    "Totales": {
      "ImpRetenidos": [
        {
          "BaseRet": 16,
          "ImpuestoRet": "002",
          "MontoRet": 8,
          "TipoPagoRet": "01"
        }
      ],
      "ISRCorrespondiente": "",
      "MontoTotExent": 0,
      "MontoTotGrav": 100,
      "MontoTotOperacion": 100,
      "MontoTotRet": 8
    }
  })

};
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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Nacional": {
      "CURPR": "XEXX010101HNEXXXA4",
      "DomicilioFiscalR": "63180",
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "RfcR": "WATM640917J45"
    },
    "NacionalidadR": "Nacional",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "ServiciosPlataformasTecnologicas": {
    "DifIVAEntregadoPrestServ": 8,
    "MonTotalContribucionGubernamental": 11,
    "MonTotalporUsoPlataforma": 10,
    "MonTotServSIVA": 100,
    "NumServ": 1,
    "Periodicidad": "03",
    "Servicios": {
      "DetallesDelServicio": [
        {
          "ComisionDelServicio": {
            "Base": "100",
            "Importe": "10",
            "Porcentaje": "0.10"
          },
          "ContribucionGubernamental": {
            "EntidadDondePagaLaContribucion": "14",
            "ImpContrib": "11"
          },
          "FechaServ": "2022-09-21",
          "FormaPagoServ": "06",
          "ImpuestosTrasladadosdelServicio": {
            "Base": "100",
            "Importe": 16,
            "Impuesto": "02",
            "TasaCuota": "0.160000",
            "TipoFactor": "Tasa"
          },
          "PrecioServSinIVA": "100",
          "RFCTerceroAutorizado": "",
          "SubTipServ": "01",
          "TipoDeServ": "01"
        }
      ]
    },
    "TotalISRRetenido": "0",
    "TotalIVARetenido": 8,
    "TotalIVATrasladado": 16
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})
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")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Nacional": {
      "CURPR": "XEXX010101HNEXXXA4",
      "DomicilioFiscalR": "63180",
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "RfcR": "WATM640917J45"
    },
    "NacionalidadR": "Nacional",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "ServiciosPlataformasTecnologicas": {
    "DifIVAEntregadoPrestServ": 8,
    "MonTotalContribucionGubernamental": 11,
    "MonTotalporUsoPlataforma": 10,
    "MonTotServSIVA": 100,
    "NumServ": 1,
    "Periodicidad": "03",
    "Servicios": {
      "DetallesDelServicio": [
        {
          "ComisionDelServicio": {
            "Base": "100",
            "Importe": "10",
            "Porcentaje": "0.10"
          },
          "ContribucionGubernamental": {
            "EntidadDondePagaLaContribucion": "14",
            "ImpContrib": "11"
          },
          "FechaServ": "2022-09-21",
          "FormaPagoServ": "06",
          "ImpuestosTrasladadosdelServicio": {
            "Base": "100",
            "Importe": 16,
            "Impuesto": "02",
            "TasaCuota": "0.160000",
            "TipoFactor": "Tasa"
          },
          "PrecioServSinIVA": "100",
          "RFCTerceroAutorizado": "",
          "SubTipServ": "01",
          "TipoDeServ": "01"
        }
      ]
    },
    "TotalISRRetenido": "0",
    "TotalIVARetenido": 8,
    "TotalIVATrasladado": 16
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})

response = https.request(request)
puts response.read_body

Ejemplo para crear una nueva retención cuando el receptor es extranjero

<?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 =>'{
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
        "Ejercicio": "2022",
        "MesFin": "09",
        "MesIni": "09"
    },
    "Receptor": {
        "Extranjero": {
            "NumRegIdTrib": "12-3456789",
            "NomDenRazSocR": "MARIA WATEMBER TORRES"
        }
        "NacionalidadR": "Extranjero",
        "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
        "TipoRelacion": "05",
        "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "ServiciosPlataformasTecnologicas": {
        "DifIVAEntregadoPrestServ": 8,
        "MonTotalContribucionGubernamental": 11,
        "MonTotalporUsoPlataforma": 10,
        "MonTotServSIVA": 100,
        "NumServ": 1,
        "Periodicidad": "03",
        "Servicios": {
            "DetallesDelServicio": [
                {
                    "ComisionDelServicio": {
                        "Base": "100",
                        "Importe": "10",
                        "Porcentaje": "0.10"
                    },
                    "ContribucionGubernamental": {
                        "EntidadDondePagaLaContribucion": "14",
                        "ImpContrib": "11"
                    },
                    "FechaServ": "2022-09-21",
                    "FormaPagoServ": "06",
                    "ImpuestosTrasladadosdelServicio": {
                        "Base": "100",
                        "Importe": 16,
                        "Impuesto": "02",
                        "TasaCuota": "0.160000",
                        "TipoFactor": "Tasa"
                    },
                    "PrecioServSinIVA": "100",
                    "RFCTerceroAutorizado": "",
                    "SubTipServ": "01",
                    "TipoDeServ": "01"
                }
            ]
        },
        "TotalISRRetenido": "0",
        "TotalIVARetenido": 8,
        "TotalIVATrasladado": 16
    },
    "Totales": {
        "ImpRetenidos": [
            {
                "BaseRet": 16,
                "ImpuestoRet": "002",
                "MontoRet": 8,
                "TipoPagoRet": "01"
            }
        ],
        "ISRCorrespondiente": "",
        "MontoTotExent": 0,
        "MontoTotGrav": 100,
        "MontoTotOperacion": 100,
        "MontoTotRet": 8
    }
}',
  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({
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
      "Ejercicio": "2022",
      "MesFin": "09",
      "MesIni": "09"
    },
    "Receptor": {
      "Extranjero": {
        "NomDenRazSocR": "MARIA WATEMBER TORRES",
        "NumRegIdTrib": "12-3456789"
      },
      "NacionalidadR": "Extranjero",
      "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
      "TipoRelacion": "05",
      "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "ServiciosPlataformasTecnologicas": {
      "DifIVAEntregadoPrestServ": 8,
      "MonTotalContribucionGubernamental": 11,
      "MonTotalporUsoPlataforma": 10,
      "MonTotServSIVA": 100,
      "NumServ": 1,
      "Periodicidad": "03",
      "Servicios": {
        "DetallesDelServicio": [
          {
            "ComisionDelServicio": {
              "Base": "100",
              "Importe": "10",
              "Porcentaje": "0.10"
            },
            "ContribucionGubernamental": {
              "EntidadDondePagaLaContribucion": "14",
              "ImpContrib": "11"
            },
            "FechaServ": "2022-09-21",
            "FormaPagoServ": "06",
            "ImpuestosTrasladadosdelServicio": {
              "Base": "100",
              "Importe": 16,
              "Impuesto": "02",
              "TasaCuota": "0.160000",
              "TipoFactor": "Tasa"
            },
            "PrecioServSinIVA": "100",
            "RFCTerceroAutorizado": "",
            "SubTipServ": "01",
            "TipoDeServ": "01"
          }
        ]
      },
      "TotalISRRetenido": "0",
      "TotalIVARetenido": 8,
      "TotalIVATrasladado": 16
    },
    "Totales": {
      "ImpRetenidos": [
        {
          "BaseRet": 16,
          "ImpuestoRet": "002",
          "MontoRet": 8,
          "TipoPagoRet": "01"
        }
      ],
      "ISRCorrespondiente": "",
      "MontoTotExent": 0,
      "MontoTotGrav": 100,
      "MontoTotOperacion": 100,
      "MontoTotRet": 8
    }
  })

};
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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Extranjero": {
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "NumRegIdTrib": "12-3456789"
    },
    "NacionalidadR": "Extranjero",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "ServiciosPlataformasTecnologicas": {
    "DifIVAEntregadoPrestServ": 8,
    "MonTotalContribucionGubernamental": 11,
    "MonTotalporUsoPlataforma": 10,
    "MonTotServSIVA": 100,
    "NumServ": 1,
    "Periodicidad": "03",
    "Servicios": {
      "DetallesDelServicio": [
        {
          "ComisionDelServicio": {
            "Base": "100",
            "Importe": "10",
            "Porcentaje": "0.10"
          },
          "ContribucionGubernamental": {
            "EntidadDondePagaLaContribucion": "14",
            "ImpContrib": "11"
          },
          "FechaServ": "2022-09-21",
          "FormaPagoServ": "06",
          "ImpuestosTrasladadosdelServicio": {
            "Base": "100",
            "Importe": 16,
            "Impuesto": "02",
            "TasaCuota": "0.160000",
            "TipoFactor": "Tasa"
          },
          "PrecioServSinIVA": "100",
          "RFCTerceroAutorizado": "",
          "SubTipServ": "01",
          "TipoDeServ": "01"
        }
      ]
    },
    "TotalISRRetenido": "0",
    "TotalIVARetenido": 8,
    "TotalIVATrasladado": 16
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})
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")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Extranjero": {
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "NumRegIdTrib": "12-3456789"
    },
    "NacionalidadR": "Extranjero",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "ServiciosPlataformasTecnologicas": {
    "DifIVAEntregadoPrestServ": 8,
    "MonTotalContribucionGubernamental": 11,
    "MonTotalporUsoPlataforma": 10,
    "MonTotServSIVA": 100,
    "NumServ": 1,
    "Periodicidad": "03",
    "Servicios": {
      "DetallesDelServicio": [
        {
          "ComisionDelServicio": {
            "Base": "100",
            "Importe": "10",
            "Porcentaje": "0.10"
          },
          "ContribucionGubernamental": {
            "EntidadDondePagaLaContribucion": "14",
            "ImpContrib": "11"
          },
          "FechaServ": "2022-09-21",
          "FormaPagoServ": "06",
          "ImpuestosTrasladadosdelServicio": {
            "Base": "100",
            "Importe": 16,
            "Impuesto": "02",
            "TasaCuota": "0.160000",
            "TipoFactor": "Tasa"
          },
          "PrecioServSinIVA": "100",
          "RFCTerceroAutorizado": "",
          "SubTipServ": "01",
          "TipoDeServ": "01"
        }
      ]
    },
    "TotalISRRetenido": "0",
    "TotalIVARetenido": 8,
    "TotalIVATrasladado": 16
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})

response = https.request(request)
puts response.read_body

Respuestas de crear una nueva retención con complemento de plataformas tecnologicas

Ejemplo de respuesta exitosa.

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "1ce30fd7-ed65-4842-ad6a-44ef5d2ae2fc",
    "uid": "632b884246860",
    "SAT": {
        "UUID": "1ce30fd7-ed65-4842-ad6a-44ef5d2ae2fc",
        "FechaTimbrado": "2022-09-21T16:55:12",
        "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": "RET",
        "Folio": 257
    },
    "invoice_uid": "632b884246860"
}

Ejemplo de respuesta erronea en los campos del complemento

{
    "response": "error",
    "message": "SPT131 - El valor del atributo “DifIVAEntregadoPrestServ” es diferente al valor del atributo “TotalIVATrasladado” menos la suma de los atributos “Importe” del nodo “ImpuestosTrasladadosdelServicio” si el valor registrado en el atributo “FormaPagoServ” es “01” (Efectivo) menos el valor del atributo “TotalIVARetenido”.",
    "xmlerror": "<?xml version=\"1.0\" encoding=\"UTF-8\"....................
}

Ejemplo de respuesta erronea de autenticación

{
    "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.

Complemento de Intereses

A continuación se explica el método con el cual podremos crear una retención incluyendo el complemento de intereses

Podemos crear una retención a la cual incluiremos el complemeto de intereses utilizando los siguientes parametros.

 Parámetro Tipo Requerido Detalles
 intereses Arreglo Requerido Es el arreglo que contiene toda la informacion correspondiente a el complemento de intereses, debemos incluir este nodo con su informacion para que se genere correctamente nuestra retención con el complemento de intereses
 version String Requerido

 Indica la version de el complemento de intereses que se utiliza en esta ocasion solo se debe enviar el valor 1.0

Ejemplo:

"1.0"

 sistFinanciero String Requerido

 Atributo requerido para expresar si los interés obtenidos en el periodo o ejercicio provienen del sistema financiero admite los siguientes valores

Ejemplo:

"SI"

"NO"

 retiroAORESRetInt String Requerido Atributo requerido para expresar si los intereses obtenidos fueron retirados en el periodo o ejercicio admite los siguientes valores

Ejemplo:

"SI"

"NO"

 operFinancDerivad String Requerido

 Atributo requerido para expresar si los intereses obtenidos corresponden a operaciones financieras derivadas admite los siguientes valores

Ejemplo:

"SI"

"NO"

 montIntNominal Numerico Requerido Atributo requerido para expresar el importe del interés Nóminal obtenido en un periodo o ejercicio
 montIntReal Numerico Requerido Atributo requerido para expresar el monto de los intereses reales (diferencia que se obtiene restando al tipo de interés nominal y la tasa de inflación del periodo o ejercicio )
 perdida Numerico Requerido Atributo requerido para expresar la pérdida por los intereses obtenidos en el periodo o ejercicio

Construcción de la URL para crear una retención con complemento de Intereses

Importante

El método que se utiliza para la creación de una retención con complemento de intereses es 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 código de ejemplo es necesario que reemplaces el texto Ingresa Tu API key por el API KEY de tu cuenta, e Ingresa Tu Secret key por el SECRET KEY correspondiente.

Ejemplo para crear una nueva retención con complemento de intereses

<?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 =>'{
  "CveRetenc": "07",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "62b1dcf75a60f",
    "NacionalidadR": "Nacional",
    "Nacional": {
      "RFCRecep": "CACX7605101P8",
      "NomDenRazSocR": "XOCHILT CASAS CHAVEZ",
      "CURPR": ""
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "02",
    "Ejercicio": "2023"
  },
  "Totales": {
    "MontoTotOperacion": "300",
    "MontoTotGrav": "100",
    "MontoTotExent": "200",
    "MontoTotRet": "10",
    "ImpRetenidos": [
      {
        "BaseRet": "14",
        "Impuesto": "02",
        "MontoRet": "10",
        "TipoPagoRet": "03"
      }
    ]
  },
  "intereses": {
    "version": "1.0",
    "sistFinanciero": "SI",
    "retiroAORESRetInt": "SI",
    "operFinancDerivad": "SI",
    "montIntNominal": 791.52,
    "montIntReal": 1000.88,
    "perdida": 500.31
  }
}',
  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({
    "CveRetenc": "07",
    "Emisor": {
      "CURPE": "OORB610222MZSRCL02"
    },
    "Receptor": {
      "UID": "62b1dcf75a60f",
      "NacionalidadR": "Nacional",
      "Nacional": {
        "RFCRecep": "CACX7605101P8",
        "NomDenRazSocR": "XOCHILT CASAS CHAVEZ",
        "CURPR": ""
      }
    },
    "Periodo": {
      "MesIni": "01",
      "MesFin": "02",
      "Ejercicio": "2023"
    },
    "Totales": {
      "MontoTotOperacion": "300",
      "MontoTotGrav": "100",
      "MontoTotExent": "200",
      "MontoTotRet": "10",
      "ImpRetenidos": [
        {
          "BaseRet": "14",
          "Impuesto": "02",
          "MontoRet": "10",
          "TipoPagoRet": "03"
        }
      ]
    },
    "intereses": {
      "version": "1.0",
      "sistFinanciero": "SI",
      "retiroAORESRetInt": "SI",
      "operFinancDerivad": "SI",
      "montIntNominal": 791.52,
      "montIntReal": 1000.88,
      "perdida": 500.31
    }
  })

};
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({
  "CveRetenc": "07",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "62b1dcf75a60f",
    "NacionalidadR": "Nacional",
    "Nacional": {
      "RFCRecep": "CACX7605101P8",
      "NomDenRazSocR": "XOCHILT CASAS CHAVEZ",
      "CURPR": ""
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "02",
    "Ejercicio": "2023"
  },
  "Totales": {
    "MontoTotOperacion": "300",
    "MontoTotGrav": "100",
    "MontoTotExent": "200",
    "MontoTotRet": "10",
    "ImpRetenidos": [
      {
        "BaseRet": "14",
        "Impuesto": "02",
        "MontoRet": "10",
        "TipoPagoRet": "03"
      }
    ]
  },
  "intereses": {
    "version": "1.0",
    "sistFinanciero": "SI",
    "retiroAORESRetInt": "SI",
    "operFinancDerivad": "SI",
    "montIntNominal": 791.52,
    "montIntReal": 1000.88,
    "perdida": 500.31
  }
})
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({
  "CveRetenc": "07",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "62b1dcf75a60f",
    "NacionalidadR": "Nacional",
    "Nacional": {
      "RFCRecep": "CACX7605101P8",
      "NomDenRazSocR": "XOCHILT CASAS CHAVEZ",
      "CURPR": ""
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "02",
    "Ejercicio": "2023"
  },
  "Totales": {
    "MontoTotOperacion": "300",
    "MontoTotGrav": "100",
    "MontoTotExent": "200",
    "MontoTotRet": "10",
    "ImpRetenidos": [
      {
        "BaseRet": "14",
        "Impuesto": "02",
        "MontoRet": "10",
        "TipoPagoRet": "03"
      }
    ]
  },
  "intereses": {
    "version": "1.0",
    "sistFinanciero": "SI",
    "retiroAORESRetInt": "SI",
    "operFinancDerivad": "SI",
    "montIntNominal": 791.52,
    "montIntReal": 1000.88,
    "perdida": 500.31
  }
})

response = http.request(request)
puts response.read_body

Respuesta de crear una nueva retención con complemento de intereses

Ejemplo de respuesta exitosa.

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "1ce30fd7-ed65-4842-ad6a-44ef5d2ae2fc",
    "uid": "632b884246860",
    "SAT": {
        "UUID": "1ce30fd7-ed65-4842-ad6a-44ef5d2ae2fc",
        "FechaTimbrado": "2022-09-21T16:55:12",
        "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": "RET",
        "Folio": 257
    },
    "invoice_uid": "632b884246860"
}

Ejemplo de respuesta erronea en los campos del complemento

{
  "response": "error",
  "message": "El campo 'sistFinanciero' es requerido. El campo 'retiroAORESRetInt' es requerido. "
}

Ejemplo de respuesta erronea de autenticación

{
    "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.

Complemento de Enajenación de acciones

A continuación se explica el método con el cual podremos crear una retención incluyendo el complemento de enajenación de acciones

Podemos crear una retención a la cual incluiremos el complemeto de enajenación de acciones utilizando los siguientes parametros.

 Parámetro Tipo Requerido Detalles
 EnajenacionDeAcciones Arreglo Requerido

 Es el arreglo que contiene toda la información relacionada a el complemento de enajenació de acciones

Este debe incluirse en el cuerpo de el CFDI de retención al momento de timbrar para que incluya el complemento

 ContratoIntermediacion String Requerido

 Atributo requerido para expresar la descripción del contrato de intermediación

Ejemplo:

"Contrato de prueba llevado acabo en México en 19/Julio/2023"

 Ganancia Numerico Requerido

 Atributo requerido para expresar la ganancia obtenida por la enajenación de acciones u operación de valores

Ejemplo:

1234.56

100.00

89

 Perdida Numerico Requerido

 Atributo requerido para expresar la pérdida en el contrato de intermediación

Ejemplo:

1234.56

100.00

89

Construcción de la URL para crear una retención con complemento de Enajenación de acciones

Importante

El método que se utiliza para la creación de una retención con complemento de enajenación de acciones es 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 código de ejemplo es necesario que reemplaces el texto Ingresa Tu API key por el API KEY de tu cuenta, e Ingresa Tu Secret key por el SECRET KEY correspondiente.

Ejemplo para crear una nueva retención con complemento de enajenación de acciones

<?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 =>'{
	"CveRetenc": "06",
	"LugarExpedicion": "42501",
	"Emisor": {
		"CURPE": "OORB610222MZSRCL02"
	},
	  "Receptor": {
		"UID": "6466605c19cfb",
		"NacionalidadR": "Nacional",
		"Nacional": {
			"CURPR": "XEXX010101HNEXXXA4",
			"DomicilioFiscalR": "01279",
			"NomDenRazSocR": "XAIME WEIR ROJO",
			"RfcR": "WERX631016S30"
		}
	},
	"Periodo": {
		"Ejercicio": "2023",
		"MesFin": "07",
		"MesIni": "07"
	},
	"Totales": {
		"ImpRetenidos": [
			{
				"BaseRet": "10000",
				"ImpuestoRet": "002",
				"MontoRet": "1600",
				"TipoPagoRet": "01"
			}
		],
		"ISRCorrespondiente": "",
		"MontoTotExent": "0",
		"MontoTotGrav": "11600",
		"MontoTotOperacion": 11600,
		"MontoTotRet": 1600,
		"UtilidadBimestral": ""
	},
	"DescRetenc": "0.00",
	"EnajenacionDeAcciones": {
		"ContratoIntermediacion": "Contrato de prueba llevado acabo en México en 19/Julio/2023",
		"Ganancia": 1234.56,
		"Perdida": 89
	}
}',
  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({
    "CveRetenc": "06",
    "LugarExpedicion": "42501",
    "Emisor": {
      "CURPE": "OORB610222MZSRCL02"
    },
    "Receptor": {
      "UID": "6466605c19cfb",
      "NacionalidadR": "Nacional",
      "Nacional": {
        "CURPR": "XEXX010101HNEXXXA4",
        "DomicilioFiscalR": "01279",
        "NomDenRazSocR": "XAIME WEIR ROJO",
        "RfcR": "WERX631016S30"
      }
    },
    "Periodo": {
      "Ejercicio": "2023",
      "MesFin": "07",
      "MesIni": "07"
    },
    "Totales": {
      "ImpRetenidos": [
        {
          "BaseRet": "10000",
          "ImpuestoRet": "002",
          "MontoRet": "1600",
          "TipoPagoRet": "01"
        }
      ],
      "ISRCorrespondiente": "",
      "MontoTotExent": "0",
      "MontoTotGrav": "11600",
      "MontoTotOperacion": 11600,
      "MontoTotRet": 1600,
      "UtilidadBimestral": ""
    },
    "DescRetenc": "0.00",
    "EnajenacionDeAcciones": {
      "ContratoIntermediacion": "Contrato de prueba llevado acabo en México en 19/Julio/2023",
      "Ganancia": 1234.56,
      "Perdida": 89
    }
  })

};
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({
  "CveRetenc": "06",
  "LugarExpedicion": "42501",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "6466605c19cfb",
    "NacionalidadR": "Nacional",
    "Nacional": {
      "CURPR": "XEXX010101HNEXXXA4",
      "DomicilioFiscalR": "01279",
      "NomDenRazSocR": "XAIME WEIR ROJO",
      "RfcR": "WERX631016S30"
    }
  },
  "Periodo": {
    "Ejercicio": "2023",
    "MesFin": "07",
    "MesIni": "07"
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": "10000",
        "ImpuestoRet": "002",
        "MontoRet": "1600",
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": "0",
    "MontoTotGrav": "11600",
    "MontoTotOperacion": 11600,
    "MontoTotRet": 1600,
    "UtilidadBimestral": ""
  },
  "DescRetenc": "0.00",
  "EnajenacionDeAcciones": {
    "ContratoIntermediacion": "Contrato de prueba llevado acabo en México en 19/Julio/2023",
    "Ganancia": 1234.56,
    "Perdida": 89
  }
})
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({
  "CveRetenc": "06",
  "LugarExpedicion": "42501",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "6466605c19cfb",
    "NacionalidadR": "Nacional",
    "Nacional": {
      "CURPR": "XEXX010101HNEXXXA4",
      "DomicilioFiscalR": "01279",
      "NomDenRazSocR": "XAIME WEIR ROJO",
      "RfcR": "WERX631016S30"
    }
  },
  "Periodo": {
    "Ejercicio": "2023",
    "MesFin": "07",
    "MesIni": "07"
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": "10000",
        "ImpuestoRet": "002",
        "MontoRet": "1600",
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": "0",
    "MontoTotGrav": "11600",
    "MontoTotOperacion": 11600,
    "MontoTotRet": 1600,
    "UtilidadBimestral": ""
  },
  "DescRetenc": "0.00",
  "EnajenacionDeAcciones": {
    "ContratoIntermediacion": "Contrato de prueba llevado acabo en México en 19/Julio/2023",
    "Ganancia": 1234.56,
    "Perdida": 89
  }
})

response = http.request(request)
puts response.read_body

Respuesta de crear una nueva retención con complemento de enajenación de acciones

Ejemplo de respuesta exitosa.

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "4f16a273-bd90-4233-adbd-21222631cea1",
    "uid": "64b83335ab15f",
    "SAT": {
        "UUID": "4f16a273-bd90-4233-adbd-21222631cea1",
        "FechaTimbrado": "2023-07-19T13:02:12",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "YqiUXhIngszLvVDZiwesjnnibDkBO9QV3kmcMOyWWUrb32GxAcRbAmmZTSPzj3OhES1K5EHGN+j5SAJNyG7kl+leXdK/gC5c9BcBz5Tj/zRNhJmA/6tSy5p6cCaGPWzIiMIY5K5FBgsJmGTNhJ3tQ7xtDTfglgiVunJNvtZ36QhKqrsJbAmr672GYiLaL3zep2ub3h/KAQO2btUay91mhNsWLmk5AuSlc2vZoxgWrYMHePwPQQ0I50R45gejGXz7xOHc/94xEZUjjmeaJ0VAPqQ7vUg1m1Al2f8bD03pAq23nmPeVVe/B6mFvF77vZMhyZkIyfdhsgXQVUJdEVkOCA==",
        "SelloCFD": "bp1xPhtkU6lkvzxPjiy8cxFmdsMabxoHYIrbY67zXfE5HNH308Gq5xgPJQSYBimkFNrhWCwmDlOtwN/NCsldn1SJlYWvvzVspyY6f8IWOu7HXEigquQfPFVLbv54SIMS4mvFFmc4DngggGE0k3nAny/BJLpZNg0SYvMlAcuiaCU0YkbwJzir4n2rnl81dL89nTpVbshaECzGr1+myw1JQa1bbbb1eEVaYOjuKmKjbadR6uVrMqmxHW0Tfv+LADzC8VjMwvlRJ/J9h+B8xYBrGhAO8/SmMHKlw5oK2OmqZd71EkpAAPvs5vXNvUFdTgNitOq5mfVH6DiMWzGkOrtE9g=="
    },
    "INV": {
        "Serie": "RET",
        "Folio": 317
    },
    "invoice_uid": "64b83335ab15f"
}

Ejemplo de respuesta erronea en los campos del complemento

{
    "response": "error",
    "message": "El campo 'Ganancia' es requerido. "
}

Ejemplo de respuesta erronea de autenticación

{
    "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.

Complemento de intereses hipotecarios

A continuación se explica el método con el cual podremos crear una retención incluyendo el complemento de intereses hipotecarios.

Podemos crear una retención a la cual incluiremos el complemeto de intereses hipotecarios utilizando los siguientes parametros.

 Párametro Tipo Requerido Detalles
 CreditoDeInstFinanc String Requerido

Atributo requerido para expresar si el crédito otorgado fue por institución financiera.

Admnite los siguientes valores:

SI
NO

 SaldoInsoluto Numerico RequeridoAtributo requerido para expresar el saldo insoluto al 31 de diciembre del ejercicio inmediato anterior o fecha de contratación si se llevo a cabo en el ejercicio en curso. 
 PropDeducDelCredit Numerico Opcional Atributo opcional que expresa la proporción deducible del crédito aplicable sobre los intereses reales devengados y pagados.
 MontTotIntNominalesDev Numerico Opcional Atributo opcional que expresa el monto total de intereses nominales devengados.
 MontTotIntNominalesDevYPag Numerico Opcional Atributo opcional que expresa el monto total de intereses nominales devengados y pagados.
 MontTotIntRealPagDeduc Numerico Opcional Atributo opcional que expresa el monto total de intereses reales pagados deducibles.
 NumContrato Numerico Opcional Atributo opcional que expresa el número de contrato del crédito hipotecario.

Construcción de la URL para crear una retención con complemento de intereses hipotecarios

Importante

El método que se utiliza para la creación de una retención con complemento de intereses hipotecarios es 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 cuando el receptor es nacional

<?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 =>'{
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
        "Ejercicio": "2022",
        "MesFin": "09",
        "MesIni": "09"
    },
    "Receptor": {
        "Nacional": {
            "CURPR": "XEXX010101HNEXXXA4",
            "DomicilioFiscalR": "63180",
            "NomDenRazSocR": "MARIA WATEMBER TORRES",
            "RfcR": "WATM640917J45"
        },
        "NacionalidadR": "Nacional",
        "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
        "TipoRelacion": "05",
        "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "InteresesHipotecarios": {
      "CreditoDeInstFinanc": "NO",
      "SaldoInsoluto": "1000",
      "PropDeducDelCredit": "2000",
      "MontTotIntNominalesDev": "3000",
      "MontTotIntNominalesDevYPag": "4000",
      "MontTotIntRealPagDeduc": "5000",
      "NumContrato": "6000"
    },
    "Totales": {
        "ImpRetenidos": [
            {
                "BaseRet": 16,
                "ImpuestoRet": "002",
                "MontoRet": 8,
                "TipoPagoRet": "01"
            }
        ],
        "ISRCorrespondiente": "",
        "MontoTotExent": 0,
        "MontoTotGrav": 100,
        "MontoTotOperacion": 100,
        "MontoTotRet": 8
    }
}',
  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({
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
      "Ejercicio": "2022",
      "MesFin": "09",
      "MesIni": "09"
    },
    "Receptor": {
      "Nacional": {
        "CURPR": "XEXX010101HNEXXXA4",
        "DomicilioFiscalR": "63180",
        "NomDenRazSocR": "MARIA WATEMBER TORRES",
        "RfcR": "WATM640917J45"
      },
      "NacionalidadR": "Nacional",
      "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
      "TipoRelacion": "05",
      "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "InteresesHipotecarios": {
      "CreditoDeInstFinanc": "NO",
      "SaldoInsoluto": "1000",
      "PropDeducDelCredit": "2000",
      "MontTotIntNominalesDev": "3000",
      "MontTotIntNominalesDevYPag": "4000",
      "MontTotIntRealPagDeduc": "5000",
      "NumContrato": "6000"
    },
    "Totales": {
      "ImpRetenidos": [
        {
          "BaseRet": 16,
          "ImpuestoRet": "002",
          "MontoRet": 8,
          "TipoPagoRet": "01"
        }
      ],
      "ISRCorrespondiente": "",
      "MontoTotExent": 0,
      "MontoTotGrav": 100,
      "MontoTotOperacion": 100,
      "MontoTotRet": 8
    }
  })

};
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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Nacional": {
      "CURPR": "XEXX010101HNEXXXA4",
      "DomicilioFiscalR": "63180",
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "RfcR": "WATM640917J45"
    },
    "NacionalidadR": "Nacional",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "InteresesHipotecarios": {
      "CreditoDeInstFinanc": "NO",
      "SaldoInsoluto": "1000",
      "PropDeducDelCredit": "2000",
      "MontTotIntNominalesDev": "3000",
      "MontTotIntNominalesDevYPag": "4000",
      "MontTotIntRealPagDeduc": "5000",
      "NumContrato": "6000"
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})
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")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Nacional": {
      "CURPR": "XEXX010101HNEXXXA4",
      "DomicilioFiscalR": "63180",
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "RfcR": "WATM640917J45"
    },
    "NacionalidadR": "Nacional",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "InteresesHipotecarios": {
      "CreditoDeInstFinanc": "NO",
      "SaldoInsoluto": "1000",
      "PropDeducDelCredit": "2000",
      "MontTotIntNominalesDev": "3000",
      "MontTotIntNominalesDevYPag": "4000",
      "MontTotIntRealPagDeduc": "5000",
      "NumContrato": "6000"
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})

response = https.request(request)
puts response.read_body

Ejemplo para crear una nueva retención cuando el receptor es extranjero

<?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 =>'{
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
        "Ejercicio": "2022",
        "MesFin": "09",
        "MesIni": "09"
    },
    "Receptor": {
        "Extranjero": {
            "NumRegIdTrib": "12-3456789",
            "NomDenRazSocR": "MARIA WATEMBER TORRES"
        }
        "NacionalidadR": "Extranjero",
        "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
        "TipoRelacion": "05",
        "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "InteresesHipotecarios": {
      "CreditoDeInstFinanc": "NO",
      "SaldoInsoluto": "1000",
      "PropDeducDelCredit": "2000",
      "MontTotIntNominalesDev": "3000",
      "MontTotIntNominalesDevYPag": "4000",
      "MontTotIntRealPagDeduc": "5000",
      "NumContrato": "6000"
    },
    "Totales": {
        "ImpRetenidos": [
            {
                "BaseRet": 16,
                "ImpuestoRet": "002",
                "MontoRet": 8,
                "TipoPagoRet": "01"
            }
        ],
        "ISRCorrespondiente": "",
        "MontoTotExent": 0,
        "MontoTotGrav": 100,
        "MontoTotOperacion": 100,
        "MontoTotRet": 8
    }
}',
  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({
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
      "Ejercicio": "2022",
      "MesFin": "09",
      "MesIni": "09"
    },
    "Receptor": {
      "Extranjero": {
        "NomDenRazSocR": "MARIA WATEMBER TORRES",
        "NumRegIdTrib": "12-3456789"
      },
      "NacionalidadR": "Extranjero",
      "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
      "TipoRelacion": "05",
      "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "InteresesHipotecarios": {
      "CreditoDeInstFinanc": "NO",
      "SaldoInsoluto": "1000",
      "PropDeducDelCredit": "2000",
      "MontTotIntNominalesDev": "3000",
      "MontTotIntNominalesDevYPag": "4000",
      "MontTotIntRealPagDeduc": "5000",
      "NumContrato": "6000"
    },
    "Totales": {
      "ImpRetenidos": [
        {
          "BaseRet": 16,
          "ImpuestoRet": "002",
          "MontoRet": 8,
          "TipoPagoRet": "01"
        }
      ],
      "ISRCorrespondiente": "",
      "MontoTotExent": 0,
      "MontoTotGrav": 100,
      "MontoTotOperacion": 100,
      "MontoTotRet": 8
    }
  })

};
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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Extranjero": {
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "NumRegIdTrib": "12-3456789"
    },
    "NacionalidadR": "Extranjero",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "InteresesHipotecarios": {
      "CreditoDeInstFinanc": "NO",
      "SaldoInsoluto": "1000",
      "PropDeducDelCredit": "2000",
      "MontTotIntNominalesDev": "3000",
      "MontTotIntNominalesDevYPag": "4000",
      "MontTotIntRealPagDeduc": "5000",
      "NumContrato": "6000"
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})
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")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Extranjero": {
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "NumRegIdTrib": "12-3456789"
    },
    "NacionalidadR": "Extranjero",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "InteresesHipotecarios": {
    "CreditoDeInstFinanc": "NO",
    "SaldoInsoluto": "1000",
    "PropDeducDelCredit": "2000",
    "MontTotIntNominalesDev": "3000",
    "MontTotIntNominalesDevYPag": "4000",
    "MontTotIntRealPagDeduc": "5000",
    "NumContrato": "6000"
  },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})

response = https.request(request)
puts response.read_body

Respuestas de crear una nueva retención con complemento de intereses hipotecarios

Ejemplo de respuesta exitosa.

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "8e8a606c-a9e8-4dac-9d73-d090fa164854",
    "uid": "657a3fa267e17",
    "SAT": {
        "UUID": "8e8a606c-a9e8-4dac-9d73-d090fa164854",
        "FechaTimbrado": "2023-12-13T17:34:56",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "Gi13SQ2wkdQ4OeKb34K4gHl5mobPocFrkP0ZHOE49aEnpMsu9dVBOjFiRKMK/l8M4Y1lLKAlHtjxfuTfVN3sEibVzkeS4qkVqBOU6GIPymLTa0BZuG0B31IYAFeD/Z+m45G6zMe+o8hQZZQH6A3V5umWPtaJPiDqqTpVMcxpIPXhbrHEwOW3QrkPJJhdC9D3NjkGGm2tQURt3ZEyvR7WrY0L6bVNmhbNld+1Aq4f5Ue1cCw1IKE5HzhnPrL8pz0t3Xss0PWzP3tbsdCfU5o5E9QpOetHxqXwKsjZXWVdOyaNl1tlxeUzl3YwUcZTGatDtd+/Ns6ckLNRizGiLHiQrA==",
        "SelloCFD": "gANrkZMnn+uXxos+kfkyu8sIkwLOql8l5in84f/VO8YKkB1+wtdsQLzKKkZoByLiZwkO6dPE6woL68c5LazjRzrOVzIBhPQEssdVO9zEvl8Mbb1BYoWKt0tMwe5Lytiq2wbxqgo3pMxEugX5luVOU++2PvJHZJcTAGOuSFdffgfQxx9qh8DbVxm+HvhrZeopi8pw2WoMFbClDgvQoXNiL+0Cgpd96pKMYqGLMZkkb3dqCy8uRIK7XeixaFMvxeZJM1rX9Lbn1qmO2i961t670bEPtPSJuvLgasGGZ3uD0kMw5KbWgx0oH6KDel0SIjbOjWh4vwJ1ZnIUYWgCqtbtFA=="
    },
    "INV": {
        "Serie": "RT",
        "Folio": 78
    },
    "invoice_uid": "657a3fa267e17"
}

Ejemplo de respuesta erronea en los campos del complemento

{
    "response": "error",
    "message": "El campo 'CreditoDeInstFinanc' solo puede tener los valores SI o NO. "
}
{
    "response": "error",
    "message": "El campo 'SaldoInsoluto' es requerido. "
}

Ejemplo de respuesta erronea de autenticación

{
    "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.

Complemento de dividendos

A continuación se explica el método con el cual podremos crear una retención incluyendo el complemento de dividendos

Podemos crear una retención a la cual incluiremos el complemeto de dividendos utilizando los siguientes parametros.

 Párametro Tipo Requerido Detalles
 CveTIpDivOUtil String Requerido

 Atributo requerido para expresar la clave del tipo de dividendo o utilidad distribuida de acuerdo al catálogo.

Ejemplo: "01"

Admite los siguientes valores

01 - Proviene de CUFIN

02 - No proviene de CUFIN

03 - Reembolso o reducción de capital

04 - Liquidación de la persona moral

05 - CUFINRE

06 - Proviene de CUFIN al 31 de diciembre 2013

 MontISRAcredRetMexico Numerico Requerido Atributo requerido para expresar el importe o retención del dividendo o utilidad en territorio nacional.
 MontISRAcredRetExtranjero Numerico Requerido Atributo requerido para expresar el importe o retención del dividendo o utilidad en territorio extranjero.
 MontRetExtDivExt Numerico Opcional Atributo opcional para expresar el monto de la retención en el extranjero sobre dividendos del extranjero.
 TipoSocDistrDiv String Requerido

 Atributo requerido para expresar si el dividendo es distribuido por sociedades nacionales o extranjeras.

Admite los siguientes valores:

Sociedad Nacional

Sociedad Extranjera

 MontISRAcredNal Numerico Opcional Atributo opcional para expresar el monto del ISR acreditable nacional.
 MontDivAcumNal Numerico Opcional Atributo opcional para expresar el monto del dividendo acumulable naciona.
 MontDivAcumExt Numerico Opcional Atributo opcional para expresar el monto del dividendo acumulable extranjero.
 ProporcionRem Numerico Opcional Atributo opcional que expresa el porcentaje de participación de sus integrantes o accionistas.

Construcción de la URL para crear una retención con complemento de dividendos

Importante

El método que se utiliza para la creación de una retención con complemento de dividendos es 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 cuando el receptor es nacional

<?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 =>'{
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
        "Ejercicio": "2022",
        "MesFin": "09",
        "MesIni": "09"
    },
    "Receptor": {
        "Nacional": {
            "CURPR": "XEXX010101HNEXXXA4",
            "DomicilioFiscalR": "63180",
            "NomDenRazSocR": "MARIA WATEMBER TORRES",
            "RfcR": "WATM640917J45"
        },
        "NacionalidadR": "Nacional",
        "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
        "TipoRelacion": "05",
        "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "Dividendos": {
        "CveTipDivOUtil": "01",
        "MontISRAcredRetMexico": "1200",
        "MontISRAcredRetExtranjero": "30000",
        "MontRetExtDivExt": "40000",
        "TipoSocDistrDiv": "Sociedad Nacional",
        "MontISRAcredNal": "100",
        "MontDivAcumNal": "200",
        "MontDivAcumExt": "300",
        "ProporcionRem": "10"
    },
    "Totales": {
        "ImpRetenidos": [
            {
                "BaseRet": 16,
                "ImpuestoRet": "002",
                "MontoRet": 8,
                "TipoPagoRet": "01"
            }
        ],
        "ISRCorrespondiente": "",
        "MontoTotExent": 0,
        "MontoTotGrav": 100,
        "MontoTotOperacion": 100,
        "MontoTotRet": 8
    }
}',
  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({
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
      "Ejercicio": "2022",
      "MesFin": "09",
      "MesIni": "09"
    },
    "Receptor": {
      "Nacional": {
        "CURPR": "XEXX010101HNEXXXA4",
        "DomicilioFiscalR": "63180",
        "NomDenRazSocR": "MARIA WATEMBER TORRES",
        "RfcR": "WATM640917J45"
      },
      "NacionalidadR": "Nacional",
      "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
      "TipoRelacion": "05",
      "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "Dividendos": {
        "CveTipDivOUtil": "01",
        "MontISRAcredRetMexico": "1200",
        "MontISRAcredRetExtranjero": "30000",
        "MontRetExtDivExt": "40000",
        "TipoSocDistrDiv": "Sociedad Nacional",
        "MontISRAcredNal": "100",
        "MontDivAcumNal": "200",
        "MontDivAcumExt": "300",
        "ProporcionRem": "10"
    },
    "Totales": {
      "ImpRetenidos": [
        {
          "BaseRet": 16,
          "ImpuestoRet": "002",
          "MontoRet": 8,
          "TipoPagoRet": "01"
        }
      ],
      "ISRCorrespondiente": "",
      "MontoTotExent": 0,
      "MontoTotGrav": 100,
      "MontoTotOperacion": 100,
      "MontoTotRet": 8
    }
  })

};
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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Nacional": {
      "CURPR": "XEXX010101HNEXXXA4",
      "DomicilioFiscalR": "63180",
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "RfcR": "WATM640917J45"
    },
    "NacionalidadR": "Nacional",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "Dividendos": {
        "CveTipDivOUtil": "01",
        "MontISRAcredRetMexico": "1200",
        "MontISRAcredRetExtranjero": "30000",
        "MontRetExtDivExt": "40000",
        "TipoSocDistrDiv": "Sociedad Nacional",
        "MontISRAcredNal": "100",
        "MontDivAcumNal": "200",
        "MontDivAcumExt": "300",
        "ProporcionRem": "10"
    },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})
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")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Nacional": {
      "CURPR": "XEXX010101HNEXXXA4",
      "DomicilioFiscalR": "63180",
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "RfcR": "WATM640917J45"
    },
    "NacionalidadR": "Nacional",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "Dividendos": {
        "CveTipDivOUtil": "01",
        "MontISRAcredRetMexico": "1200",
        "MontISRAcredRetExtranjero": "30000",
        "MontRetExtDivExt": "40000",
        "TipoSocDistrDiv": "Sociedad Nacional",
        "MontISRAcredNal": "100",
        "MontDivAcumNal": "200",
        "MontDivAcumExt": "300",
        "ProporcionRem": "10"
    },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})

response = https.request(request)
puts response.read_body

Ejemplo para crear una nueva retención cuando el receptor es extranjero

<?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 =>'{
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
        "Ejercicio": "2022",
        "MesFin": "09",
        "MesIni": "09"
    },
    "Receptor": {
        "Extranjero": {
            "NumRegIdTrib": "12-3456789",
            "NomDenRazSocR": "MARIA WATEMBER TORRES"
        }
        "NacionalidadR": "Extranjero",
        "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
        "TipoRelacion": "05",
        "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "Dividendos": {
        "CveTipDivOUtil": "01",
        "MontISRAcredRetMexico": "1200",
        "MontISRAcredRetExtranjero": "30000",
        "MontRetExtDivExt": "40000",
        "TipoSocDistrDiv": "Sociedad Nacional",
        "MontISRAcredNal": "100",
        "MontDivAcumNal": "200",
        "MontDivAcumExt": "300",
        "ProporcionRem": "10"
    },
    "Totales": {
        "ImpRetenidos": [
            {
                "BaseRet": 16,
                "ImpuestoRet": "002",
                "MontoRet": 8,
                "TipoPagoRet": "01"
            }
        ],
        "ISRCorrespondiente": "",
        "MontoTotExent": 0,
        "MontoTotGrav": 100,
        "MontoTotOperacion": 100,
        "MontoTotRet": 8
    }
}',
  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({
    "CveRetenc": "26",
    "LugarExpedicion": "26015",
    "Periodo": {
      "Ejercicio": "2022",
      "MesFin": "09",
      "MesIni": "09"
    },
    "Receptor": {
      "Extranjero": {
        "NomDenRazSocR": "MARIA WATEMBER TORRES",
        "NumRegIdTrib": "12-3456789"
      },
      "NacionalidadR": "Extranjero",
      "UID": "62b1dcf75a60f"
    },
    "Relacionado": {
      "TipoRelacion": "05",
      "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
    },
    "Dividendos": {
        "CveTipDivOUtil": "01",
        "MontISRAcredRetMexico": "1200",
        "MontISRAcredRetExtranjero": "30000",
        "MontRetExtDivExt": "40000",
        "TipoSocDistrDiv": "Sociedad Nacional",
        "MontISRAcredNal": "100",
        "MontDivAcumNal": "200",
        "MontDivAcumExt": "300",
        "ProporcionRem": "10"
    },
    "Totales": {
      "ImpRetenidos": [
        {
          "BaseRet": 16,
          "ImpuestoRet": "002",
          "MontoRet": 8,
          "TipoPagoRet": "01"
        }
      ],
      "ISRCorrespondiente": "",
      "MontoTotExent": 0,
      "MontoTotGrav": 100,
      "MontoTotOperacion": 100,
      "MontoTotRet": 8
    }
  })

};
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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Extranjero": {
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "NumRegIdTrib": "12-3456789"
    },
    "NacionalidadR": "Extranjero",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "Dividendos": {
        "CveTipDivOUtil": "01",
        "MontISRAcredRetMexico": "1200",
        "MontISRAcredRetExtranjero": "30000",
        "MontRetExtDivExt": "40000",
        "TipoSocDistrDiv": "Sociedad Nacional",
        "MontISRAcredNal": "100",
        "MontDivAcumNal": "200",
        "MontDivAcumExt": "300",
        "ProporcionRem": "10"
    },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})
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")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

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({
  "CveRetenc": "26",
  "LugarExpedicion": "26015",
  "Periodo": {
    "Ejercicio": "2022",
    "MesFin": "09",
    "MesIni": "09"
  },
  "Receptor": {
    "Extranjero": {
      "NomDenRazSocR": "MARIA WATEMBER TORRES",
      "NumRegIdTrib": "12-3456789"
    },
    "NacionalidadR": "Extranjero",
    "UID": "62b1dcf75a60f"
  },
  "Relacionado": {
    "TipoRelacion": "05",
    "UUID": "7c2ecea6-afbc-46b1-95d0-535fc8e8bba9"
  },
  "Dividendos": {
        "CveTipDivOUtil": "01",
        "MontISRAcredRetMexico": "1200",
        "MontISRAcredRetExtranjero": "30000",
        "MontRetExtDivExt": "40000",
        "TipoSocDistrDiv": "Sociedad Nacional",
        "MontISRAcredNal": "100",
        "MontDivAcumNal": "200",
        "MontDivAcumExt": "300",
        "ProporcionRem": "10"
    },
  "Totales": {
    "ImpRetenidos": [
      {
        "BaseRet": 16,
        "ImpuestoRet": "002",
        "MontoRet": 8,
        "TipoPagoRet": "01"
      }
    ],
    "ISRCorrespondiente": "",
    "MontoTotExent": 0,
    "MontoTotGrav": 100,
    "MontoTotOperacion": 100,
    "MontoTotRet": 8
  }
})

response = https.request(request)
puts response.read_body

Respuestas de crear una nueva retención con complemento de dividendos

Ejemplo de respuesta exitosa.

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "8e8a606c-a9e8-4dac-9d73-d090fa164854",
    "uid": "657a3fa267e17",
    "SAT": {
        "UUID": "8e8a606c-a9e8-4dac-9d73-d090fa164854",
        "FechaTimbrado": "2023-12-13T17:34:56",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "Gi13SQ2wkdQ4OeKb34K4gHl5mobPocFrkP0ZHOE49aEnpMsu9dVBOjFiRKMK/l8M4Y1lLKAlHtjxfuTfVN3sEibVzkeS4qkVqBOU6GIPymLTa0BZuG0B31IYAFeD/Z+m45G6zMe+o8hQZZQH6A3V5umWPtaJPiDqqTpVMcxpIPXhbrHEwOW3QrkPJJhdC9D3NjkGGm2tQURt3ZEyvR7WrY0L6bVNmhbNld+1Aq4f5Ue1cCw1IKE5HzhnPrL8pz0t3Xss0PWzP3tbsdCfU5o5E9QpOetHxqXwKsjZXWVdOyaNl1tlxeUzl3YwUcZTGatDtd+/Ns6ckLNRizGiLHiQrA==",
        "SelloCFD": "gANrkZMnn+uXxos+kfkyu8sIkwLOql8l5in84f/VO8YKkB1+wtdsQLzKKkZoByLiZwkO6dPE6woL68c5LazjRzrOVzIBhPQEssdVO9zEvl8Mbb1BYoWKt0tMwe5Lytiq2wbxqgo3pMxEugX5luVOU++2PvJHZJcTAGOuSFdffgfQxx9qh8DbVxm+HvhrZeopi8pw2WoMFbClDgvQoXNiL+0Cgpd96pKMYqGLMZkkb3dqCy8uRIK7XeixaFMvxeZJM1rX9Lbn1qmO2i961t670bEPtPSJuvLgasGGZ3uD0kMw5KbWgx0oH6KDel0SIjbOjWh4vwJ1ZnIUYWgCqtbtFA=="
    },
    "INV": {
        "Serie": "RT",
        "Folio": 78
    },
    "invoice_uid": "657a3fa267e17"
}

Ejemplo de respuesta erronea en los campos del complemento

{
    "response": "error",
    "message": "El campo 'MontISRAcredRetMexico' es requerido. "
}

Ejemplo de respuesta erronea de autenticación

{
    "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.

Complemento de Arrendamiento en fideicomiso

Ahora veras como crear una retención utilizando el complemento de arrendamiento en fideicomiso.

Vamos a utilizar los siguientes parametros.

 Párametro Tipo Requerido Detalles
 PagProvEfecPorFiduc Numerico Requerido Atributo requerido para expresar el importe del pago efectuado por parte del fiduciario al arrendador de bienes en el periodo
 RendimFideicom Numerico Requerido Atributo requerido para expresar el importe de los rendimientos obtenidos en el periodo por el arrendamiento de bienes
 DeduccCorresp Numerico Requerido Atributo requerido para expresar el importe de las deducciones correspondientes al arrendamiento de los bienes durante el periodo.
 MontTotRet Numerico Opcional Atributo opcional para expresar el monto total de la retención del arrendamiento de los bienes del periodo.
 MontResFiscDistFibras Numerico Opcional Atributo opcional para expresar el monto del resultado fiscal distribuido por FIBRAS.
 MontOtrosConceptDistr Numerico Opcional Atributo opcional para expresar el monto de otros conceptos distribuidos.
 DescrMontOtrosConceptDistr String Opcional Atributo opcional para describir los conceptos distribuidos cuando se señalen otros conceptos.

Construcción de la URL para crear una retención con complemento de arrendamiento en fideicomiso

Importante

El método que se utiliza para la creación de una retención con complemento de arrendamiento en fideicomiso es 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 cuando el receptor es nacional

<?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": "45625",
  "CveRetenc": "17",
  "DescRetenc": 100,
  "Receptor": {
    "UID": "6661e28104f69",
    "NacionalidadR": "Nacional",
    "Nacional": {
      "RfcR": "S&S051221SE2",
      "NomDenRazSocR": "S & SOFTWARE",
      "CURPR": "",
      "DomicilioFiscalR": "76022"
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "03",
    "Ejercicio": "2024"
  },
  "Totales": {
    "MontoTotOperacion": 1010,
    "MontoTotGrav": 1000,
    "MontoTotExent": 10,
    "MontoTotRet": 10,
    "UtilidadBimestral": 1,
    "ISRCorrespondiente": 1,
    "ImpRetenidos": [
      {
        "BaseRet": 10,
        "ImpuestoRet": "001",
        "MontoRet": 10,
        "TipoPagoRet": "03"
      }
    ]
  },
  "ArrendamientoEnFideicomiso": {
    "PagProvEfecPorFiduc": 10,
    "RendimFideicom": 10,
    "DeduccCorresp": 10,
    "MontTotRet": 10,
    "MontResFiscDistFibras": 10,
    "MontOtrosConceptDistr": 10,
    "DescrMontOtrosConceptDistr": "Fideicomiso de Inversión y Bienes Raíces"
  }
} ',
  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": "45625",
    "CveRetenc": "17",
    "DescRetenc": 100,
    "Receptor": {
      "UID": "6661e28104f69",
      "NacionalidadR": "Nacional",
      "Nacional": {
        "RfcR": "S&S051221SE2",
        "NomDenRazSocR": "S & SOFTWARE",
        "CURPR": "",
        "DomicilioFiscalR": "76022"
      }
    },
    "Periodo": {
      "MesIni": "01",
      "MesFin": "03",
      "Ejercicio": "2024"
    },
    "Totales": {
      "MontoTotOperacion": 1010,
      "MontoTotGrav": 1000,
      "MontoTotExent": 10,
      "MontoTotRet": 10,
      "UtilidadBimestral": 1,
      "ISRCorrespondiente": 1,
      "ImpRetenidos": [
        {
          "BaseRet": 10,
          "ImpuestoRet": "001",
          "MontoRet": 10,
          "TipoPagoRet": "03"
        }
      ]
    },
    "ArrendamientoEnFideicomiso": {
      "PagProvEfecPorFiduc": 10,
      "RendimFideicom": 10,
      "DeduccCorresp": 10,
      "MontTotRet": 10,
      "MontResFiscDistFibras": 10,
      "MontOtrosConceptDistr": 10,
      "DescrMontOtrosConceptDistr": "Fideicomiso de Inversión y Bienes Raíces"
    }
  })

};
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": "45625",
  "CveRetenc": "17",
  "DescRetenc": 100,
  "Receptor": {
    "UID": "6661e28104f69",
    "NacionalidadR": "Nacional",
    "Nacional": {
      "RfcR": "S&S051221SE2",
      "NomDenRazSocR": "S & SOFTWARE",
      "CURPR": "",
      "DomicilioFiscalR": "76022"
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "03",
    "Ejercicio": "2024"
  },
  "Totales": {
    "MontoTotOperacion": 1010,
    "MontoTotGrav": 1000,
    "MontoTotExent": 10,
    "MontoTotRet": 10,
    "UtilidadBimestral": 1,
    "ISRCorrespondiente": 1,
    "ImpRetenidos": [
      {
        "BaseRet": 10,
        "ImpuestoRet": "001",
        "MontoRet": 10,
        "TipoPagoRet": "03"
      }
    ]
  },
  "ArrendamientoEnFideicomiso": {
    "PagProvEfecPorFiduc": 10,
    "RendimFideicom": 10,
    "DeduccCorresp": 10,
    "MontTotRet": 10,
    "MontResFiscDistFibras": 10,
    "MontOtrosConceptDistr": 10,
    "DescrMontOtrosConceptDistr": "Fideicomiso de Inversión y Bienes Raíces"
  }
})
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")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

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": "45625",
  "CveRetenc": "17",
  "DescRetenc": 100,
  "Receptor": {
    "UID": "6661e28104f69",
    "NacionalidadR": "Nacional",
    "Nacional": {
      "RfcR": "S&S051221SE2",
      "NomDenRazSocR": "S & SOFTWARE",
      "CURPR": "",
      "DomicilioFiscalR": "76022"
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "03",
    "Ejercicio": "2024"
  },
  "Totales": {
    "MontoTotOperacion": 1010,
    "MontoTotGrav": 1000,
    "MontoTotExent": 10,
    "MontoTotRet": 10,
    "UtilidadBimestral": 1,
    "ISRCorrespondiente": 1,
    "ImpRetenidos": [
      {
        "BaseRet": 10,
        "ImpuestoRet": "001",
        "MontoRet": 10,
        "TipoPagoRet": "03"
      }
    ]
  },
  "ArrendamientoEnFideicomiso": {
    "PagProvEfecPorFiduc": 10,
    "RendimFideicom": 10,
    "DeduccCorresp": 10,
    "MontTotRet": 10,
    "MontResFiscDistFibras": 10,
    "MontOtrosConceptDistr": 10,
    "DescrMontOtrosConceptDistr": "Fideicomiso de Inversión y Bienes Raíces"
  }
})

response = https.request(request)
puts response.read_body

Ejemplo para crear una nueva retención cuando el receptor es extranjero

<?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": "45625",
  "CveRetenc": "17",
  "DescRetenc": 100,
  "Receptor": {
    "UID": "66cdee7f059a5",
    "NacionalidadR": "Extranjero",
    "Nacional": {
      "RfcR": "XEXX010101000",
      "NomDenRazSocR": "CLIENTE EXTRANJERO",
      "CURPR": "",
      "DomicilioFiscalR": "00000"
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "03",
    "Ejercicio": "2024"
  },
  "Totales": {
    "MontoTotOperacion": 1010,
    "MontoTotGrav": 1000,
    "MontoTotExent": 10,
    "MontoTotRet": 10,
    "UtilidadBimestral": 1,
    "ISRCorrespondiente": 1,
    "ImpRetenidos": [
      {
        "BaseRet": 10,
        "ImpuestoRet": "001",
        "MontoRet": 10,
        "TipoPagoRet": "03"
      }
    ]
  },
  "ArrendamientoEnFideicomiso": {
    "PagProvEfecPorFiduc": 10,
    "RendimFideicom": 10,
    "DeduccCorresp": 10,
    "MontTotRet": 10,
    "MontResFiscDistFibras": 10,
    "MontOtrosConceptDistr": 10,
    "DescrMontOtrosConceptDistr": "Fideicomiso de Inversión y Bienes Raíces"
  }
} ',
  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": "45625",
    "CveRetenc": "17",
    "DescRetenc": 100,
    "Receptor": {
      "UID": "66cdee7f059a5",
      "NacionalidadR": "Extranjero",
      "Nacional": {
        "RfcR": "XEXX010101000",
        "NomDenRazSocR": "CLIENTE EXTRANJERO",
        "CURPR": "",
        "DomicilioFiscalR": "00000"
      }
    },
    "Periodo": {
      "MesIni": "01",
      "MesFin": "03",
      "Ejercicio": "2024"
    },
    "Totales": {
      "MontoTotOperacion": 1010,
      "MontoTotGrav": 1000,
      "MontoTotExent": 10,
      "MontoTotRet": 10,
      "UtilidadBimestral": 1,
      "ISRCorrespondiente": 1,
      "ImpRetenidos": [
        {
          "BaseRet": 10,
          "ImpuestoRet": "001",
          "MontoRet": 10,
          "TipoPagoRet": "03"
        }
      ]
    },
    "ArrendamientoEnFideicomiso": {
      "PagProvEfecPorFiduc": 10,
      "RendimFideicom": 10,
      "DeduccCorresp": 10,
      "MontTotRet": 10,
      "MontResFiscDistFibras": 10,
      "MontOtrosConceptDistr": 10,
      "DescrMontOtrosConceptDistr": "Fideicomiso de Inversión y Bienes Raíces"
    }
  })

};
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": "45625",
  "CveRetenc": "17",
  "DescRetenc": 100,
  "Receptor": {
    "UID": "66cdee7f059a5",
    "NacionalidadR": "Extranjero",
    "Nacional": {
      "RfcR": "XEXX010101000",
      "NomDenRazSocR": "CLIENTE EXTRANJERO",
      "CURPR": "",
      "DomicilioFiscalR": "00000"
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "03",
    "Ejercicio": "2024"
  },
  "Totales": {
    "MontoTotOperacion": 1010,
    "MontoTotGrav": 1000,
    "MontoTotExent": 10,
    "MontoTotRet": 10,
    "UtilidadBimestral": 1,
    "ISRCorrespondiente": 1,
    "ImpRetenidos": [
      {
        "BaseRet": 10,
        "ImpuestoRet": "001",
        "MontoRet": 10,
        "TipoPagoRet": "03"
      }
    ]
  },
  "ArrendamientoEnFideicomiso": {
    "PagProvEfecPorFiduc": 10,
    "RendimFideicom": 10,
    "DeduccCorresp": 10,
    "MontTotRet": 10,
    "MontResFiscDistFibras": 10,
    "MontOtrosConceptDistr": 10,
    "DescrMontOtrosConceptDistr": "Fideicomiso de Inversión y Bienes Raíces"
  }
})
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")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

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": "45625",
  "CveRetenc": "17",
  "DescRetenc": 100,
  "Receptor": {
    "UID": "66cdee7f059a5",
    "NacionalidadR": "Extranjero",
    "Nacional": {
      "RfcR": "XEXX010101000",
      "NomDenRazSocR": "CLIENTE EXTRANJERO",
      "CURPR": "",
      "DomicilioFiscalR": "00000"
    }
  },
  "Periodo": {
    "MesIni": "01",
    "MesFin": "03",
    "Ejercicio": "2024"
  },
  "Totales": {
    "MontoTotOperacion": 1010,
    "MontoTotGrav": 1000,
    "MontoTotExent": 10,
    "MontoTotRet": 10,
    "UtilidadBimestral": 1,
    "ISRCorrespondiente": 1,
    "ImpRetenidos": [
      {
        "BaseRet": 10,
        "ImpuestoRet": "001",
        "MontoRet": 10,
        "TipoPagoRet": "03"
      }
    ]
  },
  "ArrendamientoEnFideicomiso": {
    "PagProvEfecPorFiduc": 10,
    "RendimFideicom": 10,
    "DeduccCorresp": 10,
    "MontTotRet": 10,
    "MontResFiscDistFibras": 10,
    "MontOtrosConceptDistr": 10,
    "DescrMontOtrosConceptDistr": "Fideicomiso de Inversión y Bienes Raíces"
  }
})

response = https.request(request)
puts response.read_body

Respuestas de crear una nueva retención con complemento de arrendamiento en fideicomiso

Ejemplo de respuesta exitosa.

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "ee77a5d6-4aaa-4d2a-aa01-6faa091d5ddd",
    "uid": "66cdfeab8abde",
    "SAT": {
        "UUID": "ee77a5d6-4aaa-4d2a-aa01-6faa091d5ddd",
        "FechaTimbrado": "2024-08-27T11:28:30",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "hNLmG5SICq9yE9MsnP87wRkcaDI5QJUHUZKqzZsVHeuaQxZZnT4nHnpGPxXPliwYvP4OB/OH/3ykLMiwfj219Ni4OUkQqwStgtuue9WjDvEjVOZHDAv2CHTVby4eJeEmu8S3DS7dEq7GfgRaN2Tb9EdoVYCiNaqis8EtV7s2JnX9vqz0RVewrf4QJUFhWXcJKZprrOeTABwUWlelR7g5bQoPTFhn/S43zsU+euLTp1zd1/rveMRO8Sq9kUNb8tPeawGtZIlr2cazUblZUTNClDW4RMxqY6Ws9M8x8tNGDT6RW6rvY3Nmgx01PPN5aGLd/nCcWFJNdN0Rn8bWKT0MUg==",
        "SelloCFD": "FtQHn/Q2ItTs9R5npcV/i2JF0kzDFRXEqNqeiAgH2w2k5B/olTvDzVbBgsacu1TNbJtqL+dP4ZTYezVTTr4w2oVO1tBoiavVBMkfO+Y/Mr3rvoBF2oObkHG9sMGSTHkSmQJ/1Bfk9CJlQAM4P4/pcvzgD7UOWQ6U4VTPx1yjGTpfwkK2hunemV7xj+kmIQ5r/2BBHzBrolpUDBrtlPj0MilVdbZIkU5XLmA+xnvOq1jC9MeLkAhtweusCI4IQQeaQegl/6qVoJrFyRM1+k03xLj9VzmJtIVSd2ZrS0+VEgpv09Z0wUOiZKeVqzPiaG8uR97U4qAstHRVHoRY0RnMng=="
    },
    "INV": {
        "Serie": "RT",
        "Folio": 15
    },
    "invoice_uid": "66cdfeab8abde"
}

Ejemplo de respuesta erronea en los campos del complemento

{
    "response": "error",
    "message": "El campo 'PagProvEfecPorFiduc' es requerido. "
}

Ejemplo de respuesta erronea de autenticación

{
    "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.

Last Updated:
Prev
Retenciones
Next
Carta porte v3.1