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.
|
| 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 |
| unit_sat_id | String | Requerido | Indica la clave de la unidad de medida correspondiente al concepto. |
| product_sat_id | String | Requerido | Indica la clave del producto o servicio correspondiente al concepto. |
| 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. |
| description | String | Requerido | Indica la descripción del concepto. |
| 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: |
| 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. |
| tasa | String | Requerido | Corresponde a la tasa con la que se calculara el impuesto que se está agregando. |
| type | String | Requerido | Indica el tipo de impuesto que se está agregando, puede ser "Federal" (IVA o IEPS) o "Local". |
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.
|
| 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 |
| unit_sat_id | String | Requerido | Indica la clave de la unidad de medida correspondiente al concepto. |
| product_sat_id | String | Requerido | Indica la clave del producto o servicio correspondiente al concepto. |
| 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. |
| description | String | Requerido | Indica la descripción del concepto. |
| 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: |
| 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. |
| tasa | String | Requerido | Corresponde a la tasa con la que se calculara el impuesto que se está agregando. |
| type | String | Requerido | Indica el tipo de impuesto que se está agregando, puede ser "Federal" (IVA o IEPS) o "Local". |
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"
}