---
title: "Submit Dispute"
method: POST
path: "/disputes/{id}/submit"
tags: ["Disputes"]
---

# Submit Dispute

`POST /disputes/{id}/submit`

Sends a dispute's evidence to the payment processor. This is final — it cannot be edited or sent again.

## Headers

- `Api-Version-Date` string
- `Idempotency-Key` string

## Response `200`

dispute submitted

- Dispute
  - `account_id` string, nullable, required — The account the dispute was filed against, prefixed `biz_`.
  - `amount` number, required — The disputed amount, in whole units of `currency`.
  - `buyer` DisputeBuyer, required
    - `email` string, nullable, required — The customer's email address. Requires the `member:email:read` scope; `null` without it.
    - `member_id` string, nullable, required — The customer's member row on the account, prefixed `mem_`.
    - `name` string, nullable, required — The customer's display name.
    - `user_id` string, nullable, required — The customer's user ID, prefixed `user_`. `null` for a guest checkout.
    - `username` string, nullable, required — The customer's Whop username.
  - `created_at` string, required — When the dispute was opened, as an ISO 8601 timestamp.
  - `currency` string, required — Three-letter ISO currency code of the disputed amount.
  - `evidence` DisputeEvidence, required
    - `access_activity_log` string, nullable, required — Log of the customer's access to the product, such as sign-in or download activity.
    - `billing_address` string, nullable, required — The billing address the customer provided at checkout.
    - `cancellation_policy_attachment` DisputeAttachment, required
      - `content_type` string, nullable, required — The uploaded file's MIME type.
      - `filename` string, nullable, required — The uploaded file's name.
      - `id` string, nullable, required — The attachment's ID. `null` for a Whop-hosted policy, which is not an uploaded file.
      - `platform` 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.
      - `url` string, nullable, required — A URL to download the attachment.
    - `cancellation_policy_disclosure` string, nullable, required — How the cancellation policy was shown to the customer before purchase.
    - `customer_communication_attachment` DisputeAttachment, required
      - `content_type` string, nullable, required — The uploaded file's MIME type.
      - `filename` string, nullable, required — The uploaded file's name.
      - `id` string, nullable, required — The attachment's ID. `null` for a Whop-hosted policy, which is not an uploaded file.
      - `platform` 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.
      - `url` string, nullable, required — A URL to download the attachment.
    - `customer_email_address` string, nullable, required — The email address the customer used at checkout.
    - `customer_name` string, nullable, required — The customer's name as given at checkout.
    - `documents` DisputeEvidenceDocument[], required
      - `content_type` 'application/pdf' | 'application/json' | 'image/jpeg' | 'image/png' | 'image/webp' | 'null', nullable, required — The uploaded file's MIME type. Uploads are restricted to the types the processor accepts, and rejected without one — never null.
      - `created_at` string, required — When the file was created, as an ISO 8601 timestamp.
      - `document_type` 'return_policy' | 'shipping_policy' | 'cancellation_policy' | 'terms_of_service' | 'physical_fulfillment' | 'customer_order_history' | 'product_image' | 'prior_transactions' | 'customer_session' | 'digital_fulfillment' | 'subscription' | 'customer_communication', required — What this document proves, in the processor's own evidence vocabulary. `return_policy`, `cancellation_policy`, and `terms_of_service` are the seller's policy documents — uploading one overrides the account's copy for this dispute (`return_policy`, `cancellation_policy`, and `customer_communication` also override the matching fixed evidence slot). `shipping_policy` is the seller's shipping terms. `customer_communication` is correspondence with the buyer — a support thread or chat log. `product_image` is a photo of the product or service the buyer received. `physical_fulfillment` is proof a physical order shipped and arrived; `digital_fulfillment` is proof the buyer accessed a digital product. `customer_order_history` is the buyer's past orders with this seller; `prior_transactions` is their broader payment history across the platform, for a fraud defense. `customer_session` is checkout forensics — IP, device fingerprint, AVS/CVV, 3D Secure result. `subscription` is membership lifecycle evidence — renewals, cancellation, reminders sent.
      - `filename` string, nullable, required — The original filename, including its extension.
      - `id` string, required — The file's ID, prefixed `file_`.
      - `multipart_chunk_size` integer, nullable — The byte size each part (except the last) must be. Present only on create, and only for multipart uploads.
      - `multipart_upload_id` string, nullable — The ID of the multipart upload, passed back to `complete`. Present only on create, and only for multipart uploads.
      - `multipart_upload_urls` FileMultipartUrl[], nullable
        - `part_number` integer, required — The 1-based index of this part within the multipart upload.
        - `url` string, required — The presigned URL to PUT this part's bytes to.
      - `object` string, required — The type of this object, always `file`.
      - `size` integer, nullable, required — The file size in bytes. `null` until the upload has finished.
      - `upload_headers` object — Headers to send with the upload PUT. Present only on create.
      - `upload_status` 'pending' | 'processing' | 'ready' | 'failed', required — Where the file is in its upload lifecycle.
      - `upload_url` string, nullable — Presigned URL to PUT the file's bytes to. Present only on create, and only for single-part uploads.
      - `url` string, nullable, required — A URL to download the file: a permanent CDN URL for public files, a signed expiring URL for private ones. `null` until the upload has finished.
      - `visibility` 'public' | 'private', required — `public` files are served via an unsigned CDN URL; `private` files via a signed, expiring URL.
    - `notes` string, nullable, required — Any additional context for the processor reviewing the dispute.
    - `product_description` string, nullable, required — What the customer purchased, in the seller's own words.
    - `refund_policy_attachment` DisputeAttachment, required
      - `content_type` string, nullable, required — The uploaded file's MIME type.
      - `filename` string, nullable, required — The uploaded file's name.
      - `id` string, nullable, required — The attachment's ID. `null` for a Whop-hosted policy, which is not an uploaded file.
      - `platform` 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.
      - `url` string, nullable, required — A URL to download the attachment.
    - `refund_policy_disclosure` string, nullable, required — How the refund policy was shown to the customer before purchase.
    - `refund_refusal_explanation` string, nullable, required — Why a refund was refused, when one was requested and denied.
    - `service_date` string, nullable, required — When the product or service was delivered.
    - `uncategorized_attachment` DisputeAttachment, required
      - `content_type` string, nullable, required — The uploaded file's MIME type.
      - `filename` string, nullable, required — The uploaded file's name.
      - `id` string, nullable, required — The attachment's ID. `null` for a Whop-hosted policy, which is not an uploaded file.
      - `platform` 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.
      - `url` string, nullable, required — A URL to download the attachment.
  - `evidence_due_at` string, nullable, required — The deadline to submit evidence, as an ISO 8601 timestamp. `null` when the network already auto-resolved the dispute (Visa RDR) with no evidence round, or when the processor hasn't reported a deadline for this dispute.
  - `evidence_editable` boolean, required — Whether `evidence` can still be changed and submitted.
  - `evidence_locked_reason` 'submitted' | 'response_window_closed' | 'not_contestable' | 'null', nullable, required — Why evidence can no longer be edited. `null` while `evidence_editable` is true.
  - `evidence_submitted_at` string, nullable, required — When the evidence was submitted to the processor, as an ISO 8601 timestamp.
  - `id` string, required — Dispute ID, prefixed `dspt_`.
  - `inquiry` 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.
  - `issuer_comments` DisputeIssuerComment[], required
    - `received_at` string, nullable, required — When the comment was received, as an ISO 8601 timestamp.
    - `text` string, required — What the issuer wrote, as received.
  - `line_items` ReceiptLineItem[], required
    - `id` string, nullable, required — Line item ID, prefixed `li_`. Null when the payment predates item snapshots and the item is read from the payment's plan.
    - `label` string, nullable, required — The item's name as shown at checkout — the product title, else the plan title.
    - `plan_id` string, nullable, required — The plan bought, prefixed `plan_`. Null when the plan has since been deleted.
    - `plan_title` string, nullable, required — The plan's current title, or `null` when the plan has been deleted or has no title.
    - `product_id` string, nullable, required — The product the plan belongs to, prefixed `prod_`. On a payment that predates item snapshots this falls back to the plan's product, so it can be set where the parent's own `product_id` is null. Null for a plan with no product.
    - `product_title` string, nullable, required — The product's current title, or `null` when the item has no product.
    - `quantity` number, required — How many units were bought.
    - `subtotal` Money, required
      - `amount` string, required — The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
      - `currency` string, required — Three-letter ISO 4217 currency code, lowercase.
      - `decimals` integer, required — How many decimal places the amount CARRIES — the precision the charge itself runs at.
      - `display_decimals` integer, required — How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
  - `payment` DisputePayment, required
    - `amount` number, nullable, required — What the customer was charged, in whole units of the payment's currency.
    - `card_brand` string, nullable, required — Card brand, when the customer paid by card.
    - `card_last4` string, nullable, required — Last four digits of the card, when the customer paid by card.
    - `created_at` string, required — When the payment was made, as an ISO 8601 timestamp.
    - `currency` string, nullable, required — Three-letter ISO currency code of the payment. Can differ from the dispute's currency when the processor settles in another currency.
    - `id` string, required — Payment ID, prefixed `pay_`.
    - `payment_instrument` PaymentInstrument, required
      - `card` PaymentInstrumentCard, required
        - `brand` string, nullable, required — The network identifier (`visa`, `amex`, …), matching `card.networks` entries and saved card payment methods. Null when the vault did not record the network.
        - `exp_month` number, nullable, required — The card's expiry month, 1 to 12. Null when the vault did not record it.
        - `exp_year` number, nullable, required — The card's four-digit expiry year. Null when the vault did not record it.
        - `issuer_identification_number` string, nullable, required — The issuer identification number, also called the BIN: the card's leading six or eight digits, which identify the issuing bank. Null when the processor did not report it.
        - `last4` string, nullable, required — The card's last four digits, when captured.
      - `display_name` string, required — Buyer-facing instrument name — "Visa •••• 4242" when the card surfaced, else the method's own name ("Klarna").
      - `icons` PaymentMethodIcons, required
        - `card` PaymentMethodIconVariants, required
          - `dark` PaymentMethodIconFiles, required
            - `png_1x` string, required — Raster fallback at the shape's native size.
            - `png_2x` string, required — Raster fallback at double density.
            - `png_4x` string, required — Raster fallback at quadruple density.
            - `svg` string, required — The vector file. Prefer this everywhere SVG renders.
          - `light` PaymentMethodIconFiles, required
            - `png_1x` string, required — Raster fallback at the shape's native size.
            - `png_2x` string, required — Raster fallback at double density.
            - `png_4x` string, required — Raster fallback at quadruple density.
            - `svg` string, required — The vector file. Prefer this everywhere SVG renders.
        - `square` PaymentMethodIconVariants, required
          - `dark` PaymentMethodIconFiles, required
            - `png_1x` string, required — Raster fallback at the shape's native size.
            - `png_2x` string, required — Raster fallback at double density.
            - `png_4x` string, required — Raster fallback at quadruple density.
            - `svg` string, required — The vector file. Prefer this everywhere SVG renders.
          - `light` PaymentMethodIconFiles, required
            - `png_1x` string, required — Raster fallback at the shape's native size.
            - `png_2x` string, required — Raster fallback at double density.
            - `png_4x` string, required — Raster fallback at quadruple density.
            - `svg` string, required — The vector file. Prefer this everywhere SVG renders.
      - `installment_count` number, nullable, required — Installment methods only: how many payments the charge splits into. Data, not copy — compose and translate the label client-side.
      - `payment_method_type` string, required — The payment method type identifier, e.g. `card`, `klarna`, `apple_pay`.
    - `payment_method_type` string, nullable, required — How the customer paid, such as `card` or `paypal`.
    - `payment_processor` string, nullable, required — Deprecated: no longer populated. Always `null`. DEPRECATED: No longer populated. Always null.
  - `plan_id` string, nullable, required — The plan the disputed payment was made on, prefixed `plan_`.
  - `product_id` string, nullable, required — The product the disputed payment was for, prefixed `prod_`.
  - `reason` 'fraudulent' | 'unrecognized' | 'declined_authorization' | 'product_not_received' | 'product_unacceptable' | 'subscription_canceled' | 'credit_not_processed' | 'duplicate' | 'processing_error' | 'documentation_request' | 'bank_cannot_process' | 'other', required — Why the customer says they are disputing, normalized across processors and card networks. `other` covers a processor reason Whop has not categorized yet.
  - `reason_code` string, nullable, required — The raw card-network or processor reason code, such as `10.4`. Informational only — `reason` is not derived from it.
  - `status` 'needs_response' | 'under_review' | 'won' | 'lost' | 'closed', 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. A dispute past its `evidence_due_at` reports `under_review` — the window to respond has closed.
  - `updated_at` string, required — When the dispute was last changed, as an ISO 8601 timestamp.

## Other responses

- `400` — Invalid Parameters
- `401` — Unauthorized
- `404` — Resource not found
- `409` — Conflict

## Changes

> 70 revisions in range; 1 not diffed.

- **2026-09-23** `140d015b9966` — 4 breaking, 3 warning, 16 info
  - the `buyer` response's property type changed from no type to `object` for status `200`
  - the `payment` response's property type changed from no type to `object` for status `200`
  - removed the required property `generated_response_attachment` from the response with the `200` status
  - removed the required property `rapid_dispute_resolution` from the response with the `200` status
  - …19 more
- **2026-09-10** `2a25564a92d5` — 1 info
  - added the required property `line_items` to the response with the `200` status
- **2026-09-09** `18cde81b6763` — 1 info
  - added the required property `payment/oneOf[#/components/schemas/DisputePayment]/payment_instrument/oneOf[#/components/schemas/PaymentInstrument]/card/oneOf[#/components/schemas/PaymentInstrumentCard]/issuer_identification_number` to the response with the `200` status
- **2026-08-24** `e91d507bda45` — 10 info
  - added the optional property `evidence/documents/items/multipart_chunk_size` to the response with the `200` status
  - added the optional property `evidence/documents/items/multipart_upload_id` to the response with the `200` status
  - added the optional property `evidence/documents/items/multipart_upload_urls` to the response with the `200` status
  - added the optional property `evidence/documents/items/upload_headers` to the response with the `200` status
  - …6 more
- …earlier changes not shown

[Full history](https://skmtc.dev/whop/apis/whop-api/changes/disputes/:id/submit/post.md)

---

[API](https://skmtc.dev/whop/apis/whop-api.md) · [All operations](https://skmtc.dev/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc.dev/whop/apis/whop-api/revisions/7fcefabddb0a?raw)
