[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!

1 Like

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.