> ## Documentation Index
> Fetch the complete documentation index at: https://docs.whop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Disputes

A Dispute is a chargeback a customer files against a payment through their bank, or an inquiry that may become one. It carries the disputed payment, a deadline to respond, your evidence, and the outcome once the processor rules.

Use the Disputes API to list disputes, edit the evidence packet while a dispute is still contestable, and submit it for review.

## Endpoints

| Endpoint                                                                          | Request                                                                    |
| --------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| [List Disputes](/api-reference/beta/disputes/list-disputes)                       | <Badge color="blue" size="sm" stroke>GET</Badge> `/disputes`               |
| [Retrieve Dispute](/api-reference/beta/disputes/retrieve-dispute)                 | <Badge color="blue" size="sm" stroke>GET</Badge> `/disputes/{id}`          |
| [Update Dispute](/api-reference/beta/disputes/update-dispute)                     | <Badge color="orange" size="sm" stroke>PATCH</Badge> `/disputes/{id}`      |
| [Submit Dispute](/api-reference/beta/disputes/submit-dispute)                     | <Badge color="green" size="sm" stroke>POST</Badge> `/disputes/{id}/submit` |
| [Retrieve Dispute Summary](/api-reference/beta/disputes/retrieve-dispute-summary) | <Badge color="blue" size="sm" stroke>GET</Badge> `/disputes/summary`       |

## Attributes

<Columns cols={2}>
  <Column>
    <ResponseField name="id" type="string" required>
      Dispute ID, prefixed `dspt_`.
    </ResponseField>

    <ResponseField name="account_id" type="string | null" required>
      The account the dispute was filed against, prefixed `biz_`.
    </ResponseField>

    <ResponseField name="amount" type="number" required>
      The disputed amount, in whole units of `currency`.
    </ResponseField>

    <ResponseField name="buyer" type="object | null" required>
      The customer who filed the dispute.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="email" type="string | null" required>
          The customer's email address. Requires the `member:email:read` scope; `null`
          without it.
        </ResponseField>

        <ResponseField name="member_id" type="string | null" required>
          The customer's member row on the account, prefixed `mem_`.
        </ResponseField>

        <ResponseField name="name" type="string | null" required>
          The customer's display name.
        </ResponseField>

        <ResponseField name="user_id" type="string | null" required>
          The customer's user ID, prefixed `user_`. `null` for a guest checkout.
        </ResponseField>

        <ResponseField name="username" type="string | null" required>
          The customer's Whop username.
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="created_at" type="string" required>
      When the dispute was opened, as an ISO 8601 timestamp.
    </ResponseField>

    <ResponseField name="currency" type="string" required>
      Three-letter ISO currency code of the disputed amount.
    </ResponseField>

    <ResponseField name="evidence" type="object" required>
      The evidence packet sent to the processor to contest the dispute.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="access_activity_log" type="string | null" required>
          Log of the customer's access to the product, such as sign-in or download
          activity.
        </ResponseField>

        <ResponseField name="billing_address" type="string | null" required>
          The billing address the customer provided at checkout.
        </ResponseField>

        <ResponseField name="cancellation_policy_attachment" type="object | null" required>
          The cancellation policy document. Falls back to Whop's platform policy when the seller has not uploaded their own.

          <Accordion title="Properties" defaultOpen={true}>
            <ResponseField name="id" type="string | null" required>
              The attachment's ID. `null` for a Whop-hosted policy, which is not an uploaded
              file.
            </ResponseField>

            <ResponseField name="content_type" type="string | null" required>
              The uploaded file's MIME type.
            </ResponseField>

            <ResponseField name="filename" type="string | null" required>
              The uploaded file's name.
            </ResponseField>

            <ResponseField name="platform" type="boolean" required>
              Whether this is Whop's own hosted policy, standing in because the seller
              uploaded none. Sending it back on a PATCH changes nothing.
            </ResponseField>

            <ResponseField name="url" type="string | null" required>
              A URL to download the attachment.
            </ResponseField>
          </Accordion>
        </ResponseField>

        <ResponseField name="cancellation_policy_disclosure" type="string | null" required>
          How the cancellation policy was shown to the customer before purchase.
        </ResponseField>

        <ResponseField name="customer_communication_attachment" type="object | null" required>
          Correspondence with the customer, or proof they used the product.

          <Accordion title="Properties" defaultOpen={true}>
            <ResponseField name="id" type="string | null" required>
              The attachment's ID. `null` for a Whop-hosted policy, which is not an uploaded
              file.
            </ResponseField>

            <ResponseField name="content_type" type="string | null" required>
              The uploaded file's MIME type.
            </ResponseField>

            <ResponseField name="filename" type="string | null" required>
              The uploaded file's name.
            </ResponseField>

            <ResponseField name="platform" type="boolean" required>
              Whether this is Whop's own hosted policy, standing in because the seller
              uploaded none. Sending it back on a PATCH changes nothing.
            </ResponseField>

            <ResponseField name="url" type="string | null" required>
              A URL to download the attachment.
            </ResponseField>
          </Accordion>
        </ResponseField>

        <ResponseField name="customer_email_address" type="string | null" required>
          The email address the customer used at checkout.
        </ResponseField>

        <ResponseField name="customer_name" type="string | null" required>
          The customer's name as given at checkout.
        </ResponseField>

        <ResponseField name="notes" type="string | null" required>
          Any additional context for the processor reviewing the dispute.
        </ResponseField>

        <ResponseField name="product_description" type="string | null" required>
          What the customer purchased, in the seller's own words.
        </ResponseField>

        <ResponseField name="refund_policy_attachment" type="object | null" required>
          The refund policy document. Falls back to Whop's platform policy when the seller has not uploaded their own.

          <Accordion title="Properties" defaultOpen={true}>
            <ResponseField name="id" type="string | null" required>
              The attachment's ID. `null` for a Whop-hosted policy, which is not an uploaded
              file.
            </ResponseField>

            <ResponseField name="content_type" type="string | null" required>
              The uploaded file's MIME type.
            </ResponseField>

            <ResponseField name="filename" type="string | null" required>
              The uploaded file's name.
            </ResponseField>

            <ResponseField name="platform" type="boolean" required>
              Whether this is Whop's own hosted policy, standing in because the seller
              uploaded none. Sending it back on a PATCH changes nothing.
            </ResponseField>

            <ResponseField name="url" type="string | null" required>
              A URL to download the attachment.
            </ResponseField>
          </Accordion>
        </ResponseField>

        <ResponseField name="refund_policy_disclosure" type="string | null" required>
          How the refund policy was shown to the customer before purchase.
        </ResponseField>

        <ResponseField name="refund_refusal_explanation" type="string | null" required>
          Why a refund was refused, when one was requested and denied.
        </ResponseField>

        <ResponseField name="service_date" type="string | null" required>
          When the product or service was delivered.
        </ResponseField>

        <ResponseField name="uncategorized_attachment" type="object | null" required>
          Supporting evidence that does not fit the other categories.

          <Accordion title="Properties" defaultOpen={true}>
            <ResponseField name="id" type="string | null" required>
              The attachment's ID. `null` for a Whop-hosted policy, which is not an uploaded
              file.
            </ResponseField>

            <ResponseField name="content_type" type="string | null" required>
              The uploaded file's MIME type.
            </ResponseField>

            <ResponseField name="filename" type="string | null" required>
              The uploaded file's name.
            </ResponseField>

            <ResponseField name="platform" type="boolean" required>
              Whether this is Whop's own hosted policy, standing in because the seller
              uploaded none. Sending it back on a PATCH changes nothing.
            </ResponseField>

            <ResponseField name="url" type="string | null" required>
              A URL to download the attachment.
            </ResponseField>
          </Accordion>
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="evidence_due_at" type="string | null" required>
      The deadline to submit evidence, as an ISO 8601 timestamp. Whop reserves the
      last 24 hours before the processor's own cutoff to forward the submission.
    </ResponseField>

    <ResponseField name="evidence_editable" type="boolean" required>
      Whether `evidence` can still be changed and submitted.
    </ResponseField>

    <ResponseField name="evidence_locked_reason" type="string | null" required>
      Why evidence can no longer be edited. `null` while `evidence_editable` is true.

      Available options: `submitted`, `response_window_closed`, `not_contestable`
    </ResponseField>

    <ResponseField name="evidence_submitted_at" type="string | null" required>
      When the evidence was submitted to the processor, as an ISO 8601 timestamp.
    </ResponseField>

    <ResponseField name="inquiry" type="boolean" required>
      Whether this is a pre-dispute inquiry rather than a formal chargeback.
      Inquiries follow the same lifecycle but move no funds unless one escalates.
    </ResponseField>

    <ResponseField name="issuer_comments" type="object[]" required>
      What the card issuer said when filing the dispute. Only populated when the issuer provides them, and listed in the order they were received.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="received_at" type="string | null" required>
          When the comment was received, as an ISO 8601 timestamp.
        </ResponseField>

        <ResponseField name="text" type="string" required>
          What the issuer wrote, as received.
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="payment" type="object | null" required>
      The payment being disputed.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required>
          Payment ID, prefixed `pay_`.
        </ResponseField>

        <ResponseField name="amount" type="number | null" required>
          What the customer was charged, in whole units of the payment's currency.
        </ResponseField>

        <ResponseField name="card_brand" type="string | null" required>
          Card brand, when the customer paid by card.
        </ResponseField>

        <ResponseField name="card_last4" type="string | null" required>
          Last four digits of the card, when the customer paid by card.
        </ResponseField>

        <ResponseField name="created_at" type="string" required>
          When the payment was made, as an ISO 8601 timestamp.
        </ResponseField>

        <ResponseField name="currency" type="string | null" required>
          Three-letter ISO currency code of the payment. Can differ from the dispute's
          currency when the processor settles in another currency.
        </ResponseField>

        <ResponseField name="payment_method_type" type="string | null" required>
          How the customer paid, such as `card` or `paypal`.
        </ResponseField>

        <ResponseField name="payment_processor" type="string | null" required>
          The processor that handled the payment, such as `stripe`.
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="plan_id" type="string | null" required>
      The plan the disputed payment was made on, prefixed `plan_`.
    </ResponseField>

    <ResponseField name="product_id" type="string | null" required>
      The product the disputed payment was for, prefixed `prod_`.
    </ResponseField>

    <ResponseField name="rapid_dispute_resolution" type="boolean" required>
      Whether Visa Rapid Dispute Resolution settled this automatically. These refund
      the customer without an evidence round.
    </ResponseField>

    <ResponseField name="reason" type="string" required>
      Why the customer says they are disputing, normalized across card networks. `other` covers a code Whop has not categorized yet — read `reason_code` for the raw value.

      Available options: `fraudulent`, `unrecognized`, `declined_authorization`, `product_not_received`, `product_unacceptable`, `subscription_canceled`, `credit_not_processed`, `duplicate`, `processing_error`, `documentation_request`, `bank_cannot_process`, `other`
    </ResponseField>

    <ResponseField name="reason_code" type="string | null" required>
      The raw card-network or processor reason code, such as `10.4`.
    </ResponseField>

    <ResponseField name="status" type="string" required>
      Where the dispute stands. `needs_response` is awaiting evidence, `under_review` is with the processor, `won` returned the funds to the seller, `lost` returned them to the customer, and `closed` ended without a ruling.

      Available options: `needs_response`, `under_review`, `won`, `lost`, `closed`
    </ResponseField>

    <ResponseField name="updated_at" type="string" required>
      When the dispute was last changed, as an ISO 8601 timestamp.
    </ResponseField>
  </Column>

  <Column>
    <div className="api-resource-sticky-example">
      ```json Dispute theme={null}
      {
      	"id": "dspt_xxxxxxxxxxxxx",
      	"account_id": "biz_xxxxxxxxxxxxxx",
      	"amount": 49.99,
      	"buyer": {
      		"email": "alex@example.com",
      		"member_id": "mem_xxxxxxxxxxxxx",
      		"name": "Alex Rivera",
      		"user_id": "user_xxxxxxxxxxxxx",
      		"username": "alex"
      	},
      	"created_at": "2026-06-01T12:00:00Z",
      	"currency": "usd",
      	"evidence": {
      		"access_activity_log": "2026-05-02 14:11 UTC signed in and opened the course; 2026-05-04 09:32 UTC downloaded lesson materials",
      		"billing_address": "123 Main St, Austin, TX 78701, US",
      		"cancellation_policy_attachment": null,
      		"cancellation_policy_disclosure": "Shown on the checkout page beneath the pay button.",
      		"customer_communication_attachment": {
      			"id": "att_xxxxxxxxxxxxx",
      			"content_type": "application/pdf",
      			"filename": "support-thread.pdf",
      			"platform": false,
      			"url": "https://assets.whop.com/uploads/att_xxxxxxxxxxxxx/support-thread.pdf"
      		},
      		"customer_email_address": "alex@example.com",
      		"customer_name": "Alex Rivera",
      		"notes": "Customer accessed the product for four weeks before disputing.",
      		"product_description": "Monthly membership to the Pickaxe trading community, including the full course library.",
      		"refund_policy_attachment": {
      			"id": null,
      			"content_type": "application/pdf",
      			"filename": "refund-policy.pdf",
      			"platform": true,
      			"url": "https://whop.com/policies/refund-policy.pdf"
      		},
      		"refund_policy_disclosure": "Linked in the order confirmation email and on the checkout page.",
      		"refund_refusal_explanation": "Refund was refused because the membership had been used past the 7-day refund window.",
      		"service_date": "2026-05-01",
      		"uncategorized_attachment": null
      	},
      	"evidence_due_at": "2026-06-15T00:00:00Z",
      	"evidence_editable": true,
      	"evidence_locked_reason": null,
      	"evidence_submitted_at": null,
      	"inquiry": false,
      	"issuer_comments": [
      		{
      			"received_at": "2026-06-01T12:00:00Z",
      			"text": "Cardholder states they did not authorize this transaction."
      		}
      	],
      	"payment": {
      		"id": "pay_xxxxxxxxxxxxx",
      		"amount": 49.99,
      		"card_brand": "visa",
      		"card_last4": "4242",
      		"created_at": "2026-05-01T09:30:00Z",
      		"currency": "usd",
      		"payment_method_type": "card",
      		"payment_processor": "stripe"
      	},
      	"plan_id": "plan_xxxxxxxxxxxxx",
      	"product_id": "prod_xxxxxxxxxxxxx",
      	"rapid_dispute_resolution": false,
      	"reason": "fraudulent",
      	"reason_code": "10.4",
      	"status": "needs_response",
      	"updated_at": "2026-06-01T12:00:00Z"
      }
      ```
    </div>
  </Column>
</Columns>
