---
title: "Appeal a Case"
method: POST
path: "/resolution_center_cases/{id}/appeal"
tags: ["Resolution Center Cases"]
---

# Appeal a Case

`POST /resolution_center_cases/{id}/appeal`

Appeals a decision, as the customer, on a case that closed in the merchant's favor. Escalates the case to Whop for platform review. A case can be appealed once.

## Headers

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

## Request body

- object
  - `attachments` object[] — Up to 3 evidence files, by existing file `id` or `direct_upload_id`.
    - `direct_upload_id` string
    - `id` string
  - `message` string, required — Why you are appealing the decision.

## Response `200`

case appealed

- ResolutionCenterCase
  - `account` AccountSummary, required
    - `id` string, required — Account ID, prefixed `biz_`.
    - `title` string, required — Account display name.
  - `amount` number, required — The amount in question, in whole units of `currency`.
  - `available_actions` string[], required
  - `buyer` ResolutionBuyer, 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_`.
    - `username` string, nullable, required — The customer's Whop username.
  - `created_at` string, required — When the case was opened, as an ISO 8601 timestamp.
  - `currency` string, nullable, required — Three-letter ISO currency code of the amount.
  - `customer_appealed` boolean, required — Whether the customer has appealed a decision on this case.
  - `escalated` 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.
  - `id` string, required — Resolution center case ID, prefixed `reso_`.
  - `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.
  - `outcome` 'customer_won' | 'merchant_won' | 'withdrawn' | 'null', nullable, required — Who prevailed on the claim. `null` until the case closes. Read `refund` for whether any money actually moved.
  - `payment` ResolutionPayment, required
    - `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.
    - `id` string, required — Payment ID, prefixed `pay_`.
    - `payment_method_type` string, nullable, required — How the customer paid, such as `card` or `paypal`.
  - `plan_id` string, nullable, required — The plan the payment was made on, prefixed `plan_`.
  - `product_id` string, nullable, required — The product the payment was for, prefixed `prod_`.
  - `reason` 'fraudulent' | 'product_not_received' | 'not_as_described' | 'product_unacceptable' | 'subscription_canceled', required — What the customer says went wrong. Shares the `/disputes` vocabulary, so a case that later becomes a chargeback reports the same complaint.
  - `refund` 'none' | 'merchant' | 'platform' | 'null', nullable, 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.
  - `response_due_at` string, nullable, required — When the next response is due, as an ISO 8601 timestamp.
  - `status` 'awaiting_merchant' | 'awaiting_customer' | 'under_review' | 'closed', 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.
  - `updated_at` string, required — When the case was last changed, as an ISO 8601 timestamp.

## Other responses

- `401` — Unauthorized
- `409` — Conflict

## Changes

> 71 revisions in range; 1 not diffed.

- **2026-09-09** `18cde81b6763` — 3 info
  - added the required property `line_items/items/plan_title` to the response with the `200` status
  - added the required property `line_items/items/product_title` to the response with the `200` status
  - added the required property `line_items/items/subtotal` to the response with the `200` status
- **2026-09-05** `2fa9dfe9535a` — 1 info
  - added the required property `line_items` to the response with the `200` status
- **2026-08-12** `ae20b30817de` — 1 info
  - added the non-success response with the status `409`
- **2026-08-07** `f1020c3ecda4` — 1 info
  - added the optional property `error/code` to the response with the `401` status
- **2026-07-31** `099fdc3be422` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/whop/apis/whop-api/changes/resolution_center_cases/:id/appeal/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/c1dceb26e505?raw)
