Pix funds recovery [beta]
This guide details the process for recovering funds in Pix. There are two flows you can use.
INTERACTIVE—The Payment Service Provider (PSP) has full process control and is able to request multiple graphs and manually define prioritization.AUTOMATIC—The Diretório de Identificadores de Contas Transacionais (DICT)—a national Pix key registry and database—automatically manages tracking and blocking using a standard algorithm.
When to use each flow
| Criteria | INTERACTIVE | AUTOMATIC |
|---|---|---|
| Case complexity | High | Low/Medium |
| Need for human analysis | Yes | No |
| Case volume | Low/Medium | High |
| Control over prioritization | Total | Delegated to DICT |
| Parameter experimentation | Yes | No |
| Response time | Slower | Faster |
Flow examples
INTERACTIVE flow example
Scenario
Case: Fake investment scam with complex dispersion
- Victim: João Silva (CPF: 123.456.789-00)
- Amount: R$ 50,000.00
- Fraud date: 11/10/2025 at 2:30 PM
- Situation: Fraudster dispersed funds to multiple accounts across different banks
- Objective: PSP wants to carefully analyze the graph before prioritizing blocks
Timeline
Day 1 - 11/10/2025
2:30 PM - Fraudulent rransaction occurs
Victim (PSP A) → Fraudster (PSP B)
EndToEndId: E12345678901234567890123456789001
Amount: R$ 50,000.00
3:00 PM - Victim reports to PSP
João calls PSP, reporting that he was a victim of a fake investment scam.
3:30 PM - PSP validates eligibility
# PSP verifies:
- ✅ Transaction less than 80 days old
- ✅ Client has clean history
- ✅ Evidence of fraud (screenshots, conversations)
- ✅ Police report filed
3:45 PM - STEP 1: Funds recovery creation (INTERACTIVE)
Request:
POST /v1/pix/funds-recoveries
{
"flow_type": "INTERACTIVE",
"root_transaction_id": "E12345678901234567890123456789001",
"situation_type": "SCAM",
"contact_information": {
"email": "[email protected]",
"phone": "+5511987654321"
},
"report_details": "Client reports fake investment scam. Promised 20% monthly return. After transfer, scammer disappeared."
}
Response (201 Created):
{
"funds_recovery_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "CREATED",
"root_transaction_id": "E12345678901234567890123456789001",
"created_at": "2025-11-10T15:45:00Z"
}
Note: DICT creates the funds recovery and immediately generates an infraction notification for PSP B (root transaction). PSP B blocks R$ 50,000 (or available balance).
3:46 PM - Status event published
Event received:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"schema_version": 1,
"org_id": "TN-org-psp-a",
"cid": "cid-001",
"timestamp": "2025-11-10T15:46:00Z",
"data": {
"funds_recovery_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "CREATED",
"flow_type": "INTERACTIVE",
"root_transaction_id": "E12345678901234567890123456789001",
"situation_type": "SCAM",
"reporter_participant": "12345678",
"changed_at": "2025-11-10T15:46:00Z"
}
}
4:00 PM - STEP 2: Tracking graph creation (attempt 1)
PSP A decides to start with conservative parameters to get an initial view.
Request:
POST /v1/pix/funds-recoveries/550e8400-e29b-41d4-a716-446655440000/tracking-graph
{
"tracking_graph_parameters": {
"min_transaction_amount": 1000.00,
"max_transactions": 50,
"hop_window": "PT2H",
"max_hops": 3
}
}
Response (202 Accepted):
{
"code": "EPDA0000",
"message": "Tracking graph flow will continue asynchronously"
}
4:05 PM - Graph Created (Status: TRACKED)
TRACKED)DICT processes the tracking and returns a graph with 12 transactions.
Event received:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "TRACKED",
"changed_at": "2025-11-10T16:05:00Z"
}
}
4:10 PM - PSP queries the graph
Request:
GET /v1/pix/funds-recoveries/550e8400-e29b-41d4-a716-446655440000/tracking-graph
Response (200 OK) - Simplified graph:
{
"graph_id": "graph-001",
"funds_recovery_id": "550e8400-e29b-41d4-a716-446655440000",
"parameters": {
"min_transaction_amount": 1000.00,
"max_transactions": 50,
"hop_window": "PT2H",
"max_hops": 3
},
"persons": [
{"id": "P1", "type": "NATURAL_PERSON"},
{"id": "P2", "type": "NATURAL_PERSON"},
{"id": "P3", "type": "NATURAL_PERSON"},
{"id": "P4", "type": "NATURAL_PERSON"}
],
"accounts": [
{"id": "A1", "owner_id": "P1", "participant": "12345678"},
{"id": "A2", "owner_id": "P2", "participant": "87654321"},
{"id": "A3", "owner_id": "P3", "participant": "11111111"},
{"id": "A4", "owner_id": "P4", "participant": "22222222"}
],
"transactions": [
{
"id": "E12345678901234567890123456789001",
"debtor_account_id": "A1",
"creditor_account_id": "A2",
"amount": 50000.00,
"refundable_amount": 5000.00,
"settlement_time": "2025-11-10T14:30:00Z",
"hop": 0
},
{
"id": "E12345678901234567890123456789002",
"debtor_account_id": "A2",
"creditor_account_id": "A3",
"amount": 30000.00,
"refundable_amount": 15000.00,
"settlement_time": "2025-11-10T14:45:00Z",
"hop": 1
},
{
"id": "E12345678901234567890123456789003",
"debtor_account_id": "A2",
"creditor_account_id": "A4",
"amount": 15000.00,
"refundable_amount": 10000.00,
"settlement_time": "2025-11-10T14:50:00Z",
"hop": 1
}
],
"summary": {
"total_transactions": 12,
"total_amount": 95000.00,
"max_hop_reached": 3
},
"created_at": "2025-11-10T16:05:00Z"
}
4:15 PM - Analyst evaluates the graph
PSP A Analysis:
- Root transaction: R$ 50,000 → only R$ 5,000 available (fraudster withdrew almost everything)
- Hop 1: R$ 30,000 → R$ 15,000 available (money mule account 1)
- Hop 1: R$ 15,000 → R$ 10,000 available (money mule account 2)
- Hops 2-3: Small amounts dispersed
Conclusion: Parameters too conservative.
Decision: Request new graph with more aggressive parameters.
4:20 PM - Tracking graph creation (attempt 2)
Request:
POST /v1/pix/funds-recoveries/550e8400-e29b-41d4-a716-446655440000/tracking-graph
{
"tracking_graph_parameters": {
"min_transaction_amount": 100.00,
"max_transactions": 200,
"hop_window": "PT6H",
"max_hops": 5
}
}
4:30 PM - New graph created
Graph returns with 45 transactions, including smaller dispersions revealing a pattern of "atomization" of funds.
4:40 PM - STEP 3: Manual prioritization
PSP A analyst defines prioritization based on:
- Accounts with highest available balance
- Recently opened accounts (mules)
- Fast dispersion pattern
Prioritized transaction list (BFS ordering):
[
"E12345678901234567890123456789001", // Root (mandatory)
"E12345678901234567890123456789002", // Hop 1 - R$ 15,000 available
"E12345678901234567890123456789003", // Hop 1 - R$ 10,000 available
"E12345678901234567890123456789007", // Hop 2 - R$ 8,000 available
"E12345678901234567890123456789008", // Hop 2 - R$ 7,000 available
"E12345678901234567890123456789012" // Hop 3 - R$ 5,000 available
]
4:45 PM - STEP 4: Block request
Request:
POST /v1/pix/funds-recoveries/550e8400-e29b-41d4-a716-446655440000/block
{
"prioritization_strategy": "TRANSACTION_LIST",
"transactions": [
"E12345678901234567890123456789001",
"E12345678901234567890123456789002",
"E12345678901234567890123456789003",
"E12345678901234567890123456789007",
"E12345678901234567890123456789008",
"E12345678901234567890123456789012"
]
}
Response (202 Accepted):
{
"code": "EPDA0000",
"message": "Block funds recovery flow will continue asynchronously"
}
4:50 PM - Notifications rent (Status: AWAITING_ANALYSIS)
AWAITING_ANALYSIS)DICT validates prioritization and sends 6 infraction notifications to PSPs:
| PSP | EndToEndId | Block Amount | Status |
|---|---|---|---|
| PSP B | E1...001 | R$ 5,000 | Already blocked (root) |
| PSP C | E1...002 | R$ 15,000 | Block requested |
| PSP D | E1...003 | R$ 10,000 | Block requested |
| PSP E | E1...007 | R$ 8,000 | Block requested |
| PSP F | E1...008 | R$ 7,000 | Block requested |
| PSP G | E1...012 | R$ 5,000 | Block requested |
Event received:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "AWAITING_ANALYSIS",
"changed_at": "2025-11-10T16:50:00Z"
}
}
Days 2-8 - 11/11/2025 to 11/17/2025
STEP 5: Analysis by receiving PSPs (7 days)
Each PSP analyzes their notification:
11/11 - PSP C analyzes:
- Account opened 2 days ago (mule)
- Multiple transfers received and sent on the same day
- Client doesn't respond to contact
- Decision: ACCEPT
11/12 - PSP D analyzes:
- Old account (5 years)
- Client claims legitimate purchase
- Presents proof of sale (fake)
- Decision: REJECT
11/13 - PSP E analyzes:
- Account opened 1 day ago (mule)
- Full withdrawal made 2 hours after receiving
- Decision: ACCEPT
11/14 - PSP F analyzes:
- Account with fraud history
- Previous infraction marking
- Decision: ACCEPT
11/15 - PSP G analyzes:
- Account opened 3 days ago (mule)
- Multiple suspicious transfers
- Decision: ACCEPT
11/17 - 7-day deadline expires:
- PSP B didn't respond → Considered REJECTED
11/17 4:50 PM - Status Changes to ANALYSED
Event received:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "ANALYSED",
"changed_at": "2025-11-17T16:50:00Z"
}
}
Day 9 - 11/18/2025
10:00 AM - PSP A Queries Analysis Results
GET /v2/pix/infraction-reports?fundsRecoveryId=550e8400-e29b-41d4-a716-446655440000
Response:
{
"items": [
{
"id": "IR-001",
"transaction_id": "E12345678901234567890123456789001",
"status": "REJECTED",
"counterparty_participant": "87654321"
},
{
"id": "IR-002",
"transaction_id": "E12345678901234567890123456789002",
"status": "ACCEPTED",
"counterparty_participant": "11111111"
},
{
"id": "IR-003",
"transaction_id": "E12345678901234567890123456789003",
"status": "REJECTED",
"counterparty_participant": "22222222"
},
{
"id": "IR-004",
"transaction_id": "E12345678901234567890123456789007",
"status": "ACCEPTED",
"counterparty_participant": "33333333"
},
{
"id": "IR-005",
"transaction_id": "E12345678901234567890123456789008",
"status": "ACCEPTED",
"counterparty_participant": "44444444"
},
{
"id": "IR-006",
"transaction_id": "E12345678901234567890123456789012",
"status": "ACCEPTED",
"counterparty_participant": "55555555"
}
]
}
Summary:
- ✅ Accepted: 4 transactions (R$ 35,000 potential)
- ❌ Rejected: 2 transactions (R$ 15,000 lost)
10:30 AM - STEP 6: Refund request
Request:
Initiate refund funds recovery
POST /v1/pix/funds-recoveries/550e8400-e29b-41d4-a716-446655440000/refund
Response (202 Accepted):
{
"code": "EPDA0000",
"message": "Refund funds recovery flow will continue asynchronously"
}
10:35 AM - Status changes to REFUNDING
REFUNDINGEvent received:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "REFUNDING",
"changed_at": "2025-11-18T10:35:00Z"
}
}
10:40 AM - Sequential refunds initiated
DICT builds refund graph (accepted transactions only) and processes refunds sequentially:
Refund order:
1. E1...002 (PSP C) → R$ 15,000
2. E1...007 (PSP E) → R$ 8,000
3. E1...008 (PSP F) → R$ 7,000
4. E1...012 (PSP G) → R$ 5,000
Result: All refunds processed successfully
11:20 AM - Status changes to COMPLETED
COMPLETEDEvent received:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "COMPLETED",
"changed_at": "2025-11-18T11:20:00Z"
}
}
11:30 AM - PSP A notifies client
Email to João Silva:
Dear João,
Your funds recovery request has been completed.
Original Fraud Amount: R$ 50,000.00
Recovered Amount: R$ 35,000.00
Recovery Rate: 70%
The funds have been returned to your account.
Details:
- 4 institutions returned funds
- 2 institutions rejected (no evidence of fraud)
Sincerely,
Fraud Team - PSP A
INTERACTIVE flow summary
INTERACTIVE flow summaryTimeline:
- Day 1 (3:45 PM): Creation (CREATED)
- Day 1 (4:05 PM): First graph (TRACKED)
- Day 1 (4:30 PM): Second graph (TRACKED)
- Day 1 (4:50 PM): Block (AWAITING_ANALYSIS)
- Day 9 (4:50 PM): Analysis completed (ANALYSED)
- Day 10 (10:35 AM): Refund initiated (REFUNDING)
- Day 10 (11:20 AM): Process completed (COMPLETED)
Result:
✅ R$ 35,000 recovered (70%)
❌ R$ 15,000 not recovered (30%)
INTERACTIVE flow advantages:
- PSP tested different graph parameters
- Manually prioritized accounts with higher balances
- Focused on suspicious accounts (mules)
- Full control over the process
AUTOMATIC flow example
Scenario
Case: Wrong PIX scam (high volume, standard case)
- Victim: Maria Santos (CPF: 987.654.321-00)
- Amount: R$ 800.00
- Fraud date: 11/10/2025 at 9:15 AM
- Situation: Scammer convinced victim to send PIX "by mistake"
- Objective: PSP wants to process quickly using DICT's standard algorithm
Timeline
Day 1 - 11/10/2025
9:15 AM - Fraudulent transaction occurs
Victim (PSP A) → Scammer (PSP B)
EndToEndId: E98765432109876543210987654321001
Amount: R$ 800.00
9:30 AM - Victim reports to PSP
Maria calls PSP A reporting that she was a victim of a scam.
9:45 AM - STEP 1: Funds recovery creation (AUTOMATIC)
AUTOMATIC)PSP A Request:
POST /v1/pix/funds-recoveries
{
"flow_type": "AUTOMATED",
"root_transaction_id": "E98765432109876543210987654321001",
"situation_type": "SCAM",
"contact_information": {
"email": "[email protected]",
"phone": "+5511987654321"
},
"report_details": "Client reports wrong PIX scam. Scammer claimed to have sent PIX by mistake and requested refund.",
"tracking_graph_parameters": {
"min_transaction_amount": 50.00,
"max_transactions": 100,
"hop_window": "PT1H",
"max_hops": 4
}
}
Response (202 Accepted):
{
"code": "EPDA0000",
"message": "Funds recovery flow will continue asynchronously"
}
9:46 AM - Automatic processing initiated
Note: DICT processes automatically:
- Creates funds recovery
- Sends root transaction infraction notification (PSP B blocks funds)
- Builds tracking graph (8 transactions, 3 hops)
- Calculates automatic prioritization
- Sends infraction notifications to 5 PSPs
9:50 AM - Event: CREATED
Event published:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "650e8400-e29b-41d4-a716-446655440001",
"status": "CREATED",
"flow_type": "AUTOMATED",
"changed_at": "2025-11-10T09:50:00Z"
}
}
9:55 AM - Event: AWAITING_ANALYSIS
AWAITING_ANALYSISAfter complete automatic processing, status changes directly to AWAITING_ANALYSIS:
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "650e8400-e29b-41d4-a716-446655440001",
"status": "AWAITING_ANALYSIS",
"flow_type": "AUTOMATED",
"changed_at": "2025-11-10T09:55:00Z"
}
}
Important note: In AUTOMATIC flow, the status never goes through TRACKED, as the graph is created internally by DICT without exposure to the PSP.
10:00 AM - PSP A Receives Confirmation
PSP A queries the recovery:
GET /v1/pix/funds-recoveries/650e8400-e29b-41d4-a716-446655440001
Response:
{
"id": "650e8400-e29b-41d4-a716-446655440001",
"status": "AWAITING_ANALYSIS",
"flow_type": "AUTOMATED",
"root_transaction_id": "E98765432109876543210987654321001",
"situation_type": "SCAM",
"reporter_participant": "12345678",
"created_at": "2025-11-10T09:45:00Z",
"updated_at": "2025-11-10T09:55:00Z"
}
Days 2-8 - 11/11/2025 to 11/17/2025
STEP 2: Analysis by receiving PSPs (7 days)
11/11 - PSP B analyzes (root transaction):
- Blocked balance: R$ 300 (of R$ 800)
- Client has complaint history
- Account with atypical movement
- Decision: ACCEPT
11/11 - PSP C analyzes:
- Mule account (opened 1 day ago)
- Blocked balance: R$ 200
- Decision: ACCEPT
11/12 - PSP D analyzes:
- Old account with clean history
- Client claims legitimate product sale
- Decision: REJECT
11/13 - PSP E analyzes:
- Mule account (opened 3 days ago)
- Multiple suspicious transfers
- Decision: ACCEPT
11/14 - PSP F analyzes:
- Account with fast dispersion pattern
- Blocked balance: R$ 80
- Decision: ACCEPT
11/17 9:55 AM - Status Changes to ANALYSED
ANALYSEDAfter 7 days or all responses, status automatically changes:
Event published:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "650e8400-e29b-41d4-a716-446655440001",
"status": "ANALYSED",
"changed_at": "2025-11-17T09:55:00Z"
}
}
Day 9 - 11/18/2025
8:00 AM - PSP A queries results
GET /v2/pix/infraction-reports?fundsRecoveryId=650e8400-e29b-41d4-a716-446655440001
Analysis summary:
- ✅ Accepted: 4 transactions (R$ 680 potential)
- ❌ Rejected: 1 transaction (R$ 150 lost)
8:30 AM - STEP 3: Refund Request
Request:
Initiate refund funds recovery
POST /v1/pix/funds-recoveries/650e8400-e29b-41d4-a716-446655440001/refund
Response (202 Accepted):
{
"code": "EPDA0000",
"message": "Refund funds recovery flow will continue asynchronously"
}
8:35 AM - Status Changes to REFUNDING
Event published:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "650e8400-e29b-41d4-a716-446655440001",
"status": "REFUNDING",
"changed_at": "2025-11-18T08:35:00Z"
}
}
8:40 AM - Sequential refunds
DICT builds refund graph (accepted transactions only) and processes refunds sequentially:
Refund order:
1. E9...001 (PSP B) → R$ 300
2. E9...002 (PSP C) → R$ 200
3. E9...005 (PSP E) → R$ 100
4. E9...007 (PSP F) → R$ 80
Result: All refunds processed successfully
9:00 AM - Status changes to COMPLETED
COMPLETEDEvent published:
Pix funds recovery status changed
{
"domain": "pix-dict",
"event_type": "funds_recoveries_status_changed",
"data": {
"funds_recovery_id": "650e8400-e29b-41d4-a716-446655440001",
"status": "COMPLETED",
"changed_at": "2025-11-18T09:00:00Z"
}
}
9:15 AM - PSP A Notifies Client
SMS to Maria Santos:
Hello Maria,
Your funds recovery has been completed!
Fraud amount: R$ 800.00
Recovered amount: R$ 680.00
Recovery rate: 85%
The funds are already in your account.
PSP A - Anti-Fraud Team
AUTOMATIC flow summary
AUTOMATIC flow summaryTimeline:
- Day 1 (9:45 AM): Creation + Automatic processing
- Day 1 (9:55 AM): Blocks sent (AWAITING_ANALYSIS)
- Day 9 (9:55 AM): Analysis completed (ANALYSED)
- Day 10 (8:35 AM): Refund initiated (REFUNDING)
- Day 10 (9:00 AM): Process completed (COMPLETED)
Result:
✅ R$ 680 recovered (85%)
❌ R$ 120 not recovered (15%)
AUTOMATIC flow advantages:
- Fast and automatic processing
- No need for human intervention
- Optimized DICT algorithm
- Ideal for high volume cases
- Shorter total processing time
Flow comparison
Side-by-side comparison
| Aspect | INTERACTIVE | AUTOMATIC |
|---|---|---|
| PSP control | Total | Limited |
| Setup time | ~1h (multiple graphs) | ~10 min (automatic) |
TRACKED status | ✅ Yes | ❌ No (skips directly) |
| Multiple graphs | ✅ Allowed | ❌ Only 1 (internal) |
| Prioritization | Manual or algorithm | Algorithm only |
| Graph visibility | ✅ Complete | ❌ Not exposed |
| Experimentation | ✅ Yes | ❌ No |
| Total time | 9-10 days | 9-10 days |
| Complexity | High | Low |
| Ideal for | Complex cases | Standard cases |
| Recommended volume | Low/Medium | High |
State flow
INTERACTIVE:
CREATED → TRACKED → AWAITING_ANALYSIS → ANALYSED → REFUNDING → COMPLETED
↓ ↓
CANCELLED CANCELLED
AUTOMATIC:
CREATED → AWAITING_ANALYSIS → ANALYSED → REFUNDING → COMPLETED
↓
CANCELLED
Endpoints called
INTERACTIVE:
| Name | URL |
|---|---|
| Create funds recovery | POST /funds-recoveries (without graph parameters) |
| Create tracking graph | POST /funds-recoveries/{id}/tracking-graph (can repeat) |
| Get tracking graph | GET /funds-recoveries/{id}/tracking-graph\ (query graph) |
| Block funds recovery | POST /funds-recoveries/{id}/block\ (with transaction list) |
| Initiate refund funds recovery | POST /funds-recoveries/{id}/refund |
AUTOMATIC:
| Name | URL |
|---|---|
| Create funds recovery | POST /funds-recoveries (with graph parameters) |
| Initiate refund funds recovery | POST /funds-recoveries/{id}/refund |
Events generated
Pix funds recovery status changed
INTERACTIVE:
1. funds_recoveries_status_changed (CREATED)
2. funds_recoveries_status_changed (TRACKED) - can repeat
3. funds_recoveries_status_changed (AWAITING_ANALYSIS)
4. funds_recoveries_status_changed (ANALYSED)
5. funds_recoveries_status_changed (REFUNDING)
6. funds_recoveries_status_changed (COMPLETED)
AUTOMATIC:
1. funds_recoveries_status_changed (CREATED)
2. funds_recoveries_status_changed (AWAITING_ANALYSIS)
3. funds_recoveries_status_changed (ANALYSED)
4. funds_recoveries_status_changed (REFUNDING)
5. funds_recoveries_status_changed (COMPLETED)
Updated about 1 hour ago