FiscalAPI SDK para Python
SDK oficial de https://fiscalapi.com 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!
📋 Facturación CFDI 4.0
- Soporte completo para CFDI 4.0 con todas las especificaciones oficiales
- Timbrado de facturas de ingreso con validación automática
- Timbrado de notas de crédito (facturas de egreso)
- Timbrado de complementos de pago en MXN, USD y EUR
- Timbrado de facturas de nómina
- Timbrado de facturas de carta porte
- Timbrado de facturas de comercio exterior
- Consulta del estatus de facturas en el SAT en tiempo real
- Cancelación de facturas
- Generación de archivos PDF de las facturas con formato profesional
- Personalización de logos y colores en los PDF generados
- Envío de facturas por correo electrónico automatizado
- Descarga de archivos XML con estructura completa
- Almacenamiento y recuperación de facturas por 5 años
- Dos modos de operación: Por valores o Por referencias
- Ejemplos en Python
📥 Descarga Masiva
- Acceso a catálogos de descarga masiva del SAT
- Descarga de CFDI y Metadatos en lotes grandes
- Descarga masiva XML con filtros personalizados
- Reglas de descarga automática por RFC
- Solicitudes de descarga via API y Dashboard.
- Automatización de solicitudes de descarga
👥 Gestión de Personas
- Administración de personas (emisores, receptores, clientes, usuarios, etc.)
- Gestión de certificados CSD y FIEL (subir archivos .cer y .key a FiscalAPI)
- Configuración de datos fiscales (RFC, domicilio fiscal, régimen fiscal)
- Datos de empleado (agrega/actualiza/elimina datos de empleado a una persona. CFDI Nómina)
- Datos de empleador (agrega/actualiza/elimina datos de empleador a una persona. CFDI Nómina)
🛍️ Gestión de Productos/Servicios
- Gestión de productos y servicios con catálogo personalizable
- Administración de impuestos aplicables (IVA, ISR, IEPS)
📚 Consulta de Catálogos SAT
- Consulta en catálogos oficiales del SAT actualizados
- Consulta en catálogos oficiales de Descarga masiva del SAT actualizados
- Búsqueda de información en catálogos del SAT con filtros avanzados
- Acceso y búsqueda en catálogos completos
🎫 Gestión de Timbres y Créditos de Validación
- Gestión de folios fiscales: compra timbres a FiscalAPI y transfiere/retira a las personas de tu organización según tus reglas de negocio
- Listar transacciones del ledger con paginación
- Consultar transacciones por ID
- Transferir timbres entre personas
- Retirar timbres de una persona
- Transferir y retirar créditos de validación SAT con
credit_type=CreditType.VALIDATION
🛡️ Validaciones SAT
- Estructura del XML contra el Anexo 20 y los complementos declarados
- Vigencia del certificado del emisor a la fecha de emisión
- Sello del CFDI y sello del SAT en el Timbre Fiscal Digital
- Estatus del comprobante en el SAT (vigente, cancelado, no encontrado)
- Listas negras del artículo 69-B y 69-B Bis del CFF, por CFDI o por RFC
- Catálogo de tipos de validación y de los estatus que cada uno puede tomar
📖 Recursos Adicionales
- Cientos de ejemplos de código disponibles en múltiples lenguajes de programación
- Documentación completa con guías paso a paso
- Ejemplos prácticos para casos de uso comunes
- Soporte técnico especializado
- Actualizaciones regulares conforme a cambios del SAT
📦 Instalación
pip:
pip install fiscalapi
poetry:
poetry add fiscalapi
⚙️ Configuración
Configuración Básica
- Crea un objeto de configuración con tus credenciales:
from fiscalapi import FiscalApiSettings
settings = FiscalApiSettings(
api_url="https://test.fiscalapi.com", # https://live.fiscalapi.com (producción)
api_key="<API_KEY>",
tenant="<TENANT_KEY>"
)
- Crea la instancia del cliente:
from fiscalapi 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 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
Descarga certificados de prueba
from fiscalapi 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 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 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 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 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
# Visite https://docs.fiscalapi.com/catalogs
# Buscar registros que contengan 'Tarjeta' en el catalogo oficial Formas de pago 'SatPaymentForms' (página 1, tamaño página 10)
api_response = client.catalogs.search_catalog("SatPaymentForms", "Tarjeta", 1, 10)
if api_response.succeeded:
for item in api_response.data.items:
print(f"Unidad: {item.description}")
else:
print(api_response.message)
8. Validaciones SAT
Cada tipo de validación solicitado consume un crédito de validación. El cobro es todo o nada: si el saldo no alcanza para todos, no se ejecuta ninguno y la API responde 403.
import base64
from pathlib import Path
from fiscalapi import SatValidationRequest, SatValidationTypeIds
# Validar un CFDI timbrado: con xml puedes solicitar cualquier tipo de validación
request = SatValidationRequest(
xml=base64.b64encode(Path("factura.xml").read_bytes()).decode("ascii"),
validation_types=[
SatValidationTypeIds.XML_STRUCTURE,
SatValidationTypeIds.CFDI_SELLO,
SatValidationTypeIds.CFDI_STATUS,
SatValidationTypeIds.BLACKLIST_69B,
]
)
api_response = client.sat_validations.validate(request)
if api_response.succeeded:
for result in api_response.data:
veredicto = "PASSED" if result.passed else "FAILED"
print(f"[{veredicto}] {result.type.id.value} -> {result.status.id.value}")
if result.status.details:
print(f" {result.status.details}")
else:
print(api_response.details)
Para consultar únicamente listas negras basta el RFC, sin enviar el CFDI:
request = SatValidationRequest(
tin="FUNK671228PH6",
validation_types=[
SatValidationTypeIds.BLACKLIST_69B,
SatValidationTypeIds.BLACKLIST_69B_BIS,
]
)
api_response = client.sat_validations.validate(request)
Envía xml o tin, nunca ambos y nunca ninguno: con tin solo se pueden solicitar listas negras.
El catálogo de tipos y los estatus que cada tipo puede tomar se consultan sin consumir créditos:
api_response = client.sat_validations.get_types()
api_response = client.sat_validations.get_type_by_id(SatValidationTypeIds.CFDI_STATUS)
api_response = client.sat_validations.get_statuses(SatValidationTypeIds.CFDI_STATUS)
9. Transferir Créditos de Validación
Los saldos nunca se mezclan: CreditType.STAMP mueve timbres (available_balance) y CreditType.VALIDATION mueve créditos de validación (available_validation_balance).
from fiscalapi import CreditType, StampTransactionParams
params = StampTransactionParams(
from_person_id="3f3478b4-60fd-459e-8bfc-f8239fc96257",
to_person_id="96b46762-d246-4a67-a562-510a25dbafa9",
amount=10,
comments="Asignación de créditos de validación",
credit_type=CreditType.VALIDATION
)
api_response = client.stamps.transfer_stamps(params)
📋 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.
- Timbres y créditos de validación Listar transacciones, transferir y retirar timbres o créditos de validación entre personas.
- Validaciones SAT Validar estructura, certificado, sellos, estatus en el SAT y listas negras 69-B de un CFDI o un RFC.
📂 Más Ejemplos
- Gestión de Timbres
- Validaciones SAT
- Complementos de Pago
- Facturas de Nómina
- Impuestos Locales (Por Valores)
- Impuestos Locales (Por Referencias)
🤝 Contribuir
- Haz un fork del repositorio.
- Crea una rama para tu feature:
git checkout -b feature/AmazingFeature - Realiza commits de tus cambios:
git commit -m 'Add some AmazingFeature' - Sube tu rama:
git push origin feature/AmazingFeature - Abre un Pull Request en GitHub.
🐛 Reportar Problemas
- Asegúrate de usar la última versión del SDK.
- Verifica si el problema ya fue reportado.
- Proporciona un ejemplo mínimo reproducible.
- 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
- Documentación Oficial
- Como obtener mis credenciales
- Portal de FiscalAPI
- Soporte técnico
- Certificados de prueba
- Postman Collection
- SDKs en otros lenguajes
Desarrollado con ❤️ por Fiscalapi
Metadata
Release files for fiscalapi 4.0.410
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| fiscalapi-4.0.410.tar.gz | 45.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fiscalapi-4.0.410-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 95.7 kB
Release files / fiscalapi-4.0.410.tar.gz
| Download URL | fiscalapi-4.0.410.tar.gz |
|---|---|
| Size | 45.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
29237c39ecc8aa3323d63024062856c480b81299e4d945ac42e913178bee0df6
|
|
BLAKE2b-256 checksum How to use checksums |
13040355bf70c4b1f2956d0baf85998452333f8c8cefe36587111ca13d9e039d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.13
|
Release files / fiscalapi-4.0.410-py3-none-any.whl
| Download URL | fiscalapi-4.0.410-py3-none-any.whl |
|---|---|
| Size | 49.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
475a86119a69b2e4575a5f36123246a5e974405885f9913a6c9a64ca3681f9ba
|
|
BLAKE2b-256 checksum How to use checksums |
132c194850069bcb3984316a5f06eb9f0d273382e6aa385b0035c8a4a0d4ef56
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.13
|
Security for fiscalapi 4.0.410
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.