---
title: "Create Refund"
method: POST
path: "/v1/refunds/"
tags: ["refunds", "public"]
---

# Create Refund

`POST /v1/refunds/`

Create a refund.

**Scopes**: `refunds:write`

## Request body

- RefundCreate
  - `metadata` object — Key-value object allowing you to store additional information. The key must be a string with a maximum length of **40 characters**. The value must be either: * A string with a maximum length of **500 characters** * An integer * A floating-point number * A boolean You can store up to **50 key-value pairs**.
  - `order_id` string, uuid4, required
  - `reason` 'duplicate' | 'fraudulent' | 'customer_request' | 'service_disruption' | 'satisfaction_guarantee' | 'other', required — Reason for the refund.
  - `amount` integer, required — Amount to refund in cents. Minimum is 1.
  - `comment` string, nullable — An internal comment about the refund.
  - `revoke_benefits` boolean — Should this refund trigger the associated customer benefits to be revoked? **Note:** Only allowed in case the `order` is a one-time purchase. Subscriptions automatically revoke customer benefits once the subscription itself is revoked, i.e fully canceled.

## Response `201`

Refund created.

- Refund
  - `created_at` string, date-time, required — Creation timestamp of the object.
  - `modified_at` string, date-time, nullable, required — Last modification timestamp of the object.
  - `id` string, uuid4, required — The ID of the object.
  - `metadata` MetadataOutputType, required
  - `status` 'pending' | 'succeeded' | 'failed' | 'canceled', required
  - `reason` 'duplicate' | 'fraudulent' | 'customer_request' | 'service_disruption' | 'satisfaction_guarantee' | 'dispute_prevention' | 'other', required
  - `amount` integer, required
  - `tax_amount` integer, required
  - `currency` string, required
  - `organization_id` string, uuid4, required
  - `order_id` string, uuid4, required
  - `subscription_id` string, uuid4, nullable, required
  - `customer_id` string, uuid4, required
  - `revoke_benefits` boolean, required
  - `dispute` RefundDispute, required — Dispute associated with a refund, in case we prevented a dispute by issuing a refund.
    - `created_at` string, date-time, required — Creation timestamp of the object.
    - `modified_at` string, date-time, nullable, required — Last modification timestamp of the object.
    - `id` string, uuid4, required — The ID of the object.
    - `status` 'prevented' | 'early_warning' | 'needs_response' | 'under_review' | 'lost' | 'won', required
    - `resolved` boolean, required — Whether the dispute has been resolved (won or lost).
    - `closed` boolean, required — Whether the dispute is closed (prevented, won, or lost).
    - `amount` integer, required — Amount in cents disputed.
    - `tax_amount` integer, required — Tax amount in cents disputed.
    - `currency` string, required — Currency code of the dispute.
    - `reason` string, nullable, required — The reason for the dispute as reported by the card network (e.g. `fraudulent`, `product_not_received`). `None` until the processor reports it.
    - `evidence_due_by` string, date-time, nullable, required — Deadline to submit evidence in response to the dispute. `None` when no response is required.
    - `past_due` boolean, required — Whether the evidence submission deadline has passed.
    - `order_id` string, uuid4, required — The ID of the order associated with the dispute.
    - `payment_id` string, uuid4, required — The ID of the payment associated with the dispute.

## Other responses

- `403` — Order is already fully refunded.
- `422` — Validation Error

---

[API](https://skmtc.net/polar/apis/polar-api.md) · [All operations](https://skmtc.net/polar/apis/polar-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/polar/polar-api/revisions/77e4ef94fcc3/schema)
