php node js python ruby

Documentacion

Información general

Esta documentación explica como consultar, timbrar y cancelar facturas desde el API de Factura.com, así como el proceso para su descarga y envío por correo electrónico.

La documentación de la API de Factura.com ofrece una descripción detallada de los métodos y endpoints (URLs o direcciones) disponibles con ejemplos de las posibles respuestas a obtener o enviar. Además podrás consultar información general que facilitará su uso.

Con el Api de Factura.com podrás:

Entornos

El API de Factura.com cuenta con dos entornos disponibles:

Sandbox

Host: http://devfactura.in

Es un entorno de pruebas que simula el funcionamiento de nuestra API en producción, generando CFDIs sin validez fiscal.

Producción

Host: https://factura.com

Es el host para realizar el timbrado real, te recomendamos hacer pruebas en la versión sandbox primero, ya que los CFDIs generados en este entorno si tienen validez fiscal.

Composición de la URL

Independientemente del entorno en el que estes trabajando, la estructura de la URL se compone de la siguiente forma:

Por ejemplo, para traer listado de facturas en el entorno de producción la url es la siguiente:

https://factura.com/api/v1/invoices

Primeros pasos

Para hacer uso del API de Factura.com es necesario hacer uso del formato JSON . Todas las respuestas, exitosas o de error, están en formato JSON. Es necesario incluir en las cabeceras el token de acceso llamado API KEY y SECRET KEY

Obtener API KEY y SECRET KEY

Para obtener tus llaves de acceso deber seguir los siguientes pasos:

Agregar a la cabecera

Ejemplo de cabeceras.json:

"Content-Type: application/json",
    "F-PLUGIN": . "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed",
    "F-Api-Key": . "JDJ5JDEwJGRuT1Y3cUM3WnJEMUNaaXRwVW5UUmVMS3RLUHhHMjlYZndaeWxyRXVpUjBLVmwxOHBPWFXX",
    "F-Secret-Key":  . "JDJ5JDEwJDZaTjRhWDVVRXh3ejZIRmxEU1pjeE9GMVRHakh4OGY0MG5lRS5DclhISGFoeUFmaThxaUXX"

Dentro de las cabeceras de la petición es necesario agregar las llaves para poder acceder al API.

CFDI 4.0

Listar CFDIs 4.0

A continuación se explica como listar los CFDI's , con un ejemplo y la muestra de posibles respuestas obtenidas.

Podemos consultar los CFDI's filtrando por los siguientes parámetros:

Parametro Tipo Requerido Detalles
month number Opcional Induca el número de mes que deseas consultar. Éste debe estar escrito en 2 dígitos. Ejemplo: Enero = 01, Diciembre = 12, etc.
year number Opcional Indica el año que deseas consultar. Éste debe estar escrito en 4 dígitos. Ejemplo: 2017.
rfc string Opcional Indica un RFC para traer todos los CFDI's timbrados al mismo. Ejemplo: XAXX010101000.
type_dpcument string Opcionl Indica un tipo de CFDI para listar solo los CFDI's de ese tipo. Para ello enviar la clave indicada en el catálogo de Tipos de CFDI. Ejemplo: factura Consulta el catálogo de tipos de CFDIs.
page int Opcional Indica número de página a consultar, por default posiciona en la página 1.
per_page int Opcional Indica el limite de resultados para mostrar, por default retorna 100 registros.

Construcción de la URL para listar CFDIs 4.0

Ejemplo.

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/cfdi40/list',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: Tu API key',
    'F-Secret-Key: Tu Secret key'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v4/cfdi40/list',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/cfdi40/list"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'Tu API key',
  'F-Secret-Key': 'Tu Secret key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/cfdi40/list")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"

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

Host: https://factura.com (producción) / http://devfactura.in (sandbox)

Endpoint: /api/v4/cfdi40/list

Ejemplo: https://factura.com/api/v4/cfdi40/list

Respuestas de listar CFDIs 4.0

Ejemplo de respuesta exitosa.

{
    "status": "success",
    "response": "success",
    "total": 20,
    "per_page": 100,
    "current_page": 1,
    "last_page": 1,
    "from": 1,
    "to": 100,
    "data": [
        {
            "RazonSocialReceptor": "PRUEBAS",
            "Folio": "F 100",
            "UID": "61d4c2d768a14",
            "UUID": "ed20099a-3c7d-4277-be8a-377715fbcbb2",
            "Subtotal": "229.900000",
            "Descuento": null,
            "Total": "259.780000",
            "ReferenceClient": 0,
            "NumOrder": null,
            "Receptor": "XAXX010101000",
            "FechaTimbrado": "2022-01-04",
            "Status": "enviada",
            "Version": "4.0"
        },
        {
            "RazonSocialReceptor": "PRUEBAS",
            "Folio": "F 99",
            "UID": "61d4c0326907f",
            "UUID": "357a0cf5-be19-4c1a-8f18-7fdb453193f2",
            "Subtotal": "229.900000",
            "Descuento": null,
            "Total": "259.780000",
            "ReferenceClient": 0,
            "NumOrder": null,
            "Receptor": "XAXX010101000",
            "FechaTimbrado": "2022-01-04",
            "Status": "cancelada",
            "Version": "4.0"
        },
        {
            "RazonSocialReceptor": "PRUEBAS",
            "Folio": "F 98",
            "UID": "61d4c0197fbfd",
            "UUID": "42ffe80d-3c8f-46f6-af64-513656615bb4",
            "Subtotal": "229.900000",
            "Descuento": null,
            "Total": "259.780000",
            "ReferenceClient": 0,
            "NumOrder": null,
            "Receptor": "XAXX010101000",
            "FechaTimbrado": "2022-01-04",
            "Status": "cancelada",
            "Version": "4.0"
        }
  ]
}

Ejemplo de respuesta erronea

{
    "status": "error",
    "message": "La cuenta que intenta autenticarse no existe",
    "Data": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
    "Secret": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq"
}

Crear CFDI 4.0

A continuación se explica como crear un CFDI, con un ejemplo y muestra de posibles respuestas obtenidas.

Podemos crear un CFDI haciendo uso de los siguientes parametros:

Parámetro Tipo Requerido Detalles
Receptor array Requerido Indica el UID del receptor/cliente previamente creado en factura.com

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Receptor":
{
"ResidenciaFiscal": "",
"UID": "55c0fdc67593d"
}
TipoDocumento string Requerido Indica la clave del tipo de documento que deseas timbrar.

Ver listado de tipos de documentos.

Ejemplo:
"TipoDocumento": "factura"
Conceptos array Requerido Es un arreglo de objetos, en el que cada objeto corresponde a un concepto con sus atibutos para agregar al CFDI.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Conceptos": [
{
"ClaveProdServ": "43232408",
"NoIdentificacion": "0021",
"Cantidad": "1.000000",
"ClaveUnidad": "E48",
"Unidad": "Unidad de servicio",
"Descripcion": "Desarrollo web a la medida",
"ValorUnitario": "15000.000000",
"Importe":
"15000.000000",
"Descuento": "0",
"Impuestos": {
"Traslados": [
{
"Base":
"15000.000000",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "2400.000000"
}
],
"Retenidos": [],
"Locales": []
},
}
]
UsoCFDI string Requerido Indica la clave del Uso de CFDI, ésta debe ser válida para el SAT.

Ver catálogo de claves de uso de cfdi.

Ejemplo:
"UsoCFDI": "G01"
Serie number Requerido Indica id de la serie con la que deseas timbrar el documento.

Ésta debe estar dada de alta en tu panel de Factura.com 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
FormaPago string Requerido Indica la clave de la forma de pago.

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

Ejemplo:
"FormaPago": "01"
MetodoPago string Requerido Indica la clave del método de pago

Ésta puedes consultarla en el Catálogo de métodos de pago.

Ejemplo:
"MetodoPago": "PUE",
CondicionesDePago string Opcional Indica las condiciones de pago del CFDI, éstas deben tener una longitud minima de 1 y máxima de 1000 caracteres.

Ejemplo:
"CondicionesDePago": "Pago en 9 meses"
CfdiRelacionados array Opcional En caso que tu CFDI vaya relacionado con otro(s), envía un arreglo con el/los UUID's con los que está relacionado.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"CfdiRelacionados": {
"TipoRelacion": "01",
"UUID": [
"29c98cb2-f72a-4cbe-a297-606da335e187",
"a96f6b9a-70aa-4f2d-bc5e-d54fb7371236"
]
}
Moneda string Requerido Indica la clave de la moneda del CFDI.

Ésta puedes consultarla en el Catálogo de monedas

Ejemplo:
"Moneda": "MXN"
TipoCambio string Opcional / Requerido en caso que el atributo Moneda sea diferente de MXN Indicar el tipo de cambio vigente al momento de crear el CFDI.

Ejemplo:
"TipoCambio": "19.85"
NumOrder number Opcional Indica el número de orden o pedido.

Este dato es solo para control interno.

Ejemplo:
"NumOrder": "85abf36"
Fecha string Opcional Indica 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:
"Fecha": "2020-03-20\T12:53:23"
Comentarios string Opcional Indica si deseas que aparezcan comentarios en el PDF de tu CFDI.

Ejemplo:
"Comentarios": "El pedido aún no es entregado"
Cuenta string Opcional En caso de desearlo, indica los últimos 4 dígitos de la tarjeta o cuenta bancaria del cliente.

Ejemplo:
"Cuenta": "0025"
EnviarCorreo bolean Opcional Indica 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"
LugarExpedicion string Opcional Indica el Código postal del lugar de expedición del CFDI.

Éste debe tener 5 caracteres.

Ejemplo:
"LugarExpedicion": "44650"

Construcción de la URL para crear CFDI 4.0:

Ejemplo para crear CFDI.

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/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": "6169fc02637e1"
      },
      "TipoDocumento":"factura",
      "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

                }
            ]
         }
      }],
      "UsoCFDI": "P01",
      "Serie": 17317,
      "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': 'http://devfactura.in/api/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": "6169fc02637e1"
    },
    "TipoDocumento": "factura",
    "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
            }
          ]
        }
      }
    ],
    "UsoCFDI": "P01",
    "Serie": 17317,
    "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 = "http://devfactura.in/api/v4/cfdi40/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "factura",
  "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
          }
        ]
      }
    }
  ],
  "UsoCFDI": "P01",
  "Serie": 17317,
  "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("http://devfactura.in/api/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": "6169fc02637e1"
  },
  "TipoDocumento": "factura",
  "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
          }
        ]
      }
    }
  ],
  "UsoCFDI": "P01",
  "Serie": 17317,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": false
})

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

Host: https://factura.com (producción) / http://devfactura.in (sandbox)

Endpoint: /api/v4/cfdi40/create

Ejemplo: https://factura.com/api/v4/cfdi40/create

Ejemplo para crear cfdi exento.

<?php


for ($x = 1; $x <= 1; $x++) {
    $Conceptos[] = [
        'ClaveProdServ' => '81112107',
        'Cantidad' => '1',
        'ClaveUnidad' => 'E48',
        'Unidad' => 'Unidad de servicio',
        'ValorUnitario' => '100',
        'Descripcion' => 'Desarrollo a la medida',
        'Descuento' => '0',
        'Impuestos' => [
            'Traslados' => [
                ['Base' => '100', 'Impuesto' => '002', 'TipoFactor' => 'Exento', 'TasaOCuota' => '0.00', 'Importe' => '00'],
            ]
        ],
    ];
}

$ch = curl_init();
$fields = [
    "Receptor" => ["UID" => "55c0fdc675XXX"],
    "TipoDocumento" => "factura",
    "UsoCFDI" => "P01",
    "Redondeo" => 2,
    "Conceptos" => $Conceptos,
    "FormaPago" => "01",
    "MetodoPago" => 'PUE',
    "Moneda" => "MXN",
    "CondicionesDePago" => "Pago en una sola exhibición",
    "Serie" => 1,
    "EnviarCorreo" => 'true',
    "InvoiceComments" => ""
];

$jsonfield = json_encode($fields);


curl_setopt($ch, CURLOPT_URL, "http://devfactura.in/api/v4/cfdi40/create");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonfield);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-API-KEY: ". 'Ingresa API KEY',
    "F-SECRET-KEY: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);

return die($response);

curl_close($ch);

?>
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v4/cfdi40/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "6169fc02637e1"
    },
    "TipoDocumento": "factura",
    "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": "Exento",
              "TasaOCuota": "0.00",
              "Importe": 0
            }
          ]
        }
      }
    ],
    "UsoCFDI": "G03",
    "Serie": 17317,
    "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 = "http://devfactura.in/api/v4/cfdi40/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "factura",
  "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": "Exento",
            "TasaOCuota": "0.00",
            "Importe": 0
          }
        ]
      }
    }
  ],
  "UsoCFDI": "G03",
  "Serie": 17317,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": False
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/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"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"
request.body = JSON.dump({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "factura",
  "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": "Exento",
            "TasaOCuota": "0.00",
            "Importe": 0
          }
        ]
      }
    }
  ],
  "UsoCFDI": "G03",
  "Serie": 17317,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": false
})

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



Ejemplo de respuesta exitosa

{
  "response": "success",
  "message": "Factura creada y enviada satisfactoriamente",
  "UUID": "8ff503a2-c6b7-4a25-XXX-a25610e6b488",
  "uid": "5c06fa8b3bbe6",
  "SAT": {
    "UUID": "8ff503a2-c6b7-XXX-92c7-a25610e6b488",
    "FechaTimbrado": "2018-12-04T16:07:08",
    "NoCertificadoSAT": "20001000000300022323",
    "Version": "1.1",
    "SelloSAT": "lzlv2bEVsjx8XkiJHJvlfCjr7xJ/laxZnvSmGSKF3C/HI9WFDYFFk4NfGyILBj8ll7m1VoCqlkSLvu9dRex4jSSGfPJOPGDrx7w/4AOj/scHPU23uIPhztnaHIYHKg9UxP4L9rgX814msJ8V86IXZ1nY7akr77Cpf2c2yAnHaO1fm81oQIe32obIs2GrOey6JG9oxQNrcUawSXXXXXXXX",
    "SelloCFD": "NJQH6WT8eLxAeti7pUWhB7F6C6xrdSqkFfORf3+SeGkhu+5E0cZZUQjgaSZLpPcgk01aQUf0Jayw2GewYou5MjD4OLzZnZuizPwy3cSfQXzgX6sJTtAsI00VyhQewxLYDSMqFUrPpniNQG8Nl/eEg1kx72kkmqih2KX2Z+URkhx14W7CMG2aMJnhDyZuyliF+cy3utjXwzxQMl+28A/mgnlfUXzZd/3IunTtxM/p4bpqbYinK+7Bd/n+90Z6axsFBs6N7wxUX6aK9YL58owhgVGXXXXXXXX"
  },
  "INV": {
    "Serie": "F",
    "Folio": 1433
  },
  "invoice_uid": "5c06fa8b3bXXX"
}

Ejemplo de respuesta de error

{
  "response": "error",
  "message": {
    "message": "CFDI33161 - El valor del campo Importe o que corresponde a Traslado no se encuentra entre el limite inferior y superior permitido.",
    "messageDetail": "Comprobante:Concepto:Impuestos:Traslado:Importe: El Importe es mayor o menor al limite superior/inferior calculado. LimiteSuperiorCalculado: 17 LimiteInferiorCalculado: 15 Comprobante:Concepto:Impuestos:Traslado:Importe: 19",
    "data": null,
    "status": "error"
  },
  "xmlerror": "\n</cfdi:Traslados></cfdi:Impuestos></cfdi:Concepto></cfdi:Conceptos></cfdi:Traslados></cfdi:Impuestos></cfdi:Comprobante>\n"
}

Receptor

Ejemplo de receptor .json

"Receptor": {
    "ResidenciaFIscal": "",
    "UID": "55c0fdc67593d"
},

A continuación se describen los atributos que deben incluirse en el nodo Receptor

El receptor debe incluir los siguientes atributos:

Parametro Tipo Requerido Detalles
 UID  string Requerido   Indica el UID del receptor del CFDI.

Ejemplo:
"UID": "55c0fdc67593d"
 ResidenciaFiscal  string  Opcional  Indicar el número de residencia fiscal cuando el receptor del comprobante sea un residente en el extranjero.

Ejemplo:
"ResidenciaFiscal": "5256452"

Conceptos

Ejemplo de conceptos .json

"Conceptos": [
    {
      "ClaveProdServ": "43232408",
      "NoIdentificacion": "WEBDEV10",
      "Cantidad": "1.000000",
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "Descripcion": "Desarrollo web a la medida",
      "ValorUnitario": "15000.000000",
      "Importe": "15000.000000",
      "Descuento": "0",
      "honorarioInverso": "",
      "montoHonorario": "0",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "15000.000000",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.16",
            "Importe": "2400.000000"
          }
        ],
        "Retenidos": [],
        "Locales": []
      },
      "NumeroPedimento": "",
      "Predial": "",
      "Partes": "0",
      "Complemento": "0"
    }
  ],

A continuación se describen los atributos que deben incluirse en el nodo Conceptos

Para cada concepto es necesario incluir los siguientes atributos:

Parámetro Tipo Requerido Detalles
ClaveProdServ string Requerido Indica la clave del producto o servicio correspondiente a tu concepto.

Es importante que ésta la tomes del catálogo indicado por el SAT para que sea válida.

Ejemplo:
"ClaveProdServ": "43232408"
NoIdentificacion string Opcional Indica el número de identificación o SKU en caso de tenerlo.

Ejemplo:
"NoIdentificacion": "WEBDEV10"
Cantidad number Requerido Indica la cantidad.

Ejemplo:
'Cantidad' : '1'
ClaveUnidad string Requerido Indica la clave de la unidad de medida correspondiente a tu concepto.

Consulta el listado de claves válidas para el SAT.

Ejemplo:
"ClaveUnidad": "E48"
Unidad string Requerido Indica la unidad de medida. Ésta debe coincidir con la clave de la unidad ingresada en el parámetro anterior.

Consulta el listado de claves válidas para el SAT.

Ejemplo:
"Unidad": "Unidad de servicio"
ValorUnitario string Requerido Indica el precio unitario sin incluir impuestos.

Ejemplo:
"ValorUnitario": "15000.00"
Descripcion string Requerido Indica la descripción del concepto.

Ejemplo:
"Descripcion": "Desarrollo web a la medida"
Descuento string Opcional Indica el importe del descuento, en caso de desear agregarlo.

Ejemplo:
"Descuento": "10.00"
Impuestos array Opcional Indicar los impuestos (traslados, locales y retenidos) que tendrá el concepto.

Consulta los parámetros que debe contener.

Ejemplo:
"Impuestos": {
"Traslados": [
{
"Base": "15000.000000",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "2400.000000"
}
],
"Retenidos": [],
"Locales": []
}
NumeroPedimento string Opcional Indica el número del pedimento correspondiente a la importación del bien.

Ejemplo:
"NumeroPedimento" : "15 48 3009 0001234"
Predial string Opcional necesario.

Ejemplo:
"Predial": "56485422",
Partes array Opcional Indica las partes o componentes que integran la totalidad del concepto.

Ver los atributos que puede contener
.

Impuestos

Ejemplo de impuestos.json

"Impuestos": {
  "Traslados": [
    {
      "Base": "15000.000000",
      "Impuesto": "002",
      "TipoFactor": "Tasa",
      "TasaOCuota": "0.16",
      "Importe": "2400.000000"
    }
  ],
  "Retenidos": [
    {
      "Base": "15000.000000",
      "Impuesto": "002",
      "TipoFactor": "Tasa",
      "TasaOCuota": "0.16",
      "Importe": "2400.000000"
    }
  ],
  "Locales": [
    {
      "Impuesto": "CEDULAR",
      "TasaOCuota": "0.05",
    }
  ]
},

A continuación se describen los atributos que deben incluirse en el nodo de impuestos

El nodo de impuestos se conforma de los siguientes atributos:

Parámetro Tipo Requerido Detalles
Traslados array

Requerido*

* Es requerido siempre y cuando la factura lleve el tipo de impuesto Traslado.

Indica los impuestos trasladados que se aplican a tu concepto.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Traslados": [
{
"Base": "15000.00",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "2400.00"
}
],


Ejemplo Excento:
"Traslados": [
{
"Base": "15000.00",
"Impuesto": "002",
"TipoFactor":"Exento",
"TasaOCuota": "0.00",
"Importe": "0.00"
}
],
Retenidos array Requerido*

* Es requerido siempre y cuando la factura lleve el tipo de impuesto Retenciones.
Indica los impuestos retenidos que se aplican a tu concepto.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Retenidos": [
{
"Base": "15000.00",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "2400.00"
}
],
 Locales array  Requerido*

* Es requerido siempre y cuando la factura lleve el tipo de impuesto Locales
Indica los impuestos locales que se aplican a tu concepto.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Locales": [
{
"Impuesto": "ISH",
"TasaOCuota": "0.05",
}
],

Atributos de los nodos Traslados y Retenidos

A continuación se describen los nodos que componen cada impuesto que desees agregar a tu concepto.

Un concepto puede tener más de un traslado y más de una retención. Cada impuesto debe incluirse dentro de un objeto, que a su vez es contenido por en el arreglo del tipo de impuesto correspondiente.

Los impuestos que pueden incluirse dentro de traslados son:

Los impuestos que pueden incluirse dentro de retenciones son:

Parámetro Tipo Requerido Detalles
Base float Requerido Indica el valor sobre el cual se calculará el impuesto.

Ejemplo:
"Base": "15000.00",
Impuesto string Requerido Indica la clave correspondiente al impuesto que deseas agregar.

Consultar el catálogo de claves de Impuestos.

Ejemplo:
"Impuesto": "002"
TipoFactor string Requerido Indica tipo de factor correspondiente al impuesto que deseas agregar.

Consultar el catálogo de Tipo factor.

Ejemplo:
"TipoFactor": "Tasa"
TasaOCuota float Requerido Indica la tasa o cuota correspondiente al impuesto que deseas agregar.

Consultar el catálogo de Tasa o cuota.

Ejemplo:
"TasaOCuota": "0.16"
Importe float Requerido Indica el importe del impuesto trasladado que aplica a cada concepto. No se permiten valores negativos.


Ejemplo:
"Importe": "2400.00"

Atributos del nodo Locales

A continuación se describen los nodos que componen los impuestos locales:

Parámetro Tipo Requerido Detalles
Impuesto string Requerido Indica el impuesto que deseas agregar, éste puede ser CEDULAR o ISH

Ejemplo:
"Impuesto": "CEDULAR"
TasaOCuota float Requerido Indica el valor de la tasa o cuota del impuesto que deseas agregar.

Ejemplo:
"TasaOCuota": "0.05"

Partes

Ejemplo de partes.json

"Partes":[
    { 
    "ClaveProdServ": "43232408",
        "NoIdentificacion":"WEBDEV10",
    "Cantidad":"1",
    "Unidad": "Unidad de servicio",
    "ValorUnitario": "15000.00",
    "Descripcion": "Desarrollo web a la medida"
  }
]

Este nodo es opcional y se utiliza para especificar los componentes de un concepto.

Ejemplo:

Si tu concepto es un kit de herramientas, en el nodo partes puedes especificar los elementos que conforman ese kit como: martillo, desarmador, pienzas,etc.

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

Parámetro Tipo Requerido Detalles
ClaveProdServ string Requerido Indica la clave del producto o servicio correspondiente a tu concepto.

Es importante que ésta la tomes del catálogo proveído por el SAT para que sea válida.

Ejemplo:
"ClaveProdServ": "43232408"
NoIdentificacion string Opcional Indica el número de identificación o SKU en caso de tenerlo.

Ejemplo:
"NoIdentificacion": "WEBDEV10"
Cantidad number Requerido Indica la cantidad.

Ejemplo:
'Cantidad' : '1'
Unidad string Requerido Indica la unidad de medida. Ésta debe coincidir con la clave de la unidad ingresada en el parámetro anterior.

Consulta el listado de claves válidas para el SAT.

Ejemplo:
"Unidad": "Unidad de servicio"
ValorUnitario float

Requerido

Indica el precio unitario sin incluir impuestos.

Ejemplo:
"ValorUnitario": "15000.00"
Descripcion string Requerido Indica la descripción del concepto.

Ejemplo:
"Descripcion": "Desarrollo web a la medida"

CFDIs relacionados

Ejemplo de cfdi_relacionados.json

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

Este nodo es opcional y se utiliza para especificar los CFDIs con los que se encuentra relacionado el CFDI que se está timbrando.

Ejemplo

Si tu CFDI está sustituyendo a un CFDI timbrado y cancelado anteriormente al mismo receptor, entonces deberás indicar en este el UID y el tipo de relación que existe entre ambos.

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

Parámetro Tipo Requerido Detalles
TipoRelacion string Requerido Indicar la clave del tipo de relación correspondiente.

Revisar el listado de claves proporcionado por el SAT.

Ejemplo:
"TipoRelacion": "01"
 UUID  array Requerido Indicar 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"
]

Descargar CFDI 4.0

Ejemplo para descargar CFDI en formato PDF

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/pdf',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: Ingresa API KEY',
    'F-Secret-Key: Ingresa SECRET KEY'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/pdf',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Ingresa API KEY',
    'F-Secret-Key': 'Ingresa SECRET KEY'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/pdf"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'Ingresa API KEY',
  'F-Secret-Key': 'Ingresa SECRET KEY'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/pdf")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Ingresa API KEY"
request["F-Secret-Key"] = "Ingresa SECRET KEY"

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

A continuación se explica como descargar un CFDI 4.0

Cada CFDI puede ser descargado a través de nuestra API en dos tipos de archivo distintos:

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

Tambien para descargar un CFDI es necesario el uso del siguiente parámetro el cual se utiliza en la construcción del enpoint para identificar el CFDI que deseamos descargar:

Ejemplo para descargar CFDI en formato XML

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/xml',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: Ingresa API KEY',
    'F-Secret-Key: Ingresa SECRET KEY'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/xml',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Ingresa API KEY',
    'F-Secret-Key': 'Ingresa SECRET KEY'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/xml"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'Ingresa API KEY',
  'F-Secret-Key': 'Ingresa SECRET KEY'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/xml")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Ingresa API KEY"
request["F-Secret-Key"] = "Ingresa SECRET KEY"

response = http.request(request)
puts response.read_body
Parámetro Tipo Requerido Detalles
cfdi_uid string Requerido Indica el UID o UUID del CFDI que deseas descargar.

Ejemplo:
55c0fdc67593d

Contrucción de la URL para descargar CFDI 4.0

Host: https://factura.com (producción) / http://devfactura.in (sandbox)

Ejemplo: https://factura.com/api/v4/cfdi40/55c0fdc67593d/pdf

Cancelar CFDI 4.0

Ejemplo para cancelar CFDI

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/cfdi40/{cfdi_uid}/cancel',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
  "motivo": "01",
  "folioSustituto": "3336cbb9-ebd4-45e8-b60b-e7bfa6f6b5e0"
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: Ingresa API KEY',
    'F-Secret-Key: Ingresa SECRET KEY'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v4/cfdi40/61ba335bd48fa/cancel',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Ingresa API KEY',
    'F-Secret-Key': 'Ingresa SECRET KEY'
  },
  body: JSON.stringify({
    "motivo": "01",
    "folioSustituto": "3336cbb9-ebd4-45e8-b60b-e7bfa6f6b5e0"
  })

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

import requests
import json

url = "http://devfactura.in/api/v4/cfdi40/61ba335bd48fa/cancel"

payload = json.dumps({
  "motivo": "01",
  "folioSustituto": "3336cbb9-ebd4-45e8-b60b-e7bfa6f6b5e0"
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'Ingresa API KEY',
  'F-Secret-Key': 'Ingresa SECRET KEY'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/cfdi40/61ba335bd48fa/cancel")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Ingresa API KEY"
request["F-Secret-Key"] = "Ingresa SECRET KEY"
request.body = JSON.dump({
  "motivo": "01",
  "folioSustituto": "3336cbb9-ebd4-45e8-b60b-e7bfa6f6b5e0"
})

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

A continuación se explica como funciona el servicio con el cual podras realizar cancelaciones de tus comprobantes con la versión de CFDI 4.0.

Para las cancelaciones en la versión 4.0 se utilizaran los siguientes parametros para la creación del metodo:

Parámetro Tipo Requerido Detalles
cfdi_uid string Requerido Indica el UID o UUID del CFDI que deseas cancelar.

Ejemplo:
55c0fdc67593d
motivo string Requerido

Indica motivo por el cual es solicitada la cancelación del CFDI.

Ejemplo:
01

folioSustituto string Requerido

Indica el UID o UUID del CFDI que reemplazara el CFDI cancelado.

Ejemplo:
3336cbb9-ebd4-45e8-b60b-e7bfa6f6b5e0

Clave Motivo Descripción Acción
01 Comprobante emitido con errores con relación Aplica cuando la factura generada contiene un error en la clave del producto, valor unitario, descuento o cualquier otro dato, por lo que se debe reexpedir. Primero se sustituye la factura y cuando se solicita la cancelación, se incorpora el folio de la factura que sustituye a la cancelada.
02 Comprobante emitido con errores sin relación Aplica cuando la factura generada contiene un error en la clave del producto, valor unitario, descuento o cualquier otro dato y no se requiera relacionar con otra factura generada. No hay acción adicional requerida.
03 No se llevó a cabo la operación Aplica cuando se facturó una operación que no se concreta. No hay acción adicional requerida.
04 Operación nominativa relacionada en la factura global Aplica cuando se incluye una venta en la factura global de operaciones con el público en general y, posterior a ello, el cliente solicita su factura nominativa; es decir, a su nombre y RFC. Se cancela la factura global, se reexpide sin incluir la operación por la que se solicita factura. Se expide la factura nominativa.

Construcción de la URL para cancelar CFDI 4.0:

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v4/cfdi40/cfdi_uid/cancel

Ejemplo: https://factura.com/api/v4/cfdi40/55c0fdc67593d/cancel

Respuesta de cancelación para CFDI 4.0

Respuesta exitosa

{
    "response": "success",
    "message": "Estimado cliente tu CFDI F66(a80387be-bb02-45c4-ac33-c85ed48a49ab) se canceló exitosamente",
    "respuestaapi": {
        "response": "success",
        "acuse": "<?xml version=\"1.0\" encoding=\"utf-8\"?><Acuse xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" Fecha=\"2021-12-28T14:30:48.3934087\" RfcEmisor=\"XOJI740919U48\"><Folios xmlns=\"http://cancelacfd.sat.gob.mx\"><UUID>A80387BE-BB02-45C4-AC33-C85ED48A49AB</UUID><EstatusUUID>201</EstatusUUID></Folios><Signature Id=\"SelloSAT\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#hmac-sha512\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\"><XPath>not(ancestor-or-self::*[local-name()='Signature'])</XPath></Transform></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha512\" /><DigestValue>pyf1Z8DeV/R934tgx7duakRCDSK0rlY+1Ql3pfc6OMXLMJnthgDyfNY20jXzxncIsJR1JGRKjj08AcGuLM4r1Q==</DigestValue></Reference></SignedInfo><SignatureValue>vagn0h0kJ9UJf0g5+fX6s7uSUnor7+by0Uj/CdYiEba8KM6a5HO2/DxUZqw8XovbxKrVyducZpqBamLXDTrG5w==</SignatureValue><KeyInfo><KeyName>BF66E582888CC845</KeyName><KeyValue><RSAKeyValue><Modulus>n5YsGT0w5Z70ONPbqszhExfJU+KY3Bscftc2jxUn4wxpSjEUhnCuTd88OK5QbDW3Mupoc61jr83lRhUCjchFAmCigpC10rEntTfEU+7qtX8ud/jJJDB1a9lTIB6bhBN//X8IQDjhmHrfKvfen3p7RxLrFoxzWgpwKriuGI5wUlU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo></Signature></Acuse>"
    }
}




Enviar CFDI 4.0

Ejemplo de enviar CFDI 4.0

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/email',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: Tu API key',
    'F-Secret-Key: Tu Secret key'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/email',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/email"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'Tu API key',
  'F-Secret-Key': 'Tu Secret key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/cfdi40/61d4c3fe77dd8/email")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"

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

A continuación se explica como enviar un CFDI.

Podemos enviar un CFDI haciendo uso del siguiente parámetro:

Parámetro Tipo Requerido Detalles
cfdi_uid string Requerido Indica el UID o UUID del CFDI que deseas enviar.

Ejemplo:
55c0fdc67593d

Construcción de la URL para enviar CFDI 4.0:

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v4/cfdi40/cfdi_uid/email

Ejemplo: https://factura.com/api/v4/cfdi40/55c0fdc67593d/email

Respuesta de enviar CFDI 4.0

Ejemplo de envio exitoso de CFDI 4.0

{
    "response": "success",
    "uid": "6169fc02637e1",
    "message": "Hemos enviado tu Factura con exito al e-mail's ejemplo@mail.com"
}

Consultar estatus de cancelación de un CFDI 4.0

A continuación se explica como consultar el estatus de la cancelación de un CFDI con un ejemplo de como hacerlo.

Podemos consultar el estatus CFDI haciendo uso del siguiente parámetro:

Parámetro Tipo Requerido Detalles
UUID string Requerido Indica el UID o UUID del CFDI que deseas consultar.

Ejemplo:
55c0fdc67593d

Construcción de la URL para consultar estatus de CFDI 4.0:

Ejemplo de estatus de CFDI

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v4/cfdi40/uid/cancel_status");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v4/cfdi40/616d946410050/cancel_status',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/cfdi40/616d946410050/cancel_status"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/cfdi40/616d946410050/cancel_status")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v4/cfdi40/uid/cancel_status

Ejemplo: https://factura.com/api/v4/cfdi40/c55df8b4-37b3-47cf-9e35-efdb4c3261b4/cancel_status

Ejemplo: https://factura.com/api/v4/cfdi40/c55df8b4/cancel_status

Respuesta de estatus de CFDI 4.0

Estatus vigente cancelable

{
    "response": "success",
    "data": {
        "CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
        "Estado": "Vigente",
        "EsCancelable": "Cancelable sin aceptación",
        "EstatusCancelacion": []
    }
}

Estatus cancelado

{
    "response": "success",
    "data": {
        "CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
        "Estado": "Cancelado",
        "EsCancelable": "Cancelable sin aceptación",
        "EstatusCancelacion": "Cancelado sin aceptación"
    }
}

Estatus vigente no cancelable

{
    "response": "success",
    "data": {
        "CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
        "Estado": "Vigente",
        "EsCancelable": "No Cancelable",
        "EstatusCancelacion": []
    }
}

CFDI 3.3

Listar CFDIs 3.3

A continuación se explica como listar los CFDI's , con un ejemplo y muestra de posibles respuestas obtenidas.

Podemos consultar los CFDI's filtrando por los siguientes parámetros:

Parametro Tipo Requerido Detalles
month number Opcional Induca el número de mes que deseas consultar. Éste debe estar escrito en 2 dígitos. Ejemplo: Enero = 01, Diciembre = 12, etc.
year number Opcional Indica el año que deseas consultar. Éste debe estar escrito en 4 dígitos. Ejemplo: 2017.
rfc string Opcional Indica un RFC para traer todos los CFDI's timbrados al mismo. Ejemplo: XAXX010101000.
type_dpcument string Opcionl Indica un tipo de CFDI para listar solo los CFDI's de ese tipo. Para ello enviar la clave indicada en el catálogo de Tipos de CFDI. Ejemplo: factura Consulta el catálogo de tipos de CFDIs.
page int Opcional Indica número de página a consultar, por default posiciona en la página 1.
per_page int Opcional Indica el limite de resultados para mostrar, por default retorna 100 registros.

Construcción de la URL para listar CFDI 3.3

Ejemplo.

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://devfactura.in/api/v3/cfdi33/list");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ".'Ingresa API KEY',
    "F-Secret-Key: " .'Ingresa SECRET KEY'
));

$response = curl_exec($ch);

return die($response);

curl_close($ch);

?>
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/cfdi33/list',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/cfdi33/list"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/list")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Host: https://factura.com (producción) / http://devfactura.in (sandbox)

Endpoint: /api/v3/cfdi33/list

Ejemplo: https://factura.com/api/v3/cfdi33/list

Respuestas de listar CFDIs 3.3

Ejemplo de respuesta exitosa.

{
  "status": "success",
  "response": "success",
  "total": 2479,
  "per_page": 100,
  "current_page": 1,
  "last_page": 25,
  "from": 1,
  "to": 100,
  "data": [
    {
      "RazonSocialReceptor": "Venta Al Público en General",
      "Folio": "F 01",
      "UID": "5c04c662exxxx",
      "UUID": "1750d757-577d-xxxx-xxxx-518b87b24a87",
      "Subtotal": "5.000000",
      "Descuento": null,
      "Total": "5.800000",
      "ReferenceClient": 0,
      "NumOrder": null,
      "Receptor": "XAXX010101000",
      "FechaTimbrado": "2018-12-03",
      "Status": "enviada",
      "Version": "3.3"
    },
    {
      "RazonSocialReceptor": "Cliente ejemplo",
      "Folio": "F 160",
      "UID": "5c033ca2e4xxx",
      "UUID": "c25c6c99-xxx-xxx-810e-e5ae7e12eb15",
      "Subtotal": "10000.000000",
      "Descuento": null,
      "Total": "11600.000000",
      "ReferenceClient": 15,
      "NumOrder": null,
      "Receptor": "XAXX010101000",
      "FechaTimbrado": "2018-12-01",
      "Status": "enviada",
      "Version": "3.3"
    }
  ]
}

Ejemplo de respuesta erronea

{
  "status": "error",
  "message": "La cuenta que intenta autenticarse no existe",
  "Data": "$2y$10$dnOV7qC7ZrD1CZitpUnTReLKtKPxG29XfwZylrEuiR0KVl18pOXXX",
  "Secret": "$2y$10$6ZN4aX5UExwz6HFlDSZcxOF1TGjHx8f40neE.CrXHHahyAfi8qiXXX"
}

Crear CFDI 3.3

A continuación se explica como crear un CFDI, con un ejemplo y muestra de posibles respuestas obtenidas.

Podemos crear un CFDI haciendo uso de los siguientes parametros:

Parámetro Tipo Requerido Detalles
Receptor array Requerido Indica el UID del receptor/cliente previamente creado en factura.com

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Receptor":
{
"ResidenciaFiscal": "",
"UID": "55c0fdc67593d"
}
TipoDocumento string Requerido Indica la clave del tipo de documento que deseas timbrar.

Ver listado de tipos de documentos.

Ejemplo:
"TipoDocumento": "factura"
Conceptos array Requerido Es un arreglo de objetos, en el que cada objeto corresponde a un concepto con sus atibutos para agregar al CFDI.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Conceptos": [
{
"ClaveProdServ": "43232408",
"NoIdentificacion": "0021",
"Cantidad": "1.000000",
"ClaveUnidad": "E48",
"Unidad": "Unidad de servicio",
"Descripcion": "Desarrollo web a la medida",
"ValorUnitario": "15000.000000",
"Importe":
"15000.000000",
"Descuento": "0",
"Impuestos": {
"Traslados": [
{
"Base":
"15000.000000",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "2400.000000"
}
],
"Retenidos": [],
"Locales": []
},
}
]
UsoCFDI string Requerido Indica la clave del Uso de CFDI, ésta debe ser válida para el SAT.

Ver catálogo de claves de uso de cfdi.

Ejemplo:
"UsoCFDI": "G01"
Serie number Requerido Indica id de la serie con la que deseas timbrar el documento.

Ésta debe estar dada de alta en tu panel de Factura.com 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
FormaPago string Requerido Indica la clave de la forma de pago.

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

Ejemplo:
"FormaPago": "01"
MetodoPago string Requerido Indica la clave del método de pago

Ésta puedes consultarla en el Catálogo de métodos de pago.

Ejemplo:
"MetodoPago": "PUE",
CondicionesDePago string Opcional Indica las condiciones de pago del CFDI, éstas deben tener una longitud minima de 1 y máxima de 1000 caracteres.

Ejemplo:
"CondicionesDePago": "Pago en 9 meses"
CfdiRelacionados array Opcional En caso que tu CFDI vaya relacionado con otro(s), envía un arreglo con el/los UUID's con los que está relacionado.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"CfdiRelacionados": {
"TipoRelacion": "01",
"UUID": [
"29c98cb2-f72a-4cbe-a297-606da335e187",
"a96f6b9a-70aa-4f2d-bc5e-d54fb7371236"
]
}
Moneda string Requerido Indica la clave de la moneda del CFDI.

Ésta puedes consultarla en el Catálogo de monedas

Ejemplo:
"Moneda": "MXN"
TipoCambio string Opcional / Requerido en caso que el atributo Moneda sea diferente de MXN Indicar el tipo de cambio vigente al momento de crear el CFDI.

Ejemplo:
"TipoCambio": "19.85"
NumOrder number Opcional Indica el número de orden o pedido.

Este dato es solo para control interno.

Ejemplo:
"NumOrder": "85abf36"
Fecha string Opcional Indica 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:
"Fecha": "2020-03-20\T12:53:23"
Comentarios string Opcional Indica si deseas que aparezcan comentarios en el PDF de tu CFDI.

Ejemplo:
"Comentarios": "El pedido aún no es entregado"
Cuenta string Opcional En caso de desearlo, indica los últimos 4 dígitos de la tarjeta o cuenta bancaria del cliente.

Ejemplo:
"Cuenta": "0025"
EnviarCorreo bolean Opcional Indica 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"
LugarExpedicion string Opcional Indica el Código postal del lugar de expedición del CFDI.

Éste debe tener 5 caracteres.

Ejemplo:
"LugarExpedicion": "44650"

Construcción de la URL para crear CFDI 3.3

Ejemplo para crear CFDI.

<?php


for ($x = 1; $x <= 1; $x++) {
    $Conceptos[] = [
        'ClaveProdServ' => '81112107',
        'Cantidad' => '1',
        'ClaveUnidad' => 'E48',
        'Unidad' => 'Unidad de servicio',
        'ValorUnitario' => '100',
        'Descripcion' => 'Desarrollo a la medida',
        'Descuento' => '0',
        'Impuestos' => [
            'Traslados' => [
                ['Base' => '100', 'Impuesto' => '002', 'TipoFactor' => 'Tasa', 'TasaOCuota' => '0.160000', 'Importe' => '16'],
            ]
        ],
    ];
}

$ch = curl_init();
$fields = [
    "Receptor" => ["UID" => "55c0fdc675XXX"],
    "TipoDocumento" => "factura",
    "UsoCFDI" => "P01",
    "Redondeo" => 2,
    "Conceptos" => $Conceptos,
    "FormaPago" => "01",
    "MetodoPago" => 'PUE',
    "Moneda" => "MXN",
    "CondicionesDePago" => "Pago en una sola exhibición",
    "Serie" => 1,
    "EnviarCorreo" => 'true',
    "InvoiceComments" => ""
];

$jsonfield = json_encode($fields);


curl_setopt($ch, CURLOPT_URL, "http://devfactura.in/api/v3/cfdi33/create");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonfield);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-API-KEY: ". 'Ingresa API KEY',
    "F-SECRET-KEY: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);

return die($response);

curl_close($ch);

?>
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v3/cfdi33/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "6169fc02637e1"
    },
    "TipoDocumento": "factura",
    "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
            }
          ]
        }
      }
    ],
    "UsoCFDI": "G03",
    "Serie": 17317,
    "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 = "http://devfactura.in/api/v3/cfdi33/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "factura",
  "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
          }
        ]
      }
    }
  ],
  "UsoCFDI": "G03",
  "Serie": 17317,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": False
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/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"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"
request.body = JSON.dump({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "factura",
  "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
          }
        ]
      }
    }
  ],
  "UsoCFDI": "G03",
  "Serie": 17317,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": false
})

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

Host: https://factura.com (producción) / http://devfactura.in (sandbox)

Endpoint: /api/v3/cfdi33/create

Ejemplo: https://factura.com/api/v3/cfdi33/create

Ejemplo para crear cfdi exento.

<?php


for ($x = 1; $x <= 1; $x++) {
    $Conceptos[] = [
        'ClaveProdServ' => '81112107',
        'Cantidad' => '1',
        'ClaveUnidad' => 'E48',
        'Unidad' => 'Unidad de servicio',
        'ValorUnitario' => '100',
        'Descripcion' => 'Desarrollo a la medida',
        'Descuento' => '0',
        'Impuestos' => [
            'Traslados' => [
                ['Base' => '100', 'Impuesto' => '002', 'TipoFactor' => 'Exento', 'TasaOCuota' => '0.00', 'Importe' => '00'],
            ]
        ],
    ];
}

$ch = curl_init();
$fields = [
    "Receptor" => ["UID" => "55c0fdc675XXX"],
    "TipoDocumento" => "factura",
    "UsoCFDI" => "P01",
    "Redondeo" => 2,
    "Conceptos" => $Conceptos,
    "FormaPago" => "01",
    "MetodoPago" => 'PUE',
    "Moneda" => "MXN",
    "CondicionesDePago" => "Pago en una sola exhibición",
    "Serie" => 1,
    "EnviarCorreo" => 'true',
    "InvoiceComments" => ""
];

$jsonfield = json_encode($fields);


curl_setopt($ch, CURLOPT_URL, "http://devfactura.in/api/v3/cfdi33/create");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonfield);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-API-KEY: ". 'Ingresa API KEY',
    "F-SECRET-KEY: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);

return die($response);

curl_close($ch);

?>
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v3/cfdi33/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "6169fc02637e1"
    },
    "TipoDocumento": "factura",
    "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": "Exento",
              "TasaOCuota": "0.00",
              "Importe": 0
            }
          ]
        }
      }
    ],
    "UsoCFDI": "G03",
    "Serie": 17317,
    "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 = "http://devfactura.in/api/v3/cfdi33/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "factura",
  "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": "Exento",
            "TasaOCuota": "0.00",
            "Importe": 0
          }
        ]
      }
    }
  ],
  "UsoCFDI": "G03",
  "Serie": 17317,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": False
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/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"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"
request.body = JSON.dump({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "factura",
  "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": "Exento",
            "TasaOCuota": "0.00",
            "Importe": 0
          }
        ]
      }
    }
  ],
  "UsoCFDI": "G03",
  "Serie": 17317,
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "MXN",
  "EnviarCorreo": false
})

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



Ejemplo de respuesta exitosa

{
  "response": "success",
  "message": "Factura creada y enviada satisfactoriamente",
  "UUID": "8ff503a2-c6b7-4a25-XXX-a25610e6b488",
  "uid": "5c06fa8b3bbe6",
  "SAT": {
    "UUID": "8ff503a2-c6b7-XXX-92c7-a25610e6b488",
    "FechaTimbrado": "2018-12-04T16:07:08",
    "NoCertificadoSAT": "20001000000300022323",
    "Version": "1.1",
    "SelloSAT": "lzlv2bEVsjx8XkiJHJvlfCjr7xJ/laxZnvSmGSKF3C/HI9WFDYFFk4NfGyILBj8ll7m1VoCqlkSLvu9dRex4jSSGfPJOPGDrx7w/4AOj/scHPU23uIPhztnaHIYHKg9UxP4L9rgX814msJ8V86IXZ1nY7akr77Cpf2c2yAnHaO1fm81oQIe32obIs2GrOey6JG9oxQNrcUawSXXXXXXXX",
    "SelloCFD": "NJQH6WT8eLxAeti7pUWhB7F6C6xrdSqkFfORf3+SeGkhu+5E0cZZUQjgaSZLpPcgk01aQUf0Jayw2GewYou5MjD4OLzZnZuizPwy3cSfQXzgX6sJTtAsI00VyhQewxLYDSMqFUrPpniNQG8Nl/eEg1kx72kkmqih2KX2Z+URkhx14W7CMG2aMJnhDyZuyliF+cy3utjXwzxQMl+28A/mgnlfUXzZd/3IunTtxM/p4bpqbYinK+7Bd/n+90Z6axsFBs6N7wxUX6aK9YL58owhgVGXXXXXXXX"
  },
  "INV": {
    "Serie": "F",
    "Folio": 1433
  },
  "invoice_uid": "5c06fa8b3bXXX"
}

Ejemplo de respuesta de error

{
  "response": "error",
  "message": {
    "message": "CFDI33161 - El valor del campo Importe o que corresponde a Traslado no se encuentra entre el limite inferior y superior permitido.",
    "messageDetail": "Comprobante:Concepto:Impuestos:Traslado:Importe: El Importe es mayor o menor al limite superior/inferior calculado. LimiteSuperiorCalculado: 17 LimiteInferiorCalculado: 15 Comprobante:Concepto:Impuestos:Traslado:Importe: 19",
    "data": null,
    "status": "error"
  },
  "xmlerror": "\n</cfdi:Traslados></cfdi:Impuestos></cfdi:Concepto></cfdi:Conceptos></cfdi:Traslados></cfdi:Impuestos></cfdi:Comprobante>\n"
}

Receptor CFDI 3.3

Ejemplo de receptor .json

"Receptor": {
    "ResidenciaFIscal": "",
    "UID": "55c0fdc67593d"
},

A continuación se describen los atributos que deben incluirse en el nodo Receptor

El receptor debe incluir los siguientes atributos:

Parametro Tipo Requerido Detalles
 UID  string Requerido   Indica el UID del receptor del CFDI.

Ejemplo:
"UID": "55c0fdc67593d"
 ResidenciaFiscal  string  Opcional  Indicar el número de residencia fiscal cuando el receptor del comprobante sea un residente en el extranjero.

Ejemplo:
"ResidenciaFiscal": "5256452"

Conceptos CFDI 3.3

Ejemplo de conceptos .json

"Conceptos": [
    {
      "ClaveProdServ": "43232408",
      "NoIdentificacion": "WEBDEV10",
      "Cantidad": "1.000000",
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "Descripcion": "Desarrollo web a la medida",
      "ValorUnitario": "15000.000000",
      "Importe": "15000.000000",
      "Descuento": "0",
      "honorarioInverso": "",
      "montoHonorario": "0",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "15000.000000",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.16",
            "Importe": "2400.000000"
          }
        ],
        "Retenidos": [],
        "Locales": []
      },
      "NumeroPedimento": "",
      "Predial": "",
      "Partes": "0",
      "Complemento": "0"
    }
  ],

A continuación se describen los atributos que deben incluirse en el nodo Conceptos

Para cada concepto es necesario incluir los siguientes atributos:

Parámetro Tipo Requerido Detalles
ClaveProdServ string Requerido Indica la clave del producto o servicio correspondiente a tu concepto.

Es importante que ésta la tomes del catálogo indicado por el SAT para que sea válida.

Ejemplo:
"ClaveProdServ": "43232408"
NoIdentificacion string Opcional Indica el número de identificación o SKU en caso de tenerlo.

Ejemplo:
"NoIdentificacion": "WEBDEV10"
Cantidad number Requerido Indica la cantidad.

Ejemplo:
'Cantidad' : '1'
ClaveUnidad string Requerido Indica la clave de la unidad de medida correspondiente a tu concepto.

Consulta el listado de claves válidas para el SAT.

Ejemplo:
"ClaveUnidad": "E48"
Unidad string Requerido Indica la unidad de medida. Ésta debe coincidir con la clave de la unidad ingresada en el parámetro anterior.

Consulta el listado de claves válidas para el SAT.

Ejemplo:
"Unidad": "Unidad de servicio"
ValorUnitario string Requerido Indica el precio unitario sin incluir impuestos.

Ejemplo:
"ValorUnitario": "15000.00"
Descripcion string Requerido Indica la descripción del concepto.

Ejemplo:
"Descripcion": "Desarrollo web a la medida"
Descuento string Opcional Indica el importe del descuento, en caso de desear agregarlo.

Ejemplo:
"Descuento": "10.00"
Impuestos array Opcional Indicar los impuestos (traslados, locales y retenidos) que tendrá el concepto.

Consulta los parámetros que debe contener.

Ejemplo:
"Impuestos": {
"Traslados": [
{
"Base": "15000.000000",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "2400.000000"
}
],
"Retenidos": [],
"Locales": []
}
NumeroPedimento string Opcional Indica el número del pedimento correspondiente a la importación del bien.

Ejemplo:
"NumeroPedimento" : "15 48 3009 0001234"
Predial string Opcional necesario.

Ejemplo:
"Predial": "56485422",
Partes array Opcional Indica las partes o componentes que integran la totalidad del concepto.

Ver los atributos que puede contener
.

Impuestos CFDI 3.3

Ejemplo de impuestos.json

"Impuestos": {
  "Traslados": [
    {
      "Base": "15000.000000",
      "Impuesto": "002",
      "TipoFactor": "Tasa",
      "TasaOCuota": "0.16",
      "Importe": "2400.000000"
    }
  ],
  "Retenidos": [
    {
      "Base": "15000.000000",
      "Impuesto": "002",
      "TipoFactor": "Tasa",
      "TasaOCuota": "0.16",
      "Importe": "2400.000000"
    }
  ],
  "Locales": [
    {
      "Impuesto": "CEDULAR",
      "TasaOCuota": "0.05",
    }
  ]
},

A continuación se describen los atributos que deben incluirse en el nodo de impuestos

El nodo de impuestos se conforma de los siguientes atributos:

Parámetro Tipo Requerido Detalles
Traslados array

Requerido*

* Es requerido siempre y cuando la factura lleve el tipo de impuesto Traslado.

Indica los impuestos trasladados que se aplican a tu concepto.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Traslados": [
{
"Base": "15000.00",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "2400.00"
}
],


Ejemplo Excento:
"Traslados": [
{
"Base": "15000.00",
"Impuesto": "002",
"TipoFactor":"Exento",
"TasaOCuota": "0.00",
"Importe": "0.00"
}
],
Retenidos array Requerido*

* Es requerido siempre y cuando la factura lleve el tipo de impuesto Retenciones.
Indica los impuestos retenidos que se aplican a tu concepto.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Retenidos": [
{
"Base": "15000.00",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": "2400.00"
}
],
 Locales array  Requerido*

* Es requerido siempre y cuando la factura lleve el tipo de impuesto Locales
Indica los impuestos locales que se aplican a tu concepto.

Ver listado de atributos posibles para este nodo.

Ejemplo:
"Locales": [
{
"Impuesto": "ISH",
"TasaOCuota": "0.05",
}
],

Atributos de los nodos Traslados y Retenidos CFDI 3.3

A continuación se describen los nodos que componen cada impuesto que desees agregar a tu concepto.

Un concepto puede tener más de un traslado y más de una retención. Cada impuesto debe incluirse dentro de un objeto, que a su vez es contenido por en el arreglo del tipo de impuesto correspondiente.

Los impuestos que pueden incluirse dentro de traslados son:

Los impuestos que pueden incluirse dentro de retenciones son:

Parámetro Tipo Requerido Detalles
Base float Requerido Indica el valor sobre el cual se calculará el impuesto.

Ejemplo:
"Base": "15000.00",
Impuesto string Requerido Indica la clave correspondiente al impuesto que deseas agregar.

Consultar el catálogo de claves de Impuestos.

Ejemplo:
"Impuesto": "002"
TipoFactor string Requerido Indica tipo de factor correspondiente al impuesto que deseas agregar.

Consultar el catálogo de Tipo factor.

Ejemplo:
"TipoFactor": "Tasa"
TasaOCuota float Requerido Indica la tasa o cuota correspondiente al impuesto que deseas agregar.

Consultar el catálogo de Tasa o cuota.

Ejemplo:
"TasaOCuota": "0.16"
Importe float Requerido Indica el importe del impuesto trasladado que aplica a cada concepto. No se permiten valores negativos.


Ejemplo:
"Importe": "2400.00"

Atributos del nodo Locales CFDI 3.3

A continuación se describen los nodos que componen los impuestos locales:

Parámetro Tipo Requerido Detalles
Impuesto string Requerido Indica el impuesto que deseas agregar, éste puede ser CEDULAR o ISH

Ejemplo:
"Impuesto": "CEDULAR"
TasaOCuota float Requerido Indica el valor de la tasa o cuota del impuesto que deseas agregar.

Ejemplo:
"TasaOCuota": "0.05"

Partes CFDI 3.3

Ejemplo de partes.json

"Partes":[
    { 
    "ClaveProdServ": "43232408",
        "NoIdentificacion":"WEBDEV10",
    "Cantidad":"1",
    "Unidad": "Unidad de servicio",
    "ValorUnitario": "15000.00",
    "Descripcion": "Desarrollo web a la medida"
  }
]

Este nodo es opcional y se utiliza para especificar los componentes de un concepto.

Ejemplo:

Si tu concepto es un kit de herramientas, en el nodo partes puedes especificar los elementos que conforman ese kit como: martillo, desarmador, pienzas,etc.

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

Parámetro Tipo Requerido Detalles
ClaveProdServ string Requerido Indica la clave del producto o servicio correspondiente a tu concepto.

Es importante que ésta la tomes del catálogo proveído por el SAT para que sea válida.

Ejemplo:
"ClaveProdServ": "43232408"
NoIdentificacion string Opcional Indica el número de identificación o SKU en caso de tenerlo.

Ejemplo:
"NoIdentificacion": "WEBDEV10"
Cantidad number Requerido Indica la cantidad.

Ejemplo:
'Cantidad' : '1'
Unidad string Requerido Indica la unidad de medida. Ésta debe coincidir con la clave de la unidad ingresada en el parámetro anterior.

Consulta el listado de claves válidas para el SAT.

Ejemplo:
"Unidad": "Unidad de servicio"
ValorUnitario float

Requerido

Indica el precio unitario sin incluir impuestos.

Ejemplo:
"ValorUnitario": "15000.00"
Descripcion string Requerido Indica la descripción del concepto.

Ejemplo:
"Descripcion": "Desarrollo web a la medida"

CFDIs relacionados CFDI 3.3

Ejemplo de cfdi_relacionados.json

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

Este nodo es opcional y se utiliza para especificar los CFDIs con los que se encuentra relacionado el CFDI que se está timbrando.

Ejemplo

Si tu CFDI está sustituyendo a un CFDI timbrado y cancelado anteriormente al mismo receptor, entonces deberás indicar en este el UID y el tipo de relación que existe entre ambos.

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

Parámetro Tipo Requerido Detalles
TipoRelacion string Requerido Indicar la clave del tipo de relación correspondiente.

Revisar el listado de claves proporcionado por el SAT.

Ejemplo:
"TipoRelacion": "01"
 UUID  array Requerido Indicar 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"
]

Descargar CFDI 3.3

Ejemplo para descargar CFDI en formato PDF

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/cfdi33/cfdi_uid/pdf");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

$filename = 'F450';

header('Content-Type: application/pdf');
header("Content-Transfer-Encoding: Binary");
header('Content-disposition: attachment; filename="' . $filename . '.pdf"');
echo $response;
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/cfdi33/616d991b0e1ca/pdf',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/cfdi33/616d991b0e1ca/pdf"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)
open('/Users/user/descarga.pdf', 'wb').write(response.content)


print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/616d991b0e1ca/pdf")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Ejemplo para descargar CFDI en formato XML

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/cfdi33/cfdi_uid/xml");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ".'Ingresa API KEY',
    "F-Secret-Key: " .'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

$filename = 'F450';

header('Content-disposition: attachment; filename="' . $filename . '.xml"');
header('Content-type: "text/xml"; charset="utf8"');
echo $response;
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/cfdi33/616d991b0e1ca/xml',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/cfdi33/616d991b0e1ca/xml"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)
open('/Users/user/descarga.pdf', 'wb').write(response.content)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/616d991b0e1ca/xml")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

A continuación se explica como descargar un CFDI.

Cada CFDI puede ser descargado a través de nuestra API en dos tipos de archivo distintos:

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

Podemos descargar un CFDI haciendo uso del siguiente parámetro:

s
Parámetro TipoRequerido Detalles
cfdi_uid string Requerido Indica el UID o UUID del CFDI que deseas descargar.

Ejemplo:
55c0fdc67593d

Contrucción de la URL para descargar CFDI 3.3:

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint PDF: /api/v3/cfdi33/cfdi_uid/pdf Endpoint XML: /api/v3/cfdi33/cfdi_uid/xml

Ejemplo: https://factura.com/api/v3/cfdi33/55c0fdc67593d/pdf

Descargar Carta Porte CFDI 3.3 sin costos

Podemos descargar la Carta Porte en su version PDF con los costos ocultos.

Esta opcion esta pensada en la seguridad de nuestros clientes para poder proporcionar un documento a los transportistas sin incluir el dato del costo de los productos.

Para descargar nuestra Carta Porte con los costos ocultos es necesario añadir el siguiente parametro al final de nuestro endpoint:

Ejemplo: https://factura.com/api/v3/cfdi33/55c0fdc67593d/pdf?hidePrices=1

Cancelar CFDI 3.3

Ejemplo para cancelar CFDI

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/cfdi33/61cce9cf49e2e/cancel',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
  "motivo": "01",
  "folioSustituto": "8a5c291c-9540-4c20-984c-814de68c3dca"
}',
  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': 'http://devfactura.in/api/v4/cfdi33/61cce9cf49e2e/cancel',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  body: JSON.stringify({
    "motivo": "01",
    "folioSustituto": "8a5c291c-9540-4c20-984c-814de68c3dca"
  })

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

url = "http://devfactura.in/api/v4/cfdi33/61cce9cf49e2e/cancel"

payload = json.dumps({
  "motivo": "01",
  "folioSustituto": "8a5c291c-9540-4c20-984c-814de68c3dca"
})
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("http://devfactura.in/api/v4/cfdi33/61cce9cf49e2e/cancel")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
  "motivo": "01",
  "folioSustituto": "8a5c291c-9540-4c20-984c-814de68c3dca"
})

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

Documentación de cancelaciones CFDI 4.0

A continuación se explica como funciona el servicio con el cual podras realizar cancelaciones de tus comprobantes con la versión de CFDI 3.3.

Para las cancelaciones en la versión 3.3 se utilizaran los siguientes parametros para la creación del metodo:

Parámetro Tipo Requerido Detalles
cfdi_uid string Requerido Indica el UID o UUID del CFDI que deseas cancelar.

Ejemplo:
55c0fdc67593d
motivo string Requerido

Indica motivo por el cual es solicitada la cancelación del CFDI.

Ejemplo:
01

folioSustituto string Requerido

Indica el UID o UUID del CFDI que reemplazara el CFDI cancelado.

Ejemplo:
8a5c291c-9540-4c20-984c-814de68c3dca

Clave Motivo Descripción Acción
01 Comprobante emitido con errores con relación Aplica cuando la factura generada contiene un error en la clave del producto, valor unitario, descuento o cualquier otro dato, por lo que se debe reexpedir. Primero se sustituye la factura y cuando se solicita la cancelación, se incorpora el folio de la factura que sustituye a la cancelada.
02 Comprobante emitido con errores sin relación Aplica cuando la factura generada contiene un error en la clave del producto, valor unitario, descuento o cualquier otro dato y no se requiera relacionar con otra factura generada. No hay acción adicional requerida.
03 No se llevó a cabo la operación Aplica cuando se facturó una operación que no se concreta. No hay acción adicional requerida.
04 Operación nominativa relacionada en la factura global Aplica cuando se incluye una venta en la factura global de operaciones con el público en general y, posterior a ello, el cliente solicita su factura nominativa; es decir, a su nombre y RFC. Se cancela la factura global, se reexpide sin incluir la operación por la que se solicita factura. Se expide la factura nominativa.

Construcción de la URL para cancelar CFDI 3.3:

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v4/cfdi33/cfdi_uid/cancel

Ejemplo: https://factura.com/api/v4/cfdi33/55c0fdc67593d/cancel

Respuesta de cancelación de CFDI 3.3

Respuesta exitosa

{
   "response": "success",
   "message": "Estimado cliente tu CFDI CED274(10bc80fd-2881-4559-b98f-009cc6f6d28c) se canceló exitosamente",
   "respuestaapi": {
      "response": "success",
      "acuse": "10BC80FD-2881-4559-B98F-009CC6F6D28C<\/UUID>201<\/EstatusUUID><\/Folios>not(ancestor-or-self::*[local-name()='Signature'])<\/XPath><\/Transform><\/Transforms>5p+cQwZ7vlmQ17braGY0x5Fd8KZI65Iif0S8FKsjeOfgT5Jxv5MAjmJRqxTTSaiNerizKFr3WCq9MdmS9V2lgg==<\/DigestValue><\/Reference><\/SignedInfo>Mj7oysYQmbHCiZWMOd8bUMXHPBgPSCJxulvF4xHwM8CqSawNl7WP3F5/7GrDRGndR8covbSqNY+Qg8sP2kKL9w==<\/SignatureValue>00001088888800000031<\/KeyName>ujwIJaMKWWmawqDpHx/OS10pXzEh2SQhY02y64v9Q0+I+0dGlIrjFJeGrsHqAT3JoYnh38Dxwta98t/7++dh2hOgiZEwRignWRIlOgM1MefBHEyY+hi4vHpZgPKq/hJVfHf9nOvlb5UgIHMTCEwrDp3qk9O5XtTEycnWwiqleG0c1J9sfbRxC0gYBHsNTH85OEtSXYMkiWNYNnFbIc7B0sgp2y18jUxUCNFBMMTV0tz2sxRF+V4hblaPjI75RWmvs9E4lD7MVmW3z7LIlSajuSL8eOqoerSkQhPBABIeQenEPQwRTt3ej3XpVaBsOmagIPZZI3RvOVh+5mcXDE5txQ==<\/Modulus>AQAB<\/Exponent><\/RSAKeyValue><\/KeyValue><\/KeyInfo><\/Signature><\/Acuse>"
   }
}




Enviar CFDI 3.3

Ejemplo de enviar CFDI

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/cfdi33/cfdi_uid/email");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/cfdi33/616d946410050/email',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/cfdi33/616d946410050/email"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/616d946410050/email")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

A continuación se explica como enviar un CFDI.

Podemos enviar un CFDI haciendo uso del siguiente parámetro:

Parámetro Tipo Requerido Detalles
cfdi_uid string Requerido Indica el UID o UUID del CFDI que deseas enviar.

Ejemplo:
55c0fdc67593d

Construcción de la URL para enviar CFDI 3.3:

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/cfdi33/cfdi_uid/email

Ejemplo: https://factura.com/api/v3/cfdi33/55c0fdc67593d/email

Consultar estatus de cancelación de un CFDI 3.3

A continuación se explica como consultar el estatus de la cancelación de un CFDI con un ejemplo de como hacerlo.

Podemos consultar el estatus CFDI haciendo uso del siguiente parámetro:

Parámetro Tipo Requerido Detalles
UUID string Requerido Indica el UID o UUID del CFDI que deseas consultar.

Ejemplo:
55c0fdc67593d

Construcción de la URL para consultar estatus de CFDI 3.3:

Ejemplo de estatus de CFDI

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v4/cfdi33/uid/cancel_status");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v4/cfdi33/616d946410050/cancel_status',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/cfdi33/616d946410050/cancel_status"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/cfdi33/616d946410050/cancel_status")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v4/cfdi33/uid/cancel_status

Ejemplo: https://factura.com/api/v4/cfdi33/c55df8b4-37b3-47cf-9e35-efdb4c3261b4/cancel_status

Ejemplo: https://factura.com/api/v4/cfdi33/c55df8b4/cancel_status

Respuesta de estatus de CFDI 3.3

Estatus vigente cancelable

{
    "response": "success",
    "data": {
        "CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
        "Estado": "Vigente",
        "EsCancelable": "Cancelable sin aceptación",
        "EstatusCancelacion": []
    }
}

Estatus cancelado

{
    "response": "success",
    "data": {
        "CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
        "Estado": "Cancelado",
        "EsCancelable": "Cancelable sin aceptación",
        "EstatusCancelacion": "Cancelado sin aceptación"
    }
}

Estatus vigente no cancelable

{
    "response": "success",
    "data": {
        "CodigoEstatus": "S - Comprobante obtenido satisfactoriamente.",
        "Estado": "Vigente",
        "EsCancelable": "No Cancelable",
        "EstatusCancelacion": []
    }
}

CFDI de retenciones e información de pagos

Complementos de pago para CFDI de retenciones

A continuacion se explica como crear un CFDI de retenciones e informacion de pagos, con un ejemplo y muestra de posibles respuestas obtenidas:

Nombres de los campos

Para un llenado más fácil de los campos se deben utilizar los mismos nombres de los nodos y atributos del estándar del SAT respetando mayusculas y minúsculas.

Ademas se incluyen algunos campos especiales que facturacom utiliza para el manejo interno de la cuenta.

Podemos crear un CFDI de retenciones haciendo uso de los siguientes parametros:

Nombre Tipo Descendiente Notas
Version Atributo :no_entry:

Opcional


En caso de enviarse, solo puede contener el valor “1.0”.

CveRetenc Atributo :no_entry:

Obligatorio


El valor deberá corresponder con alguno de los tipos de retención del cátalogo del SAT.

DescRetenc :no_entry:

Si el atributo CveRetenc es igual a “25” este campo será obligatorio, de lo contrario no debe enviarse.

FechaFromAPI :no_entry:

Opcional

Si este campo no se envía, se tomará la fecha actual de la zona horaria correspondiente a tu código postal como fecha de expedición del CFDI.

En caso de enviarse, el formato debe ser en ISO 8601 , ejemplo: “2021-10-27T13:32:12-05:00”

Nótese que la ultima parte de la fecha “-05:00” corresponde al huso horario donde se intente timbrar.

Emisor :no_entry: Opcional
CURPE Emisor Opcional
Receptor :no_entry: Obligatorio
UID Receptor

Obligatorio

Este valor deberá corresponder con alguno de la lista de catalogo de clientes registrados.

Nacionalidad Receptor

Si el cliente correspondiente al UID enviado tiene el país de residencia registrado, entonces se podrá calcular su nacionalidad automáticamente, por lo que enviar este campo puede ser opcional, de lo contrarió sería obligatorio.

De cualquier forma, si desea enviar un valor, este se utilizará en primer lugar.
Los valores permitidos son “Nacional” o “Extranjero”

Nacional Receptor

Si el valor de la Nacionalidad es “Extranjero” este campo no debe mandarse.

Este nodo será creado automáticamente si el cliente correspondiente al UID enviado tiene el país de residencia como México, a menos que envíe el valor “Extranjero” como “Nacionalidad”.

RFCRecep Nacional

El RFC será tomado automáticamente de su cliente por medio del UID, por lo que este campo puede ser opcional.

Si desea utilizar otro diferente, puede enviarlo y se usará esa en primer lugar.

Nota: Enviar este valor no actualizará su catalogo, el valor solo será utilizado para este CFDI.

NomDenRazSocR Nacional

La razón social será tomada automáticamente de su cliente por medio del UID, por lo que este campo puede ser opcional.

Si desea utilizar otra diferente, puede enviarla y se usará esa en primer lugar.

Nota: Enviar este valor no actualizará su catalogo, el valor solo será utilizado para este CFDI.

CURPR Nacional Opcional
Extranjero Receptor

Si el valor de la Nacionalidad es “Nacional” este campo no debe mandarse.

Este campo será creado automáticamente si el cliente correspondiente al UID enviado tiene el país de residencia diferente de México, a menos que envíe el valor “Nacional” como “Nacionalidad”.

NumRegIdTrib Extranjero

El número de registro tributario será tomado automáticamente de su cliente por medio del UID, por lo que este campo puede ser opcional.

Si desea utilizar otro diferente, puede enviarlo y se usará esa en primer lugar.


Nota: Enviar este valor no actualizará su catalogo, el valor solo será utilizado para este CFDI.

NomDenRazSocR Extranjero

La razón social será tomada automáticamente de su cliente por medio del UID, por lo que este campo puede ser opcional.

Si desea utilizar otra diferente, puede enviarla y se usará esa en primer lugar.

Nota: Enviar este valor no actualizará su catalogo, el valor solo será utilizado para este CFDI.

Periodo Nodo :no_entry: Obligatorio
MesIni Atributo Periodo Obligatorio
MesFin Atributo Periodo Obligatorio
Ejerc Atributo Periodo

Obligatorio

Valores permitidos: Cualquier año entre 2004 y 2024

Totales Nodo :no_entry: Obligatorio
montoTotOperacion Atributo Totales

Obligatorio

6 decimales como maximo

montoTotGrav Atributo Totales Obligatorio

6 decimales como maximo

montoTotExent Atributo Totales Obligatorio

6 decimales como maximo

montoTotRet Atributo Totales Obligatorio

6 decimales como maximo

ImpRetenidos Nodo Totales Obligatorio

6 decimales como maximo

BaseRet Atributo ImpRetenidos Opcional

6 decimales como maximo

Impuesto Atributo ImpRetenidos Opcional

Debe contener un valor del catalogo del SAT

montoRet Atributo ImpRetenidos Obligatorio

6 decimales como maximo

TipoPagoRet Atributo ImpRetenidos Obligatorio

Solo se permiten dos valores: “Pago definitivo” o “Pago provisional”

Estructura general

Estructura del JSON

{
  "CveRetenc": "25",
  "DescRetenc": "Descripcion de la retención",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "60a2e225662ae"
  },
  "Periodo": {
    "MesIni": "1",
    "MesFin": "4",
    "Ejerc": "2020"
  },
  "Totales": {
    "montoTotOperacion": "100",
    "montoTotGrav": "100",
    "montoTotExent": "200",
    "montoTotRet": "324",
    "ImpRetenidos": [
      {
        "BaseRet": "14",
        "Impuesto": "03",
        "montoRet": "2434234",
        "TipoPagoRet": "Pago provisional"
      },
      {
        "BaseRet": "234",
        "Impuesto": "01",
        "montoRet": "4",
        "TipoPagoRet": "Pago definitivo"
      }
    ]
  }
}

Reglas y excepciones

Los diferentes valores que pueden aceptar cada uno de los atributos de los nodos están definidos por el estándar de manera fija a través de expresiones regulares.

Series y folios de retenciones

Debido a que este tipo de CFDI NO utiliza como tal una serie, el sistema llevará el numero de folio consecutivo através de la serie exclusiva “RET”, por lo que no necesita indicar manualmente el numero de folio.

Construcción de la URL de retenciones

Ejemplo para CFDI de retenciones

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v3/cfdi33/retenciones',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
  "CveRetenc": "07",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "6169fc02637e1",
    "Nacionalidad": "Nacional",
    "Nacional": {
      "RFCRecep": "VSC990129I26",
      "NomDenRazSocR": "CONSUMIDOR DE PRUEBA",
      "CURPR": ""
    }
  },
  "Periodo": {
    "MesIni": "1",
    "MesFin": "4",
    "Ejerc": "2020"
  },
  "Totales": {
    "montoTotOperacion": "100",
    "montoTotGrav": "100",
    "montoTotExent": "200",
    "montoTotRet": "324",
    "ImpRetenidos": [
      {
        "BaseRet": "14",
        "Impuesto": "03",
        "montoRet": "2434234",
        "TipoPagoRet": "Pago provisional"
      },
      {
        "BaseRet": "234",
        "Impuesto": "01",
        "montoRet": "4",
        "TipoPagoRet": "Pago definitivo"
      }
    ]
  }
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: ',
    'F-Secret-Key: '
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v3/cfdi33/retenciones',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': '',
    'F-Secret-Key': ''
  },
  body: JSON.stringify({
    "CveRetenc": "07",
    "Emisor": {
      "CURPE": "OORB610222MZSRCL02"
    },
    "Receptor": {
      "UID": "6169fc02637e1",
      "Nacionalidad": "Nacional",
      "Nacional": {
        "RFCRecep": "VSC990129I26",
        "NomDenRazSocR": "CONSUMIDOR DE PRUEBA",
        "CURPR": ""
      }
    },
    "Periodo": {
      "MesIni": "1",
      "MesFin": "4",
      "Ejerc": "2020"
    },
    "Totales": {
      "montoTotOperacion": "100",
      "montoTotGrav": "100",
      "montoTotExent": "200",
      "montoTotRet": "324",
      "ImpRetenidos": [
        {
          "BaseRet": "14",
          "Impuesto": "03",
          "montoRet": "2434234",
          "TipoPagoRet": "Pago provisional"
        },
        {
          "BaseRet": "234",
          "Impuesto": "01",
          "montoRet": "4",
          "TipoPagoRet": "Pago definitivo"
        }
      ]
    }
  })

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

url = "http://devfactura.in/api/v3/cfdi33/retenciones"

payload = json.dumps({
  "CveRetenc": "07",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "6169fc02637e1",
    "Nacionalidad": "Nacional",
    "Nacional": {
      "RFCRecep": "VSC990129I26",
      "NomDenRazSocR": "CONSUMIDOR DE PRUEBA",
      "CURPR": ""
    }
  },
  "Periodo": {
    "MesIni": "1",
    "MesFin": "4",
    "Ejerc": "2020"
  },
  "Totales": {
    "montoTotOperacion": "100",
    "montoTotGrav": "100",
    "montoTotExent": "200",
    "montoTotRet": "324",
    "ImpRetenidos": [
      {
        "BaseRet": "14",
        "Impuesto": "03",
        "montoRet": "2434234",
        "TipoPagoRet": "Pago provisional"
      },
      {
        "BaseRet": "234",
        "Impuesto": "01",
        "montoRet": "4",
        "TipoPagoRet": "Pago definitivo"
      }
    ]
  }
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': '',
  'F-Secret-Key': ''
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/retenciones")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = ""
request["F-Secret-Key"] = ""
request.body = JSON.dump({
  "CveRetenc": "07",
  "Emisor": {
    "CURPE": "OORB610222MZSRCL02"
  },
  "Receptor": {
    "UID": "6169fc02637e1",
    "Nacionalidad": "Nacional",
    "Nacional": {
      "RFCRecep": "VSC990129I26",
      "NomDenRazSocR": "CONSUMIDOR DE PRUEBA",
      "CURPR": ""
    }
  },
  "Periodo": {
    "MesIni": "1",
    "MesFin": "4",
    "Ejerc": "2020"
  },
  "Totales": {
    "montoTotOperacion": "100",
    "montoTotGrav": "100",
    "montoTotExent": "200",
    "montoTotRet": "324",
    "ImpRetenidos": [
      {
        "BaseRet": "14",
        "Impuesto": "03",
        "montoRet": "2434234",
        "TipoPagoRet": "Pago provisional"
      },
      {
        "BaseRet": "234",
        "Impuesto": "01",
        "montoRet": "4",
        "TipoPagoRet": "Pago definitivo"
      }
    ]
  }
})

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

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/cfdi33/retenciones

Ejemplo: https://factura.com/api/v3/cfdi33/retenciones

 Metodo URL  Acción 
POST  /api/v3/cfdi33/retenciones  Crear CFDI
GET  /api/v3/cfdi33/retenciones/{uuid}/pdf Devuelve el PDF 
GET  /api/v3/cfdi33/retenciones/{uuid}/xml Devuelve el XML 
GET   /api/v3/cfdi33/retenciones/{uuid}/acuse

Devuelve el acuse de cancelación.

En caso de no estar cancelado el CFDI se cancela 

GET   /api/v3/cfdi33/retenciones/{uuid}/email Enviar CFDI al cliente 
GET   /api/v3/cfdi33/retenciones/{uuid}/cancel Cancelar CFDI 
GET   /api/v3/cfdi33/retenciones/{uuid}/re-cancel Forzar cancelacion del CFDI 
GET   /api/v3/cfdi33/retenciones/{uuid}/relacionado Devuelve la relación con otros CFDI 
GET   /api/v3/cfdi33/retenciones/{uuid}/cancel_status Devuelve el estatus de la cancelación del CFDI 
GET   /api/v3/cfdi33/retenciones/{uuid}/cancel_date Devuelve la fecha en la que se cancelo el CFDI 
GET   /api/v3/cfdi33/retenciones/{uuid}/acuse_cancelation Devuelve el acuse de cancelación únicamente 

Respuestas de CFDI de retenciones

Respuesta XML generado por CFDI de rentenciones

<?xml version="1.0" encoding="utf-8"?>
<retenciones:Retenciones xsi:schemaLocation="http://www.sat.gob.mx/esquemas/retencionpago/1 http://www.sat.gob.mx/esquemas/retencionpago/1/retencionpagov1.xsd http://www.sat.gob.mx/esquemas/retencionpago/1/catalogos http://www.sat.gob.mx/esquemas/retencionpago/1/catalogos/catRetenciones.xsd" xmlns:c_retenciones="http://www.sat.gob.mx/esquemas/retencionpago/1/catalogos" Version="1.0" FolioInt="90" Sello="AzM4zZeGjmQh1U4eyOnLjvVRYU4UVjrOLQIAMz4W1mEiaXQU+rHrHQej48gVph1+GhuGUmHXAtW/+X/xZtyRYpqzdTdEuxZNlq2tOjeN/hxu5JI6J1i8SNmRS0TTv3u+J66Yoal2/dOjKFZw0GHnj6yy7x9hh38rIvTJ25DvG7VAXWk2ywllY7z0L7WlTxqtA7WbXzrfDH3tPnqi78Ugbcb5G7zEBDBZ3+TGg4jMBdWFOo5A79mk8shj404LC0sWpm7vjlVqmuKpRXoE0Z5OZwMnsDOnyei7ekSqtH+pfFTBvitDMEAV6McxwboSrr17YEZMd6ju9zSbDfQcPaDRRw==" NumCert="30001000000400002330" Cert="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" FechaExp="2021-10-27T15:20:50-06:00" CveRetenc="25" DescRetenc="Descripcion de la retención" xmlns:retenciones="http://www.sat.gob.mx/esquemas/retencionpago/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <retenciones:Emisor RFCEmisor="XOJI740919U48" NomDenRazSocE="CRISTIAN" CURPE="OORB610222MZSRCL02" />
    <retenciones:Receptor Nacionalidad="Nacional">
        <retenciones:Nacional RFCRecep="VSC990129I26" NomDenRazSocR="CONSUMIDOR DE PRUEBA" />
    </retenciones:Receptor>
    <retenciones:Periodo MesIni="1" MesFin="4" Ejerc="2020" />
    <retenciones:Totales montoTotOperacion="100" montoTotGrav="100" montoTotExent="200" montoTotRet="324">
        <retenciones:ImpRetenidos BaseRet="14" Impuesto="03" montoRet="2434234" TipoPagoRet="Pago provisional" />
        <retenciones:ImpRetenidos BaseRet="234" Impuesto="01" montoRet="4" TipoPagoRet="Pago definitivo" />
    </retenciones:Totales>
    <retenciones:Complemento>
        <tfd:TimbreFiscalDigital xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigital.xsd" version="1.0" UUID="ac72584f-318f-4ccc-82b4-9d4fa3680d33" FechaTimbrado="2021-10-27T16:24:51" selloCFD="AzM4zZeGjmQh1U4eyOnLjvVRYU4UVjrOLQIAMz4W1mEiaXQU+rHrHQej48gVph1+GhuGUmHXAtW/+X/xZtyRYpqzdTdEuxZNlq2tOjeN/hxu5JI6J1i8SNmRS0TTv3u+J66Yoal2/dOjKFZw0GHnj6yy7x9hh38rIvTJ25DvG7VAXWk2ywllY7z0L7WlTxqtA7WbXzrfDH3tPnqi78Ugbcb5G7zEBDBZ3+TGg4jMBdWFOo5A79mk8shj404LC0sWpm7vjlVqmuKpRXoE0Z5OZwMnsDOnyei7ekSqtH+pfFTBvitDMEAV6McxwboSrr17YEZMd6ju9zSbDfQcPaDRRw==" noCertificadoSAT="20001000000300022323" selloSAT="YAlDwboFSW5UBtymeAyAaz/lh2LWaHIN+nySAr6G2DUhhxEa+Mq/vvH78//KBukRTFcpvpuLjdavo/RjJLyfDA0g5aJOJ0YeEDLp+iRolXRF2Hq9V0BxNu39xr7SOVyI5TptH7T2kLmBEZQdOyg6XV09ZXLhcsA3pOj1YgEzunjTvp4VLNmEvIIWOSd9uFyp6+kbYBbxQbWboWSTOyVvFHlW8KGrxpaKQvG7vpqGYRwCLT4BSVEzQDMNixBPr4mEnbXem+6GbFb0ZCkX3QTyJ3lCMb6h4c+CDq8Aiid+4wMJpXUujNt4UeWsLPD07HheTNawo86IUsyEJTXwlw2p2Q==" xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
    </retenciones:Complemento>
</retenciones:Retenciones>

Complementos

Complementos de pago

A continuación se explica como crear un complemento de pago, con un ejemplo y muestra de posibles respuestas obtenidas.

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

Parámetro Tipo Requerido Detalles
Receptor array Requerido Indica el UID del receptor/cliente previamente creado en factura.com.


Ver listado de atributos posibles para este nodo.

Ejemplo:
"Receptor": {
"ResidenciaFiscal": "",
"UID": "55c0fdc67593d"
}
TipoDocumento string Requerido Es necesario enviar la clave pago en este campo.

Ejemplo:
"TipoDocumento": "pago"
Conceptos array Requerido Es 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"
}
]
UsoCFDI string Requerido Indica siempre la clave P01 correspondiente a Por definir.

Ejemplo:
"UsoCFDI": "P01"
Serie number Requerido Indica id de la serie con la que deseas timbrar el documento.

Ésta debe estar dada de alta en tu panel de Factura.com 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
CfdiRelacionados array Opcional En caso que tu complemento sustituya a otro envía un arreglo con el/los UUID's con los que está relacionado.

Ver listado de atributos posibles para este nodo.

Ejemplo: "CfdiRelacionados": {
"TipoRelacion": "04",
"UUID": [
"29c98cb2-f72a-4cbe-a297-606da335e187",
"a96f6b9a-70aa-4f2d-bc5e-d54fb7371236"
]
}
Moneda string Requerido Se debe registrar siempre el valor "XXX".

Ejemplo:
"Moneda": "XXX"
NumOrder number Opcional Indica el número de orden o pedido.

Este dato es solo para control interno.

Ejemplo:
"NumOrder": "85abf36"
Fecha string Opcional Indica 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:
"Fecha": "2018/12/04"
EnviarCorreo bolean Opcional Indica 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"
Pagos Array Requerido Indica los datos del complemento de pago.

Ver lista de atributos requeridos para este nodo.

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ámetro Tipo Requerido Detalles
typeComplement string Requerido Indica el tipo de complemento, en este caso es pagos.

Ejemplo:
"typeComplement": "pagos"
FechaPago string Requerido Indica 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"
FormaDePagoP string Requerido Indica 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"
MonedaP string Requerido Indica la clave de la moneda del pago.

Ésta puedes consultarla en el Catálogo de monedas

Ejemplo:
"Moneda": "MXN"
TipoCambioP string Opcional Indica el tipo de cambio vigente al momento de recibir el pago.

Ejemplo:
"TipoCambio": "19.85"

Si la moneda es diferente a MXN el campo es requerido.
Monto Number Requerido Indica el importe del pago, éste debe ser mayor a 0.

Ejemplo:
"Monto": "1000.00"
NumOperacion string Opcional Indica el número de orden o pedido.

Este dato es solo para control interno.

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


Ejemplo:
"RfcEmisorCtaOrd": "BSM970519DU8"
NomBancoOrdExt string Opcional Si lo deseas, indica el nombre del banco de la cuenta ordenante.

Ejemplo:
"NomBancoOrdExt": "BANCO SANTANDER (MEXICO) S.A."
CtaOrdenante string Opcional Si 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"
RfcEmisorCtaBen string Opcional Si lo deseas, indica el RFC del banco de la cuenta de destino de la transferencia.


Ejemplo:
"RfcEmisorCtaOrd": "BNM840515VB1"
CtaBeneficiario string Opcional Si 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"
TipoCadPago string Opcional Indica la clave del tipo de cadena de pago.

Consulta las claves correspondientes a Forma de pago válidas.
Relacionados array Requerido Indica al menos un documento relacionado para tu complemento de pago.

Revisa los atributos que debe llevar este nodo.

Construcción de la URL de complemento de pago:

Ejemplo para crear complemento de pagos

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/cfdi33/complemento/pagos/create");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_POST, TRUE);

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
        "Receptor" => [
            "UID" => "55c0fdc675XXX"
        ],
        "TipoDocumento" => "pago",
        "UsoCFDI" => "P01",
        "Redondeo" => "2",
        "FormaPago" => "03",
        "MetodoPago" => "PUE",
        "Moneda" => "XXX",
        "Serie" => 1,
        "EnviarCorreo" => "true",
        "Conceptos" => [[
            "ClaveProdServ" => "84111506",
            "Cantidad" => "1",
            "ClaveUnidad" => "ACT",
            "Descripcion" => "Pago",
            "ValorUnitario" => "0",
            "Complemento" => [[
                "typeComplement" => "pagos",
                "FechaPago" => "2020-03-04T12:00:00",
                "FormaDePagoP" => "03",
                "MonedaP" => "MXN",
                "Monto" => "30000.00",
                "relacionados" => [
                    [
                        "IdDocumento" => "202d87c1-1b31-40ff-96fe-b8b05a1c1xxx",
                        "ImpSaldoAnt" => "30000.00",
                        "ImpPagado" => "30000.00",
                        "ImpSaldoInsoluto" => "0",
                        "MetodoDePagoDR" => "PUE",
                        "MonedaDR" => "MXN",
                        "TipoCambioDR": 0,
                        "NumParcialidad" => "1",
                        "Folio" => 1001,
                        "Serie" => "ABR",
                    ]
                ],
            ]]
        ]],
    ]));

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);

var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v3/cfdi33/complemento/pagos/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "6169fc02637e1"
    },
    "TipoDocumento": "pago",
    "UsoCFDI": "P01",
    "Redondeo": "2",
    "FormaPago": "03",
    "MetodoPago": "PUE",
    "Moneda": "XXX",
    "Serie": 17317,
    "EnviarCorreo": "true",
    "Conceptos": [
      {
        "ClaveProdServ": "84111506",
        "Cantidad": "1",
        "ClaveUnidad": "ACT",
        "Descripcion": "Pago",
        "ValorUnitario": "0",
        "Complemento": [
          {
            "typeComplement": "pagos",
            "FechaPago": "2020-03-04T12:00:00",
            "FormaDePagoP": "03",
            "MonedaP": "MXN",
            "Monto": "30000.00",
            "relacionados": [
              {
                "IdDocumento": "202d87c1-1b31-40ff-96fe-b8b05a1c1xxx",
                "ImpSaldoAnt": "30000.00",
                "ImpPagado": "30000.00",
                "ImpSaldoInsoluto": "0",
                "MetodoDePagoDR": "PUE",
                "MonedaDR": "MXN",
                "TipoCambioDR": 0,
                "NumParcialidad": "1",
                "Folio": 1001,
                "Serie": "ABR"
              }
            ]
          }
        ]
      }
    ]
  })

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

url = "http://devfactura.in/api/v3/cfdi33/complemento/pagos/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "pago",
  "UsoCFDI": "P01",
  "Redondeo": "2",
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "XXX",
  "Serie": 17317,
  "EnviarCorreo": "true",
  "Conceptos": [
    {
      "ClaveProdServ": "84111506",
      "Cantidad": "1",
      "ClaveUnidad": "ACT",
      "Descripcion": "Pago",
      "ValorUnitario": "0",
      "Complemento": [
        {
          "typeComplement": "pagos",
          "FechaPago": "2020-03-04T12:00:00",
          "FormaDePagoP": "03",
          "MonedaP": "MXN",
          "Monto": "30000.00",
          "relacionados": [
            {
              "IdDocumento": "202d87c1-1b31-40ff-96fe-b8b05a1c1xxx",
              "ImpSaldoAnt": "30000.00",
              "ImpPagado": "30000.00",
              "ImpSaldoInsoluto": "0",
              "MetodoDePagoDR": "PUE",
              "MonedaDR": "MXN",
              "TipoCambioDR": 0,
              "NumParcialidad": "1",
              "Folio": 1001,
              "Serie": "ABR"
            }
          ]
        }
      ]
    }
  ]
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
import requests
import json

url = "http://devfactura.in/api/v3/cfdi33/complemento/pagos/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "TipoDocumento": "pago",
  "UsoCFDI": "P01",
  "Redondeo": "2",
  "FormaPago": "03",
  "MetodoPago": "PUE",
  "Moneda": "XXX",
  "Serie": 17317,
  "EnviarCorreo": "true",
  "Conceptos": [
    {
      "ClaveProdServ": "84111506",
      "Cantidad": "1",
      "ClaveUnidad": "ACT",
      "Descripcion": "Pago",
      "ValorUnitario": "0",
      "Complemento": [
        {
          "typeComplement": "pagos",
          "FechaPago": "2020-03-04T12:00:00",
          "FormaDePagoP": "03",
          "MonedaP": "MXN",
          "Monto": "30000.00",
          "relacionados": [
            {
              "IdDocumento": "202d87c1-1b31-40ff-96fe-b8b05a1c1xxx",
              "ImpSaldoAnt": "30000.00",
              "ImpPagado": "30000.00",
              "ImpSaldoInsoluto": "0",
              "MetodoDePagoDR": "PUE",
              "MonedaDR": "MXN",
              "TipoCambioDR": 0,
              "NumParcialidad": "1",
              "Folio": 1001,
              "Serie": "ABR"
            }
          ]
        }
      ]
    }
  ]
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

Host: https://factura.com (producción) / http://devfactura.in (sandbox)

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

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

Respuestas del complemento de pago

Respuesta Exitosa

{
  "response": "success",
  "message": "Facturacreadayenviadasatisfactoriamente",
  "UUID": "11299a64-db3f-4dfd-8ccb-5013ba034fXX",
  "uid": "5c11578d2f71d",
  "SAT": {
    "UUID": "11299a64-db3f-4dfd-8ccb-5013ba034fXXX",
    "FechaTimbrado": "2018-12-12T12: 46: 40",
    "NoCertificadoSAT": "20001000000300022323",
    "Version": "1.1",
    "SelloSAT": "On\/VuLDaF13cXUnMV79lKkvaKMW4IGkTd7QvBK+G9c4hmsYGWRfAGfYfUoh2Ab2IhRhw6VSP2IJAij8Ad0oSThW5+FOWRVax6jX0SHXFUWC8IXN5xuK2t6qVqQ5iRZt8ZVjTovz6Q8nP09cGBB46ikwWb9W9LTALl+ZtF2K6fQ0NnNXJy8a+GeMTKe\/UpVnoPoLC179gkHTJZCJzYGUCcOlccSCE5Bxz6MzJQxGTGqmJi9vNuEpcH2tYwO9VzSOXL4foPt+oa5Jqc5r4c++gah97+1+NGuMUvaQX6kMq8PFUq5YXKo83sO2Flj54Ux68XsCLDv3Twc1h1FI4yCVXXXX==",
    "SelloCFD": "X5rm9\/shEu3u6oNT0TOdjOMfKD3kob9RBoB+FdHcD3wQhCp4ksA\/YtgwW+dTF10ezyxsEQnc6V9XteNRe4sHyzUcedERUh1XWp+JTM247Rg2NHrGBecAYHPOFgB218ERSrCavaD949uPBR1GamXnNAdkL5YLxgbfjPLfMzE6sli0NdgsBuCES2hrvsU9FA0wLTenTP6c6B7kZd7kGVbKBRFixkB+MYvWtML1D2WK+XXXXX+IviFoJtSTd3OAFEBspy90t779l8Tgk4J+zs2Ug=="
  },
  "INV": {
    "Serie": "PA",
    "Folio": 71
  },
  "invoice_uid": "5c11578d2f7XX"
}

Respuesta Erronea

{
  "response": "error",
  "message": {
    "message": "401 - El rango de la fecha de generaci\u00f3n no debe de ser mayor a 72 horas para la emisi\u00f3n del timbre.",
    "messageDetail": "Comprobante.Fecha: Fecha de emisi\u00f3n: 2018-05-16T13:04:20 Fecha del Servidor: 2018-12-12T13:02:24 La fecha de emision no se encuentra en el rango permitido: 2018-12-09T13:02:24 - 2018-12-12T14:07:24",
    "data": null,
    "status": "error"
  },
  "xmlerror": "\n<\/cfdi:Conceptos><\/pago10:Pago><\/pago10:Pagos><\/cfdi:Complemento><\/cfdi:Comprobante>\n"
}

Relacionados

Ejemplo de relacionados .json

"relacionados":[
    {
    "IdDocumento" : "54feddcf-af15-4715-8a1f-80a122d1db54",
        "ImpPagado" :   "1000",
        "ImpSaldoAnt" : "1000",
        "ImpSaldoInsoluto" : "0",
        "MetodoDePagoDR":   "PPD",
        "MonedaDR": "MXN",
        "NumParcialidad":   "5",
        "TipoCambioDR": "19.25",
        "Serie":    "ABR"
    "Folio": 1001
  }
]

A continuación se describen los atributos que deben incluirse en el nodo Relacionados dentro del nodo Complemento.

El nodo relacionados se conforma de un arreglo de objetos, cada uno de éstos con los siguientes atributos:

Parámetro Tipo Requerido Detalles
IdDocumento string Requerido Indica el folio fiscal del CFDI al que quieras agregarle un pago.


Ejemplo:
"IdDocumento": "54feddcf-af15-4715-8a1f-80a122d1db54"
MonedaDR decimal Requerido Indica la clave de la moneda indicada en el CFDI al que deseas agregarle el pago.

Ejemplo:
"MonedaDR" : "MXN"
TipoCambioDR decimal Requerido Indica el tipo de cambio si es que la moneda del CFDI es diferente de MXN.

Ejemplo:
"TipoCambioDR": "19.25"
MetodoDePagoDR string Requerido Indica la clave correspondiente al método de pago, Éste siempre debe ser PPD.

Ejemplo:
"MetodoDePagoDR" : "PPD"
NumParcialidad string Requerido Indica el número de pago o abono que corresponde. En caso de ser el primer pago poner 1.

Ejemplo:
"NumParcialidad" : "5"
ImpSaldoAnt Number 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" : "1000"
ImpPagado Number Requerido Indica el importe del abono que se está haciendo actualmente al CFDI.

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

Ejemplo:
"ImpSaldoInsoluto" : "0"
Folio Number Opcional Indica el folio del documento que estás relacionando.

Ejemplo:
"Folio": 1001
Serie String Opcional  Indica la serie del documento que estás relacionando.

Ejemplo:
"Serie": ABR

CFDIs relacionados a complemento de pago

Ejemplo de CFDI relacionado

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

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:

El nodo de CfdiRelacionados se conforma de los siguientes atributos:

Parámetro Tipo Requerido Detalles
TipoRelacion string Requerido Indicar la clave del tipo de relación correspondiente.

Revisar el listado de claves proporcionado por el SAT.

Ejemplo:
"TipoRelacion": "04"
UUID Array Requerido Indicar 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"
]

Carta porte v1.0

Ejemplo de CFDI de ingreso

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v3/cfdi33/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": "6169fc02637e1"
    },
    "UsoCFDI": "P01",
    "Serie": "17317",
    "Moneda": "MXN",
    "EnviarCorreo": false,
    "FormaPago" : "01",
    "MetodoPago" : "PUE",
    "TipoDocumento": "factura",
    "Conceptos": [
        {
            "ClaveProdServ": "78101802",
            "NoIdentificacion": "01",
            "Cantidad": 1,
            "ClaveUnidad": "E48",
            "Unidad": "SERVICIO",
            "Descripcion": "FLETE",
            "ValorUnitario": "25000.00",
            "Importe": "25000.00",
            "Impuestos": {
                "Traslados": [
                    {
                        "Base": "25000.00",
                        "Impuesto": "002",
                        "TipoFactor": "Tasa",
                        "TasaOCuota": "0.160000",
                        "Importe": "4000.00"
                    }
                ],
                "Retenidos": [
                    {
                        "Base": "25000.00",
                        "Impuesto": "002",
                        "TipoFactor": "Tasa",
                        "TasaOCuota": "0.040000",
                        "Importe": "1000.00"
                    }
                ]
            }
        }
    ],
    "CartaPorte": {
        "Version": "1.0",
        "TranspInternac": "No",
        "TotalDistRec": "1",
        "FiguraTransporte": {
            "Operadores": [{
                "Operador" : [{
                    "Domicilio": {
                        "Calle": "calle pedro",
                        "NumeroInterior": "123",
                        "Colonia": "0347",
                        "Localidad": "23",
                        "Municipio": "004",
                        "Estado": "COA",
                        "Pais": "MEX",
                        "CodigoPostal": "25350"
                    },
                    "RFCOperador": "VAAM130719H60",
                    "NumLicencia": "a234567890",
                    "NombreOperador": "perdo pedro"
                }]
            }],
            "CveTransporte": "01"
        },
        "Mercancias": { 
            "Mercancia": [{
                "PesoEnKg": 1.0,
                "Cantidad": 1.0,
                "BienesTransp": "12164501",
                "ClaveUnidad":"TNE"
            }],
            "AutotransporteFederal": {
                "IdentificacionVehicular": {
                    "ConfigVehicular": "C2",
                    "PlacaVM": "plac892",
                    "AnioModeloVM": 2020
                },
                "PermSCT": "TPAF20",
                "NumPermisoSCT": "NumPermisoSCT",
                "NombreAseg": "NombreAseg",
                "NumPolizaSeguro": "NumPolizaSeguro"
            },
            "NumTotalMercancias": 1
        },
        "Ubicaciones": {
            "Ubicacion" : [{
                "Origen": {
                    "FechaHoraSalida": "2021-06-23T00:00:00"
                },
                "Domicilio": {
                    "Calle": "calle",
                    "NumeroExterior": "211",
                    "Localidad": "23",
                    "Referencia": "casa blanca",
                    "Municipio": "004",
                    "Estado": "COA",
                    "Colonia": "0347",
                    "Pais": "MEX",
                    "CodigoPostal": "25350"
                }
            },
            {
                "Destino": {
                    "NombreDestinatario": "nombre destinatario",
                    "FechaHoraProgLlegada": "2021-06-23T00:00:00",
                    "DistanciaRecorrida":"1"
                },
                "Domicilio": {
                    "Calle": "calle",
                    "NumeroExterior": "211",
                    "Colonia": "002",
                    "Localidad": "0002",
                    "Referencia": "casa blanca",
                    "Municipio": "000005",
                    "Estado": "ZAC",
                    "Pais": "ARG",
                    "CodigoPostal": "99056"
                },
                "DistanciaRecorrida": 1
            }]
        }
    }
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: ',
    'F-Secret-Key: '
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v3/cfdi33/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': '',
    'F-Secret-Key': ''
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "6169fc02637e1"
    },
    "UsoCFDI": "P01",
    "Serie": "17317",
    "Moneda": "MXN",
    "EnviarCorreo": false,
    "FormaPago": "01",
    "MetodoPago": "PUE",
    "TipoDocumento": "factura",
    "Conceptos": [
      {
        "ClaveProdServ": "78101802",
        "NoIdentificacion": "01",
        "Cantidad": 1,
        "ClaveUnidad": "E48",
        "Unidad": "SERVICIO",
        "Descripcion": "FLETE",
        "ValorUnitario": "25000.00",
        "Importe": "25000.00",
        "Impuestos": {
          "Traslados": [
            {
              "Base": "25000.00",
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.160000",
              "Importe": "4000.00"
            }
          ],
          "Retenidos": [
            {
              "Base": "25000.00",
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.040000",
              "Importe": "1000.00"
            }
          ]
        }
      }
    ],
    "CartaPorte": {
      "Version": "1.0",
      "TranspInternac": "No",
      "TotalDistRec": "1",
      "FiguraTransporte": {
        "Operadores": [
          {
            "Operador": [
              {
                "Domicilio": {
                  "Calle": "calle pedro",
                  "NumeroInterior": "123",
                  "Colonia": "0347",
                  "Localidad": "23",
                  "Municipio": "004",
                  "Estado": "COA",
                  "Pais": "MEX",
                  "CodigoPostal": "25350"
                },
                "RFCOperador": "VAAM130719H60",
                "NumLicencia": "a234567890",
                "NombreOperador": "perdo pedro"
              }
            ]
          }
        ],
        "CveTransporte": "01"
      },
      "Mercancias": {
        "Mercancia": [
          {
            "PesoEnKg": 1,
            "Cantidad": 1,
            "BienesTransp": "12164501",
            "ClaveUnidad": "TNE"
          }
        ],
        "AutotransporteFederal": {
          "IdentificacionVehicular": {
            "ConfigVehicular": "C2",
            "PlacaVM": "plac892",
            "AnioModeloVM": 2020
          },
          "PermSCT": "TPAF20",
          "NumPermisoSCT": "NumPermisoSCT",
          "NombreAseg": "NombreAseg",
          "NumPolizaSeguro": "NumPolizaSeguro"
        },
        "NumTotalMercancias": 1
      },
      "Ubicaciones": {
        "Ubicacion": [
          {
            "Origen": {
              "FechaHoraSalida": "2021-06-23T00:00:00"
            },
            "Domicilio": {
              "Calle": "calle",
              "NumeroExterior": "211",
              "Localidad": "23",
              "Referencia": "casa blanca",
              "Municipio": "004",
              "Estado": "COA",
              "Colonia": "0347",
              "Pais": "MEX",
              "CodigoPostal": "25350"
            }
          },
          {
            "Destino": {
              "NombreDestinatario": "nombre destinatario",
              "FechaHoraProgLlegada": "2021-06-23T00:00:00",
              "DistanciaRecorrida": "1"
            },
            "Domicilio": {
              "Calle": "calle",
              "NumeroExterior": "211",
              "Colonia": "002",
              "Localidad": "0002",
              "Referencia": "casa blanca",
              "Municipio": "000005",
              "Estado": "ZAC",
              "Pais": "ARG",
              "CodigoPostal": "99056"
            },
            "DistanciaRecorrida": 1
          }
        ]
      }
    }
  })

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

url = "http://devfactura.in/api/v3/cfdi33/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "UsoCFDI": "P01",
  "Serie": "17317",
  "Moneda": "MXN",
  "EnviarCorreo": False,
  "FormaPago": "01",
  "MetodoPago": "PUE",
  "TipoDocumento": "factura",
  "Conceptos": [
    {
      "ClaveProdServ": "78101802",
      "NoIdentificacion": "01",
      "Cantidad": 1,
      "ClaveUnidad": "E48",
      "Unidad": "SERVICIO",
      "Descripcion": "FLETE",
      "ValorUnitario": "25000.00",
      "Importe": "25000.00",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "25000.00",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.160000",
            "Importe": "4000.00"
          }
        ],
        "Retenidos": [
          {
            "Base": "25000.00",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.040000",
            "Importe": "1000.00"
          }
        ]
      }
    }
  ],
  "CartaPorte": {
    "Version": "1.0",
    "TranspInternac": "No",
    "TotalDistRec": "1",
    "FiguraTransporte": {
      "Operadores": [
        {
          "Operador": [
            {
              "Domicilio": {
                "Calle": "calle pedro",
                "NumeroInterior": "123",
                "Colonia": "0347",
                "Localidad": "23",
                "Municipio": "004",
                "Estado": "COA",
                "Pais": "MEX",
                "CodigoPostal": "25350"
              },
              "RFCOperador": "VAAM130719H60",
              "NumLicencia": "a234567890",
              "NombreOperador": "perdo pedro"
            }
          ]
        }
      ],
      "CveTransporte": "01"
    },
    "Mercancias": {
      "Mercancia": [
        {
          "PesoEnKg": 1,
          "Cantidad": 1,
          "BienesTransp": "12164501",
          "ClaveUnidad": "TNE"
        }
      ],
      "AutotransporteFederal": {
        "IdentificacionVehicular": {
          "ConfigVehicular": "C2",
          "PlacaVM": "plac892",
          "AnioModeloVM": 2020
        },
        "PermSCT": "TPAF20",
        "NumPermisoSCT": "NumPermisoSCT",
        "NombreAseg": "NombreAseg",
        "NumPolizaSeguro": "NumPolizaSeguro"
      },
      "NumTotalMercancias": 1
    },
    "Ubicaciones": {
      "Ubicacion": [
        {
          "Origen": {
            "FechaHoraSalida": "2021-06-23T00:00:00"
          },
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Localidad": "23",
            "Referencia": "casa blanca",
            "Municipio": "004",
            "Estado": "COA",
            "Colonia": "0347",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        },
        {
          "Destino": {
            "NombreDestinatario": "nombre destinatario",
            "FechaHoraProgLlegada": "2021-06-23T00:00:00",
            "DistanciaRecorrida": "1"
          },
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "002",
            "Localidad": "0002",
            "Referencia": "casa blanca",
            "Municipio": "000005",
            "Estado": "ZAC",
            "Pais": "ARG",
            "CodigoPostal": "99056"
          },
          "DistanciaRecorrida": 1
        }
      ]
    }
  }
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': '',
  'F-Secret-Key': ''
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/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"] = ""
request["F-Secret-Key"] = ""
request.body = JSON.dump({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "UsoCFDI": "P01",
  "Serie": "17317",
  "Moneda": "MXN",
  "EnviarCorreo": false,
  "FormaPago": "01",
  "MetodoPago": "PUE",
  "TipoDocumento": "factura",
  "Conceptos": [
    {
      "ClaveProdServ": "78101802",
      "NoIdentificacion": "01",
      "Cantidad": 1,
      "ClaveUnidad": "E48",
      "Unidad": "SERVICIO",
      "Descripcion": "FLETE",
      "ValorUnitario": "25000.00",
      "Importe": "25000.00",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "25000.00",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.160000",
            "Importe": "4000.00"
          }
        ],
        "Retenidos": [
          {
            "Base": "25000.00",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.040000",
            "Importe": "1000.00"
          }
        ]
      }
    }
  ],
  "CartaPorte": {
    "Version": "1.0",
    "TranspInternac": "No",
    "TotalDistRec": "1",
    "FiguraTransporte": {
      "Operadores": [
        {
          "Operador": [
            {
              "Domicilio": {
                "Calle": "calle pedro",
                "NumeroInterior": "123",
                "Colonia": "0347",
                "Localidad": "23",
                "Municipio": "004",
                "Estado": "COA",
                "Pais": "MEX",
                "CodigoPostal": "25350"
              },
              "RFCOperador": "VAAM130719H60",
              "NumLicencia": "a234567890",
              "NombreOperador": "perdo pedro"
            }
          ]
        }
      ],
      "CveTransporte": "01"
    },
    "Mercancias": {
      "Mercancia": [
        {
          "PesoEnKg": 1,
          "Cantidad": 1,
          "BienesTransp": "12164501",
          "ClaveUnidad": "TNE"
        }
      ],
      "AutotransporteFederal": {
        "IdentificacionVehicular": {
          "ConfigVehicular": "C2",
          "PlacaVM": "plac892",
          "AnioModeloVM": 2020
        },
        "PermSCT": "TPAF20",
        "NumPermisoSCT": "NumPermisoSCT",
        "NombreAseg": "NombreAseg",
        "NumPolizaSeguro": "NumPolizaSeguro"
      },
      "NumTotalMercancias": 1
    },
    "Ubicaciones": {
      "Ubicacion": [
        {
          "Origen": {
            "FechaHoraSalida": "2021-06-23T00:00:00"
          },
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Localidad": "23",
            "Referencia": "casa blanca",
            "Municipio": "004",
            "Estado": "COA",
            "Colonia": "0347",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        },
        {
          "Destino": {
            "NombreDestinatario": "nombre destinatario",
            "FechaHoraProgLlegada": "2021-06-23T00:00:00",
            "DistanciaRecorrida": "1"
          },
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "002",
            "Localidad": "0002",
            "Referencia": "casa blanca",
            "Municipio": "000005",
            "Estado": "ZAC",
            "Pais": "ARG",
            "CodigoPostal": "99056"
          },
          "DistanciaRecorrida": 1
        }
      ]
    }
  }
})

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

Documentación de Carta Porte v2.0

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

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

CartaPorte

Ubicaciones (CartaPorte → Ubicaciones)

Ubicacion (CartaPorte → Ubicaciones → Ubicacion)

Origen (CartaPorte → Ubicaciones → Ubicacion → Origen)

Destino (CartaPorte → Ubicaciones → Ubicacion → Destino)

Domicilio (CartaPorte → Ubicaciones → Ubicacion → Domicilio)

Mercancias (CartaPorte → Mercancias)

Mercancia (CartaPorte → Mercancias → Mercancia)

CantidadTransporta (CartaPorte → Mercancias → Mercancia → CantidadTransporta)

DetalleMercancia (CartaPorte → Mercancias → Mercancia → DetalleMercancia)

AutotransporteFederal (CartaPorte → Mercancias → AutotransporteFederal)

IdentificacionVehicular (CartaPorte → Mercancias → AutotransporteFederal → IdentificacionVehicular)

Remolque (CartaPorte → Mercancias → AutotransporteFederal → Remolques → Remolque)

TransporteMaritimo (CartaPorte → Mercancias → TransporteMaritimo)

Contenedor (CartaPorte → Mercancias → TransporteMaritimo → Contenedor)

TransporteAereo (CartaPorte → Mercancias → TransporteAereo)

TransporteFerroviario (CartaPorte → Mercancias → TransporteFerroviario)

DerechosDePaso (CartaPorte → Mercancias → TransporteFerroviario → DerechosDePaso)

Carro (CartaPorte → Mercancias → TransporteFerroviario → Carro)

Contenedor (CartaPorte → Mercancias → TransporteFerroviario → Carro → Contenedor)

FiguraTransporte (CartaPorte → FiguraTransporte)

Operadores (CartaPorte → FiguraTransporte → Operadores)

Operador (CartaPorte → FiguraTransporte → Operadores → Operador)

Domicilio (CartaPorte → FiguraTransporte → Operadores → Operador → Domicilio)

Propietario (CartaPorte → FiguraTransporte → Propietario)

Domicilio (CartaPorte → FiguraTransporte → Propietario → Domicilio)

Arrendatario (CartaPorte → FiguraTransporte → Arrendatario)

Domicilio (CartaPorte → FiguraTransporte → Arrendatario → Domicilio)

Notificado (CartaPorte → FiguraTransporte → Notificado)

Domicilio (CartaPorte → FiguraTransporte → Notificado → Domicilio)

Carta porte v2.0

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

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

CartaPorte

Ubicaciones (CartaPorte → Ubicaciones)

Ubicacion (CartaPorte → Ubicaciones → Ubicacion)

Domicilio (CartaPorte → Ubicaciones → Ubicacion → Domicilio)

Mercancias (CartaPorte → Mercancias)

Mercancia (CartaPorte → Mercancias → Mercancia)

Pedimentos (CartaPorte → Mercancias → Mercancia → Pedimentos)

GuiasIdentificacion (CartaPorte → Mercancias → Mercancia → GuiasIdentificacion)

CantidadTransporta (CartaPorte → Mercancias → Mercancia → CantidadTransporta)

DetalleMercancia (CartaPorte → Mercancias → Mercancia → DetalleMercancia)

Autotransporte (CartaPorte → Mercancias → Autotransporte)

IdentificacionVehicular (CartaPorte → Mercancias → Autotransporte → IdentificacionVehicular)

Seguros (CartaPorte → Mercancias → Autotransporte → Seguros)

Remolque (CartaPorte → Mercancias → Autotransporte → Remolques → Remolque)

TransporteMaritimo (CartaPorte → Mercancias → TransporteMaritimo)

Contenedor (CartaPorte → Mercancias → TransporteMaritimo → Contenedor)

TransporteAereo (CartaPorte → Mercancias → TransporteAereo)

TransporteFerroviario (CartaPorte → Mercancias → TransporteFerroviario)

DerechosDePaso (CartaPorte → Mercancias → TransporteFerroviario → DerechosDePaso)

Carro (CartaPorte → Mercancias → TransporteFerroviario → Carro)

Contenedor (CartaPorte → Mercancias → TransporteFerroviario → Carro → Contenedor)

FiguraTransporte (CartaPorte → FiguraTransporte)

TiposFigura (CartaPorte → FiguraTransporte → TiposFigura)

PartesTransporte (CartaPorte → FiguraTransporte → TiposFigura → PartesTransporte)

*ParteTransporte

Domicilio (CartaPorte → FiguraTransporte → TiposFigura → Domicilio)

Clave Tipo de CFDI
factura Ingreso (Factura)
carta_porte Traslado (Carta Porte)

CFDI de Ingreso

Ejemplo de CFDI de ingreso

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v3/cfdi33/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": "6169fc02637e1"
    },
    "UsoCFDI": "P01",
    "Serie": "17317",
    "Moneda": "MXN",
    "EnviarCorreo": "",
    "FormaPago": "02",
    "MetodoPago": "PPD",
    "TipoDocumento": "factura",
    "Conceptos": [
      {
        "ClaveProdServ": "78101800",
        "NoIdentificacion": "1",
        "Cantidad": "1",
        "ClaveUnidad": "E48",
        "Unidad": "Unidad de servicio",
        "Descripcion": "Fletes",
        "ValorUnitario": "21",
        "Importe": "21",
        "Impuestos": {
          "Traslados": [
            {
              "Base": "21",
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.160000",
              "Importe": "3.36"
            }
          ],
          "Retenidos": [
            {
              "Base": "21",
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.040000",
              "Importe": "0.84"
            }
          ]
        }
      }
    ],
    "CartaPorte": {
      "Version": "2.0",
      "TranspInternac": "No",
      "TotalDistRec": "200",
      "FiguraTransporte": {
        "TiposFigura": [
          {
            "NumLicencia": "12345678",
            "RFCFigura": "LAN8507268IA",
            "TipoFigura": "01"
          }
        ]
      },
      "Mercancias": {
        "NumTotalMercancias": "1",
        "PesoBrutoTotal": "120.5",
        "UnidadPeso": "KGM",
        "Mercancia": [
          {
            "BienesTransp": "10151601",
            "Cantidad": "1",
            "ClaveUnidad": "H87",
            "Descripcion": "Semillas de trigo",
            "Moneda": "MXN",
            "PesoEnKg": "120.5",
            "ValorMercancia": "100000",
            "CantidadTransporta": [
              {
                "Cantidad": "1",
                "IDDestino": "DE123456",
                "IDOrigen": "OR123456"
              }
            ]
          }
        ],
        "Autotransporte": {
          "NumPermisoSCT": "97866767",
          "PermSCT": "TPAF01",
          "IdentificacionVehicular": {
            "AnioModeloVM": "2021",
            "ConfigVehicular": "T3S2R3",
            "PlacaVM": "554LD1"
          },
          "Seguros": {
            "AseguraRespCivil": "Seguros Alex",
            "PolizaRespCivil": "123456789",
            "AseguraCarga": "Seguros Alez",
            "AseguraMedAmbiente": "Seguros ambientales Alex",
            "PolizaMedAmbiente": "123456789"
          },
          "Remolques": {
            "Remolque": [
              {
                "Placa": "acb1233",
                "SubTipoRem": "CTR001"
              }
            ]
          }
        }
      },
      "Ubicaciones": {
        "Ubicacion": [
          {
            "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
            "IDUbicacion": "OR123456",
            "RFCRemitenteDestinatario": "XIA190128J61",
            "TipoUbicacion": "Origen",
            "Domicilio": {
              "Calle": "calle",
              "NumeroExterior": "211",
              "Colonia": "0347",
              "Localidad": "23",
              "Municipio": "004",
              "Estado": "COA",
              "Pais": "MEX",
              "CodigoPostal": "25350"
            }
          },
          {
            "DistanciaRecorrida": "200",
            "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
            "IDUbicacion": "DE123456",
            "RFCRemitenteDestinatario": "PZA000413788",
            "TipoUbicacion": "Destino",
            "Domicilio": {
              "Calle": "calle",
              "NumeroExterior": "211",
              "Colonia": "0347",
              "Localidad": "23",
              "Municipio": "004",
              "Estado": "COA",
              "Pais": "MEX",
              "CodigoPostal": "25350"
            }
          }
        ]
      }
    }
  }',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: API.Key',
    'F-Secret-Key: Secret.Key'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v3/cfdi33/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "6169fc02637e1"
    },
    "UsoCFDI": "P01",
    "Serie": "17317",
    "Moneda": "MXN",
    "EnviarCorreo": "",
    "FormaPago": "02",
    "MetodoPago": "PPD",
    "TipoDocumento": "factura",
    "Conceptos": [
      {
        "ClaveProdServ": "78101800",
        "NoIdentificacion": "1",
        "Cantidad": "1",
        "ClaveUnidad": "E48",
        "Unidad": "Unidad de servicio",
        "Descripcion": "Fletes",
        "ValorUnitario": "21",
        "Importe": "21",
        "Impuestos": {
          "Traslados": [
            {
              "Base": "21",
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.160000",
              "Importe": "3.36"
            }
          ],
          "Retenidos": [
            {
              "Base": "21",
              "Impuesto": "002",
              "TipoFactor": "Tasa",
              "TasaOCuota": "0.040000",
              "Importe": "0.84"
            }
          ]
        }
      }
    ],
    "CartaPorte": {
      "Version": "2.0",
      "TranspInternac": "No",
      "TotalDistRec": "200",
      "FiguraTransporte": {
        "TiposFigura": [
          {
            "NumLicencia": "12345678",
            "RFCFigura": "LAN8507268IA",
            "TipoFigura": "01"
          }
        ]
      },
      "Mercancias": {
        "NumTotalMercancias": "1",
        "PesoBrutoTotal": "120.5",
        "UnidadPeso": "KGM",
        "Mercancia": [
          {
            "BienesTransp": "10151601",
            "Cantidad": "1",
            "ClaveUnidad": "H87",
            "Descripcion": "Semillas de trigo",
            "Moneda": "MXN",
            "PesoEnKg": "120.5",
            "ValorMercancia": "100000",
            "CantidadTransporta": [
              {
                "Cantidad": "1",
                "IDDestino": "DE123456",
                "IDOrigen": "OR123456"
              }
            ]
          }
        ],
        "Autotransporte": {
          "NumPermisoSCT": "97866767",
          "PermSCT": "TPAF01",
          "IdentificacionVehicular": {
            "AnioModeloVM": "2021",
            "ConfigVehicular": "T3S2R3",
            "PlacaVM": "554LD1"
          },
          "Seguros": {
            "AseguraRespCivil": "Seguros Alex",
            "PolizaRespCivil": "123456789",
            "AseguraCarga": "Seguros Alez",
            "AseguraMedAmbiente": "Seguros ambientales Alex",
            "PolizaMedAmbiente": "123456789"
          },
          "Remolques": {
            "Remolque": [
              {
                "Placa": "acb1233",
                "SubTipoRem": "CTR001"
              }
            ]
          }
        }
      },
      "Ubicaciones": {
        "Ubicacion": [
          {
            "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
            "IDUbicacion": "OR123456",
            "RFCRemitenteDestinatario": "XIA190128J61",
            "TipoUbicacion": "Origen",
            "Domicilio": {
              "Calle": "calle",
              "NumeroExterior": "211",
              "Colonia": "0347",
              "Localidad": "23",
              "Municipio": "004",
              "Estado": "COA",
              "Pais": "MEX",
              "CodigoPostal": "25350"
            }
          },
          {
            "DistanciaRecorrida": "200",
            "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
            "IDUbicacion": "DE123456",
            "RFCRemitenteDestinatario": "PZA000413788",
            "TipoUbicacion": "Destino",
            "Domicilio": {
              "Calle": "calle",
              "NumeroExterior": "211",
              "Colonia": "0347",
              "Localidad": "23",
              "Municipio": "004",
              "Estado": "COA",
              "Pais": "MEX",
              "CodigoPostal": "25350"
            }
          }
        ]
      }
    }
  })

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

url = "http://devfactura.in/api/v3/cfdi33/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "UsoCFDI": "P01",
  "Serie": "17317",
  "Moneda": "MXN",
  "EnviarCorreo": "",
  "FormaPago": "02",
  "MetodoPago": "PPD",
  "TipoDocumento": "factura",
  "Conceptos": [
    {
      "ClaveProdServ": "78101800",
      "NoIdentificacion": "1",
      "Cantidad": "1",
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "Descripcion": "Fletes",
      "ValorUnitario": "21",
      "Importe": "21",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "21",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.160000",
            "Importe": "3.36"
          }
        ],
        "Retenidos": [
          {
            "Base": "21",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.040000",
            "Importe": "0.84"
          }
        ]
      }
    }
  ],
  "CartaPorte": {
    "Version": "2.0",
    "TranspInternac": "No",
    "TotalDistRec": "200",
    "FiguraTransporte": {
      "TiposFigura": [
        {
          "NumLicencia": "12345678",
          "RFCFigura": "LAN8507268IA",
          "TipoFigura": "01"
        }
      ]
    },
    "Mercancias": {
      "NumTotalMercancias": "1",
      "PesoBrutoTotal": "120.5",
      "UnidadPeso": "KGM",
      "Mercancia": [
        {
          "BienesTransp": "10151601",
          "Cantidad": "1",
          "ClaveUnidad": "H87",
          "Descripcion": "Semillas de trigo",
          "Moneda": "MXN",
          "PesoEnKg": "120.5",
          "ValorMercancia": "100000",
          "CantidadTransporta": [
            {
              "Cantidad": "1",
              "IDDestino": "DE123456",
              "IDOrigen": "OR123456"
            }
          ]
        }
      ],
      "Autotransporte": {
        "NumPermisoSCT": "97866767",
        "PermSCT": "TPAF01",
        "IdentificacionVehicular": {
          "AnioModeloVM": "2021",
          "ConfigVehicular": "T3S2R3",
          "PlacaVM": "554LD1"
        },
        "Seguros": {
          "AseguraRespCivil": "Seguros Alex",
          "PolizaRespCivil": "123456789",
          "AseguraCarga": "Seguros Alez",
          "AseguraMedAmbiente": "Seguros ambientales Alex",
          "PolizaMedAmbiente": "123456789"
        },
        "Remolques": {
          "Remolque": [
            {
              "Placa": "acb1233",
              "SubTipoRem": "CTR001"
            }
          ]
        }
      }
    },
    "Ubicaciones": {
      "Ubicacion": [
        {
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "OR123456",
          "RFCRemitenteDestinatario": "XIA190128J61",
          "TipoUbicacion": "Origen",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        },
        {
          "DistanciaRecorrida": "200",
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "DE123456",
          "RFCRemitenteDestinatario": "PZA000413788",
          "TipoUbicacion": "Destino",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        }
      ]
    }
  }
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/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"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"
request.body = JSON.dump({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "UsoCFDI": "P01",
  "Serie": "17317",
  "Moneda": "MXN",
  "EnviarCorreo": "",
  "FormaPago": "02",
  "MetodoPago": "PPD",
  "TipoDocumento": "factura",
  "Conceptos": [
    {
      "ClaveProdServ": "78101800",
      "NoIdentificacion": "1",
      "Cantidad": "1",
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "Descripcion": "Fletes",
      "ValorUnitario": "21",
      "Importe": "21",
      "Impuestos": {
        "Traslados": [
          {
            "Base": "21",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.160000",
            "Importe": "3.36"
          }
        ],
        "Retenidos": [
          {
            "Base": "21",
            "Impuesto": "002",
            "TipoFactor": "Tasa",
            "TasaOCuota": "0.040000",
            "Importe": "0.84"
          }
        ]
      }
    }
  ],
  "CartaPorte": {
    "Version": "2.0",
    "TranspInternac": "No",
    "TotalDistRec": "200",
    "FiguraTransporte": {
      "TiposFigura": [
        {
          "NumLicencia": "12345678",
          "RFCFigura": "LAN8507268IA",
          "TipoFigura": "01"
        }
      ]
    },
    "Mercancias": {
      "NumTotalMercancias": "1",
      "PesoBrutoTotal": "120.5",
      "UnidadPeso": "KGM",
      "Mercancia": [
        {
          "BienesTransp": "10151601",
          "Cantidad": "1",
          "ClaveUnidad": "H87",
          "Descripcion": "Semillas de trigo",
          "Moneda": "MXN",
          "PesoEnKg": "120.5",
          "ValorMercancia": "100000",
          "CantidadTransporta": [
            {
              "Cantidad": "1",
              "IDDestino": "DE123456",
              "IDOrigen": "OR123456"
            }
          ]
        }
      ],
      "Autotransporte": {
        "NumPermisoSCT": "97866767",
        "PermSCT": "TPAF01",
        "IdentificacionVehicular": {
          "AnioModeloVM": "2021",
          "ConfigVehicular": "T3S2R3",
          "PlacaVM": "554LD1"
        },
        "Seguros": {
          "AseguraRespCivil": "Seguros Alex",
          "PolizaRespCivil": "123456789",
          "AseguraCarga": "Seguros Alez",
          "AseguraMedAmbiente": "Seguros ambientales Alex",
          "PolizaMedAmbiente": "123456789"
        },
        "Remolques": {
          "Remolque": [
            {
              "Placa": "acb1233",
              "SubTipoRem": "CTR001"
            }
          ]
        }
      }
    },
    "Ubicaciones": {
      "Ubicacion": [
        {
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "OR123456",
          "RFCRemitenteDestinatario": "XIA190128J61",
          "TipoUbicacion": "Origen",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        },
        {
          "DistanciaRecorrida": "200",
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "DE123456",
          "RFCRemitenteDestinatario": "PZA000413788",
          "TipoUbicacion": "Destino",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        }
      ]
    }
  }
})

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

Ejemplo de respuesta de CFDI de ingreso

<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:cartaporte20="http://www.sat.gob.mx/CartaPorte20" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd" Version="3.3" Serie="F" Folio="224" Fecha="2021-12-01T10:04:45" FormaPago="02" NoCertificado="30001000000400002330" SubTotal="21.00" Moneda="MXN" Total="23.52" MetodoPago="PPD" TipoDeComprobante="I" LugarExpedicion="63780" Sello="Voe7KmW/+x0tPl6jkyumHoy3smItyl80ufDvzHwsygNqt3H5p1hSjnUNOLRXz5dHLs7+yPf4DlrPfBG/BjaCVfNIFJrnFUEGiUraoRhGkQ+m4VackZkdYdYrJqR66WkH8hau1vkrdV6S1TYWW0JtVO6H0XZlD43huOhDhtI2SNzdFwjpe/to683lRmJsFn9XFU860XZLOYyndvyt3LTtL1Y4W1rtAU8vSMMQpVI7sEaFA0NZDx3ga4DS5vTJJEAh8jEnb6FANyRZxTXG1Cbd2448ZvnoISzqsrtb0Rf43BTxKsV8hdl246JAPf/j2OqAzAzohVjzHTRlMLejtpJOvQ==" 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="CRISTIAN" RegimenFiscal="612"/>
    <cfdi:Receptor Rfc="XAXX010101000" Nombre="General" UsoCFDI="P01"/>
    <cfdi:Conceptos>
        <cfdi:Concepto ClaveProdServ="78101800" NoIdentificacion="1" Unidad="Unidad de servicio" Cantidad="1" ClaveUnidad="E48" Descripcion="Fletes" ValorUnitario="21" Importe="21">
            <cfdi:Impuestos>
                <cfdi:Traslados>
                    <cfdi:Traslado Base="21" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="3.36"/>
                </cfdi:Traslados>
                <cfdi:Retenciones>
                    <cfdi:Retencion Base="21" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.040000" Importe="0.84"/>
                </cfdi:Retenciones>
            </cfdi:Impuestos>
        </cfdi:Concepto>
    </cfdi:Conceptos>
    <cfdi:Impuestos TotalImpuestosRetenidos="0.84" TotalImpuestosTrasladados="3.36">
        <cfdi:Retenciones>
            <cfdi:Retencion Impuesto="002" Importe="0.84"/>
        </cfdi:Retenciones>
        <cfdi:Traslados>
            <cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="3.36"/>
        </cfdi:Traslados>
    </cfdi:Impuestos>
    <cfdi:Complemento>
        <cartaporte20:CartaPorte xmlns:cartaporte20="http://www.sat.gob.mx/CartaPorte20" Version="2.0" TranspInternac="No" TotalDistRec="200">
            <cartaporte20:Ubicaciones>
                <cartaporte20:Ubicacion TipoUbicacion="Origen" IDUbicacion="OR123456" RFCRemitenteDestinatario="XIA190128J61" FechaHoraSalidaLlegada="2021-11-03T15:03:23">
                    <cartaporte20:Domicilio Calle="calle" NumeroExterior="211" Colonia="0347" Localidad="23" Municipio="004" Estado="COA" Pais="MEX" CodigoPostal="25350"/>
                </cartaporte20:Ubicacion>
                <cartaporte20:Ubicacion TipoUbicacion="Destino" IDUbicacion="DE123456" RFCRemitenteDestinatario="PZA000413788" FechaHoraSalidaLlegada="2021-11-03T15:03:23" DistanciaRecorrida="200">
                    <cartaporte20:Domicilio Calle="calle" NumeroExterior="211" Colonia="0347" Localidad="23" Municipio="004" Estado="COA" Pais="MEX" CodigoPostal="25350"/>
                </cartaporte20:Ubicacion>
            </cartaporte20:Ubicaciones>
            <cartaporte20:Mercancias PesoBrutoTotal="120.5" UnidadPeso="KGM" NumTotalMercancias="1">
                <cartaporte20:Mercancia BienesTransp="10151601" Descripcion="Semillas de trigo" Cantidad="1" ClaveUnidad="H87" PesoEnKg="120.5" ValorMercancia="100000" Moneda="MXN">
                    <cartaporte20:CantidadTransporta Cantidad="1" IDOrigen="OR123456" IDDestino="DE123456"/>
                </cartaporte20:Mercancia>
                <cartaporte20:Autotransporte PermSCT="TPAF01" NumPermisoSCT="97866767">
                    <cartaporte20:IdentificacionVehicular ConfigVehicular="T3S2R3" PlacaVM="554LD1" AnioModeloVM="2021"/>
                    <cartaporte20:Seguros AseguraRespCivil="Seguros Alex" PolizaRespCivil="123456789" AseguraMedAmbiente="Seguros ambientales Alex" PolizaMedAmbiente="123456789" AseguraCarga="Seguros Alez"/>
                    <cartaporte20:Remolques>
                        <cartaporte20:Remolque SubTipoRem="CTR001" Placa="acb1233"/>
                    </cartaporte20:Remolques>
                </cartaporte20:Autotransporte>
            </cartaporte20:Mercancias>
            <cartaporte20:FiguraTransporte>
                <cartaporte20:TiposFigura TipoFigura="01" RFCFigura="LAN8507268IA" NumLicencia="12345678"/>
            </cartaporte20:FiguraTransporte>
        </cartaporte20:CartaPorte>
        <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd" Version="1.1" UUID="20dfcd05-313d-46a7-8d43-e3aa89676ef0" FechaTimbrado="2021-12-01T11:04:45" RfcProvCertif="SPR190613I52" SelloCFD="Voe7KmW/+x0tPl6jkyumHoy3smItyl80ufDvzHwsygNqt3H5p1hSjnUNOLRXz5dHLs7+yPf4DlrPfBG/BjaCVfNIFJrnFUEGiUraoRhGkQ+m4VackZkdYdYrJqR66WkH8hau1vkrdV6S1TYWW0JtVO6H0XZlD43huOhDhtI2SNzdFwjpe/to683lRmJsFn9XFU860XZLOYyndvyt3LTtL1Y4W1rtAU8vSMMQpVI7sEaFA0NZDx3ga4DS5vTJJEAh8jEnb6FANyRZxTXG1Cbd2448ZvnoISzqsrtb0Rf43BTxKsV8hdl246JAPf/j2OqAzAzohVjzHTRlMLejtpJOvQ==" NoCertificadoSAT="30001000000400002495" SelloSAT="r5u9NThRq55nebXi9aN08RNU//It+B5WDdSmjcAJtAzVp0mkyw6bqE8If7BDOPpgXsJxOajpSHq5r0PR+JlWSRmH3CLLhdT3l5v86xd+MNYNF6pORGWJM2T0zQiC6C4kr5OT2SQXcacx0ayVwfbxuyG/S7m7BF+xF1De7K13dPTBtjWtoDlDUpVm9KxpiI/ZFy/1cpkpsY0PCiwXJ5yq5UTpisYx/TTkIEnVY8CquwW7A++dyocV1nDKrKSnvRzSwbzrKTxw5ernWObaiDudwTLn9lPB9EIqt5sWuv/yndALuEtsu/cUf8S78n1Q09PMg7B7Vf0Exbh34bx5bcljpQ=="/>
    </cfdi:Complemento>
</cfdi:Comprobante>

Para crear un CFDI de ingreso debemos enviar el parametro como aparece a continuación:

"TipoDocumento": "factura"

Construcción de la URL

Host: https://factura.com (producción) / http://devfactura.in (sandbox)

Endpoint: /api/v3/cfdi33/create

Ejemplo: https://factura.com/api/v3/cfdi33/create

Para Autotransporte corresponde la siguiente guía:

Instructivo_Carta_Porte_Autotransporte.pdf

Para transporte Marítimo corresponde la siguiente guía:

Instructivo_Carta_Porte_Maritimo.pdf

Para transporte Aéreo corresponde la siguiente guía:

Instructivo_Carta_Porte_Aereo.pdf

Para transporte Ferroviario corresponde la siguiente guía:

Instructivo_Carta_Porte_Ferroviario.pdf

CFDI de Traslado

EJEMPLO DE CFDI DE TRASLADO

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v3/cfdi33/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": "6169fc02637e1"
    },
    "UsoCFDI": "P01",
    "Serie": "17317",
    "Moneda": "XXX",
    "EnviarCorreo": false,
    "TipoDocumento": "carta_porte",
    "Conceptos": [
        {
            "ClaveProdServ": "81112101",
            "Cantidad": 1,
            "ClaveUnidad": "E48",
            "Unidad": "Unidad de servicio",
            "ValorUnitario": 0,
            "Descripcion": "Desarrollo a la medida"
        }
    ],
    "CartaPorte": {
        "Version": "2.0",
        "TranspInternac": "No",
        "TotalDistRec": "200",
        "FiguraTransporte": {
            "TiposFigura": [
                {
                "NumLicencia": "12345678",
                "RFCFigura": "LAN8507268IA",
                "TipoFigura": "01"
                }
            ]
        },
        "Mercancias": {
            "NumTotalMercancias": "1",
            "PesoBrutoTotal": "120.5",
            "UnidadPeso": "KGM",
            "Mercancia": [{
                "BienesTransp": "10151601",
                "Cantidad": "1",
                "ClaveUnidad": "H87",
                "Descripcion": "Semillas de trigo",
                "Moneda": "MXN",
                "PesoEnKg": "120.5",
                "ValorMercancia": "100000",
                "CantidadTransporta": [{
                    "Cantidad": "1",
                    "IDDestino": "DE123456",
                    "IDOrigen": "OR123456"
                }]
            }],
            "Autotransporte": {
            "NumPermisoSCT": "97866767",
            "PermSCT": "TPAF01",
            "IdentificacionVehicular": {
                "AnioModeloVM": "2021",
                "ConfigVehicular": "T3S2R3",
                "PlacaVM": "554LD1"
            },
            "Seguros": {
                "AseguraRespCivil": "Seguros Alex",
                "PolizaRespCivil": "123456789",
                "AseguraCarga": "Seguros Alez",
                "AseguraMedAmbiente": "Seguros ambientales Alex",
                "PolizaMedAmbiente": "123456789"
            },
            "Remolques": {
                "Remolque": [{
                    "Placa": "acb1233",
                    "SubTipoRem": "CTR001"
                }]
            }
        }
    },
    "Ubicaciones": {
        "Ubicacion": [{
            "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
            "IDUbicacion": "OR123456",
            "RFCRemitenteDestinatario": "XIA190128J61",
            "TipoUbicacion": "Origen",
            "Domicilio": {
                "Calle": "calle",
                "NumeroExterior": "211",
                "Colonia": "0347",
                "Localidad": "23",
                "Municipio": "004",
                "Estado": "COA",
                "Pais": "MEX",
                "CodigoPostal": "25350"
            }
        },
        {
          "DistanciaRecorrida": "200",
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "DE123456",
          "RFCRemitenteDestinatario": "PZA000413788",
          "TipoUbicacion": "Destino",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        }
      ]
    }
  }
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: API.Key',
    'F-Secret-Key: Secret.Key'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v3/cfdi33/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  },
  body: JSON.stringify({
    "Receptor": {
      "UID": "6169fc02637e1"
    },
    "UsoCFDI": "P01",
    "Serie": "17317",
    "Moneda": "XXX",
    "EnviarCorreo": false,
    "TipoDocumento": "carta_porte",
    "Conceptos": [
      {
        "ClaveProdServ": "81112101",
        "Cantidad": 1,
        "ClaveUnidad": "E48",
        "Unidad": "Unidad de servicio",
        "ValorUnitario": 0,
        "Descripcion": "Desarrollo a la medida"
      }
    ],
    "CartaPorte": {
      "Version": "2.0",
      "TranspInternac": "No",
      "TotalDistRec": "200",
      "FiguraTransporte": {
        "TiposFigura": [
          {
            "NumLicencia": "12345678",
            "RFCFigura": "LAN8507268IA",
            "TipoFigura": "01"
          }
        ]
      },
      "Mercancias": {
        "NumTotalMercancias": "1",
        "PesoBrutoTotal": "120.5",
        "UnidadPeso": "KGM",
        "Mercancia": [
          {
            "BienesTransp": "10151601",
            "Cantidad": "1",
            "ClaveUnidad": "H87",
            "Descripcion": "Semillas de trigo",
            "Moneda": "MXN",
            "PesoEnKg": "120.5",
            "ValorMercancia": "100000",
            "CantidadTransporta": [
              {
                "Cantidad": "1",
                "IDDestino": "DE123456",
                "IDOrigen": "OR123456"
              }
            ]
          }
        ],
        "Autotransporte": {
          "NumPermisoSCT": "97866767",
          "PermSCT": "TPAF01",
          "IdentificacionVehicular": {
            "AnioModeloVM": "2021",
            "ConfigVehicular": "T3S2R3",
            "PlacaVM": "554LD1"
          },
          "Seguros": {
            "AseguraRespCivil": "Seguros Alex",
            "PolizaRespCivil": "123456789",
            "AseguraCarga": "Seguros Alez",
            "AseguraMedAmbiente": "Seguros ambientales Alex",
            "PolizaMedAmbiente": "123456789"
          },
          "Remolques": {
            "Remolque": [
              {
                "Placa": "acb1233",
                "SubTipoRem": "CTR001"
              }
            ]
          }
        }
      },
      "Ubicaciones": {
        "Ubicacion": [
          {
            "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
            "IDUbicacion": "OR123456",
            "RFCRemitenteDestinatario": "XIA190128J61",
            "TipoUbicacion": "Origen",
            "Domicilio": {
              "Calle": "calle",
              "NumeroExterior": "211",
              "Colonia": "0347",
              "Localidad": "23",
              "Municipio": "004",
              "Estado": "COA",
              "Pais": "MEX",
              "CodigoPostal": "25350"
            }
          },
          {
            "DistanciaRecorrida": "200",
            "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
            "IDUbicacion": "DE123456",
            "RFCRemitenteDestinatario": "PZA000413788",
            "TipoUbicacion": "Destino",
            "Domicilio": {
              "Calle": "calle",
              "NumeroExterior": "211",
              "Colonia": "0347",
              "Localidad": "23",
              "Municipio": "004",
              "Estado": "COA",
              "Pais": "MEX",
              "CodigoPostal": "25350"
            }
          }
        ]
      }
    }
  })

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

url = "http://devfactura.in/api/v3/cfdi33/create"

payload = json.dumps({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "UsoCFDI": "P01",
  "Serie": "17317",
  "Moneda": "XXX",
  "EnviarCorreo": False,
  "TipoDocumento": "carta_porte",
  "Conceptos": [
    {
      "ClaveProdServ": "81112101",
      "Cantidad": 1,
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "ValorUnitario": 0,
      "Descripcion": "Desarrollo a la medida"
    }
  ],
  "CartaPorte": {
    "Version": "2.0",
    "TranspInternac": "No",
    "TotalDistRec": "200",
    "FiguraTransporte": {
      "TiposFigura": [
        {
          "NumLicencia": "12345678",
          "RFCFigura": "LAN8507268IA",
          "TipoFigura": "01"
        }
      ]
    },
    "Mercancias": {
      "NumTotalMercancias": "1",
      "PesoBrutoTotal": "120.5",
      "UnidadPeso": "KGM",
      "Mercancia": [
        {
          "BienesTransp": "10151601",
          "Cantidad": "1",
          "ClaveUnidad": "H87",
          "Descripcion": "Semillas de trigo",
          "Moneda": "MXN",
          "PesoEnKg": "120.5",
          "ValorMercancia": "100000",
          "CantidadTransporta": [
            {
              "Cantidad": "1",
              "IDDestino": "DE123456",
              "IDOrigen": "OR123456"
            }
          ]
        }
      ],
      "Autotransporte": {
        "NumPermisoSCT": "97866767",
        "PermSCT": "TPAF01",
        "IdentificacionVehicular": {
          "AnioModeloVM": "2021",
          "ConfigVehicular": "T3S2R3",
          "PlacaVM": "554LD1"
        },
        "Seguros": {
          "AseguraRespCivil": "Seguros Alex",
          "PolizaRespCivil": "123456789",
          "AseguraCarga": "Seguros Alez",
          "AseguraMedAmbiente": "Seguros ambientales Alex",
          "PolizaMedAmbiente": "123456789"
        },
        "Remolques": {
          "Remolque": [
            {
              "Placa": "acb1233",
              "SubTipoRem": "CTR001"
            }
          ]
        }
      }
    },
    "Ubicaciones": {
      "Ubicacion": [
        {
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "OR123456",
          "RFCRemitenteDestinatario": "XIA190128J61",
          "TipoUbicacion": "Origen",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        },
        {
          "DistanciaRecorrida": "200",
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "DE123456",
          "RFCRemitenteDestinatario": "PZA000413788",
          "TipoUbicacion": "Destino",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        }
      ]
    }
  }
})
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/cfdi33/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"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"
request.body = JSON.dump({
  "Receptor": {
    "UID": "6169fc02637e1"
  },
  "UsoCFDI": "P01",
  "Serie": "17317",
  "Moneda": "XXX",
  "EnviarCorreo": false,
  "TipoDocumento": "carta_porte",
  "Conceptos": [
    {
      "ClaveProdServ": "81112101",
      "Cantidad": 1,
      "ClaveUnidad": "E48",
      "Unidad": "Unidad de servicio",
      "ValorUnitario": 0,
      "Descripcion": "Desarrollo a la medida"
    }
  ],
  "CartaPorte": {
    "Version": "2.0",
    "TranspInternac": "No",
    "TotalDistRec": "200",
    "FiguraTransporte": {
      "TiposFigura": [
        {
          "NumLicencia": "12345678",
          "RFCFigura": "LAN8507268IA",
          "TipoFigura": "01"
        }
      ]
    },
    "Mercancias": {
      "NumTotalMercancias": "1",
      "PesoBrutoTotal": "120.5",
      "UnidadPeso": "KGM",
      "Mercancia": [
        {
          "BienesTransp": "10151601",
          "Cantidad": "1",
          "ClaveUnidad": "H87",
          "Descripcion": "Semillas de trigo",
          "Moneda": "MXN",
          "PesoEnKg": "120.5",
          "ValorMercancia": "100000",
          "CantidadTransporta": [
            {
              "Cantidad": "1",
              "IDDestino": "DE123456",
              "IDOrigen": "OR123456"
            }
          ]
        }
      ],
      "Autotransporte": {
        "NumPermisoSCT": "97866767",
        "PermSCT": "TPAF01",
        "IdentificacionVehicular": {
          "AnioModeloVM": "2021",
          "ConfigVehicular": "T3S2R3",
          "PlacaVM": "554LD1"
        },
        "Seguros": {
          "AseguraRespCivil": "Seguros Alex",
          "PolizaRespCivil": "123456789",
          "AseguraCarga": "Seguros Alez",
          "AseguraMedAmbiente": "Seguros ambientales Alex",
          "PolizaMedAmbiente": "123456789"
        },
        "Remolques": {
          "Remolque": [
            {
              "Placa": "acb1233",
              "SubTipoRem": "CTR001"
            }
          ]
        }
      }
    },
    "Ubicaciones": {
      "Ubicacion": [
        {
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "OR123456",
          "RFCRemitenteDestinatario": "XIA190128J61",
          "TipoUbicacion": "Origen",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        },
        {
          "DistanciaRecorrida": "200",
          "FechaHoraSalidaLlegada": "2021-11-03T15:03:23",
          "IDUbicacion": "DE123456",
          "RFCRemitenteDestinatario": "PZA000413788",
          "TipoUbicacion": "Destino",
          "Domicilio": {
            "Calle": "calle",
            "NumeroExterior": "211",
            "Colonia": "0347",
            "Localidad": "23",
            "Municipio": "004",
            "Estado": "COA",
            "Pais": "MEX",
            "CodigoPostal": "25350"
          }
        }
      ]
    }
  }
})

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

Ejemplo de respuesta de CFDI de traslado

<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:cartaporte20="http://www.sat.gob.mx/CartaPorte20" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd" Version="3.3" Serie="C" Folio="94" Fecha="2021-12-01T10:13:13" NoCertificado="30001000000400002330" SubTotal="0" Moneda="XXX" Total="0" TipoDeComprobante="T" LugarExpedicion="63780" Sello="fIs9NhtJbwQKEy/IJOrq/Ft0ujXH3BWGRU5niyidJVdbUFlz9HV6A+BOFJVO1LnGsCH/qszP6RQ7b5LYA4ro4R9JC4a+gVlE03aJMAkkg/RpsQW0uhF23iPAlccHRE3fV9BZySjeUtdtPeGVQSjZTnwcyD6Hx0iEvceMEDpDx1gR9x/o4CCITU+GiZY1BjmW080D2/zLJKo/OYPYQEQA5HBJvoPjJDlwvRelJL4Fyt3yDQSecO1AUmN7/WMaj2U3VU1IrGlvjv8Ua6B8N+Q115RHymrrDTQngPzmJA9RLHIM/YnTysH/Ah60XuPiimIB0+Ocoa1IMZ4z3p3i9DY1Bw==" 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="CRISTIAN" RegimenFiscal="612"/>
    <cfdi:Receptor Rfc="XAXX010101000" Nombre="General" UsoCFDI="P01"/>
    <cfdi:Conceptos>
        <cfdi:Concepto ClaveProdServ="81112101" Unidad="Unidad de servicio" Cantidad="1" ClaveUnidad="E48" Descripcion="Desarrollo a la medida" ValorUnitario="0" Importe="0.000000"/>
    </cfdi:Conceptos>
    <cfdi:Complemento>
        <cartaporte20:CartaPorte xmlns:cartaporte20="http://www.sat.gob.mx/CartaPorte20" Version="2.0" TranspInternac="No" TotalDistRec="200">
            <cartaporte20:Ubicaciones>
                <cartaporte20:Ubicacion TipoUbicacion="Origen" IDUbicacion="OR123456" RFCRemitenteDestinatario="XIA190128J61" FechaHoraSalidaLlegada="2021-11-03T15:03:23">
                    <cartaporte20:Domicilio Calle="calle" NumeroExterior="211" Colonia="0347" Localidad="23" Municipio="004" Estado="COA" Pais="MEX" CodigoPostal="25350"/>
                </cartaporte20:Ubicacion>
                <cartaporte20:Ubicacion TipoUbicacion="Destino" IDUbicacion="DE123456" RFCRemitenteDestinatario="PZA000413788" FechaHoraSalidaLlegada="2021-11-03T15:03:23" DistanciaRecorrida="200">
                    <cartaporte20:Domicilio Calle="calle" NumeroExterior="211" Colonia="0347" Localidad="23" Municipio="004" Estado="COA" Pais="MEX" CodigoPostal="25350"/>
                </cartaporte20:Ubicacion>
            </cartaporte20:Ubicaciones>
            <cartaporte20:Mercancias PesoBrutoTotal="120.5" UnidadPeso="KGM" NumTotalMercancias="1">
                <cartaporte20:Mercancia BienesTransp="10151601" Descripcion="Semillas de trigo" Cantidad="1" ClaveUnidad="H87" PesoEnKg="120.5" ValorMercancia="100000" Moneda="MXN">
                    <cartaporte20:CantidadTransporta Cantidad="1" IDOrigen="OR123456" IDDestino="DE123456"/>
                </cartaporte20:Mercancia>
                <cartaporte20:Autotransporte PermSCT="TPAF01" NumPermisoSCT="97866767">
                    <cartaporte20:IdentificacionVehicular ConfigVehicular="T3S2R3" PlacaVM="554LD1" AnioModeloVM="2021"/>
                    <cartaporte20:Seguros AseguraRespCivil="Seguros Alex" PolizaRespCivil="123456789" AseguraMedAmbiente="Seguros ambientales Alex" PolizaMedAmbiente="123456789" AseguraCarga="Seguros Alez"/>
                    <cartaporte20:Remolques>
                        <cartaporte20:Remolque SubTipoRem="CTR001" Placa="acb1233"/>
                    </cartaporte20:Remolques>
                </cartaporte20:Autotransporte>
            </cartaporte20:Mercancias>
            <cartaporte20:FiguraTransporte>
                <cartaporte20:TiposFigura TipoFigura="01" RFCFigura="LAN8507268IA" NumLicencia="12345678"/>
            </cartaporte20:FiguraTransporte>
        </cartaporte20:CartaPorte>
        <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd" Version="1.1" UUID="0c627a94-a537-4bc1-90d8-1e27ccc28baf" FechaTimbrado="2021-12-01T11:13:13" RfcProvCertif="SPR190613I52" SelloCFD="fIs9NhtJbwQKEy/IJOrq/Ft0ujXH3BWGRU5niyidJVdbUFlz9HV6A+BOFJVO1LnGsCH/qszP6RQ7b5LYA4ro4R9JC4a+gVlE03aJMAkkg/RpsQW0uhF23iPAlccHRE3fV9BZySjeUtdtPeGVQSjZTnwcyD6Hx0iEvceMEDpDx1gR9x/o4CCITU+GiZY1BjmW080D2/zLJKo/OYPYQEQA5HBJvoPjJDlwvRelJL4Fyt3yDQSecO1AUmN7/WMaj2U3VU1IrGlvjv8Ua6B8N+Q115RHymrrDTQngPzmJA9RLHIM/YnTysH/Ah60XuPiimIB0+Ocoa1IMZ4z3p3i9DY1Bw==" NoCertificadoSAT="30001000000400002495" SelloSAT="g4WuRKncs+vqAzgE44toW48SMWz+7qyzjEq1inHp9sFc1HPGdINJFPKI0rbYmkPRCwvEdNNFZIf8z9j6A6mZX4AvWIQ5VeNSpyC8oCQKCW97TjzTYCtuqm1KpmrzXVnBcNbiVZbX/Sqth+sj3CU1S2Cx9R3KIcNi/RXYt8w92sdHnsV64S8c0q2LnqmL6Pwv1tGNglQ60Bcrl9tUuMGGnUCgMM0K2nJLSEZq1yhApMf95kKV2sD4ZnpBMzCqvSbHFF7l7UKB0i2dfP5aeo5BTETr1H3+Y1TCUWa1VBr/+C3BOr6oRO6Ce2ejBIGZ9fHNquVIsjj88z62kJRVPy8LxQ=="/>
    </cfdi:Complemento>
</cfdi:Comprobante>

Para crear un CFDI de ingreso debemos enviar el parametro como aparece a continuación:

"TipoDocumento": "carta_porte"

Construcción de la URL

Host: https://factura.com (producción) / http://devfactura.in (sandbox)

Endpoint: /api/v3/cfdi33/create

Ejemplo: https://factura.com/api/v3/cfdi33/create

Para Autotransporte corresponde la siguiente guía:

Instructivo_Carta_Porte_Autotransporte.pdf

Para transporte Marítimo corresponde la siguiente guía:

Instructivo_Carta_Porte_Maritimo.pdf

Para transporte Aéreo corresponde la siguiente guía:

Instructivo_Carta_Porte_Aereo.pdf

Para transporte Ferroviario corresponde la siguiente guía:

Instructivo_Carta_Porte_Ferroviario.pdf

Catálogos

A continuación se enlistan los tipos de CFDI aceptados por Factura.com

Tipos de documento

Clave Tipo de CFDI
factura Factura
factura_hotel Factura para hoteles
honorarios Recibo de honorarios
nota_cargo Nota de cargo
donativos Donativo
arrendamiento Recibo de arrendamiento
nota_credito Nota de crédito
nota_devolucion Nota de devolución
carta_porte Carta porte

Catálogos SAT

Puedes consultar los catálogos que el SAT provee para el timbrado.

El API de factura.com cuenta con endpoints puestos a tu disposición para consultar los catálogos de claves válidas para el SAT.

Construcción de la URL

Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/nombre_catalogo

Ejemplo: https://factura.com/api/v3/catalogo/Aduana

Aduana

Ejemplo de la consulta de aduana

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/Aduana");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/Aduana',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/Aduana"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/Aduana")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de Aduanas

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/Aduana

Ejemplo: https://factura.com/api/v3/catalogo/Aduana

Respuesta de catálogo aduana

Respuesta exitosa

{
  "response": "success",
  "data": [
    {
      "key": "01",
      "name": "ACAPULCO, ACAPULCO DE JUAREZ, GUERRERO"
    },
    {
      "key": "02",
      "name": "AGUA PRIETA, AGUA PRIETA, SONORA"
    },
    {
      "key": "05",
      "name": "SUBTENIENTE LOPEZ, SUBTENIENTE LOPEZ, QUINTANA ROO"
    },
    {
      "key": "06",
      "name": "CIUDAD DEL CARMEN, CIUDAD DEL CARMEN, CAMPECHE"
    },
    {
      "key": "07",
      "name": "CIUDAD JUAREZ, CIUDAD JUAREZ, CHIHUAHUA"
    },
    {
      "key": "08",
      "name": "COATZACOALCOS, COATZACOALCOS, VERACRUZ"
    },
    {
      "key": "11",
      "name": "ENSENADA, ENSENADA, BAJA CALIFORNIA"
    },
        .
    .
    .

  ]
}

Unidad

Ejemplo de la consulta de unidad de medida

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/ClaveUnidad");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/ClaveUnidad',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/ClaveUnidad"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/ClaveUnidad")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de Unidades de medida

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/ClaveUnidad

Ejemplo: https://factura.com/api/v3/catalogo/ClaveUnidad

Respuesta de catálogo unidad de medida

Respuesta exitosa

{
  "response": "success",
  "data": [
    {
      "key": "C81",
      "name": "Radián"
    },
    {
      "key": "C25",
      "name": "Milirradián"
    },
    {
      "key": "B97",
      "name": "Microrradián"
    },
    {
      "key": "DD",
      "name": "Grado [unidad de ángulo]"
    },
    {
      "key": "D61",
      "name": "Minuto [unidad de ángulo]"
    }
        .
    .
    .

  ]
}

Forma de pago

Ejemplo de la consulta de forma de pago

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/FormaPago");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/FormaPago',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/FormaPago"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/FormaPago")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de forma de pago

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/FormaPago

Ejemplo: https://factura.com/api/v3/catalogo/FormaPAgo

Respuesta de catálogo forma de pago

Respuesta exitosa

{
  "response": "success",
  "data": [
    {
      "key": "01",
      "name": "Efectivo"
    },
    {
      "key": "02",
      "name": "Cheque nominativo"
    },
    {
      "key": "03",
      "name": "Transferencia electrónica de fondos"
    },
    {
      "key": "04",
      "name": "Tarjeta de crédito"
    },
    {
      "key": "05",
      "name": "Monedero electrónico"
    }
        .
    .
    .

  ]
}

Catálogo de impuestos

Ejemplo de la consulta de impuestos

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/Impuesto");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/Impuesto',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/Impuesto"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/Impuesto")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de impuestos

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/Impuesto

Ejemplo: https://factura.com/api/v3/catalogo/Impuesto

Respuesta de catálogo impuestos

Respuesta exitosa

{
  "response": "success",
  "data": [
        {
     "key": "001",
     "name": "ISR"
        },
    {
      "key": "002",
      "name": "IVA"
    },
    {
      "key": "003",
      "name": "IEPS"
    }
        .
    .
    .

  ]
}

Métodos de pago

Ejemplo de la consulta de métodos de pago

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/MetodoPago");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/MetodoPago',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/MetodoPago"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/MetodoPago")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de métodos de pago

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/MetodoPago

Ejemplo: https://factura.com/api/v3/catalogo/MetodoPago

Respuesta de catálogo métodos de pago

Respuesta exitosa

{
  "response": "success",
  "data": [
        {
      "key": "PUE",
      "name": "Pago en una sola exhibición"
    },
    {
      "key": "PPD",
      "name": "Pago en parcialidades o diferido"
    }

  ]
}

Moneda

Ejemplo de la consulta de monedas

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/Moneda");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/Moneda',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/Moneda"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/Moneda")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de monedas

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/Moneda

Ejemplo: https://factura.com/api/v3/catalogo/Moneda

Respuesta de catálogo monedas

Respuesta exitosa

{
  "response": "success",
  "data": [
    {
      "key": "AED",
      "name": "Dirham de EAU"
    },
    {
      "key": "AFN",
      "name": "Afghani"
    },
    {
      "key": "ALL",
      "name": "Lek"
    },
    {
      "key": "AMD",
      "name": "Dram armenio"
    },
    {
      "key": "ANG",
      "name": "Florín antillano neerlandés"
    },
    .
    .
    .
  ]
}

País

Ejemplo de la consulta de pais

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/Pais");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/Pais',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/Pais"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/Pais")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de paises

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/Pais

Ejemplo: https://factura.com/api/v3/catalogo/Pais

Respuesta de catálogo paises

Respuesta exitosa

{
  "response": "success",
  "data": [
    {
      "key": "AFG",
      "name": "Afganistán"
    },
    {
      "key": "ALA",
      "name": "Islas Åland"
    },
    {
      "key": "ALB",
      "name": "Albania"
    },
    {
      "key": "DEU",
      "name": "Alemania"
    }
    .
    .
    .
  ]
}

Régimen fiscal

Ejemplo de la consulta de regimen fiscal

Codigo<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/RegimenFiscal");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/RegimenFiscal',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/RegimenFiscal"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/RegimenFiscal")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de régimen fiscal

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/RegimenFiscal

Ejemplo: https://factura.com/api/v3/catalogo/RegimenFiscal

Respuesta de catálogo regimen fiscal

Respuesta exitosa

{
  "response": "success",
  "data": [
           {
              "key": "601",
              "name": "General de Ley Personas Morales"
            },
            {
              "key": "603",
              "name": "Personas Morales con Fines no Lucrativos"
            },
            {
              "key": "605",
              "name": "Sueldos y Salarios e Ingresos Asimilados a Salarios"
            },
            {
              "key": "606",
              "name": "Arrendamiento"
            },
            {
              "key": "608",
              "name": "Demás ingresos"
            }
    .
    .
    .
  ]
}

Tipo de relación

Ejemplo de la consulta de tipo de relacion

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/Relacion");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/Relacion',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/Relacion"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/Relacion")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/Relacion

Ejemplo: https://factura.com/api/v3/catalogo/Relacion

Respuesta de catálogo tipo de relación

Respuesta exitosa

{
  "response": "success",
  "data": [
            {
              "key": "01",
              "name": "Nota de crédito de los documentos relacionados"
            },
            {
              "key": "02",
              "name": "Nota de débito de los documentos relacionados"
            },
            {
              "key": "03",
              "name": "Devolución de mercancía sobre facturas o traslados previos"
            },
            {
              "key": "04",
              "name": "Sustitución de los CFDI previos"
            }
    .
    .
    .
  ]
}

Uso de CFDI

Ejemplo de la consulta de uso de CFDI

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v3/catalogo/UsoCfdi");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v3/catalogo/UsoCfdi',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v3/catalogo/UsoCfdi"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v3/catalogo/UsoCfdi")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

Consulta el catálogo de claves de uso de CFDI

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v3/catalogo/UsoCfdi

Ejemplo: https://factura.com/api/v3/catalogo/UsoCfdi

Respuesta de catálogo de claves de uso de CFDI

Respuesta exitosa

{
  "response": "success",
  "data": [
            {
              "key": "G01",
              "name": "Adquisición de mercancias",
              "use": "ambos"
            },
            {
              "key": "G02",
              "name": "Devoluciones, descuentos o bonificaciones",
              "use": "ambos"
            },
            {
              "key": "G03",
              "name": "Gastos en general",
              "use": "ambos"
            },
            {
              "key": "I01",
              "name": "Construcciones",
              "use": "ambos"
            }
    .
    .
    .
  ]
}

Clientes

Listar clientes

Ejemplo para listar cliente

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v1/clients");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ".'Ingresa API KEY',
    "F-Secret-Key: " .'Ingresa SECRET KEY'
));
$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
curl -i -H "Content-Type: application/json" -H "F-API-KEY: tu key" -H "F-SECRET-KEY: tu secret key" https://factura.com/api/v1/clients

A continuación se explica como listar los clientes , con un ejemplo y muestra de posibles respuestas obtenidas.

Podemos listar todos los clientes que tenemos registrados en el sistema.

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/clients

Ejemplo: https://factura.com/api/v1/clients

Respuesta de listar clientes

Respuesta exitosa

[
    {
        "status": "success o error",
        "data": [
            {
                "RazonSocial" : "Razón Social del cliente",
                "RFC" : "Registro Federal de Contribuyentes del cliente",
                "Calle" : "Calle del domicilio del cliente",
                "Numero" : "Número exterior del domicilio del cliente",
                "Interior" : "Número interior del domicilio del cliente",
                "Colonia" : "Colonia de domicilio del cliente", 
                "CodigoPosal" : "Código Postal del domicilio del cliente",
                "Ciudad" : "Ciudad del domicilio del cliente",
                "Delegacion" : "Delegación del domicilio del cliente",
                "Estado" : "Estado del domicilio del cliente",
                "NumRegIdTrib" : "",
                "UsoCFDI" : "",
                "Contacto"[{
                    "Nombre":"Nombre(s) del cliente",
                    "Apellidos":"Apellidos del cliente",
                    "Email":"Correo electrónico del cliente",
                    "Email2":"Correo electrónico 2 del cliente",
                    "Email3":"Correo electrónico 3 del cliente",
                    "Telefono":"Número de teléfono del cliente"
                }]
                                }                ],
        "UID": "Id único e irrepetible asignado por Factura.com y que servirá para la gestión interna del docmento."
    }
]

Consultar cliente

Ejemplo para consultar clientes

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v1/clients/XAXX010101000");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ".'Ingresa API KEY',
    "F-Secret-Key: " .'Ingresa SECRET KEY'
));
$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
curl -i -H "Content-Type: application/json" -H "F-API-KEY: tu key" -H "F-SECRET-KEY: tu secret key" https://factura.com/api/v1/clients/XAXX010101000

A continuación se explica como consultar un cliente en específico

Para consultar un cliente en específico es necesario agregar el RFC.

Parámetro Tipo Requerido Detalles
rfc string Opcional

*Requerido en el caso de querer consultar solo a un cliente.
Indica el RFC del cliente, para traer todas las invoices del mismo.

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/clients/rfc

Ejemplo: https://factura.com/api/v1/clients

Respuesta de consultar clientes

Respuesta exitosa


    {
        "status": "success o error",
        "data": [
            {
                "RazonSocial" : "Razón Social del cliente",
                "RFC" : "Registro Federal de Contribuyentes del cliente",
                "Calle" : "Calle del domicilio del cliente",
                "Numero" : "Número exterior del domicilio del cliente",
                "Interior" : "Número interior del domicilio del cliente",
                "Colonia" : "Colonia de domicilio del cliente", 
                "CodigoPosal" : "Código Postal del domicilio del cliente",
                "Ciudad" : "Ciudad del domicilio del cliente",
                "Delegacion" : "Delegación del domicilio del cliente",
                "Estado" : "Estado del domicilio del cliente",
                "NumRegIdTrib" : "",
                "UsoCFDI" : "",
                "Contacto"[{
                    "Nombre":"Nombre(s) del cliente",
                    "Apellidos":"Apellidos del cliente",
                    "Email":"Correo electrónico del cliente",
                    "Email2":"Correo electrónico 2 del cliente",
                    "Email3":"Correo electrónico 3 del cliente",
                    "Telefono":"Número de teléfono del cliente"
                }]
                                }                ],
        "UID": "Id único e irrepetible asignado por Factura.com y que servirá para la gestión interna del docmento."
    }
]

Consultar RFC repetido con diferente información

Ejemplo para consultar un RFC repetido

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v1/clients/rfc/XAXX010101000");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ".'Ingresa API KEY',
    "F-Secret-Key: " .'Ingresa SECRET KEY'
));
$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
curl -i -H "Content-Type: application/json" -H "F-API-KEY: tu key" -H "F-SECRET-KEY: tu secret key" https://factura.com/api/v1/clients/rfc/XAXX010101000

A continuación se explica como consultar un RFC dado de alta más de una vez pero con distintas razones sociales o distintos datos.

Para consultar un RFC en específico es necesario enviarlo en la petición.

Parámetro Tipo Requerido Detalles
rfc string Opcional

*Requerido en el caso de querer consultar solo a un cliente.
Indica el RFC a buscar, para traer toda la información de los clientes registrados con el mismo.

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/clients/rfc/el_rfc

Ejemplo: https://factura.com/api/v1/clients/rfc/el_rfc

Respuesta de mismo RFC diferentes razones sociales

Respuesta exitosa

[
    {
        "status": "success o error",
        "data": [
            {
                "RazonSocial" : "Razón Social del cliente",
                "RFC" : "Registro Federal de Contribuyentes del cliente",
                "Calle" : "Calle del domicilio del cliente",
                "Numero" : "Número exterior del domicilio del cliente",
                "Interior" : "Número interior del domicilio del cliente",
                "Colonia" : "Colonia de domicilio del cliente", 
                "CodigoPosal" : "Código Postal del domicilio del cliente",
                "Ciudad" : "Ciudad del domicilio del cliente",
                "Delegacion" : "Delegación del domicilio del cliente",
                "Estado" : "Estado del domicilio del cliente",
                "NumRegIdTrib" : "",
                "UsoCFDI" : "",
                "Contacto"[{
                    "Nombre":"Nombre(s) del cliente",
                    "Apellidos":"Apellidos del cliente",
                    "Email":"Correo electrónico del cliente",
                    "Email2":"Correo electrónico 2 del cliente",
                    "Email3":"Correo electrónico 3 del cliente",
                    "Telefono":"Número de teléfono del cliente"
                }]
                                }                ],
        "UID": "Id único e irrepetible asignado por Factura.com y que servirá para la gestión interna del docmento."
    },
    {
                "RazonSocial" : "Razón Social del cliente",
                "RFC" : "Registro Federal de Contribuyentes del cliente",
                "Calle" : "Calle del domicilio del cliente",
                "Numero" : "Número exterior del domicilio del cliente",
                "Interior" : "Número interior del domicilio del cliente",
                "Colonia" : "Colonia de domicilio del cliente", 
                "CodigoPosal" : "Código Postal del domicilio del cliente",
                "Ciudad" : "Ciudad del domicilio del cliente",
                "Delegacion" : "Delegación del domicilio del cliente",
                "Estado" : "Estado del domicilio del cliente",
                "NumRegIdTrib" : "",
                "UsoCFDI" : "",
                "Contacto"[{
                    "Nombre":"Nombre(s) del cliente",
                    "Apellidos":"Apellidos del cliente",
                    "Email":"Correo electrónico del cliente",
                    "Email2":"Correo electrónico 2 del cliente",
                    "Email3":"Correo electrónico 3 del cliente",
                    "Telefono":"Número de teléfono del cliente"
                }]
                                }                ],
        "UID": "Id único e irrepetible asignado por Factura.com y que servirá para la gestión interna del docmento."
    },
    {
                "RazonSocial" : "Razón Social del cliente",
                "RFC" : "Registro Federal de Contribuyentes del cliente",
                "Calle" : "Calle del domicilio del cliente",
                "Numero" : "Número exterior del domicilio del cliente",
                "Interior" : "Número interior del domicilio del cliente",
                "Colonia" : "Colonia de domicilio del cliente", 
                "CodigoPosal" : "Código Postal del domicilio del cliente",
                "Ciudad" : "Ciudad del domicilio del cliente",
                "Delegacion" : "Delegación del domicilio del cliente",
                "Estado" : "Estado del domicilio del cliente",
                "NumRegIdTrib" : "",
                "UsoCFDI" : "",
                "Contacto"[{
                    "Nombre":"Nombre(s) del cliente",
                    "Apellidos":"Apellidos del cliente",
                    "Email":"Correo electrónico del cliente",
                    "Email2":"Correo electrónico 2 del cliente",
                    "Email3":"Correo electrónico 3 del cliente",
                    "Telefono":"Número de teléfono del cliente"
                }]
                                }                ],
        "UID": "Id único e irrepetible asignado por Factura.com y que servirá para la gestión interna del docmento."
    }
]

Crear cliente

Ejemplo para dar de alta un nuevo cliente

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v1/clients/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 =>'{
    "nombre": "Cliente prueba ",
    "apellidos": "Pérez López",
    "email": "correo@email.com",
    "email2": "otroemail2@email.com",
    "email3": "otroemail3@email.com",
    "telefono": "33 3877 7741",
    "razons": "Cliente prueba ",
    "rfc": "XAXX010101000",
    "regimen": 612,
    "calle": "Av. Juarez",
    "numero_exterior": 1234,
    "numero_interior": "",
    "codpos": 44640,
    "colonia": "Centro",
    "estado": "Jalisco",
    "ciudad": "Guadalajara",
    "delegacion": ""
}',
  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': 'http://devfactura.in/api/v1/clients/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  body: JSON.stringify({
    "nombre": "Cliente prueba ",
    "apellidos": "Pérez López",
    "email": "correo@email.com",
    "email2": "otroemail2@email.com",
    "email3": "otroemail3@email.com",
    "telefono": "33 3877 7741",
    "razons": "Cliente prueba ",
    "rfc": "XAXX010101000",
    "regimen": 612,
    "calle": "Av. Juarez",
    "numero_exterior": 1234,
    "numero_interior": "",
    "codpos": 44640,
    "colonia": "Centro",
    "estado": "Jalisco",
    "ciudad": "Guadalajara",
    "delegacion": ""
  })

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

url = "http://devfactura.in/api/v1/clients/create"

payload = json.dumps({
  "nombre": "Cliente prueba ",
  "apellidos": "Pérez López",
  "email": "correo@email.com",
  "email2": "otroemail2@email.com",
  "email3": "otroemail3@email.com",
  "telefono": "33 3877 7741",
  "razons": "Cliente prueba ",
  "rfc": "XAXX010101000",
  "regimen": 612,
  "calle": "Av. Juarez",
  "numero_exterior": 1234,
  "numero_interior": "",
  "codpos": 44640,
  "colonia": "Centro",
  "estado": "Jalisco",
  "ciudad": "Guadalajara",
  "delegacion": ""
})
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("http://devfactura.in/api/v1/clients/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({
  "nombre": "Cliente prueba ",
  "apellidos": "Pérez López",
  "email": "correo@email.com",
  "email2": "otroemail2@email.com",
  "email3": "otroemail3@email.com",
  "telefono": "33 3877 7741",
  "razons": "Cliente prueba ",
  "rfc": "XAXX010101000",
  "regimen": 612,
  "calle": "Av. Juarez",
  "numero_exterior": 1234,
  "numero_interior": "",
  "codpos": 44640,
  "colonia": "Centro",
  "estado": "Jalisco",
  "ciudad": "Guadalajara",
  "delegacion": ""
})

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

A continuación se explica como dar de alta un nuevo cliente.

Podemos crear un nuevo cliente haciendo uso de los siguientes parámetros:

Parámetro Tipo Requerido Detalles
nombre string Opcional Indica el nombre del cliente.
apellidos string Opcional Indica los apellidos del cliente.
email string Requerido Indica el email del cliente.
email2 string Opcional Indica otro email del cliente.
email3 string Opcional Indica otro email del cliente.
telefono string Opcional Indica el numero de teléfono
razons string Opcional Indica la razón social del cliente.
rfc string Requerido Indica el RFC del cliente, éste debe tener min:12 y max:13 caracteres.
regimen int Opcional Indica el regimen fiscal al cual esta ligado a el RFC, este utiliza los codigos numericos del catalogo de regimen fiscal del SAT ejemplo 612 para Personas Físicas con Actividades Empresariales y Profesionales
calle string Opcional Indica la calle del domicilio fiscal.
numero_exterior string Opcional Indica el número del domicilio fiscal.
numero_interior string Opcional Indica el número interior del domicilio fiscal, en caso de contar con él.
codpos int Requerido Indica el código postal, éste debe tener min:5 caracteres.
colonia string Opcional Indica la colonia.
estado string Opcional Indica la estado.
ciudad string Opcional Indica la ciudad.
pais string Opcional Indica la clave del país.

Consulta el catálogo correspondiente a paises.
numregidtrib string Opcional Indica el número de registro de identidad fiscal del receptor del comprobante fiscal cuando éste sea residente en el extranjero.
usocfdi string Opcional Indica la clave que corresponda al uso que le dará al comprobante fiscal el receptor.

Consulta el catálogo de claves de Uso de CFDI.

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/clients/create

Ejemplo: https://factura.com/api/v1/clients/create

Respuesta de crear cliente

Respuesta exitosa

{
    "status": "success",
    "Data": {
        "RazonSocial": "Cliente prueba",
        "RFC": "XAXX010101000",
        "Regimen": "Personas Físicas con Actividades Empresariales y Profesionales",
        "Calle": "Av. Juarez",
        "Numero": "1234",
        "Interior": "",
        "Colonia": "Centro",
        "CodigoPostal": "44640",
        "Ciudad": "Guadalajara",
        "Delegacion": "Guadalajara",
        "Estado": "Jalisco",
        "Pais": "MEX",
        "NumRegIdTrib": null,
        "UsoCFDI": null,
        "Contacto": {
            "Nombre": "Cliente prueba",
            "Apellidos": "Pérez López",
            "Email": "correo@email.com",
            "Email2": "otroemail2@email.com",
            "Email3": "otroemail3@email.com",
            "Telefono": "33 3877 7741"
        },
        "UID": "61df22703770b",
        "cfdis": 0,
        "cuentas_banco": []
    }
}

Respuesta erronea

{
  "status": "error",
  "message": {
    "rfc": [
      "El campo rfc es requerido"
    ]
  }
}

Actualizar cliente

Ejemplo para actualizar clientes

<?php
$ch = curl_init();
$fields = [
 "nombre" => "Cliente prueba ",
 "apellidos" => "Pérez López",
 "email" => "correo@email.com",
 "email2" => "otroemail2@email.com",
 "email3" => "otroemail3@email.com",
 "telefono" => "33 3877 7741",
 "razons" => "Cliente prueba ",
 "rfc" => "XAXX010101000",
 "calle" => "Av. Juarez",
 "numero_exterior" => 1234,
 "numero_interior" => "",
 "codpos" => 44640,
 "colonia" => "Centro",
 "estado" => "Jalisco",
 "ciudad" => "Guadalajara",
 "delegacion" => ""
];

$jsonfield = json_encode($fields);

curl_setopt($ch, CURLOPT_URL, "http://devfactura.in/api/v1/clients/client_uid/update");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonfield);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ". 'Ingresa API KEY',
    "F-Secret-Key: " . 'Ingresa SECRET KEY'
));

$response = curl_exec($ch);

return die($response);

curl_close($ch);

?>
{
     "nombre" : "Cliente prueba ",
     "apellidos" : "Pérez López",
     "email" : "correo@email.com",
     "email2" : "otroemail2@email.com",
     "email3" : "otroemail3@email.com",
     "telefono" : "33 3877 7741",
     "razons" : "Cliente prueba ",
     "rfc" : "XAXX010101000",
     "calle" : "Av. Juarez",
     "numero_exterior" : 1234,
     "numero_interior" : "",
     "codpos" : 44640,
     "colonia" : "Centro",
     "estado" : "Jalisco",
     "ciudad" : "Guadalajara",
     "delegacion" : ""
}

A continuación se explica como editar un cliente existente

Podemos actualizar los datos de un cliente haciendo uso de los siguientes parámetros:

Parámetro Tipo Requerido Detalles
nombre string Opcional Indica el nombre del cliente.
apellidos string Opcional Indica los apellidos del cliente.
email string Requerido Indica el email del cliente.
email2 string Opcional Indica otro email del cliente.
email3 string Opcional Indica otro email del cliente.
telefono string Opcional Indica el numero de teléfono
razons string Opcional Indica la razón social del cliente.
rfc string Requerido Indica el RFC del cliente, éste debe tener min:12 y max:13 caracteres.
calle string Opcional Indica la calle del domicilio fiscal.
numero_exterior string Opcional Indica el número del domicilio fiscal.
numero_interior string Opcional Indica el número interior del domicilio fiscal, en caso de contar con él.
codpos string Requerido Indica el código postal, éste debe tener min:5 caracteres.
colonia string Opcional Indica la colonia.
estado string Opcional Indica la estado.
ciudad string Opcional Indica la ciudad.
pais string Opcional Indica la clave del país.

Consulta el catálogo correspondiente a paises.
delegacion string Opcional Indica la delegación, en caso de contar con ella.
numregidtrib string Opcional Indica el número de registro de identidad fiscal del receptor del comprobante fiscal cuando éste sea residente en el extranjero.
usocfdi string Opcional Indica la clave que corresponda al uso que le dará al comprobante fiscal el receptor.

Consulta el catálogo de claves de Uso de CFDI.

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/clients/client_uid/update

Ejemplo: https://factura.com/api/v1/clients/client_uid/update

Respuesta de listar clientes

Respuesta exitosa

{
  "status": "success",
  "Data": {
    "RazonSocial": "Venta Al P\u00fablico en General",
    "RFC": "XAXX010101000",
    "Calle": "pedro loza",
    "Numero": "12349506",
    "Interior": "No Aplica",
    "Colonia": "Centro",
    "CodigoPostal": "00000",
    "Ciudad": "Guadalajara",
    "Delegacion": "Guadalajara",
    "Estado": "Jalisco",
    "Pais": "MEX",
    "Contacto": {
      "Nombre": "Publico",
      "Apellidos": "General (M\u00e9xico)",
      "Email": "paco@lightcone.com",
      "Email2": null,
      "Email3": null,
      "Telefono": "0000000000"
    },
    "UID": "55c0fdc67593d",
    "cfdis": 477,
    "cuentas_banco": [
      {
        "banco": "AMERICAN EXPRESS",
        "cuenta": "3323"
      },
      {
        "banco": "ABC CAPITAL",
        "cuenta": "8888"
      }
    ]
  }
}

Respuesta erronea

{
  "status": "error",
  "message": {
    "rfc": [
      "El campo rfc es requerido"
    ]
  }
}

Consulta LCO

Ejemplo para consultar LCO

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://factura.com/api/v1/clients/lco/XAXX010101000");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "F-PLUGIN: " . '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    "F-Api-Key: ".'Ingresa API KEY',
    "F-Secret-Key: " .'Ingresa SECRET KEY'
));
$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v1/clients/lco/XAXX010101000',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'API.Key',
    'F-Secret-Key': 'Secret.Key'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v1/clients/lco/XAXX010101000"

payload = ""
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'API.Key',
  'F-Secret-Key': 'Secret.Key'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v1/clients/lco/XAXX010101000")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "API.Key"
request["F-Secret-Key"] = "Secret.Key"

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

A continuación se explica como consultar el RFC de tu cliente en la lista de la LCO (Lista de Contribuyentes con Obligación ante el SAT), con un ejemplo y muestra de posibles respuestas obtenidas.

Servicio para identificar que los RFC (emisores y receptores) que intervienen en el proceso sean válidos, es decir que estén en la LCO (Lista de Contribuyentes con Obligación ante el SAT).

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/clients/lco/{RFC}

Ejemplo: https://factura.com/api/v1/clients/lco/{RFC}

Respuesta de consultar LCO

Respuesta exitosa

[
    {
        "status": "success",
        "message": "El RFC se encuentra el la lista de LCO (Lista de Contribuyentes con Obligación ante el SAT)."
    }
]

Respuesta erronea

[
    {
        "status": "error",
        "message": "El RFC no se encuentra el la lista de LCO (Lista de Contribuyentes con Obligación ante el SAT), no podrás facturar a este RFC."
    }
]

Empresa

Crear nueva empresa

Ejemplo para crear nueva empresa

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/account/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 => array('razons' => 'Tu razon social','rfc' => 'FUNK123456PH7','codpos' => '44444','calle' => 'Ramon corona','numero_exterior' => '123','numero_interior' => '4','colonia' => 'Centro','estado' => 'Jalisco','ciudad' => 'Arandas','delegacion' => '','email' => 'mail@example.com','regimen' => '612','mailtomyconta' => '1','mail_conta' => 'conta@example.com','mailtomyself' => '1','regimen_nomina' => '612','cant_folios_min' => '66','smtp' => '1','smtp_email' => 'senderEmail@example.com','smtp_password' => 'password','smtp_port' => '4433','smtp_host' => 'gmail.com','smtp_encryption' => 'tls','telefono' => '3344556677','curp' => 'FUNK123456PH7PD89','logo'=> new CURLFILE('/path/to/file'),'password' => '12345678a','cer'=> new CURLFILE('/path/to/file'),'key'=> new CURLFILE('/path/to/file')),
  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 fs = require('fs');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v4/account/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  formData: {
    'razons': 'Tu razon social',
    'rfc': 'FUNK123456PH7',
    'codpos': '44444',
    'calle': 'Ramon corona',
    'numero_exterior': '123',
    'numero_interior': '4',
    'colonia': 'Centro',
    'estado': 'Jalisco',
    'ciudad': 'Arandas',
    'delegacion': '',
    'email': 'mail@example.com',
    'regimen': '612',
    'mailtomyconta': '1',
    'mail_conta': 'conta@example.com',
    'mailtomyself': '1',
    'regimen_nomina': '612',
    'cant_folios_min': '66',
    'smtp': '1',
    'smtp_email': 'senderEmail@example.com',
    'smtp_password': 'password',
    'smtp_port': '4433',
    'smtp_host': 'gmail.com',
    'smtp_encryption': 'tls',
    'telefono': '3344556677',
    'curp': 'FUNK123456PH7PD89',
    'logo': {
      'value': fs.createReadStream('/path/to/file'),
      'options': {
        'filename': 'filename'
        'contentType': null
      }
    },
    'password': '12345678a',
    'cer': {
      'value': fs.createReadStream('/path/to/file'),
      'options': {
        'filename': 'filename'
        'contentType': null
      }
    },
    'key': {
      'value': fs.createReadStream('/path/to/file'),
      'options': {
        'filename': 'filename'
        'contentType': null
      }
    }
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/account/create"

payload={'razons': 'Tu razon social',
'rfc': 'FUNK123456PH7',
'codpos': '44444',
'calle': 'Ramon corona',
'numero_exterior': '123',
'numero_interior': '4',
'colonia': 'Centro',
'estado': 'Jalisco',
'ciudad': 'Arandas',
'delegacion': '',
'email': 'mail@example.com',
'regimen': '612',
'mailtomyconta': '1',
'mail_conta': 'conta@example.com',
'mailtomyself': '1',
'regimen_nomina': '612',
'cant_folios_min': '66',
'smtp': '1',
'smtp_email': 'senderEmail@example.com',
'smtp_password': 'password',
'smtp_port': '4433',
'smtp_host': 'gmail.com',
'smtp_encryption': 'tls',
'telefono': '3344556677',
'curp': 'FUNK123456PH7PD89',
'password': '12345678a'}
files=[
  ('logo',('file',open('/path/to/file','rb'),'application/octet-stream')),
  ('cer',('file',open('/path/to/file','rb'),'application/octet-stream')),
  ('key',('file',open('/path/to/file','rb'),'application/octet-stream'))
]
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, files=files)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/account/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"
form_data = [['razons', 'Tu razon social'],['rfc', 'FUNK123456PH7'],['codpos', '44444'],['calle', 'Ramon corona'],['numero_exterior', '123'],['numero_interior', '4'],['colonia', 'Centro'],['estado', 'Jalisco'],['ciudad', 'Arandas'],['delegacion', ''],['email', 'mail@example.com'],['regimen', '612'],['mailtomyconta', '1'],['mail_conta', 'conta@example.com'],['mailtomyself', '1'],['regimen_nomina', '612'],['cant_folios_min', '66'],['smtp', '1'],['smtp_email', 'senderEmail@example.com'],['smtp_password', 'password'],['smtp_port', '4433'],['smtp_host', 'gmail.com'],['smtp_encryption', 'tls'],['telefono', '3344556677'],['curp', 'FUNK123456PH7PD89'],['logo', File.open('undefined')],['password', '12345678a'],['cer', File.open('undefined')],['key', File.open('undefined')]]
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body

A continuación se explica como funciona el servicio con el cual podras crear una nueva empresa para tu cuenta de factura.com

A continuación se listan los atributos que se utilizan para la creación de la empresa que pueden ser enviados en la petición.
Parámetro Tipo Requerido Detalles
razons String Requerido La razón social de tu empresa
rfc String Requerido El RFC de tu empresa
codpos String Requerido El codigo postal en el que esta registrada tu empresa
calle String Opcional Calle del domicilio fiscal de tu empresa
numero_exterior String Opcional Numero exterior del domicilio fiscal de tu empresa
numero_interior String Opcional Numero interior del domicilio fiscal de tu empresa
colonia String Opcional Indica la colonia del domicilio fiscal de tu empresa
estado String Opcional Indica el estado del domicilio fiscal de tu empresa
ciudad String Opcional Indica la ciudad del domicilio fiscal de tu empresa
delegacion String Opcional Indica la delegacion del domicilio fiscal de tu empresa
email String Opcional La direccion principal de correo electronico para tu empresa
regimen String Opcional Indica el regimen fiscal al cual pertenece tu empresa para generar CFDIs
mailtomyconta String Opcional Indica si se quiere enviar una copia de los correos electronicos de los CFDIs generados a tu contador
mail_conta String Opcional El correo electronico del contador
mailtomyself String Opcional Indica si se quiere enviar una copia de los correos electronicos de los CFDIs generados a tu direccion principal
regimen_nomina String Opcional Indica el regimen al cual pertenece tu empresa para generar nominas
cant_folios_min String Opcional Indica el limite minimo de folios disponible para tu empresa, genera una alerta cuando estas por agotar tus folios cuando se alcanza el numero minimo
smtp String Opcional Si utilizas un servidor de SMTP para enviar tus comprobantes aqui se indica el nombre
smtp_email String Opcional El correo que corresponde a tu servicio de SMTP para el envio de comprobantes
smtp_password String Opcional Contraseña de tu SMTP
smtp_port String Opcional Indica el puerto que utiliza tu SMTP
smtp_host String Opcional Indica el host de tu SMTP
smtp_encryption String Opcional Indica el tip de encriptacion que utiliza tu SMTP
telefono String Opcional El numero telefonico de tu empresa
curp String Opcional El CURP bajo la cual esta registrada tu empresa
logo Archivo tipo jpg, jpeg o png Opcional Indica el logo que se utilizara para tu empresa
password String Requerido La contraseña que utilizaste cuando creaste tus archivos CSD (.cer y .key)
cer Archivo .cer Requerido El archivo .cer correspondiente a tu empresa
key Archivo .key Requerido El archivo .key correspondiente a tu empresa

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v4/account/create

Ejemplo: https://factura.com/api/v4/current/account/create

Respuesta de creación de nueva empresa

Respuesta exitosa

{
    "status": "create",
    "0": {
        "acco_uid": "61ddfd7dc9168",
        "acco_create": "2022-01-11",
        "acco_user_id": 1765,
        "acco_api_key": "Tu API key",
        "acco_secret_key": "Tu Secret key",
        "acco_regimen": "Personas Físicas con Actividades Empresariales y Profesionales",
        "acco_regimen_33": "612",
        "acco_razon_social": "Tu razón social",
        "acco_rfc": "FUNK123456PH7",
        "acco_calle": "Ramon corona",
        "acco_numero": "123",
        "acco_interior": "4",
        "acco_colonia": "centro",
        "acco_codpos": "44444",
        "acco_estado": "Jalisco",
        "acco_delegacion": "Arandas",
        "acco_ciudad": "Arandas",
        "acco_telefono": "3344556677",
        "acco_email": "mail@example.com",
        "acco_smtp": "1",
        "acco_curp": "FUNK123456PH7PD89",
        "acco_regimen_nomina": "612",
        "acco_mailtomyconta": "1",
        "acco_email_conta": "conta@example.com",
        "acco_mailtomyself": "1",
        "acco_folios_alert": "66",
        "acco_id": 1914
    }
}

Respuesta erronea

{
    "status": "error",
    "message": {
        "razons": [
            "El campo razons es requerido"
        ]
    }
}

Consultar detalles de empresa actual

Ejemplo de consulta de empresa actual

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v1/current/account',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: Tu API key',
    'F-Secret-Key: Tu Secret key'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v1/current/account',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  formData: {

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

url = "http://devfactura.in/api/v1/current/account"

payload={}
files={}
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'Tu API key',
  'F-Secret-Key': 'Tu Secret key'
}

response = requests.request("GET", url, headers=headers, data=payload, files=files)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v1/current/account")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
form_data = []
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body

A continuación se explica como obtener los detalles de la empresa actual con la que se está trabajando.

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/current/account

Ejemplo: https://factura.com/api/v1/current/account

Respuesta de consulta de empresa actual

Respuesta exitosa

{
    "status": "success",
    "data": {
        "uid": "615c9889b6067",
        "razon_social": "Tu Razón Social",
        "rfc": "XOJI740919U48",
        "regimen_fiscal": "Personas Físicas con Actividades Empresariales y Profesionales",
        "calle": "Calle Prueba",
        "exterior": "1",
        "interior": "11",
        "colonia": "Agustin Yañez",
        "codpos": "11111",
        "ciudad": "Municipio Prueba",
        "estado": "Jalisco",
        "email": "example@gmail.com",
        "logo_path": "uploads/1765/615c9889b6067/272643438c94699252ff5e026cea6ba9.png",
        "api_key": "$2y$10$8a9S8o8WeiRhPh1YT6bnXun6uPs1ZdiZBUHjGwSqn3X44mbYSmY4.",
        "secret_key": "$2y$10$c5KNUW06w8r9OhH4MVPNz.BgpQfjHVZjPPYsVbX13WPQZomnYtxq2"
    }
}

Respuesta erronea

{
  "status": "error",
  "message": "La cuenta que intenta autenticarse no existe",
  "Data": "$2y$10$dnOV7qC7ZrD1CZitpUnTReLKtKPxG29XfwZylrEuiR0KVl18pOXXX",
  "Secret": "$2y$10$6ZN4aX5UExwz6HFlDSZcxOF1TGjHx8f40neE.CrXHHahyAfi8XXX."
}

Consultar detalles de empresas adicionales

Ejemplo de la consulta detalles de empresa

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v1/account/61e20b1903bad',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key: JDJ5JDEwJDhhOVM4bzhXZWlSaFBoMVlUNmJuWHVuNnVQczFaZGlaQlVIakd3U3FuM1g0NG1iWVNtWTQu',
    'F-Secret-Key: JDJ5JDEwJGM1S05VVzA2dzhyOU9oSDRNVlBOei5CZ3BRZmpIVlpqUFBZc1ZiWDEzV1BRWm9tbll0eHEy'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'http://devfactura.in/api/v1/account/61e20b1903bad',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'JDJ5JDEwJDhhOVM4bzhXZWlSaFBoMVlUNmJuWHVuNnVQczFaZGlaQlVIakd3U3FuM1g0NG1iWVNtWTQu',
    'F-Secret-Key': 'JDJ5JDEwJGM1S05VVzA2dzhyOU9oSDRNVlBOei5CZ3BRZmpIVlpqUFBZc1ZiWDEzV1BRWm9tbll0eHEy'
  },
  formData: {

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

url = "http://devfactura.in/api/v1/account/61e20b1903bad"

payload={}
files={}
headers = {
  'Content-Type': 'application/json',
  'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
  'F-Api-Key': 'JDJ5JDEwJDhhOVM4bzhXZWlSaFBoMVlUNmJuWHVuNnVQczFaZGlaQlVIakd3U3FuM1g0NG1iWVNtWTQu',
  'F-Secret-Key': 'JDJ5JDEwJGM1S05VVzA2dzhyOU9oSDRNVlBOei5CZ3BRZmpIVlpqUFBZc1ZiWDEzV1BRWm9tbll0eHEy'
}

response = requests.request("GET", url, headers=headers, data=payload, files=files)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v1/account/61e20b1903bad")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "JDJ5JDEwJDhhOVM4bzhXZWlSaFBoMVlUNmJuWHVuNnVQczFaZGlaQlVIakd3U3FuM1g0NG1iWVNtWTQu"
request["F-Secret-Key"] = "JDJ5JDEwJGM1S05VVzA2dzhyOU9oSDRNVlBOei5CZ3BRZmpIVlpqUFBZc1ZiWDEzV1BRWm9tbll0eHEy"
form_data = []
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body

A continuación se explica como obtener los detalles de cualquier empresa que tengamos registrada en Factura.com

Para consultar una empresa es necesario enviar el UID de la misma.

Parámetro Tipo Rquerido String
UID string Requerido Envía el UID de la empresa registrada en factura.com.

Ejemplo:
5670a524cfc65

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/account/UID

Ejemplo: https://factura.com/api/v1/account/UID

Respuesta de consulta detalles de empresa

Respuesta exitosa

{
    "status": "success",
    "data": {
        "uid": "61e20b1903bad",
        "razon_social": "TU RAZON SOCIAL",
        "rfc": "FUNK123456PH7",
        "regimen_fiscal": "Personas Físicas con Actividades Empresariales y Profesionales",
        "calle": "Ramon corona",
        "exterior": "123",
        "interior": "4",
        "colonia": "Centro",
        "codpos": "44444",
        "ciudad": "Arandas",
        "estado": "Jalisco",
        "email": "mail@example.com",
        "logo_path": "uploads/1765/61e20b1903bad/15bdcd87a2fa75e0e166e81919eba316.jpeg",
        "api_key": "$2y$10$XUaryy8EMjE7PYKQ5K7seOb8aJg6x28GNw37x2hECipg4RP/veagu",
        "secret_key": "$2y$10$lc63HxUp4J5JHyzMha6PBuGQq3c2wpVgNdoZ0DZt6YGA/iZlnQD4a"
    }
}

Respuesta erronea

{
  "status": "error",
  "message": "La cuenta que intenta autenticarse no existe",
  "Data": "$2y$10$dnOV7qC7ZrD1CZitpUnTReLKtKPxG29XfwZylrEuiR0KVl18pOXXX",
  "Secret": "$2y$10$6ZN4aX5UExwz6HFlDSZcxOF1TGjHx8f40neE.CrXHHahyAfi8XXX."
}

Actualizar empresa

Ejemplo para actualizar empresa

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/account/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 => array('razons' => 'Tu razon social','rfc' => 'FUNK123456PH7','codpos' => '44444','calle' => 'Ramon corona','numero_exterior' => '123','numero_interior' => '4','colonia' => 'Centro','estado' => 'Jalisco','ciudad' => 'Arandas','delegacion' => '','email' => 'mail@example.com','regimen' => '612','mailtomyconta' => '1','mail_conta' => 'conta@example.com','mailtomyself' => '1','regimen_nomina' => '612','cant_folios_min' => '66','smtp' => '1','smtp_email' => 'senderEmail@example.com','smtp_password' => 'password','smtp_port' => '4433','smtp_host' => 'gmail.com','smtp_encryption' => 'tls','telefono' => '3344556677','curp' => 'FUNK123456PH7PD89','logo'=> new CURLFILE('/path/to/file'),'password' => '12345678a','cer'=> new CURLFILE('/path/to/file'),'key'=> new CURLFILE('/path/to/file')),
  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 fs = require('fs');
var options = {
  'method': 'POST',
  'url': 'http://devfactura.in/api/v4/account/create',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  formData: {
    'razons': 'Tu razon social',
    'rfc': 'FUNK123456PH7',
    'codpos': '44444',
    'calle': 'Ramon corona',
    'numero_exterior': '123',
    'numero_interior': '4',
    'colonia': 'Centro',
    'estado': 'Jalisco',
    'ciudad': 'Arandas',
    'delegacion': '',
    'email': 'mail@example.com',
    'regimen': '612',
    'mailtomyconta': '1',
    'mail_conta': 'conta@example.com',
    'mailtomyself': '1',
    'regimen_nomina': '612',
    'cant_folios_min': '66',
    'smtp': '1',
    'smtp_email': 'senderEmail@example.com',
    'smtp_password': 'password',
    'smtp_port': '4433',
    'smtp_host': 'gmail.com',
    'smtp_encryption': 'tls',
    'telefono': '3344556677',
    'curp': 'FUNK123456PH7PD89',
    'logo': {
      'value': fs.createReadStream('/path/to/file'),
      'options': {
        'filename': 'filename'
        'contentType': null
      }
    },
    'password': '12345678a',
    'cer': {
      'value': fs.createReadStream('/path/to/file'),
      'options': {
        'filename': 'filename'
        'contentType': null
      }
    },
    'key': {
      'value': fs.createReadStream('/path/to/file'),
      'options': {
        'filename': 'filename'
        'contentType': null
      }
    }
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/account/create"

payload={'razons': 'Tu razon social',
'rfc': 'FUNK123456PH7',
'codpos': '44444',
'calle': 'Ramon corona',
'numero_exterior': '123',
'numero_interior': '4',
'colonia': 'Centro',
'estado': 'Jalisco',
'ciudad': 'Arandas',
'delegacion': '',
'email': 'mail@example.com',
'regimen': '612',
'mailtomyconta': '1',
'mail_conta': 'conta@example.com',
'mailtomyself': '1',
'regimen_nomina': '612',
'cant_folios_min': '66',
'smtp': '1',
'smtp_email': 'senderEmail@example.com',
'smtp_password': 'password',
'smtp_port': '4433',
'smtp_host': 'gmail.com',
'smtp_encryption': 'tls',
'telefono': '3344556677',
'curp': 'FUNK123456PH7PD89',
'password': '12345678a'}
files=[
  ('logo',('file',open('/path/to/file','rb'),'application/octet-stream')),
  ('cer',('file',open('/path/to/file','rb'),'application/octet-stream')),
  ('key',('file',open('/path/to/file','rb'),'application/octet-stream'))
]
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, files=files)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/account/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"
form_data = [['razons', 'Tu razon social'],['rfc', 'FUNK123456PH7'],['codpos', '44444'],['calle', 'Ramon corona'],['numero_exterior', '123'],['numero_interior', '4'],['colonia', 'Centro'],['estado', 'Jalisco'],['ciudad', 'Arandas'],['delegacion', ''],['email', 'mail@example.com'],['regimen', '612'],['mailtomyconta', '1'],['mail_conta', 'conta@example.com'],['mailtomyself', '1'],['regimen_nomina', '612'],['cant_folios_min', '66'],['smtp', '1'],['smtp_email', 'senderEmail@example.com'],['smtp_password', 'password'],['smtp_port', '4433'],['smtp_host', 'gmail.com'],['smtp_encryption', 'tls'],['telefono', '3344556677'],['curp', 'FUNK123456PH7PD89'],['logo', File.open('undefined')],['password', '12345678a'],['cer', File.open('undefined')],['key', File.open('undefined')]]
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body

A continuación se explica como actualizar los datos de una empresa dada de alta en Factura.com

Para actualizar la información de una empresa es necesario enviar minimo alguno de los siguientes parámetros:

Parámetro Tipo Requerido Detalles
razons String Requerido La razón social de tu empresa
rfc String Requerido El RFC de tu empresa
codpos String Requerido El codigo postal en el que esta registrada tu empresa
calle String Opcional Calle del domicilio fiscal de tu empresa
numero_exterior String Opcional Numero exterior del domicilio fiscal de tu empresa
numero_interior String Opcional Numero interior del domicilio fiscal de tu empresa
colonia String Opcional Indica la colonia del domicilio fiscal de tu empresa
estado String Opcional Indica el estado del domicilio fiscal de tu empresa
ciudad String Opcional Indica la ciudad del domicilio fiscal de tu empresa
delegacion String Opcional Indica la delegacion del domicilio fiscal de tu empresa
email String Opcional La direccion principal de correo electronico para tu empresa
regimen String Opcional Indica el regimen fiscal al cual pertenece tu empresa para generar CFDIs
mailtomyconta String Opcional Indica si se quiere enviar una copia de los correos electronicos de los CFDIs generados a tu contador
mail_conta String Opcional El correo electronico del contador
mailtomyself String Opcional Indica si se quiere enviar una copia de los correos electronicos de los CFDIs generados a tu direccion principal
regimen_nomina String Opcional Indica el regimen al cual pertenece tu empresa para generar nominas
cant_folios_min String Opcional Indica el limite minimo de folios disponible para tu empresa, genera una alerta cuando estas por agotar tus folios cuando se alcanza el numero minimo
smtp String Opcional Si utilizas un servidor de SMTP para enviar tus comprobantes aqui se indica el nombre
smtp_email String Opcional El correo que corresponde a tu servicio de SMTP para el envio de comprobantes
smtp_password String Opcional Contraseña de tu SMTP
smtp_port String Opcional Indica el puerto que utiliza tu SMTP
smtp_host String Opcional Indica el host de tu SMTP
smtp_encryption String Opcional Indica el tip de encriptacion que utiliza tu SMTP
telefono String Opcional El numero telefonico de tu empresa
curp String Opcional El CURP bajo la cual esta registrada tu empresa
logo Archivo tipo jpg, jpeg o png Opcional Indica el logo que se utilizara para tu empresa
password String Requerido La contraseña que utilizaste cuando creaste tus archivos CSD (.cer y .key)
cer Archivo .cer Requerido El archivo .cer correspondiente a tu empresa
key Archivo .key Requerido El archivo .key correspondiente a tu empresa

Construcción de la URL Host: https://factura.com (producción) / http://devfactura.in (sandbox) Endpoint: /api/v1/account/client_uid/update

Ejemplo: https://factura.com/api/v1/account/client_uid/update

Respuesta de actualizar empresa

Respuesta exitosa

{
    "status": "success",
    "data": {
        "uid": "61e1a60f4f4c2",
        "razon_social": "Tu razón social",
        "rfc": "EDIT123456PH7",
        "regimen_fiscal": 612,
        "calle": "Ramon corona",
        "exterior": "123",
        "interior": "4",
        "colonia": "Centro",
        "codpos": "44555",
        "ciudad": "Arandas",
        "estado": "Jalisco",
        "email": "mail@example.com"
    }
}

Respuesta erronea

{
  "status": "error",
  "message": "La cuenta que intenta autenticarse no existe",
  "Data": "$2y$10$dnOV7qC7ZrD1CZitpUnTReLKtKPxG29XfwZylrEuiR0KVl18pOXXX",
  "Secret": "$2y$10$6ZN4aX5UExwz6HFlDSZcxOF1TGjHx8f40neE.CrXHHahyAfi8XXX."
}

Eliminar empresa

Ejemplo para eliminar una empresa

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://devfactura.in/api/v4/account/%7Buid_empresa%7D/delete',
  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 => array('_method' => 'delete'),
  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': 'http://devfactura.in/api/v4/account/{uid_empresa}/delete',
  'headers': {
    'Content-Type': 'application/json',
    'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  },
  formData: {
    '_method': 'delete'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "http://devfactura.in/api/v4/account/{uid_empresa}/delete"

payload={'_method': 'delete'}
files=[

]
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, files=files)

print(response.text)
require "uri"
require "json"
require "net/http"

url = URI("http://devfactura.in/api/v4/account/{uid_empresa}/delete")

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"
form_data = [['_method', 'delete']]
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body

A continuación se explica como funciona el servicio con el cual podras borrar una empresa de tu cuenta de factura.com

A continuación se listan los atributos que se ut