API

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.