# Upload evidence file

Uploads a file as evidence for a dispute.

Read our [disputes guide](https://docs.moov.io/guides/money-movement/accept-payments/card-acceptance/disputes/) to learn more.

To access this endpoint using an [access token](https://docs.moov.io/api/authentication/access-tokens/)
you'll need to specify the `/accounts/{accountID}/transfers.write` scope.

## Endpoint

`POST /accounts/{accountID}/disputes/{disputeID}/evidence-file`

## Ask

```shell
curl -X POST "https://api.moov.io/accounts/{accountID}/disputes/{disputeID}/evidence-file" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.04.00" \
  -F "file=@/path/to/file" \
  -F "evidenceType=receipt"
```

## Ask

```go
mc, _ := moov.NewClient()

var accountID string
var disputeID string
file, _ := os.Open("path/to/test.pdf")

mc.UploadEvidenceFile(ctx, accountID, disputeID, moov.EvidenceType_CoverLetter, "test.pdf", file, "application/pdf")
```

## Ask

```typescript
import { Moov } from "@moovio/sdk";
import { openAsBlob } from "node:fs";

const moov = new Moov({
  security: {
    username: "",
    password: "",
  },
});

async function run() {
  const result = await moov.disputes.uploadEvidenceFile({
    accountID: "c09fd2f8-75fb-4ed9-be03-f8565d3ddc67",
    disputeID: "ad27f84d-00b1-4db0-8cf5-be001d71251d",
    createEvidenceFileMultiPart: {
      file: await openAsBlob("example.file"),
      evidenceType: "cancelation-policy",
    },
  });

console.log(result);
}

run();
```

## Ask

```php
declare(strict_types=1);

require 'vendor/autoload.php';

use Moov"}

```php
MoovPhp;
use Moov"}

```php
MoovPhp\Models\Components;

$sdk = MoovPhp\Moov::builder()
    ->setSecurity(
        new Components\Security(
            username: '',
            password: '',
        )
    )
    ->build();

$createEvidenceFileMultiPart = new Components\CreateEvidenceFileMultiPart(
    file: new Components\File(
        fileName: 'example.file',
        content: file_get_contents('example.file');,
    ),
    evidenceType: Components\EvidenceType::CancelationPolicy,
);

$response = $sdk->disputes->uploadEvidenceFile(
    accountID: 'fbed9e03-f856-45d3-8ddc-67dad27f84d0',
    disputeID: 'b1db0cf5-be00-41d7-a125-1d2d283c2a62',
    createEvidenceFileMultiPart: $createEvidenceFileMultiPart
);

if ($response->evidenceUploadResponse !== null) {
    // handle response
}
```

## Ask

```java
package hello.world;

import io.moov.sdk.Moov;
import io.moov.sdk.models.components.*;
import io.moov.sdk.models.errors.FileUploadValidationError;
import io.moov.sdk.models.errors.GenericError;
import io.moov.sdk.models.operations.UploadDisputeEvidenceFileResponse;
import io.moov.sdk.utils.Utils;
import java.io.FileInputStream;
import java.lang.Exception;

public class Application {

public static void main(String[] args) throws GenericError, FileUploadValidationError, Exception {

Moov sdk = Moov.builder()
                .security(Security.builder()
                    .username("")
                    .password("")
                    .build())
            .build();

UploadDisputeEvidenceFileResponse res = sdk.disputes().uploadEvidenceFile()
                .accountID("fbed9e03-f856-45d3-8ddc-67dad27f84d0")
                .disputeID("b1db0cf5-be00-41d7-a125-1d2d283c2a62")
                .createEvidenceFileMultiPart(CreateEvidenceFileMultiPart.builder()
                    .file(File.builder()
                        .fileName("example.file")
                        .content(Utils.readBytesAndClose(new FileInputStream("example.file")))
                        .build())
                    .evidenceType(EvidenceType.CANCELATION_POLICY)
                    .build())
                .call();

}
}
```

## Ask

```python
from moovio_sdk import Moov
from moovio_sdk.models import components

with Moov(
    security=components.Security(
        username="",
        password="",
    ),
) as moov:

res = moov.disputes.upload_evidence_file(account_id="c09fd2f8-75fb-4ed9-be03-f8565d3ddc67", dispute_id="ad27f84d-00b1-4db0-8cf5-be001d71251d", file={
        "file_name": "example.file",
        "content": open("example.file", "rb"),
    }, evidence_type=components.EvidenceType.CANCELATION_POLICY)

# Handle response
    print(res)
```

## Ask

```ruby
require 'moov_ruby'

Models = ::Moov::Models
s = ::Moov::Client.new(
  security: Models::Components::Security.new(
    username: '',
    password: ''
  )
)
res = s.disputes.upload_evidence_file(account_id: 'c09fd2f8-75fb-4ed9-be03-f8565d3ddc67', dispute_id: 'ad27f84d-00b1-4db0-8cf5-be001d71251d', create_evidence_file_multi_part: Models::Components::CreateEvidenceFileMultiPart.new(
  file: Models::Components::CreateEvidenceFileMultiPartFile.new(
    file_name: 'example.file',
    content: File.binread('example.file')
  ),
  evidence_type: Models::Components::EvidenceType::CANCELATION_POLICY
))

unless res.evidence_upload_response.nil?
  # handle response
end
```

## Ask

```csharp
using Moov.Sdk;
using Moov.Sdk.Models.Components;

var sdk = new MoovClient(security: new Security() {
    Username = "",
    Password = "",
});

var res = await sdk.Disputes.UploadEvidenceFileAsync(
    accountID: "c09fd2f8-75fb-4ed9-be03-f8565d3ddc67",
    disputeID: "ad27f84d-00b1-4db0-8cf5-be001d71251d",
    body: new CreateEvidenceFileMultiPart() {
        File = new CreateEvidenceFileMultiPartFile() {
            FileName = "example.file",
            Content = System.IO.File.ReadAllBytes("example.file"),
        },
        EvidenceType = EvidenceType.CancelationPolicy,
    }
);

// handle response
```

## Successful Response

Example

```json
{
  "evidenceID": "string",
  "disputeID": "string",
  "filename": "string",
  "mimeType": "string",
  "size": 0,
  "evidenceType": "receipt",
  "createdOn": "2019-08-24T14:15:22Z"
}
```

### Response headers

A unique identifier used to trace requests.

### Error Responses

#### Invalid syntax

Example

```json
{
  "error": "string"
}
```

#### Missing or expired authentication

### Response headers

A unique identifier used to trace requests.

#### User not authorized

### Response headers

A unique identifier used to trace requests.

#### Resource not found

### Response headers

A unique identifier used to trace requests.

#### Conflict with the current state

Example

```json
{
  "error": "string"
}
```

### Validation errors

Example

```json
{
  "evidenceType": "string",
  "file": {
    "filename": "string",
    "mimeType": "string"
  }
}
```

### Rate limiting
### Response headers

A unique identifier used to trace requests.

### Unexpected errors
### Response headers

A unique identifier used to trace requests.

### Downstream service errors
### Response headers

A unique identifier used to trace requests.

### API Versioning
Set this header to v2026.04.00 to use the API described in this specification. When omitted, the server defaults to v2024.01.00, which may not match the behavior documented here.

### Evidence Types
Possible values:

- `receipt`
- `proof-of-delivery`
- `cancelation-policy`
- `terms-of-service`
- `customer-communication`
- `generic-evidence`
- `cover-letter`
- `other`

The file to upload as evidence. Valid types are [jpeg, tiff, pdf] with a limit of 4MB per file.

### Content-Type headers
The `Content-Type` header for this form part must be one of the following:

- `image/jpeg`
- `image/tiff`
- `application/pdf`

### Notes
Details of a successfully uploaded evidence file.

- The date and time the evidence was uploaded.
- The ID of the dispute the evidence is associated with.
- The ID of the evidence.
- The name of the evidence file.
- The MIME type of the evidence file.
- The size of the evidence file.
