# Reconciliation (/en/docs/pix-processamento/tutoriais/reconciliation)

<QuickLinks>
  <QuickLink href="/docs/pix-processamento/endpoints/reports/get_user_transactions" title="GET /user/transactions" method="GET" path="/user/transactions" />

  <QuickLink href="/docs/pix-processamento/endpoints/reports/post_user_report" title="POST /user/report" method="POST" path="/user/report" />

  <QuickLink href="/docs/pix-processamento/best-practices/pagination" title="Pagination" />

  <QuickLink href="/docs/pix-processamento/best-practices/multi-tenant" title="Multi-tenant" />
</QuickLinks>

<Mermaid
  chart="`
flowchart LR
  A[&#x22;Short period&#x22;] --> B[&#x22;GET /user/transactions&#x22;]
  A2[&#x22;Long period&#x22;] --> C[&#x22;POST /user/report&#x22;]
  C --> D[&#x22;GET /user/report/{id}&#x22;]
  D --> E[&#x22;POST /user/report/{id}/download&#x22;]
  B --> F[&#x22;Cross-check with your DB&#x22;]
  E --> F
  F --> G[&#x22;Alert on mismatches&#x22;]

  click B &#x22;/en/docs/pix-processamento/endpoints/reports/get_user_transactions&#x22; &#x22;GET /user/transactions&#x22;
  click C &#x22;/en/docs/pix-processamento/endpoints/reports/post_user_report&#x22; &#x22;POST /user/report&#x22;
  click D &#x22;/en/docs/pix-processamento/endpoints/reports/get_user_report&#x22; &#x22;GET /user/report/{id}&#x22;
  click E &#x22;/en/docs/pix-processamento/endpoints/reports/download_user_report&#x22; &#x22;Download&#x22;

  style B fill:#14ce71,stroke:#0eb464,color:#ffffff
  style C fill:#3b82f6,stroke:#1d4ed8,color:#ffffff
  style F fill:#f59e0b,stroke:#d97706,color:#ffffff
`"
/>

## Real-time listing [#real-time-listing]

To check live transactions (dashboard, previous-day reconciliation):

```bash
curl "https://api.payzu.processamento.com/v1/user/transactions?dateFrom=2025-08-01&dateTo=2025-08-31&page=1&limit=100" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json"
```

Filter details in [`GET /user/transactions`](/docs/pix-processamento/endpoints/reports/get_user_transactions).

The listing filters (`clientReference`, `status`, `type`, window via `dateFrom`/`dateTo`, `endToEndId`, `document`/`name`, `virtualAccount`) are documented in [Pagination · Available filters](/docs/pix-processamento/best-practices/pagination#available-filters).

### Transaction detail [#transaction-detail]

```bash
curl "https://api.payzu.processamento.com/v1/user/transactions/PAYZU2025..." \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json"
```

Schema in [`GET /user/transactions/{id}`](/docs/pix-processamento/endpoints/reports/get_user_transaction_by_id).

## Async report [#async-report]

For large windows (month, year), use the 3-step flow.

<Steps>
  <Step>
    ### Request generation [#request-generation]

    [`POST /user/report`](/docs/pix-processamento/endpoints/reports/post_user_report).

    ```bash
    curl -X POST https://api.payzu.processamento.com/v1/user/report \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "dateFrom": "2025-01-01",
        "dateTo": "2025-12-31",
        "status": ["COMPLETED"],
        "type": ["DEPOSIT", "WITHDRAW"]
      }'
    ```

    The response includes the job `id`.
  </Step>

  <Step>
    ### Track status [#track-status]

    [`GET /user/report/{id}`](/docs/pix-processamento/endpoints/reports/get_user_report).

    ```bash
    curl "https://api.payzu.processamento.com/v1/user/report/JOB_ID" \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json"
    ```
  </Step>

  <Step>
    ### Download when ready [#download-when-ready]

    [`POST /user/report/{id}/download`](/docs/pix-processamento/endpoints/reports/download_user_report) returns a short-lived signed URL to download the CSV.

    ```bash
    curl -X POST "https://api.payzu.processamento.com/v1/user/report/JOB_ID/download" \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json"
    ```
  </Step>
</Steps>

## Recommended strategy [#recommended-strategy]

1. **Identify each Pix charge/payment with `clientReference`**, that's your identifier, don't rely only on PayZu's `id`.
2. **Use callbacks as the primary source**, don't poll.
3. **Daily reconciliation via report**: pull the previous day's CSV and cross-check with your DB. Detects missed callbacks.
4. **Store `endToEndId`**, useful for tracing at Bacen in case of a dispute.
5. **Sort by `createdAt` or `paidAt`**, never by `id`. The `id` is opaque and the date fragment it carries has day-level precision, so it doesn't order two transactions on the same day.

## Balances [#balances]

To check available balance before paying:

```bash
curl https://api.payzu.processamento.com/v1/user/balance \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json"
```

See [`GET /user/balance`](/docs/pix-processamento/endpoints/account/get_user_balance).