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

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.


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",
         }
       ]
     }
   ]
}

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

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".

 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",
}
]

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.

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".

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.


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",
         }
       ]
     }
   ]
}

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

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 Opcional

 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 Opcional

 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".

 description String Opcional

 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",
}
]

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.

Ejemplo:
"name": "IVA".

 tasa String Opcional

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

Ejemplo:
"tasa": "16".

 type String Opcional

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

Ejemplo:
"type": "Federal".

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"
}
Prev
Autofacturación Pro
Next
Referencias de pago