Skip to main content

Genera facturas CFDI válidas ante el SAT consumiendo el API de https://www.fiscalapi.com

Project description

FiscalAPI SDK para Python

PyPI version License: MPL-2.0

SDK oficial de FiscalAPI para Python, la API de facturación CFDI y otros servicios fiscales en México. Simplifica la integración con los servicios de facturación electrónica, eliminando las complejidades del SAT y facilitando la generación de facturas, notas de crédito, complementos de pago, nómina, carta porte, y más. ¡Facturar sin dolor ahora es posible!

🚀 Características

  • Soporte completo para CFDI 4.0
  • Compatible con Python 3.7+
  • Dos modos de operación: Por valores o Por referencias
  • Manejo simplificado de errores
  • Búsqueda en catálogos del SAT
  • Documentación completa y ejemplos prácticos

📦 Instalación

pip:

pip install fiscalapi

poetry:

poetry add fiscalapi

⚙️ Configuración

Configuración Básica

  1. Crea un objeto de configuración con tus credenciales:
from fiscalapi.models.common_models import FiscalApiSettings

settings = FiscalApiSettings(
    api_url="https://test.fiscalapi.com",  # https://live.fiscalapi.com (producción)
    api_key="<API_KEY>",
    tenant="<TENANT_KEY>"
)
  1. Crea la instancia del cliente:
from fiscalapi.services.fiscalapi_client import FiscalApiClient

client = FiscalApiClient(settings=settings)

🔄 Modos de Operación

FiscalAPI admite dos modos de operación:

  • Por Referencias: Envía solo IDs de objetos previamente creados en el dashboard de FiscalAPI.
    Ideal para integraciones ligeras.

  • Por Valores: Envía todos los campos requeridos en cada petición, con mayor control sobre los datos.
    No se requiere configuración previa en el dashboard.

📝 Ejemplos de Uso

1. Crear una Persona (Emisor o Receptor)

from fiscalapi.models.fiscalapi_models import Person

person = Person(
    legal_name="Empresa Python SA de CV",
    email="mail7@gmail.com",
    password="TestPassword1234!"
)

api_response = client.people.create(person)

2. Subir Certificados CSD

from fiscalapi.models.fiscalapi_models import TaxFile

# Subir certificado (CER)
certificado_csd = TaxFile(
    person_id="3f3478b4-60fd-459e-8bfc-f8239fc96257",
    tin="FUNK671228PH6",
    base64_file="MIIFgDCCA2igAwIBAgIUMzAwMDEwMDAwMDA1MDAwMDM0NDYwDQYJKo...",
    file_type=0,  # 0 para certificado, 1 para llave privada
    password="12345678a"    
)

# Subir llave privada (KEY)
clave_privada_csd = TaxFile(
    person_id="3f3478b4-60fd-459e-8bfc-f8239fc96257",
    tin="FUNK671228PH6",
    base64_file="MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIAg...",
    file_type=1,
    password="12345678a"
)

api_response_cer = client.tax_files.create(certificado_csd)
api_response_key = client.tax_files.create(clave_privada_csd)

3. Crear un Producto o Servicio

from fiscalapi.models.fiscalapi_models import Product

product = Product(
    description="Producto python sin impuestos",
    unit_price=Decimal("100.00")
)

api_response = client.products.create(product)

4. Actualizar Impuestos de un Producto

from fiscalapi.models.fiscalapi_models import Product, ProductTax

product = Product(
    id="f4bf4df3-5a91-4a30-b137-52cb517d13c4",
    description="Producto python sin impuestos",
    unit_price=Decimal("100.00"),
    product_taxes=[
        ProductTax(
            rate=Decimal("0.160000"),
            taxId="002",
            taxFlagId="T",
            taxTypeId="Tasa"
        ),
        ProductTax(
            rate=Decimal("0.106667"),
            taxId="002",
            taxFlagId="R",
            taxTypeId="Tasa"
        ),
        ProductTax(
            rate=Decimal("0.100000"),
            taxId="001",
            taxFlagId="R",
            taxTypeId="Tasa"
        )
    ]
)

api_response = client.products.update(product)

5. Crear una Factura de Ingreso (Por Referencias)

from datetime import datetime
from decimal import Decimal
from fiscalapi.models.fiscalapi_models import Invoice, InvoiceIssuer, InvoiceItem, InvoiceRecipient

invoice = Invoice(
    version_code="4.0",
    series="F",
    date=datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
    payment_form_code="01",
    payment_conditions="Contado",
    currency_code="MXN",
    type_code="I",
    expedition_zip_code="42501",
    payment_method_code="PUE",
    exchange_rate=1,
    export_code="01",
    issuer=InvoiceIssuer(
        id="3f3478b4-60fd-459e-8bfc-f8239fc96257"
    ),
    recipient=InvoiceRecipient(
        id="96b46762-d246-4a67-a562-510a25dbafa9"
    ),
    items=[
        InvoiceItem(
            id="114a4be5-fb65-40b2-a762-ff0c55c6ebfa",
            quantity=Decimal("1.5"),
            discount=Decimal("255.85")
        )
    ]
)

api_response = client.invoices.create(invoice)

6. Crear la Misma Factura de Ingreso (Por Valores)

from fiscalapi.models.fiscalapi_models import Invoice, InvoiceIssuer, InvoiceItem, InvoiceRecipient, ItemTax, TaxCredential

invoice = Invoice(
    version_code="4.0",
    series="F",
    date=datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
    payment_form_code="01",
    currency_code="MXN",
    type_code="I",
    expedition_zip_code="42501",
    payment_method_code="PUE",
    exchange_rate=1,
    export_code="01",
    issuer=InvoiceIssuer(
        tin="FUNK671228PH6",
        legal_name="KARLA FUENTE NOLASCO",
        tax_regime_code="621",
        tax_credentials=[
            TaxCredential(
                base64_file="MIIFgDCCA2igAwIBAgIUMzAwMDEwMDAwMDA1MDAwMDM0NDYwDQYJKo...",
                file_type=0,
                password="12345678a"
            ),
            TaxCredential(
                base64_file="MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIAg...",
                file_type=1,
                password="12345678a"
            )
        ]
    ),
    recipient=InvoiceRecipient(
        tin="EKU9003173C9",
        legal_name="ESCUELA KEMPER URGATE",
        zip_code="42501",
        tax_regime_code="601",
        cfdi_use_code="G01",
        email="mail@domain.com"
    ),
    items=[
        InvoiceItem(
            item_code="84111506",
            quantity=Decimal("9.5"),
            unit_of_measurement_code="E48",
            description="Invoicing software as a service",
            unit_price=Decimal("3587.75"),
            tax_object_code="02",
            item_sku="7506022301697",
            discount=Decimal("255.85"),
            item_taxes=[
                ItemTax(
                    tax_code="002",
                    tax_type_code="Tasa",
                    tax_rate=Decimal("0.160000"),
                    tax_flag_code="T"
                )
            ]
        )
    ]
)

api_response = client.invoices.create(invoice)

7. Búsqueda en Catálogos del SAT

# Buscar registros que contengan 'inter' en el catalogo 'SatUnitMeasurements' (página 1, tamaño página 10)
api_response = client.catalogs.search_catalog("SatUnitMeasurements", "inter", 1, 10)

if api_response.succeeded:
    for item in api_response.data.items:
        print(f"Unidad: {item.description}")
else:
    print(api_response.message)

📋 Operaciones Principales

  • Facturas (CFDI)
    Crear facturas de ingreso, notas de crédito, complementos de pago, cancelaciones, generación de PDF/XML.
  • Personas (Clientes/Emisores)
    Alta y administración de personas, gestión de certificados (CSD).
  • Productos y Servicios
    Administración de catálogos de productos, búsqueda en catálogos SAT.

🤝 Contribuir

  1. Haz un fork del repositorio.
  2. Crea una rama para tu feature: git checkout -b feature/AmazingFeature
  3. Realiza commits de tus cambios: git commit -m 'Add some AmazingFeature'
  4. Sube tu rama: git push origin feature/AmazingFeature
  5. Abre un Pull Request en GitHub.

🐛 Reportar Problemas

  1. Asegúrate de usar la última versión del SDK.
  2. Verifica si el problema ya fue reportado.
  3. Proporciona un ejemplo mínimo reproducible.
  4. Incluye los mensajes de error completos.

📄 Licencia

Este proyecto está licenciado bajo la Licencia MPL. Consulta el archivo LICENSE para más detalles.

🔗 Enlaces Útiles


Desarrollado con ❤️ por Fiscalapi

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fiscalapi-4.0.1.tar.gz (23.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fiscalapi-4.0.1-py3-none-any.whl (22.9 kB view details)

Uploaded Python 3

File details

Details for the file fiscalapi-4.0.1.tar.gz.

File metadata

  • Download URL: fiscalapi-4.0.1.tar.gz
  • Upload date:
  • Size: 23.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for fiscalapi-4.0.1.tar.gz
Algorithm Hash digest
SHA256 a4d4762c8ea85fbc4d39112aa783cd6ad8501a536d809a4550ccc0520a6a5eef
MD5 cc6a160428ec87f6bfc98c10d80dfdd7
BLAKE2b-256 68a648bee12f557f036c3be290ae54a36b5de8396167d5353065a5485cb0b387

See more details on using hashes here.

File details

Details for the file fiscalapi-4.0.1-py3-none-any.whl.

File metadata

  • Download URL: fiscalapi-4.0.1-py3-none-any.whl
  • Upload date:
  • Size: 22.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for fiscalapi-4.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d6ebba8e4c64ce9c5556d2df4bd5e89d4745c762bbb0c90510f6f81d66e74606
MD5 fdc281f8bb65efd274d294036c557187
BLAKE2b-256 f48e504fa3e68eb57ea81b931f2e2844be56c33a977f5d0d4f483c9ed7327650

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page