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

# Resolution Center Case

A Resolution Center Case is opened by a buyer when something is wrong with a purchase, such as an unwanted renewal, an item that never arrived, or a charge they don't recognize. It is the step before a chargeback: the buyer and merchant work it out directly, and Whop decides the case if they can't.

Use the Resolution Center Cases API from either side: as the buyer, open, reply to, appeal, or withdraw a case; as the merchant, accept it (refunding the payment), deny it, or ask the buyer for more information.

## Endpoints

| Endpoint | Request |
| - | - |
| [List Resolution Center Cases](/api-reference/beta/resolution-center-cases/list-resolution-center-cases) | <Badge color="blue" size="sm" stroke>GET</Badge> `/resolution_center_cases` |
| [Retrieve Resolution Center Case](/api-reference/beta/resolution-center-cases/retrieve-resolution-center-case) | <Badge color="blue" size="sm" stroke>GET</Badge> `/resolution_center_cases/{id}` |
| [List Resolution Center Case Events](/api-reference/beta/resolution-center-cases/list-resolution-center-case-events) | <Badge color="blue" size="sm" stroke>GET</Badge> `/resolution_center_cases/{id}/events` |
| [Retrieve Resolution Center Case Summary](/api-reference/beta/resolution-center-cases/retrieve-resolution-center-case-summary) | <Badge color="blue" size="sm" stroke>GET</Badge> `/resolution_center_cases/summary` |
| [Open a Case as the Customer](/api-reference/beta/resolution-center-cases/open-a-case-as-the-customer) | <Badge color="green" size="sm" stroke>POST</Badge> `/resolution_center_cases` |
| [Accept a Case](/api-reference/beta/resolution-center-cases/accept-a-case) | <Badge color="green" size="sm" stroke>POST</Badge> `/resolution_center_cases/{id}/accept` |
| [Appeal a Case](/api-reference/beta/resolution-center-cases/appeal-a-case) | <Badge color="green" size="sm" stroke>POST</Badge> `/resolution_center_cases/{id}/appeal` |
| [Deny a Case](/api-reference/beta/resolution-center-cases/deny-a-case) | <Badge color="green" size="sm" stroke>POST</Badge> `/resolution_center_cases/{id}/deny` |
| [Reply to a Case](/api-reference/beta/resolution-center-cases/reply-to-a-case) | <Badge color="green" size="sm" stroke>POST</Badge> `/resolution_center_cases/{id}/reply` |
| [Request Information from the Customer](/api-reference/beta/resolution-center-cases/request-information-from-the-customer) | <Badge color="green" size="sm" stroke>POST</Badge> `/resolution_center_cases/{id}/request_info` |
| [Withdraw a Case](/api-reference/beta/resolution-center-cases/withdraw-a-case) | <Badge color="green" size="sm" stroke>POST</Badge> `/resolution_center_cases/{id}/withdraw` |

## Attributes

<Columns cols={2}>
  <Column>
    <ResponseField name="id" type="string" required>
      Resolution center case ID, prefixed `reso_`.
    </ResponseField>

    <ResponseField name="account" type="object | null" required>
      The account the case was filed against.

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

        <ResponseField name="title" type="string" required>
          Account display name.
        </ResponseField>
      </Accordion>
    </ResponseField>

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

    <ResponseField name="available_actions" type="string[]" required>
      What you can do to this case right now, named for the endpoint that does it. Resolved for the calling credential, so a merchant and a customer reading the same case see their own options.

      Available options: `accept`, `deny`, `request_info`, `reply`, `appeal`, `withdraw`
    </ResponseField>

    <ResponseField name="buyer" type="object" required>
      The customer who opened the case.

      <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_`.
        </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 case was opened, as an ISO 8601 timestamp.
    </ResponseField>

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

    <ResponseField name="customer_appealed" type="boolean" required>
      Whether the customer has appealed a decision on this case.
    </ResponseField>

    <ResponseField name="escalated" type="boolean" required>
      Whether Whop is involved — either reviewing the case, or waiting on the side
      named by `status` for something it asked for while reviewing.
    </ResponseField>

    <ResponseField name="line_items" type="object[]" required>
      Everything the disputed payment charged for, in purchase order. `product_id` and `plan_id` name the first of these; a cart's later items appear only here. A payment made before items were recorded lists the single item its variant implies. Empty when the payment is not linked to a variant.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string | null" required>
          Line item ID, prefixed `li_`. Null when the payment predates item snapshots
          and the item is read from the payment's variant.
        </ResponseField>

        <ResponseField name="label" type="string | null" required>
          The item's name as shown at checkout — the product title, else the variant
          title.
        </ResponseField>

        <ResponseField name="plan_id" type="string | null" required>
          The variant bought, prefixed `plan_`. Null when the variant has since been
          deleted.
        </ResponseField>

        <ResponseField name="plan_title" type="string | null" required>
          The variant's current title, or `null` when the variant has been deleted or
          has no title.
        </ResponseField>

        <ResponseField name="product_id" type="string | null" required>
          The product the variant belongs to, prefixed `prod_`. On a payment that
          predates item snapshots this falls back to the variant's product, so it can be
          set where the parent's own `product_id` is null. Null for a variant with no
          product.
        </ResponseField>

        <ResponseField name="product_title" type="string | null" required>
          The product's current title, or `null` when the item has no product.
        </ResponseField>

        <ResponseField name="quantity" type="number" required>
          How many units were bought.
        </ResponseField>

        <ResponseField name="sku" type="string | null" required>
          The variant's stock keeping unit, free text set by the seller (e.g.
          `TSHIRT-LARGE-BLUE`). Accounts with billing-reason SKU suffixes enabled
          receive it stamped with why the charge happened: `-S` for a first subscription
          charge, `-R` for a renewal, `-C` for a one-time purchase, `-U` when the
          payment's own metadata carries `upsell: true`, `-F` when nothing was charged.
          Other billing reasons carry the bare SKU. `null` when the variant has no SKU
          or has been deleted.
        </ResponseField>

        <ResponseField name="subtotal" type="object | null" required>
          The recorded amount for this item's full quantity, before discounts, tax, and fees, in its purchase currency. Returns `null` when no item amount was recorded.

          <Accordion title="Properties" defaultOpen={true}>
            <ResponseField name="amount" type="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.
            </ResponseField>

            <ResponseField name="currency" type="string" required>
              Three-letter ISO 4217 currency code, lowercase.
            </ResponseField>

            <ResponseField name="decimals" type="integer" required>
              How many decimal places the amount CARRIES — the precision the charge itself
              runs at.
            </ResponseField>

            <ResponseField name="display_decimals" type="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.
            </ResponseField>
          </Accordion>
        </ResponseField>
      </Accordion>
    </ResponseField>

    <ResponseField name="outcome" type="string | null" required>
      Who prevailed on the claim. `null` until the case closes. Read `refund` for whether any money actually moved.

      Available options: `customer_won`, `merchant_won`, `withdrawn`
    </ResponseField>

    <ResponseField name="payment" type="object" required>
      The payment the case was opened against.

      <Accordion title="Properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required>
          Payment ID, prefixed `pay_`.
        </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="payment_method_type" type="string | null" required>
          How the customer paid, such as `card` or `paypal`.
        </ResponseField>
      </Accordion>
    </ResponseField>

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

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

    <ResponseField name="reason" type="string" required>
      What the customer says went wrong. Shares the `/disputes` vocabulary, so a case that later becomes a chargeback reports the same complaint.

      Available options: `fraudulent`, `product_not_received`, `not_as_described`, `product_unacceptable`, `subscription_canceled`
    </ResponseField>

    <ResponseField name="refund" type="string | null" required>
      Whether money moved and off whose balance: `none`, `merchant`, or `platform` (Whop refunded the customer and the merchant kept the funds). Independent of `outcome` — a case the merchant won can still carry a platform refund. `null` while the case is open, and on older closed cases that predate this being recorded.

      Available options: `none`, `merchant`, `platform`
    </ResponseField>

    <ResponseField name="response_due_at" type="string | null" required>
      When the next response is due, as an ISO 8601 timestamp.
    </ResponseField>

    <ResponseField name="status" type="string" required>
      Who the case is waiting on. `awaiting_merchant` and `awaiting_customer` name the side that owes a response, `under_review` means Whop is deciding, and `closed` means it is settled — read `outcome` for how.

      Available options: `awaiting_merchant`, `awaiting_customer`, `under_review`, `closed`
    </ResponseField>

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

  <Column>
    <div className="api-resource-sticky-example">
      ```json ResolutionCenterCase theme={null}
      {
      	"id": "reso_xxxxxxxxxxxxxx",
      	"account": {
      		"id": "biz_xxxxxxxxxxxxxx",
      		"title": "Shine Time Auto Detailing"
      	},
      	"amount": 249,
      	"available_actions": ["accept", "deny", "request_info", "reply"],
      	"buyer": {
      		"email": "dana@example.com",
      		"member_id": "mber_xxxxxxxxxxxxxx",
      		"name": "Dana Whitfield",
      		"user_id": "user_xxxxxxxxxxxxxx",
      		"username": "danawhitfield"
      	},
      	"created_at": "2026-09-15T14:30:00.000Z",
      	"currency": "usd",
      	"customer_appealed": false,
      	"escalated": false,
      	"line_items": [
      		{
      			"id": "li_xxxxxxxxxxxxxx",
      			"label": "Ceramic Coating Package",
      			"plan_id": "plan_xxxxxxxxxxxxxx",
      			"plan_title": "Ceramic Coating — Full Vehicle",
      			"product_id": "prod_xxxxxxxxxxxxxx",
      			"product_title": "Ceramic Coating Package",
      			"quantity": 1,
      			"sku": null,
      			"subtotal": {
      				"amount": "249.00",
      				"currency": "usd",
      				"decimals": 2,
      				"display_decimals": 2
      			}
      		}
      	],
      	"outcome": null,
      	"payment": {
      		"id": "pay_xxxxxxxxxxxxxx",
      		"card_brand": "visa",
      		"card_last4": "4242",
      		"created_at": "2026-09-02T10:00:00.000Z",
      		"payment_method_type": "card"
      	},
      	"plan_id": "plan_xxxxxxxxxxxxxx",
      	"product_id": "prod_xxxxxxxxxxxxxx",
      	"reason": "product_not_received",
      	"refund": null,
      	"response_due_at": "2026-09-18T14:30:00.000Z",
      	"status": "awaiting_merchant",
      	"updated_at": "2026-09-15T14:30:00.000Z"
      }
      ```
    </div>
  </Column>
</Columns>


## Related topics

- [Resolution Center Case](/api-reference/resolution-center-cases/resolution-center-case.md)
- [CLI Commands](/cli/commands.md)
- [Retrieve resolution center case](/api-reference/resolution-center-cases/retrieve-resolution-center-case.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.