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

Complementos de pago

A continuación se explica como funciona el servicio con el cual podras crear un complemento de pago en su version 2.0

Podemos crear un CFDI con complemento de pago haciendo uso de los siguientes parámetros:

ParámetroTipoRequeridoDetalles
TipoCfdiStringRequeridoEs necesario enviar la clave pago en este campo.

Ejemplo:
"TipoDocumento": "pago"
RegimenFiscalnumberOpcionalIndica la clave del régimen fiscal del emisor, si este campo no se manda, se usará la clave del régimen que está en la configuración de la empresa.

Ver listado de claves de régimen fiscal.

Ejemplo:
"RegimenFiscal": "601"
SerieNumericoRequeridoIndica id de la serie con la que deseas timbrar el documento.

Ésta debe estar dada de alta en tu panel de Factura Online y coincidir con el tipo de CFDI que deseas timbrar.

Para obtenerlo Inicia sesión y dirígete al Menú lateral - Configuraciones - Series y folios


Ejemplo:
"Serie": 1247
FechaFromAPIStringOpcionalIndica una fecha con formato (Y-m-d\TH: m :s).

Es posible enviar hasta 72 horas de atraso a la fecha actual, sin embargo no están permitidas las fechas futuras.

Ejemplo:
"FechaFromAPI": "2022/04/08"
LugarExpedicionStringOpcional

Se utiliza para ingresar el codigo postal de el domicilio fiscal en donde se realiza el pago.

Ejemplo:
"LugarExpedicion": "44555"

UsoCFDIStringRequeridoIndica siempre la clave CP01 correspondiente a Pagos.

Ejemplo:
"UsoCFDI": "CP01"
MonedaStringRequeridoSe debe registrar siempre el valor "XXX".

Ejemplo:
"Moneda": "XXX"
EnviarCorreoBooleanOpcionalIndica si deseas que el CFDI se envíe a tu cliente por correo electrónico. Por default esta opción es true.

Ejemplo:
"EnviarCorreo": "true"
DraftStringOpcionalEsta bandera se utiliza para generar un borrador de CFDI, al utilizarla los datos enviados seran directamente guardados en un borrador estos datos deben cumplir con las caractreisticas minimas de timbrado de CFDI para generar un borrador por lo que no se puede almacenar cualquier información

Los valores admitidos son "0" para falso y "1" para verdadero, por defecto si no se envia se interpreta como falso
Ejemplo:
"Draft": "1"
ReceptorArrayRequeridoIndica el UID del receptor/cliente previamente creado en Factura Online.


Ver listado de atributos posibles para este nodo.

Ejemplo:
"Receptor": {
"UID": "55c0fdc67593d"
"RegimenFiscalR": "612"
}
ConceptosArrayRequeridoEs un arreglo de objetos, en el que debe definirse un solo objeto con la siguiente información.

Ejemplo:
"Conceptos": [
{
"ClaveProdServ": "84111506",
"Cantidad": "1",
"ClaveUnidad": "ACT",
"Descripcion": "Pago",
"ValorUnitario": "0",
"Importe": "0"
}
]
PagosArrayRequerido

Indica los datos del complemento de pago.
Ejemplo:

"Pagos": [
{
"FechaPago": "2022-04-08T12:00:00",
"FormaDePagoP": "01",
"MonedaP": "MXN",
"TipoCambioP": "1",
"Monto": "2500",
"NumOperacion": "",
"RfcEmisorCtaOrd": "",
"CtaOrdenante": "",
"NomBancoOrdExt": "",
"CtaBeneficiario": "",
"DoctoRelacionado": [  ]

}

Importante

Es necesario que envíes los valores (precios, cálculo de impuestos, subtotales, etc) de acuerdo a tus necesidades. Esto incluye número de decimales y redondeos.

Nodo: Pagos

Es el nodo en el que se ingresa la información correspondiente complemento de pagos.

A continuación se presentan los atibutos que debe incluir el nodo Pagos:

ParámetroTipoRequeridoDetalles
FechaPagoStringRequeridoIndica la fecha y hora en la que el beneficiario recibe el pago, debe estar expresada en el siguiente formato: aaaa-mm-ddThh:mm:ss.

Ejemplo:
"FechaPago": "2018-12-01T12:00:00"
FormaDePagoPStringRequeridoIndica la clave de la forma de pago.

Ésta puedes consultarla en el Catálogo de formas de pago.

Nota: debe ser distinta a la clave 99 - Por definir.

Ejemplo:
"FormaPago": "01"
MonedaPStringRequeridoIndica la clave de la moneda del pago.

Ésta puedes consultarla en el Catálogo de monedas

Ejemplo:
"Moneda": "MXN"
TipoCambioPStringOpcional

Indica el tipo de cambio vigente al momento de recibir el pago.

El campo "TipoCambioP" debe contener la tasa de cambio de la moneda utilizada en el pago con respecto al peso mexicano (MXN). Es decir, si el pago se realiza en una moneda distinta al MXN, "TipoCambioP" debe reflejar la equivalencia de dicha moneda en pesos mexicanos. Por otro lado, si el pago se efectúa en pesos mexicanos (MXN), el valor de "TipoCambioP" deberá ser 1.

Ejemplo:

Cuando el pago se recibe en dolares USD

1USD = 19.85MXN
"TipoCambio": "19.85"

Cuando el pago se recibe en euros EUR

1EUR = 21.24MXN 

"TipoCambio": "21.24"

Es necesario indicar la equivalencia de la moneda con respecto a MXN en este campo.

Cuando el pago se realiza en pesos mexicanos MXN

1MXN = 1MXN

"TipoCambio": "1"

MontoNumericoRequeridoIndica el importe del pago, éste debe ser mayor a 0.

Ejemplo:
"Monto": "1000.00"
NumOperacionStringOpcionalIndica el número de orden o pedido.

Este dato es solo para control interno.

Ejemplo:
"NumOrder": "85abf36"
RfcEmisorCtaOrdStringOpcionalSi lo deseas, indica el RFC del banco de la cuenta de origen de la transferencia.

Ejemplo:
"RfcEmisorCtaOrd": "BSM970519DU8"
CtaOrdenanteStringOpcionalSi lo deseas, indica el número de la cuenta con la que se realizó el pago, o la CLABE interbancaria de la cuenta desde donde se hizo la transferencia.

Ejemplo:
"CtaOrdenante": "15478952364"
NomBancoOrdExtStringOpcionalSi lo deseas, indica el nombre del banco de la cuenta ordenante.

Ejemplo:
"NomBancoOrdExt": "BANCO SANTANDER (MEXICO) S.A."
RfcEmisorCtaBen StringOpcional Si lo deseas, indica el RFC del banco de la cuenta de destino de la transferencia.

Ejemplo:
"RfcEmisorCtaOrd": "BBA130722BR7"
CtaBeneficiarioStringOpcionalSi lo deseas, indica el número de la cuenta o la CLABE interbancaria de la cuenta desde donde se recibió el pago.

Ejemplo:
"CtaBeneficiario": "15478952364"
DoctoRelacionadoarrayRequerido

Indica al menos un documento relacionado para tu complemento de pago.

Ejemplo:

"DoctoRelacionado": [
{
"IdDocumento": "3e27ae21-b190-4c4c-a8d1-d3b6ab993122",
"MonedaDR": "MXN",
"EquivalenciaDR": "",
"NumParcialidad": "1",
"ImpSaldoAnt": "1200",
"ImpPagado": "1200",
"ImpSaldoInsoluto": "0",
"Impuestos": {
"Traslados": [         ],
"Retenidos": [         ]
}

 Impuestos ArrayRequerido

 Arreglo que contiene los diferentes tipos de impuestos para nuestro pago en este caso "traslado" y "retenidos"

Ejemplo:

"Impuestos": {

"Traslados": [  ],

"Retenidos": [  ]

}

 

 Traslados ArrayRequerido

 Arreglo que contiene los impuestos de traslado especificos aplicados a nuestro pago

Ejemplo: IVA, IEPS....


"Traslados": [
{
"Base": "1300.000000",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "208.000000"
},
{
"Base": "1200.000000",
"Impuesto": "003",
"TipoFactor": "Cuota",
"TasaOCuota": "0.083333",
"Importe": "100.000000"
}
]

 Retenidos String Requerido

 Arreglo que contiene los impuestos de retencion especificos aplicados a nuestro pago

Ejemplo: Retencion de ISR ............

"Retenidos": [
{
"Base": "1300.000000",
"Impuesto": "001",
"TipoFactor": "Tasa",
"TasaOCuota": "0.10",
"Importe": "130.000000"
}
]

 Base String Requerido Indica el subtotal del cual se calcula el impuesto
 Impuesto String Requerido

 Indica el tipo de impuesto que se aplicara a nuestro pago

Se debe ingresar con el codigo que le corresponde ejemplo:

"002" corresponde a IVA

 TipoFactor String Requerido Indica el tipo de factor que correponde a nuestro impuesto
 TasaCuota String Requerido

 Indica el porcentaje correspondiente al impuesto que aplicaremos

Se utiliza ingresando el monto por el cual multiplica nuestra base, ejemplo:

"0.16" para el 16% de IVA

 Importe String Requerido Indica el monto que corresponde de nuestrio impuesto

Construcción de la URL

Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)

Endpoint: /v4/cfdi40/create

Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/create

Tip

Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta, e Tu Secret key por el SECRET KEY correspondiente. Así como cambiar los UID de los CFDIs relacionados y de receptor.

Ejemplo para crear complemento de pagos v2.0

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v4/cfdi40/create',
  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 =>'{
  "TipoCfdi": "pago",
  "RegimenFiscal": 621,
  "EnviarCorreo": true,
  "Version": "4.0",
  "Serie": 18379,
  "FechaFromAPI": "2024/05/28",
  "LugarExpedicion": "63180",
  "UsoCFDI": "CP01",
  "Moneda": "XXX",
  "Draft": false,
  "Receptor": {
    "UID": "63ebd090d6015"
  },
  "Conceptos": [
    {
      "ClaveProdServ": "84111506",
      "Cantidad": 1,
      "ClaveUnidad": "ACT",
      "Descripcion": "Pago",
      "ValorUnitario": 0,
      "Importe": 0
    }
  ],
  "Pagos": [
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "MXN",
      "TipoCambioP": "1",
      "Monto": "232",
      "NumOperacion": "9999",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "1f4946e4-98b3-46d5-987b-fc61a4d20707",
          "MonedaDR": "MXN",
          "EquivalenciaDR": "1",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "232",
          "ImpPagado": "232",
          "ImpSaldoInsoluto": "0.000000",
          "NoObligadoADesglose": "",
          "Impuestos": {
            "Traslados": [
              {
                "Base": "200.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "32.000000"
              }
            ],
            "Retenidos": []
          },
          "Serie": "F",
          "Folio": "639"
        }
      ],
      "TipoCadPago": ""
    },
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "USD",
      "TipoCambioP": "16.81",
      "Monto": "116",
      "NumOperacion": "2768",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "ed2e295e-daf4-405a-8726-f44fb79b6cc8",
          "Serie": "F",
          "Folio": "638",
          "MonedaDR": "USD",
          "EquivalenciaDR": "1",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "116",
          "ImpPagado": "116",
          "ImpSaldoInsoluto": "0.000000",
          "Impuestos": {
            "Traslados": [
              {
                "Base": "100.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "16.000000"
              }
            ],
            "Retenidos": []
          }
        }
      ],
      "TipoCadPago": "01"
    },
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "MXN",
      "TipoCambioP": "1",
      "Monto": 19496.12,
      "NumOperacion": "abc123",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "1700e7f2-e89d-4ae5-a727-320bca44bda2",
          "MonedaDR": "USD",
          "EquivalenciaDR": "0.0594990183",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "1160",
          "ImpPagado": "1160",
          "ImpSaldoInsoluto": "0.000000",
          "NoObligadoADesglose": false,
          "Impuestos": {
            "Traslados": [
              {
                "Base": "1000.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "160.000000"
              }
            ],
            "Retenidos": []
          },
          "Serie": "AB",
          "Folio": 133
        }
      ],
      "TipoCadPago": ""
    }
  ]
}',
  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/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  body: JSON.stringify({
    "TipoCfdi": "pago",
    "RegimenFiscal": 621,
    "EnviarCorreo": true,
    "Version": "4.0",
    "Serie": 18379,
    "FechaFromAPI": "2024/05/28",
    "LugarExpedicion": "63180",
    "UsoCFDI": "CP01",
    "Moneda": "XXX",
    "Draft": false,
    "Receptor": {
      "UID": "63ebd090d6015"
    },
    "Conceptos": [
      {
        "ClaveProdServ": "84111506",
        "Cantidad": 1,
        "ClaveUnidad": "ACT",
        "Descripcion": "Pago",
        "ValorUnitario": 0,
        "Importe": 0
      }
    ],
    "Pagos": [
      {
        "FechaPago": "2024-05-28T12:00:00",
        "FormaDePagoP": "03",
        "MonedaP": "MXN",
        "TipoCambioP": "1",
        "Monto": "232",
        "NumOperacion": "9999",
        "RfcEmisorCtaOrd": "BRM940216EQ6",
        "CtaOrdenante": "123456789012345678",
        "NomBancoOrdExt": "BANREGIO",
        "CtaBeneficiario": "123456789012345678",
        "RfcEmisorCtaBen": "BMN930209927",
        "DoctoRelacionado": [
          {
            "IdDocumento": "1f4946e4-98b3-46d5-987b-fc61a4d20707",
            "MonedaDR": "MXN",
            "EquivalenciaDR": "1",
            "NumParcialidad": "1",
            "ImpSaldoAnt": "232",
            "ImpPagado": "232",
            "ImpSaldoInsoluto": "0.000000",
            "NoObligadoADesglose": "",
            "Impuestos": {
              "Traslados": [
                {
                  "Base": "200.000000",
                  "Impuesto": "002",
                  "TipoFactor": "Tasa",
                  "TasaOCuota": "0.160000",
                  "Importe": "32.000000"
                }
              ],
              "Retenidos": []
            },
            "Serie": "F",
            "Folio": "639"
          }
        ],
        "TipoCadPago": ""
      },
      {
        "FechaPago": "2024-05-28T12:00:00",
        "FormaDePagoP": "03",
        "MonedaP": "USD",
        "TipoCambioP": "16.81",
        "Monto": "116",
        "NumOperacion": "2768",
        "RfcEmisorCtaOrd": "BRM940216EQ6",
        "CtaOrdenante": "123456789012345678",
        "NomBancoOrdExt": "BANREGIO",
        "CtaBeneficiario": "123456789012345678",
        "RfcEmisorCtaBen": "BMN930209927",
        "DoctoRelacionado": [
          {
            "IdDocumento": "ed2e295e-daf4-405a-8726-f44fb79b6cc8",
            "Serie": "F",
            "Folio": "638",
            "MonedaDR": "USD",
            "EquivalenciaDR": "1",
            "NumParcialidad": "1",
            "ImpSaldoAnt": "116",
            "ImpPagado": "116",
            "ImpSaldoInsoluto": "0.000000",
            "Impuestos": {
              "Traslados": [
                {
                  "Base": "100.000000",
                  "Impuesto": "002",
                  "TipoFactor": "Tasa",
                  "TasaOCuota": "0.160000",
                  "Importe": "16.000000"
                }
              ],
              "Retenidos": []
            }
          }
        ],
        "TipoCadPago": "01"
      },
      {
        "FechaPago": "2024-05-28T12:00:00",
        "FormaDePagoP": "03",
        "MonedaP": "MXN",
        "TipoCambioP": "1",
        "Monto": 19496.12,
        "NumOperacion": "abc123",
        "RfcEmisorCtaOrd": "BRM940216EQ6",
        "CtaOrdenante": "123456789012345678",
        "NomBancoOrdExt": "BANREGIO",
        "CtaBeneficiario": "123456789012345678",
        "RfcEmisorCtaBen": "BMN930209927",
        "DoctoRelacionado": [
          {
            "IdDocumento": "1700e7f2-e89d-4ae5-a727-320bca44bda2",
            "MonedaDR": "USD",
            "EquivalenciaDR": "0.0594990183",
            "NumParcialidad": "1",
            "ImpSaldoAnt": "1160",
            "ImpPagado": "1160",
            "ImpSaldoInsoluto": "0.000000",
            "NoObligadoADesglose": false,
            "Impuestos": {
              "Traslados": [
                {
                  "Base": "1000.000000",
                  "Impuesto": "002",
                  "TipoFactor": "Tasa",
                  "TasaOCuota": "0.160000",
                  "Importe": "160.000000"
                }
              ],
              "Retenidos": []
            },
            "Serie": "AB",
            "Folio": 133
          }
        ],
        "TipoCadPago": ""
      }
    ]
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

import requests
import json

url = "{ HOST }/v4/cfdi40/create"

payload = json.dumps({
  "TipoCfdi": "pago",
  "RegimenFiscal": 621,
  "EnviarCorreo": True,
  "Version": "4.0",
  "Serie": 18379,
  "FechaFromAPI": "2024/05/28",
  "LugarExpedicion": "63180",
  "UsoCFDI": "CP01",
  "Moneda": "XXX",
  "Draft": False,
  "Receptor": {
    "UID": "63ebd090d6015"
  },
  "Conceptos": [
    {
      "ClaveProdServ": "84111506",
      "Cantidad": 1,
      "ClaveUnidad": "ACT",
      "Descripcion": "Pago",
      "ValorUnitario": 0,
      "Importe": 0
    }
  ],
  "Pagos": [
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "MXN",
      "TipoCambioP": "1",
      "Monto": "232",
      "NumOperacion": "9999",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "1f4946e4-98b3-46d5-987b-fc61a4d20707",
          "MonedaDR": "MXN",
          "EquivalenciaDR": "1",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "232",
          "ImpPagado": "232",
          "ImpSaldoInsoluto": "0.000000",
          "NoObligadoADesglose": "",
          "Impuestos": {
            "Traslados": [
              {
                "Base": "200.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "32.000000"
              }
            ],
            "Retenidos": []
          },
          "Serie": "F",
          "Folio": "639"
        }
      ],
      "TipoCadPago": ""
    },
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "USD",
      "TipoCambioP": "16.81",
      "Monto": "116",
      "NumOperacion": "2768",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "ed2e295e-daf4-405a-8726-f44fb79b6cc8",
          "Serie": "F",
          "Folio": "638",
          "MonedaDR": "USD",
          "EquivalenciaDR": "1",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "116",
          "ImpPagado": "116",
          "ImpSaldoInsoluto": "0.000000",
          "Impuestos": {
            "Traslados": [
              {
                "Base": "100.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "16.000000"
              }
            ],
            "Retenidos": []
          }
        }
      ],
      "TipoCadPago": "01"
    },
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "MXN",
      "TipoCambioP": "1",
      "Monto": 19496.12,
      "NumOperacion": "abc123",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "1700e7f2-e89d-4ae5-a727-320bca44bda2",
          "MonedaDR": "USD",
          "EquivalenciaDR": "0.0594990183",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "1160",
          "ImpPagado": "1160",
          "ImpSaldoInsoluto": "0.000000",
          "NoObligadoADesglose": False,
          "Impuestos": {
            "Traslados": [
              {
                "Base": "1000.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "160.000000"
              }
            ],
            "Retenidos": []
          },
          "Serie": "AB",
          "Folio": 133
        }
      ],
      "TipoCadPago": ""
    }
  ]
})
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/create")

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({
  "TipoCfdi": "pago",
  "RegimenFiscal": 621,
  "EnviarCorreo": true,
  "Version": "4.0",
  "Serie": 18379,
  "FechaFromAPI": "2024/05/28",
  "LugarExpedicion": "63180",
  "UsoCFDI": "CP01",
  "Moneda": "XXX",
  "Draft": false,
  "Receptor": {
    "UID": "63ebd090d6015"
  },
  "Conceptos": [
    {
      "ClaveProdServ": "84111506",
      "Cantidad": 1,
      "ClaveUnidad": "ACT",
      "Descripcion": "Pago",
      "ValorUnitario": 0,
      "Importe": 0
    }
  ],
  "Pagos": [
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "MXN",
      "TipoCambioP": "1",
      "Monto": "232",
      "NumOperacion": "9999",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "1f4946e4-98b3-46d5-987b-fc61a4d20707",
          "MonedaDR": "MXN",
          "EquivalenciaDR": "1",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "232",
          "ImpPagado": "232",
          "ImpSaldoInsoluto": "0.000000",
          "NoObligadoADesglose": "",
          "Impuestos": {
            "Traslados": [
              {
                "Base": "200.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "32.000000"
              }
            ],
            "Retenidos": []
          },
          "Serie": "F",
          "Folio": "639"
        }
      ],
      "TipoCadPago": ""
    },
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "USD",
      "TipoCambioP": "16.81",
      "Monto": "116",
      "NumOperacion": "2768",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "ed2e295e-daf4-405a-8726-f44fb79b6cc8",
          "Serie": "F",
          "Folio": "638",
          "MonedaDR": "USD",
          "EquivalenciaDR": "1",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "116",
          "ImpPagado": "116",
          "ImpSaldoInsoluto": "0.000000",
          "Impuestos": {
            "Traslados": [
              {
                "Base": "100.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "16.000000"
              }
            ],
            "Retenidos": []
          }
        }
      ],
      "TipoCadPago": "01"
    },
    {
      "FechaPago": "2024-05-28T12:00:00",
      "FormaDePagoP": "03",
      "MonedaP": "MXN",
      "TipoCambioP": "1",
      "Monto": 19496.12,
      "NumOperacion": "abc123",
      "RfcEmisorCtaOrd": "BRM940216EQ6",
      "CtaOrdenante": "123456789012345678",
      "NomBancoOrdExt": "BANREGIO",
      "CtaBeneficiario": "123456789012345678",
      "RfcEmisorCtaBen": "BMN930209927",
      "DoctoRelacionado": [
        {
          "IdDocumento": "1700e7f2-e89d-4ae5-a727-320bca44bda2",
          "MonedaDR": "USD",
          "EquivalenciaDR": "0.0594990183",
          "NumParcialidad": "1",
          "ImpSaldoAnt": "1160",
          "ImpPagado": "1160",
          "ImpSaldoInsoluto": "0.000000",
          "NoObligadoADesglose": false,
          "Impuestos": {
            "Traslados": [
              {
                "Base": "1000.000000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.160000",
                "Importe": "160.000000"
              }
            ],
            "Retenidos": []
          },
          "Serie": "AB",
          "Folio": 133
        }
      ],
      "TipoCadPago": ""
    }
  ]
})

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

Respuesta

Respuesta Exitosa

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "8c5cb78d-d73c-42ef-b422-929e4d63267c",
    "uid": "6250a6ba8a3f8",
    "SAT": {
        "UUID": "8c5cb78d-d73c-42ef-b422-929e4d63267c",
        "FechaTimbrado": "2022-04-08T16:17:33",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "Tl2SwgGWL5yyEHN/8CBrLc5sPPP9uXyYJBWshid53i5IvJptteqHP9OtFScBhShvnVxNfdrK8eu0JnmTH5dvHgJ7gooWnvhXFuCfM1ZbIe+dUSc76ZS9n15M/er+OCFAvULUNzdV12d5E27xJ0LCgRbw2v4/kqD2vy2jJoY932dB8fF6wQUuImcgZ4hbaRAyjdC89/aWVPPNqKDuVkB5lcEN87PkLc0OGdjN4OIiSQ7KEMtE7DYtT8FpIPN4AB1yR9+knNI0FQmfowwJO+RzkmICf8ZpToKIXgs3pYENyLeguRqIPC4vUGmgW/WoOne/PgdMSkgo5QAhiRLT9wVq3Q==",
        "SelloCFD": "C77oxk1OVF+fzeO7ZHbfxsiMxSO7VQArFtZZ9up5c8wCWJSEliVIf2/bg1DdmJGw36L4vXKNa1jESlSjQ0v8QgKMLhZcr+PhR1gPEMdn0GGWLUDO5ELQzLqEAE68H0cyHC8shgHOJIsGOwsR0eHV2UnKrWh3VFD2+svq/31H5gBxGkgtOCpIr5SCvihqX/VCHKgWN6A1tzZfMldKxLSwd3lHsyQAzXF8TjLoXcPBX7wjkZpzA419cG+EjiqFJSEvek1F90OXj80ZEFBO2z9Cktxy+9I8IsBnnkv7/kGHbuiC4QuUXzy4XGDgIjje1yaQT8vmnQA4UA27abinHh1oPA=="
    },
    "INV": {
        "Serie": "COP",
        "Folio": 38
    },
    "invoice_uid": "6250a6ba8a3f8"
}

Respuesta Erronea

{
    "response": "error",
    "message": {
        "message": "401 - El rango de la fecha de generación no debe de ser mayor a 72 horas para la emisión del timbre.",
        "messageDetail": "Comprobante.Fecha: Fecha de emisión: 2021-04-08T17:41:47 Fecha del Servidor: 2022-04-08T17:32:17 La fecha de emision  no se encuentra en el rango permitido: 2022-04-05T17:32:17 - 2022-04-08T17:37:17",
        "data": null,
        "status": "error"
    },
    "xmlerror": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cfdi:Comprobante xmlns:cfdi=\"http://www.sat.gob.mx/cfd/4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:pago20=\"http://www.sat.gob.mx/Pagos20\" xsi:schemaLocation=\"http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/Pagos20 http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos20.xsd\" Version=\"4.0\" Serie=\"COP\" Folio=\"42\" Fecha=\"2021-04-08T17:41:47\" TipoDeComprobante=\"P\" NoCertificado=\"30001000000400002330\" Moneda=\"XXX\" Total=\"0\" SubTotal=\"0\" Exportacion=\"01\" LugarExpedicion=\"11111\" Sello=\"dg1bQHzT5HeHU6y5W2+Tb5e58JW77EnGgDmggs/Fa+DzYXGuG752ENDGN1/8qlSMQBVFjjY7x4M7peA+Y6Rv4Q2cuz3lugDjJ2BhzRKQ+yEverHWFvqGgB2RbJhiV7mIbH/d3HQDsj1ASzKMlIfBWC3vKGyZP1cUFXy/HEkpFEdO3jCPaBtkokx7+tjxMVBNABRWi+MoFXPa/2n41hRispcUGdwtpcvNv91kq6jEe+E4URmx/7nqXJmqi4qIJGJ1sLww7enyvezOTfUEutTYOt/figa8cxosdc1NemuvvLGeRTrcw0fBdRrLqO8EhjvE5ItgWo4bZ7SQknm4Rn0EzA==\" Certificado=\"MIIFijCCA3KgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDIzMzAwDQYJKoZIhvcNAQELBQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFETUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0wGwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhDT1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3BvbnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNTI5MTgzNzQyWhcNMjMwNTI5MTgzNzQyWjCBsTEdMBsGA1UEAxMUSU5HUklEIFhPREFSIEpJTUVORVoxHTAbBgNVBCkTFElOR1JJRCBYT0RBUiBKSU1FTkVaMR0wGwYDVQQKExRJTkdSSUQgWE9EQVIgSklNRU5FWjEWMBQGA1UELRMNWE9KSTc0MDkxOVU0ODEbMBkGA1UEBRMSWE9KSTc0MDkxOU1RVERNTjAyMR0wGwYDVQQLExRJTkRSSUQgWE9EQVIgSklNRU5FWjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIo8voRABIB6aqN9pU3lJWSPo0mMx/rC5lUuN+qwTuwDfq156to9eJ5tQIy+O5YYDo8bcZFsNNm20c/xN9W5jcTCOEQw8C9Vt3YBxvW5Mn5h+v4AwveeN2UTGP/hTKx7Kh1RueULx7LzJgY80CJHONRPymjfNj+E+t77ZhiyO2JHSU/YtoKzmy69/UzAobRJ3uCI2OR5ulgIvTAYlCo1JWcWzRvzLRLnFS9jqMgzMc3z8LESddrWJH8C/CZlSkUuVvZX0QwaNoCr0BkBC1niSbtrMLUfnqmUFz5DlTIlk9xdHkWY8fJhrDF6IHRMsmSrFBDGhegMv6Uw/E7jnzK7JXMCAwEAAaMdMBswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwDQYJKoZIhvcNAQELBQADggIBADPFRl/VS//6r/+BLfhbJYAcnh448QiOnuvEXGNnhlas14+dVn0CUSSTfJBZmKH6vOteq9cEjVvGqPBM/Jxia72xQ0njFAavYaGiuVUA7DVdzljLgoVcKgY+0hdvFtV2kkY82WcYLuzbdgs5wpAjytVYWe16bqNrLH0XAV7Hh9203v6FV92/OFG4/t8iaG+WnM/0cjzYJaFL6f+ukqLxmCwE10f6/5lKp7kEYl7gTD5wJw8hHvelqgL+oZdBklG84Gk7a9vUI/Ms+VDODAs4UmAK/KybY8Q3wZ6ElF5BQ+mVqxtowCkrLvLe7NECIPwypqiiXVqn8j9nWzutGOQSvryS9cV4I6c68pHkr0ilO7QRbL9cOBEo2c8QkYLLo7ve66AG1nNxorjm2l7SG4tzkC5GpsraiF654XM/tsdit09Saj4pkG152FUAe/5+dBZFXGSC6P5JboUIF+lIDfdcbOIQ2gQIJvm2XSz811z9x7PxbWKa9bmWgth0yY8UsQKoTG/tyuAZt66trRbXcHwZbMXv7B7NGRHDrpZK6foxrLfBUrlC40syN/j4I23cRDA+nwkzdiM6D+LuxwNSsWEZ/JZ+B98iYH6cckJEACVwIQgOnDxdzaw0FdVJ7GrPhWnbuI+tUIcippIJ4lKzSAwCuA/SqyUU1S1C1Psoc2+3XmVL\"><cfdi:Emisor Rfc=\"XOJI740919U48\" Nombre=\"INGRID XODAR JIMENEZ\" RegimenFiscal=\"621\"/><cfdi:Receptor Rfc=\"XOJI740919U48\" Nombre=\"INGRID XODAR JIMENEZ\" DomicilioFiscalReceptor=\"88965\" RegimenFiscalReceptor=\"616\" UsoCFDI=\"CP01\"/><cfdi:Conceptos><cfdi:Concepto ClaveProdServ=\"84111506\" Cantidad=\"1\" ClaveUnidad=\"ACT\" Descripcion=\"Pago\" ValorUnitario=\"0\" Importe=\"0\" ObjetoImp=\"01\"/></cfdi:Conceptos><cfdi:Complemento><pago20:Pagos Version=\"2.0\"><pago20:Totales TotalRetencionesISR=\"130\" TotalTrasladosBaseIVA16=\"2500\" TotalTrasladosImpuestoIVA16=\"400\" MontoTotalPagos=\"3700\"/><pago20:Pago FechaPago=\"2022-04-08T12:00:00\" FormaDePagoP=\"01\" MonedaP=\"MXN\" TipoCambioP=\"1\" Monto=\"2500.00\"><pago20:DoctoRelacionado IdDocumento=\"3e27ae21-b190-4c4c-a8d1-d3b6ab993122\" MonedaDR=\"MXN\" EquivalenciaDR=\"1\" NumParcialidad=\"1\" ImpSaldoAnt=\"1200.00\" ImpPagado=\"1200.00\" ImpSaldoInsoluto=\"0.00\" ObjetoImpDR=\"02\"><pago20:ImpuestosDR><pago20:RetencionesDR><pago20:RetencionDR BaseDR=\"1300.000000\" ImpuestoDR=\"001\" TipoFactorDR=\"Tasa\" TasaOCuotaDR=\"0.100000\" ImporteDR=\"130.000000\"/></pago20:RetencionesDR><pago20:TrasladosDR><pago20:TrasladoDR BaseDR=\"1300.000000\" ImpuestoDR=\"002\" TipoFactorDR=\"Tasa\" TasaOCuotaDR=\"0.160000\" ImporteDR=\"208.000000\"/><pago20:TrasladoDR BaseDR=\"1200.000000\" ImpuestoDR=\"003\" TipoFactorDR=\"Cuota\" TasaOCuotaDR=\"0.083333\" ImporteDR=\"100.000000\"/></pago20:TrasladosDR></pago20:ImpuestosDR></pago20:DoctoRelacionado><pago20:ImpuestosP><pago20:RetencionesP><pago20:RetencionP ImpuestoP=\"001\" ImporteP=\"130\"/></pago20:RetencionesP><pago20:TrasladosP><pago20:TrasladoP BaseP=\"1300.000000\" ImpuestoP=\"002\" TipoFactorP=\"Tasa\" TasaOCuotaP=\"0.160000\" ImporteP=\"208.000000\"/><pago20:TrasladoP BaseP=\"1200.000000\" ImpuestoP=\"003\" TipoFactorP=\"Cuota\" TasaOCuotaP=\"0.083333\" ImporteP=\"100.000000\"/></pago20:TrasladosP></pago20:ImpuestosP></pago20:Pago><pago20:Pago FechaPago=\"2022-04-08T12:00:00\" FormaDePagoP=\"01\" MonedaP=\"MXN\" TipoCambioP=\"1\" Monto=\"1200.00\" NumOperacion=\"01872\"><pago20:DoctoRelacionado IdDocumento=\"3e27ae21-b190-4c4c-a8d1-d3b6ab993122\" MonedaDR=\"MXN\" EquivalenciaDR=\"1\" NumParcialidad=\"1\" ImpSaldoAnt=\"1200.00\" ImpPagado=\"1200.00\" ImpSaldoInsoluto=\"0.00\" ObjetoImpDR=\"02\"><pago20:ImpuestosDR><pago20:TrasladosDR><pago20:TrasladoDR BaseDR=\"1200.000000\" ImpuestoDR=\"002\" TipoFactorDR=\"Tasa\" TasaOCuotaDR=\"0.160000\" ImporteDR=\"192.000000\"/></pago20:TrasladosDR></pago20:ImpuestosDR></pago20:DoctoRelacionado><pago20:ImpuestosP><pago20:TrasladosP><pago20:TrasladoP BaseP=\"1200.000000\" ImpuestoP=\"002\" TipoFactorP=\"Tasa\" TasaOCuotaP=\"0.160000\" ImporteP=\"192.000000\"/></pago20:TrasladosP></pago20:ImpuestosP></pago20:Pago></pago20:Pagos></cfdi:Complemento></cfdi:Comprobante>\n"
}

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.

Documentos Relacionados

A continuación se describen los atributos que deben incluirse en el nodo "DoctoRelacionado" dentro del nodo "Pagos".

Importante

Se explican 2 casos distintos para los documentos relacionados para explicar de forma mas clara como utilizar los campos que son variables

Moneda identica entre el pago y el docto. relacionado y cuando estas son distintas

Al realizar un complemento de pago debemos tener en cuenta que se pueden presentar 2 situaciones distintas, es importante tomar en cuenta que existen 2 campos para representar el tipo de cambio uno de estos es "TipoCambioP" que pertenece a el pago como tal y este se utiliza para expresar el tipo de cambio entre la moneda que se realizo el pago contra el peso mexicano(MXN).

El segundo caso es el campo "EquivalenciaDR" el cual pertenece a el CFDI original que se pudo haber realizado en cualquier moneda, si la moneda original del CFDI es diferente a la que se realizo el pago aqui deberiamos expresar el tipo de cambio entre estas monedas.

Parámetro

Tipo

Detalles moneda identica entre pago y documento relacionadoDetalles moneda diferente entre pago y documento relacionado
IdDocumento

String

Requerido

Indica el folio fiscal del CFDI al que quieras agregarle un pago.


Ejemplo:
"IdDocumento": "54feddcf-af15-4715-8a1f-80a122d1db54"
Indica el folio fiscal del CFDI al que quieras agregarle un pago.


Ejemplo:
"IdDocumento": "54feddcf-af15-4715-8a1f-80a122d1db54" 
MonedaDR

String

Requerido

Se utiliza para indicar la moneda en la que se genero el CFDI original

(En este caso se utiliza como ejemplo un pago que se realizo en moneda USD y un documento relacionado en moneda USD)

Ejemplo:
"MonedaDR" : "USD"

 Se utiliza para indicar la moneda en la que se genero el CFDI original

(En este caso se utiliza como ejemplo un pago que se realizo en moneda USD y el documento relacionado en moneda MXN

Ejemplo:
"MonedaDR" : "MXN"

EquivalenciaDR

Numerico

Requerido

El campo "EquivalenciaDR" presenta dos casos distintos como ejemplo:

  1. Cuando el documento relacionado y el pago se realizan en la misma moneda extranjera (USD):

    • En este caso, "EquivalenciaDR" debe tener el valor 1.
  2. Cuando el documento relacionado y el pago se realizan en la misma moneda nacional (MXN):

    • En este caso, "EquivalenciaDR" debe tener el valor 1.



Ejemplo:

Cuando se realiza el Pago en USD y Documento relacionado en USD


"EquivalenciaDR": "1"

 

Cuando se realiza el Pago en MXN y Documento relacionado en MXN


"EquivalenciaDR": "1"

 

El campo "EquivalenciaDR" presenta dos casos distintos como ejemplo:

Tipo de cambio: 1USD = 18MXN

Cuando el documento relacionado se realiza en moneda nacional(MXN) y el pago se realizan una moneda extranjera(USD):

En este caso, "EquivalenciaDR" debe tener el valor 18.

 

Ejemplo:

Cuando se realiza el Pago en MXN y Documento relacionado en USD


"EquivalenciaDR": "18"

El tipo de cambio corresponde a 

1USD = 18MXN

-----------------------------

Cuando el documento relacionado se realiza en moneda extranjera(USD) y el pago se realiza en moneda nacional(MXN).

En este caso, "EquivalenciaDR" debe tener el valor 0.055555.

 

Ejemplo:

Cuando se realiza el Pago en USD y Documento relacionado en MXN


"EquivalenciaDR": "0.055555"

 El tipo de cambio corresponde a

1MXN = 0.055555USD

 

Nota:

Te recomendamos tener cuidado con el tipo de cambio que se coloca en el pago ya que este podria causar confusiones al realizar la conversion.

Recuerda que el tipo de cambio en EquivalenciaDR corresponde a convertir la moneda del documento relacionado a la moneda del pago.

 Impuestos

 Array

Requerido

 Arreglo que contiene los diferentes tipos de impuestos para nuestro pago en este caso "traslado" y "retenidos"

Ejemplo:

"Impuestos": {

"Traslados": [  ],

"Retenidos": [  ]

}

 

 Arreglo que contiene los diferentes tipos de impuestos para nuestro pago en este caso "traslado" y "retenidos"

Ejemplo:

"Impuestos": {

"Traslados": [  ],

"Retenidos": [  ]

}

 
 Traslados

 Array

Requerido

Identico para ambos casos

Arreglo que contiene los impuestos de traslado especificos aplicados a nuestro pago

Ejemplo: IVA, IEPS....


"Traslados": [
{
"Base": "1300.000000",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "208.000000"
},
{
"Base": "1200.000000",
"Impuesto": "003",
"TipoFactor": "Cuota",
"TasaOCuota": "0.083333",
"Importe": "100.000000"
}
]

 Retenidos

 String

Requerido

 Identico para ambos casos

 Arreglo que contiene los impuestos de retencion especificos aplicados a nuestro pago

Ejemplo: Retencion de ISR ............

"Retenidos": [
{
"Base": "1300.000000",
"Impuesto": "001",
"TipoFactor": "Tasa",
"TasaOCuota": "0.10",
"Importe": "130.000000"
}
]

 Base

 String

Requerido

 Identico para ambos casos Indica el subtotal del cual se calcula el impuesto
 Impuesto

 String

Requerido

 Identico para ambos casos

 Indica el tipo de impuesto que se aplicara a nuestro pago

Se debe ingresar con el codigo que le corresponde ejemplo:

"002" corresponde a IVA

 TipoFactor

 String

Requerido

 Identico para ambos casos Indica el tipo de factor que correponde a nuestro impuesto
 TasaCuota

 String

Requerido

 Identico para ambos casos

 Indica el porcentaje correspondiente al impuesto que aplicaremos

Se utiliza ingresando el monto por el cual multiplica nuestra base, ejemplo:

"0.16" para el 16% de IVA

 Importe

 String

Requerido

 Identico para ambos casos Indica el monto que corresponde de nuestrio impuesto
NumParcialidad

String

Requerido

Identico para ambos casosIndica el número de pago o abono que corresponde. En caso de ser el primer pago poner 1.

Ejemplo:
"NumParcialidad" : "5" 
ImpSaldoAnt

Numerico

Requerido

Indica el monto del saldo pendiente de la parcialidad anterior. En el caso de que sea la primer parcialidad este campo debe contener el importe total del documento relacionado.

Ejemplo:
"ImpSaldoAnt" : "720"

 Indica el monto del saldo pendiente de la parcialidad anterior. En el caso de que sea la primer parcialidad este campo debe contener el importe total del documento relacionado.

En moneda distinta continuamos utilizando la moneda del CFDI original

Ejemplo:
"ImpSaldoAnt" : "40"

ImpPagado

Numerico

Requerido

Indica el importe del abono que se está haciendo actualmente al CFDI.

Ejemplo:
"ImpPagado" : "720"

 Indica el importe del abono que se está haciendo actualmente al CFDI.

En moneda distinta continuamos utilizando la moneda del CFDI original

Ejemplo:
"ImpPagado" : "20"

ImpSaldoInsoluto

Numerico

Requerido

Indica el monto del saldo pendiente por pagar. Es la diferencia entre el Saldo anterior y el monto de pago.

Ejemplo:
"ImpSaldoInsoluto" : "0"
 Indica el monto del saldo pendiente por pagar. Es la diferencia entre el Saldo anterior y el monto de pago.

Ejemplo:
"ImpSaldoInsoluto" : "20"
ObjetoImpuesto

String

Opcional

Identico para ambos casos

Campo para indicar si el documento relacionado es objeto de impuesto, admite los siguientes valores:

"01", "02", "03" y "04"

En caso de que este campo se envie vacio o no se envie se valida si el documento relacionado contiene impuestos, en caso de que existan por defecto se asignara el valor "02" y si no existen impuestos se asignara el valor "01"

Para los casos en los que se utilizen las claves 01, 03 o 04 si se envia el documento relacionado con impuestos estos seran ignorados junto a su desglose y el documento se presentara como si no incluyera impuestos ya que se da prioridad a la clave

Los valores de las claves son los siguientes:

01 - No objeto de impuesto

02 - Sí, objeto de impuesto

03 - Sí, objeto de impuesto y no obligado al desglose

04 -Sí, objeto de impuesto y no causa impuesto

Ejemplo con monedas identicas pago(MXN) y docto. relacionado(MXN)

"DoctoRelacionado": [
        {
          "IdDocumento": "3e27ae21-b190-4c4c-a8d1-d3b6ab993122",
          "MonedaDR": "MXN",
          "EquivalenciaDR": "1",
          "Impuestos": {
            "Traslados": [
              {
                "Base": "620.690000",
                "Impuesto": "002",
                "TipoFactor": "Tasa",
                "TasaOCuota": "0.16",
                "Importe": "99.310000"
              }
            ],
            "Retenidos": []
          },
          "NumParcialidad": "5",
          "ImpSaldoAnt": "720",
          "ImpPagado": "720",
          "ImpSaldoInsoluto": "0",
          "NoObligadoADesglose": false
        }
      ]

Ejemplo con monedas identicas pago(USD) y docto. relacionado(USD)

"DoctoRelacionado": [
      {
        "IdDocumento": "5fb01ad1-7c1a-47fc-a4b5-88c8304be341",
        "MonedaDR": "USD",
        "EquivalenciaDR": "1",
        "Impuestos": {
          "Traslados": [
            {
              "Base": "10205.310000",
              "Importe": "1632.849600",
              "Impuesto": "002",
              "TasaOCuota": "0.160000",
              "TipoFactor": "Tasa"
            }
          ],
          "Retenidos": []
        },
        "NumParcialidad": "1",
        "ImpSaldoAnt": "11838.16",
        "ImpPagado": "11838.16",
        "ImpSaldoInsoluto": "0.000000",
        "NoObligadoADesglose": false
      }
      ],

Ejemplo de pago en moneda distinta pago USD y docto. relacionado(MXN)

"DoctoRelacionado": [
      {
        "IdDocumento": "5fb01ad1-7c1a-47fc-a4b5-88c8304be341",
        "MonedaDR": "USD",
        "EquivalenciaDR": "16.8070",
        "Impuestos": {
          "Traslados": [
            {
              "Base": "10205.310000",
              "Importe": "1632.849600",
              "Impuesto": "002",
              "TasaOCuota": "0.160000",
              "TipoFactor": "Tasa"
            }
          ],
          "Retenidos": []
        },
        "NumParcialidad": "1",
        "ImpSaldoAnt": "11838.16",
        "ImpPagado": "11838.16",
        "ImpSaldoInsoluto": "0.000000",
        "NoObligadoADesglose": false
      }
      ],

CFDIs relacionados a complemento de pago

Este nodo es opcional y se utiliza para especificar cuando un complemento de pago está sustituyendo a otro.

A continuación se describen los atributos que conforman el nodo CfdiRelacionados:

Tip

El nodo CfdiRelacionados es opcional, en caso de agregarlo es necesario hacerlo dentro del objeto pincipal que se enviará en la petición y en este caso el tipo de relación siempre debe ser: 04 -Sustitución.

El nodo de CfdiRelacionados se conforma de los siguientes atributos:

ParámetroTipoRequeridoDetalles
TipoRelacionStringRequeridoIndicar la clave del tipo de relación correspondiente.

Revisar el listado de claves proporcionado por el SAT.

Ejemplo:
"TipoRelacion": "04"
UUIDArrayRequeridoIndicar el o los UID de los CFDIS con los que se relaciona el actual.

Ejemplo:
"UUID": [
"29c98cb2-f72a-4cbe-a297-606da335e187",
"a96f6b9a-70aa-4f2d-bc5e-d54fb7371236"
]

Ejemplo de CFDI relacionado

"CfdiRelacionados": {
    "TipoRelacion": "04",
    "UUID": [
      "29c98cb2-f72a-4cbe-a297-606da335e187",
      "a96f6b9a-70aa-4f2d-bc5e-d54fb7371236"
    ]
  },

Servicios Parciales de Construcción

A continuación se explica la funcion con la cual podras generar un CFDI haciendo uso del el complemento de Servicios Parciales de Construcción

A continuación se listan los atributos estandar del SAT que conforman el nodo Servicios Parciales de Construcción:

ParámetroTipoRequeridoDetalles
 parcialesconstruccion Arreglo Requerido Arreglo que contiene los campos del complemento de Servicios Parciales de Construcción
 Version String OpcionalIndica la version que se utiliza de complemento de Servicios Parciales de Construcción que se utilizara por el momento solo se encuentra disponible la version "1.0" 
 NumPerLicoAut Numerico Requerido En esta campo de ingresa el numero de Permiso, Licencia o Autorización segun sea el caso
 Inmueble Arreglo Opcional Arreglo que contiene los campos del domicilio donde se realizaran los Servicios Parciales de Construccion
 Calle String Requerido Indica la calle en la que se encuentra el lugar donde se realizaran los Servicios Parciales de Construcción
 NoExterior Numerico Opcional Indica el numero exterior del lugar donde se realizaran los Servicios Parciales de Construcción
 NoInterior Numerico Opcional Indica el numero interior del lugar donde se realizaran los Servicios Parciales de Construcción
 Colonia String Opcional Indica la colonia donde se encuentra el lugar donde se realizaran los Servicios Parciales de Construcción
 Localidad String Opcional Indica la localidad donde se encuentra el lugar donde se realizaran los Servicios Parciales de Construcción
 Referencia String Opcional Indica alguna referencia para poder identificar el lugar donde se realizaran los Servicios Parciales de Construcción
 Municipio String Requerido Indica el Municipio donde se encuentra el lugar donde se realizaran los Servicios Parciales de Construcción
 Estado Numerico Requerido

 Indica el Estado donde se encuentra el lugar donde se realizaran los Servicios Parciales de Construcción

Para  llenar este campo es importante ingresar el numero correspondiente a el estado que obtendremos del catalogo de entidades federativas del SAT

 CodigoPostal Numerico Requerido Indica el codigo postal del lugar donde se realizaran los Servicios Parciales de Construcción

Tip

Es importante mencionar que para ingresar el Estado en el formato es de tipo numerico y este corresponde a el catalogo de entidades federativas del SAT el cual se lista a continuación

ClaveDescripcion
 01 Aguascalientes
 02 Baja California
 03 Baja California Sur
 04 Campeche
 05 Coahuila de Zaragoza
 06 Colima
 07 Chiapas
 08 Chihuahua
 09 Ciudad de México
 10 Durango
 11 Guanajuato
 12 Guerrero
 13 Hidalgo
 14 Jalisco
 15 México
 16 Michoacán de Ocampo
 17 Morelos
 18 Nayarit
 19 Nuevo León
 20 Oaxaca
 21 Puebla
 22 Queretaro
 23 Quintana Roo
 24 San Luis Potosí
 25 Sinaloa
 26 Sonora
 27 Tabasco
 28 Tamaulipas
 29 Tlaxcala
 30 Veracruz de Ignacio de la Llave
 31 Yucatán
 32 Zacatecas

Construcción de la URL

Importante

El método que se utiliza para la creacion de la empresa es de tipo POST

Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)

Endpoint: /v3/cfdi33/complemento/pagos/create

Ejemplo: https://facturaonline.com.mx/api/v3/cfdi33/complemento/pagos/create

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 de CFDI con el complemento

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v3/cfdi33/complemento/pagos/create',
  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 =>'{
  "TipoCfdi": "factura",
  "Version": "3.3",
  "Serie": "17317",
  "FormaPago": "01",
  "SubTotal": "587.00",
  "Moneda": "MXN",
  "Total": "680.92",
  "MetodoPago": "PUE",
  "UsoCFDI": "G01",
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "Conceptos": [
    {
      "ClaveProdServ": "72111000",
      "NoIdentificacion": "TLQ-KP60X60B",
      "Cantidad": "1",
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "Descripcion": "Comisión del servicio\\"\\"",
      "ValorUnitario": "587.000000",
      "Importe": "587.000000",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "587.000000",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.16",
            "Importe": "93.920000"
          }
        ]
      }
    }
  ],
  "parcialesconstruccion": {
    "Version": "1.0",
    "NumPerLicoAut": "23523523523",
    "Inmueble": {
      "Calle": "Av lopez mateos",
      "NoExterior": "124",
      "NoInterior": "412",
      "Colonia": "Circunvalacion",
      "Localidad": "Guadalajara",
      "Referencia": "En frente de la avenida",
      "Municipio": "Guadalajara",
      "Estado": "10",
      "CodigoPostal": "44680"
    }
  }
}',
  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 }/v3/cfdi33/complemento/pagos/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  body: JSON.stringify({
    "TipoCfdi": "factura",
    "Version": "3.3",
    "Serie": "17317",
    "FormaPago": "01",
    "SubTotal": "587.00",
    "Moneda": "MXN",
    "Total": "680.92",
    "MetodoPago": "PUE",
    "UsoCFDI": "G01",
    "Receptor": {
      "UID": "6169fc02637e1"
    },
    "Conceptos": [
      {
        "ClaveProdServ": "72111000",
        "NoIdentificacion": "TLQ-KP60X60B",
        "Cantidad": "1",
        "ClaveUnidad": "E48",
        "Unidad": "Unidad de servicio",
        "Descripcion": "Comisión del servicio\"\"",
        "ValorUnitario": "587.000000",
        "Importe": "587.000000",
        "Impuestos": {
          "Traslados": [
            {
              "Base": "587.000000",
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.16",
              "Importe": "93.920000"
            }
          ]
        }
      }
    ],
    "parcialesconstruccion": {
      "Version": "1.0",
      "NumPerLicoAut": "23523523523",
      "Inmueble": {
        "Calle": "Av lopez mateos",
        "NoExterior": "124",
        "NoInterior": "412",
        "Colonia": "Circunvalacion",
        "Localidad": "Guadalajara",
        "Referencia": "En frente de la avenida",
        "Municipio": "Guadalajara",
        "Estado": "10",
        "CodigoPostal": "44680"
      }
    }
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

import requests
import json

url = "{ HOST }/v3/cfdi33/complemento/pagos/create"

payload = json.dumps({
  "TipoCfdi": "factura",
  "Version": "3.3",
  "Serie": "17317",
  "FormaPago": "01",
  "SubTotal": "587.00",
  "Moneda": "MXN",
  "Total": "680.92",
  "MetodoPago": "PUE",
  "UsoCFDI": "G01",
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "Conceptos": [
    {
      "ClaveProdServ": "72111000",
      "NoIdentificacion": "TLQ-KP60X60B",
      "Cantidad": "1",
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "Descripcion": "Comisión del servicio\"\"",
      "ValorUnitario": "587.000000",
      "Importe": "587.000000",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "587.000000",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.16",
            "Importe": "93.920000"
          }
        ]
      }
    }
  ],
  "parcialesconstruccion": {
    "Version": "1.0",
    "NumPerLicoAut": "23523523523",
    "Inmueble": {
      "Calle": "Av lopez mateos",
      "NoExterior": "124",
      "NoInterior": "412",
      "Colonia": "Circunvalacion",
      "Localidad": "Guadalajara",
      "Referencia": "En frente de la avenida",
      "Municipio": "Guadalajara",
      "Estado": "10",
      "CodigoPostal": "44680"
    }
  }
})
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 }/v3/cfdi33/complemento/pagos/create")

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({
  "TipoCfdi": "factura",
  "Version": "3.3",
  "Serie": "17317",
  "FormaPago": "01",
  "SubTotal": "587.00",
  "Moneda": "MXN",
  "Total": "680.92",
  "MetodoPago": "PUE",
  "UsoCFDI": "G01",
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "Conceptos": [
    {
      "ClaveProdServ": "72111000",
      "NoIdentificacion": "TLQ-KP60X60B",
      "Cantidad": "1",
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "Descripcion": "Comisión del servicio\"\"",
      "ValorUnitario": "587.000000",
      "Importe": "587.000000",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "587.000000",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.16",
            "Importe": "93.920000"
          }
        ]
      }
    }
  ],
  "parcialesconstruccion": {
    "Version": "1.0",
    "NumPerLicoAut": "23523523523",
    "Inmueble": {
      "Calle": "Av lopez mateos",
      "NoExterior": "124",
      "NoInterior": "412",
      "Colonia": "Circunvalacion",
      "Localidad": "Guadalajara",
      "Referencia": "En frente de la avenida",
      "Municipio": "Guadalajara",
      "Estado": "10",
      "CodigoPostal": "44680"
    }
  }
})

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

Respuesta

Ejemplo de respuesta exitosa

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "b44ed08c-5b11-475d-b749-44038cdebc34",
    "uid": "61f99d0c00dfa",
    "SAT": {
        "UUID": "b44ed08c-5b11-475d-b749-44038cdebc34",
        "FechaTimbrado": "2022-02-01T14:49:50",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "UVFQf1VeMQ5oHUUaCf8Lbv5ITH6lPEIOuiATEdoN0KY2Bkcjoeux7cBtf0RsZkmhpAb0P8UBycs+rF6USISUyghVNO3cc43/i/1stky4hteKa+QnwqERMNyRSxHmcGr7jNp5Gi/4fVulz1C8BVPhwZYLoCgcvQ59mp04XXqatgG2IEE8liwnw1ffdnxnSvyA/F3ld9+7fdrBIxSNPk+BTCOXf0EpbHMmZLL9PAdBvM4x+cwWT1BMA+1Jko3DtyuU70SQqottYNIlztJjXrkWMNGmk046+IkYhFE6dEMqiWp6zySr3oET9qeOD6d0Y6jj/OSF22+rWWB9CRyibZ8lvg==",
        "SelloCFD": "WkFiLg+DOu23foxALrdQdrx3YRbqGplOEhSmzkAmI5IjflGw5hUdDdIW4fvnfJxwICWBbxlGd/V2kONXG36pDQ35+QFPv9L7ic7rD0h7LlQeCvLK99UJ7GKueXqoWhoXjH5agvoECaeC9TljgayB+kPUPJtziZgT1OBShGet/RtwMy5X92KnE5K8Gsia7Ef94ytm+aCrAgnv9RMJsmrL9GAyJn/KMRJspLL3VI7ABtgKZjhahVqoOWAG4mrfGqPQBhiUHMiH6HT3Idx1WWw0zJunKz1xdtmLdas6R2iYo7HmZBwbz5H2sGs8adr/mN2INTDKlpSgJZ0pfmY87+AuuA=="
    },
    "INV": {
        "Serie": "F",
        "Folio": 204
    },
    "invoice_uid": "61f99d0c00dfa"
}

Aviso

El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta.

Complemento ACuentaTerceros

A continuación se explica la funcion con la cual podras generar un CFDI haciendo uso del el complemento concepto ACuentaTerceros

A continuación se listan los atributos estandar del SAT que conforman el nodo ACuentaTerceros:

ParámetroTipoRequeridoDetalles
 RfcACuentaTerceros String Requerido Indica el Rfc correspondiente al contribuyente Tercero a cuenta del que se realiza la operacion
 NombreACuentaTerceros String Requerido Se utiliza para registrar el nombre, denominacion o razon social del contribuyente Tercero correspondiente con el RFC a cuenta
 RegimenFiscalACuentaTerceros String Requerido Se utiliza para incorporar la clave del regimen del contribuyente Tercero
 DomicilioFiscalACuentaTerceros String Requerido Atributo para ingresar el codigo postal del domicilio fiscal del Tercero

Construcción de la URL

Importante

El método que se utiliza para la creacion del compelemento es de tipo POST

Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)

Endpoint: /v4/cfdi40/create

Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/create

Tip

Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta, e Ingresa Tu Secret key por el SECRET KEY correspondiente.

Ejemplo del complemento ACuentaTerceros

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v4/cfdi40/create',
  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 =>'{
     "Receptor" : {
        "UID": "62d8891fd3734"
      },
      "TipoDocumento":"factura",
      "FechaFromAPI": "2023/03/16",
      "Conceptos": [{
        "ClaveProdServ": "81112101",
        "Cantidad":1,
        "ClaveUnidad":"E48",
        "Unidad": "Unidad de servicio",
        "ValorUnitario": 229.90,
        "Descripcion": "Desarrollo a la medida",
        "Impuestos":{
            "Traslados":[
                {
                    "Base": 229.90,
                    "Impuesto":"002",
                    "TipoFactor":"Tasa",
                    "TasaOCuota":"0.16",
                    "Importe":36.784
                }
            ],
            "Locales":[
                {
                    "Base": 229.90,
                    "Impuesto": "ISH",
                    "TipoFactor": "Tasa",
                    "TasaOCuota": "0.03",
                    "Importe": 6.897

                }
            ]
        },
        "RfcACuentaTerceros": "JUFA7608212V6",
        "NombreACuentaTerceros": "ADRIANA JUAREZ FERNANDEZ",
        "RegimenFiscalACuentaTerceros": "601",
        "DomicilioFiscalACuentaTerceros": "29133"
      }],
      "UsoCFDI": "G01",
      "Serie": 13910,
      "FormaPago": "03",
      "MetodoPago": "PUE",
      "Moneda": "MXN",
      "EnviarCorreo": false
}',
  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/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "62d8891fd3734"
    },
    "TipoDocumento": "factura",
    "FechaFromAPI": "2023/03/16",
    "Conceptos": [
      {
        "ClaveProdServ": "81112101",
        "Cantidad": 1,
        "ClaveUnidad": "E48",
        "Unidad": "Unidad de servicio",
        "ValorUnitario": 229.9,
        "Descripcion": "Desarrollo a la medida",
        "Impuestos": {
          "Traslados": [
            {
              "Base": 229.9,
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.16",
              "Importe": 36.784
            }
          ],
          "Locales": [
            {
              "Base": 229.9,
              "Impuesto": "ISH",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.03",
              "Importe": 6.897
            }
          ]
        },
        "RfcACuentaTerceros": "JUFA7608212V6",
        "NombreACuentaTerceros": "ADRIANA JUAREZ FERNANDEZ",
        "RegimenFiscalACuentaTerceros": "601",
        "DomicilioFiscalACuentaTerceros": "29133"
      }
    ],
    "UsoCFDI": "G01",
    "Serie": 13910,
    "FormaPago": "03",
    "MetodoPago": "PUE",
    "Moneda": "MXN",
    "EnviarCorreo": false
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

import requests
import json

url = "{ HOST }/v4/cfdi40/create"

payload = json.dumps({
  "Receptor": {
    "UID": "62d8891fd3734"
  },
  "TipoDocumento": "factura",
  "FechaFromAPI": "2023/03/16",
  "Conceptos": [
    {
      "ClaveProdServ": "81112101",
      "Cantidad": 1,
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "ValorUnitario": 229.9,
      "Descripcion": "Desarrollo a la medida",
      "Impuestos": {
        "Traslados": [
          {
            "Base": 229.9,
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.16",
            "Importe": 36.784
          }
        ],
        "Locales": [
          {
            "Base": 229.9,
            "Impuesto": "ISH",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.03",
            "Importe": 6.897
          }
        ]
      },
      "RfcACuentaTerceros": "JUFA7608212V6",
      "NombreACuentaTerceros": "ADRIANA JUAREZ FERNANDEZ",
      "RegimenFiscalACuentaTerceros": "601",
      "DomicilioFiscalACuentaTerceros": "29133"
    }
  ],
  "UsoCFDI": "G01",
  "Serie": 13910,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": False
})
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/create")

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({
  "Receptor": {
    "UID": "62d8891fd3734"
  },
  "TipoDocumento": "factura",
  "FechaFromAPI": "2023/03/16",
  "Conceptos": [
    {
      "ClaveProdServ": "81112101",
      "Cantidad": 1,
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "ValorUnitario": 229.9,
      "Descripcion": "Desarrollo a la medida",
      "Impuestos": {
        "Traslados": [
          {
            "Base": 229.9,
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.16",
            "Importe": 36.784
          }
        ],
        "Locales": [
          {
            "Base": 229.9,
            "Impuesto": "ISH",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.03",
            "Importe": 6.897
          }
        ]
      },
      "RfcACuentaTerceros": "JUFA7608212V6",
      "NombreACuentaTerceros": "ADRIANA JUAREZ FERNANDEZ",
      "RegimenFiscalACuentaTerceros": "601",
      "DomicilioFiscalACuentaTerceros": "29133"
    }
  ],
  "UsoCFDI": "G01",
  "Serie": 13910,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": false
})

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

Respuesta

Ejemplo de respuesta exitosa

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "00a182a3-f320-4911-8a37-0492fe7d7ffb",
    "uid": "640b7b800ac26",
    "SAT": {
        "UUID": "00a182a3-f320-4911-8a37-0492fe7d7ffb",
        "FechaTimbrado": "2023-03-10T12:48:31",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "c9/c/fxWK2gleFSbK78zMPmWmqjX9kSFAeGw1VSH53fw+8nTNwJHiGr5dJaf6qDqHVSwXYqkQpxUqXb/wBSr/5EQ0DIPfNUqwoidEpsd0gqdJetj1MsTmS+OR2tqWSE3Q/Gvk7snSBJNKTsGLYb2uqx5lrWZOYYGMA/KS2p11Ji7pK6mjrlRiJIuKDvps5YwUryRExe6QD0Fb5MLHDUGCpa2lX7AcjtIH0SPPbt6Oe7EJ6M5fxebaefPSqVGyz12qjFdKtYmjtL6cuVV76pxo7KYdc4Ocg+SwCRwJtaT6GwS8tVf1P8ifX0qS/U+qGHcqA2KOFzAicdVEUMp+PgPNA==",
        "SelloCFD": "AYQE8uFeswrcUAxKLvuM92fM4oI93HozK1Mw+8X7Xd/seQpTUUaShHQgHehSfkvlLVLSr9l3iu1MkwgdM1HtLAlA26YfnCqqapXxOWYTgMb2vNrLQuZm+Y4kOkVurb1CgNLL5X8OcRXjVmaBnsu0umYD3eiUDH++eSLvZF7pIMT8KFBDLnZheAxxXMKys3HYX1ex7ypNZpjSYY6lrI7fnYF7RORWKTEClzLCghH4Z0j6hMFXhEX2CWIjc7LZcbss6GMPLciCaPWdDBWvCB+UylBBy3uTSB4xOOUhbGMltFLYAIET2fxpeYvOeptwQfBGVExzFHU2usjSi7fS1KyzDw=="
    },
    "INV": {
        "Serie": "F",
        "Folio": 513
    },
    "invoice_uid": "640b7b800ac26"
}

Ejemplo de respuesta erronea por uso de nodos incorrectos

{
    "response": "error",
    "message": {
        "message": "301 - La estructura del comprobante es incorrecta.",
        "messageDetail": "The element 'ACuentaTerceros' in namespace 'http://www.sat.gob.mx/terceros' has invalid child element 'Parte' in namespace 'http://www.sat.gob.mx/terceros'. List of possible elements expected: 'Impuestos' in namespace 'http://www.sat.gob.mx/terceros'.",
        "data": null,
        "status": "error"
    },
    "xmlerror": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>..........
}

Ejemplo de respuesta erronea por datos faltantes en complemento

{
    "response": "error",
    "message": {
        "message": "301 - La estructura del comprobante es incorrecta.",
        "messageDetail": "The 'rfc' attribute is invalid - The value '' is invalid according to its datatype 'http://www.sat.gob.mx/terceros:t_RFC' - The actual length is less than the MinLength value.",
        "data": null,
        "status": "error"
    },
    "xmlerror": "<?xml version=\"1.0\" encoding=\"UTF-8\"?.............
}

Aviso

El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta.

Complemento Educativo

A continuación se explica la funcion con la cual podras generar un CFDI haciendo uso del el complemento educativo (IEDU)

A continuación se listan los atributos estandar del SAT que conforman el nodo IEDU:

 Párametro Tipo Requerido Detalles
 Complemento Arreglo Requerido Es el arreglo que contiene la informacion de los complementos de cada concepto en este caso contiene los parametros de el complemento IEDU

Es importante tomar en cuenta que este complemento es a nivel concepto y puede existir el complemento por cada concepto de nuestro CFDI
 typeComplement String Requerido

 Se utiliza para especificar el tipo de complemento que contiene nuestro concepto para complemento educativo el valor debe ser el siguiente

Ejemplo:

"iedu"

 version String Requerido

 Indica la version de el complemento que se encuentra vigente y en este momento solo existe la version 1.0 de este complemento por lo que el valor que se envia debe ser el siguiente

Ejemplo:

"1.0"

 nombreAlumno String Requerido

 Se utiliza para especificar el nombre del alumno a el cual se genera el pago de los servicios educativos

Ejemplo:

"XAIME WEIR ROJO"

 CURP String Requerido

 Indica la CURP de el alumno a el cual se genera el pago de los servicios educativos

Ejemplo:

"XEXX010101HNEXXXA4"

 nivelEducativo String Requerido

 Se utiliza para describir el nivel educativo en el cual se enceuntra el alumno correspondiente a los servicios educativos y admite los siguientes valores

Ejemplo:

"Preescolar"
"Primaria"
"Secundaria"
"Profesional técnico"
"Bachillerato o su equivalente"

 autRVOE String Requerido

 Atributo requerido para especificar la clave del centro de trabajo o el reconocimiento de validez oficial de estudios en los términos de la Ley General de Educación que tenga la institución educativa privada donde se realiza el pago.

Ejemplo:

"3231515138"

 rfcPago String Opcional

 Atributo opcional para indicar el RFC de quien realiza el pago cuando sea diferente a quien recibe el servicio

Ejemplo:

"CACX7605101P8"

Construcción de la URL

Importante

El método que se utiliza para la creacion del compelemento es de tipo POST

Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)

Endpoint: /v4/cfdi40/create

Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/create

Tip

Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta, e Ingresa Tu Secret key por el SECRET KEY correspondiente.

Ejemplo del complemento educativo

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v4/cfdi40/create',
  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 =>'{
    "TipoDocumento":"factura",
    "Conceptos": [
	{
	    "Descripcion": "Pago colegiatura  Julio - Agosto 2023",
		"ClaveProdServ": "86121501",
		"ClaveUnidad": "E48",
        "ObjetoImp": "02",
		"ValorUnitario": "14200.000000",
        "Cantidad": "1",
        "Importe": "14200.000000",
		"Impuestos": {
			"Traslados": [
				{
					"Base": "14200.000000",
					"Importe": "2272.000000",
                    "Impuesto": "002",
					"TasaOCuota": "0.16",
					"TipoFactor": "Tasa"
				}
			]
		},
    "Descuento": 0,
	"tipoDesc": "porcentaje",
    "Complemento": [
		{
            "typeComplement": "iedu",
            "version": "1.0",
            "nombreAlumno": "XAIME WEIR ROJO",
            "CURP": "XEXX010101HNEXXXA4",
            "nivelEducativo": "Preescolar",
			"autRVOE": "3231515138",
			"rfcPago": "CACX7605101P8"
		}
	],
	"Unidad": "Unidad de servicio",
    "NoIdentificacion": "SCHOOL01"
	}
],
    "Receptor" : {
        "UID": "62b1dcf75a60f"
      },
    "UsoCFDI": "G03",
    "Serie": 13910,
    "FormaPago": "03",
    "MetodoPago": "PUE",
    "Moneda": "MXN",
    "EnviarCorreo": false
}',
  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/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  body: JSON.stringify({
    "TipoDocumento": "factura",
    "Conceptos": [
      {
        "Descripcion": "Pago colegiatura  Julio - Agosto 2023",
        "ClaveProdServ": "86121501",
        "ClaveUnidad": "E48",
        "ObjetoImp": "02",
        "ValorUnitario": "14200.000000",
        "Cantidad": "1",
        "Importe": "14200.000000",
        "Impuestos": {
          "Traslados": [
            {
              "Base": "14200.000000",
              "Importe": "2272.000000",
              "Impuesto": "002",
              "TasaOCuota": "0.16",
              "TipoFactor": "Tasa"
            }
          ]
        },
        "Descuento": 0,
        "tipoDesc": "porcentaje",
        "Complemento": [
          {
            "typeComplement": "iedu",
            "version": "1.0",
            "nombreAlumno": "XAIME WEIR ROJO",
            "CURP": "XEXX010101HNEXXXA4",
            "nivelEducativo": "Preescolar",
            "autRVOE": "3231515138",
            "rfcPago": "CACX7605101P8"
          }
        ],
        "Unidad": "Unidad de servicio",
        "NoIdentificacion": "SCHOOL01"
      }
    ],
    "Receptor": {
      "UID": "62b1dcf75a60f"
    },
    "UsoCFDI": "G03",
    "Serie": 13910,
    "FormaPago": "03",
    "MetodoPago": "PUE",
    "Moneda": "MXN",
    "EnviarCorreo": false
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

import requests
import json

url = "{ HOST }/v4/cfdi40/create"

payload = json.dumps({
  "TipoDocumento": "factura",
  "Conceptos": [
    {
      "Descripcion": "Pago colegiatura  Julio - Agosto 2023",
      "ClaveProdServ": "86121501",
      "ClaveUnidad": "E48",
      "ObjetoImp": "02",
      "ValorUnitario": "14200.000000",
      "Cantidad": "1",
      "Importe": "14200.000000",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "14200.000000",
            "Importe": "2272.000000",
            "Impuesto": "002",
            "TasaOCuota": "0.16",
            "TipoFactor": "Tasa"
          }
        ]
      },
      "Descuento": 0,
      "tipoDesc": "porcentaje",
      "Complemento": [
        {
          "typeComplement": "iedu",
          "version": "1.0",
          "nombreAlumno": "XAIME WEIR ROJO",
          "CURP": "XEXX010101HNEXXXA4",
          "nivelEducativo": "Preescolar",
          "autRVOE": "3231515138",
          "rfcPago": "CACX7605101P8"
        }
      ],
      "Unidad": "Unidad de servicio",
      "NoIdentificacion": "SCHOOL01"
    }
  ],
  "Receptor": {
    "UID": "62b1dcf75a60f"
  },
  "UsoCFDI": "G03",
  "Serie": 13910,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": False
})
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/create")

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({
  "TipoDocumento": "factura",
  "Conceptos": [
    {
      "Descripcion": "Pago colegiatura  Julio - Agosto 2023",
      "ClaveProdServ": "86121501",
      "ClaveUnidad": "E48",
      "ObjetoImp": "02",
      "ValorUnitario": "14200.000000",
      "Cantidad": "1",
      "Importe": "14200.000000",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "14200.000000",
            "Importe": "2272.000000",
            "Impuesto": "002",
            "TasaOCuota": "0.16",
            "TipoFactor": "Tasa"
          }
        ]
      },
      "Descuento": 0,
      "tipoDesc": "porcentaje",
      "Complemento": [
        {
          "typeComplement": "iedu",
          "version": "1.0",
          "nombreAlumno": "XAIME WEIR ROJO",
          "CURP": "XEXX010101HNEXXXA4",
          "nivelEducativo": "Preescolar",
          "autRVOE": "3231515138",
          "rfcPago": "CACX7605101P8"
        }
      ],
      "Unidad": "Unidad de servicio",
      "NoIdentificacion": "SCHOOL01"
    }
  ],
  "Receptor": {
    "UID": "62b1dcf75a60f"
  },
  "UsoCFDI": "G03",
  "Serie": 13910,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": false
})

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

Respuesta

Ejemplo de respuesta exitosa

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "00a182a3-f320-4911-8a37-0492fe7d7ffb",
    "uid": "640b7b800ac26",
    "SAT": {
        "UUID": "00a182a3-f320-4911-8a37-0492fe7d7ffb",
        "FechaTimbrado": "2023-03-10T12:48:31",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "c9/c/fxWK2gleFSbK78zMPmWmqjX9kSFAeGw1VSH53fw+8nTNwJHiGr5dJaf6qDqHVSwXYqkQpxUqXb/wBSr/5EQ0DIPfNUqwoidEpsd0gqdJetj1MsTmS+OR2tqWSE3Q/Gvk7snSBJNKTsGLYb2uqx5lrWZOYYGMA/KS2p11Ji7pK6mjrlRiJIuKDvps5YwUryRExe6QD0Fb5MLHDUGCpa2lX7AcjtIH0SPPbt6Oe7EJ6M5fxebaefPSqVGyz12qjFdKtYmjtL6cuVV76pxo7KYdc4Ocg+SwCRwJtaT6GwS8tVf1P8ifX0qS/U+qGHcqA2KOFzAicdVEUMp+PgPNA==",
        "SelloCFD": "AYQE8uFeswrcUAxKLvuM92fM4oI93HozK1Mw+8X7Xd/seQpTUUaShHQgHehSfkvlLVLSr9l3iu1MkwgdM1HtLAlA26YfnCqqapXxOWYTgMb2vNrLQuZm+Y4kOkVurb1CgNLL5X8OcRXjVmaBnsu0umYD3eiUDH++eSLvZF7pIMT8KFBDLnZheAxxXMKys3HYX1ex7ypNZpjSYY6lrI7fnYF7RORWKTEClzLCghH4Z0j6hMFXhEX2CWIjc7LZcbss6GMPLciCaPWdDBWvCB+UylBBy3uTSB4xOOUhbGMltFLYAIET2fxpeYvOeptwQfBGVExzFHU2usjSi7fS1KyzDw=="
    },
    "INV": {
        "Serie": "F",
        "Folio": 513
    },
    "invoice_uid": "640b7b800ac26"
}

Ejemplo de respuesta erronea por uso de nodos incorrectos

{
    "response": "error",
    "message": {
        "message": "CFDI40999 - Error no clasificado.",
        "messageDetail": "The 'nivelEducativo' attribute is invalid - The value 'Telesecundaria' is invalid according to its datatype 'String' - The Enumeration constraint failed.",
        "data": null,
        "status": "error"
    },
    "xmlerror": "<?xml version=\"1.0\" encoding=\"UTF-8\"".....
}

Ejemplo de respuesta erronea por datos faltantes en complemento

{
    "response": "error",
    "message": {
        "message": "IEDU004 - Error no clasificado. El nombre del alumno del complemento IEDU es obligatorio",
        "messageDetail": null,
        "data": null,
        "status": "error"
    },
    "xmlerror": "<?xml version=\"1.0\" encoding=\"UTF-8\"?.............
}

Aviso

El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta.

Complemento de Venta de vehículos

Te contaremos como generar un CFDI con el complemento de venta de vehículos, a continuación te mostramos los parámetros que utilizaras.

 Párametro Tipo Requerido Detalles
 Complemento Arreglo Requerido Es el arreglo que contiene la informacion de los complementos de cada concepto en este caso contiene los parametros de el complemento Venta de vehículos

Es importante tomar en cuenta que este complemento es a nivel concepto y puede existir el complemento por cada concepto de nuestro CFDI
 typeComplement String Requerido

 Se utiliza para especificar el tipo de complemento que contiene nuestro concepto para el complemento vehicular el valor debe ser el siguiente

Ejemplo:

"VentaVehiculos"

 ClaveVehicular String Requerido

 Atributo de 7 dígitos para especificar la Clave vehicular que corresponda a la versión del vehículo vendido, suele encontrarse en la factura del auto

 Niv String Requerido

 Atributo de 17 caracteres requerido para agregar el número de identificación vehicular que corresponda al vehículo vendido

 InformacionAduanera Arreglo Opcional

 Nodo opcional para introducir la información aduanera aplicable cuando se trata de ventas de primera mano de mercancías importadas. Este nodo puede existir dentro de Complemento (complemento -> InformacionAduanera) o de Parte (parte -> InformacionAduanera), en ambos lados es opcional, pero si se agrega dentro de Complemento, el nodo Parte debe omitirse

 numero String Requerido

 Elemento requerido para la información aduanera. Atributo para expresar el número del documento aduanero que ampara la importación del bien

 fecha date Requerido

 Elemento requerido para la información aduanera. Atributo para expresar la fecha de expedición del documento aduanero que ampara la importación del bien

 aduana String Opcional

 Elemento opcional para la información aduanera. Atributo para precisar la aduana por la que se efectuó la importación del bien

 parte Arreglo Opcional

 Nodo opcional para expresar las partes o componentes que integran la totalidad del concepto expresado en el CFDI

 cantidad Decimal Requerido

 Elemento requerido para el nodo Parte. Utilizado para indicar la cantidad de bienes o servicios de este tipo

 unidad String Opcional

 Elemento opcional para el nodo Parte. Se usa para indicar la unidad de medida correspondiente a la cantidad especificada

 noIdentificacion String Opcional

 Elemento opcional para el nodo Parte. Se usa para indicar el número de serie del bien o el identificador del servicio

 descripcion String Requerido

 Elemento requerido para el nodo Parte. Sirve para expresar la descripción del bien o servicio cubierto en esta parte

 valorUnitario String Opcional

 Elemento opcional para el nodo Parte. Atributo para especificar el valor o precio unitario del bien o servicio

 importe String Opcional

 Elemento opcional para el nodo Parte. Utilizado para indicar el importe total de los bienes o servicios. Se calcula multiplicando la cantidad por el valor unitario

Construcción de la URL

Importante

El método que se utiliza para la creacion del compelemento es de tipo POST

Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)

Endpoint: /v4/cfdi40/create

Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/create

Tip

Para probar el código de ejemplo es necesario que reemplaces el texto Tu API key por el API KEY de tu cuenta, e Ingresa Tu Secret key por el SECRET KEY correspondiente.

Ejemplo para el complemento Venta de vehículos

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v4/cfdi40/create',
  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 =>'{
    "Receptor": {
        "UID": "66db4e54b4f35"
    },
    "TipoDocumento": "factura",
    "UsoCFDI": "G01",
    "Redondeo": "2",
    "Conceptos": [
        {
            "ClaveProdServ": "83101800",
            "NoIdentificacion": "20190417C009001P00",
            "Cantidad": "100",
            "ClaveUnidad": "XVN",
            "Unidad": "Vehículo",
            "ValorUnitario": "33000.00",
            "Descripcion": "Venta de vehículo",
            "Descuento": "0",
            "Impuestos": {
                "Traslados": [
                    {
                        "Base": "33000.00",
                        "Impuesto": "002",
                        "TipoFactor": "Tasa",
                        "TasaOCuota": "0.160000",
                        "Importe": "5280"
                    }
                ]
            },
            "Complemento": [
                {
                    "typeComplement": "VentaVehiculos",
                    "ClaveVehicular": "6011011",
                    "Niv": "3VWDX7AJ5BM012345",
                    "InformacionAduanera": {
                        "numero": "",
                        "fecha": "",
                        "aduana": ""
                    },
                    "Parte": [
                        {
                            "cantidad": "1",
                            "unidad": "Pieza",
                            "noIdentificacion": "3948KW8475L1",
                            "descripcion": "Sistema de sonido premium",
                            "valorUnitario": "12000",
                            "importe": "12000",
                            "InformacionAduanera": {
                                "numero": "16",
                                "fecha": "2025-02-15",
                                "aduana": "Aduana de Manzanillo, Colima"
                            }
                        }
                    ]
                }
            ]
        }
    ],
    "FormaPago": "99",
    "NumOrder": "",
    "MetodoPago": "PPD",
    "Moneda": "MXN",
    "CondicionesDePago": "Pago en una sola excibición",
    "Serie": "55764",
    "EnviarCorreo": ""
}',
  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/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "66db4e54b4f35"
    },
    "TipoDocumento": "factura",
    "UsoCFDI": "G01",
    "Redondeo": "2",
    "Conceptos": [
      {
        "ClaveProdServ": "83101800",
        "NoIdentificacion": "20190417C009001P00",
        "Cantidad": "100",
        "ClaveUnidad": "XVN",
        "Unidad": "Vehículo",
        "ValorUnitario": "33000.00",
        "Descripcion": "Venta de vehículo",
        "Descuento": "0",
        "Impuestos": {
          "Traslados": [
            {
              "Base": "33000.00",
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.160000",
              "Importe": "5280"
            }
          ]
        },
        "Complemento": [
          {
            "typeComplement": "VentaVehiculos",
            "ClaveVehicular": "6011011",
            "Niv": "3VWDX7AJ5BM012345",
            "InformacionAduanera": {
              "numero": "",
              "fecha": "",
              "aduana": ""
            },
            "Parte": [
              {
                "cantidad": "1",
                "unidad": "Pieza",
                "noIdentificacion": "3948KW8475L1",
                "descripcion": "Sistema de sonido premium",
                "valorUnitario": "12000",
                "importe": "12000",
                "InformacionAduanera": {
                  "numero": "16",
                  "fecha": "2025-02-15",
                  "aduana": "Aduana de Manzanillo, Colima"
                }
              }
            ]
          }
        ]
      }
    ],
    "FormaPago": "99",
    "NumOrder": "",
    "MetodoPago": "PPD",
    "Moneda": "MXN",
    "CondicionesDePago": "Pago en una sola excibición",
    "Serie": "55764",
    "EnviarCorreo": ""
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

import requests
import json

url = "{ HOST }/v4/cfdi40/create"

payload = json.dumps({
  "Receptor": {
    "UID": "66db4e54b4f35"
  },
  "TipoDocumento": "factura",
  "UsoCFDI": "G01",
  "Redondeo": "2",
  "Conceptos": [
    {
      "ClaveProdServ": "83101800",
      "NoIdentificacion": "20190417C009001P00",
      "Cantidad": "100",
      "ClaveUnidad": "XVN",
      "Unidad": "Vehículo",
      "ValorUnitario": "33000.00",
      "Descripcion": "Venta de vehículo",
      "Descuento": "0",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "33000.00",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.160000",
            "Importe": "5280"
          }
        ]
      },
      "Complemento": [
        {
          "typeComplement": "VentaVehiculos",
          "ClaveVehicular": "6011011",
          "Niv": "3VWDX7AJ5BM012345",
          "InformacionAduanera": {
            "numero": "",
            "fecha": "",
            "aduana": ""
          },
          "Parte": [
            {
              "cantidad": "1",
              "unidad": "Pieza",
              "noIdentificacion": "3948KW8475L1",
              "descripcion": "Sistema de sonido premium",
              "valorUnitario": "12000",
              "importe": "12000",
              "InformacionAduanera": {
                "numero": "16",
                "fecha": "2025-02-15",
                "aduana": "Aduana de Manzanillo, Colima"
              }
            }
          ]
        }
      ]
    }
  ],
  "FormaPago": "99",
  "NumOrder": "",
  "MetodoPago": "PPD",
  "Moneda": "MXN",
  "CondicionesDePago": "Pago en una sola excibición",
  "Serie": "55764",
  "EnviarCorreo": ""
})
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/create")

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({
  "Receptor": {
    "UID": "66db4e54b4f35"
  },
  "TipoDocumento": "factura",
  "UsoCFDI": "G01",
  "Redondeo": "2",
  "Conceptos": [
    {
      "ClaveProdServ": "83101800",
      "NoIdentificacion": "20190417C009001P00",
      "Cantidad": "100",
      "ClaveUnidad": "XVN",
      "Unidad": "Vehículo",
      "ValorUnitario": "33000.00",
      "Descripcion": "Venta de vehículo",
      "Descuento": "0",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "33000.00",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.160000",
            "Importe": "5280"
          }
        ]
      },
      "Complemento": [
        {
          "typeComplement": "VentaVehiculos",
          "ClaveVehicular": "6011011",
          "Niv": "3VWDX7AJ5BM012345",
          "InformacionAduanera": {
            "numero": "",
            "fecha": "",
            "aduana": ""
          },
          "Parte": [
            {
              "cantidad": "1",
              "unidad": "Pieza",
              "noIdentificacion": "3948KW8475L1",
              "descripcion": "Sistema de sonido premium",
              "valorUnitario": "12000",
              "importe": "12000",
              "InformacionAduanera": {
                "numero": "16",
                "fecha": "2025-02-15",
                "aduana": "Aduana de Manzanillo, Colima"
              }
            }
          ]
        }
      ]
    }
  ],
  "FormaPago": "99",
  "NumOrder": "",
  "MetodoPago": "PPD",
  "Moneda": "MXN",
  "CondicionesDePago": "Pago en una sola excibición",
  "Serie": "55764",
  "EnviarCorreo": ""
})

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

Respuesta

Ejemplo de respuesta exitosa

{
    "response": "success",
    "message": "Factura creada y enviada satisfactoriamente",
    "UUID": "00a182a3-f320-4911-8a37-0492fe7d7ffb",
    "uid": "640b7b800ac26",
    "SAT": {
        "UUID": "00a182a3-f320-4911-8a37-0492fe7d7ffb",
        "FechaTimbrado": "2023-03-10T12:48:31",
        "NoCertificadoSAT": "30001000000400002495",
        "Version": "1.1",
        "SelloSAT": "c9/c/fxWK2gleFSbK78zMPmWmqjX9kSFAeGw1VSH53fw+8nTNwJHiGr5dJaf6qDqHVSwXYqkQpxUqXb/wBSr/5EQ0DIPfNUqwoidEpsd0gqdJetj1MsTmS+OR2tqWSE3Q/Gvk7snSBJNKTsGLYb2uqx5lrWZOYYGMA/KS2p11Ji7pK6mjrlRiJIuKDvps5YwUryRExe6QD0Fb5MLHDUGCpa2lX7AcjtIH0SPPbt6Oe7EJ6M5fxebaefPSqVGyz12qjFdKtYmjtL6cuVV76pxo7KYdc4Ocg+SwCRwJtaT6GwS8tVf1P8ifX0qS/U+qGHcqA2KOFzAicdVEUMp+PgPNA==",
        "SelloCFD": "AYQE8uFeswrcUAxKLvuM92fM4oI93HozK1Mw+8X7Xd/seQpTUUaShHQgHehSfkvlLVLSr9l3iu1MkwgdM1HtLAlA26YfnCqqapXxOWYTgMb2vNrLQuZm+Y4kOkVurb1CgNLL5X8OcRXjVmaBnsu0umYD3eiUDH++eSLvZF7pIMT8KFBDLnZheAxxXMKys3HYX1ex7ypNZpjSYY6lrI7fnYF7RORWKTEClzLCghH4Z0j6hMFXhEX2CWIjc7LZcbss6GMPLciCaPWdDBWvCB+UylBBy3uTSB4xOOUhbGMltFLYAIET2fxpeYvOeptwQfBGVExzFHU2usjSi7fS1KyzDw=="
    },
    "INV": {
        "Serie": "F",
        "Folio": 513
    },
    "invoice_uid": "640b7b800ac26"
}

Ejemplo de respuesta erronea por uso de nodos incorrectos

{
    "response": "error",
    "message": {
        "message": "CFDI40999 - Error no clasificado.",
        "messageDetail": "The 'cantidad' attribute is invalid - The value 'CINCUENTA' is invalid according to its datatype 'Decimal' - The string 'CINCUENTA' is not a valid Decimal value.",
        "data": null,
        "status": "error"
    },
    "xmlerror": "<?xml version=\"1.0\" encoding=\"UTF-8\"".....
}

Ejemplo de respuesta erronea por datos faltantes en complemento

{
    "response": "error",
    "message": {
        "message": "CFDI40999 - Error no clasificado.",
        "messageDetail": "The 'Niv' attribute is invalid - The value '' is invalid according to its datatype 'String' - The actual length is less than the MinLength value.",
        "data": null,
        "status": "error"
    },
    "xmlerror": "<?xml version=\"1.0\" encoding=\"UTF-8\"?.............
}

Aviso

El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta.

Last Updated:
Prev
Nóminas
Next
Retenciones