Postman
Postman
  • Documentación

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

Autofacturación Pro

Introducción

La Autofacturación Pro es la evolución del módulo de autofacturación. Este módulo permite que tus clientes generen sus propias facturas a partir de tickets de venta que pueden incluir uno o varios conceptos. A diferencia del módulo anterior, la Autofacturación Pro está diseñado para todo tipo de negocio, brindando mayor flexibilidad y control sobre la información que se factura. Con solo ingresar el ID del ticket, la fecha de venta y el total, tus clientes podrán generar su factura desde un enlace, incluso cuando la venta incluye múltiples artículos o servicios.

Tip

El módulo de autofacturación Pro no está incluido en todos los planes de Factura.com.

Cargar órdenes

A continuación verás la forma de cargar las órdenes para este módulo.

 Parámetro Tipo Requerido Detalles
 origin_sale_id String Requerido

 Indica el folio por el cual identificaremos la orden, este puede ser personalizado pero no debe repetirse con otras órdenes, ya que no permitirá ingresarlo.

Ejemplo: 01

 origin_sale_date String Requerido

 Se utiliza para definir la fecha en la que se realizó la venta o que generamos el ticket para nuestros clientes

Este campo debe ingresarse con el siguiente formato:

"2025-03-31"

 due_date String Requerido

 Se utiliza para indicar la fecha límite que tendrá el cliente para timbrar su factura.

Este campo debe ingresarse con el siguiente formato:

"2025-03-14"

 payment_way String Requerido

 Aquí podemos editar la forma de pago que tuvo la orden, utilizando las claves del SAT para las Formas de pago .

Ejemplo:

"01" (Efectivo)

 remote_origin String Opcional

 Se puede usar para agregar una etiqueta personalizada a la orden, lo que permite clasificarla o identificar su origen.

Ejemplo:

Puede usar los tags "ONLINE" y "TIENDA" para distinguir si la orden proviene de la tienda en línea o de una sucursal física.

 invoice_serie_id String Requerido

 En este campo enviaremos el nombre de la serie con el que queremos que se timbre la factura de la orden, también puede enviarse el id de la serie, puedes ver tus series disponibles siguiendo esta documentación Series .

Ejemplo:

"F" o "20783"

 details array Requerido

 Es un arreglo de objetos, en el que cada objeto corresponde a un concepto con sus atributos para agregar a la orden.


Ejemplo:
"details": [
    {
   "quantity": "3",
   "amount": "330.00",
    "tax_applicability": "02",
    "unit_sat_id": "E48",
    "product_sat_id": "39121402",
    "description": "Desarrollo web",
    "taxes": [
      
{
      "name": "IVA",
      "tasa": "16",
      "type":"Federal",
         }
       ]
     }
   ]
}

 quantity number Requerido

 Es la cantidad de productos o servicios correspondientes al concepto. Importante: el valor de "quantity" no modifica el total del concepto; el total siempre será el que se indique en "amount".

El precio unitario se calcula automáticamente dividiendo el "amount" entre el "quantity".

Por ejemplo

quantity: 2

amount: 500.00

Entonces el precio unitario del producto/servicio sería de 250.00.

 amount number Requerido

 Indica la cantidad total de dinero correspondiente al concepto.

Ejemplo: 123.45

NOTA: Esta cantidad siempre incluye el IVA o el impuesto que se agregue, y se calcula con el porcentaje que ingresamos en el campo 'tasa'

Es decir, 'amount' => 123.45    'tasa' => 16

Subtotal = 106.42

IVA = 17.03

Total = 123.45

 tax_applicability String Requerido

 Se puede utilizar para definir el tipo de impuesto que aplica al concepto facturado.02

Opciones:
"01": No objeto de impuesto.
"02": Si objeto de impuesto.
"03": Si objeto de impuesto y no obligado al desglose
"04": Si objeto de impuesto y no causa impuesto
"05": Si objeto del impuesto, IVA crédito PODEBI

Nota: Este campo tiene prioridad sobre otros impuestos. Si se envía con las claves 01, 03, 04 o 05, el sistema ignorará cualquier impuesto especificado en la petición, incluso si se incluyen.

 unit_sat_id String Requerido

 Indica la clave de la unidad de medida correspondiente al concepto.

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

Ejemplo:
"unit_sat_id": "E48".

 product_sat_id String Requerido

 Indica la clave del producto o servicio correspondiente al concepto.

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

Ejemplo:
"product_sat_id": "43232408".

 sub_producto_hyp String Opcional

 Este campo solo es necesario si se agrega el complemente de hidrocarburos y petroliferos (15101515, 15101514, 15101505). Indica la clave del subproducto HYP correspondiente al concepto.
Ejemplo:
"sub_producto_hyp": "SP17"

 description String Requerido

 Indica la descripción del concepto.

Ejemplo:
"description": "Desarrollo web a la medida".

 taxes array Requerido

 Es un arreglo de objetos, en el que cada objeto corresponde a un impuesto con sus atributos para agregar al concepto.


Ejemplo:
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal",
}
]
 name String Requerido

 El nombre del impuesto que se va a utilizar, si es impuesto federal, los nombres pueden ser; IVA, IEPS, y si es un impuesto local, puede ser cualquier nombre, recordar que solo son impuestos de traslado.

Ejemplo:
"name": "IVA".

 tasa String Requerido

 Corresponde a la tasa con la que se calculara el impuesto que se está agregando.

Ejemplo:
"tasa": "16".

 type String Requerido

 Indica el tipo de impuesto que se está agregando, puede ser "Federal" (IVA o IEPS) o "Local".

Ejemplo:
"type": "Federal".

Tip

Importante el método para cargar órdenes es de tipo POST

Construcción de la URL

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

Endpoint: /v4/sales

Ejemplo: https://api.factura.com/v4/sales

Ejemplo para cargar órdenes con un solo concepto.

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v4/sales',
  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 =>'{
    "origin_sale_id": "100122",
    "origin_sale_date": "2025-04-11",
    "due_date": "2025-04-30",
    "payment_way": "01",
    "remote_origin": "",
    "invoice_serie_id": "20783",
    "details": [
        {
            "quantity": 2,
            "amount": 2000.00,
            "tax_applicability": "02",
            "unit_sat_id": "E48",
            "product_sat_id": "39121402",
            "description": "Desarrollo web a la medida",
            "taxes": [
                {
                    "name": "IVA",
                    "tasa": "16",
                    "type": "Fedral"
                }
            ]
        }
    ]
}',
  CURLOPT_HTTPHEADER => array(
    'F-Api-Key: Tu API key',
    'F-Secret-Key: Tu Secret key',
    'Content-Type: application/json'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

var request = require('request');
var options = {
  'method': 'POST',
  'url': '{ HOST }/v4/sales',
  'headers': {
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "origin_sale_id": "100122",
    "origin_sale_date": "2025-04-11",
    "due_date": "2025-04-30",
    "payment_way": "01",
    "remote_origin": "",
    "invoice_serie_id": "20783",
    "details": [
      {
        "quantity": 2,
        "amount": 2000,
        "tax_applicability": "02",
        "unit_sat_id": "E48",
        "product_sat_id": "39121402",
        "description": "Desarrollo web a la medida",
        "taxes": [
          {
            "name": "IVA",
            "tasa": "16",
            "type": "Fedral"
          }
        ]
      }
    ]
  })

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

import requests
import json

url = "{ HOST }/v4/sales"

payload = json.dumps({
  "origin_sale_id": "100122",
  "origin_sale_date": "2025-04-11",
  "due_date": "2025-04-30",
  "payment_way": "01",
  "remote_origin": "",
  "invoice_serie_id: "20783",
  "details": [
    {
      "quantity": 2,
      "amount": 2000,
      "tax_applicability": "02",
      "unit_sat_id": "E48",
      "product_sat_id": "39121402",
      "description": "Desarrollo web a la medida",
      "taxes": [
        {
          "name": "IVA",
          "tasa": "16",
          "type": "Fedral"
        }
      ]
    }
  ]
})
headers = {
  'F-Api-Key': 'Tu API key',
  'F-Secret-Key': 'Tu Secret key',
  'Content-Type': 'application/json'
}

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

print(response.text)

require "uri"
require "json"
require "net/http"

url = URI("{ HOST }/v4/sales")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
  "origin_sale_id": "100122",
  "origin_sale_date": "2025-04-11",
  "due_date": "2025-04-30",
  "payment_way": "01",
  "remote_origin": "",
  "invoice_serie_id": "20783",
  "details": [
    {
      "quantity": 2,
      "amount": 2000,
      "tax_applicability": "02",
      "unit_sat_id": "E48",
      "product_sat_id": "39121402",
      "description": "Desarrollo web a la medida",
      "taxes": [
        {
          "name": "IVA",
          "tasa": "16",
          "type": "Fedral"
        }
      ]
    }
  ]
})

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

Ejemplo para cargar órdenes con mas de un concepto.

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v4/sales',
  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 =>'{
    "origin_sale_id": "100122",
    "origin_sale_date": "2025-04-11",
    "due_date": "2025-04-30",
    "payment_way": "01",
    "remote_origin": "",
    "invoice_serie_id": "20783",
    "details": [
        {
            "quantity": 2,
            "amount": 2000.00,
            "tax_applicability": "02",
            "unit_sat_id": "E48",
            "product_sat_id": "39121402",
            "description": "Desarrollo web a la medida",
            "taxes": [
                {
                    "name": "IVA",
                    "tasa": "16",
                    "type": "Fedral"
                }
            ]
        },
        {
            "quantity": 1,
            "amount": 1000.00,
            "tax_applicability": "02",
            "unit_sat_id": "E48",
            "product_sat_id": "39121402",
            "description": "Desarrollo web a la medida",
            "taxes": [
                {
                    "name": "IVA",
                    "tasa": "16",
                    "type": "Fedral"
                }
            ]
        }        
    ]
}',
  CURLOPT_HTTPHEADER => array(
    'F-Api-Key: Tu API key',
    'F-Secret-Key: Tu Secret key',
    'Content-Type: application/json'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

var request = require('request');
var options = {
  'method': 'POST',
  'url': '{ HOST }/v4/sales',
  'headers': {
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "origin_sale_id": "100122",
    "origin_sale_date": "2025-04-11",
    "due_date": "2025-04-30",
    "payment_way": "01",
    "remote_origin": "",
    "invoice_serie_id": "20783",
    "details": [
      {
        "quantity": 2,
        "amount": 2000,
        "tax_applicability": "02",
        "unit_sat_id": "E48",
        "product_sat_id": "39121402",
        "description": "Desarrollo web a la medida",
        "taxes": [
          {
            "name": "IVA",
            "tasa": "16",
            "type": "Fedral"
          }
        ]
      },
      {
        "quantity": 1,
        "amount": 1000,
        "tax_applicability": "02",
        "unit_sat_id": "E48",
        "product_sat_id": "39121402",
        "description": "Desarrollo web a la medida",
        "taxes": [
          {
            "name": "IVA",
            "tasa": "16",
            "type": "Fedral"
          }
        ]
      }      
    ]
  })

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

import requests
import json

url = "{ HOST }/v4/sales"

payload = json.dumps({
  "origin_sale_id": "100122",
  "origin_sale_date": "2025-04-11",
  "due_date": "2025-04-30",
  "payment_way": "01",
  "remote_origin": "",
  "invoice_serie_id": "20783",
  "details": [
    {
      "quantity": 2,
      "amount": 2000,
      "tax_applicability": "02",
      "unit_sat_id": "E48",
      "product_sat_id": "39121402",
      "description": "Desarrollo web a la medida",
      "taxes": [
        {
          "name": "IVA",
          "tasa": "16",
          "type": "Fedral"
        }
      ]
    },
    {
      "quantity": 1,
      "amount": 1000,
      "tax_applicability": "02",
      "unit_sat_id": "E48",
      "product_sat_id": "39121402",
      "description": "Desarrollo web a la medida",
      "taxes": [
        {
          "name": "IVA",
          "tasa": "16",
          "type": "Fedral"
        }
      ]
    }    
  ]
})
headers = {
  'F-Api-Key': 'Tu API key',
  'F-Secret-Key': 'Tu Secret key',
  'Content-Type': 'application/json'
}

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

print(response.text)

require "uri"
require "json"
require "net/http"

url = URI("{ HOST }/v4/sales")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
  "origin_sale_id": "100122",
  "origin_sale_date": "2025-04-11",
  "due_date": "2025-04-30",
  "payment_way": "01",
  "remote_origin": "",
  "invoice_serie_id": "20783",
  "details": [
    {
      "quantity": 2,
      "amount": 2000,
      "tax_applicability": "02",
      "unit_sat_id": "E48",
      "product_sat_id": "39121402",
      "description": "Desarrollo web a la medida",
      "taxes": [
        {
          "name": "IVA",
          "tasa": "16",
          "type": "Fedral"
        }
      ]
    },
    {
      "quantity": 1,
      "amount": 1000,
      "tax_applicability": "02",
      "unit_sat_id": "E48",
      "product_sat_id": "39121402",
      "description": "Desarrollo web a la medida",
      "taxes": [
        {
          "name": "IVA",
          "tasa": "16",
          "type": "Fedral"
        }
      ]
    }    
  ]
})

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

Tip

Con este mismo endpoint se pueden subir varias órdenes en una sola petición. Solo es necesario incluir cada orden como un nuevo objeto dentro de un arreglo, utilizando los mismos campos definidos anteriormente.

Respuestas al crear órdenes

Respuesta Exitosa

{
    "response": "success",
    "message": "Se ha registrado la venta exitosamente",
    "data": {
        "uuid": "23548067-5583-4cc6-ade3-24c12737c0c5"
    }
}

Respuesta errónea cuando la orden ya existe

{
    "response": "error",
    "message": {
        "origin_sale_id": [
            "El campo origin sale id ya existe"
        ]
    },
    "data": null
}

Respuesta errónea cuando hace falta información

{
    "response": "error",
    "message": {
        "origin_sale_id": [
            "El campo origin sale date es requerido"
        ]
    },
    "data": null
}

Aviso

El mensaje de error puede variar dependiendo el nodo en el que haya información incorrecta. Te sugerimos leer cuidadosamente el mensaje del error ya que en el mismo se indica donde es necesario corregir la información.

Listar órdenes

A continuación se explica como funciona el método con el cual podrás listar todas las órdenes de tu módulo de autofacturación.

Tip

Importante el metodo para listar ordenes es de tipo GET

Construcción de la URL

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

Endpoint: /v4/sales

Ejemplo: https://api.factura.com/v4/sales

Al enviar así el endpoint, recibiremos como respuesta las primeras 10 órdenes del módulo, pero utilizando ciertos filtros dentro de la URL, podemos incrementar la cantidad de registros que trae la respuesta.

Ejemplo: /v4/sales?requireTotalCount=true&take=20&skip=0

Parámetros disponibles:

requireTotalCount=true : Si se incluye, la respuesta también incluirá el total de órdenes disponibles (útil para paginación en interfaces).

take=20 : Indica la cantidad máxima de registros que se desean obtener (en este caso, 20).

skip=0 : Indica cuántos registros se deben omitir antes de empezar a contar (útil para moverse entre páginas). Por ejemplo, si se quiere obtener la “segunda página” de resultados con take=20, se usaría skip=20.

También podemos mandar el endpoint de forma que traiga en específico una orden.

Ejemplo: /v4/sales?filters[0][field]=origin_sale_id&filters[0][operator]==&filters[0][value]={origin_sale_id}

Respuestas al listar las órdenes

Respuesta Exitosa

{
    "totalCount": 6,
    "data": [
        {
            "id": 72,
            "uuid": null,
            "origin_sale_id": "EXL100",
            "origin_sale_date": "2025-04-19 00:00:00",
            "total": "100.00",
            "is_invoiced": "No",
            "account_id": 2960077,
            "invoice_uuid": null,
            "due_date": "2025-05-01 00:00:00",
            "payment_way": null,
            "invoice_date": null,
            "remote_origin": null,
            "invoice_serie_id": 26546,
            "created_at": "2025-04-30 16:18:30",
            "updated_at": "2025-04-30 16:18:30",
            "deleted_at": null,
            "client_id": null,
            "expedition_origin": "45148",
            "status": null,
            "details": [
                {
                    "id": 140,
                    "sale_id": 72,
                    "quantity": "1.000000",
                    "amount": "100.000000",
                    "taxes": "[{\"name\":\"IVA\",\"type\":\"Federal\",\"tasa\":16}]",
                    "unit_sat_id": "H87",
                    "product_sat_id": "39121402",
                    "description": "PLATOS",
                    "tax_applicability": "01",
                    "created_at": "2025-04-30 16:18:30",
                    "updated_at": "2025-04-30 16:18:30",
                    "deleted_at": null
                }
            ]
        },
        {
            "id": 73,
            "uuid": null,
            "origin_sale_id": "EXL101",
            "origin_sale_date": "2025-04-19 00:00:00",
            "total": "200.00",
            "is_invoiced": "No",
            "account_id": 2960077,
            "invoice_uuid": null,
            "due_date": "2025-05-01 00:00:00",
            "payment_way": null,
            "invoice_date": null,
            "remote_origin": null,
            "invoice_serie_id": 26546,
            "created_at": "2025-04-30 17:08:47",
            "updated_at": "2025-04-30 17:08:47",
            "deleted_at": null,
            "client_id": null,
            "expedition_origin": "45148",
            "status": null,
            "details": [
                {
                    "id": 141,
                    "sale_id": 73,
                    "quantity": "1.000000",
                    "amount": "200.000000",
                    "taxes": "[{\"name\":\"IVA\",\"type\":\"Federal\",\"tasa\":16}]",
                    "unit_sat_id": "H87",
                    "product_sat_id": "39121402",
                    "description": "PLATOS",
                    "tax_applicability": "01",
                    "created_at": "2025-04-30 17:08:47",
                    "updated_at": "2025-04-30 17:08:47",
                    "deleted_at": null
                }
            ]
        }
    ]
}

Respuestas al listar una orden en específico

{
    "data": [
        {
            "id": 560,
            "uuid": "6e475881-6af8-4386-989d-4fc762664ca2",
            "origin_sale_id": "EXL101",
            "origin_sale_date": "2025-05-20 00:00:00",
            "total": "100.00",
            "is_invoiced": "Yes",
            "account_id": 66605,
            "invoice_uuid": null,
            "due_date": "2025-05-31 00:00:00",
            "payment_way": "03",
            "invoice_date": null,
            "remote_origin": null,
            "invoice_serie_id": 50511,
            "created_at": "2025-05-29 13:21:51",
            "updated_at": "2025-05-29 13:21:51",
            "deleted_at": null,
            "client_id": null,
            "expedition_origin": "",
            "status": null,
            "details": [
                {
                    "id": 793,
                    "sale_id": 560,
                    "quantity": "1.000000",
                    "amount": "100.000000",
                    "taxes": "[{\"name\":\"IVA\",\"type\":\"Federal\",\"tasa\":16}]",
                    "unit_sat_id": "H87",
                    "product_sat_id": "39121402",
                    "description": "Hotel",
                    "tax_applicability": "02",
                    "created_at": "2025-05-29 13:21:51",
                    "updated_at": "2025-05-29 13:21:51",
                    "deleted_at": null
                }
            ]
        }
    ]
}

Respuesta cuando no existe ninguna orden

{
    "totalCount": 0,
    "data": []
}

Respuesta cuando no existe el registro en específico que se busca

{
    "data": []
}

Editar una orden

Ahora te mostramos como funciona el método con el cual podrás editar una orden en específico de tu módulo de autofacturación pro.

Podemos editar las órdenes en nuestro módulo haciendo uso de los siguientes parámetros:

 Parametro Tipo Requerido Detalles
 uuid String Requerido

 Debemos agregar el UUID de la orden que vamos a editar, este dato podemos obtenerlo con el método de listar nuestras órdenes.

Ejemplo: c37368cd-d4bd-4869-8d56-acf6a435352d

 origin_sale_id String Requerido

 Indica el folio por el cual identificaremos la orden este puede ser personalizado pero no debe repetirse con otras ordenes ya que no permitirá ingresarlo.

Ejemplo: 01

 origin_sale_date String Requerido

 Se utiliza para definir la fecha en la que se realizó la venta o que generamos el ticket para nuestros clientes

Este campo debe ingresarse con el siguiente formato:

"2025-03-31"

 due_date String Requerido

 Se utiliza para indicar la fecha límite que tendrá el cliente para timbrar su factura.

Este campo debe ingresarse con el siguiente formato:

"2025-03-14"

 payment_way String Requerido

 Aquí podemos editar la forma de pago que tuvo la orden, utilizando las claves del SAT para las Formas de pago .

Ejemplo:

"01" (Efectivo)

 remote_origin String Opcional

 Se puede usar para agregar una etiqueta personalizada a la orden, lo que permite clasificarla o identificar su origen.

Ejemplo:

Puede usar los tags "ONLINE" y "TIENDA" para distinguir si la orden proviene de la tienda en línea o de una sucursal física.

 invoice_serie_id String Requerido

 En este campo enviaremos el nombre de la serie con el que queremos que se timbre la factura de la orden, también puede enviarse el id de la serie, puedes ver tus series disponibles siguiendo esta documentación Series .

Ejemplo:

"F" o "20783"

 details array Requerido

 Es un arreglo de objetos, en el que cada objeto corresponde a un concepto con sus atributos para agregar a la orden.


Ejemplo:
"details": [
    {
   "quantity": "3",
   "amount": "330.00",
    "tax_applicability": "02",
    "unit_sat_id": "E48",
    "product_sat_id": "39121402",
    "description": "Desarrollo web",
    "taxes": [
      
{
      "name": "IVA",
      "tasa": "16",
      "type":"Federal",
         }
       ]
     }
   ]
}

 quantity number Requerido

 Es la cantidad de productos o servicios correspondientes al concepto. Importante: el valor de "quantity" no modifica el total del concepto; el total siempre será el que se indique en "amount".

El precio unitario se calcula automáticamente dividiendo el "amount" entre el "quantity".

Por ejemplo

quantity: 2

amount: 500.00

Entonces el precio unitario del producto/servicio sería de 250.00.

 amount number Requerido

 Indica la cantidad total de dinero correspondiente al concepto.

Ejemplo: 123.45

NOTA: Esta cantidad siempre incluye el IVA o el impuesto que se agregue, y se calcula con el porcentaje que ingresamos en el campo 'tasa'

Es decir, 'amount' => 123.45    'tasa' => 16

Subtotal = 106.42

IVA = 17.03

Total = 123.45

 tax_applicability String Requerido

 Se puede utilizar para definir el tipo de impuesto que aplica al concepto facturado.02

Opciones:
"01": No objeto de impuesto.
"02": Si objeto de impuesto.
"03": Si objeto de impuesto y no obligado al desglose
"04": Si objeto de impuesto y no causa impuesto
"05": Si objeto del impuesto, IVA crédito PODEBI

Nota: Este campo tiene prioridad sobre otros impuestos. Si se envía con las claves 01, 03, 04 o 05, el sistema ignorará cualquier impuesto especificado en la petición, incluso si se incluyen.

 unit_sat_id String Requerido

 Indica la clave de la unidad de medida correspondiente al concepto.

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

Ejemplo:
"unit_sat_id": "E48".

 product_sat_id String Requerido

 Indica la clave del producto o servicio correspondiente al concepto.

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

Ejemplo:
"product_sat_id": "43232408".

 sub_producto_hyp String Opcional

 Este campo solo es necesario si se agrega el complemente de hidrocarburos y petroliferos (15101515, 15101514, 15101505). Indica la clave del subproducto HYP correspondiente al concepto.
Ejemplo:
"sub_producto_hyp": "SP17"

 description String Requerido

 Indica la descripción del concepto.

Ejemplo:
"description": "Desarrollo web a la medida".

 taxes array Requerido

 Es un arreglo de objetos, en el que cada objeto corresponde a un impuesto con sus atributos para agregar al concepto.


Ejemplo:
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal",
}
]
 name String Requerido

 El nombre del impuesto que se va a utilizar, si es impuesto federal, los nombres pueden ser; IVA, IEPS, y si es un impuesto local, puede ser cualquier nombre, recordar que solo son impuestos de traslado.

Ejemplo:
"name": "IVA".

 tasa String Requerido

 Corresponde a la tasa con la que se calculara el impuesto que se está agregando.

Ejemplo:
"tasa": "16".

 type String Requerido

 Indica el tipo de impuesto que se está agregando, puede ser "Federal" (IVA o IEPS) o "Local".

Ejemplo:
"type": "Federal".

Tip

Importante el método para cargar órdenes es de tipo PATCH o PUT

Construcción de la URL

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

Endpoint: /v4/sales

Ejemplo: https://api.factura.com/v4/sales

Ejemplo para editar órdenes al módulo de autofacturación pro

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v4/sales',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'PUT',
  CURLOPT_POSTFIELDS =>'{
    "uuid": "353f6b42-50f3-464d-ab76-e4cf3706b137",
    "origin_sale_id": "100122",
    "origin_sale_date": "2025-04-11",
    "due_date": "2025-04-30",
    "payment_way": "01",
    "remote_origin": "",
    "invoice_serie_id": "20783",
    "details": [
        {
            "quantity": 2,
            "amount": 2000.00,
            "tax_applicability": "02",
            "unit_sat_id": "E48",
            "product_sat_id": "39121402",
            "description": "Desarrollo web a la medida",
            "taxes": [
                {
                    "name": "IVA",
                    "tasa": "16",
                    "type": "Fedral"
                }
            ]
        }
    ]
}',
  CURLOPT_HTTPHEADER => array(
    'F-Api-Key: Tu API key',
    'F-Secret-Key: Tu Secret key',
    'Content-Type: application/json'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

var request = require('request');
var options = {
  'method': 'PUT',
  'url': '{ HOST }/v4/sales',
  'headers': {
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "uuid": "353f6b42-50f3-464d-ab76-e4cf3706b137",
    "origin_sale_id": "100122",
    "origin_sale_date": "2025-04-11",
    "due_date": "2025-04-30",
    "payment_way": "01",
    "remote_origin": "",
    "invoice_serie_id": "20783",
    "details": [
      {
        "quantity": 2,
        "amount": 2000,
        "tax_applicability": "02",
        "unit_sat_id": "E48",
        "product_sat_id": "39121402",
        "description": "Desarrollo web a la medida",
        "taxes": [
          {
            "name": "IVA",
            "tasa": "16",
            "type": "Fedral"
          }
        ]
      }
    ]
  })

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

import requests
import json

url = "{ HOST }/v4/sales"

payload = json.dumps({
  "uuid": "353f6b42-50f3-464d-ab76-e4cf3706b137",
  "origin_sale_id": "100122",
  "origin_sale_date": "2025-04-11",
  "due_date": "2025-04-30",
  "payment_way": "01",
  "remote_origin": "",
  "invoice_serie_id": "20783",
  "details": [
    {
      "quantity": 2,
      "amount": 2000,
      "tax_applicability": "02",
      "unit_sat_id": "E48",
      "product_sat_id": "39121402",
      "description": "Desarrollo web a la medida",
      "taxes": [
        {
          "name": "IVA",
          "tasa": "16",
          "type": "Fedral"
        }
      ]
    }
  ]
})
headers = {
  'F-Api-Key': 'Tu API key',
  'F-Secret-Key': 'Tu Secret key',
  'Content-Type': 'application/json'
}

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

print(response.text)

require "uri"
require "json"
require "net/http"

url = URI("{ HOST }/v4/sales")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Put.new(url)
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
  "uuid": "353f6b42-50f3-464d-ab76-e4cf3706b137",
  "origin_sale_id": "100122",
  "origin_sale_date": "2025-04-11",
  "due_date": "2025-04-30",
  "payment_way": "01",
  "remote_origin": "",
  "invoice_serie_id": "20783",
  "details": [
    {
      "quantity": 2,
      "amount": 2000,
      "tax_applicability": "02",
      "unit_sat_id": "E48",
      "product_sat_id": "39121402",
      "description": "Desarrollo web a la medida",
      "taxes": [
        {
          "name": "IVA",
          "tasa": "16",
          "type": "Fedral"
        }
      ]
    }
  ]
})

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

Respuestas al editar una orden

Respuesta Exitosa

{
    "response": "success",
    "message": "Se ha actualizado la venta exitosamente",
    "data": {
        "uuid": "d773c1c7-d4f5-49f0-bb0c-8b772817eec2"
    }
}

Respuesta errónea cuando no se encuentra la orden

{
    "response": "error",
    "message": {
        "uuid": [
            "La venta no existe"
        ]
    },
    "data": null
}

Respuesta errónea cuando hace falta un campo

{
    "response": "error",
    "message": {
        "uuid": [
            "El campo uuid es requerido"
        ]
    },
    "code": 400
}

Eliminar una orden

A continuación se explica como funciona el método con el cual podrás eliminar una orden en específico de tu módulo de autofacturación pro.

Podemos eliminar las órdenes en nuestro módulo haciendo uso del siguiente parámetro:

 Parametro Tipo Requerido Detallles
 uuid String Requerido

Debemos enviar el uuid de la orden que queremos eliminar, este dato podemos obtenerlo al usar el metodo de listar ordenes

Ejemplo: "330be0e8-82a7-417b-907c-2bd8716c5f79"

Tip

Importante el metodo para eliminar una orden es de tipo DELETE

Construcción de la URL

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

Endpoint: /v4/sales

Ejemplo: https://api.factura.com/v4/sales

Ejemplo para eliminar una orden

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '{ HOST }/v4/sales',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'DELETE',
  CURLOPT_POSTFIELDS =>'
    {
        "uuid": "330be0e8-82a7-417b-907c-2bd8716c5f79"
    }',
  CURLOPT_HTTPHEADER => array(
    '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': 'DELETE',
  'url': '{ HOST }/v4/sales',
  'headers': {
    'F-Api-Key': 'Tu API key',
    'F-Secret-Key': 'Tu Secret key'
  }
body: JSON.stringify({
  "uuid": "330be0e8-82a7-417b-907c-2bd8716c5f79"
  })

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

import requests
import json 

url = "{ HOST }/v4/sales"

payload = json.dumps({
  "uuid": "330be0e8-82a7-417b-907c-2bd8716c5f79"
  })
headers = {
  'F-Api-Key': 'Tu API key',
  'F-Secret-Key': 'Tu Secret key'
}

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

print(response.text)

require "uri"
require "json"
require "net/http"

url = URI("{ HOST }/v4/sales")

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

request = Net::HTTP::Delete.new(url)
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
  "uuid": "330be0e8-82a7-417b-907c-2bd8716c5f79"
})

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

Respuestas al eliminar una orden

Respuesta Exitosa

{
    "response": "success",
    "message": "Registro eliminado exitosamente"
}

Respuesta erronea cuando no se encuentra la orden

{
    "response": "error",
    "message": "El registro no existe"
}
Prev
Consultar estatus de cancelación de un CFDI
Next
Factura360