Dispute
A card transaction dispute: submit, list, get or withdraw one, or upload a file for it.
Operations
Every route this entity exposes. Each route links to its own reference on this page.
| Method | Route | SDK operation | Returns |
|---|---|---|---|
POST |
/spend/profiles/{profileId}/dispute-form/flows/{scheme}/{reason} |
create |
Dynamic Flow JSON response. If using the Dynamic Flow framework, pass this to the framework. If using the API directly, the response can be ignored. |
POST |
/spend/profiles/{profileId}/dispute-form/file |
create |
A key-value pair mapping the file name to the assigned file ID |
GET |
/spend/profiles/{profileId}/disputes |
list |
Paginated list of disputes |
GET |
/spend/profiles/{profileId}/disputes/{disputeId} |
load |
The dispute |
PUT |
/spend/profiles/{profileId}/disputes/{disputeId}/status |
update |
The updated dispute |
Examples
One example per SDK, generated from the API model. The argument names are the parameters and fields of this entity, and the values are placeholders. The examples are not compiled or executed.
Golang
Construct client as shown in the Golang setup, then call the operations:
disputes, err := client.Dispute(nil).List(map[string]any{"profile_id": 1}, nil)
if err != nil {
panic(err)
}
fmt.Println(disputes)
dispute, err := client.Dispute(nil).Load(map[string]any{"id": "example_id", "profile_id": 1}, nil)
if err != nil {
panic(err)
}
fmt.Println(dispute)
created, err := client.Dispute(nil).Create(map[string]any{"profile_id": 1}, nil)
if err != nil {
panic(err)
}
fmt.Println(created)
updated, err := client.Dispute(nil).Update(map[string]any{"id": "example_id", "profile_id": 1, "status": "example"}, nil)
if err != nil {
panic(err)
}
fmt.Println(updated)
Lua
Construct client as shown in the Lua setup, then call the operations:
local disputes, err = client:Dispute():list({ profile_id = 1 })
local dispute, err = client:Dispute():load({ id = "example_id", profile_id = 1 })
local created, err = client:Dispute():create({ profile_id = 1 })
local updated, err = client:Dispute():update({ id = "example_id", profile_id = 1, status = "example" })
PHP
Construct client as shown in the PHP setup, then call the operations:
$disputes = $client->Dispute()->list(["profile_id" => 1]);
$dispute = $client->Dispute()->load(["id" => "example_id", "profile_id" => 1]);
$created = $client->Dispute()->create(["profile_id" => 1]);
$updated = $client->Dispute()->update(["id" => "example_id", "profile_id" => 1, "status" => "example"]);
Python
Construct client as shown in the Python setup, then call the operations:
disputes = client.Dispute().list({"profile_id": 1})
dispute = client.Dispute().load({"id": "example_id", "profile_id": 1})
created = client.Dispute().create({ "profile_id": 1 })
updated = client.Dispute().update({"id": "example_id", "profile_id": 1, "status": "example"})
Ruby
Construct client as shown in the Ruby setup, then call the operations:
disputes = client.Dispute.list({ "profile_id" => 1 })
dispute = client.Dispute.load({ "id" => "example_id", "profile_id" => 1 })
created = client.Dispute.create({ "profile_id" => 1 })
updated = client.Dispute.update({ "id" => "example_id", "profile_id" => 1, "status" => "example" })
TypeScript
Construct client as shown in the TypeScript setup, then call the operations:
const disputes = await client.Dispute().list({ profile_id: 1 })
const dispute = await client.Dispute().load({ id: "example_id", profile_id: 1 })
const created = await client.Dispute().create({ profile_id: 1 })
const updated = await client.Dispute().update({ id: "example_id", profile_id: 1, status: "example" })
Fields
| Field | Type | Required | Description |
|---|---|---|---|
canWithdraw |
boolean |
No | Whether the dispute can be withdrawn. |
createdAt |
string |
No | Time when the dispute was created. |
createdBy |
string |
No | Creator of the dispute. |
disclaimer |
object |
No | Acknowledgement fields. |
files |
object |
No | Key-value pairs mapping file field names to file IDs obtained from the file upload endpoint. |
form |
object |
No | Form fields required to submit this dispute. |
id |
string |
No | Unique identifier of the dispute. |
lastUpdatedAt |
string |
No | Time when the dispute was last updated. |
profileId |
integer |
No | Profile ID. |
reason |
string |
No | Dispute reason code. |
receipt |
string |
No | The file to upload. |
status |
string |
No | Dispute overall status. |
statusMessage |
string |
No | Explanation for subStatus. |
subStatus |
string |
No | Dispute detailed status. |
transaction |
object |
No | Transaction details for the dispute. |
transactionId |
integer |
No | Card transaction ID. |
create
POST /spend/profiles/{profileId}/dispute-form/flows/{scheme}/{reason}
Operation ID: disputeSubmit.
Authentication: bearer token (UserToken).
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
profileId |
path |
integer (int64) |
Yes | Your profile ID. |
scheme |
path |
enum: MASTERCARD, VISA |
Yes | The network of the card that was used to make this transaction. |
reason |
path |
string |
Yes | Dispute reason code supplied by the dispute reasons endpoint. |
X-External-Correlation-Id |
header |
string (uuid) |
No | Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. Learn more. |
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
disclaimer |
object |
No | Acknowledgement fields. |
disclaimer.allAnswered |
boolean |
No | Acknowledgment that all questions have been answered. Must be true or the request will be rejected. |
disclaimer.filesUploaded |
boolean |
No | Acknowledgment that all relevant files have been attached. Must be true or the request will be rejected. |
files |
object |
No | Key-value pairs mapping file field names to file IDs obtained from the file upload endpoint. Available file fields vary per reason code. |
form |
object |
No | Form fields required to submit this dispute. The specific fields vary per reason code. See the disputes via API guide for per-reason field details. |
transaction |
object |
No | Transaction details for the dispute. |
transaction.email |
string |
No | Email of the support team that Wise should reach out to. |
transaction.transactionId |
string |
No | ID of the transaction. |
Example request body:
{
"disclaimer": {
"allAnswered": true,
"filesUploaded": true
},
"form": {
"agreedDetails": {
"agreed": true,
"agreedReason": "some reason"
},
"charged": {
"currency": "EUR",
"value": 50
},
"details": "wrong amount dispute",
"expected": {
"currency": "EUR",
"value": 5
},
"goods": "something"
},
"transaction": {
"email": "support@partner.com",
"transactionId": "12345"
}
}
Responses
200: Dynamic Flow JSON response. If using the Dynamic Flow framework, pass this to the framework. If using the API directly, the response can be ignored.
application/json
The response is object.
Example response:
{
"actions": [
{
"$id": "continue",
"exit": true,
"title": "Continue"
}
],
"key": "final",
"layout": [
{
"components": [
{
"type": "image",
"url": "https://wise.com/web-art/assets/illustrations/email-success-large%402x.png"
}
],
"type": "box",
"width": "md"
},
{
"align": "center",
"margin": "lg",
"markdown": "Thanks for reporting this transaction. It's pre-authorised right now, but as soon as it becomes \"spent\" we'll begin our investigation.",
"type": "info"
},
{
"action": {
"$ref": "continue",
"x-ref": "continue"
},
"type": "button"
}
],
"schemas": [],
"title": "Done!",
"type": "form"
}
429: Rate limit exceeded. Retry after the number of seconds specified in the Retry-After header
application/json
The response is object.
POST /spend/profiles/{profileId}/dispute-form/file
Operation ID: disputeFileUpload.
Authentication: bearer token (UserToken).
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
profileId |
path |
integer (int64) |
Yes | Your profile ID. |
X-External-Correlation-Id |
header |
string (uuid) |
No | Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. Learn more. |
Request body
multipart/form-data
| Property | Type | Required | Description |
|---|---|---|---|
receipt |
string (binary) |
No | The file to upload. |
Responses
200: A key-value pair mapping the file name to the assigned file ID
application/json
The response is object.
Example response:
{
"receipt": "ab4f5d2"
}
429: Rate limit exceeded. Retry after the number of seconds specified in the Retry-After header
application/json
The response is object.
list
GET /spend/profiles/{profileId}/disputes
Operation ID: disputeList.
Authentication: bearer token (UserToken).
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
profileId |
path |
integer (int64) |
Yes | Your profile ID. |
status |
query |
enum: ACTIVE, CLOSED |
No | Filter by dispute status. |
transactionId |
query |
integer (int64) |
No | Filter by card transaction ID. |
pageSize |
query |
integer (int32) |
No | The maximum number of disputes to return per page. Between 10 and 100, defaults to 10. |
pageNumber |
query |
integer (int32) |
No | The page number to retrieve. Must be at least 1, defaults to 1. |
X-External-Correlation-Id |
header |
string (uuid) |
No | Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. Learn more. |
Responses
200: Paginated list of disputes
application/json
| Property | Type | Required | Description |
|---|---|---|---|
disputes |
array of object |
No | |
disputes[].canWithdraw |
boolean |
No | Whether the dispute can be withdrawn. |
disputes[].createdAt |
string (date-time) |
No | Time when the dispute was created. |
disputes[].createdBy |
string |
No | Creator of the dispute. Currently set to the user ID. |
disputes[].id |
string |
No | Unique identifier of the dispute. |
disputes[].lastUpdatedAt |
string (date-time) |
No | Time when the dispute was last updated. |
disputes[].profileId |
integer (int64) |
No | Profile ID. |
disputes[].reason |
string |
No | Dispute reason code. |
disputes[].status |
enum: ACTIVE, CLOSED |
No | Dispute overall status. |
disputes[].statusMessage |
string |
No | Explanation for subStatus. |
disputes[].subStatus |
enum: SUBMITTED, IN_REVIEW, REFUNDED, REJECTED, WITHDRAWN, CONFIRMED, ... |
No | Dispute detailed status. |
disputes[].transactionId |
integer (int64) |
No | Card transaction ID. |
totalCount |
integer |
No | Total number of disputes matching the filters. |
Example response:
{
"disputes": [
{
"canWithdraw": true,
"createdAt": "2024-03-08T08:30:14.989Z",
"createdBy": "6097861",
"id": "51e2dc60-9e4b-4ff5-b917-b90cc5e1ecfb",
"lastUpdatedAt": "2024-03-08T08:30:14.989Z",
"profileId": 16605997,
"reason": "NEVER_ARRIVED",
"status": "ACTIVE",
"statusMessage": "Submitted",
"subStatus": "SUBMITTED",
"transactionId": 2040
},
{
"canWithdraw": true,
"createdAt": "2024-03-27T02:24:16.878Z",
"createdBy": "6097861",
"id": "9c5ca0cb-00d6-41f7-8214-8cfdb11388a7",
"lastUpdatedAt": "2024-03-27T02:24:16.878Z",
"profileId": 16605997,
"reason": "CANCELLED_ORDER",
"status": "ACTIVE",
"statusMessage": "Submitted",
"subStatus": "SUBMITTED",
"transactionId": 3405
}
],
"totalCount": 2
}
429: Rate limit exceeded. Retry after the number of seconds specified in the Retry-After header
application/json
The response is object.
load
GET /spend/profiles/{profileId}/disputes/{disputeId}
Operation ID: disputeGet.
Authentication: bearer token (UserToken).
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
profileId |
path |
integer (int64) |
Yes | Your profile ID. |
disputeId |
path |
string |
Yes | The dispute ID. |
X-External-Correlation-Id |
header |
string (uuid) |
No | Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. Learn more. |
Responses
200: The dispute
application/json
| Property | Type | Required | Description |
|---|---|---|---|
canWithdraw |
boolean |
No | Whether the dispute can be withdrawn. |
createdAt |
string (date-time) |
No | Time when the dispute was created. |
createdBy |
string |
No | Creator of the dispute. Currently set to the user ID. |
id |
string |
No | Unique identifier of the dispute. |
lastUpdatedAt |
string (date-time) |
No | Time when the dispute was last updated. |
profileId |
integer (int64) |
No | Profile ID. |
reason |
string |
No | Dispute reason code. |
status |
enum: ACTIVE, CLOSED |
No | Dispute overall status. |
statusMessage |
string |
No | Explanation for subStatus. |
subStatus |
enum: SUBMITTED, IN_REVIEW, REFUNDED, REJECTED, WITHDRAWN, CONFIRMED, ... |
No | Dispute detailed status. |
transactionId |
integer (int64) |
No | Card transaction ID. |
429: Rate limit exceeded. Retry after the number of seconds specified in the Retry-After header
application/json
The response is object.
update
PUT /spend/profiles/{profileId}/disputes/{disputeId}/status
Operation ID: disputeWithdraw.
Authentication: bearer token (UserToken).
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
profileId |
path |
integer (int64) |
Yes | Your profile ID. |
disputeId |
path |
string |
Yes | The dispute ID. |
X-External-Correlation-Id |
header |
string (uuid) |
No | Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. Learn more. |
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
status |
enum: CLOSED |
Yes | Must be set to CLOSED. |
Example request body:
{
"status": "CLOSED"
}
Responses
200: The updated dispute
application/json
| Property | Type | Required | Description |
|---|---|---|---|
canWithdraw |
boolean |
No | Whether the dispute can be withdrawn. |
createdAt |
string (date-time) |
No | Time when the dispute was created. |
createdBy |
string |
No | Creator of the dispute. Currently set to the user ID. |
id |
string |
No | Unique identifier of the dispute. |
lastUpdatedAt |
string (date-time) |
No | Time when the dispute was last updated. |
profileId |
integer (int64) |
No | Profile ID. |
reason |
string |
No | Dispute reason code. |
status |
enum: ACTIVE, CLOSED |
No | Dispute overall status. |
statusMessage |
string |
No | Explanation for subStatus. |
subStatus |
enum: SUBMITTED, IN_REVIEW, REFUNDED, REJECTED, WITHDRAWN, CONFIRMED, ... |
No | Dispute detailed status. |
transactionId |
integer (int64) |
No | Card transaction ID. |
Example response:
{
"canWithdraw": false,
"createdAt": "2024-03-08T08:30:14.989Z",
"createdBy": "6097861",
"id": "51e2dc60-9e4b-4ff5-b917-b90cc5e1ecfb",
"lastUpdatedAt": "2024-03-27T13:12:28.390Z",
"profileId": 16605997,
"reason": "NEVER_ARRIVED",
"status": "CLOSED",
"statusMessage": "Withdrawn",
"subStatus": "WITHDRAWN",
"transactionId": 2040
}
429: Rate limit exceeded. Retry after the number of seconds specified in the Retry-After header
application/json
The response is object.