Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt

Use this file to discover all available pages before exploring further.

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:
SectionDescription
TransacoesTransaction volumes and values, broken down by detail type and purpose
DevolucoesRefund volumes and values (MED and other reasons)
BloqueiosCautelaresCautionary block counts and values
ReceitasRevenue from Pix operations by source and person type
TemposTransacoesTransaction processing time percentiles (P50, P99)
TemposDictDICT operation time percentiles (queries, registrations, portability)
ConsultasDictTotal DICT queries in the period
DisponibilidadeSystem availability index (percentage)
TempoAutorizacoesAuthorization processing time (P95)
AutorizacoesPix Automático authorization counts and stock by payer type

Submission requirements

DocumentFrequencyDeadlineReference
APIX 001Monthly15th business day of the following monthDocument 1201, XSD version 2.5

Header attributes

The root <APIX001> element requires these attributes:
AttributeDescriptionFormat
DtArquivoFile generation dateYYYY-MM-DD
AnoReference yearYYYY
MesReference month112
ISPBInstitution’s ISPB code (first 8 digits of CNPJ)8 numeric digits
NomeRespResponsible person’s nameText (max 200 chars)
EmailRespResponsible person’s emailValid email
TelRespResponsible person’s phoneText (max 14 chars)
TipoEnvioSubmission typeI (Inclusion) or S (Replacement)

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:
Data SourceTableContent
payment.transfersPix transfersTransaction records with status, amount, type, and fees
payment.refundsPix refundsRefund records with status, amount, and reason code
dict.entriesDICT entriesPix key registrations
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.
| dict.claims | DICT claims | Portability and ownership claims |
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

FieldTypeDescription
idUUIDUnique transfer identifier
statusStringTransaction status: COMPLETED, REJECTED, PENDING
amountDecimalTransaction value in BRL
transfer_typeStringCASHIN (receiving) or CASHOUT (sending)
destination_person_typeStringNATURAL_PERSON or LEGAL_PERSON
fee_chargeJSONBFee structure (populated only for CASHIN transactions)
failed_reasonStringRejection reason code (when status is REJECTED)
created_atTimestampCreation date and time

Refunds table structure

FieldTypeDescription
idUUIDUnique refund identifier
statusStringRefund status: COMPLETED, PENDING
amountDecimalRefund value in BRL
reasonStringReason code: FR01, BE08, MD06, SL02
created_atTimestampCreation date and time

Refund reason codes

CodeMeaningAPIX detail type
FR01Fraud (MED — Mecanismo Especial de Devolução)1
BE08Bank error2
MD06Customer request2
SL02Creditor-specific service (Pix Saque/Troco)2

Fee charge structure (JSONB)

The fee_charge field is a JSONB column populated only for CASHIN (receiving) transactions:
{
  "applied": true,
  "calculationType": "FIXED",
  "totalAmount": "1.50",
  "netAmount": "98.50",
  "fees": [
    {
      "type": "TRANSACTION_FEE",
      "amount": "1.50"
    }
  ]
}
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

CodeDescriptionMapping
5Indirect participant (settled via direct participant)All completed transactions via the settlement partner
6Direct participant (own settlement)Zero for indirect participants
7Rejected due to fraud indicationTransactions with status == "REJECTED" filtered by fraud-indication reason (see warning below)
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

CodeDescriptionMapping
1Transfer / PurchaseCompleted transactions (status == "COMPLETED")
2Pix SaqueZero if not implemented
3Pix TrocoZero if not implemented
4Pix AutomáticoZero if not implemented
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

SourceDescriptionMapping
1Initiation by legal person (CASHOUT)fee_charge.totalAmount from CASHOUT + LEGAL_PERSON
2Receiving by legal person (CASHIN)fee_charge.totalAmount from CASHIN + LEGAL_PERSON
3Receiving by natural person (CASHIN)fee_charge.totalAmount from CASHIN + NATURAL_PERSON
4Initiation by natural person (CASHOUT)fee_charge.totalAmount from CASHOUT + NATURAL_PERSON

Refund detail types

CodeDescriptionMapping
1Fraud refund (MED)reason == "FR01"
2Other reasonsreason != "FR01" (BE08, MD06, SL02)

Cautionary block detail types

CodeDescription
1Requested
2Received
3Canceled by requester
4Canceled by recipient

Authorization payer types (Pix Automático)

CodeDescription
1Natural person
2Legal person

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.
<?xml version="1.0" encoding="UTF-8"?>
<APIX001 DtArquivo="{% date_time 'YYYY-MM-dd' %}"
         Ano="{{ report_params.year }}"
         Mes="{{ report_params.month }}"
         ISPB="{{ midaz_onboarding.organization.0.legal_document|slice:':8' }}"
         NomeResp="{{ report_params.responsible_name }}"
         EmailResp="{{ report_params.responsible_email }}"
         TelResp="{{ report_params.responsible_phone }}"
         TipoEnvio="I">

    <Transacoes>
        <!-- Detail 5: Indirect participant — Purpose 1: Transfer/Purchase -->
        <Transacao>
            <QtdTransacoes>{% count_by pix_btg:payment.transfers if status == "COMPLETED" %}</QtdTransacoes>
            <ValorTransacoes>{% sum_by pix_btg:payment.transfers by "amount" if status == "COMPLETED" %}</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
            <FinalidadeTransacoes>1</FinalidadeTransacoes>
        </Transacao>

        <!-- Detail 5 — Purpose 2: Pix Saque -->
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
            <FinalidadeTransacoes>2</FinalidadeTransacoes>
        </Transacao>

        <!-- Detail 5 — Purpose 3: Pix Troco -->
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
            <FinalidadeTransacoes>3</FinalidadeTransacoes>
        </Transacao>

        <!-- Detail 5 — Purpose 4: Pix Automático -->
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
            <FinalidadeTransacoes>4</FinalidadeTransacoes>
        </Transacao>

        <!-- Detail 6: Direct participant (own settlement) -->
        <!-- Zero for indirect participants — no transactions settled directly -->
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>6</DetalhamentoTransacoes>
            <FinalidadeTransacoes>1</FinalidadeTransacoes>
        </Transacao>

        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>6</DetalhamentoTransacoes>
            <FinalidadeTransacoes>2</FinalidadeTransacoes>
        </Transacao>

        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>6</DetalhamentoTransacoes>
            <FinalidadeTransacoes>3</FinalidadeTransacoes>
        </Transacao>

        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>6</DetalhamentoTransacoes>
            <FinalidadeTransacoes>4</FinalidadeTransacoes>
        </Transacao>

        <!-- Detail 7: Rejected due to fraud indication -->
        <Transacao>
            <QtdTransacoes>{% count_by pix_btg:payment.transfers if status == "REJECTED" %}</QtdTransacoes>
            <ValorTransacoes>{% sum_by pix_btg:payment.transfers by "amount" if status == "REJECTED" %}</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>7</DetalhamentoTransacoes>
            <FinalidadeTransacoes>1</FinalidadeTransacoes>
        </Transacao>

        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>7</DetalhamentoTransacoes>
            <FinalidadeTransacoes>2</FinalidadeTransacoes>
        </Transacao>

        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>7</DetalhamentoTransacoes>
            <FinalidadeTransacoes>3</FinalidadeTransacoes>
        </Transacao>

        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>7</DetalhamentoTransacoes>
            <FinalidadeTransacoes>4</FinalidadeTransacoes>
        </Transacao>
    </Transacoes>

    <Devolucoes>
        <!-- Detail 1: Fraud refund (MED) — reason FR01 -->
        <Devolucao>
            <QtdDevolucoes>{% count_by pix_btg:payment.refunds if status == "COMPLETED" and reason == "FR01" %}</QtdDevolucoes>
            <ValorDevolucoes>{% sum_by pix_btg:payment.refunds by "amount" if status == "COMPLETED" and reason == "FR01" %}</ValorDevolucoes>
            <DetalhamentoDevolucoes>1</DetalhamentoDevolucoes>
        </Devolucao>

        <!-- Detail 2: Other refund reasons (BE08, MD06, SL02) -->
        <Devolucao>
            <QtdDevolucoes>{% count_by pix_btg:payment.refunds if status == "COMPLETED" and reason != "FR01" %}</QtdDevolucoes>
            <ValorDevolucoes>{% sum_by pix_btg:payment.refunds by "amount" if status == "COMPLETED" and reason != "FR01" %}</ValorDevolucoes>
            <DetalhamentoDevolucoes>2</DetalhamentoDevolucoes>
        </Devolucao>
    </Devolucoes>

    <BloqueiosCautelares>
        <!-- Cautionary blocks — report zeros when entity is not implemented -->
        <BloqueioCautelar>
            <QtdeBloqCaut>0</QtdeBloqCaut>
            <ValorBloqCaut>0.00</ValorBloqCaut>
            <DetalhamentoTransacoesBloqCaut>1</DetalhamentoTransacoesBloqCaut>
        </BloqueioCautelar>

        <BloqueioCautelar>
            <QtdeBloqCaut>0</QtdeBloqCaut>
            <ValorBloqCaut>0.00</ValorBloqCaut>
            <DetalhamentoTransacoesBloqCaut>2</DetalhamentoTransacoesBloqCaut>
        </BloqueioCautelar>

        <BloqueioCautelar>
            <QtdeBloqCaut>0</QtdeBloqCaut>
            <ValorBloqCaut>0.00</ValorBloqCaut>
            <DetalhamentoTransacoesBloqCaut>3</DetalhamentoTransacoesBloqCaut>
        </BloqueioCautelar>

        <BloqueioCautelar>
            <QtdeBloqCaut>0</QtdeBloqCaut>
            <ValorBloqCaut>0.00</ValorBloqCaut>
            <DetalhamentoTransacoesBloqCaut>4</DetalhamentoTransacoesBloqCaut>
        </BloqueioCautelar>
    </BloqueiosCautelares>

    <Receitas>
        <!-- Source 1: Initiation by legal person (CASHOUT) -->
        <Receita>
            <ValorReceita>0.00</ValorReceita>
            <FonteReceita>1</FonteReceita>
        </Receita>

        <!-- Source 2: Receiving by legal person (CASHIN) -->
        <Receita>
            <ValorReceita>{% sum_by pix_btg:payment.transfers by "fee_charge.totalAmount" if transfer_type == "CASHIN" and destination_person_type == "LEGAL_PERSON" and status == "COMPLETED" %}</ValorReceita>
            <FonteReceita>2</FonteReceita>
        </Receita>

        <!-- Source 3: Receiving by natural person (CASHIN) -->
        <Receita>
            <ValorReceita>{% sum_by pix_btg:payment.transfers by "fee_charge.totalAmount" if transfer_type == "CASHIN" and destination_person_type == "NATURAL_PERSON" and status == "COMPLETED" %}</ValorReceita>
            <FonteReceita>3</FonteReceita>
        </Receita>

        <!-- Source 4: Initiation by natural person (CASHOUT) -->
        <Receita>
            <ValorReceita>0.00</ValorReceita>
            <FonteReceita>4</FonteReceita>
        </Receita>
    </Receitas>

    <!-- Time metrics — must be sourced from your SPI/infrastructure monitoring -->
    <TemposTransacoes
        Perc50TempoExpUsuarioLiqSPI="0.00"
        Perc99TempoExpUsuarioLiqSPI="0.00"
        Perc50TempoExpUsuarioLiqForaSPI="0.00"
        Perc99TempoExpUsuarioLiqForaSPI="0.00"
        TempoMaxBloqueioCautelar="0.00" />

    <TemposDict
        Perc99TempoUsuarioConsulta="0.00"
        PercTempoEnvioRegistro="0.00"
        PercTempoExpUsuarioRegistro="0.00"
        PercTempoExpUsuarioExclusao="0.00"
        PercTempoNotificacaoPortabilidade="0.00"
        PercTempoEnvioPortabilidade="0.00"
        PercTempoAberturaMED="0.00" />

    <ConsultasDict QtdConsultas="{% count_by pix_btg:dict.entries %}" />

    <!--
      WARNING: dict.entries stores Pix key registrations, not DICT query events.
      Replace with your actual DICT query log data source or populate manually
      from infrastructure metrics.
    -->

    <Disponibilidade IndiceDisponibilidade="0.00" />

    <TempoAutorizacoes Perc95TempoAutorizacao="0.00" />

    <Autorizacoes>
        <!-- Pix Automático — report zeros when not implemented -->
        <Autorizacao>
            <QtdAutorizacoes>0</QtdAutorizacoes>
            <QtdEstoqueAutorizacoes>0</QtdEstoqueAutorizacoes>
            <TipoPagador>1</TipoPagador>
        </Autorizacao>

        <Autorizacao>
            <QtdAutorizacoes>0</QtdAutorizacoes>
            <QtdEstoqueAutorizacoes>0</QtdEstoqueAutorizacoes>
            <TipoPagador>2</TipoPagador>
        </Autorizacao>
    </Autorizacoes>

</APIX001>

Code breakdown


Root element

<APIX001 DtArquivo="{% date_time 'YYYY-MM-dd' %}"
         Ano="{{ report_params.year }}"
         Mes="{{ report_params.month }}"
         ISPB="{{ midaz_onboarding.organization.0.legal_document|slice:':8' }}"
         ...
         TipoEnvio="I">
  • DtArquivo: File generation date, dynamically inserted via date_time
  • Ano and Mes: Reference year and month, passed as report 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:
<!-- Detail 5: Indirect participant — Purpose 1: Transfer/Purchase -->
<Transacao>
    <QtdTransacoes>{% count_by pix_btg:payment.transfers if status == "COMPLETED" %}</QtdTransacoes>
    <ValorTransacoes>{% sum_by pix_btg:payment.transfers by "amount" if status == "COMPLETED" %}</ValorTransacoes>
    <ValorEspecie>0.00</ValorEspecie>
    <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
    <FinalidadeTransacoes>1</FinalidadeTransacoes>
</Transacao>
  • 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:
<!-- Detail 1: Fraud refund (MED) -->
<Devolucao>
    <QtdDevolucoes>{% count_by pix_btg:payment.refunds if status == "COMPLETED" and reason == "FR01" %}</QtdDevolucoes>
    <ValorDevolucoes>{% sum_by pix_btg:payment.refunds by "amount" if status == "COMPLETED" and reason == "FR01" %}</ValorDevolucoes>
    <DetalhamentoDevolucoes>1</DetalhamentoDevolucoes>
</Devolucao>

<!-- Detail 2: Other reasons (BE08, MD06, SL02) -->
<Devolucao>
    <QtdDevolucoes>{% count_by pix_btg:payment.refunds if status == "COMPLETED" and reason != "FR01" %}</QtdDevolucoes>
    <ValorDevolucoes>{% sum_by pix_btg:payment.refunds by "amount" if status == "COMPLETED" and reason != "FR01" %}</ValorDevolucoes>
    <DetalhamentoDevolucoes>2</DetalhamentoDevolucoes>
</Devolucao>
  • 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:
<!-- Source 2: Receiving by legal person (CASHIN) -->
<Receita>
    <ValorReceita>{% sum_by pix_btg:payment.transfers by "fee_charge.totalAmount" if transfer_type == "CASHIN" and destination_person_type == "LEGAL_PERSON" and status == "COMPLETED" %}</ValorReceita>
    <FonteReceita>2</FonteReceita>
</Receita>
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

<ConsultasDict QtdConsultas="{% count_by pix_btg:dict.entries %}" />
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


<?xml version="1.0" encoding="UTF-8"?>
<APIX001 DtArquivo="2026-04-15"
         Ano="2026"
         Mes="3"
         ISPB="12345678"
         NomeResp="João Silva"
         EmailResp="joao.silva@institution.com.br"
         TelResp="11999998888"
         TipoEnvio="I">

    <Transacoes>
        <Transacao>
            <QtdTransacoes>150000</QtdTransacoes>
            <ValorTransacoes>75000000.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
            <FinalidadeTransacoes>1</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
            <FinalidadeTransacoes>2</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
            <FinalidadeTransacoes>3</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>5</DetalhamentoTransacoes>
            <FinalidadeTransacoes>4</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>6</DetalhamentoTransacoes>
            <FinalidadeTransacoes>1</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>6</DetalhamentoTransacoes>
            <FinalidadeTransacoes>2</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>6</DetalhamentoTransacoes>
            <FinalidadeTransacoes>3</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>6</DetalhamentoTransacoes>
            <FinalidadeTransacoes>4</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>320</QtdTransacoes>
            <ValorTransacoes>160000.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>7</DetalhamentoTransacoes>
            <FinalidadeTransacoes>1</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>7</DetalhamentoTransacoes>
            <FinalidadeTransacoes>2</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>7</DetalhamentoTransacoes>
            <FinalidadeTransacoes>3</FinalidadeTransacoes>
        </Transacao>
        <Transacao>
            <QtdTransacoes>0</QtdTransacoes>
            <ValorTransacoes>0.00</ValorTransacoes>
            <ValorEspecie>0.00</ValorEspecie>
            <DetalhamentoTransacoes>7</DetalhamentoTransacoes>
            <FinalidadeTransacoes>4</FinalidadeTransacoes>
        </Transacao>
    </Transacoes>

    <Devolucoes>
        <Devolucao>
            <QtdDevolucoes>45</QtdDevolucoes>
            <ValorDevolucoes>22500.00</ValorDevolucoes>
            <DetalhamentoDevolucoes>1</DetalhamentoDevolucoes>
        </Devolucao>
        <Devolucao>
            <QtdDevolucoes>230</QtdDevolucoes>
            <ValorDevolucoes>115000.00</ValorDevolucoes>
            <DetalhamentoDevolucoes>2</DetalhamentoDevolucoes>
        </Devolucao>
    </Devolucoes>

    <BloqueiosCautelares>
        <BloqueioCautelar>
            <QtdeBloqCaut>0</QtdeBloqCaut>
            <ValorBloqCaut>0.00</ValorBloqCaut>
            <DetalhamentoTransacoesBloqCaut>1</DetalhamentoTransacoesBloqCaut>
        </BloqueioCautelar>
        <BloqueioCautelar>
            <QtdeBloqCaut>0</QtdeBloqCaut>
            <ValorBloqCaut>0.00</ValorBloqCaut>
            <DetalhamentoTransacoesBloqCaut>2</DetalhamentoTransacoesBloqCaut>
        </BloqueioCautelar>
        <BloqueioCautelar>
            <QtdeBloqCaut>0</QtdeBloqCaut>
            <ValorBloqCaut>0.00</ValorBloqCaut>
            <DetalhamentoTransacoesBloqCaut>3</DetalhamentoTransacoesBloqCaut>
        </BloqueioCautelar>
        <BloqueioCautelar>
            <QtdeBloqCaut>0</QtdeBloqCaut>
            <ValorBloqCaut>0.00</ValorBloqCaut>
            <DetalhamentoTransacoesBloqCaut>4</DetalhamentoTransacoesBloqCaut>
        </BloqueioCautelar>
    </BloqueiosCautelares>

    <Receitas>
        <Receita>
            <ValorReceita>0.00</ValorReceita>
            <FonteReceita>1</FonteReceita>
        </Receita>
        <Receita>
            <ValorReceita>85000.00</ValorReceita>
            <FonteReceita>2</FonteReceita>
        </Receita>
        <Receita>
            <ValorReceita>12000.00</ValorReceita>
            <FonteReceita>3</FonteReceita>
        </Receita>
        <Receita>
            <ValorReceita>0.00</ValorReceita>
            <FonteReceita>4</FonteReceita>
        </Receita>
    </Receitas>

    <TemposTransacoes
        Perc50TempoExpUsuarioLiqSPI="1.20"
        Perc99TempoExpUsuarioLiqSPI="4.50"
        Perc50TempoExpUsuarioLiqForaSPI="2.30"
        Perc99TempoExpUsuarioLiqForaSPI="8.10"
        TempoMaxBloqueioCautelar="0.00" />

    <TemposDict
        Perc99TempoUsuarioConsulta="0.80"
        PercTempoEnvioRegistro="1.50"
        PercTempoExpUsuarioRegistro="2.00"
        PercTempoExpUsuarioExclusao="1.80"
        PercTempoNotificacaoPortabilidade="3.00"
        PercTempoEnvioPortabilidade="2.50"
        PercTempoAberturaMED="5.00" />

    <ConsultasDict QtdConsultas="500000" />

    <Disponibilidade IndiceDisponibilidade="99.85" />

    <TempoAutorizacoes Perc95TempoAutorizacao="0.00" />

    <Autorizacoes>
        <Autorizacao>
            <QtdAutorizacoes>0</QtdAutorizacoes>
            <QtdEstoqueAutorizacoes>0</QtdEstoqueAutorizacoes>
            <TipoPagador>1</TipoPagador>
        </Autorizacao>
        <Autorizacao>
            <QtdAutorizacoes>0</QtdAutorizacoes>
            <QtdEstoqueAutorizacoes>0</QtdEstoqueAutorizacoes>
            <TipoPagador>2</TipoPagador>
        </Autorizacao>
    </Autorizacoes>

</APIX001>

Request example with date filter


To generate the APIX 001 for a specific month, send a POST /v1/reports request with the X-Organization-Id header and the following body:
{
  "templateId": "APIX_001_TEMPLATE_ID",
  "filters": {
    "pix_btg": {
      "payment.transfers": {
        "created_at": {
          "between": ["2026-03-01T00:00:00Z", "2026-03-31T23:59:59Z"]
        }
      },
      "payment.refunds": {
        "created_at": {
          "between": ["2026-03-01T00:00:00Z", "2026-03-31T23:59:59Z"]
        }
      }
    }
  }
}
FieldDescription
templateIdAPIX 001 template identifier registered in Reporter
filters.pix_btg.payment.transfersDate filter for the transfers collection
filters.pix_btg.payment.refundsDate filter for the refunds collection
created_at.betweenFilters records created within the specified month
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:
FieldConstraint
Monetary valuesUp to 15 digits total, 2 decimal places, minimum 0
QuantitiesInteger, minimum 0, max 999,999,999,999
Time valuesUp to 8 digits total, 2 decimal places, 0–999,999 seconds
AvailabilityPercentage, 0.00–100.00
ISPBExactly 8 numeric digits
Transaction entriesExactly 12 (3 detail types × 4 purposes)
Refund entriesExactly 2
Cautionary block entriesExactly 4
Revenue entriesExactly 4
Authorization entriesExactly 2
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.