Overview
Chargeback disputes are the last chance for a merchant to recover revenue loss after a chargeback has been filed against it.
The merchant has the opportunity to provide compelling evidence that proves the legitimacy of transactions claimed to be inappropriate by customers. If the evidence is adjudged to be strong enough, the merchant can keep the revenue despite the chargeback.
1. Objective
This documentation intends to help Merchant developers integrate to the PPRO Chargeback Disputes API, by describing the operations available with examples of requests and responses.
2. Dispute Process
2.1. General flow
The dispute process starts when a customer complains to an issuer about a transaction. Reasons for complaint vary and include, but are not limited to, fraud and consumer disputes. The issuer reports the chargeback claim to the acquirer, who then opens a case for dispute. PPRO shares the case information with the merchant, who can decide to dispute it or accept the chargeback. To start a dispute, the merchant submits compelling evidence to PPRO, who forwards it to the acquirer and issuer. If the issuer decides in favor of the merchant, the chargeback is not deducted from the merchant’s funds. On the other side, if the issuer decides in favor of the customer, the chargeback is discounted from the merchant’s funds and returned to the customer.
For the moment, disputes are enabled only in Brazil.
2.2. When to dispute
The merchant should accept a chargeback when:
-
the transaction is known to be fraudulent;
-
the evidence is not compelling enough;
-
the chargeback amount doesn’t compensate the effort to gather compelling evidence;
-
the merchant failed to refund the customer before the chargeback date.
The merchant should dispute a chargeback when:
-
there is strong evidence to support the case;
-
the chargeback amount is significant.
Disputes which involve transactions already refunded before the chargeback was created will be automatically disputed by PPRO on behalf of the merchant.
2.3. Timeline
The timeline of a dispute in Brazil is the following.
| Event | Limit Calendar Days |
|---|---|
Issuer reporting a chargeback |
365 days from transaction date |
Merchant responding to dispute |
9 days from chargeback reception date |
Issuer analyzing and deciding a dispute |
120 days from response date |
Issuer deducting a disputed chargeback |
365 days from response date |
The vast majority of the chargebacks deducted are discounted during the period of analysis and decision by the issuer. Surpassing this period without a chargeback being deducted is a great indication of having potentially won the dispute.
2.4. Case Status
Each chargeback available for dispute can go through some of the following statuses.
| Status | Description |
|---|---|
NEW |
It is the first status attributed to a newly-received case. It means the chargeback is available to be disputed. |
ACCEPTED |
If the merchant decides not to dispute and successfully submits an Accept request, then the case receives status ACCEPTED. It means that the chargeback will no longer be available for dispute. |
EXPIRED |
If the case reaches its response due date without a response from the merchant, its status will be automatically updated to EXPIRED. It means that the chargeback will no longer be available for dispute. |
DISPUTED |
If the merchant decides to dispute and successfully submits a Dispute request, then the case receives status DISPUTED. It means that evidence was submitted for analysis by the issuer. |
AWAITING_RESOLUTION |
If the merchant’s submitted Dispute request is acknowledged by the acquirer, then the case receives status AWAITING_RESOLUTION. It means that the acquirer is now aware of the Dispute, and it is analysing it to determine if the case will be WON or LOST. |
LOST |
If a chargeback is deducted by the acquirer, the status of the corresponding case is automatically updated to LOST. It means that the evidence, if provided, was insufficient and the chargeback amount was deducted. |
WON |
If no chargeback is deducted by the acquirer after analysis period, the status of the corresponding case is automatically updated to WON. It means that the evidence provided was sufficient and the Dispute was won. |
Status WON would correspond to cases that had no chargebacks deducted. Nevertheless, this status is not available in the current version of the API. Cases in this situation will remain indefinitely with previous status (DISPUTED, ACCEPTED or EXPIRED).
2.5. API Status Codes
List of status and error codes that can be returned by the API.
| API CODES | DESCRIPTION |
|---|---|
SUCCESS |
Any operation on the API that was successful. |
CASE_NOT_FOUND |
Case not found on our database. Invalid id. |
CASE_ALREADY_EXPIRED |
Tried to dispute a case that already has status expired. |
CASE_ALREADY_DISPUTED |
Tried to dispute a case that already has status disputed. |
CASE_ALREADY_LOST |
Tried to dispute a case that already has status lost. |
VALIDATION_ERROR |
Invalid request parameters or body. |
FILES_MISSING |
When trying to DISPUTE case, but not providing the required files. |
FILES_EXCEEDS_LIMIT_SIZE |
When trying to DISPUTE case, but sending files that exceed the size limits. |
FILES_INVALID_EXTENSION |
When trying to DISPUTE case, but sending files that extensions are not supported. |
INTERNAL_ERROR |
Any unexpected internal exception. |
2.6. Compelling Evidence
The quality of the evidence presented in the support documentation is directly related to the chances of success of a dispute. The merchant must prove that the cardholder participated in the transaction or benefitted from it. The recommended items to be submitted as evidence are listed below. In addition, merchants can send any other documentation that may be relevant to testify to the legitimacy of a transaction.
| Section | Information required | Description | Fraud | Commercial Disagreement |
|---|---|---|---|---|
Customer identification |
Personal details |
Customer name, cardholder name, tax id (CPF or CNPJ), email, telephone number, postal address. |
X |
X |
Registration steps |
Screenshots from mandatory fields in customer registration at merchant website. |
X |
X |
|
Connection with cardholder |
Evidence of relationship between the customer and the cardholder, if not the same person. |
X |
X |
|
Purchase history |
Transaction receipt |
Document that formalizes the purchase including merchant details, customer details, items purchased, prices and payment method details. |
X |
X |
Checkout |
Screenshots from mandatory checkboxes and selection of payment method at merchant checkout page. |
X |
X |
|
Evidence of use of product or service |
Details of method for sharing product keys or download codes. Evidence of use, such as dates of downloads, recent access to the platform or similar. |
X |
X |
|
Registration in the Customer Service Center |
Evidence of recent interaction, if any, between customer and customer support team through available channels, including topic discussed. |
X |
X |
|
Previous purchases |
Summary of currently disputed purchase vs past non-disputed purchases from the same card number, including purchased products, dates and amount. |
X |
X |
|
Terms and conditions |
Automatic renewal policy |
Summary of terms and conditions that authorize automatic renewal charges, followed by link with full policy. |
X |
|
Notification of renewal |
Evidence of notification to customer about automatic renewal charge. |
X |
||
Cancellation of automatic renewal |
Description of steps required for customer to deactivate automatic renewal option. |
X |
||
Refund conditions |
Summary of refund policy for related products, followed by link to full policy. |
X |
||
Support channels for refund request |
Contact details for customers to reach customer support channels. |
X |
||
General terms of use |
Summary of terms and conditions that define user rights, followed by link to full policy. |
X |
| The evidence can be provided in multiple files as long as the total size limit of 7MB is respected. Acceptable file extensions are PNG, JPG and PDF. |
| Preferably, the evidence would be presented in local language. If this is not possible, it should be presented in English. |
| Special attention should be given to the readability of screenshots in the documentation. Low resolution can prevent the delivery of critical information to the issuer. |
3. Hosts
| Environment | Endpoints |
|---|---|
|
|
|
To perform an operation, combine one of the hosts, from the expected environment with the endpoint of the desired operation and send it using the HTTP VERB as described in the operation.
It is necessary to contact PPRO to retrieve credentials for TEST and PRODUCTION. It can be done by e-mailing: merchant@ppro.com.
|
4. HTTP Verbs
We intend to get as close as possible to standard HTTP and REST conventions in the use of HTTP verbs.
| Verb | Usage |
|---|---|
|
Used to retrieve resources. |
|
Used to add a child resource under resources collection, it is a non-idempotent operation also commonly used to retrieve tokens. |
|
Used to partially update an existing resource, it is a non-idempotent operation. |
5. Authentication API
The Authentication(s) API is used to handle all operations over a Case.
5.1. Get Token
POST /security/auth/realms/ppro/protocol/openid-connect/token
Gets a token from our authorization entity.
5.1.1. Request Body
| Path | Type | Optional | Description |
|---|---|---|---|
client_id |
String |
false |
Fixed value |
username |
String |
false |
User name provided for authentication. |
password |
String |
false |
Password provided for authentication. |
grant_type |
String |
false |
Fixed value |
5.1.2. Response fields
| Path | Type | Optional | Description |
|---|---|---|---|
access_token |
String |
false |
The token to be used to the following requests. |
expires_in |
String |
false |
Token time to live. |
refresh_expires_in |
String |
true |
Refresh token time to live. |
refresh_token |
String |
true |
Used in cases where the client of the token exchange needs the ability to access a resource even when the original credential is no longer valid (e.g., user-not-present or offline scenarios where there is no longer any user entertaining an active session with the client). |
token_type |
String |
false |
Type of the token. It’s typically "Bearer". |
not-before-policy |
Timestamp |
true |
Not-before policy ensures that any tokens issued before that time become invalid. It returns 0 if there was no not-before policy pushed. |
session_state |
String |
true |
JSON string that represents the End-User’s login state at the OpenId Provider. |
scope |
String |
true |
Scope of the access token issued. |
5.1.3. Example request
POST /security/auth/realms/ppro/protocol/openid-connect/token HTTP/1.1
Host: test-chargebackdispute.ppro.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Content-Length: 99
client_id=chargeback-disputes-api&username=exampleuser&password=examplepassword&grant_type=password
5.1.4. Example response
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 1966
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhY3IiOiIxIiwiYXpwIjoiY2hhcmdlYmFjay1kaXNwdXRlcy1hcGkiLCJleHAiOjE2MDQ5Mjk4MTYsImlhdCI6MTYwNDkyOTUxNiwiaXNzIjoiaHR0cHM6Ly9zdGFnaW5nLXBwcm8ta2V5Y2xvYWstc2VydmljZS5hbGxwYWdvLmNvbS9wcHJvLWtleWNsb2FrLXNlcnZpY2UvYXV0aC9yZWFsbXMvcHBybyIsImp0aSI6IjliZWJjNmM1LTZlNTYtNDVhMS05ZDkwLTRiYTA5ZjlhZjNhMCIsIm9yZ2FuaXphdGlvbiI6ImV4YW1wbGUub3JnYW5pemF0aW9uIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZXhhbXBsZS51c2VyIiwic2NvcGUiOiJwcm9maWxlIiwic2Vzc2lvbl9zdGF0ZSI6ImQyZWZhNzM3LWM4NzAtNGUwOC1hMDA3LWFhZjg4YzcyODMyOCIsInN1YiI6ImQyZWZhNzM3LWM4NzAtNGUwOC1hMDA3LWFhZjg4YzcyODMyOCIsInR5cCI6IkJlYXJlciJ9.y5jLb7fdkQqPN2uHM28x18xRhyOrAaIaEvLD5nZOwcwgFRiprn9Gw60ZbLLPuA1Mo0VAD056w2EPO9cNkq6LVB-aNo9u5SDOnG65fglbY1Zf4cGjqEwfjvlwd66KaCYEkIEyjdxTbX4OceawA8q5IiI8AvNjJLDr8mK1_k0lOrglpPXQm77-wZkjbg2b-AUr_LM0JVOEB28XYuC3X4ZQzTfyj7UIB4UT7sFmPtda3nZXbHBisg6Rz-hurdfUp2lm4hNfrFDaqGB1fWlbF_at-CPB7deN55EuRJISu8lkYXAKShHlSfqkDhyDWD9xTh0fH77ErFstoy3_L7bPvMyImlXD4bE_8Ei-9uGiusf5dUL1IMieJwZnRio1PRQDZRKd50awFvL94i72EV4WwdxbsaXJXxIItK11JZuNrep0NxfWi42wHWT5XpnZ52ExzWRQ1h9rKn1H073wnKGd9qnvJ_lJQWr4D1RzM6nmDvHiQcC4v26Tk96R2rsENlU_dNSg",
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJodHRwczovL3N0YWdpbmctcHByby1rZXljbG9hay1zZXJ2aWNlLmFsbHBhZ28uY29tL3NlY3VyaXR5L2F1dGgvcmVhbG1zL3Bwcm8iLCJhenAiOiJjaGFyZ2ViYWNrLWRpc3B1dGVzLWFwaSIsImV4cCI6MTYwNDkzMTMxNiwiaWF0IjoxNjA0OTI5NTE2LCJpc3MiOiJodHRwczovL3N0YWdpbmctcHByby1rZXljbG9hay1zZXJ2aWNlLmFsbHBhZ28uY29tL3NlY3VyaXR5L2F1dGgvcmVhbG1zL3Bwcm8iLCJqdGkiOiI1MDRiZTY4NC1jNjk3LTQzMmYtYTE5OC0zZmMyMTdkOTRmNTIiLCJzY29wZSI6InByb2ZpbGUiLCJzZXNzaW9uX3N0YXRlIjoiYzEwZmVlZDAtNGQ3MS00YzMyLTk2MjYtZmQ2ZmQyYmEyMDYwIiwic3ViIjoiM2U0N2M2NDItNjczYi00YWM0LWExMTktNzA5OGEzNTgwMTBmIiwidHlwIjoiUmVmcmVzaCJ9.lmJsqnhOsJkrWYMESV3et1L8yUEdIHj-sD-dO5qoHbDQr08Cc_hHOkKStd9lIyvCRvZ5xZ5wJF3E1XL-8YF3mC6EIwjHy3g4VvBlPTm-Jnbq3Yz1WAzrcgPs8xjO-WQzsZJ3F1HIqoPEhHwCr3VHlKIEviawiI5ZKoLTtoqpKn5WCnM3JRKPgzFH8q5pgqo513t5HwLZfiLrE1H9VDdhj9p3oPILvWIkcGLC-5MO3KaBGpQu3sDuwJ5KOT5h1HRKn4vZrLWUFKipuzQfgaJJKfIVSnhC7hglYmXXOwxzbijz8P3Gy5n-9-M-NiwX92VWWW3Eg1fmXlhGHMOl8ngKcVYKL1naBqoZRIXAIeS2S2_xblHRLAU3mE_2FVcgzK7BV2okqNf587lInDhxtYZMMMe2s8e0wMAhZxQZNKdnZCeq5NRjqxgYTqcKl-BPbIX-_Rhv4TkZnFVDSlNhsQz5FKLX7hYndmjXyYBxEpFjJlJ08DWYS1Hm6xJzX4xVp2HZ",
"token_type": "bearer",
"not-before-policy": 0,
"session_state": "6409f39a-d1a1-4068-9324-f4bf6c2c7adf",
"scope": "profile"
}
6. Case(s) API
The Case(s) API is used to handle all operations over a Case. The Cases available for dispute can be simply ACCEPTED or DISPUTED by the Merchant.
It is important to know that after a period of 9 days from the reception date, the Case will be set as EXPIRED.
|
6.1. Get Case
GET /api/v1/cases/{id}
6.1.1. Path parameters
| Parameter | Type | Optional | Description |
|---|---|---|---|
id |
Object |
false |
6.1.2. Response fields
| Path | Type | Optional | Description |
|---|---|---|---|
id |
String |
false |
|
receptionDate |
String |
false |
|
responseDueDate |
String |
false |
|
responseDate |
String |
true |
|
chargebackAmount |
Decimal |
false |
Must be at least 0.0. |
reasonCode |
String |
true |
|
fraud |
Boolean |
true |
|
currency |
String |
false |
Size must be equal to 3. |
lastUpdateDate |
String |
false |
|
status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
merchant |
Object |
true |
|
merchant.name |
String |
true |
|
merchant.transactionId |
String |
false |
|
submerchant |
Object |
true |
|
submerchant.name |
String |
true |
|
transaction |
Object |
true |
|
transaction.uuid |
String |
true |
|
transaction.id |
String |
true |
|
transaction.date |
String |
true |
|
transaction.cardNumber |
String |
true |
|
transaction.brand |
String |
true |
|
transaction.descriptor |
String |
true |
|
transaction.amount |
Decimal |
false |
Must be at least 0.0. |
statuses |
Array[Object] |
false |
|
statuses[].status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
statuses[].date |
String |
false |
6.1.3. Example request
GET /api/v1/cases/df071f04-9ef4-41c9-a7b3-cb302a73c1b3 HTTP/1.1
Content-Type: application/json
Host: test-chargebackdispute.ppro.com
6.1.4. Example response
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 830
{
"id" : "df071f04-9ef4-41c9-a7b3-cb302a73c1b3",
"receptionDate" : "2025-11-28T11:32:42.409396",
"responseDueDate" : "2026-01-11T11:32:42.409396",
"responseDate" : "2025-12-18T11:32:42.409396",
"chargebackAmount" : 10000.0,
"reasonCode" : "2189",
"fraud" : false,
"currency" : "BRL",
"lastUpdateDate" : "2025-12-28T11:32:42.409396",
"status" : "NEW",
"merchant" : {
"name" : "adobe",
"transactionId" : "36c0764c-8ed6-4c2c-919a-dfce4e0d4c2a"
},
"submerchant" : { },
"transaction" : {
"uuid" : "2dd42c8d-af35-48f1-b88e-ebab031cbe08",
"date" : "2025-12-03T11:32:42.409451",
"cardNumber" : "445512******3456",
"brand" : "Visa",
"descriptor" : "Product 0001",
"amount" : 10000.35
},
"statuses" : [ {
"status" : "NEW",
"date" : "2025-12-28T11:32:42.409396"
} ]
}
6.2. Get Cases
GET /api/v1/cases
6.2.1. Query parameters
| Parameter | Type | Optional | Description |
|---|---|---|---|
from |
Object |
false |
Must be in the past or the present. |
to |
Object |
true |
|
dateCriterion |
String |
true |
Must be one of [RECEPTION_DATE, RESPONSE_DUE_DATE, RESPONSE_DATE, LAST_UPDATE_DATE].Default value: 'RECEPTION_DATE'. |
statuses |
Object |
true |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON].Default value: 'NEW'. |
page |
Integer |
true |
Must be at least 0 and at most 2147483647.Default value: '0'. |
size |
Integer |
true |
Must be at least 1 and at most 2000.Default value: '500'. |
6.2.2. Response fields
| Path | Type | Optional | Description |
|---|---|---|---|
numberOfElements |
Integer |
true |
|
page |
Integer |
true |
|
hasNext |
Boolean |
true |
|
content |
Array[Object] |
true |
|
content[].id |
String |
false |
|
content[].receptionDate |
String |
false |
|
content[].responseDueDate |
String |
false |
|
content[].responseDate |
String |
true |
|
content[].chargebackAmount |
Decimal |
false |
Must be at least 0.0. |
content[].reasonCode |
String |
true |
|
content[].fraud |
Boolean |
true |
|
content[].currency |
String |
false |
Size must be equal to 3. |
content[].lastUpdateDate |
String |
false |
|
content[].status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
content[].merchant |
Object |
true |
|
content[].merchant.name |
String |
true |
|
content[].merchant.transactionId |
String |
false |
|
content[].submerchant |
Object |
true |
|
content[].submerchant.name |
String |
true |
|
content[].transaction |
Object |
true |
|
content[].transaction.uuid |
String |
true |
|
content[].transaction.id |
String |
true |
|
content[].transaction.date |
String |
true |
|
content[].transaction.cardNumber |
String |
true |
|
content[].transaction.brand |
String |
true |
|
content[].transaction.descriptor |
String |
true |
|
content[].transaction.amount |
Decimal |
false |
Must be at least 0.0. |
content[].statuses |
Array[Object] |
false |
|
content[].statuses[].status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
content[].statuses[].date |
String |
false |
6.2.3. Example request
GET /api/v1/cases?from=2025-12-28&to=2025-12-28&dateCriterion=LAST_UPDATE_DATE&statuses=NEW&page=0&size=100 HTTP/1.1
Content-Type: application/json
Host: test-chargebackdispute.ppro.com
6.2.4. Example response
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 2746
{
"content" : [ {
"id" : "9b15c89d-a7ab-4b9d-8404-a7036fe79114",
"receptionDate" : "2025-12-25T11:32:40.945681",
"responseDueDate" : "2026-01-11T11:32:40.945681",
"responseDate" : "2025-12-18T11:32:40.945681",
"chargebackAmount" : 10000.0,
"reasonCode" : "2189",
"fraud" : false,
"currency" : "BRL",
"lastUpdateDate" : "2025-12-28T11:32:40.945681",
"status" : "NEW",
"merchant" : {
"name" : "adobe",
"transactionId" : "e82bdab4-5909-4c41-9107-b7ce2f2b4b5d"
},
"submerchant" : { },
"transaction" : {
"uuid" : "9b15c89d-a7ab-4b9d-8404-a7036fe79114",
"date" : "2025-12-03T11:32:40.945753",
"cardNumber" : "445512******3456",
"brand" : "Visa",
"descriptor" : "Product 0001",
"amount" : 10000.35
},
"statuses" : [ {
"status" : "NEW",
"date" : "2025-12-28T11:32:40.945681"
} ]
}, {
"id" : "64285eac-a048-459a-ae78-f1661fae1c3d",
"receptionDate" : "2025-12-25T11:32:40.945681",
"responseDueDate" : "2026-01-11T11:32:40.945681",
"responseDate" : "2025-12-18T11:32:40.945681",
"chargebackAmount" : 10000.0,
"reasonCode" : "2189",
"fraud" : false,
"currency" : "BRL",
"lastUpdateDate" : "2025-12-28T11:32:40.945681",
"status" : "NEW",
"merchant" : {
"name" : "adobe",
"transactionId" : "97e928b2-ca03-4c7c-8150-cfb1b4c7639e"
},
"submerchant" : { },
"transaction" : {
"uuid" : "64285eac-a048-459a-ae78-f1661fae1c3d",
"date" : "2025-12-03T11:32:40.950692",
"cardNumber" : "445512******3456",
"brand" : "Visa",
"descriptor" : "Product 0001",
"amount" : 10000.35
},
"statuses" : [ {
"status" : "NEW",
"date" : "2025-12-28T11:32:40.945681"
} ]
}, {
"id" : "005d7c0d-ea7e-405f-855d-885dc12b8729",
"receptionDate" : "2025-12-25T11:32:40.945681",
"responseDueDate" : "2026-01-11T11:32:40.945681",
"responseDate" : "2025-12-18T11:32:40.945681",
"chargebackAmount" : 10000.0,
"reasonCode" : "2189",
"fraud" : false,
"currency" : "BRL",
"lastUpdateDate" : "2025-12-28T11:32:40.945681",
"status" : "NEW",
"merchant" : {
"name" : "adobe",
"transactionId" : "aa44b0ae-a4b4-4857-b195-1299dc523d8d"
},
"submerchant" : { },
"transaction" : {
"uuid" : "005d7c0d-ea7e-405f-855d-885dc12b8729",
"date" : "2025-12-03T11:32:40.952295",
"cardNumber" : "445512******3456",
"brand" : "Visa",
"descriptor" : "Product 0001",
"amount" : 10000.35
},
"statuses" : [ {
"status" : "NEW",
"date" : "2025-12-28T11:32:40.945681"
} ]
} ],
"page" : 0,
"hasNext" : false,
"numberOfElements" : 20
}
6.3. Accept Case
PATCH /api/v1/cases/{id}/accept
6.3.1. Path parameters
| Parameter | Type | Optional | Description |
|---|---|---|---|
id |
Object |
false |
6.3.2. Response fields
| Path | Type | Optional | Description |
|---|---|---|---|
id |
String |
false |
|
receptionDate |
String |
false |
|
responseDueDate |
String |
false |
|
responseDate |
String |
true |
|
chargebackAmount |
Decimal |
false |
Must be at least 0.0. |
reasonCode |
String |
true |
|
fraud |
Boolean |
true |
|
currency |
String |
false |
Size must be equal to 3. |
lastUpdateDate |
String |
false |
|
status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
merchant |
Object |
true |
|
merchant.name |
String |
true |
|
merchant.transactionId |
String |
false |
|
submerchant |
Object |
true |
|
submerchant.name |
String |
true |
|
transaction |
Object |
true |
|
transaction.uuid |
String |
true |
|
transaction.id |
String |
true |
|
transaction.date |
String |
true |
|
transaction.cardNumber |
String |
true |
|
transaction.brand |
String |
true |
|
transaction.descriptor |
String |
true |
|
transaction.amount |
Decimal |
false |
Must be at least 0.0. |
statuses |
Array[Object] |
false |
|
statuses[].status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
statuses[].date |
String |
false |
6.3.3. Example request
PATCH /api/v1/cases/bbbf7b34-090c-4de1-b0de-62c2f63d93f5/accept HTTP/1.1
Content-Type: application/json
Content-Length: 1111
Host: test-chargebackdispute.ppro.com
[{"name":"my-file","extension":"PNG","binaryBase64":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="},{"name":"my-file","extension":"PDF","binaryBase64":"JVBERi0xLjcKCjEgMCBvYmogICUgZW50cnkgcG9pbnQKPDwKICAvVHlwZSAvQ2F0YWxvZwogIC9QYWdlcyAyIDAgUgo+PgplbmRvYmoKCjIgMCBvYmoKPDwKICAvVHlwZSAvUGFnZXMKICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCiAgL0NvdW50IDEKICAvS2lkcyBbIDMgMCBSIF0KPj4KZW5kb2JqCgozIDAgb2JqCjw8CiAgL1R5cGUgL1BhZ2UKICAvUGFyZW50IDIgMCBSCiAgL1Jlc291cmNlcyA8PAogICAgL0ZvbnQgPDwKICAgICAgL0YxIDQgMCBSIAogICAgPj4KICA+PgogIC9Db250ZW50cyA1IDAgUgo+PgplbmRvYmoKCjQgMCBvYmoKPDwKICAvVHlwZSAvRm9udAogIC9TdWJ0eXBlIC9UeXBlMQogIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KPj4KZW5kb2JqCgo1IDAgb2JqICAlIHBhZ2UgY29udGVudAo8PAogIC9MZW5ndGggNDQKPj4Kc3RyZWFtCkJUCjcwIDUwIFRECi9GMSAxMiBUZgooSGVsbG8sIHdvcmxkISkgVGoKRVQKZW5kc3RyZWFtCmVuZG9iagoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDEwIDAwMDAwIG4gCjAwMDAwMDAwNzkgMDAwMDAgbiAKMDAwMDAwMDE3MyAwMDAwMCBuIAowMDAwMDAwMzAxIDAwMDAwIG4gCjAwMDAwMDAzODAgMDAwMDAgbiAKdHJhaWxlcgo8PAogIC9TaXplIDYKICAvUm9vdCAxIDAgUgo+PgpzdGFydHhyZWYKNDkyCiUlRU9G"}]
6.3.4. Example response
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 906
{
"id" : "bbbf7b34-090c-4de1-b0de-62c2f63d93f5",
"receptionDate" : "2025-12-23T11:32:41.16136",
"responseDueDate" : "2026-01-11T11:32:41.161373",
"responseDate" : "2026-01-02T11:32:41.20298",
"chargebackAmount" : 10000.0,
"reasonCode" : "2189",
"fraud" : false,
"currency" : "BRL",
"lastUpdateDate" : "2026-01-02T11:32:41.20298",
"status" : "ACCEPTED",
"merchant" : {
"name" : "adobe",
"transactionId" : "1065e552-f5a5-4313-b607-4b72cf4942be"
},
"submerchant" : { },
"transaction" : {
"uuid" : "34513627-e13a-499a-919d-1d1adf48cbe9",
"date" : "2025-12-03T11:32:41.161438",
"cardNumber" : "445512******3456",
"brand" : "Visa",
"descriptor" : "Product 0001",
"amount" : 10000.35
},
"statuses" : [ {
"status" : "NEW",
"date" : "2025-12-23T11:32:41.16136"
}, {
"status" : "ACCEPTED",
"date" : "2026-01-02T11:32:41.20298"
} ]
}
6.4. Dispute Case
PATCH /api/v1/cases/{id}/dispute
6.4.1. Path parameters
| Parameter | Type | Optional | Description |
|---|---|---|---|
id |
Object |
false |
6.4.2. Request fields
| Path | Type | Optional | Description |
|---|---|---|---|
[].name |
String |
false |
|
[].extension |
String |
false |
Must be one of [PNG, JPG, PDF, TIFF]. |
[].binaryBase64 |
Array[Integer] |
false |
6.4.3. Response fields
| Path | Type | Optional | Description |
|---|---|---|---|
id |
String |
false |
|
receptionDate |
String |
false |
|
responseDueDate |
String |
false |
|
responseDate |
String |
true |
|
chargebackAmount |
Decimal |
false |
Must be at least 0.0. |
reasonCode |
String |
true |
|
fraud |
Boolean |
true |
|
currency |
String |
false |
Size must be equal to 3. |
lastUpdateDate |
String |
false |
|
status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
merchant |
Object |
true |
|
merchant.name |
String |
true |
|
merchant.transactionId |
String |
false |
|
submerchant |
Object |
true |
|
submerchant.name |
String |
true |
|
transaction |
Object |
true |
|
transaction.uuid |
String |
true |
|
transaction.id |
String |
true |
|
transaction.date |
String |
true |
|
transaction.cardNumber |
String |
true |
|
transaction.brand |
String |
true |
|
transaction.descriptor |
String |
true |
|
transaction.amount |
Decimal |
false |
Must be at least 0.0. |
statuses |
Array[Object] |
false |
|
statuses[].status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
statuses[].date |
String |
false |
6.4.4. Example request
PATCH /api/v1/cases/762cc668-4399-4e56-b0bd-8755fa85dc0b/dispute HTTP/1.1
Content-Type: application/json
Content-Length: 1111
Host: test-chargebackdispute.ppro.com
[{"name":"my-file","extension":"PNG","binaryBase64":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="},{"name":"my-file","extension":"PDF","binaryBase64":"JVBERi0xLjcKCjEgMCBvYmogICUgZW50cnkgcG9pbnQKPDwKICAvVHlwZSAvQ2F0YWxvZwogIC9QYWdlcyAyIDAgUgo+PgplbmRvYmoKCjIgMCBvYmoKPDwKICAvVHlwZSAvUGFnZXMKICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCiAgL0NvdW50IDEKICAvS2lkcyBbIDMgMCBSIF0KPj4KZW5kb2JqCgozIDAgb2JqCjw8CiAgL1R5cGUgL1BhZ2UKICAvUGFyZW50IDIgMCBSCiAgL1Jlc291cmNlcyA8PAogICAgL0ZvbnQgPDwKICAgICAgL0YxIDQgMCBSIAogICAgPj4KICA+PgogIC9Db250ZW50cyA1IDAgUgo+PgplbmRvYmoKCjQgMCBvYmoKPDwKICAvVHlwZSAvRm9udAogIC9TdWJ0eXBlIC9UeXBlMQogIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KPj4KZW5kb2JqCgo1IDAgb2JqICAlIHBhZ2UgY29udGVudAo8PAogIC9MZW5ndGggNDQKPj4Kc3RyZWFtCkJUCjcwIDUwIFRECi9GMSAxMiBUZgooSGVsbG8sIHdvcmxkISkgVGoKRVQKZW5kc3RyZWFtCmVuZG9iagoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDEwIDAwMDAwIG4gCjAwMDAwMDAwNzkgMDAwMDAgbiAKMDAwMDAwMDE3MyAwMDAwMCBuIAowMDAwMDAwMzAxIDAwMDAwIG4gCjAwMDAwMDAzODAgMDAwMDAgbiAKdHJhaWxlcgo8PAogIC9TaXplIDYKICAvUm9vdCAxIDAgUgo+PgpzdGFydHhyZWYKNDkyCiUlRU9G"}]
6.4.5. Example response
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 908
{
"id" : "762cc668-4399-4e56-b0bd-8755fa85dc0b",
"receptionDate" : "2025-12-23T11:32:41.41023",
"responseDueDate" : "2026-01-11T11:32:41.410244",
"responseDate" : "2026-01-02T11:32:41.462832",
"chargebackAmount" : 10000.0,
"reasonCode" : "2189",
"fraud" : false,
"currency" : "BRL",
"lastUpdateDate" : "2026-01-02T11:32:41.462832",
"status" : "DISPUTED",
"merchant" : {
"name" : "adobe",
"transactionId" : "7186d8e0-6de1-4ea1-a638-d31b48b5c987"
},
"submerchant" : { },
"transaction" : {
"uuid" : "3c7bfe2f-fbf9-4553-adda-b9f26c8a258a",
"date" : "2025-12-03T11:32:41.41029",
"cardNumber" : "445512******3456",
"brand" : "Visa",
"descriptor" : "Product 0001",
"amount" : 10000.35
},
"statuses" : [ {
"status" : "NEW",
"date" : "2025-12-23T11:32:41.41023"
}, {
"status" : "DISPUTED",
"date" : "2026-01-02T11:32:41.462832"
} ]
}
6.5. Get Case Files
GET /api/v1/cases/{id}/files
6.5.1. Path parameters
| Parameter | Type | Optional | Description |
|---|---|---|---|
id |
Object |
false |
6.5.2. Response fields
No response body.
6.5.3. Example request
GET /api/v1/cases/f750d712-0624-419e-915b-926f93f65a42/files HTTP/1.1
Host: test-chargebackdispute.ppro.com
6.5.4. Example response
HTTP/1.1 200 OK
Content-Disposition: attachment; filename="f750d712-0624-419e-915b-926f93f65a42.zip"
Content-Type: application/zip
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
7. Playground Additional API
The Playground API is offered with an additional operation to create Cases for test purposes.
| This entry point is ONLY available for testing. |
7.1. Create Case
POST /api/v1/cases
7.1.1. Request fields
| Path | Type | Optional | Description |
|---|---|---|---|
receptionDate |
String |
true |
|
responseDueDate |
String |
true |
|
chargebackAmount |
Decimal |
true |
Must be at least 0.0. |
reasonCode |
String |
true |
|
fraud |
Boolean |
true |
|
additionalData |
String |
true |
|
currency |
String |
true |
com.ppro.disputes.constraints.Iso4217Currency. |
merchant |
Object |
true |
|
merchant.transactionId |
String |
true |
|
transaction |
Object |
true |
|
transaction.date |
String |
true |
|
transaction.cardNumber |
String |
true |
|
transaction.brand |
String |
true |
|
transaction.descriptor |
String |
true |
|
transaction.amount |
Decimal |
true |
Must be at least 0.0. |
statuses |
Array[Object] |
true |
|
statuses[].status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
statuses[].date |
String |
false |
7.1.2. Response fields
| Path | Type | Optional | Description |
|---|---|---|---|
id |
String |
false |
|
receptionDate |
String |
false |
|
responseDueDate |
String |
false |
|
responseDate |
String |
true |
|
chargebackAmount |
Decimal |
false |
Must be at least 0.0. |
reasonCode |
String |
true |
|
fraud |
Boolean |
true |
|
currency |
String |
false |
Size must be equal to 3. |
lastUpdateDate |
String |
false |
|
status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
merchant |
Object |
true |
|
merchant.name |
String |
true |
|
merchant.transactionId |
String |
false |
|
submerchant |
Object |
true |
|
submerchant.name |
String |
true |
|
transaction |
Object |
true |
|
transaction.uuid |
String |
true |
|
transaction.id |
String |
true |
|
transaction.date |
String |
true |
|
transaction.cardNumber |
String |
true |
|
transaction.brand |
String |
true |
|
transaction.descriptor |
String |
true |
|
transaction.amount |
Decimal |
false |
Must be at least 0.0. |
statuses |
Array[Object] |
false |
|
statuses[].status |
String |
false |
Must be one of [NEW, ACCEPTED, DISPUTED, AWAITING_RESOLUTION, EXPIRED, LOST, WON]. |
statuses[].date |
String |
false |
7.1.3. Example request
POST /api/v1/cases HTTP/1.1
Content-Type: application/json
Content-Length: 827
Host: test-chargebackdispute.ppro.com
{
"id" : "1ebe6069-52b7-46ce-81d6-bb2d93e2a836",
"receptionDate" : "2025-11-28T11:32:47.865472",
"responseDueDate" : "2025-12-08T11:32:47.865472",
"responseDate" : "2025-12-18T11:32:47.865472",
"chargebackAmount" : 1E+4,
"reasonCode" : "2189",
"fraud" : false,
"currency" : "BRL",
"lastUpdateDate" : "2025-12-28T11:32:47.865472",
"status" : "NEW",
"merchant" : {
"name" : "adobe",
"transactionId" : "4e1a3617-cc7f-4994-b659-d689df23069c"
},
"submerchant" : { },
"transaction" : {
"uuid" : "1ebe6069-52b7-46ce-81d6-bb2d93e2a836",
"date" : "2025-12-03T11:32:47.865487",
"cardNumber" : "445512******3456",
"brand" : "Visa",
"descriptor" : "Product 0001",
"amount" : 10000.35
},
"statuses" : [ {
"status" : "NEW",
"date" : "2025-12-28T11:32:47.865472"
} ]
}
7.1.4. Example response
HTTP/1.1 201 Created
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
Content-Length: 833
{
"id" : "045fe6c7-270a-4e1e-add1-b5317154f5cb",
"receptionDate" : "2025-11-28T11:32:47.865472",
"responseDueDate" : "2025-12-08T11:32:47.865472",
"chargebackAmount" : 10000.0,
"reasonCode" : "2189",
"fraud" : false,
"currency" : "BRL",
"lastUpdateDate" : "2025-12-28T11:32:47.865472",
"status" : "NEW",
"merchant" : {
"name" : "NortonLifeLock",
"transactionId" : "4e1a3617-cc7f-4994-b659-d689df23069c"
},
"submerchant" : { },
"transaction" : {
"uuid" : "b442908e-0e4c-48d4-b578-03118f81e5a6",
"id" : "charge_hj8IjgwVQKw40JKJsubId",
"date" : "2025-12-03T11:32:47.865487",
"cardNumber" : "445512******3456",
"brand" : "Visa",
"descriptor" : "Product 0001",
"amount" : 10000.35
},
"statuses" : [ {
"status" : "NEW",
"date" : "2025-12-28T11:32:47.865472"
} ]
}