# 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?