Addendas
A continuación se explica como agregar una addenda a uno de nuestros CFDI, para crear una addenda son necesarios los siguientes puntos:
- Tener un CFDI creado previamente
- Conocer el UID que corresponde al CFDI que se le agregara esta addenda
Importante
Las addendas disponibles pueden tener algunas similitudes, pero varían en cuanto a información o construcción dependiendo de la marca a la que pertenece por lo que recomendamos revisar con cuidado la sección de la addenda en la que estás interesado.
Mabe
Asi podremos crear una addenda de Mabe, con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de Mabe seran necesarios los siguientes parametros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Es el identificador del CFDI al cual se le agregara la addenda |
mabe | Arreglo | Requerido | Contiene la informacion que se añade a la addenda de Mabe |
Factura | Arreglo | Requerido | Es el arreglo que contiene la informacion de la factura |
tipoDocumento | String | Requerido | Asignado a Factura corresponde a el tipo de documento del que se trata |
folio | String | Opcional | Corresponde al folio de la factura |
fecha | String | Opcional | La fecha de creación |
ordenCompra | String | Opcional | Indica el numero de la orden de compra |
referencia1 | String | Opcional | Opcionales se puede añadir una referencia en este campo |
referencia2 | String | Opcional | Opcionales se puede añadir una referencia en este campo |
Moneda | Arreglo | Opcional | Contiene la informacion de la moneda con la que se realizo el CFDI |
tipoMoneda | String | Opcional | Indica el tipo de moneda que se utiliza |
tipoCambio | String | Opcional | Indica el tipo de cambio para la moneda |
importeConLetra | String | Opcional | Campo para especificar con letra el importe |
Proveedor | Arreglo | Opcional | Ccontiene la informacion del proveedor |
codigo | String | Opcional | Indica el codigo con el cual identificar al proveedor |
Entrega | Arreglo | Opcional | Contiene la informacion de donde sera entregado el producto de la factura |
plantaEntrega | String | Opcional | Indica la planta donde se realizara la entrega |
calle | String | Opcional | Indica la calle donde se localiza la planta |
noExterior | String | Opcional | El numero exterior del domicilio de entrega |
noInterior | String | Opcional | El numero interiro del domicilio de entrega |
codigoPostal | String | Opcional | Codigo postal del domicilio de entrega |
Detalles | Arreglo | Opcional | Contiene los campos para dar mas detalles sobre la mercancia |
noLineaArticulo | String | Opcional | Linea a la que pertenece el articulo |
codigoArticulo | String | Opcional | Codigo con el cual se identifica el articulo |
descripcion | String | Opcional | Descripcion de el articulo |
unidad | String | Opcional | Indica la unidad correspondiente a los articulos |
cantidad | String | Opcional | Indica la cantidad de articulos correspondientes a la factura |
precioSinIva | String | Opcional | Indica el precio sin IVA |
importeConIva | String | Opcional | Indica el precio con IVA |
Descuentos | Arreglo | Opcional | Contiene los campos que especifican si contienen algun descuento los articulos |
tipo | String | Opcional | Indica de que tipo de descuento se trata |
descripcion | String | Opcional | Espacio para incluir una descripcion del descuento |
importe | String | Opcional | Indica el importe del descuento |
Subtotal | Arreglo | Opcional | Contiene los campos del subtotal |
importe | String | Opcional | Indica el subtotal de los articulos |
Traslados | Arreglo | Opcional | Contiene la informacion del costo del traslado |
tipo | String | Opcional | Indica el tipo de impuesto que incluye el traslado |
tasa | String | Opcional | La tasa con la cual se evalua el porcentaje de impuesto al traslado |
importe | String | Opcional | El importe del traslado |
Retenciones | Arreglo | Opcional | Contiene los campos de las retenciones que se aplican a los articulos |
tipo | String | Opcional | Indica el tipo de impuesto que incluye la retencion |
tasa | String | Opcional | La tasa con la cual se evalua el porcentaje de impuesto de la retencion |
importe | String | Opcional | El importe de la retencion |
Total | Arreglo | Opcional | Contiene los campos del total de los cargos |
importe | String | Opcional | Indica el total de los cargos de nuestra addenda |
Construcción de la URL
Importante
Importante el metodo para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/mabe/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/mabe/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Mabe
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/mabe/store',
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 =>'{
"invoice": "6206cc43d36fe",
"mabe": {
"Factura":{
"tipoDocumento":"FACTURA",
"folio":"D3912",
"fecha":"2020-07-02",
"ordenCompra":"9500000700",
"referencia1":"D3932",
"referencia2":"NA"
},
"Moneda":{
"tipoMoneda":"MXN",
"tipoCambio":"0.00",
"importeConLetra":"UN PESO 16/100 M.N."
},
"Proveedor":{
"codigo":"4000000"
},
"Entrega":{
"plantaEntrega":"A090",
"calle":"INDUSTRIAS",
"noExterior":"3835",
"noInterior":"NA",
"codigoPostal":"78395"
},
"Detalles":[
{
"noLineaArticulo":"1",
"codigoArticulo":"NA",
"descripcion":"SER DE PRUEBA PROV INDIRECTO",
"unidad":"UN",
"cantidad":"1",
"precioSinIva":"1.00",
"precioConIva":"2.00",
"importeSinIva":"1.16",
"importeConIva":"1.00"
}
],
"Descuentos":{
"tipo":"CARGO",
"descripcion":"NA",
"importe":"0.00"
},
"Subtotal":{
"importe":"1.00"
},
"Traslados":[
{
"tipo":"IVA",
"tasa":"0.16",
"importe":"0.16"
}
],
"Retenciones":[
{
"tipo":"IVA",
"tasa":"0.16",
"importe":"0.16"
}
],
"Total":{
"importe":"1.16"
}
}
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/mabe/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "6206cc43d36fe",
"mabe": {
"Factura": {
"tipoDocumento": "FACTURA",
"folio": "D3912",
"fecha": "2020-07-02",
"ordenCompra": "9500000700",
"referencia1": "D3932",
"referencia2": "NA"
},
"Moneda": {
"tipoMoneda": "MXN",
"tipoCambio": "0.00",
"importeConLetra": "UN PESO 16/100 M.N."
},
"Proveedor": {
"codigo": "4000000"
},
"Entrega": {
"plantaEntrega": "A090",
"calle": "INDUSTRIAS",
"noExterior": "3835",
"noInterior": "NA",
"codigoPostal": "78395"
},
"Detalles": [
{
"noLineaArticulo": "1",
"codigoArticulo": "NA",
"descripcion": "SER DE PRUEBA PROV INDIRECTO",
"unidad": "UN",
"cantidad": "1",
"precioSinIva": "1.00",
"precioConIva": "2.00",
"importeSinIva": "1.16",
"importeConIva": "1.00"
}
],
"Descuentos": {
"tipo": "CARGO",
"descripcion": "NA",
"importe": "0.00"
},
"Subtotal": {
"importe": "1.00"
},
"Traslados": [
{
"tipo": "IVA",
"tasa": "0.16",
"importe": "0.16"
}
],
"Retenciones": [
{
"tipo": "IVA",
"tasa": "0.16",
"importe": "0.16"
}
],
"Total": {
"importe": "1.16"
}
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/mabe/store"
payload = json.dumps({
"invoice": "6206cc43d36fe",
"mabe": {
"Factura": {
"tipoDocumento": "FACTURA",
"folio": "D3912",
"fecha": "2020-07-02",
"ordenCompra": "9500000700",
"referencia1": "D3932",
"referencia2": "NA"
},
"Moneda": {
"tipoMoneda": "MXN",
"tipoCambio": "0.00",
"importeConLetra": "UN PESO 16/100 M.N."
},
"Proveedor": {
"codigo": "4000000"
},
"Entrega": {
"plantaEntrega": "A090",
"calle": "INDUSTRIAS",
"noExterior": "3835",
"noInterior": "NA",
"codigoPostal": "78395"
},
"Detalles": [
{
"noLineaArticulo": "1",
"codigoArticulo": "NA",
"descripcion": "SER DE PRUEBA PROV INDIRECTO",
"unidad": "UN",
"cantidad": "1",
"precioSinIva": "1.00",
"precioConIva": "2.00",
"importeSinIva": "1.16",
"importeConIva": "1.00"
}
],
"Descuentos": {
"tipo": "CARGO",
"descripcion": "NA",
"importe": "0.00"
},
"Subtotal": {
"importe": "1.00"
},
"Traslados": [
{
"tipo": "IVA",
"tasa": "0.16",
"importe": "0.16"
}
],
"Retenciones": [
{
"tipo": "IVA",
"tasa": "0.16",
"importe": "0.16"
}
],
"Total": {
"importe": "1.16"
}
}
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/mabe/store")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "6206cc43d36fe",
"mabe": {
"Factura": {
"tipoDocumento": "FACTURA",
"folio": "D3912",
"fecha": "2020-07-02",
"ordenCompra": "9500000700",
"referencia1": "D3932",
"referencia2": "NA"
},
"Moneda": {
"tipoMoneda": "MXN",
"tipoCambio": "0.00",
"importeConLetra": "UN PESO 16/100 M.N."
},
"Proveedor": {
"codigo": "4000000"
},
"Entrega": {
"plantaEntrega": "A090",
"calle": "INDUSTRIAS",
"noExterior": "3835",
"noInterior": "NA",
"codigoPostal": "78395"
},
"Detalles": [
{
"noLineaArticulo": "1",
"codigoArticulo": "NA",
"descripcion": "SER DE PRUEBA PROV INDIRECTO",
"unidad": "UN",
"cantidad": "1",
"precioSinIva": "1.00",
"precioConIva": "2.00",
"importeSinIva": "1.16",
"importeConIva": "1.00"
}
],
"Descuentos": {
"tipo": "CARGO",
"descripcion": "NA",
"importe": "0.00"
},
"Subtotal": {
"importe": "1.00"
},
"Traslados": [
{
"tipo": "IVA",
"tasa": "0.16",
"importe": "0.16"
}
],
"Retenciones": [
{
"tipo": "IVA",
"tasa": "0.16",
"importe": "0.16"
}
],
"Total": {
"importe": "1.16"
}
}
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}
Kuehne + Nagel
Asi podremos crear una addenda de Kuehne + Nagel, con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de Kuehne + Nagel seran necesarios los siguientes parametros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Es el identificador del CFDI al cual se le agregara la addenda |
PurchaseOrder | String | Opcional | Indica el numero o nombre de la orden de los productos |
FileNumber | String | Opcional | Indica el numero identificador de la addenda |
BranchCentre | String | Opcional | Indica el nombre de o identificador de la sucursal |
TransportRef | String | Opcional | Indica el identificador del transporte para la mercancia |
Construcción de la URL
Importante
Importante el metodo para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/kv/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/kv/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Kuehne + Nagel
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/kv/store',
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 =>'{
"invoice":"620ad7851a684",
"PurchaseOrder":"XRS1230KL",
"FileNumber":"A700",
"BranchCentre":"PR0333",
"TransportRef":"09367CDCA"
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/kv/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "620ad7851a684",
"PurchaseOrder": "XRS1230KL",
"FileNumber": "A700",
"BranchCentre": "PR0333",
"TransportRef": "09367CDCA"
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/kv/store"
payload = json.dumps({
"invoice": "620ad7851a684",
"PurchaseOrder": "XRS1230KL",
"FileNumber": "A700",
"BranchCentre": "PR0333",
"TransportRef": "09367CDCA"
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/kv/store")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "620ad7851a684",
"PurchaseOrder": "XRS1230KL",
"FileNumber": "A700",
"BranchCentre": "PR0333",
"TransportRef": "09367CDCA"
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}
Soriana
Asi podremos crear una addenda de Soriana, con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de Soriana seran necesarios los siguientes parametros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Es el identificador del CFDI al cual se le agregara la addenda |
Remision | Arreglo | Opcional | Contiene los datos de Remision del pedido |
Proveedor | String | Opcional | El proveedor de la mercancia |
Remision | String | Opcional | Identificador para la remision |
Consecutivo | String | Opcional | Indica el folio para la remision |
FechaRemision | String | Opcional | Indica la fecha de remision |
Tienda | String | Opcional | Indica la tienda de remision |
TipoMoneda | String | Opcional | El tipo de moneda con el que se llevo la transacción |
TipoBulto | String | Opcional | La forma en la que viene empaquetada la mercancia |
EntregaMercancia | String | Opcional | Indica detalles sobre la entrega de la mercancia |
CumpleReqFiscales | String | Opcional | Indica si cumple con los requerimentos fiscales |
CantidadBultos | String | Opcional | Indica el numero de bultos |
Subtotal | String | Opcional | El subtotal de la mercancia |
Descuentos | String | Opcional | Indica si aplica algun descuento |
IEPS | String | Opcional | Indica el porcentaje de IEPS que aplica |
IVA | String | Opcional | Indica el porcentaje de IVA que aplica |
OtrosImpuestos | String | Opcional | Indica si aplical algun impuesto adicional |
Total | String | Opcional | El total de la mercancia |
CantidadPedidos | String | Opcional | Indica el numero de pedidos |
FechaEntregaMercancia | String | Opcional | La fecha en la que se entrega la mercancia |
Cita | String | Opcional | Apartado para el numero de cita para la entrega |
Pedidos | Arreglo | Opcional | Contiene la informacion de los pedidos |
Proveedor | String | Opcional | El nombre del proveedor del pedido |
Remision | String | Opcional | Folio de remisión que corresponde |
FolioPedido | String | Opcional | El folio del pedio |
Tienda | String | Opcional | Indica la tienda de remision del pedido |
CantidadArticulos | String | Opcional | Indica la cantidad de articulos que incluye el pedido |
Articulos | Arreglo | Opcional | Contiene la informaición de los articulos |
Proveedor | String | Opcional | Indica el proveedor de los articulos |
Remision | String | Opcional | Indentificador de la remisión |
FolioPedido | String | Opcional | El folio del pedido |
Tienda | String | Opcional | Indica la tienda de remision del articulo |
Codigo | String | Opcional | El codigo identificador de el articulo |
CantidadUnidadCompra | String | Opcional | Cantidad de compra |
CostoNetoUnidadCompra | String | Opcional | Costo neto de compra |
PorcentajeIEPS | String | Opcional | Porcentaje de IEPS que aplica |
PorcentajeIVA | String | Opcional | Porcentaje de IVA que aplica |
Construcción de la URL
Importante
El metodo para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/soriana/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/soriana/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Soriana
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/soriana/store',
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 =>'{
"invoice": "620c0b4af0799",
"Remision": {
"Proveedor": "HH&H",
"Remision": "",
"Consecutivo": "",
"FechaRemision": "",
"Tienda": "",
"TipoMoneda": "",
"TipoBulto": "",
"EntregaMercancia": "",
"CumpleReqFiscales": "",
"CantidadBultos": "",
"Subtotal": "",
"Descuentos": "",
"IEPS": "",
"IVA": "",
"OtrosImpuestos": "",
"Total": "",
"CantidadPedidos": "",
"FechaEntregaMercancia": "",
"Cita": ""
},
"Pedidos": [
{
"Proveedor": "",
"Remision": "",
"FolioPedido": "",
"Tienda": "",
"CantidadArticulos": ""
}
],
"Articulos": [
{
"Proveedor": "",
"Remision": "",
"FolioPedido": "",
"Tienda": "",
"Codigo": "",
"CantidadUnidadCompra": "",
"CostoNetoUnidadCompra": "",
"PorcentajeIEPS": "",
"PorcentajeIVA": ""
}
]
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/soriana/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "620c0b4af0799",
"Remision": {
"Proveedor": "HH&H",
"Remision": "",
"Consecutivo": "",
"FechaRemision": "",
"Tienda": "",
"TipoMoneda": "",
"TipoBulto": "",
"EntregaMercancia": "",
"CumpleReqFiscales": "",
"CantidadBultos": "",
"Subtotal": "",
"Descuentos": "",
"IEPS": "",
"IVA": "",
"OtrosImpuestos": "",
"Total": "",
"CantidadPedidos": "",
"FechaEntregaMercancia": "",
"Cita": ""
},
"Pedidos": [
{
"Proveedor": "",
"Remision": "",
"FolioPedido": "",
"Tienda": "",
"CantidadArticulos": ""
}
],
"Articulos": [
{
"Proveedor": "",
"Remision": "",
"FolioPedido": "",
"Tienda": "",
"Codigo": "",
"CantidadUnidadCompra": "",
"CostoNetoUnidadCompra": "",
"PorcentajeIEPS": "",
"PorcentajeIVA": ""
}
]
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/soriana/store"
payload = json.dumps({
"invoice": "620c0b4af0799",
"Remision": {
"Proveedor": "HH&H",
"Remision": "",
"Consecutivo": "",
"FechaRemision": "",
"Tienda": "",
"TipoMoneda": "",
"TipoBulto": "",
"EntregaMercancia": "",
"CumpleReqFiscales": "",
"CantidadBultos": "",
"Subtotal": "",
"Descuentos": "",
"IEPS": "",
"IVA": "",
"OtrosImpuestos": "",
"Total": "",
"CantidadPedidos": "",
"FechaEntregaMercancia": "",
"Cita": ""
},
"Pedidos": [
{
"Proveedor": "",
"Remision": "",
"FolioPedido": "",
"Tienda": "",
"CantidadArticulos": ""
}
],
"Articulos": [
{
"Proveedor": "",
"Remision": "",
"FolioPedido": "",
"Tienda": "",
"Codigo": "",
"CantidadUnidadCompra": "",
"CostoNetoUnidadCompra": "",
"PorcentajeIEPS": "",
"PorcentajeIVA": ""
}
]
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/soriana/store")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "620c0b4af0799",
"Remision": {
"Proveedor": "HH&H",
"Remision": "",
"Consecutivo": "",
"FechaRemision": "",
"Tienda": "",
"TipoMoneda": "",
"TipoBulto": "",
"EntregaMercancia": "",
"CumpleReqFiscales": "",
"CantidadBultos": "",
"Subtotal": "",
"Descuentos": "",
"IEPS": "",
"IVA": "",
"OtrosImpuestos": "",
"Total": "",
"CantidadPedidos": "",
"FechaEntregaMercancia": "",
"Cita": ""
},
"Pedidos": [
{
"Proveedor": "",
"Remision": "",
"FolioPedido": "",
"Tienda": "",
"CantidadArticulos": ""
}
],
"Articulos": [
{
"Proveedor": "",
"Remision": "",
"FolioPedido": "",
"Tienda": "",
"Codigo": "",
"CantidadUnidadCompra": "",
"CostoNetoUnidadCompra": "",
"PorcentajeIEPS": "",
"PorcentajeIVA": ""
}
]
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}
Soriana simplificada
Asi podremos crear una addenda de Soriana simplificada, con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de Soriana simplificada seran necesarios los siguientes parametros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Es el identificador del CFDI al cual se le agregara la addenda |
Proveedor | String | Opcional | Indentificador del proveedor de la mercancia |
FolioPedido | String | Opcional | Indica el folio correspondiente a el pedido al que se genera el CFDI |
Construcción de la URL
Importante
El método para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/sorianasimp/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/sorianasimp/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Soriana simplificada
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/sorianasimp/store',
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 =>'{
"invoice": "620c0b4af0799",
"Proveedor": "nombre Proveedor",
"FolioPedido": "numero de pedido"
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/sorianasimp/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "620c0b4af0799",
"Proveedor": "nombre Proveedor",
"FolioPedido": "numero de pedido"
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/sorianasimp/store"
payload = json.dumps({
"invoice": "620c0b4af0799",
"Proveedor": "nombre Proveedor",
"FolioPedido": "numero de pedido"
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/sorianasimp/store")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "620c0b4af0799",
"Proveedor": "nombre Proveedor",
"FolioPedido": "numero de pedido"
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}
City Fresko
Asi podremos crear una addenda de City Fresko, con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de City Fresko seran necesarios los siguientes parametros:
Parametro | Tipo | Requerido | Detalles |
---|---|---|---|
Invoice | String | Requerido | Es el identificador del CCFDI al cual se le agregara la addenda |
cityFresko | Arreglo | Requerido | Es el arreglo principal de la addenda y contiene toda la informacion relacionada a esta |
requestForPayment | Arreglo | Requerido | Es el arreglo que contiene la informacion del tipo de documento |
documentStatus | String | Requerido | Indica el tipo de documento que generamos, puede ser: ORIGINAL DELETE COPY REEMPLAZA |
DeliveryDate | String | Requerido | Se utiliza para indicar la fecha en la que se entrega el documento, utiliza el siguiente formato: "2023-01-23" |
requestForPaymentIdentification | Arreglo | Requerido | Es el arreglo que contiene la informacion que especcifica el tipo de transaccion |
entityType | String | Requerido | Se utiliza para indicar el tipo de documento que se genero ejemplo: "INVOICE" para las Facturas |
uniqueCreatorIdentification | String | Requerido | Lo utilizamos para ingresar un identificador para nuestro documento |
specialInstruction | Arreglo | Requerido | Arreglo que contiene la informacion para señalar instrucciones especiales |
code | String | Requerido | Pertenece a "specialInstruction" y se utilliza para indicar las condiciones para estas instrucciones, acepta las siguientes opciones: "AAB" - Condiciones de pago "DUT" - Informacion de impuestos (Pedimentos) "PUR" - Informacion de compras "ZZZ" - Importe con letra |
text | String | Requerido | Pertenece a "specialInstruction" y se utiliza para ingresar la descripcion relacionada al codigo que creamos anteriormente |
orderIdentification | Arreglo | Requerido | Es el arreglo que contiene la informacion que especifica |
referenceIdentification | String | Requerido | Indica el numero de oden de compra(comprador) a la que hace referencia la factura |
ReferenceDate | String | Opcional | Indica la feca de la orden de compra(comprador) a la que hace referencia la factura, utiliza el siguiente formato: "2023-01-13" |
AdditionalInformation | Arreglo | Requerido | Arreglo que contiene las referencias adicionales a nivel global de la factura |
referenceIdentification | String | Requerido | Indica el numero de referencia global |
type | String | Requerido | Es el tipo al que corresponde la referencia adicional de acuerdo al tipo de documento |
buyer | Arreglo | Requerido | Es el arreglo que contiene la informacion correspondiente a el comprado |
gln | String | Requerido | Dentro de buyer especifica el numero global de localizacion (GLN) del comprador |
text | String | Requerido | Dentro de buyer especifica el nombre del contacto de compras |
seller | Arreglo | Requerido | Es el arreglo que contiene la informacion correspondiente a el proveedor |
gln | String | Requerido | Dentro de seller especifica el numero global de localizacion (GLN) del proveedor |
alternatePartyIdentification | String | Requerido | Dentro de seller especifica el ccodigo para identificar que tipo de dentificacion secundaria se le asigno al proveedor |
type | String | Requerido | Dentro de seller especifica el tipo a el que pertenece el proveedor |
shipTo | Arreglo | Requerido | Es el arreglo que contiene la ubicacion donde debe realizarse la entrega de la mercancia |
gln | String | Requerido | Dentro de shipTo especifica el numero global de localizacion (GLN) de la ubicacion a entregar la mercancia |
address | Arreglo | Opcional | Dentro de shipTo es el arreglo que cotiene la informacion con el nombre y direccion de la ubicacion donde debe realizarse la entrega |
name | String | Opcional | Dentro de address especifica la razon social de la empresa donde se va a embarcar en caso de ser diferente al comprado, o el nombre de la bodega o cento de distribucion |
streetAddressOne | String | Opcional | Dentro de address especifica el domicilio a donde se embarcara la mercancia: Calle, numero exterior, numero interior y colonias |
city | String | Opcional | Dentro de address especifiica la ciudad donde se encuentra el ddomicilio a donde se embarcara la mercancia |
postalCode | String | Opcional | Dentro de address especifica el codigo postal del domicilio a donde se embarcara la mercancia |
currency | Arreglo | Requerido | Es el arreglo que contiene la informacion relacionada al tipo de divisa utilizada |
currencyFunction | String | Requerido | Dentro de currency especifica el uso de la divisa para el documento, admite los siguienntes valores: "BILLING_CURRENCY" "PRICE_CURRENCY" "PAYMENT_CURRENCY" |
paymentTerms | Arreglo | Opcional | Arreglo que contiene los terminos de pago de la factura |
paymentTermsEvent | String | Opcional | Dentro de paymentTerms especifica como se realizara el evento del pago, admite los siguientes valores: "DATE_OF_INVOICE" "EFFECTIVE_DATE" |
PaymentTermsRelationTime | String | Opcional | Dentro de paymentTerms especifica la relacion tiempo de los terminos de pago |
netPaymentTermsType | String | Opcional | Dentro de paymentTerms especifica las condiciones de pago |
days | String | Opcional | Dentro de paymentTerms especifica |
allowanceCharge | Arreglo | Opcional | Arreglo que contiene la informacion de los cargos o descuentos globales mercantiles por factura |
settlementType | String | Opcional | Dentro de allowanceCharge especifica la imputacion del descuento o cargo, dmite los siguienntes valores: "BILL_BACK" |
allowanceChargeType | String | Opcional | Dentro de allowanceCharge indica el atributo de cargo o descuento, admite los siguientes valores: "ALLOWANCE_GLOBAL" |
specialServicesType | String | Opcional | Dentro de allowanceCharge especifica el tipo de descuento o cargo este elemento se utiliza si el comprador conoce los descuentos,admite los siguientes valore: “AA”, “AJ”, “ADO”, “ADT”, “ADS”, “ABZ”, “DA”, “EAA”, “EAB”, “PI”, “TAE”, “SAB”, “RAA”, “PAD”, “FG”, “FA”, “TD”, “TS”, “TX”, “TZ”, “ZZZ”, “VAB”, “UM”, “DI”, “CAC”, “COD”, “EAB”, “FC”, “FI”, “HD”, “QD” |
monetaryAmountOrPercentage | Arreglo | Opcional | Aarreglo que contiene la informacion de la cantidad monetaria o porcentaje del descuento |
rate | String | Opcional | Dentro de monetaryAmountOrPercentage este elemento especifica la tarifa |
percentage | String | Opcional | Dentro de monetaryAmountOrPercentage especifica el porcentaje de descuento que se esta aplicando segun se ha indicado en el campo anterior a toda la factura |
lineItems | Arreglo | Opcional | Es el arreglo qu contiene la informacion de la linea de detalle de la factura |
type | String | Requerido | dentro de lineItems especifica el tipo de linea de detalle |
number | String | Requerido | Dentro de lineItems especifica el numero secuencial que se asigna a cada linea de detalle |
tradeItemIdentification | String | Requerido | Dentro de lineItems especifica la identificacion de cada articulo |
alternateTradeItemIdentification | Arreglo | Opcional | Dentro de lineItems es el arreglo que contiene la informacion del numero de iddentificacion adicional para el articulo |
type | String | Requerido | Dentro de alternateTradeItemIdentification es el atributo que especifica el tipo de identiificacion adicional |
value | String | Requerido | Dentro de alternateTradeItemIdentification contiene el valor del indentificador adicional |
tradeItemDescriptionInformation | Arreglo | Opcional | Dentro de lineItems es el arreglo que contiene la informacion de la descripcion del articulo |
language | String | Requerido | Dentro de tradeItemDescriptionInformation es el atributo para especificar el ccodigo del idioma en que esta la descripcion del articulo, admite los siguientes valores "ES" "EN" |
longtext | String | Requerido | Dentro de tradeItemDescriptionInformation es el atributo que especifica la descripcion del articulo solicitado |
invoicedQuantity | String | Requerido | Dentro de lineItems especifica la cantidad facturada del producto en la linea de articulo actual |
unitOfMeasure | String | Requerido | Dentro de lineItems especifica la unidad de medida, solo si el articulo es de unidad variable |
aditionalQuantity | String | Requerido | Dentro de lineItems especifica la ccantiddad facturada del producto en la lina de articulo actual |
grossPrice | String | Requerido | Dentro de lineItems especifica la declaracion del precio bruto |
netPrice | String | Requerido | Dentro de lineItems especifica la declaracion del precio neto |
AdditionalInformation | Arreglo | Opcional | Dentro de lineItems es el arreglo que contiene la informacion adicional de referencia en el detalle de productos |
referencceIdentification | String | Requerido | Dentro de AdditionalInformation especifica la referencia adicional de los productos |
type | String | Requerido | Dentro de AdditionalInformation especifica el tipo de referencia |
tradeItemTaxInformation | Arreglo | Opcional | Dentro de lineItems es el arreglo que contiene la informacion de los impuestos por cadda linea de articulo |
taxTypeDescription | String | Requerio | Dentro de tradeItemTaxInformation especifica el tipo dde arancel, impuesto o cutoa |
tradeItemTaxAmount | Arreglo | Opcional | Dentro de tradeItemTaxInformation es el arreglo que contiene la informacion del importe o porcentaje del descuento |
taxPercentage | String | Requerido | Dentro de tradeItemTaxAmount especifica el porcentaje del impuesto |
taxAmount | String | Requerido | Dentro de tradeItemTaxAmount especifica el monto del impuesto |
totalLineAmount | Arreglo | Requerido | Dentro de lineItems es el arreglo que contiene la informacion de los importes monetarios por linea de articulo |
grossAmount | String | Opccional | Dentro de totalLineAmount especifica el importe bruto |
netAmount | String | Requerido | Dentro de totalLineAmount specifica el importe neto |
totalAmount | String | Opcional | Especifica el monto total de las lineas de articulos |
baseAmount | String | Requerido | Especifica el monto |
tax | Arreglo | Requerido | Es el arreglo que contiene la informacion de de los impuestos aplicados a el documento |
type | String | Requerido | Dentro de tax especifica el tipo de impuesto aplicado a el documento |
taxPercentage | String | Requerido | Dentro de tax especifica el porcentaje del impuesto que se selecciono en el campo anterior |
taxAmount | String | Requerido | Dentro de tax especifica el importe del impuesto basado en el porcentaje anterior |
taxCategory | String | Requerido | Dentro de tax especifica la categoria a la que pertenece el impuesto declarado |
payableAmount | String | Requerido | Especifica el total pagable de la factura |
Construcción de la URL
Importante
El método para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/cityfresko/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/cityfresko/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de City Fresko
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/cityfresko/store',
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 =>'{
"invoice": "bef24401-05e6-4ccb-b3aa-4a0343f1c0a6",
"cityFresko":{
"requestForPayment": {
"documentStatus": "ORIGINAL",
"DeliveryDate": "2023-01-13"
},
"requestForPaymentIdentification": {
"entityType": "INVOICE",
"uniqueCreatorIdentification": "UNIQUEIDAAPI123"
},
"specialInstruction": [
{
"code": "AAB",
"text": "PAGO A 5 DIAS"
},
{
"code": "PUR",
"text": "CLIENNTE FRECUENTE"
},
{
"code": "DUT",
"text": "IMPUESTOS RELACIONADOS"
},
{
"code": "ZZZ",
"text": "QUINIENTOS CINCUENTA Y CINCO"
}
],
"orderIdentification": {
"referenceIdentification": "CUSTOMORDER API 12345",
"ReferenceDate": "2023-01-13"
},
"AdditionalInformation": [
{
"referenceIdentification": "REFERENCIA NUMERO DDE FACTURA123",
"type": "IV"
},
{
"referenceIdentification": "REFERENCIA NUMERO DOC123",
"type": "ACE"
},
{
"referenceIdentification": "REFERENCIA CHEQUE123",
"type": "CK"
},
{
"referenceIdentification": "REFERENCIA PREDIAL123",
"type": "AAE"
}
],
"buyer": {
"gln": "BUYERGLN123456",
"text": "LUIS QUINTERO"
},
"seller": {
"gln": "SELLERGLN123456",
"alternatePartyIdentification": "ALTPARTYIDD123",
"type": "IEPS_REFERENCE"
},
"shipTo": {
"gln": "GLNSHIPMENT1234",
"address": {
"name": "LUIS QUINTERO CO.",
"streetAddressOne": "CALLE CORAL AZUL",
"city": "GUADALAJARA",
"postalCode": "44790"
}
},
"currency": {
"currencyFunction": "PRICE_CURRENCY"
},
"paymentTerms": {
"paymentTermsEvent": "EFECTIVE_DATE",
"PaymentTermsRelationTime": "REFERENCE_BEFORE",
"netPaymentTermsType":"END_OF_MONTH",
"days": "2"
},
"allowanceCharge": {
"settlementType": "OFF_INVOICE",
"allowanceChargeType": "ALLOWANCE_GLOBAL",
"specialServicesType": "ZZZ",
"monetaryAmountOrPercentage": {
"rate": "INVOICE_VALUE",
"percentage": "2345.67"
}
},
"lineItems": [
{
"type": "SimpleInvoiceLineItemType",
"number": "0",
"tradeItemIdentification": "GTINPROD1",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD1"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 0"
},
"invoicedQuantity": "10",
"unitOfMeasure": "1.0",
"aditionalQuantity": "10",
"grossPrice": "",
"netPrice": "11.00",
"AdditionalInformation": {
"referenceIdentification": "REFPROD1",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "GST",
"tradeItemTaxAmount": {
"taxPercentage": "10.00",
"taxAmount": "1.00"
}
},
"totalLineAmount": {
"grossAmount": "100",
"netAmount": "110"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "2",
"tradeItemIdentification": "GTINPROD1",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD1"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 1"
},
"invoicedQuantity": "10",
"unitOfMeasure": "1.0",
"aditionalQuantity": "",
"grossPrice": "10.00",
"netPrice": "",
"AdditionalInformation": {
"referenceIdentification": "REFPROD1",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "GST",
"tradeItemTaxAmount": {
"taxPercentage": "10.00",
"taxAmount": "1.00"
}
},
"totalLineAmount": {
"grossAmount": "100",
"netAmount": "110"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "3",
"tradeItemIdentification": "GTINPROD2",
"alternateTradeItemIdentification": {
"type": "BUYER_ASSIGNED",
"value": "NUMALTPROD2"
},
"tradeItemDescriptionInformation": {
"language": "EN",
"longText": "DESCRIPCION PRODUCTO 2"
},
"invoicedQuantity": "10",
"unitOfMeasure": "2.0",
"aditionalQuantity": "10",
"grossPrice": "",
"netPrice": "",
"AdditionalInformation": {
"referenceIdentification": "REFPROD2",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "VAT",
"tradeItemTaxAmount": {
"taxPercentage": "16.00",
"taxAmount": "3.20"
}
},
"totalLineAmount": {
"grossAmount": "200",
"netAmount": "232"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "4",
"tradeItemIdentification": "GTINPROD3",
"alternateTradeItemIdentification": {
"type": "123",
"value": "123"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 3"
},
"invoicedQuantity": "10",
"unitOfMeasure": "3.0",
"aditionalQuantity": "10",
"grossPrice": "0.00",
"netPrice": "30.75",
"AdditionalInformation": {
"referenceIdentification": "REFPROD3",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "LAC",
"tradeItemTaxAmount": {
"taxPercentage": "02.50",
"taxAmount": "00.75"
}
},
"totalLineAmount": {
"grossAmount": "300",
"netAmount": "307.5"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "5",
"tradeItemIdentification": "GTINPROD4",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD4"
},
"tradeItemDescriptionInformation": {
"language": "EN",
"longText": "DESCRIPCION PRODUCTO 4"
},
"invoicedQuantity": "10",
"unitOfMeasure": "4.0",
"aditionalQuantity": "10",
"grossPrice": "40.00",
"netPrice": "44.80",
"AdditionalInformation": {
"referenceIdentification": "REFPROD4",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "AAA",
"tradeItemTaxAmount": {
"taxPercentage": "12.00",
"taxAmount": "48.00"
}
},
"totalLineAmount": {
"grossAmount": "400",
"netAmount": "448"
}
}
],
"totalAmount": "1234567.89",
"baseAmount": "123456.00",
"tax": [
{
"type": "GST",
"taxPercentage": "10",
"taxAmount": "10",
"taxCategory": "TRANSFERIDO"
},
{
"type": "VAT",
"taxPercentage": "16",
"taxAmount": "32",
"taxCategory": "TRANSFERIDO"
},
{
"type": "LAC",
"taxPercentage": "02.50",
"taxAmount": "07.50",
"taxCategory": "TRANSFERIDO"
},
{
"type": "AAA",
"taxPercentage": "12.00",
"taxAmount": "48.00",
"taxCategory": "TRANSFERIDO"
}
],
"payableAmount": "123456789"
}
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/cityfresko/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "bef24401-05e6-4ccb-b3aa-4a0343f1c0a6",
"cityFresko": {
"requestForPayment": {
"documentStatus": "ORIGINAL",
"DeliveryDate": "2023-01-13"
},
"requestForPaymentIdentification": {
"entityType": "INVOICE",
"uniqueCreatorIdentification": "UNIQUEIDAAPI123"
},
"specialInstruction": [
{
"code": "AAB",
"text": "PAGO A 5 DIAS"
},
{
"code": "PUR",
"text": "CLIENNTE FRECUENTE"
},
{
"code": "DUT",
"text": "IMPUESTOS RELACIONADOS"
},
{
"code": "ZZZ",
"text": "QUINIENTOS CINCUENTA Y CINCO"
}
],
"orderIdentification": {
"referenceIdentification": "CUSTOMORDER API 12345",
"ReferenceDate": "2023-01-13"
},
"AdditionalInformation": [
{
"referenceIdentification": "REFERENCIA NUMERO DDE FACTURA123",
"type": "IV"
},
{
"referenceIdentification": "REFERENCIA NUMERO DOC123",
"type": "ACE"
},
{
"referenceIdentification": "REFERENCIA CHEQUE123",
"type": "CK"
},
{
"referenceIdentification": "REFERENCIA PREDIAL123",
"type": "AAE"
}
],
"buyer": {
"gln": "BUYERGLN123456",
"text": "LUIS QUINTERO"
},
"seller": {
"gln": "SELLERGLN123456",
"alternatePartyIdentification": "ALTPARTYIDD123",
"type": "IEPS_REFERENCE"
},
"shipTo": {
"gln": "GLNSHIPMENT1234",
"address": {
"name": "LUIS QUINTERO CO.",
"streetAddressOne": "CALLE CORAL AZUL",
"city": "GUADALAJARA",
"postalCode": "44790"
}
},
"currency": {
"currencyFunction": "PRICE_CURRENCY"
},
"paymentTerms": {
"paymentTermsEvent": "EFECTIVE_DATE",
"PaymentTermsRelationTime": "REFERENCE_BEFORE",
"netPaymentTermsType": "END_OF_MONTH",
"days": "2"
},
"allowanceCharge": {
"settlementType": "OFF_INVOICE",
"allowanceChargeType": "ALLOWANCE_GLOBAL",
"specialServicesType": "ZZZ",
"monetaryAmountOrPercentage": {
"rate": "INVOICE_VALUE",
"percentage": "2345.67"
}
},
"lineItems": [
{
"type": "SimpleInvoiceLineItemType",
"number": "0",
"tradeItemIdentification": "GTINPROD1",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD1"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 0"
},
"invoicedQuantity": "10",
"unitOfMeasure": "1.0",
"aditionalQuantity": "10",
"grossPrice": "",
"netPrice": "11.00",
"AdditionalInformation": {
"referenceIdentification": "REFPROD1",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "GST",
"tradeItemTaxAmount": {
"taxPercentage": "10.00",
"taxAmount": "1.00"
}
},
"totalLineAmount": {
"grossAmount": "100",
"netAmount": "110"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "2",
"tradeItemIdentification": "GTINPROD1",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD1"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 1"
},
"invoicedQuantity": "10",
"unitOfMeasure": "1.0",
"aditionalQuantity": "",
"grossPrice": "10.00",
"netPrice": "",
"AdditionalInformation": {
"referenceIdentification": "REFPROD1",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "GST",
"tradeItemTaxAmount": {
"taxPercentage": "10.00",
"taxAmount": "1.00"
}
},
"totalLineAmount": {
"grossAmount": "100",
"netAmount": "110"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "3",
"tradeItemIdentification": "GTINPROD2",
"alternateTradeItemIdentification": {
"type": "BUYER_ASSIGNED",
"value": "NUMALTPROD2"
},
"tradeItemDescriptionInformation": {
"language": "EN",
"longText": "DESCRIPCION PRODUCTO 2"
},
"invoicedQuantity": "10",
"unitOfMeasure": "2.0",
"aditionalQuantity": "10",
"grossPrice": "",
"netPrice": "",
"AdditionalInformation": {
"referenceIdentification": "REFPROD2",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "VAT",
"tradeItemTaxAmount": {
"taxPercentage": "16.00",
"taxAmount": "3.20"
}
},
"totalLineAmount": {
"grossAmount": "200",
"netAmount": "232"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "4",
"tradeItemIdentification": "GTINPROD3",
"alternateTradeItemIdentification": {
"type": "123",
"value": "123"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 3"
},
"invoicedQuantity": "10",
"unitOfMeasure": "3.0",
"aditionalQuantity": "10",
"grossPrice": "0.00",
"netPrice": "30.75",
"AdditionalInformation": {
"referenceIdentification": "REFPROD3",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "LAC",
"tradeItemTaxAmount": {
"taxPercentage": "02.50",
"taxAmount": "00.75"
}
},
"totalLineAmount": {
"grossAmount": "300",
"netAmount": "307.5"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "5",
"tradeItemIdentification": "GTINPROD4",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD4"
},
"tradeItemDescriptionInformation": {
"language": "EN",
"longText": "DESCRIPCION PRODUCTO 4"
},
"invoicedQuantity": "10",
"unitOfMeasure": "4.0",
"aditionalQuantity": "10",
"grossPrice": "40.00",
"netPrice": "44.80",
"AdditionalInformation": {
"referenceIdentification": "REFPROD4",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "AAA",
"tradeItemTaxAmount": {
"taxPercentage": "12.00",
"taxAmount": "48.00"
}
},
"totalLineAmount": {
"grossAmount": "400",
"netAmount": "448"
}
}
],
"totalAmount": "1234567.89",
"baseAmount": "123456.00",
"tax": [
{
"type": "GST",
"taxPercentage": "10",
"taxAmount": "10",
"taxCategory": "TRANSFERIDO"
},
{
"type": "VAT",
"taxPercentage": "16",
"taxAmount": "32",
"taxCategory": "TRANSFERIDO"
},
{
"type": "LAC",
"taxPercentage": "02.50",
"taxAmount": "07.50",
"taxCategory": "TRANSFERIDO"
},
{
"type": "AAA",
"taxPercentage": "12.00",
"taxAmount": "48.00",
"taxCategory": "TRANSFERIDO"
}
],
"payableAmount": "123456789"
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/cityfresko/store"
payload = json.dumps({
"invoice": "bef24401-05e6-4ccb-b3aa-4a0343f1c0a6",
"cityFresko": {
"requestForPayment": {
"documentStatus": "ORIGINAL",
"DeliveryDate": "2023-01-13"
},
"requestForPaymentIdentification": {
"entityType": "INVOICE",
"uniqueCreatorIdentification": "UNIQUEIDAAPI123"
},
"specialInstruction": [
{
"code": "AAB",
"text": "PAGO A 5 DIAS"
},
{
"code": "PUR",
"text": "CLIENNTE FRECUENTE"
},
{
"code": "DUT",
"text": "IMPUESTOS RELACIONADOS"
},
{
"code": "ZZZ",
"text": "QUINIENTOS CINCUENTA Y CINCO"
}
],
"orderIdentification": {
"referenceIdentification": "CUSTOMORDER API 12345",
"ReferenceDate": "2023-01-13"
},
"AdditionalInformation": [
{
"referenceIdentification": "REFERENCIA NUMERO DDE FACTURA123",
"type": "IV"
},
{
"referenceIdentification": "REFERENCIA NUMERO DOC123",
"type": "ACE"
},
{
"referenceIdentification": "REFERENCIA CHEQUE123",
"type": "CK"
},
{
"referenceIdentification": "REFERENCIA PREDIAL123",
"type": "AAE"
}
],
"buyer": {
"gln": "BUYERGLN123456",
"text": "LUIS QUINTERO"
},
"seller": {
"gln": "SELLERGLN123456",
"alternatePartyIdentification": "ALTPARTYIDD123",
"type": "IEPS_REFERENCE"
},
"shipTo": {
"gln": "GLNSHIPMENT1234",
"address": {
"name": "LUIS QUINTERO CO.",
"streetAddressOne": "CALLE CORAL AZUL",
"city": "GUADALAJARA",
"postalCode": "44790"
}
},
"currency": {
"currencyFunction": "PRICE_CURRENCY"
},
"paymentTerms": {
"paymentTermsEvent": "EFECTIVE_DATE",
"PaymentTermsRelationTime": "REFERENCE_BEFORE",
"netPaymentTermsType": "END_OF_MONTH",
"days": "2"
},
"allowanceCharge": {
"settlementType": "OFF_INVOICE",
"allowanceChargeType": "ALLOWANCE_GLOBAL",
"specialServicesType": "ZZZ",
"monetaryAmountOrPercentage": {
"rate": "INVOICE_VALUE",
"percentage": "2345.67"
}
},
"lineItems": [
{
"type": "SimpleInvoiceLineItemType",
"number": "0",
"tradeItemIdentification": "GTINPROD1",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD1"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 0"
},
"invoicedQuantity": "10",
"unitOfMeasure": "1.0",
"aditionalQuantity": "10",
"grossPrice": "",
"netPrice": "11.00",
"AdditionalInformation": {
"referenceIdentification": "REFPROD1",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "GST",
"tradeItemTaxAmount": {
"taxPercentage": "10.00",
"taxAmount": "1.00"
}
},
"totalLineAmount": {
"grossAmount": "100",
"netAmount": "110"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "2",
"tradeItemIdentification": "GTINPROD1",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD1"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 1"
},
"invoicedQuantity": "10",
"unitOfMeasure": "1.0",
"aditionalQuantity": "",
"grossPrice": "10.00",
"netPrice": "",
"AdditionalInformation": {
"referenceIdentification": "REFPROD1",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "GST",
"tradeItemTaxAmount": {
"taxPercentage": "10.00",
"taxAmount": "1.00"
}
},
"totalLineAmount": {
"grossAmount": "100",
"netAmount": "110"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "3",
"tradeItemIdentification": "GTINPROD2",
"alternateTradeItemIdentification": {
"type": "BUYER_ASSIGNED",
"value": "NUMALTPROD2"
},
"tradeItemDescriptionInformation": {
"language": "EN",
"longText": "DESCRIPCION PRODUCTO 2"
},
"invoicedQuantity": "10",
"unitOfMeasure": "2.0",
"aditionalQuantity": "10",
"grossPrice": "",
"netPrice": "",
"AdditionalInformation": {
"referenceIdentification": "REFPROD2",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "VAT",
"tradeItemTaxAmount": {
"taxPercentage": "16.00",
"taxAmount": "3.20"
}
},
"totalLineAmount": {
"grossAmount": "200",
"netAmount": "232"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "4",
"tradeItemIdentification": "GTINPROD3",
"alternateTradeItemIdentification": {
"type": "123",
"value": "123"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 3"
},
"invoicedQuantity": "10",
"unitOfMeasure": "3.0",
"aditionalQuantity": "10",
"grossPrice": "0.00",
"netPrice": "30.75",
"AdditionalInformation": {
"referenceIdentification": "REFPROD3",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "LAC",
"tradeItemTaxAmount": {
"taxPercentage": "02.50",
"taxAmount": "00.75"
}
},
"totalLineAmount": {
"grossAmount": "300",
"netAmount": "307.5"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "5",
"tradeItemIdentification": "GTINPROD4",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD4"
},
"tradeItemDescriptionInformation": {
"language": "EN",
"longText": "DESCRIPCION PRODUCTO 4"
},
"invoicedQuantity": "10",
"unitOfMeasure": "4.0",
"aditionalQuantity": "10",
"grossPrice": "40.00",
"netPrice": "44.80",
"AdditionalInformation": {
"referenceIdentification": "REFPROD4",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "AAA",
"tradeItemTaxAmount": {
"taxPercentage": "12.00",
"taxAmount": "48.00"
}
},
"totalLineAmount": {
"grossAmount": "400",
"netAmount": "448"
}
}
],
"totalAmount": "1234567.89",
"baseAmount": "123456.00",
"tax": [
{
"type": "GST",
"taxPercentage": "10",
"taxAmount": "10",
"taxCategory": "TRANSFERIDO"
},
{
"type": "VAT",
"taxPercentage": "16",
"taxAmount": "32",
"taxCategory": "TRANSFERIDO"
},
{
"type": "LAC",
"taxPercentage": "02.50",
"taxAmount": "07.50",
"taxCategory": "TRANSFERIDO"
},
{
"type": "AAA",
"taxPercentage": "12.00",
"taxAmount": "48.00",
"taxCategory": "TRANSFERIDO"
}
],
"payableAmount": "123456789"
}
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/cityfresko/store")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "bef24401-05e6-4ccb-b3aa-4a0343f1c0a6",
"cityFresko": {
"requestForPayment": {
"documentStatus": "ORIGINAL",
"DeliveryDate": "2023-01-13"
},
"requestForPaymentIdentification": {
"entityType": "INVOICE",
"uniqueCreatorIdentification": "UNIQUEIDAAPI123"
},
"specialInstruction": [
{
"code": "AAB",
"text": "PAGO A 5 DIAS"
},
{
"code": "PUR",
"text": "CLIENNTE FRECUENTE"
},
{
"code": "DUT",
"text": "IMPUESTOS RELACIONADOS"
},
{
"code": "ZZZ",
"text": "QUINIENTOS CINCUENTA Y CINCO"
}
],
"orderIdentification": {
"referenceIdentification": "CUSTOMORDER API 12345",
"ReferenceDate": "2023-01-13"
},
"AdditionalInformation": [
{
"referenceIdentification": "REFERENCIA NUMERO DDE FACTURA123",
"type": "IV"
},
{
"referenceIdentification": "REFERENCIA NUMERO DOC123",
"type": "ACE"
},
{
"referenceIdentification": "REFERENCIA CHEQUE123",
"type": "CK"
},
{
"referenceIdentification": "REFERENCIA PREDIAL123",
"type": "AAE"
}
],
"buyer": {
"gln": "BUYERGLN123456",
"text": "LUIS QUINTERO"
},
"seller": {
"gln": "SELLERGLN123456",
"alternatePartyIdentification": "ALTPARTYIDD123",
"type": "IEPS_REFERENCE"
},
"shipTo": {
"gln": "GLNSHIPMENT1234",
"address": {
"name": "LUIS QUINTERO CO.",
"streetAddressOne": "CALLE CORAL AZUL",
"city": "GUADALAJARA",
"postalCode": "44790"
}
},
"currency": {
"currencyFunction": "PRICE_CURRENCY"
},
"paymentTerms": {
"paymentTermsEvent": "EFECTIVE_DATE",
"PaymentTermsRelationTime": "REFERENCE_BEFORE",
"netPaymentTermsType": "END_OF_MONTH",
"days": "2"
},
"allowanceCharge": {
"settlementType": "OFF_INVOICE",
"allowanceChargeType": "ALLOWANCE_GLOBAL",
"specialServicesType": "ZZZ",
"monetaryAmountOrPercentage": {
"rate": "INVOICE_VALUE",
"percentage": "2345.67"
}
},
"lineItems": [
{
"type": "SimpleInvoiceLineItemType",
"number": "0",
"tradeItemIdentification": "GTINPROD1",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD1"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 0"
},
"invoicedQuantity": "10",
"unitOfMeasure": "1.0",
"aditionalQuantity": "10",
"grossPrice": "",
"netPrice": "11.00",
"AdditionalInformation": {
"referenceIdentification": "REFPROD1",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "GST",
"tradeItemTaxAmount": {
"taxPercentage": "10.00",
"taxAmount": "1.00"
}
},
"totalLineAmount": {
"grossAmount": "100",
"netAmount": "110"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "2",
"tradeItemIdentification": "GTINPROD1",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD1"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 1"
},
"invoicedQuantity": "10",
"unitOfMeasure": "1.0",
"aditionalQuantity": "",
"grossPrice": "10.00",
"netPrice": "",
"AdditionalInformation": {
"referenceIdentification": "REFPROD1",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "GST",
"tradeItemTaxAmount": {
"taxPercentage": "10.00",
"taxAmount": "1.00"
}
},
"totalLineAmount": {
"grossAmount": "100",
"netAmount": "110"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "3",
"tradeItemIdentification": "GTINPROD2",
"alternateTradeItemIdentification": {
"type": "BUYER_ASSIGNED",
"value": "NUMALTPROD2"
},
"tradeItemDescriptionInformation": {
"language": "EN",
"longText": "DESCRIPCION PRODUCTO 2"
},
"invoicedQuantity": "10",
"unitOfMeasure": "2.0",
"aditionalQuantity": "10",
"grossPrice": "",
"netPrice": "",
"AdditionalInformation": {
"referenceIdentification": "REFPROD2",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "VAT",
"tradeItemTaxAmount": {
"taxPercentage": "16.00",
"taxAmount": "3.20"
}
},
"totalLineAmount": {
"grossAmount": "200",
"netAmount": "232"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "4",
"tradeItemIdentification": "GTINPROD3",
"alternateTradeItemIdentification": {
"type": "123",
"value": "123"
},
"tradeItemDescriptionInformation": {
"language": "ES",
"longText": "DESCRIPCION PRODUCTO 3"
},
"invoicedQuantity": "10",
"unitOfMeasure": "3.0",
"aditionalQuantity": "10",
"grossPrice": "0.00",
"netPrice": "30.75",
"AdditionalInformation": {
"referenceIdentification": "REFPROD3",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "LAC",
"tradeItemTaxAmount": {
"taxPercentage": "02.50",
"taxAmount": "00.75"
}
},
"totalLineAmount": {
"grossAmount": "300",
"netAmount": "307.5"
}
},
{
"type": "SimpleInvoiceLineItemType",
"number": "5",
"tradeItemIdentification": "GTINPROD4",
"alternateTradeItemIdentification": {
"type": "SUPPLIER_ASSIGNED",
"value": "NUMALTPROD4"
},
"tradeItemDescriptionInformation": {
"language": "EN",
"longText": "DESCRIPCION PRODUCTO 4"
},
"invoicedQuantity": "10",
"unitOfMeasure": "4.0",
"aditionalQuantity": "10",
"grossPrice": "40.00",
"netPrice": "44.80",
"AdditionalInformation": {
"referenceIdentification": "REFPROD4",
"type": "ON"
},
"tradeItemTaxInformation": {
"taxTypeDescription": "AAA",
"tradeItemTaxAmount": {
"taxPercentage": "12.00",
"taxAmount": "48.00"
}
},
"totalLineAmount": {
"grossAmount": "400",
"netAmount": "448"
}
}
],
"totalAmount": "1234567.89",
"baseAmount": "123456.00",
"tax": [
{
"type": "GST",
"taxPercentage": "10",
"taxAmount": "10",
"taxCategory": "TRANSFERIDO"
},
{
"type": "VAT",
"taxPercentage": "16",
"taxAmount": "32",
"taxCategory": "TRANSFERIDO"
},
{
"type": "LAC",
"taxPercentage": "02.50",
"taxAmount": "07.50",
"taxCategory": "TRANSFERIDO"
},
{
"type": "AAA",
"taxPercentage": "12.00",
"taxAmount": "48.00",
"taxCategory": "TRANSFERIDO"
}
],
"payableAmount": "123456789"
}
})
response = https.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}
Costco
Asi podremos crear una addenda de Costco, con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de Costco seran necesarios los siguientes parametros:
Parametro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Es el identificador del CFDI al cual se le agregara la addena |
addendaCostco | arreglo | Requerido | Es el arreglo que contiene los campos correspondientes a la addenda de Costco |
tipo_proveedor | String | Requerido | Indica el tipo de proveedor para nuestra addenda |
no_proveedor | String | Requerido | Es el identificador de el proveedor proporcionado por Costco consta de 5 digitos |
sufijo_proveedor | String | Requerido | Es el sufijo asignado tambien por Costco y consta de 2 digitos |
no_oc | String | Requerido | Es el numero de Orden de Compra |
moneda | String | Requerido | Se utiliza para señalar en que moneda se genera el documento para moneda nacional mexicana el valor es - "MXP" |
terminos_pago | String | Opcional | Se utiliza para especificar condiciones o terminos para realizar el pago |
correo_aviso | String | Opcional | Indica el correo de contacto cuando es necesario |
Construcción de la URL
Importante
El método para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/costco/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/costco/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Costco
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/costco/store',
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 =>'{
"invoice": "0bbb8073-2392-46d7-9222-ba92990b7a83",
"addendaCostco":{
"tipo_proveedor": "E",
"no_proveedor": "78964",
"sufijo_proveedor": "55",
"no_oc": "ORD454545",
"moneda": "MXP",
"terminos_pago": "CONTRA ENTREGA",
"correo_aviso": "[email protected]"
}
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/costco/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "0bbb8073-2392-46d7-9222-ba92990b7a83",
"addendaCostco": {
"tipo_proveedor": "E",
"no_proveedor": "78964",
"sufijo_proveedor": "55",
"no_oc": "ORD454545",
"moneda": "MXP",
"terminos_pago": "CONTRA ENTREGA",
"correo_aviso": "[email protected]"
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/costco/store"
payload = json.dumps({
"invoice": "0bbb8073-2392-46d7-9222-ba92990b7a83",
"addendaCostco": {
"tipo_proveedor": "E",
"no_proveedor": "78964",
"sufijo_proveedor": "55",
"no_oc": "ORD454545",
"moneda": "MXP",
"terminos_pago": "CONTRA ENTREGA",
"correo_aviso": "[email protected]"
}
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/costco/store")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "0bbb8073-2392-46d7-9222-ba92990b7a83",
"addendaCostco": {
"tipo_proveedor": "E",
"no_proveedor": "78964",
"sufijo_proveedor": "55",
"no_oc": "ORD454545",
"moneda": "MXP",
"terminos_pago": "CONTRA ENTREGA",
"correo_aviso": "[email protected]"
}
})
response = https.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}
Envases Universales de México (EUM)
Asi podremos crear una addenda para Envases Universales de México, con un ejemplo y la muestra de la respuesta al crearla.
Importante
Es importante tomar en cuenta que la addenda de Envases Universales de México se crea al mismo tiempo que generamos el CFDI por lo que los parametros que se mostraran mas delante deben incluirse en el formato enviado cuando creamos el CFDI.
Esto es un diferenciador importante a tomar en cuenta ya que las otras addendas disponibles se generan en dos pasos los cuales consisten en generar el CFDI y generar una peticion para agregar la addenda a nuestro CFDI previamente creado.
Para crear nuestra addenda de Envases Universales de México seran necesarios los siguientes parametros:
Parametro | Tipo | Requerido | Detalles |
---|---|---|---|
AddendaEnvasesUniversales | Arreglo | Requerido | Arreglo que contiene los parámetros utilizados en la addenda |
idFactura | String | Requerido | Indica el identificador único que se le asigna a la factura al crear la addenda |
fechaMensaje | String | Requerido | La fecha asignada a la addenda |
idTransaccion | String | Requerido | Identificador utilizado para la transacción |
transacción | String | Requerido | El número correspondiente a la transacción |
consecutivo | String | Requerido | Consecutivo de addenda |
idPedido | String | Requerido | Indica el identificador del pedido correspondiente al CFDI de la addenda |
albaran | String | Requerido | Indica el identificador del albarán correspondiente al CFDI de la addenda |
monedaCve | String | Requerido | Indica la abreviatura de la moneda con la que se llevó a cabo la operación |
tipoCambio | Numerico | Requerido | El valor de cambio de la moneda utilizada para la operación |
totalM | String | Requerido | Indica el total de la operación con todos los conceptos incluidos |
subtotalM | String | Requerido | Indica el subtotal de la operación |
impuestoM | String | Requerido | Indica el monto correspondiente a los impuestos de la operación |
baseImpuesto | String | Requerido | Se utiliza para definir el porcentaje correspondiente a los impuestos de la operación |
Construcción de la URL
Importante
El método para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/create
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/create
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Envases Universales de México
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/create',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"Receptor" : {
"UID": "62d8891fd3734"
},
"AddendaEnvasesUniversales": {
"idFactura": "123",
"fechaMensaje": "29/06/2022",
"idTransaccion": "12345",
"transaccion": "003",
"consecutivo": "1",
"idPedido": "40GVSBI2367",
"albaran": "50BYSIOUNI1",
"monedaCve": "MXN",
"tipoCambio": 1.0000,
"totalM": "232",
"subtotalM": "200",
"impuestoM": "32",
"baseImpuesto": "16"
},
"TipoDocumento":"factura",
"Conceptos": [{
"ClaveProdServ": "81112101",
"Cantidad":1,
"ClaveUnidad":"E48",
"Unidad": "Unidad de servicio",
"ValorUnitario": 200.00,
"Descripcion": "Desarrollo a la medida",
"Impuestos":{
"Traslados":[
{
"Base": 200.00,
"Impuesto":"002",
"TipoFactor":"Tasa",
"TasaOCuota":"0.16",
"Importe":32.00
}
]
}
}],
"UsoCFDI": "G03",
"Serie": 13910,
"FormaPago": "03",
"MetodoPago": "PUE",
"Moneda": "MXN",
"EnviarCorreo": false
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/cfdi40/create',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"Receptor": {
"UID": "62d8891fd3734"
},
"AddendaEnvasesUniversales": {
"idFactura": "123",
"fechaMensaje": "29/06/2022",
"idTransaccion": "12345",
"transaccion": "003",
"consecutivo": "1",
"idPedido": "40GVSBI2367",
"albaran": "50BYSIOUNI1",
"monedaCve": "MXN",
"tipoCambio": 1,
"totalM": "232",
"subtotalM": "200",
"impuestoM": "32",
"baseImpuesto": "16"
},
"TipoDocumento": "factura",
"Conceptos": [
{
"ClaveProdServ": "81112101",
"Cantidad": 1,
"ClaveUnidad": "E48",
"Unidad": "Unidad de servicio",
"ValorUnitario": 200,
"Descripcion": "Desarrollo a la medida",
"Impuestos": {
"Traslados": [
{
"Base": 200,
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": 32
}
]
}
}
],
"UsoCFDI": "G03",
"Serie": 13910,
"FormaPago": "03",
"MetodoPago": "PUE",
"Moneda": "MXN",
"EnviarCorreo": false
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/create"
payload = json.dumps({
"Receptor": {
"UID": "62d8891fd3734"
},
"AddendaEnvasesUniversales": {
"idFactura": "123",
"fechaMensaje": "29/06/2022",
"idTransaccion": "12345",
"transaccion": "003",
"consecutivo": "1",
"idPedido": "40GVSBI2367",
"albaran": "50BYSIOUNI1",
"monedaCve": "MXN",
"tipoCambio": 1,
"totalM": "232",
"subtotalM": "200",
"impuestoM": "32",
"baseImpuesto": "16"
},
"TipoDocumento": "factura",
"Conceptos": [
{
"ClaveProdServ": "81112101",
"Cantidad": 1,
"ClaveUnidad": "E48",
"Unidad": "Unidad de servicio",
"ValorUnitario": 200,
"Descripcion": "Desarrollo a la medida",
"Impuestos": {
"Traslados": [
{
"Base": 200,
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": 32
}
]
}
}
],
"UsoCFDI": "G03",
"Serie": 13910,
"FormaPago": "03",
"MetodoPago": "PUE",
"Moneda": "MXN",
"EnviarCorreo": False
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/create")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"Receptor": {
"UID": "62d8891fd3734"
},
"AddendaEnvasesUniversales": {
"idFactura": "123",
"fechaMensaje": "29/06/2022",
"idTransaccion": "12345",
"transaccion": "003",
"consecutivo": "1",
"idPedido": "40GVSBI2367",
"albaran": "50BYSIOUNI1",
"monedaCve": "MXN",
"tipoCambio": 1,
"totalM": "232",
"subtotalM": "200",
"impuestoM": "32",
"baseImpuesto": "16"
},
"TipoDocumento": "factura",
"Conceptos": [
{
"ClaveProdServ": "81112101",
"Cantidad": 1,
"ClaveUnidad": "E48",
"Unidad": "Unidad de servicio",
"ValorUnitario": 200,
"Descripcion": "Desarrollo a la medida",
"Impuestos": {
"Traslados": [
{
"Base": 200,
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.16",
"Importe": 32
}
]
}
}
],
"UsoCFDI": "G03",
"Serie": 13910,
"FormaPago": "03",
"MetodoPago": "PUE",
"Moneda": "MXN",
"EnviarCorreo": false
})
response = https.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Factura creada y enviada satisfactoriamente",
"UUID": "52aabce0-63ac-4383-bb4b-a10a76aea56f",
"uid": "623bac1a616b6",
"SAT": {
"UUID": "52aabce0-63ac-4383-bb4b-a10a76aea56f",
"FechaTimbrado": "2022-03-23T17:23:04",
"NoCertificadoSAT": "30001000000400002495",
"Version": "1.1",
"SelloSAT": "BI3XeEq1VAU58Fa/QJnl21P36+TKBKMmPu+Dw9CGylamf5cB09rD56ozka4ePoqpFLyGDlNK54+rnhzTuF9wqmBw4ZWYyi0AZuKrGbaMW1DL4tFXcAZlT3K1l0jW4Wx1LSq5LrsUCaxQc12aR+DT/eLaSza15+d3CFOrvhj9CN6ZhHaW438QnevgljaoSau53VGxnBnPkgYSNZB7jz++ScUPkRZ1IKAWlVGFXpMd+STLQQNo3xoO3EHF6pBHxtJNjJaO8jcLXxUrbj6TOZdXPKdyXiHJ1sm7g0ZhyEntA0KAnwNOh2f7+UBcYDoK+mSflV9SBrTXJSfg2QI+RqmNCA==",
"SelloCFD": "TN0/u3C2VNBt+SotpsvC+lW3YPHzhnfLETott4hP9PVChfxjbKCIkpILAt5SJnKNUqgIHKuYQH49gzlUUgzRStX51TFHqjNrwlPWl51gltbySFfR7PvXo+v/1bZE872pia44HwERFoJ0Xu49JbkdoZAK4JUYd0dYE9yElxcUUb0A94jhN7oOl1JPMgJgPRNYQBb7WVFKKO3X0Zl7ScTFTbcueBCBBY+smvBcTOBmXqfDO/p0xBpxl4hpKDfK5KXVeEvfbqLZwDjw6n75Oqg6SOQvVudiFNnGdgKkOWI//hXoDCFFCNU2TJdS7hWJfa9x/JsRoUJ3p2Smpl24XmNqLg=="
},
"INV": {
"Serie": "F",
"Folio": 360
},
"invoice_uid": "623bac1a616b6"
}
Ejemplo de respuesta erronea
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.
{
"response": "error",
"message": {
"message": "CFDI40161 - El valor del campo Importe o que corresponde a Traslado no se encuentra entre el limite inferior y superior permitido.",
"messageDetail": "Comprobante:Concepto:Impuestos:Traslado:Importe: El Importe es mayor o menor al limite superior/inferior calculado. LimiteSuperiorCalculado: 17 LimiteInferiorCalculado: 15 Comprobante:Concepto:Impuestos:Traslado:Importe: 19",
"data": null,
"status": "error"
},
"xmlerror": "\n</cfdi:Traslados></cfdi:Impuestos></cfdi:Concepto></cfdi:Conceptos></cfdi:Traslados></cfdi:Impuestos></cfdi:Comprobante>\n"
}
Walmart
Asi podremos crear una addenda de Walmart, con un ejemplo y la muestra de la respuesta al crearla.
Importante
Es importante tomar en cuenta que la addenda de Envases Universales de México se crea al mismo tiempo que generamos el CFDI por lo que los parametros que se mostraran mas delante deben incluirse en el formato enviado cuando creamos el CFDI.
Esto es un diferenciador importante a tomar en cuenta ya que las otras addendas disponibles se generan en dos pasos los cuales consisten en generar el CFDI y generar una peticion para agregar la addenda a nuestro CFDI previamente creado.
Para crear nuestra addenda de Walmart seran necesarios los siguientes parametros:
Parametro | Tipo | Requerido | Detalles |
---|---|---|---|
AddendaWalmart | Arreglo | Requerido | Es el arreglo que contiene toda la informacion de nuestra addenda para Walmart este se envia adjunto al cuerpo de nuestro CFDI para que se añada al mismo tiempo que timbramos el documento |
anio | String | Requerido | Especifica el año para nuestra addenda |
unidadCEDIS | String | Requerido | Es el identificador utilizado para el Centro de Distribucion (CEDIS) donde se realiza la entrega |
ordenCompra | String | Requerido | Es el numero que corresponde a la orden de compra de nuestro documento |
numeroProveedor | String | Requerido | Especifica el identificador del proveedor |
folioRecibo | String | Requerido | Indica el numero de recibo correspondiente a nuestro documento |
Construcción de la URL
Importante
El método para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v4/cfdi40/create
Ejemplo: https://facturaonline.com.mx/api/v4/cfdi40/create
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Walmart
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v4/cfdi40/create',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"Receptor":{
"UID":"62b1dcf75a60f"
},
"TipoDocumento":"factura",
"UsoCFDI":"G01",
"Redondeo":"2",
"Conceptos":[
{
"ClaveProdServ":"83101800",
"NoIdentificacion":"20190417C009001P00",
"Cantidad":"100",
"ClaveUnidad":"MWH",
"Unidad":"MEGAWATT HORA",
"ValorUnitario":"25",
"Descripcion":"Venta de energía importada en el MDA",
"Descuento":"0",
"Impuestos":{
"Traslados":[
{
"Base":"25",
"Impuesto":"002",
"TipoFactor":"Tasa",
"TasaOCuota":"0.160000",
"Importe":"4"
}
]
}
}
],
"FormaPago":"99",
"NumOrder": "",
"MetodoPago":"PPD",
"Moneda":"MXN",
"CondicionesDePago":"Pago en una sola excibición",
"Serie":"13910",
"EnviarCorreo":"false",
"AddendaWalmart":{
"anio": "2023",
"unidadCEDIS": "39",
"ordenCompra": "391",
"numeroProveedor": "392",
"folioRecibo": "394"
}
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v4/cfdi40/create',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"Receptor": {
"UID": "62b1dcf75a60f"
},
"TipoDocumento": "factura",
"UsoCFDI": "G01",
"Redondeo": "2",
"Conceptos": [
{
"ClaveProdServ": "83101800",
"NoIdentificacion": "20190417C009001P00",
"Cantidad": "100",
"ClaveUnidad": "MWH",
"Unidad": "MEGAWATT HORA",
"ValorUnitario": "25",
"Descripcion": "Venta de energía importada en el MDA",
"Descuento": "0",
"Impuestos": {
"Traslados": [
{
"Base": "25",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.160000",
"Importe": "4"
}
]
}
}
],
"FormaPago": "99",
"NumOrder": "",
"MetodoPago": "PPD",
"Moneda": "MXN",
"CondicionesDePago": "Pago en una sola excibición",
"Serie": "13910",
"EnviarCorreo": "false",
"AddendaWalmart": {
"anio": "2023",
"unidadCEDIS": "39",
"ordenCompra": "391",
"numeroProveedor": "392",
"folioRecibo": "394"
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v4/cfdi40/create"
payload = json.dumps({
"Receptor": {
"UID": "62b1dcf75a60f"
},
"TipoDocumento": "factura",
"UsoCFDI": "G01",
"Redondeo": "2",
"Conceptos": [
{
"ClaveProdServ": "83101800",
"NoIdentificacion": "20190417C009001P00",
"Cantidad": "100",
"ClaveUnidad": "MWH",
"Unidad": "MEGAWATT HORA",
"ValorUnitario": "25",
"Descripcion": "Venta de energía importada en el MDA",
"Descuento": "0",
"Impuestos": {
"Traslados": [
{
"Base": "25",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.160000",
"Importe": "4"
}
]
}
}
],
"FormaPago": "99",
"NumOrder": "",
"MetodoPago": "PPD",
"Moneda": "MXN",
"CondicionesDePago": "Pago en una sola excibición",
"Serie": "13910",
"EnviarCorreo": "false",
"AddendaWalmart": {
"anio": "2023",
"unidadCEDIS": "39",
"ordenCompra": "391",
"numeroProveedor": "392",
"folioRecibo": "394"
}
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v4/cfdi40/create")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"Receptor": {
"UID": "62b1dcf75a60f"
},
"TipoDocumento": "factura",
"UsoCFDI": "G01",
"Redondeo": "2",
"Conceptos": [
{
"ClaveProdServ": "83101800",
"NoIdentificacion": "20190417C009001P00",
"Cantidad": "100",
"ClaveUnidad": "MWH",
"Unidad": "MEGAWATT HORA",
"ValorUnitario": "25",
"Descripcion": "Venta de energía importada en el MDA",
"Descuento": "0",
"Impuestos": {
"Traslados": [
{
"Base": "25",
"Impuesto": "002",
"TipoFactor": "Tasa",
"TasaOCuota": "0.160000",
"Importe": "4"
}
]
}
}
],
"FormaPago": "99",
"NumOrder": "",
"MetodoPago": "PPD",
"Moneda": "MXN",
"CondicionesDePago": "Pago en una sola excibición",
"Serie": "13910",
"EnviarCorreo": "false",
"AddendaWalmart": {
"anio": "2023",
"unidadCEDIS": "39",
"ordenCompra": "391",
"numeroProveedor": "392",
"folioRecibo": "394"
}
})
response = https.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Factura creada y enviada satisfactoriamente",
"UUID": "8ff503a2-c6b7-4a25-XXX-a25610e6b488",
"uid": "5c06fa8b3bbe6",
"SAT": {
"UUID": "8ff503a2-c6b7-XXX-92c7-a25610e6b488",
"FechaTimbrado": "2018-12-04T16:07:08",
"NoCertificadoSAT": "20001000000300022323",
"Version": "1.1",
"SelloSAT": "lzlv2bEVsjx8XkiJHJvlfCjr7xJ/laxZnvSmGSKF3C/HI9WFDYFFk4NfGyILBj8ll7m1VoCqlkSLvu9dRex4jSSGfPJOPGDrx7w/4AOj/scHPU23uIPhztnaHIYHKg9UxP4L9rgX814msJ8V86IXZ1nY7akr77Cpf2c2yAnHaO1fm81oQIe32obIs2GrOey6JG9oxQNrcUawSXXXXXXXX",
"SelloCFD": "NJQH6WT8eLxAeti7pUWhB7F6C6xrdSqkFfORf3+SeGkhu+5E0cZZUQjgaSZLpPcgk01aQUf0Jayw2GewYou5MjD4OLzZnZuizPwy3cSfQXzgX6sJTtAsI00VyhQewxLYDSMqFUrPpniNQG8Nl/eEg1kx72kkmqih2KX2Z+URkhx14W7CMG2aMJnhDyZuyliF+cy3utjXwzxQMl+28A/mgnlfUXzZd/3IunTtxM/p4bpqbYinK+7Bd/n+90Z6axsFBs6N7wxUX6aK9YL58owhgVGXXXXXXXX"
},
"INV": {
"Serie": "F",
"Folio": 1433
},
"invoice_uid": "5c06fa8b3bXXX"
}
Ejemplo de respuesta erronea
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.
{
"response": "error",
"message": {
"message": "CFDI33161 - El valor del campo Importe o que corresponde a Traslado no se encuentra entre el limite inferior y superior permitido.",
"messageDetail": "Comprobante:Concepto:Impuestos:Traslado:Importe: El Importe es mayor o menor al limite superior/inferior calculado. LimiteSuperiorCalculado: 17 LimiteInferiorCalculado: 15 Comprobante:Concepto:Impuestos:Traslado:Importe: 19",
"data": null,
"status": "error"
},
"xmlerror": "\n</cfdi:Traslados></cfdi:Impuestos></cfdi:Concepto></cfdi:Conceptos></cfdi:Traslados></cfdi:Impuestos></cfdi:Comprobante>\n"
}
Herdez
Asi podremos crear una addenda de Herdez, con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de Herdez seran necesarios los siguientes parametros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Se utiliza para especificar el CFDI a el cual se le agrega la addenda en este caso puede utilizar UID o UUID Ejemplo: "64b71596a29e6" "1592adb9-e45a-4464-8878-8c359a9a7d26" |
addendaHerdez | Arreglo | Requerido | Es el arreglo o nodo que contiene los parametros de la addenda Herdez los campos que componen la addenda se deben encontrar dentro de el |
RFC_Emisor | String | Requerido | Se utiliza para indicar el RFC de quien genera el CFDI Ejemplo: "CACX7605101P8" |
RFC_Receptor | String | Opcional | Se utiliza para indicar el RFC de quien recibe el CFDI, este valor es opcional y en caso de no enviarlo se toma por defecto el RFC que se utilizo como receptor al momento de crear el documento antes de agregar la addenda Ejemplo: "HER8301121X4" "" |
Folio_Manhattan | String | Requerido | Se utiliza para especificar el folio o numero de control interno para el CFDI. Ejemplo: "1234567890" "FLMHT1636809-02" |
Construcción de la URL
Importante
El metodo para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/herdez/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/herdez/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Herdez
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/herdez/store',
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 =>'{
"invoice": "1592adb9-e45a-4464-8878-8c359a9a7d26",
"addendaHerdez": {
"RFC_Emisor": "CACX7605101P8",
"RFC_Receptor": "HER8301121X4",
"Folio_Manhattan": "246473"
}
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/herdez/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "1592adb9-e45a-4464-8878-8c359a9a7d26",
"addendaHerdez": {
"RFC_Emisor": "CACX7605101P8",
"RFC_Receptor": "HER8301121X4",
"Folio_Manhattan": "246473"
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/herdez/store"
payload = json.dumps({
"invoice": "1592adb9-e45a-4464-8878-8c359a9a7d26",
"addendaHerdez": {
"RFC_Emisor": "CACX7605101P8",
"RFC_Receptor": "HER8301121X4",
"Folio_Manhattan": "246473"
}
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/herdez/store")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "1592adb9-e45a-4464-8878-8c359a9a7d26",
"addendaHerdez": {
"RFC_Emisor": "CACX7605101P8",
"RFC_Receptor": "HER8301121X4",
"Folio_Manhattan": "246473"
}
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "El campo RFC_Emisor es requerido"
}
Calsonic Kansei
Asi podremos crear una addenda de Calsonic Kansei con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de Calsonic Kansei seran necesarios los siguientes parametros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Es el identificador del CFDI al cual se le agregara la addenda |
grupoValoresCK | Arreglo | Requerido | Es el arreglo que contiene la informacion de la addenda de Calsonic Kansei |
purchaseOrder | String | Requerido | Indica el numero o nombre de la orden de los productos Ejemplo: "712101" |
line | String | Requerido | Se utiliza para especificar el numero de linea a la cual pertenecen los productos de el CFDI Ejemplo: "001" |
partCode | String | Requerido | Se utiliza para especificar el codigo de los productos del CFDI Ejemplo: "00-9-708" |
currency | String | Requerido | Indica la moneda con la cual se realiza el CFDI Ejemplo: "MXN" |
Construcción de la URL
Importante
Importante el metodo para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/calsonickansei/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/calsonickansei/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de Calsonic Kansei
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/calsonickansei/store',
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 =>'{
"invoice": "6478efa2baff3",
"grupoValoresCK":[
{
"purchaseOrder": "712101",
"line": "001",
"partCode": "00-9-708",
"currency": "MXN"
}
]
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/calsonickansei/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "6478efa2baff3",
"grupoValoresCK": [
{
"purchaseOrder": "712101",
"line": "001",
"partCode": "00-9-708",
"currency": "MXN"
}
]
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/calsonickansei/store"
payload = json.dumps({
"invoice": "6478efa2baff3",
"grupoValoresCK": [
{
"purchaseOrder": "712101",
"line": "001",
"partCode": "00-9-708",
"currency": "MXN"
}
]
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/calsonickansei/store")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "6478efa2baff3",
"grupoValoresCK": [
{
"purchaseOrder": "712101",
"line": "001",
"partCode": "00-9-708",
"currency": "MXN"
}
]
})
response = http.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}
PepsiCo
Asi podremos crear una addenda de PepsiCo, con un ejemplo y la muestra de la respuesta al crearla.
Para crear nuestra addenda de PepsiCo seran necesarios los siguientes parametros:
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Es el identificador del CFDI al cual se le agregara la addenda |
pepsico | Arreglo | Requerido | Es el arreglo que contiene la información de la addenda de PepsiCo, toda la información correspondiente a la addenda se debe encontrar dentro de este nodo. |
tipo | String | Requerido | Nombre de la addenda. La addenda se llamará "AddendaPCO" |
version | Numerico | Requerido | Número de la versión de la addenda. Para este caso es la 2.0 |
idPedido | String | Requerido | Se utiliza para indicar el número de pedido u orden de compra, proporcionado por PEPSICO, asociado al comprobante (CFD / CFDI). NOTA: Este campo es de uso requerido cuando el producto o mercancía haya sido solicitado a través de un pedido u Orden de Compra. |
idSolicitudPago | String | Opcional | Se utiliza para indicar el número con el cuál se genera la solicitud de pago al proveedor de servicios. NOTA: Este campo es de uso requerido cuando usted provee servicios a PepsiCo. |
documento | Arreglo | Requerido | Este es el arreglo el cual contiene la informacion relacionada a el CFDI. |
referencia | String | Opcional | Sólo aplica cuando el comprobante corresponde a una Nota de Crédito o Nota de Cargo / Débito. Se utiliza para indicar el número de la factura a la cual se asocia la Nota de Crédito o de Cargo /Débito. La composición de este dato, debe ser la siguiente: Para CFDIs: UUID Ejemplo: "d0ffae4e-51ef-46d2-be62-92b190462af2" |
serie | String | Opcional | Se utiliza para precisar la serie a la que corresponde el comprobante. Ejemplo: "F" |
folio | String | Opcional | Se utiliza para indicar el número del comprobante. Para el caso de CFDIs, corresponde al folio interno. Ejemplo: "749" |
folioUUID | String | Opcional | Se utiliza para indicar el número de folio fiscal del comprobante, en caso de que se emitan CFDIs. Ejemplo: "abcde123456" |
tipoDoc | Numerico | Requerido | Se utiliza para especificar el tipo de comprobante que el proveedor está emitiendo. Los valores permitidos son: 1 se utiliza para Facturas 2 se utiliza para Notas de Crédito 3 utilizado para Notas de Cargo o Débito. |
IdProveedor | Numerico | Requerido | Se utiliza para especificar el identificador o número que la Sociedad (Empresa) de PepsiCo ha asignado al proveedor. |
recepciones | Arreglo | Requerido | Es el arreglo que contiene la informacion de las recepciones, este nodo puede contener una o mas recepciones cada recepcion debe contener los campos correspondientes que se muestran a continuación Ejemplo: "recepciones": [ |
idRecepcion | Numerico | Requerido | Se utiliza para especificar el número con el cuál entra la mercancía al almacén. Este dato es proporcionado por PEPSICO al proveedor. NOTA: Este campo es de uso requerido cuando usted provee productos o mercancía a PEPSICO. |
cantidad | Numerico | Requerido | Atributo necesario para precisar la cantidad de bienes o servicios. |
unidad | String | Requerido | Atributo para precisar la unidad de medida aplicable para la cantidad expresada en el concepto. |
descripcion | String | Requerido | Atributo que explica de qué se trata el producto o servicio solicitado. |
valorUnitario | Numerico | Requerido | Atributo necesario para precisar el valor o precio unitario de bienes o servicios. |
importe | Numerico | Requerido | Atributo necesario para precisar el importe total de bienes o servicios y debe ser equivalente al resultado de multiplicar la cantidad por el valor unitario expresado en el concepto. |
Construcción de la URL
Importante
El metodo para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/pepsico/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/pepsico/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda de PepsiCo
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/pepsico/store',
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 =>'{
"invoice": "64b84be75519d",
"pepsico": {
"tipo": "AddendaPCO",
"version": "2.0",
"idPedido": "Ord12872",
"idSolicitudPago": "pay7382",
"documento": {
"referencia": "d0ffae4e-51ef-46d2-be62-92b190462af2",
"serie": "F",
"folio": "749",
"folioUUID": "abcde123456",
"tipoDoc": "1"
},
"idProveedor": "PROV00032",
"recepciones": [
{
"idRecepcion": "REC9182",
"cantidad": "320.00",
"unidad": "KGM",
"descripcion": "Azucar de caña",
"valorUnitario": "15.50",
"importe": "4960.00"
},
{
"idRecepcion": "ABC123",
"cantidad": "123",
"unidad": "LTS",
"descripcion": "Descripcion de prueba",
"valorUnitario": "123",
"importe": "456"
}
]
}
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/pepsico/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "64b84be75519d",
"pepsico": {
"tipo": "AddendaPCO",
"version": "2.0",
"idPedido": "Ord12872",
"idSolicitudPago": "pay7382",
"documento": {
"referencia": "d0ffae4e-51ef-46d2-be62-92b190462af2",
"serie": "F",
"folio": "749",
"folioUUID": "abcde123456",
"tipoDoc": "1"
},
"idProveedor": "PROV00032",
"recepciones": [
{
"idRecepcion": "REC9182",
"cantidad": "320.00",
"unidad": "KGM",
"descripcion": "Azucar de caña",
"valorUnitario": "15.50",
"importe": "4960.00"
},
{
"idRecepcion": "ABC123",
"cantidad": "123",
"unidad": "LTS",
"descripcion": "Descripcion de prueba",
"valorUnitario": "123",
"importe": "456"
}
]
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/pepsico/store"
payload = json.dumps({
"invoice": "64b84be75519d",
"pepsico": {
"tipo": "AddendaPCO",
"version": "2.0",
"idPedido": "Ord12872",
"idSolicitudPago": "pay7382",
"documento": {
"referencia": "d0ffae4e-51ef-46d2-be62-92b190462af2",
"serie": "F",
"folio": "749",
"folioUUID": "abcde123456",
"tipoDoc": "1"
},
"idProveedor": "PROV00032",
"recepciones": [
{
"idRecepcion": "REC9182",
"cantidad": "320.00",
"unidad": "KGM",
"descripcion": "Azucar de caña",
"valorUnitario": "15.50",
"importe": "4960.00"
},
{
"idRecepcion": "ABC123",
"cantidad": "123",
"unidad": "LTS",
"descripcion": "Descripcion de prueba",
"valorUnitario": "123",
"importe": "456"
}
]
}
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/pepsico/store")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "64b84be75519d",
"pepsico": {
"tipo": "AddendaPCO",
"version": "2.0",
"idPedido": "Ord12872",
"idSolicitudPago": "pay7382",
"documento": {
"referencia": "d0ffae4e-51ef-46d2-be62-92b190462af2",
"serie": "F",
"folio": "749",
"folioUUID": "abcde123456",
"tipoDoc": "1"
},
"idProveedor": "PROV00032",
"recepciones": [
{
"idRecepcion": "REC9182",
"cantidad": "320.00",
"unidad": "KGM",
"descripcion": "Azucar de caña",
"valorUnitario": "15.50",
"importe": "4960.00"
},
{
"idRecepcion": "ABC123",
"cantidad": "123",
"unidad": "LTS",
"descripcion": "Descripcion de prueba",
"valorUnitario": "123",
"importe": "456"
}
]
}
})
response = https.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}
APR
A continuación, te mostraremos como crear la addenda APR para tus facturas, agregando información sobre hospedaje, estos son los parámetros a utilizar.
Parámetro | Tipo | Requerido | Detalles |
---|---|---|---|
invoice | String | Requerido | Es el identificador del CFDI al cual se le agregara la addenda |
addendaApr | Arreglo | Requerido | Contiene la informacion que se añade a la addenda de APR |
Propina | String | Opcional | El monto de propina que se agregara |
Huesped | String | Opcional | A nombre de quién está el hospedaje |
CheckIn | String | Opcional | Fecha de inicio del hospedaje Ejemplo: 2024/10/19 |
CheckOut | String | Opcional | Fecha final del hospedaje Ejemplo: 2024/10/22 |
Cupon | String | Opcional | Cupón que se aplicó al momento del pago |
Reserva | String | Opcional | Número o código de reservación |
Tipodecuarto | String | Opcional | Referencia del tipo de habitación que se reservó |
Construcción de la URL
Importante
El metodo para agregar una addenda de es tipo POST
Host: https://facturaonline.com.mx/api (producción) / https://sandbox.facturaonline.com.mx/api (sandbox)
Endpoint: /v3/addenda/apr/store
Ejemplo: https://facturaonline.com.mx/api/v3/addenda/apr/store
Tip
Para probar el ejemplo de código, necesitas cambiar "Tu API key" por la clave de API de tu cuenta, y "Tu Secret key" por la clave secreta correspondiente.
Ejemplo de addenda APR
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '{ HOST }/v3/addenda/apr/store',
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 =>'{
"invoice": "64b84be75519d",
"addendaApr": {
"Propina": "530.60",
"Huesped": "JUAN RODRIGUEZ",
"CheckIn": "2024/10/19",
"CheckOut": "2024/10/22",
"Cupon": "",
"Reserva": "384920",
"Tipodecuarto": "SUIT DOBLE"
}
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'F-PLUGIN: 9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key: Tu API key',
'F-Secret-Key: Tu Secret key'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': '{ HOST }/v3/addenda/apr/store',
'headers': {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
},
body: JSON.stringify({
"invoice": "64b84be75519d",
"addendaApr": {
"Propina": "530.60",
"Huesped": "JUAN RODRIGUEZ",
"CheckIn": "2024/10/19",
"CheckOut": "2024/10/22",
"Cupon": "",
"Reserva": "384920",
"Tipodecuarto": "SUIT DOBLE"
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{ HOST }/v3/addenda/apr/store"
payload = json.dumps({
"invoice": "64b84be75519d",
"addendaApr": {
"Propina": "530.60",
"Huesped": "JUAN RODRIGUEZ",
"CheckIn": "2024/10/19",
"CheckOut": "2024/10/22",
"Cupon": "",
"Reserva": "384920",
"Tipodecuarto": "SUIT DOBLE"
}
})
headers = {
'Content-Type': 'application/json',
'F-PLUGIN': '9d4095c8f7ed5785cb14c0e3b033eeb8252416ed',
'F-Api-Key': 'Tu API key',
'F-Secret-Key': 'Tu Secret key'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("{ HOST }/v3/addenda/apr/store")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["F-PLUGIN"] = "9d4095c8f7ed5785cb14c0e3b033eeb8252416ed"
request["F-Api-Key"] = "Tu API key"
request["F-Secret-Key"] = "Tu Secret key"
request.body = JSON.dump({
"invoice": "64b84be75519d",
"addendaApr": {
"Propina": "530.60",
"Huesped": "JUAN RODRIGUEZ",
"CheckIn": "2024/10/19",
"CheckOut": "2024/10/22",
"Cupon": "",
"Reserva": "384920",
"Tipodecuarto": "SUIT DOBLE"
}
})
response = https.request(request)
puts response.read_body
Respuesta
Ejemplo de respuesta exitosa.
{
"response": "success",
"message": "Addenda agregada con éxito"
}
Ejemplo de respuesta cuando la factura ya cuenta con una addenda
Importante
Los CFDI solo pueden contar con una addenda añadida, por lo que este mensaje es importante para conocer si estamos intentando duplicar una addenda o ya se asigno alguna a nuestro CFDI
{
"response": "failed",
"message": "Ya cuenta con addenda"
}
Ejemplo de respuesta erronea
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.
{
"response": "failed",
"message": "CFDI invalido"
}