[Bug] Cannot submit dispute evidence programmatically - Neither GraphQL nor REST API works on Production Store

Summary

There is NO working method to programmatically submit dispute evidence to card networks via Shopify API.

  • GraphQL: disputeEvidenceUpdate mutation does NOT have a submitEvidence parameter - it can only save/update evidence data
  • REST API: submit_evidence: true parameter is documented but does NOT actually submit - submitted_by_merchant_on always returns null

Both APIs can successfully save evidence data, but neither can trigger actual submission to the card network.

Environment

  • Store type: Production store (NOT development store)
  • Shopify Payments: Fully activated and verified
  • API versions tested: GraphQL 2025-10, REST 2025-01/2025-04/2025-10
  • App type: Public app
  • Dispute type: Real chargeback (status: needs_response, within evidenceDueBy deadline)

Access Scopes

read_shopify_payments_disputes
write_shopify_payments_dispute_evidences
read_shopify_payments_dispute_evidences

Test Results Summary

Operation API Result
Query disputes GraphQL :white_check_mark: Works
Query disputes REST :white_check_mark: Works
Save/Update evidence data GraphQL :white_check_mark: Works
Save/Update evidence data REST :white_check_mark: Works
Submit evidence GraphQL :cross_mark: No submitEvidence parameter exists
Submit evidence REST submit_evidence: true :cross_mark: Returns 200 OK but submitted_by_merchant_on: null

Detailed Findings

Issue 1: GraphQL has NO submission capability

The ShopifyPaymentsDisputeEvidenceUpdateInput input type does NOT include a submitEvidence field. I reviewed the official documentation and confirmed this parameter simply does not exist.

Available fields in GraphQL input:

  • accessActivityLog, billingAddress, cancellationPolicyDisclosure, cancellationRebuttal
  • customerEmailAddress, customerFirstName, customerLastName
  • refundPolicyDisclosure, refundRefusalExplanation, shippingAddress, uncategorizedText
  • Various file fields (cancellationPolicyFile, shippingDocumentationFile, etc.)
  • NO submitEvidence field

Issue 2: REST API submit_evidence: true does nothing

curl -X PUT \
  "https://{store}.myshopify.com/admin/api/2025-10/shopify_payments/disputes/{dispute_id}/dispute_evidences.json" \
  -H "X-Shopify-Access-Token: {access_token}" \
  -H "Content-Type: application/json" \
  -d '{"dispute_evidence": {"submit_evidence": true}}'

Response: HTTP 200 OK

{
  "dispute_evidence": {
    "id": 819974671,
    "payments_dispute_id": 598735659,
    "submitted_by_merchant_on": null,   // ❌ Should have timestamp
    "updated_at": "2025-01-20T14:00:00-05:00",
    // ... other fields populated correctly
  }
}

Expected behavior per documentation:

{
  "dispute_evidence": {
    "submitted_by_merchant_on": "2025-10-01T14:56:10-04:00"  // âś… Should have timestamp
  }
}

Current Workaround (Not Ideal)

The only options available are:

  1. Manual submission via Shopify Admin UI
  2. Wait for auto-submit at evidenceDueBy deadline (Shopify auto-submits whatever evidence exists)

Neither option allows for programmatic, immediate submission which is critical for automated dispute management workflows.

Questions for Shopify Team

  1. Is this a bug or intended behavior? The REST API documentation shows submit_evidence: true should work, but it doesn’t.

  2. Why does GraphQL disputeEvidenceUpdate not have a submission parameter? This seems like a significant API gap since REST API is marked as “legacy” but GraphQL lacks equivalent functionality.

  3. Are there any prerequisites we might be missing? (specific fields required, minimum evidence, etc.)

  4. Is there a different mutation/endpoint for submitting evidence that is not publicly documented?

  5. If programmatic submission is not supported, please update the documentation to clearly state this limitation.

Impact

This limitation prevents us from:

  • Building automated dispute response systems
  • Submitting evidence immediately after preparation
  • Providing real-time confirmation to merchants that evidence was submitted

Request

Please clarify the expected behavior and provide guidance on how to programmatically submit dispute evidence. If this is currently not possible, please consider adding this capability to the GraphQL API.

Thank you for your assistance!

Hey @PENGUIN_SECRET_AGENC, thanks for sharing your detailed report. I’ve looked in to this and we are aware of the limitation you’ve brought up.

I have passed that feedback on and I will update you here once I have a solution or workaround. Currently the admin (as you noted) is the only way to submit early.

Hi @KyleG-Shopify,

I hope you’re doing well.

I’m just following up regarding the limitation around programmatic submission of dispute evidence via the Shopify API (GraphQL and REST).

On January 22, you mentioned that the team is aware of this limitation and that you would provide an update once there is a solution or workaround available. Since then, we haven’t seen any new information.

Could you please let us know if there are any updates on:

  • Support for programmatic evidence submission via GraphQL

  • A fix for the REST submit_evidence: true parameter

  • Any planned roadmap changes or interim workaround

This capability is quite important for automated dispute management workflows, so we’d really appreciate any status update you can share — even if it’s just confirmation that it’s still under review.

Thank you very much for your time and support!

Thanks for following up @PENGUIN_SECRET_AGENC

I don’t yet have any updates to share, but I will as soon as I have something to share.

The best option here is to continue to have the merchant submit evidence in the admin.

@KyleG-Shopify Any updates regarding this issue?? i have the same issue.

# Bug report: `disputeEvidenceUpdate(submitEvidence: true)` is a no-op — cannot submit dispute evidence via the public Admin GraphQL API

## Summary

Using the public Admin GraphQL API, calling `disputeEvidenceUpdate` with `input.submitEvidence: true`

returns **success with no `userErrors`**, but the evidence is **not submitted**: the response’s

`disputeEvidence.submitted` stays `false`, and the dispute remains `NEEDS_RESPONSE` with

`evidenceSentOn: null`. Evidence *fields/files* update fine — only the **submit** is ignored.

Submitting the same evidence via the Shopify **admin UI (“Submit now”)** works immediately.

## Environment

- Shop: `craftgin.myshopify.com`

- API version: `2026-07` (also reproduced on 2025-01, 2025-04, 2025-07, 2025-10, 2026-01, 2026-04)

- Auth: custom app / Admin API access token with scopes

`write_shopify_payments_dispute_evidences`, `read_shopify_payments_dispute_evidences`

- Dispute: `gid://shopify/ShopifyPaymentsDispute/10866294964` (evidence `…/ShopifyPaymentsDisputeEvidence/10864328884`)

## Steps to reproduce

1. Attach a file via REST `POST /admin/api/2026-07/shopify_payments/disputes/10866294964/dispute_file_uploads.json`

(`document_type: uncategorized_file`) — succeeds, file is attached.

2. Call the GraphQL mutation below.

### Request

```graphql

mutation DisputeEvidenceUpdate($id: ID!, $input: ShopifyPaymentsDisputeEvidenceUpdateInput!) {

disputeEvidenceUpdate(id: $id, input: $input) {

disputeEvidence { id submitted }

userErrors { field message }

}

}

```

```json

{

“id”: “gid://shopify/ShopifyPaymentsDisputeEvidence/10864328884”,

“input”: { “uncategorizedText”: “Please see attached evidence.”, “submitEvidence”: true }

}

```

### Actual response

```json

{

“disputeEvidenceUpdate”: {

“disputeEvidence”: { “id”: “gid://shopify/ShopifyPaymentsDisputeEvidence/10864328884”, “submitted”: false },

“userErrors”: []

}

}

```

After the call, `dispute.status` = `NEEDS_RESPONSE`, `dispute.evidenceSentOn` = `null`.

### Expected

`disputeEvidence.submitted: true`, dispute transitions to `UNDER_REVIEW`, `evidenceSentOn` set —

i.e. the same result as clicking “Submit now” in the admin.

## Notes / what we’ve verified

- Schema introspection of the live public schema: the ONLY dispute mutation is `disputeEvidenceUpdate`,

and the ONLY submit-related input field is `submitEvidence: Boolean`. There is no `submittedByMerchant`

or `submit` field on `ShopifyPaymentsDisputeEvidenceUpdateInput`.

- The admin UI “Submit now” succeeds and uses an internal operation

(`DisputeEvidenceUpdateMutation`) whose input carries `submittedByMerchant: true` — that field is

not present on the public input type.

- Reproduced across all supported API versions and on both a clean `needs_response` dispute and one

with fully-populated evidence.

## Questions

1. Is `submitEvidence: true` intended to submit dispute evidence via the public Admin API for

app / custom-app tokens? If so, why does it silently no-op (no `userErrors`)?

2. If a specific scope or account permission is required to submit, which one — and should the API

return a `userError` when it’s missing instead of silently ignoring `submitEvidence`?

3. Is there any supported public-API path to submit dispute evidence, or is submission only

available via the admin UI / due-date auto-submit?

Hey folks :waving_hand: - just following up on this. We still don’t have any updates to share, but I’ll look into this internally again to see if there’s anything we can point to on our end.