Factura360
Introducción
Factura 360 es el módulo integral de facturación que te permite gestionar todo el ciclo de ventas de tu negocio. Con esta herramienta podrás crear ventas y cotizaciones, gestionarlas en tu panel 360, facturar estas mismas ventas creadas y timbrar la factura global de las mismas, ideal para negocios que buscan una solución completa para su facturación electrónica.
Diferencia entre cotización y venta
Al generar un registro nuevo podemos escoger el estatus del mismo, puede ser Borrador, que es un registro que podemos seguir editando pero no genera ningún PDF ni es posible mandarlo al cliente. Después está el estatus de Cotización, este registro también podemos seguir editándolo, y genera un PDF que podemos compartir con el cliente. Por último, existe el estatus de Vendido, el cual ya no permite editar ningún dato, se genera un PDF que cuenta con un QR para que el cliente pueda facturar su venta, o podemos facturarlo directamente desde el módulo de Factura360.
Crear venta o cotización
Te mostraremos los parámetros necesarios para crear ventas o cotizaciones
| Parámetro | Tipo | Requerido | Detalles |
|---|---|---|---|
| serie_id | String | Requerido | Es necesario mandar el ID o la letra de la serie de venta que se utilizara, se incrementara un consecutivo dependiendo del folio en el que vaya esa serie de venta, es el folio de la cotización o venta, no el folio que tendrá la factura. Ejemplo: "V" o "50525" |
| origin_sale_date | String | Requerido | Se utiliza para definir la fecha en la que se realizó la venta o cotización para nuestro cliente. Este campo debe ingresarse con el siguiente formato: "2025-11-15" |
| due_date | String | Requerido | Se utiliza para indicar la fecha límite en la que la venta podrá ser facturada. Este campo debe ingresarse con el siguiente formato: "2025-03-14" |
| payment_way | String | Requerido | Requerido si el estatus será de "vendido", aquí podemos editar la forma de pago que tendrá la venta o cotización, utilizando las claves del SAT para las Formas de pago . Ejemplo: "01" (Efectivo) |
| method_payment | String | Requerido | Necesario para marcar el método de pago que tendrá la venta al ser facturada, puede ser PUE (pago en una sola exhibición) o PPD (Pago en parcialidades o diferido). Ejemplo: PPD |
| client_id | String | Requerido | Campo para agregar el UID del receptor (cliente) con el que se creara la venta o cotización, este campo podemos validarlo al listar nuestro catálogo de clientes. Ejemplo: "690cd2d62479e" |
| 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 venta, también puede enviarse el id de la serie, puedes ver tus series disponibles siguiendo esta documentación Series, esta serie es distinta a la de la cotización o venta, es la serie con la que podrás ver la factura final. Ejemplo: "F" o "20783" |
| status | String | Requerido | Campo para marcar el estatus que tendrá la venta que estamos creando, hay 3 posibilidades: vendido cotizacion borrador Si no se manda alguno de estos, se registrará en automático como un borrador. |
| details | array | Requerido | Es un arreglo de objetos, en el que cada objeto corresponde a un concepto con sus atributos para agregar a la venta.
|
Construcción del concepto
A continuación se describen los atributos que deben incluirse en el nodo Details
Para cada concepto es necesario incluir los siguientes atributos:
| Parámetro | Tipo | Requerido | Detalles |
|---|---|---|---|
| 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. |
| 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: |
Ejemplo de Details
"details": [
{
"quantity": 5,
"amount": 126.50,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Tapete de entrenamiento",
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal"
}
]
}
]
Construcción de los impuestos
A continuación se describen los atributos que deben incluirse en el nodo de taxes, actualmente solo pueden utilizarse impuestos de traslado y no de retención.
| Parámetro | Tipo | Requerido | Detalles |
|---|---|---|---|
| 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". |
Ejemplo de Taxes
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal"
},
{
"name": "Impuesto local",
"tasa": "10",
"type": "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: /360/sales
Ejemplo: https://api.factura.com/360/sales
Ejemplo para cargar ventas o cotizaciones.
<?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 =>'{
"serie_id": "26928",
"origin_sale_date": "2025-11-09",
"due_date": "2025-11-30",
"payment_way": "99",
"method_payment": "PPD",
"client_id": "68c3641885f52",
"invoice_serie_id": "26916",
"status": "vendido",
"details": [
{
"quantity": 2,
"tax_applicability": "01",
"amount": 410.00,
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Mallas deportivas",
"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({
"serie_id": "26928",
"origin_sale_date": "2025-11-09",
"due_date": "2025-11-30",
"payment_way": "99",
"method_payment": "PPD",
"client_id": "68c3641885f52",
"invoice_serie_id": "26916",
"status": "vendido",
"details": [
{
"quantity": 2,
"tax_applicability": "01",
"amount": 410,
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Mallas deportivas",
"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({
"serie_id": "26928",
"origin_sale_date": "2025-11-09",
"due_date": "2025-11-30",
"payment_way": "99",
"method_payment": "PPD",
"client_id": "68c3641885f52",
"invoice_serie_id": "26916",
"status": "vendido",
"details": [
{
"quantity": 2,
"tax_applicability": "01",
"amount": 410,
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Mallas deportivas",
"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({
"serie_id": "26928",
"origin_sale_date": "2025-11-09",
"due_date": "2025-11-30",
"payment_way": "99",
"method_payment": "PPD",
"client_id": "68c3641885f52",
"invoice_serie_id": "26916",
"status": "vendido",
"details": [
{
"quantity": 2,
"tax_applicability": "01",
"amount": 410,
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Mallas deportivas",
"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 venta o cotización
Respuesta Exitosa
{
"response": "success",
"message": "Se ha registrado la venta exitosamente",
"data": {
"uuid": "23548067-5583-4cc6-ade3-24c12737c0c5"
}
}
Respuesta errónea cuando hace falta información
{
"response": "error",
"message": {
"origin_sale_date": [
"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 ventas y cotizaciones
A continuación se explica como funciona el método con el cual podrás listar todas las ventas o cotizaciones de tu módulo de Factura 360.
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: /360/sales
Ejemplo: https://api.factura.com/360/sales
Al enviar así el endpoint, recibiremos como respuesta las primeras 10 ventas del módulo, pero utilizando ciertos filtros dentro de la URL, podemos incrementar la cantidad de registros que trae la respuesta.
Ejemplo: /360/sales?requireTotalCount=true&take=20&skip=0
Parámetros disponibles:
requireTotalCount=true : Si se incluye, la respuesta también incluirá el total de ventas 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 venta o cotización.
Ejemplo: /360/sales?filters[0][field]=origin_sale_id&filters[0][operator]==&filters[0][value]=V-052
Respuestas al listar las ventas
Respuesta Exitosa
{
"totalCount": 245,
"data": [
{
"id": 633,
"uuid": "17a3d92d-bca9-4b56-9316-059453042b7c",
"origin_sale_id": "A-92",
"origin_sale_date": "2025-11-09 00:00:00",
"total": "450.00",
"is_invoiced": null,
"account_id": 66605,
"invoice_uuid": null,
"due_date": "2025-11-30 00:00:00",
"payment_way": "99",
"invoice_date": null,
"remote_origin": "factura_com_360",
"invoice_serie_id": 26916,
"serie_id": 26897,
"created_at": "2025-11-24 11:56:02",
"updated_at": "2025-11-24 11:56:02",
"deleted_at": null,
"client_id": 36396,
"expedition_origin": null,
"status": "vendido",
"notes": null,
"method_payment": "PPD",
"details": [
{
"id": 942,
"sale_id": 633,
"quantity": "1.000000",
"amount": "450.000000",
"taxes": "[]",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Mallas deportivas",
"tax_applicability": "01",
"created_at": "2025-11-24 11:56:02",
"updated_at": "2025-11-24 11:56:02",
"deleted_at": null
}
]
},
{
"id": 634,
"uuid": "d407a2dc-5b4c-47cd-84af-e649f78e9dd2",
"origin_sale_id": "API0004",
"origin_sale_date": "2025-11-23 00:00:00",
"total": "1914.00",
"is_invoiced": null,
"account_id": 66605,
"invoice_uuid": null,
"due_date": "2025-11-30 00:00:00",
"payment_way": "04",
"invoice_date": null,
"remote_origin": "factura_com_360",
"invoice_serie_id": 0,
"serie_id": 26928,
"created_at": "2025-11-24 11:56:45",
"updated_at": "2025-11-24 12:03:15",
"deleted_at": null,
"client_id": 68,
"expedition_origin": null,
"status": "cotizacion",
"notes": null,
"method_payment": "PUE",
"details": [
{
"id": 944,
"sale_id": 634,
"quantity": "6.000000",
"amount": "1434.000000",
"taxes": "[{\"name\":\"IVA\",\"tasa\":\"16\",\"type\":\"Federal\"}]",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Pts deportivos",
"tax_applicability": "02",
"created_at": "2025-11-24 12:03:15",
"updated_at": "2025-11-24 12:03:15",
"deleted_at": null
}
]
}
]
}
Respuestas al listar una venta en específico
{
"data": [
{
"id": 639,
"uuid": "bec0d802-2eca-4903-a809-f0ae4c710ad6",
"origin_sale_id": "EE9",
"origin_sale_date": "2025-11-24 00:00:00",
"total": "4.64",
"is_invoiced": null,
"account_id": 66605,
"invoice_uuid": null,
"due_date": "2025-11-30 00:00:00",
"payment_way": "",
"invoice_date": null,
"remote_origin": "factura_com_360",
"invoice_serie_id": 0,
"serie_id": 26928,
"created_at": "2025-11-24 15:55:54",
"updated_at": "2025-11-24 17:21:59",
"deleted_at": null,
"client_id": 36413,
"expedition_origin": null,
"status": "borrador",
"notes": null,
"method_payment": null,
"details": [
{
"id": 958,
"sale_id": 639,
"quantity": "4.000000",
"amount": "4.640000",
"taxes": "[{\"id\":\"158516\",\"name\":\"IVA\",\"tasa\":\"16\",\"type\":\"Federal\"}]",
"unit_sat_id": "H87",
"product_sat_id": "49161504",
"description": "Balón azteca 5",
"tax_applicability": "02",
"created_at": "2025-11-24 17:21:59",
"updated_at": "2025-11-24 17:21:59",
"deleted_at": null
}
]
}
]
}
Respuesta cuando no existe ninguna venta
{
"totalCount": 0,
"data": []
}
Respuesta cuando no existe el registro en específico que se busca
{
"data": []
}
Editar una cotización
Este endpoint te permite editar una cotización específica en tu módulo de Factura 360.
Importante
Solo las cotizaciones con estado 'borrador' o 'cotización' pueden modificarse. Si ya tienen el estatus 'vendido', no será posible editarlas.
Podemos editar las cotizaciones 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 ventas. Ejemplo: 420f0af3-fcbd-44ae-adf5-e4245c95d926 |
| serie_id | String | Opcional | En caso de querer cambiar la serie, mandar el ID o la letra de la serie de venta que se utilizara, se incrementara un consecutivo dependiendo del folio en el que vaya esa serie de venta, es el folio de la cotización o venta, no el folio que tendrá la factura Ejemplo: "V" o "35488" |
| origin_sale_date | String | Opcional | En caso de querer cambiar la fecha en la que se realizó la venta o cotización para nuestro cliente. Este campo debe ingresarse con el siguiente formato: "2025-11-15" |
| due_date | String | Opcional | En caso de querer cambiar la fecha límite en la que la venta podrá ser facturada. Este campo debe ingresarse con el siguiente formato: "2025-03-14" |
| payment_way | String | Opcional | Aquí podemos editar la forma de pago que tendrá la venta o cotización, utilizando las claves del SAT para las Formas de pago . Ejemplo: "01" (Efectivo) |
| method_payment | String | Opcional | En caso de querer cambiar el método de pago que tendrá la venta al ser facturada, puede ser PUE (pago en una sola exhibición) o PPD (Pago en parcialidades o diferido). Ejemplo: "PPD" |
| client_id | String | Opcional | Campo para cambiar el UID del receptor (cliente) con el que se editara el borrador o cotización, este campo podemos validarlo al listar nuestro catálogo de clientes. Ejemplo: "690cd2d62479e" |
| invoice_serie_id | String | Opcional | En este campo podemos cambiar el nombre de la serie con el que queremos que se timbre la factura de la venta, también puede enviarse el id de la serie, puedes ver tus series disponibles siguiendo esta documentación Series esta serie es distinta a la de la cotización o venta, es la serie con la que podrás ver la factura final. Ejemplo: "F" o "20783" |
| status | String | Opcional | Campo para marcar el estatus que tendrá la venta que estamos creando, hay 3 posibilidades: vendido cotizacion borrador |
| details | array | Opcional | Es un arreglo de objetos, en el que cada objeto corresponde a un concepto con sus atributos para agregar a la venta.
|
Construcción del concepto
A continuación se describen los atributos que deben incluirse en el nodo Details
Para cada concepto es necesario incluir los siguientes atributos:
| Parámetro | Tipo | Requerido | Detalles |
|---|---|---|---|
| quantity | number | Opcional | 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 | Opcional | 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 | Opcional | Se puede utilizar para definir el tipo de impuesto que aplica al concepto facturado.02 |
| unit_sat_id | String | Opcional | Indica la clave de la unidad de medida correspondiente al concepto. |
| product_sat_id | String | Opcional | Indica la clave del producto o servicio correspondiente al concepto. |
| description | String | Opcional | 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: |
Ejemplo de Details
"details": [
{
"quantity": 5,
"amount": 126.50,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Tapete de entrenamiento",
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal"
}
]
}
]
Construcción de los impuestos
A continuación se describen los atributos que deben incluirse en el nodo de taxes, actualmente solo pueden utilizarse impuestos de traslado y no de retención.
| Parámetro | Tipo | Requerido | Opcional |
|---|---|---|---|
| name | String | Opcional | 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 | Opcional | Corresponde a la tasa con la que se calculara el impuesto que se está agregando. |
| type | String | Opcional | Indica el tipo de impuesto que se está agregando, puede ser "Federal" (IVA o IEPS) o "Local". |
Ejemplo de Taxes
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal"
},
{
"name": "Impuesto local",
"tasa": "10",
"type": "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: /360/sales
Ejemplo: https://api.factura.com/360/sales
Ejemplo para editar cotizaciones dentro de Factura360
<?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 => 'PATCH',
CURLOPT_POSTFIELDS =>'{
"uuid": "544e84a1-96cb-4114-959e-999d7b116609",
"serie_id": "26928",
"origin_sale_date": "2025-11-23",
"due_date": "2025-11-30",
"payment_way": "04",
"method_payment": "PUE",
"client_id": "RAQÑ7701212M3",
"invoice_serie_id": "F",
"status": "cotizacion",
"details": [
{
"quantity": 6,
"amount": 1434,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Pts deportivos",
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal"
}
]
},
{
"quantity": 2,
"amount": 700,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Espinilleras",
"taxes": [
{
"name": "IVA",
"tasa": "8",
"type": "Federal"
}
]
}
]
}',
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': 'PATCH',
'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": "544e84a1-96cb-4114-959e-999d7b116609",
"serie_id": "26928",
"origin_sale_date": "2025-11-23",
"due_date": "2025-11-30",
"payment_way": "04",
"method_payment": "PUE",
"client_id": "RAQÑ7701212M3",
"invoice_serie_id": "F",
"status": "cotizacion",
"details": [
{
"quantity": 6,
"amount": 1434,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Pts deportivos",
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal"
}
]
},
{
"quantity": 2,
"amount": 700,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Espinilleras",
"taxes": [
{
"name": "IVA",
"tasa": "8",
"type": "Federal"
}
]
}
]
})
};
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": "544e84a1-96cb-4114-959e-999d7b116609",
"serie_id": "26928",
"origin_sale_date": "2025-11-23",
"due_date": "2025-11-30",
"payment_way": "04",
"method_payment": "PUE",
"client_id": "RAQÑ7701212M3",
"invoice_serie_id": "F",
"status": "cotizacion",
"details": [
{
"quantity": 6,
"amount": 1434,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Pts deportivos",
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal"
}
]
},
{
"quantity": 2,
"amount": 700,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Espinilleras",
"taxes": [
{
"name": "IVA",
"tasa": "8",
"type": "Federal"
}
]
}
]
})
headers = {
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key',
'Content-Type': 'application/json'
}
response = requests.request("PATCH", 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::Patch.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": "544e84a1-96cb-4114-959e-999d7b116609",
"serie_id": "26928",
"origin_sale_date": "2025-11-23",
"due_date": "2025-11-30",
"payment_way": "04",
"method_payment": "PUE",
"client_id": "RAQÑ7701212M3",
"invoice_serie_id": "F",
"status": "cotizacion",
"details": [
{
"quantity": 6,
"amount": 1434,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Pts deportivos",
"taxes": [
{
"name": "IVA",
"tasa": "16",
"type": "Federal"
}
]
},
{
"quantity": 2,
"amount": 700,
"tax_applicability": "02",
"unit_sat_id": "H87",
"product_sat_id": "50202300",
"description": "Espinilleras",
"taxes": [
{
"name": "IVA",
"tasa": "8",
"type": "Federal"
}
]
}
]
})
response = http.request(request)
puts response.read_body
Respuestas al editar una cotización
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 cotización
{
"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 cotización
A continuación se explica como funciona el método con el cual podrás eliminar una cotización o borrador en tu módulo de Factura 360.
Importante
Solo las cotizaciones con estado 'borrador' o 'cotización' pueden eliminarse. Si ya tienen el estatus 'vendido', no será posible eliminarlas.
Podemos eliminar las cotizaciones en nuestro módulo haciendo uso del siguiente parámetro:
| Parametro | Tipo | Requerido | Detallles |
|---|---|---|---|
| uuid | String | Requerido | Debemos enviar el uuid de la cotización que queremos eliminar, este dato podemos obtenerlo al usar el metodo de listar Ejemplo: "330be0e8-82a7-417b-907c-2bd8516c5f79" |
Tip
Importante el metodo para eliminar una cotización es de tipo DELETE
Construcción de la URL
Host: https://api.factura.com (producción) / https://sandbox.factura.com/api (sandbox)
Endpoint: /360/sales
Ejemplo: https://api.factura.com/360/sales
Ejemplo para eliminar una cotización
<?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 cotización
Respuesta Exitosa
{
"response": "success",
"message": "Registro eliminado exitosamente"
}
Respuesta erronea cuando no se encuentra la cotización
{
"response": "error",
"message": "El registro no existe"
}