---
title: Manage disputes
url: amazon-pay-buy-now-checkout-with-gifting/manage-disputes.html
---

**[Step 6 of 8]** Buyers can create a dispute by filing a chargeback with their bank. The methods invoke the dispute management process, which you can handle programmatically through the Dispute API instead of Seller Central. You can retrieve dispute details, submit evidence, track status, and respond to chargebacks through API endpoints.

<script>
  function keySpecifics(){
    const keyQuery = "?environmentSpecificKeys=";
    const currentSetting = window.location.search?.split("?environmentSpecificKeys=")[1] ?? 'false';
    const newSetting = currentSetting === 'false' ? 'true' : 'false';
    window.location = window.location.origin + window.location.pathname + keyQuery + newSetting // +  window.location.hash (not included as it feels weird to jump down)
  }
</script>
<div style="display:none" class="environmentSpecificKeys">
  <div markdown="span" class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> If your publicKeyId <b>_does not_</b> have an environment prefix (does not begin with 'SANDBOX' or 'LIVE') follow <a href='#' onclick='keySpecifics()' rel='noopener noreferrer'>these instructions</a> instead.</div>
</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
  <div markdown="span" class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> If your publicKeyId has an environment prefix (for example: SANDBOX-AFVX7ULWSGBZ5535PCUQOY7B) follow <a href='#' onclick='keySpecifics()' rel='noopener noreferrer'>these instructions</a> instead.</div>
</div>


* TOC
{:toc}
{::options toc_levels="3" /}

***

### Flow Diagram for Merchant Integration with Dispute APIs

<img src='https://m.media-amazon.com/images/G/01/EPSDocumentation/AmazonPay/Integration/Dispute-1PPP-Flow-Diagram.png' />

### Receiving Dispute Notifications

When a dispute is created or its status changes, Amazon Pay sends an Instant Payment Notification (IPN) to your configured endpoint. The IPN message includes:

```
{
    "MerchantID": "Your merchant identifier",
    "ObjectType": "CHARGEBACK",
    "ObjectId": "S01-0000000-0000000-B000000",
    "ChargePermissionId": "S01-0000000-0000000",
    "NotificationType": "STATE_CHANGE",
    "NotificationId": "9b4155a0-c396-46d0-83f7-te1st2xx1234",
    "NotificationVersion": "V2"
}
```

View the full <a href="../amazon-pay-checkout/set-up-instant-payment-notifications.md#chargeback" target="_blank" rel="noopener noreferrer">chargeback IPN notification details</a>.

### Get Dispute Details

Get detailed information about a specific dispute by providing its unique dispute ID. This endpoint returns comprehensive dispute data including the dispute type, amount, status, and any associated evidence or documentation. Use <a href="../amazon-pay-api-v2/dispute.md#get-dispute-details" target="_blank" rel="noopener noreferrer">Get Dispute API </a> call when you need to review specific dispute details, track dispute status, or gather information for dispute resolution.

#### Request

<div style="display:none" class="environmentSpecificKeys">
<code style="color:black">
curl "https://pay-api.amazon.com/v2/disputes/:disputeId" \ <br />
-X GET <br />
-H "authorization: Px2e5oHhQZ88vVhc0DO%2FsShHj8MDDg%3DEXAMPLESIGNATURE" <br />
-H "x-amz-pay-date:20201012T235046Z" <br />
</code>
</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<code style="color:black">
curl "https://pay-api.amazon.com/:environment/v2/disputes/:disputeId" \ <br />
-X GET <br />
-H "authorization: Px2e5oHhQZ88vVhc0DO%2FsShHj8MDDg%3DEXAMPLESIGNATURE" <br />
-H "x-amz-pay-date:20201012T235046Z" <br />
</code>
</div>

#### Sample Code

<div style="display:none" class="environmentSpecificKeys">
<ul id="profileTabs" class="nav nav-tabs">
  <li class="nav-item"><a class="active nav-link noExtIcon" href="#phptab-getDispute" data-toggle="tab">PHP</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#dotnettab-getDispute" data-toggle="tab">.NET</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#javatab-getDispute" data-toggle="tab">Java</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#nodejstab-getDispute" data-toggle="tab">Node.js</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#rubytab-getDispute" data-toggle="tab">Ruby</a></li>
</ul>
<div class="tab-content">
  <div role="tabpanel" class="tab-pane active" id="phptab-getDispute">   
<div markdown="block">
```
<?php

    include 'vendor/autoload.php';

    $amazonpay_config = array(
        'public_key_id' => 'YOUR_PUBLIC_KEY_ID',
        'private_key'   => 'keys/private.pem', // Path to RSA Private Key (or a string representation)
        'region'        => 'YOUR_REGION_CODE',
        'algorithm'     => 'AMZN-PAY-RSASSA-PSS-V2'
    );

    try {
        $disputeId = 'S01-0000000-0000000-B000000';
        $client = new Amazon\Pay\API\Client($amazonpay_config);
        $result = $client->getDispute($disputeId);

        if ($result['status'] === 200) {
            $response = json_decode($result['response'], true);
            $disputeState = $response['statusDetails']['state'];

        } else {
            // check the error
            echo 'status=' . $result['status'] . '; response=' . $result['response'];
        }
    } catch (Exception $e) {
        // handle the exception
        echo $e;
    }
?>
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="dotnettab-getDispute">
<div markdown="block">
```
using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;
using Amazon.Pay.API.WebStore.Dispute;
using Amazon.Pay.API.WebStore.Types;
using System;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.YOUR_REGION_CODE,
            publicKeyId: "YOUR_PUBLIC_KEY_ID",
            privateKey: "PATH_OR_CONTENT_OF_YOUR_PRIVATE_KEY",
            algorithm: AmazonSignatureAlgorithm.V2
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }

    public void GetDispute(string disputeId)
    {
        // send the request
        DisputeResponse result = client.GetDispute(disputeId);

        // check if API call was successful
        if (!result.Success)
        {
            // handle the API error (use Status field to get the numeric error code)
        } else {
            // do something with the result, for instance:
            Console.WriteLine(result.RawResponse);
        }
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="javatab-getDispute">
<div markdown="block">
```
import com.amazon.pay.api.AmazonPayResponse;
import com.amazon.pay.api.PayConfiguration;
import com.amazon.pay.api.WebstoreClient;
import com.amazon.pay.api.exceptions.AmazonPayClientException;
import com.amazon.pay.api.types.Region;

public void sample() {
    PayConfiguration payConfiguration = null;
    try {
        payConfiguration = new PayConfiguration()
            .setPublicKeyId("YOUR_PUBLIC_KEY_ID")
            .setRegion(Region.YOUR_REGION_CODE)
            .setPrivateKey("YOUR_PRIVATE_KEY".toCharArray())
            .setAlgorithm("AMZN-PAY-RSASSA-PSS-V2");

        WebstoreClient webstoreClient = new WebstoreClient(payConfiguration);
        AmazonPayResponse response = webstoreClient.getDispute("S01-0000000-0000000-B000000");
    } catch (AmazonPayClientException e) {
        e.printStackTrace();
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="nodejstab-getDispute">
<div markdown="block">
```html
const fs = require('fs');
const Client = require('@amazonpay/amazon-pay-api-sdk-nodejs');

const config = {
    publicKeyId: 'YOUR_PUBLIC_KEY_ID',
    privateKey: fs.readFileSync('tst/private.pem'),
    region: 'YOUR_REGION_CODE',
    algorithm: 'AMZN-PAY-RSASSA-PSS-V2' 
};    

const disputeId = 'S01-0000000-0000000-B000000';

const testPayClient = new Client.WebStoreClient(config);
const response = testPayClient.getDispute(disputeId);

response.then(function (result) {
    console.log(result.data);
}).catch(err => {
    console.log(err);
});
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="rubytab-getDispute">
<div markdown="block">
```
require 'amazon-pay-api-sdk-ruby'

config = {
  region: 'YOUR_REGION_CODE', # Supported values: na, eu, jp
  public_key_id: 'YOUR_PUBLIC_KEY_ID',
  private_key: File.read('privateKey.pem')
}

client = AmazonPayClient.new(config)

dispute_id = 'S01-0000000-0000000-B000000'
response = client.get_dispute(dispute_id)

if response.code.to_i == 200
    puts response.body
else
    # check the error
    puts "status=#{response.code}"
    puts response.body
end
```

</div>
  </div>
</div>

</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<ul id="profileTabs" class="nav nav-tabs">
  <li class="nav-item"><a class="active nav-link noExtIcon" href="#phptab-getDispute-NESK" data-toggle="tab">PHP</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#dotnettab-getDispute-NESK" data-toggle="tab">.NET</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#javatab-getDispute-NESK" data-toggle="tab">Java</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#nodejstab-getDispute-NESK" data-toggle="tab">Node.js</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#rubytab-getDispute-NESK" data-toggle="tab">Ruby</a></li>
</ul>
<div class="tab-content">
  <div role="tabpanel" class="tab-pane active" id="phptab-getDispute-NESK">   
<div markdown="block">
```
<?php

    include 'vendor/autoload.php';

    $amazonpay_config = array(
        'public_key_id' => 'YOUR_PUBLIC_KEY_ID',
        'private_key'   => 'keys/private.pem', // Path to RSA Private Key (or a string representation)
        'region'        => 'YOUR_REGION_CODE',
        'sandbox'       => true,
        'algorithm'     => 'AMZN-PAY-RSASSA-PSS-V2'
    );

    try {
        $disputeId = 'S01-0000000-0000000-B000000';
        $client = new Amazon\Pay\API\Client($amazonpay_config);
        $result = $client->getDispute($disputeId);

        if ($result['status'] === 200) {
            $response = json_decode($result['response'], true);
            $disputeState = $response['statusDetails']['state'];

        } else {
            // check the error
            echo 'status=' . $result['status'] . '; response=' . $result['response'];
        }
    } catch (Exception $e) {
        // handle the exception
        echo $e;
    }
?>
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="dotnettab-getDispute-NESK">
<div markdown="block">
```
using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;
using Amazon.Pay.API.WebStore.Dispute;
using Amazon.Pay.API.WebStore.Types;
using System;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.YOUR_REGION_CODE,
            environment: Environment.Sandbox,
            publicKeyId: "YOUR_PUBLIC_KEY_ID",
            privateKey: "PATH_OR_CONTENT_OF_YOUR_PRIVATE_KEY",
            algorithm: AmazonSignatureAlgorithm.V2
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }

    public void GetDispute(string disputeId)
    {
        // send the request
        DisputeResponse result = client.GetDispute(disputeId);

        // check if API call was successful
        if (!result.Success)
        {
            // handle the API error (use Status field to get the numeric error code)
        } else {
            // do something with the result, for instance:
            Console.WriteLine(result.RawResponse);
        }
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="javatab-getDispute-NESK">
<div markdown="block">
```
import com.amazon.pay.api.AmazonPayResponse;
import com.amazon.pay.api.PayConfiguration;
import com.amazon.pay.api.WebstoreClient;
import com.amazon.pay.api.exceptions.AmazonPayClientException;
import com.amazon.pay.api.types.Environment;
import com.amazon.pay.api.types.Region;

public void sample() {
    PayConfiguration payConfiguration = null;
    try {
        payConfiguration = new PayConfiguration()
            .setPublicKeyId("YOUR_PUBLIC_KEY_ID")
            .setRegion(Region.YOUR_REGION_CODE)
            .setPrivateKey("YOUR_PRIVATE_KEY".toCharArray())
            .setEnvironment(Environment.SANDBOX)
            .setAlgorithm("AMZN-PAY-RSASSA-PSS-V2");

        WebstoreClient webstoreClient = new WebstoreClient(payConfiguration);
        AmazonPayResponse response = webstoreClient.getDispute("S01-0000000-0000000-B000000");
    } catch (AmazonPayClientException e) {
        e.printStackTrace();
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="nodejstab-getDispute-NESK">
<div markdown="block">
```html
const fs = require('fs');
const Client = require('@amazonpay/amazon-pay-api-sdk-nodejs');

const config = {
    publicKeyId: 'YOUR_PUBLIC_KEY_ID',
    privateKey: fs.readFileSync('tst/private.pem'),
    region: 'YOUR_REGION_CODE',
    sandbox: true,
    algorithm: 'AMZN-PAY-RSASSA-PSS-V2' 
};    

const disputeId = 'S01-0000000-0000000-B000000';

const testPayClient = new Client.WebStoreClient(config);
const response = testPayClient.getDispute(disputeId);

response.then(function (result) {
    console.log(result.data);
}).catch(err => {
    console.log(err);
});
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="rubytab-getDispute-NESK">
<div markdown="block">
```
require 'amazon-pay-api-sdk-ruby'

config = {
  region: 'YOUR_REGION_CODE', # Supported values: na, eu, jp
  public_key_id: 'YOUR_PUBLIC_KEY_ID',
  private_key: File.read('privateKey.pem'),
  sandbox: true
}

client = AmazonPayClient.new(config)

dispute_id = 'S01-0000000-0000000-B000000'
response = client.get_dispute(dispute_id)

if response.code.to_i == 200
    puts response.body
else
    # check the error
    puts "status=#{response.code}"
    puts response.body
end
```

</div>
  </div>
</div>

</div>

#### Response Format

The API returns a Dispute object containing:
* Basic dispute information (ID, type, amount, filing reason)
* Transaction details (charge ID, timestamps)
* Status information (state, resolution, reason codes)
* Evidence submissions (merchant documentation and files)

```
{
    "disputeId": "P01-1111111-1111111-B123456",
    "chargeId": "P01-1111111-1111111-C123456",
    "disputeType": "Chargeback",
    "disputeAmount":  {
        "amount": "400",
        "currencyCode": "USD" 
    },
    "filingReason": "Fraudulent",
    "filingTimestamp": "20190714T155300Z",
    "resolutionAuthority": "AmazonPay",
    "statusDetails":  {
        "state": "Resolved",
        "reasonCode": "MerchantAcceptedDispute",
        "reasonDescription": "Merchant accepted the dispute request",
        "resolution": "BuyerWon",
        "lastUpdatedTimestamp": "20190716T156500Z" 
    },
    "resolutionAuthority": "AmazonPay",
    "merchantEvidences": [
        {
            "evidenceType" : "TrackingNumber",
            "fileId" : null,
            "evidenceText": "raw text supporting merchant evidence"
        },
        {
            "evidenceType": "CustomerSignature",
            "fileId": "customer_signature_file_id",
            "evidenceText": null
        }
    ],
    "closureTimestamp": "20190716T155300Z",
    "releaseEnvironment": "Live"
}
```


### Update Dispute Details

Submit your response through the <a href="../amazon-pay-api-v2/dispute.md#update-dispute-details" target="_blank" rel="noopener noreferrer">Update Dispute API</a> to accept a dispute when you agree the customer's chargeback is valid.

#### Request

<div style="display:none" class="environmentSpecificKeys">
<code style="color: black">
curl "https://pay-api.amazon.com/v2/disputes/:disputeId" \ <br />
-X PATCH <br />
-H "authorization: Px2e5oHhQZ88vVhc0DO%2FsShHj8MDDg%3DEXAMPLESIGNATURE" <br />
-H "x-amz-pay-date:20201012T235046Z" <br />
-d @request_body <br />
</code>
</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<code style="color:black">
curl "https://pay-api.amazon.com/:environment/v2/disputes/:disputeId" \ <br />
-X PATCH <br />
-H "authorization: Px2e5oHhQZ88vVhc0DO%2FsShHj8MDDg%3DEXAMPLESIGNATURE" <br />
-H "x-amz-pay-date:20201012T235046Z" <br />
-d @request_body <br />
</code>
</div>

#### Request body

```
{
    "statusDetails": {
        "resolution": "BuyerWon",
        "state": "Resolved",
        "reasonCode": "MerchantAcceptedDispute",
        "reasonDescription": "Merchant accepted the dispute request"
    },
    "closureTimestamp": "20190716T162300Z"
}
```


#### Request parameters

<table width="100%" border="1">
    <tbody>
        <tr id='PDP9CAQSM5J'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top; font-weight: bold; width: 30%;' class='bold'>Name
                <br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAkAlRX' style='vertical-align: top; font-weight: bold; width: 20%;' class='bold'>Location
                <br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAn6CQD' style='vertical-align: top; font-weight: bold; width: 50%;' class='bold'>Description
                <br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAkesJe;PDP9CAXfdYQ' style='vertical-align: top;'>StatusDetails<br><b>(required)</b><br><br>Type: <a href="../amazon-pay-api-v2/dispute.md#type-disputestatusdetails" target="_blank" rel="noopener noreferrer">DisputeStatusDetails</a>
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAkAlRX' style='vertical-align: top;'>Body
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAn6CQD' style='vertical-align: top;'>Specifies the dispute state (Resolved/Closed), resolution (BuyerWon/MerchantWon/NoFault), and reason code. All fields required.
                <br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAkesJe;PDP9CAXfdYQ' style='vertical-align: top;'>ClosureTimeStamp<br><b>(required)</b><br><br>Type: dateTime
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAkAlRX' style='vertical-align: top;'>Body
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAn6CQD' style='vertical-align: top;'>Required for "Closed" state only. UTC timestamp in ISO 8601 format.
                <br /></td>
        </tr>
    </tbody>
</table>


#### Sample Code

<div style="display:none" class="environmentSpecificKeys">
<ul id="profileTabs" class="nav nav-tabs">
  <li class="nav-item"><a class="active nav-link noExtIcon" href="#phptab-updateDispute" data-toggle="tab">PHP</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#dotnettab-updateDispute" data-toggle="tab">.NET</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#javatab-updateDispute" data-toggle="tab">Java</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#nodejstab-updateDispute" data-toggle="tab">Node.js</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#rubytab-updateDispute" data-toggle="tab">Ruby</a></li>
</ul>
<div class="tab-content">
  <div role="tabpanel" class="tab-pane active" id="phptab-updateDispute">   
<div markdown="block">
```
<?php

    include 'vendor/autoload.php';

    use Amazon\Pay\API\Constants\DisputeResolution;
    use Amazon\Pay\API\Constants\DisputeState;
    use Amazon\Pay\API\Constants\DisputeReasonCode;

    $amazonpay_config = array(
        'public_key_id' => 'YOUR_PUBLIC_KEY_ID',
        'private_key'   => 'keys/private.pem', // Path to RSA Private Key (or a string representation)
        'region'        => 'YOUR_REGION_CODE',
        'algorithm'     => 'AMZN-PAY-RSASSA-PSS-V2'
    );

    $disputeId = 'S01-0000000-0000000-B000000';
    $closureTimestamp = time();

    $payload = array(
        'statusDetails' => array(
            'resolution' => DisputeResolution::MERCHANT_WON,
            'state' => DisputeState::RESOLVED,
            'reasonCode' => DisputeReasonCode::MERCHANT_ACCEPTED_DISPUTE,
            'reasonDescription' => 'Merchant accepted the dispute request'
        ),
        'closureTimestamp' => $closureTimestamp
    );

    try {
        $client = new Amazon\Pay\API\Client($amazonpay_config);
        $result = $client->updateDispute($disputeId, $payload);

        if ($result['status'] === 200) {
            $response = json_decode($result['response'], true);
            $disputeState = $response['statusDetails']['state'];

        } else {
            // check the error
            echo 'status=' . $result['status'] . '; response=' . $result['response'];
        }
    } catch (Exception $e) {
        // handle the exception
        echo $e;
    }
?>
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="dotnettab-updateDispute">
<div markdown="block">
```
using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;
using Amazon.Pay.API.WebStore.Dispute;
using Amazon.Pay.API.WebStore.Types;
using System;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.YOUR_REGION_CODE,
            publicKeyId: "YOUR_PUBLIC_KEY_ID",
            privateKey: "PATH_OR_CONTENT_OF_YOUR_PRIVATE_KEY",
            algorithm: AmazonSignatureAlgorithm.V2
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }

    public void UpdateDispute(string disputeId)
    {
        // prepare the request
        var request = new UpdateDisputeRequest(
            state: "Resolved",
            reasonCode: "MerchantAcceptedDispute",
            closureTimestamp: DateTime.UtcNow,
            reasonDescription: "Merchant accepted the dispute request",
            resolution: "MerchantWon"
        );

        // send the request
        DisputeResponse result = client.UpdateDispute(disputeId, request);

        // check if API call was successful
        if (!result.Success)
        {
            // handle the API error (use Status field to get the numeric error code)
        } else {
            // do something with the result, for instance:
            Console.WriteLine(result.RawResponse);
        }
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="javatab-updateDispute">
<div markdown="block">
```
import com.amazon.pay.api.AmazonPayResponse;
import com.amazon.pay.api.PayConfiguration;
import com.amazon.pay.api.WebstoreClient;
import com.amazon.pay.api.exceptions.AmazonPayClientException;
import com.amazon.pay.api.types.DisputeReasonCode;
import com.amazon.pay.api.types.DisputeResolution;
import com.amazon.pay.api.types.DisputeState;
import com.amazon.pay.api.types.Region;

import org.json.JSONObject;

public void sample() {
    PayConfiguration payConfiguration = null;
    try {
        payConfiguration = new PayConfiguration()
            .setPublicKeyId("YOUR_PUBLIC_KEY_ID")
            .setRegion(Region.YOUR_REGION_CODE)
            .setPrivateKey("YOUR_PRIVATE_KEY".toCharArray())
            .setAlgorithm("AMZN-PAY-RSASSA-PSS-V2");

        WebstoreClient webstoreClient = new WebstoreClient(payConfiguration);
        String disputeId = "S01-0000000-0000000-B000000";

        JSONObject statusDetails = new JSONObject();
        statusDetails.put("resolution", DisputeResolution.MERCHANT_WON.getDisputeResolution());
        statusDetails.put("state", DisputeState.RESOLVED.getDisputeState());
        statusDetails.put("reasonCode", DisputeReasonCode.MERCHANT_ACCEPTED_DISPUTE.getDisputeReasonCode());
        statusDetails.put("reasonDescription", "Merchant accepted the dispute request");

        JSONObject payload = new JSONObject();
        payload.put("statusDetails", statusDetails);
        // Current Unix timestamp (seconds since epoch)
        payload.put("closureTimestamp", System.currentTimeMillis() / 1000L);

        AmazonPayResponse response = webstoreClient.updateDispute(disputeId, payload);
    } catch (AmazonPayClientException e) {
        e.printStackTrace();
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="nodejstab-updateDispute">
<div markdown="block">
```html
const fs = require('fs');
const Client = require('@amazonpay/amazon-pay-api-sdk-nodejs');

const config = {
    publicKeyId: 'YOUR_PUBLIC_KEY_ID',
    privateKey: fs.readFileSync('tst/private.pem'),
    region: 'YOUR_REGION_CODE',
    algorithm: 'AMZN-PAY-RSASSA-PSS-V2' 
};    

const disputeId = 'S01-0000000-0000000-B000000';

const payload = {
    statusDetails: {
        resolution: "MerchantWon",
        state: "Resolved",
        reasonCode: "MerchantAcceptedDispute",
        reasonDescription: "Merchant accepted the dispute request"
    },
    closureTimestamp: Date.now()
};

const testPayClient = new Client.WebStoreClient(config);
const response = testPayClient.updateDispute(disputeId, payload);

response.then(function (result) {
    console.log(result.data);
}).catch(err => {
    console.log(err);
});
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="rubytab-updateDispute">
<div markdown="block">
```
require 'amazon-pay-api-sdk-ruby'

config = {
  region: 'YOUR_REGION_CODE', # Supported values: na, eu, jp
  public_key_id: 'YOUR_PUBLIC_KEY_ID',
  private_key: File.read('privateKey.pem')
}

client = AmazonPayClient.new(config)

dispute_id = 'S01-0000000-0000000-B000000'

payload = {
    "statusDetails": {
        "resolution": "MerchantWon",
        "state": "Resolved",
        "reasonCode": "MerchantAcceptedDispute",
        "reasonDescription": "Merchant accepted the dispute request"
    },
    "closureTimestamp": Time.now.to_i
}

response = client.update_dispute(dispute_id, payload)

if response.code.to_i == 200
    puts response.body
else
    # check the error
    puts "status=#{response.code}"
    puts response.body
end
```

</div>
  </div>
</div>

</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<ul id="profileTabs" class="nav nav-tabs">
  <li class="nav-item"><a class="active nav-link noExtIcon" href="#phptab-updateDispute-NESK" data-toggle="tab">PHP</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#dotnettab-updateDispute-NESK" data-toggle="tab">.NET</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#javatab-updateDispute-NESK" data-toggle="tab">Java</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#nodejstab-updateDispute-NESK" data-toggle="tab">Node.js</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#rubytab-updateDispute-NESK" data-toggle="tab">Ruby</a></li>
</ul>
<div class="tab-content">
  <div role="tabpanel" class="tab-pane active" id="phptab-updateDispute-NESK">   
<div markdown="block">
```
<?php

    include 'vendor/autoload.php';

    use Amazon\Pay\API\Constants\DisputeResolution;
    use Amazon\Pay\API\Constants\DisputeState;
    use Amazon\Pay\API\Constants\DisputeReasonCode;

    $amazonpay_config = array(
        'public_key_id' => 'YOUR_PUBLIC_KEY_ID',
        'private_key'   => 'keys/private.pem', // Path to RSA Private Key (or a string representation)
        'region'        => 'YOUR_REGION_CODE',
        'sandbox'       => true,
        'algorithm'     => 'AMZN-PAY-RSASSA-PSS-V2'
    );

    $disputeId = 'S01-0000000-0000000-B000000';
    $closureTimestamp = time();

    $payload = array(
        'statusDetails' => array(
            'resolution' => DisputeResolution::MERCHANT_WON,
            'state' => DisputeState::RESOLVED,
            'reasonCode' => DisputeReasonCode::MERCHANT_ACCEPTED_DISPUTE,
            'reasonDescription' => 'Merchant accepted the dispute request'
        ),
        'closureTimestamp' => $closureTimestamp
    );

    try {
        $client = new Amazon\Pay\API\Client($amazonpay_config);
        $result = $client->updateDispute($disputeId, $payload);

        if ($result['status'] === 200) {
            $response = json_decode($result['response'], true);
            $disputeState = $response['statusDetails']['state'];

        } else {
            // check the error
            echo 'status=' . $result['status'] . '; response=' . $result['response'];
        }
    } catch (Exception $e) {
        // handle the exception
        echo $e;
    }
?>
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="dotnettab-updateDispute-NESK">
<div markdown="block">
```
using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;
using Amazon.Pay.API.WebStore.Dispute;
using Amazon.Pay.API.WebStore.Types;
using System;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.YOUR_REGION_CODE,
            environment: Environment.Sandbox,
            publicKeyId: "YOUR_PUBLIC_KEY_ID",
            privateKey: "PATH_OR_CONTENT_OF_YOUR_PRIVATE_KEY",
            algorithm: AmazonSignatureAlgorithm.V2
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }

    public void UpdateDispute(string disputeId)
    {
        // prepare the request
        var request = new UpdateDisputeRequest(
            state: "Resolved",
            reasonCode: "MerchantAcceptedDispute",
            closureTimestamp: DateTime.UtcNow,
            reasonDescription: "Merchant accepted the dispute request",
            resolution: "MerchantWon"
        );

        // send the request
        DisputeResponse result = client.UpdateDispute(disputeId, request);

        // check if API call was successful
        if (!result.Success)
        {
            // handle the API error (use Status field to get the numeric error code)
        } else {
            // do something with the result, for instance:
            Console.WriteLine(result.RawResponse);
        }
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="javatab-updateDispute-NESK">
<div markdown="block">
```
import com.amazon.pay.api.AmazonPayResponse;
import com.amazon.pay.api.PayConfiguration;
import com.amazon.pay.api.WebstoreClient;
import com.amazon.pay.api.exceptions.AmazonPayClientException;
import com.amazon.pay.api.types.DisputeReasonCode;
import com.amazon.pay.api.types.DisputeResolution;
import com.amazon.pay.api.types.DisputeState;
import com.amazon.pay.api.types.Environment;
import com.amazon.pay.api.types.Region;

import org.json.JSONObject;

public void sample() {
    PayConfiguration payConfiguration = null;
    try {
        payConfiguration = new PayConfiguration()
            .setPublicKeyId("YOUR_PUBLIC_KEY_ID")
            .setRegion(Region.YOUR_REGION_CODE)
            .setPrivateKey("YOUR_PRIVATE_KEY".toCharArray())
            .setEnvironment(Environment.SANDBOX)
            .setAlgorithm("AMZN-PAY-RSASSA-PSS-V2");

        WebstoreClient webstoreClient = new WebstoreClient(payConfiguration);
        String disputeId = "S01-0000000-0000000-B000000";

        JSONObject statusDetails = new JSONObject();
        statusDetails.put("resolution", DisputeResolution.MERCHANT_WON.getDisputeResolution());
        statusDetails.put("state", DisputeState.RESOLVED.getDisputeState());
        statusDetails.put("reasonCode", DisputeReasonCode.MERCHANT_ACCEPTED_DISPUTE.getDisputeReasonCode());
        statusDetails.put("reasonDescription", "Merchant accepted the dispute request");

        JSONObject payload = new JSONObject();
        payload.put("statusDetails", statusDetails);
        // Current Unix timestamp (seconds since epoch)
        payload.put("closureTimestamp", System.currentTimeMillis() / 1000L);

        AmazonPayResponse response = webstoreClient.updateDispute(disputeId, payload);
    } catch (AmazonPayClientException e) {
        e.printStackTrace();
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="nodejstab-updateDispute-NESK">
<div markdown="block">
```html
const fs = require('fs');
const Client = require('@amazonpay/amazon-pay-api-sdk-nodejs');

const config = {
    publicKeyId: 'YOUR_PUBLIC_KEY_ID',
    privateKey: fs.readFileSync('tst/private.pem'),
    region: 'YOUR_REGION_CODE',
    sandbox: true,
    algorithm: 'AMZN-PAY-RSASSA-PSS-V2' 
};    

const disputeId = 'S01-0000000-0000000-B000000';

const payload = {
    statusDetails: {
        resolution: "MerchantWon",
        state: "Resolved",
        reasonCode: "MerchantAcceptedDispute",
        reasonDescription: "Merchant accepted the dispute request"
    },
    closureTimestamp: Date.now()
};

const testPayClient = new Client.WebStoreClient(config);
const response = testPayClient.updateDispute(disputeId, payload);

response.then(function (result) {
    console.log(result.data);
}).catch(err => {
    console.log(err);
});
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="rubytab-updateDispute-NESK">
<div markdown="block">
```
require 'amazon-pay-api-sdk-ruby'

config = {
  region: 'YOUR_REGION_CODE', # Supported values: na, eu, jp
  public_key_id: 'YOUR_PUBLIC_KEY_ID',
  private_key: File.read('privateKey.pem'),
  sandbox: true
}

client = AmazonPayClient.new(config)

dispute_id = 'S01-0000000-0000000-B000000'

payload = {
    "statusDetails": {
        "resolution": "MerchantWon",
        "state": "Resolved",
        "reasonCode": "MerchantAcceptedDispute",
        "reasonDescription": "Merchant accepted the dispute request"
    },
    "closureTimestamp": Time.now.to_i
}

response = client.update_dispute(dispute_id, payload)

if response.code.to_i == 200
    puts response.body
else
    # check the error
    puts "status=#{response.code}"
    puts response.body
end
```

</div>
  </div>
</div>

</div>

#### Response

The API returns an updated Dispute object containing:
* Basic dispute information (ID, type, amount, filing reason)
* Transaction details (charge ID, timestamps)
* Updated status information (state, resolution, reason codes)
* Evidence submissions (merchant documentation and files)

```
{
    "disputeId": "P01-1111111-1111111-B123456",
    "chargeId": "P01-1111111-1111111-C123456",
    "disputeType": "Chargeback",
    "disputeAmount":  {
        "amount": "400",
        "currencyCode": "USD" 
    },
    "filingReason": "Fraudulent",
    "filingTimestamp": "20190714T155300Z",
    "resolutionAuthority": "AmazonPay",
    "statusDetails":  {
        "state": "Resolved",
        "reasonCode": "MerchantAcceptedDispute",
        "reasonDescription": "Merchant accepted the dispute request",
        "resolution": "BuyerWon",
        "lastUpdatedTimestamp": "20190716T156500Z" 
    },
    "resolutionAuthority": "AmazonPay",
    "closureTimestamp": "20190716T155300Z",
    "releaseEnvironment": "Live"
}
```


### Contest Dispute Details

Challenge a dispute by submitting evidence and documentation to support your case against the chargeback. This endpoint enables merchants to formally contest a dispute by providing relevant proof such as shipping confirmations, customer communications, or product documentation. Use the <a href="../amazon-pay-api-v2/dispute.md#contest-dispute-details" target="_blank" rel="noopener noreferrer">Contest Dispute API </a> call when you have valid grounds to dispute a customer's chargeback and want to submit supporting evidence for review.

#### Request

<div style="display:none" class="environmentSpecificKeys">
<code style="color: black">
curl "https://pay-api.amazon.com/v2/disputes/:disputeId/contest" \ <br />
-X POST <br />
-H "authorization: Px2e5oHhQZ88vVhc0DO%2FsShHj8MDDg%3DEXAMPLESIGNATURE" <br />
-H "x-amz-pay-date:20201012T235046Z" <br />
-d @request_body <br />
</code>
</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<code style="color: black">
curl "https://pay-api.amazon.com/:environment/v2/disputes/:disputeId/contest" \ <br />
-X POST <br />
-H "authorization: Px2e5oHhQZ88vVhc0DO%2FsShHj8MDDg%3DEXAMPLESIGNATURE" <br />
-H "x-amz-pay-date:20201012T235046Z" <br />
-d @request_body <br />
</code>
</div>

#### Request body

```
{
    "merchantEvidences":  [
        {
            "evidenceType" : "TrackingNumber",
            "fileId": null,
            "evidenceText": "raw text supporting merchant evidence" 
        },
        {
            "evidenceType": "CustomerSignature",
            "fileId": "customer_signature_file_id",
            "evidenceText": null
        }
    ]
}
```


#### Request parameters

<table width="100%" border="1">
    <tbody>
        <tr id='PDP9CAQSM5J'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top; font-weight: bold; width: 30%;' class='bold'>Name
                <br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAkAlRX' style='vertical-align: top; font-weight: bold; width: 20%;' class='bold'>Location
                <br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAn6CQD' style='vertical-align: top; font-weight: bold; width: 50%;' class='bold'>Description
                <br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAkesJe;PDP9CAXfdYQ' style='vertical-align: top;'>merchantEvidences<br><b>(required)</b><br><br>Type: list <<a href="../amazon-pay-api-v2/dispute.md#type-evidence" target="_blank" rel="noopener noreferrer">Evidence </a>>
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAkAlRX' style='vertical-align: top;'>Body
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAn6CQD' style='vertical-align: top;'>List of evidence items supporting your case <br><br> <ul><li>Each evidence item needs either fileId or evidenceText</li><li>See Evidence Types table for supported values</li></ul>
                <br /></td>
        </tr>
    </tbody>
</table>

#### Sample Code

<div style="display:none" class="environmentSpecificKeys">
<ul id="profileTabs" class="nav nav-tabs">
  <li class="nav-item"><a class="active nav-link noExtIcon" href="#phptab-contestDispute" data-toggle="tab">PHP</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#dotnettab-contestDispute" data-toggle="tab">.NET</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#javatab-contestDispute" data-toggle="tab">Java</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#nodejstab-contestDispute" data-toggle="tab">Node.js</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#rubytab-contestDispute" data-toggle="tab">Ruby</a></li>
</ul>
<div class="tab-content">
  <div role="tabpanel" class="tab-pane active" id="phptab-contestDispute">   
<div markdown="block">
```
<?php

    include 'vendor/autoload.php';

    use Amazon\Pay\API\Constants\EvidenceType;

    $amazonpay_config = array(
        'public_key_id' => 'YOUR_PUBLIC_KEY_ID',
        'private_key'   => 'keys/private.pem', // Path to RSA Private Key (or a string representation)
        'region'        => 'YOUR_REGION_CODE',
        'algorithm'     => 'AMZN-PAY-RSASSA-PSS-V2'
    );

    $disputeId = 'S01-0000000-0000000-B000000';

    $payload = array(
        'merchantEvidences' => array(
            array(
                'evidenceType' => EvidenceType::TRACKING_NUMBER,
                'fileId' => 'YOUR_FILE_ID',
                'evidenceText' => 'raw text supporting merchant evidence'
            )
        )
    );

    try {
        $client = new Amazon\Pay\API\Client($amazonpay_config);
        $result = $client->contestDispute($disputeId, $payload);

        if ($result['status'] === 200) {
            $response = json_decode($result['response'], true);
            $disputeState = $response['statusDetails']['state'];

        } else {
            // check the error
            echo 'status=' . $result['status'] . '; response=' . $result['response'];
        }
    } catch (Exception $e) {
        // handle the exception
        echo $e;
    }
?>
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="dotnettab-contestDispute">
<div markdown="block">
```
using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;
using Amazon.Pay.API.WebStore.Dispute;
using Amazon.Pay.API.WebStore.Types;
using System;
using System.Collections.Generic;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.YOUR_REGION_CODE,
            publicKeyId: "YOUR_PUBLIC_KEY_ID",
            privateKey: "PATH_OR_CONTENT_OF_YOUR_PRIVATE_KEY",
            algorithm: AmazonSignatureAlgorithm.V2
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }

    public void ContestDispute(string disputeId)
    {
        // prepare the request
        var merchantEvidences = new List<MerchantEvidence>
        {
            new MerchantEvidence
            {
                EvidenceType = "TrackingNumber",
                FileId = "YOUR_FILE_ID",
                EvidenceText = "raw text supporting merchant evidence"
            }
        };
        var request = new ContestDisputeRequest(merchantEvidences);

        // send the request
        DisputeResponse result = client.ContestDispute(disputeId, request);

        // check if API call was successful
        if (!result.Success)
        {
            // handle the API error (use Status field to get the numeric error code)
        } else {
            // do something with the result, for instance:
            Console.WriteLine(result.RawResponse);
        }
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="javatab-contestDispute">
<div markdown="block">
```
import com.amazon.pay.api.AmazonPayResponse;
import com.amazon.pay.api.PayConfiguration;
import com.amazon.pay.api.WebstoreClient;
import com.amazon.pay.api.exceptions.AmazonPayClientException;
import com.amazon.pay.api.types.EvidenceType;
import com.amazon.pay.api.types.Region;

import org.json.JSONObject;

// for generating an idempotency key
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public void sample() {
    PayConfiguration payConfiguration = null;
    try {
        payConfiguration = new PayConfiguration()
            .setPublicKeyId("YOUR_PUBLIC_KEY_ID")
            .setRegion(Region.YOUR_REGION_CODE)
            .setPrivateKey("YOUR_PRIVATE_KEY".toCharArray())
            .setAlgorithm("AMZN-PAY-RSASSA-PSS-V2");

        WebstoreClient webstoreClient = new WebstoreClient(payConfiguration);
        String disputeId = "S01-0000000-0000000-B000000";

        JSONObject evidence = new JSONObject();
        evidence.put("evidenceType", EvidenceType.TRACKING_NUMBER.getEvidenceType());
        evidence.put("fileId", "YOUR_FILE_ID");
        evidence.put("evidenceText", "raw text supporting merchant evidence");

        JSONObject payload = new JSONObject();
        payload.append("merchantEvidences", evidence);

        Map<String, String> header = new HashMap<String, String>();
        header.put("x-amz-pay-idempotency-key", UUID.randomUUID().toString().replace("-", ""));

        AmazonPayResponse response = webstoreClient.contestDispute(disputeId, payload, header);
    } catch (AmazonPayClientException e) {
        e.printStackTrace();
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="nodejstab-contestDispute">
<div markdown="block">
```html
const fs = require('fs');
const Client = require('@amazonpay/amazon-pay-api-sdk-nodejs');

const config = {
    publicKeyId: 'YOUR_PUBLIC_KEY_ID',
    privateKey: fs.readFileSync('tst/private.pem'),
    region: 'YOUR_REGION_CODE',
    algorithm: 'AMZN-PAY-RSASSA-PSS-V2' 
};    

const disputeId = 'S01-0000000-0000000-B000000';

const payload = {
    merchantEvidences: [
        {
            evidenceType: "TrackingNumber",
            fileId: "YOUR_FILE_ID",
            evidenceText: "raw text supporting merchant evidence"
        }
    ]
};

const testPayClient = new Client.WebStoreClient(config);
const response = testPayClient.contestDispute(disputeId, payload);

response.then(function (result) {
    console.log(result.data);
}).catch(err => {
    console.log(err);
});
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="rubytab-contestDispute">
<div markdown="block">
```
require 'amazon-pay-api-sdk-ruby'

config = {
  region: 'YOUR_REGION_CODE', # Supported values: na, eu, jp
  public_key_id: 'YOUR_PUBLIC_KEY_ID',
  private_key: File.read('privateKey.pem')
}

client = AmazonPayClient.new(config)

dispute_id = 'S01-0000000-0000000-B000000'

payload = {
    "merchantEvidences": [
        {
            "evidenceType": "TrackingNumber",
            "fileId": "YOUR_FILE_ID",
            "evidenceText": "raw text supporting merchant evidence"
        }
    ]
}

response = client.contest_dispute(dispute_id, payload)

if response.code.to_i == 200
    puts response.body
else
    # check the error
    puts "status=#{response.code}"
    puts response.body
end
```

</div>
  </div>
</div>

</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<ul id="profileTabs" class="nav nav-tabs">
  <li class="nav-item"><a class="active nav-link noExtIcon" href="#phptab-contestDispute-NESK" data-toggle="tab">PHP</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#dotnettab-contestDispute-NESK" data-toggle="tab">.NET</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#javatab-contestDispute-NESK" data-toggle="tab">Java</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#nodejstab-contestDispute-NESK" data-toggle="tab">Node.js</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#rubytab-contestDispute-NESK" data-toggle="tab">Ruby</a></li>
</ul>
<div class="tab-content">
  <div role="tabpanel" class="tab-pane active" id="phptab-contestDispute-NESK">   
<div markdown="block">
```
<?php

    include 'vendor/autoload.php';

    use Amazon\Pay\API\Constants\EvidenceType;

    $amazonpay_config = array(
        'public_key_id' => 'YOUR_PUBLIC_KEY_ID',
        'private_key'   => 'keys/private.pem', // Path to RSA Private Key (or a string representation)
        'region'        => 'YOUR_REGION_CODE',
        'sandbox'       => true,
        'algorithm'     => 'AMZN-PAY-RSASSA-PSS-V2'
    );

    $disputeId = 'S01-0000000-0000000-B000000';

    $payload = array(
        'merchantEvidences' => array(
            array(
                'evidenceType' => EvidenceType::TRACKING_NUMBER,
                'fileId' => 'YOUR_FILE_ID',
                'evidenceText' => 'raw text supporting merchant evidence'
            )
        )
    );

    try {
        $client = new Amazon\Pay\API\Client($amazonpay_config);
        $result = $client->contestDispute($disputeId, $payload);

        if ($result['status'] === 200) {
            $response = json_decode($result['response'], true);
            $disputeState = $response['statusDetails']['state'];

        } else {
            // check the error
            echo 'status=' . $result['status'] . '; response=' . $result['response'];
        }
    } catch (Exception $e) {
        // handle the exception
        echo $e;
    }
?>
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="dotnettab-contestDispute-NESK">
<div markdown="block">
```
using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;
using Amazon.Pay.API.WebStore.Dispute;
using Amazon.Pay.API.WebStore.Types;
using System;
using System.Collections.Generic;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.YOUR_REGION_CODE,
            environment: Environment.Sandbox,
            publicKeyId: "YOUR_PUBLIC_KEY_ID",
            privateKey: "PATH_OR_CONTENT_OF_YOUR_PRIVATE_KEY",
            algorithm: AmazonSignatureAlgorithm.V2
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }

    public void ContestDispute(string disputeId)
    {
        // prepare the request
        var merchantEvidences = new List<MerchantEvidence>
        {
            new MerchantEvidence
            {
                EvidenceType = "TrackingNumber",
                FileId = "YOUR_FILE_ID",
                EvidenceText = "raw text supporting merchant evidence"
            }
        };
        var request = new ContestDisputeRequest(merchantEvidences);

        // send the request
        DisputeResponse result = client.ContestDispute(disputeId, request);

        // check if API call was successful
        if (!result.Success)
        {
            // handle the API error (use Status field to get the numeric error code)
        } else {
            // do something with the result, for instance:
            Console.WriteLine(result.RawResponse);
        }
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="javatab-contestDispute-NESK">
<div markdown="block">
```
import com.amazon.pay.api.AmazonPayResponse;
import com.amazon.pay.api.PayConfiguration;
import com.amazon.pay.api.WebstoreClient;
import com.amazon.pay.api.exceptions.AmazonPayClientException;
import com.amazon.pay.api.types.Environment;
import com.amazon.pay.api.types.EvidenceType;
import com.amazon.pay.api.types.Region;

import org.json.JSONObject;

// for generating an idempotency key
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public void sample() {
    PayConfiguration payConfiguration = null;
    try {
        payConfiguration = new PayConfiguration()
            .setPublicKeyId("YOUR_PUBLIC_KEY_ID")
            .setRegion(Region.YOUR_REGION_CODE)
            .setPrivateKey("YOUR_PRIVATE_KEY".toCharArray())
            .setEnvironment(Environment.SANDBOX)
            .setAlgorithm("AMZN-PAY-RSASSA-PSS-V2");

        WebstoreClient webstoreClient = new WebstoreClient(payConfiguration);
        String disputeId = "S01-0000000-0000000-B000000";

        JSONObject evidence = new JSONObject();
        evidence.put("evidenceType", EvidenceType.TRACKING_NUMBER.getEvidenceType());
        evidence.put("fileId", "YOUR_FILE_ID");
        evidence.put("evidenceText", "raw text supporting merchant evidence");

        JSONObject payload = new JSONObject();
        payload.append("merchantEvidences", evidence);

        Map<String, String> header = new HashMap<String, String>();
        header.put("x-amz-pay-idempotency-key", UUID.randomUUID().toString().replace("-", ""));

        AmazonPayResponse response = webstoreClient.contestDispute(disputeId, payload, header);
    } catch (AmazonPayClientException e) {
        e.printStackTrace();
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="nodejstab-contestDispute-NESK">
<div markdown="block">
```html
const fs = require('fs');
const Client = require('@amazonpay/amazon-pay-api-sdk-nodejs');

const config = {
    publicKeyId: 'YOUR_PUBLIC_KEY_ID',
    privateKey: fs.readFileSync('tst/private.pem'),
    region: 'YOUR_REGION_CODE',
    sandbox: true,
    algorithm: 'AMZN-PAY-RSASSA-PSS-V2' 
};    

const disputeId = 'S01-0000000-0000000-B000000';

const payload = {
    merchantEvidences: [
        {
            evidenceType: "TrackingNumber",
            fileId: "YOUR_FILE_ID",
            evidenceText: "raw text supporting merchant evidence"
        }
    ]
};

const testPayClient = new Client.WebStoreClient(config);
const response = testPayClient.contestDispute(disputeId, payload);

response.then(function (result) {
    console.log(result.data);
}).catch(err => {
    console.log(err);
});
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="rubytab-contestDispute-NESK">
<div markdown="block">
```
require 'amazon-pay-api-sdk-ruby'

config = {
  region: 'YOUR_REGION_CODE', # Supported values: na, eu, jp
  public_key_id: 'YOUR_PUBLIC_KEY_ID',
  private_key: File.read('privateKey.pem'),
  sandbox: true
}

client = AmazonPayClient.new(config)

dispute_id = 'S01-0000000-0000000-B000000'

payload = {
    "merchantEvidences": [
        {
            "evidenceType": "TrackingNumber",
            "fileId": "YOUR_FILE_ID",
            "evidenceText": "raw text supporting merchant evidence"
        }
    ]
}

response = client.contest_dispute(dispute_id, payload)

if response.code.to_i == 200
    puts response.body
else
    # check the error
    puts "status=#{response.code}"
    puts response.body
end
```

</div>
  </div>
</div>

</div>

#### Response

The API returns an updated Dispute object:

```
{
    "disputeId": "P01-1111111-1111111-B123456",
    "chargeId": "P01-1111111-1111111-C123456",
    "disputeType": "Claim",
    "disputeAmount": { 
        "amount": "400", 
        "currencyCode": "USD" 
    },
    "filingReason": "ProductNotReceived",
    "filingTimestamp": "20190714T155300Z",
    "statusDetails": {
        "state": "UnderReview",
        "reasonCode": null,
        "reasonDescription": null,
        "resolution": null, 
        "lastUpdatedTimestamp": "20190714T156500Z"
    },
    "resolutionAuthority": "AmazonPay",
    "releaseEnvironment": "Live",
    "merchantEvidences": [
        {
            "evidenceType" : "TrackingNumber",
            "fileId" : null,
            "evidenceText": "raw text supporting merchant evidence"
        },
        {
            "evidenceType": "CustomerSignature",
            "fileId": "customer_signature_file_id",
            "evidenceText": null
        }
    ]
}
```


### Attach Evidence to Disputes

Add supporting documentation and evidence files to an existing dispute case. This endpoint allows you to upload various types of evidence such as receipts, delivery confirmations, customer correspondence, or product photos to strengthen your dispute response. Use <a href="../amazon-pay-api-v2/dispute.md#attach-evidence-to-disputes" target="_blank" rel="noopener noreferrer">Attach Evidence API </a> call when you need to supplement your dispute case with additional documentation, either during initial submission or as follow-up evidence.

#### Request

<div style="display:none" class="environmentSpecificKeys">
<code style="color: black">
curl "https://pay-api.amazon.com/v2/disputes/:disputeId"/attachEvidences/ \ <br />
-X POST <br />
-H "authorization: Px2e5oHhQZ88vVhc0DO%2FsShHj8MDDg%3DEXAMPLESIGNATURE" <br />
-H "x-amz-pay-date:20201012T235046Z" <br />
-d @request_body <br />
</code>
</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<code style="color: black">
curl "https://pay-api.amazon.com/:environment/v2/disputes/:disputeId"/attachEvidences/ \ <br />
-X POST <br />
-H "authorization: Px2e5oHhQZ88vVhc0DO%2FsShHj8MDDg%3DEXAMPLESIGNATURE" <br />
-H "x-amz-pay-date:20201012T235046Z" <br />
-d @request_body <br />
</code>
</div>

#### Request body

```
{
    "merchantEvidences" : [
     {
         "evidenceType" : "Receipt",
         "fileId": "receipt_file_id",
         "evidenceText" : "null",
     }
   ]
}
```

#### Request parameters

<table width="100%" border="1">
    <tbody>
        <tr id='PDP9CAQSM5J'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top; font-weight: bold; width: 30%;' class='bold'>Name
                <br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAkAlRX' style='vertical-align: top; font-weight: bold; width: 20%;' class='bold'>Location
                <br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAn6CQD' style='vertical-align: top; font-weight: bold; width: 50%;' class='bold'>Description
                <br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAkesJe;PDP9CAXfdYQ' style='vertical-align: top;'>merchantEvidences<br><b>(required)</b><br><br>Type: list <<a href="../amazon-pay-api-v2/dispute.md#type-evidence" target="_blank" rel="noopener noreferrer"> Evidence</a>>
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAkAlRX' style='vertical-align: top;'>Body
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAn6CQD' style='vertical-align: top;'>List of evidence items supporting your case <br><br> <ul><li>evidenceType: Type of evidence (Receipt, TrackingNumber, CustomerSignature)</li><li>fileId: Unique identifier for uploaded file</li><li>evidenceText: Supporting text (when applicable)</li></ul>
                <br /></td>
        </tr>
    </tbody>
</table>

#### Response

The API returns an updated Dispute object containing:
* Basic dispute information (ID, type, amount, filing reason)
* Transaction details (charge ID, timestamps)
* Updated status information (state, resolution, reason codes)
* Evidence submissions (merchant documentation and files)

```
{
    "disputeId": " P01-1111111-1111111-B123456", // APay dispute ID generated from request 
    "chargeId": "P01-1111111-1111111-C123456",
    "disputeType" : "Chargeback",
    "disputeAmount": { 
        "amount": "400", 
        "currencyCode": "USD" 
    },
    "filingReason": "ProductNotReceived",
    "filingTimestamp": 20190714T155300Z,
    "statusDetails": {
        "state": "UnderReview",
        "reasonCode": null,
        "reasonDescription" : null
        "resolution": null, 
        "lastUpdatedTimestamp": 20190714T156500Z
    },
    "resolutionAuthority": "AmazonPay",
    "releaseEnvironment": "Live",
    "merchantEvidences" : [
        {
            "evidenceType" : "TrackingNumber",
            "fileId": null,
            "evidenceText" : "raw text supporting merchant evidence",
        },
        {
            "evidenceType" : "CustomerSignature",
            "fileId" : "customer_signature_file_id",
            "evidenceText": null
        },
        {
            "evidenceType" : "Receipt",
            "fileId": receipt_file_id,
            "evidenceText" : "null",
        }
    ]
}

```

### Upload files

Upload and manage files for dispute evidence and other documentation needs. The <a href="../amazon-pay-api-v2/file.md#upload-files" target="_blank" rel="noopener noreferrer">Upload File API</a> supports common file formats and provides secure upload URLs. The API provides a two-step process to upload files securely.

#### Step 1: Get Upload URL

First, request a secure upload URL:

#### Request

<div style="display:none" class="environmentSpecificKeys">
<code style="color: black">
curl "https://pay-api.amazon.com/v2/files" \ <br />
-X POST \ <br />
-H "authorization: Bearer YOUR_TOKEN" \ <br />
-H "x-amz-pay-date: 20201012T235046Z" \ <br />
-H "x-amz-pay-idempotency-key: YOUR_IDEMPOTENCY_KEY" \ <br />
-d @request_body <br />
</code>
</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<code style="color: black">
curl "https://pay-api.amazon.com/:environment/v2/files" \ <br />
-X POST \ <br />
-H "authorization: Bearer YOUR_TOKEN" \ <br />
-H "x-amz-pay-date: 20201012T235046Z" \ <br />
-H "x-amz-pay-idempotency-key: YOUR_IDEMPOTENCY_KEY" \ <br />
-d @request_body <br />
</code>
</div>

#### Request body

```
{
    "type" : "jpg",
    "purpose" : "disputeEvidence"
}
```

#### Request parameters

<table width="100%" border="1">
    <tbody>
        <tr id='PDP9CAQSM5J'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top; font-weight: bold; width: 30%;' class='bold'>Name
                <br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAkAlRX' style='vertical-align: top; font-weight: bold; width: 20%;' class='bold'>Location
                <br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAn6CQD' style='vertical-align: top; font-weight: bold; width: 50%;' class='bold'>Description
                <br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAkesJe;PDP9CAXfdYQ' style='vertical-align: top;'>x-amz-pay-idempotency-key<br><b>(required)</b><br><br>Type: String
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAkAlRX' style='vertical-align: top;'>Header
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAn6CQD' style='vertical-align: top;'>Unique key to prevent duplicate uploads. For detailed guidance on creating and using idempotency keys, see Idempotency.
                <br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAkesJe;PDP9CAXfdYQ' style='vertical-align: top;'>type<br><br>Type: String
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAkAlRX' style='vertical-align: top;'>Body
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAn6CQD' style='vertical-align: top;'>File format (jpg, png, pdf)
                <br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAkesJe;PDP9CAXfdYQ' style='vertical-align: top;'>purpose<br><br>Type: String
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAkAlRX' style='vertical-align: top;'>Body
                <br /></td>
            <td id='s:PDP9CAkesJe;PDP9CAn6CQD' style='vertical-align: top;'>Upload reason (disputeEvidence)
                <br /></td>
        </tr>
    </tbody>
</table>

#### Supported file types

<table width="100%" border="1">
    <tbody>
        <tr id='PDP9CAQSM5J'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top; font-weight: bold; width: 30%;' class='bold'>fileType<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top; font-weight: bold; width: 20%;' class='bold'>Description<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top; font-weight: bold; width: 50%;' class='bold'>Content-Type<br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>csv<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>CSV files<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>text/csv<br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>pdf<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>PDF documents<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>application/pdf<br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>xls/xlsx<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>Excel spreadsheets<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>application/vnd.ms-excel (xls)<br />application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (xlsx)<br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>doc/docx<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>Word documents<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>application/msword (doc)<br />application/vnd.openxmlformats-officedocument.wordprocessingml.document (docx)<br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>ods<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>OpenDocument spreadsheets<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>application/vnd.oasis.opendocument.spreadsheet<br /></td>
        </tr>
        <tr id='PDP9CAkesJe'>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>jpg/png<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>Image files<br /></td>
            <td id='s:PDP9CAQSM5J;PDP9CAXfdYQ' style='vertical-align: top;'>image/jpeg (jpg)<br />image/png (png)<br /></td>
        </tr>
    </tbody>
</table>

#### Sample Code

<div style="display:none" class="environmentSpecificKeys">
<ul id="profileTabs" class="nav nav-tabs">
  <li class="nav-item"><a class="active nav-link noExtIcon" href="#phptab-uploadFile" data-toggle="tab">PHP</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#dotnettab-uploadFile" data-toggle="tab">.NET</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#javatab-uploadFile" data-toggle="tab">Java</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#nodejstab-uploadFile" data-toggle="tab">Node.js</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#rubytab-uploadFile" data-toggle="tab">Ruby</a></li>
</ul>
<div class="tab-content">
  <div role="tabpanel" class="tab-pane active" id="phptab-uploadFile">   
<div markdown="block">
```
<?php

    include 'vendor/autoload.php';

    $amazonpay_config = array(
        'public_key_id' => 'YOUR_PUBLIC_KEY_ID',
        'private_key'   => 'keys/private.pem', // Path to RSA Private Key (or a string representation)
        'region'        => 'YOUR_REGION_CODE',
        'algorithm'     => 'AMZN-PAY-RSASSA-PSS-V2'
    );

    $payload = array(
        'type' => 'jpg',
        'purpose' => 'disputeEvidence'
    );

    $headers = array('x-amz-pay-Idempotency-Key' => uniqid());

    try {
        $client = new Amazon\Pay\API\Client($amazonpay_config);
        $result = $client->uploadFile($payload, $headers);

        if ($result['status'] === 200) {
            $response = json_decode($result['response'], true);
            $fileId = $response['id'];
            $uploadUrl = $response['url'];

        } else {
            // check the error
            echo 'status=' . $result['status'] . '; response=' . $result['response'];
        }
    } catch (Exception $e) {
        // handle the exception
        echo $e;
    }
?>
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="dotnettab-uploadFile">
<div markdown="block">
```
using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;
using Amazon.Pay.API.WebStore.File;
using Amazon.Pay.API.WebStore.Types;
using System;
using System.Collections.Generic;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.YOUR_REGION_CODE,
            publicKeyId: "YOUR_PUBLIC_KEY_ID",
            privateKey: "PATH_OR_CONTENT_OF_YOUR_PRIVATE_KEY",
            algorithm: AmazonSignatureAlgorithm.V2
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }

    public void UploadFile()
    {
        // prepare the request
        var request = new UploadFileRequest(type: "jpg", purpose: "disputeEvidence");

        // init Headers
        var myHeaderKey = "x-amz-pay-idempotency-key";
        var myHeaderValue = Guid.NewGuid().ToString();
        var headers = new Dictionary<string, string> { { myHeaderKey,  myHeaderValue } };

        // send the request
        FileResponse result = client.UploadFile(request, headers);

        // check if API call was successful
        if (!result.Success)
        {
            // handle the API error (use Status field to get the numeric error code)
        } else {
            // do something with the result, for instance:
            string fileId = result.Id;
            string uploadUrl = result.URL;
            DateTime urlExpiryTimestamp = result.UrlExpirationTimestamp;
        }
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="javatab-uploadFile">
<div markdown="block">
```
import com.amazon.pay.api.AmazonPayResponse;
import com.amazon.pay.api.PayConfiguration;
import com.amazon.pay.api.WebstoreClient;
import com.amazon.pay.api.exceptions.AmazonPayClientException;
import com.amazon.pay.api.types.DisputeFilePurpose;
import com.amazon.pay.api.types.EvidenceDocumentFileType;
import com.amazon.pay.api.types.Region;

import org.json.JSONObject;

// for generating an idempotency key
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public void sample() {
    PayConfiguration payConfiguration = null;
    try {
        payConfiguration = new PayConfiguration()
            .setPublicKeyId("YOUR_PUBLIC_KEY_ID")
            .setRegion(Region.YOUR_REGION_CODE)
            .setPrivateKey("YOUR_PRIVATE_KEY".toCharArray())
            .setAlgorithm("AMZN-PAY-RSASSA-PSS-V2");

        WebstoreClient webstoreClient = new WebstoreClient(payConfiguration);

        JSONObject payload = new JSONObject();
        payload.put("type", EvidenceDocumentFileType.JPG.getEvidenceDocumentFileType());
        payload.put("purpose", DisputeFilePurpose.DISPUTE_EVIDENCE.getDisputeFilePurpose());

        Map<String, String> header = new HashMap<String, String>();
        header.put("x-amz-pay-idempotency-key", UUID.randomUUID().toString().replace("-", ""));

        AmazonPayResponse response = webstoreClient.uploadFile(payload, header);
    } catch (AmazonPayClientException e) {
        e.printStackTrace();
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="nodejstab-uploadFile">
<div markdown="block">
```html
const fs = require('fs');
const Client = require('@amazonpay/amazon-pay-api-sdk-nodejs');
const uuidv4 = require('uuid/v4');

const config = {
    publicKeyId: 'YOUR_PUBLIC_KEY_ID',
    privateKey: fs.readFileSync('tst/private.pem'),
    region: 'YOUR_REGION_CODE',
    algorithm: 'AMZN-PAY-RSASSA-PSS-V2' 
};    

const payload = {
    type: "jpg",
    purpose: "disputeEvidence"
};

const headers = {
    'x-amz-pay-idempotency-key': uuidv4().toString().replace(/-/g, '')
};

const testPayClient = new Client.WebStoreClient(config);
const response = testPayClient.uploadFile(payload, headers);

response.then(function (result) {
    console.log(result.data);
}).catch(err => {
    console.log(err);
});
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="rubytab-uploadFile">
<div markdown="block">
```
require 'amazon-pay-api-sdk-ruby'
require 'securerandom'

config = {
  region: 'YOUR_REGION_CODE', # Supported values: na, eu, jp
  public_key_id: 'YOUR_PUBLIC_KEY_ID',
  private_key: File.read('privateKey.pem')
}

client = AmazonPayClient.new(config)

payload = {
    "type": "jpg",
    "purpose": "disputeEvidence"
}

headers = {
    "x-amz-pay-Idempotency-Key": SecureRandom.uuid
}

response = client.upload_file(payload, headers: headers)

if response.code.to_i == 200
    puts response.body
else
    # check the error
    puts "status=#{response.code}"
    puts response.body
end
```

</div>
  </div>
</div>

</div>
<div style="display:none" class="notEnvironmentSpecificKeys">
<ul id="profileTabs" class="nav nav-tabs">
  <li class="nav-item"><a class="active nav-link noExtIcon" href="#phptab-uploadFile-NESK" data-toggle="tab">PHP</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#dotnettab-uploadFile-NESK" data-toggle="tab">.NET</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#javatab-uploadFile-NESK" data-toggle="tab">Java</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#nodejstab-uploadFile-NESK" data-toggle="tab">Node.js</a></li>
  <li class="nav-item"><a class="nav-link noExtIcon" href="#rubytab-uploadFile-NESK" data-toggle="tab">Ruby</a></li>
</ul>
<div class="tab-content">
  <div role="tabpanel" class="tab-pane active" id="phptab-uploadFile-NESK">   
<div markdown="block">
```
<?php

    include 'vendor/autoload.php';

    $amazonpay_config = array(
        'public_key_id' => 'YOUR_PUBLIC_KEY_ID',
        'private_key'   => 'keys/private.pem', // Path to RSA Private Key (or a string representation)
        'region'        => 'YOUR_REGION_CODE',
        'sandbox'       => true,
        'algorithm'     => 'AMZN-PAY-RSASSA-PSS-V2'
    );

    $payload = array(
        'type' => 'jpg',
        'purpose' => 'disputeEvidence'
    );

    $headers = array('x-amz-pay-Idempotency-Key' => uniqid());

    try {
        $client = new Amazon\Pay\API\Client($amazonpay_config);
        $result = $client->uploadFile($payload, $headers);

        if ($result['status'] === 200) {
            $response = json_decode($result['response'], true);
            $fileId = $response['id'];
            $uploadUrl = $response['url'];

        } else {
            // check the error
            echo 'status=' . $result['status'] . '; response=' . $result['response'];
        }
    } catch (Exception $e) {
        // handle the exception
        echo $e;
    }
?>
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="dotnettab-uploadFile-NESK">
<div markdown="block">
```
using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;
using Amazon.Pay.API.WebStore.File;
using Amazon.Pay.API.WebStore.Types;
using System;
using System.Collections.Generic;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.YOUR_REGION_CODE,
            environment: Environment.Sandbox,
            publicKeyId: "YOUR_PUBLIC_KEY_ID",
            privateKey: "PATH_OR_CONTENT_OF_YOUR_PRIVATE_KEY",
            algorithm: AmazonSignatureAlgorithm.V2
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }

    public void UploadFile()
    {
        // prepare the request
        var request = new UploadFileRequest(type: "jpg", purpose: "disputeEvidence");

        // init Headers
        var myHeaderKey = "x-amz-pay-idempotency-key";
        var myHeaderValue = Guid.NewGuid().ToString();
        var headers = new Dictionary<string, string> { { myHeaderKey,  myHeaderValue } };

        // send the request
        FileResponse result = client.UploadFile(request, headers);

        // check if API call was successful
        if (!result.Success)
        {
            // handle the API error (use Status field to get the numeric error code)
        } else {
            // do something with the result, for instance:
            string fileId = result.Id;
            string uploadUrl = result.URL;
            DateTime urlExpiryTimestamp = result.UrlExpirationTimestamp;
        }
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="javatab-uploadFile-NESK">
<div markdown="block">
```
import com.amazon.pay.api.AmazonPayResponse;
import com.amazon.pay.api.PayConfiguration;
import com.amazon.pay.api.WebstoreClient;
import com.amazon.pay.api.exceptions.AmazonPayClientException;
import com.amazon.pay.api.types.DisputeFilePurpose;
import com.amazon.pay.api.types.Environment;
import com.amazon.pay.api.types.EvidenceDocumentFileType;
import com.amazon.pay.api.types.Region;

import org.json.JSONObject;

// for generating an idempotency key
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public void sample() {
    PayConfiguration payConfiguration = null;
    try {
        payConfiguration = new PayConfiguration()
            .setPublicKeyId("YOUR_PUBLIC_KEY_ID")
            .setRegion(Region.YOUR_REGION_CODE)
            .setPrivateKey("YOUR_PRIVATE_KEY".toCharArray())
            .setEnvironment(Environment.SANDBOX)
            .setAlgorithm("AMZN-PAY-RSASSA-PSS-V2");

        WebstoreClient webstoreClient = new WebstoreClient(payConfiguration);

        JSONObject payload = new JSONObject();
        payload.put("type", EvidenceDocumentFileType.JPG.getEvidenceDocumentFileType());
        payload.put("purpose", DisputeFilePurpose.DISPUTE_EVIDENCE.getDisputeFilePurpose());

        Map<String, String> header = new HashMap<String, String>();
        header.put("x-amz-pay-idempotency-key", UUID.randomUUID().toString().replace("-", ""));

        AmazonPayResponse response = webstoreClient.uploadFile(payload, header);
    } catch (AmazonPayClientException e) {
        e.printStackTrace();
    }
}
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="nodejstab-uploadFile-NESK">
<div markdown="block">
```html
const fs = require('fs');
const Client = require('@amazonpay/amazon-pay-api-sdk-nodejs');
const uuidv4 = require('uuid/v4');

const config = {
    publicKeyId: 'YOUR_PUBLIC_KEY_ID',
    privateKey: fs.readFileSync('tst/private.pem'),
    region: 'YOUR_REGION_CODE',
    sandbox: true,
    algorithm: 'AMZN-PAY-RSASSA-PSS-V2' 
};    

const payload = {
    type: "jpg",
    purpose: "disputeEvidence"
};

const headers = {
    'x-amz-pay-idempotency-key': uuidv4().toString().replace(/-/g, '')
};

const testPayClient = new Client.WebStoreClient(config);
const response = testPayClient.uploadFile(payload, headers);

response.then(function (result) {
    console.log(result.data);
}).catch(err => {
    console.log(err);
});
```

</div>
  </div>
  <div role="tabpanel" class="tab-pane" id="rubytab-uploadFile-NESK">
<div markdown="block">
```
require 'amazon-pay-api-sdk-ruby'
require 'securerandom'

config = {
  region: 'YOUR_REGION_CODE', # Supported values: na, eu, jp
  public_key_id: 'YOUR_PUBLIC_KEY_ID',
  private_key: File.read('privateKey.pem'),
  sandbox: true
}

client = AmazonPayClient.new(config)

payload = {
    "type": "jpg",
    "purpose": "disputeEvidence"
}

headers = {
    "x-amz-pay-Idempotency-Key": SecureRandom.uuid
}

response = client.upload_file(payload, headers: headers)

if response.code.to_i == 200
    puts response.body
else
    # check the error
    puts "status=#{response.code}"
    puts response.body
end
```

</div>
  </div>
</div>

</div>

#### Response

The API returns:

```
{
    "id": "file_sdcjscbjckndjhckj",
    "type" : "jpg",
    "purpose": "disputeEvidence",
    "uploadTimestamp": "20190714T155300Z",
    "url": "https://pay-api.amazon.com/v1/files/file_sdcjscbjckndjhckj/contents",
    "urlExpirationTimeStamp": "20190714T155300Z"
}
```


#### Step 2: Upload your file

Send your file to the returned URL:

<code style="color: black">
curl "YOUR_PRESIGNED_URL" \ <br />
-X PUT \ <br />
-H "Content-Type: application/pdf" \ <br />
-T "/path/to/file" <br />
</code>

File Requirements:
* Maximum size: 2MB
* Files must be relevant dispute evidence

After uploading, use the returned fileId when submitting dispute evidence.
