Skip to content

Querying Invoices

Use auth.invoices when you need invoice metadata outside a sending session. Metadata queries are filter-driven and paginated by KSeF.

Keep filters narrow. Date ranges, role, and invoice type make queries faster and reduce pagination work.

from datetime import datetime, timedelta, timezone
from ksef2.domain.models import InvoicesFilter
filters = InvoicesFilter(
role="seller",
date_type="issue_date",
date_from=datetime.now(tz=timezone.utc) - timedelta(days=7),
date_to=datetime.now(tz=timezone.utc),
amount_type="brutto",
invoicing_mode="online",
invoice_types=["vat"],
)
from ksef2.domain.models import InvoiceMetadataParams
page = auth.invoices.query_metadata(
filters=filters,
params=InvoiceMetadataParams(sort_order="asc"),
)
for invoice in page.invoices:
print(invoice.ksef_number, invoice.invoice_number)

KSeF processing is asynchronous. After sending an invoice, poll metadata when your next step depends on the invoice becoming visible in retrieval APIs.

result = auth.invoices.wait_for_invoices(
filters=filters,
timeout=120.0,
poll_interval=2.0,
)
for invoice in result.invoices:
print(invoice.ksef_number)
  1. Decide which subject role you are querying as.

  2. Build a narrow InvoicesFilter.

  3. Fetch one page for interactive screens or use iterators for background jobs.

  4. Persist KSeF numbers needed for later downloads.