Skip to main content
Reporter lets you generate XML-based reports that follow the official APIX structure, as required by the Brazilian Central Bank (BACEN). This guide walks you through the structure and logic used to generate the APIX 001 report (Document 1201) in XML.
APIX 001 reports must strictly follow the XSD schema defined by BACEN (version 2.5). Reporter automates the XML generation, but you remain responsible for validating the output and ensuring compliance with regulatory requirements.

What is APIX 001?


The APIX 001 is a monthly regulatory report that Pix participants — direct or indirect — must submit to the Brazilian Central Bank. It consolidates operational statistics for the institution’s Pix ecosystem during a given month.

What BACEN expects to receive

The report covers ten data sections:

Submission requirements

Header attributes

The root <APIX001> element requires these attributes:

Understanding the data structure


Before building the template, it’s important to understand how the Pix plugin data maps to each APIX 001 section.

Pix plugin data sources

The template queries data from the Pix plugin tables registered as Reporter data sources. The main entities used are:
The Pix plugin does not currently track DICT query events. The dict.entries table stores key registrations, not consultations. For ConsultasDict, source this metric from your infrastructure monitoring or API gateway logs. The template placeholder is included for structural reference only.
The data source prefix (e.g. pix_btg) depends on how you register the Pix plugin in Reporter. Replace it with your actual data source name.

Transfers table structure

Refunds table structure

Refund reason codes

Fee charge structure (JSONB)

The fee_charge field is a JSONB column populated only for CASHIN (receiving) transactions:
CASHOUT transactions do not have fee charges in the current product model. Revenue from CASHOUT sources should be reported as zero unless your implementation charges fees on outgoing transfers.

Data mapping


Transaction detail types

Detail type 7 should only count rejections due to fraud indication — not all rejected transactions. The current template uses status == "REJECTED" as a simplified filter. In production, cross-reference with dict.infraction_reports (filtering by fraud-related situation_type) or apply specific failed_reason codes. Validate this logic with your engineering team before submitting to BACEN.

Transaction purposes

The report requires exactly 12 transaction entries — one for each combination of 3 detail types × 4 purposes. Entries with no matching data must still be present with zero values.

Revenue sources

Refund detail types

Cautionary block detail types

Authorization payer types (Pix Automático)

Using Reporter


Here is the complete template for generating APIX 001 in Reporter. This example uses pix_btg as the data source prefix — replace it with the name configured in your Reporter data source setup.
Reporter’s report request (POST /v1/reports) accepts only templateId and filters — there is no input for arbitrary template parameters. Set the reference year and month (Ano, Mes) and the responsible person’s attributes (NomeResp, EmailResp, TelResp) directly in the template before each submission, the same way TipoEnvio is set.

Code breakdown


Root element

  • DtArquivo: File generation date, dynamically inserted via date_time
  • Ano and Mes: Reference year and month — static values you update in the template for each submission (the report request carries no template parameters)
  • ISPB: First 8 digits of the institution’s CNPJ, extracted using the slice filter from Midaz onboarding data
  • TipoEnvio: I for inclusion, S for replacement of previously approved data

Transactions section

The template explicitly declares all 12 required entries (3 detail types × 4 purposes). Dynamic queries are used where data exists:
  • count_by counts records matching the filter condition
  • sum_by ... by "field" sums a specific field across matching records
  • ValorEspecie is 0.00 for standard transfers (only non-zero for Pix Saque/Troco)
Entries for purposes 2, 3, and 4 (Pix Saque, Troco, Automático) use hardcoded zeros when those features are not implemented. Detail type 6 (direct participant settlement) also uses zeros for indirect participants.

Refunds section

Refunds are split by reason code using the reason field:
  • FR01 maps to BACEN detail type 1 (fraud via MED)
  • All other reason codes (BE08, MD06, SL02) map to detail type 2

Revenue section

Revenue is extracted from the fee_charge.totalAmount JSONB field, filtered by transfer type and person type:
The fee_charge JSONB field uses nested field path syntax (fee_charge.totalAmount). Reporter’s Pongo2 engine navigates the JSON structure to access the nested value.

Time metrics and availability

Time metrics (transaction processing times, DICT operation times) and availability index must be sourced from your infrastructure monitoring system — they are not derived from transactional data. Populate these values from your SPI logs and uptime monitoring.

DICT queries

This placeholder counts DICT entries (key registrations) as a structural reference. In production, replace dict.entries with your actual DICT query log data source or populate QtdConsultas manually from infrastructure metrics.

Rendered example


Request example with date filter


To generate the APIX 001 for a specific month, send a POST /v1/reports request with the following body:
Dates must be in ISO 8601 format with UTC timezone (Z). Make sure to cover the entire reference month — from the first second to the last.

XSD validation rules


Key constraints from the official APIX 001 XSD (version 2.5) that your data must satisfy:
BACEN validates both structure and cardinality. If your report has fewer or more entries than expected in any section, the submission will be rejected.

Best practices


Zero-value entries

Even when there are no transactions for a given combination, the entry must still appear in the report with zero values. BACEN requires all 12 transaction entries, all 4 revenue entries, all 4 cautionary block entries, and all 2 authorization entries — regardless of whether data exists.

Replacement submissions

Use TipoEnvio="S" only to replace a previously approved submission. If your first submission was rejected, resubmit with TipoEnvio="I".

Value precision

All monetary values must have exactly 2 decimal places. Use Reporter’s formatting capabilities or ensure your data source provides pre-formatted values.

Time metric sourcing

Transaction time percentiles and DICT operation times must be sourced from your infrastructure monitoring — not from transactional data. These metrics reflect the actual user experience from payment initiation to settlement confirmation. BACEN may audit these values against SPI logs.

JSONB nested fields

Revenue calculations use nested field paths (e.g. fee_charge.totalAmount) to access values inside JSONB columns. Make sure your Reporter version supports nested field parsing in aggregation functions.
Always validate the rendered XML against BACEN’s official XSD before submission. You can download the schema from BACEN’s regulatory documents portal.