curl --request PATCH \
--url https://api.bachs.io/v1/disputes/{dispute_id}/evidence \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_name": "Amara Osei",
"customer_email_address": "customer@example.com",
"product_description": "Annual SaaS subscription, plan ID PLAN-PRO-001",
"service_date": "2026-03-01",
"notes": "Customer confirmed delivery via email on March 5.",
"customer_communication_attachment_id": "upl_9f2c7b3d1e45"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_name: 'Amara Osei',
customer_email_address: 'customer@example.com',
product_description: 'Annual SaaS subscription, plan ID PLAN-PRO-001',
service_date: '2026-03-01',
notes: 'Customer confirmed delivery via email on March 5.',
customer_communication_attachment_id: 'upl_9f2c7b3d1e45'
})
};
fetch('https://api.bachs.io/v1/disputes/{dispute_id}/evidence', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/disputes/{dispute_id}/evidence"
payload = {
"customer_name": "Amara Osei",
"customer_email_address": "customer@example.com",
"product_description": "Annual SaaS subscription, plan ID PLAN-PRO-001",
"service_date": "2026-03-01",
"notes": "Customer confirmed delivery via email on March 5.",
"customer_communication_attachment_id": "upl_9f2c7b3d1e45"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/disputes/{dispute_id}/evidence"
payload := strings.NewReader("{\n \"customer_name\": \"Amara Osei\",\n \"customer_email_address\": \"customer@example.com\",\n \"product_description\": \"Annual SaaS subscription, plan ID PLAN-PRO-001\",\n \"service_date\": \"2026-03-01\",\n \"notes\": \"Customer confirmed delivery via email on March 5.\",\n \"customer_communication_attachment_id\": \"upl_9f2c7b3d1e45\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"dispute_id": "dsp_3e7b1c9a2f48",
"status": "needs_response",
"is_response_editable": true,
"evidence_updated_at": "2026-03-09T11:30:00.000Z"
}{
"detail": "Invalid request parameters",
"error_code": "VALIDATION_ERROR",
"errors": [
{
"field": "amount",
"message": "Amount must be a positive decimal string",
"type": "value_error"
}
]
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}{
"detail": "Duplicate request detected",
"error_code": "CONFLICT"
}{
"detail": "Rate limit exceeded. Please retry after a few seconds.",
"error_code": "TOO_MANY_REQUESTS"
}{
"detail": "An unexpected error occurred. Please try again later.",
"error_code": "INTERNAL_SERVER_ERROR"
}Update Dispute Evidence
Save or update dispute evidence fields before final submission. Evidence can be updated iteratively while the dispute remains editable.
curl --request PATCH \
--url https://api.bachs.io/v1/disputes/{dispute_id}/evidence \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_name": "Amara Osei",
"customer_email_address": "customer@example.com",
"product_description": "Annual SaaS subscription, plan ID PLAN-PRO-001",
"service_date": "2026-03-01",
"notes": "Customer confirmed delivery via email on March 5.",
"customer_communication_attachment_id": "upl_9f2c7b3d1e45"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_name: 'Amara Osei',
customer_email_address: 'customer@example.com',
product_description: 'Annual SaaS subscription, plan ID PLAN-PRO-001',
service_date: '2026-03-01',
notes: 'Customer confirmed delivery via email on March 5.',
customer_communication_attachment_id: 'upl_9f2c7b3d1e45'
})
};
fetch('https://api.bachs.io/v1/disputes/{dispute_id}/evidence', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/disputes/{dispute_id}/evidence"
payload = {
"customer_name": "Amara Osei",
"customer_email_address": "customer@example.com",
"product_description": "Annual SaaS subscription, plan ID PLAN-PRO-001",
"service_date": "2026-03-01",
"notes": "Customer confirmed delivery via email on March 5.",
"customer_communication_attachment_id": "upl_9f2c7b3d1e45"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/disputes/{dispute_id}/evidence"
payload := strings.NewReader("{\n \"customer_name\": \"Amara Osei\",\n \"customer_email_address\": \"customer@example.com\",\n \"product_description\": \"Annual SaaS subscription, plan ID PLAN-PRO-001\",\n \"service_date\": \"2026-03-01\",\n \"notes\": \"Customer confirmed delivery via email on March 5.\",\n \"customer_communication_attachment_id\": \"upl_9f2c7b3d1e45\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"dispute_id": "dsp_3e7b1c9a2f48",
"status": "needs_response",
"is_response_editable": true,
"evidence_updated_at": "2026-03-09T11:30:00.000Z"
}{
"detail": "Invalid request parameters",
"error_code": "VALIDATION_ERROR",
"errors": [
{
"field": "amount",
"message": "Amount must be a positive decimal string",
"type": "value_error"
}
]
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}{
"detail": "Duplicate request detected",
"error_code": "CONFLICT"
}{
"detail": "Rate limit exceeded. Please retry after a few seconds.",
"error_code": "TOO_MANY_REQUESTS"
}{
"detail": "An unexpected error occurred. Please try again later.",
"error_code": "INTERNAL_SERVER_ERROR"
}Authorizations
Bearer token authentication. Pass your API key as Authorization: Bearer sk_.... See Authentication for keys, scopes, and sandbox vs production.
Path Parameters
Unique identifier for the dispute.
Body
Fields used to create or update dispute evidence. Include only fields that should change.
An access or activity log showing the customer used what they paid for.
Customer's billing address.
Upload id of your cancellation policy document.
Cancellation policy shown to the customer.
Uploaded customer communication document identifier.
Email address of the customer.
Full name of the customer.
Additional context supporting the dispute response.
Description of delivered goods or services.
Upload id of your refund policy document.
Refund policy shown to the customer.
Reason a refund was not granted.
Date the service was delivered.
Uploaded supporting document identifier.
Response
Evidence updated successfully.
Response after saving dispute evidence fields.

