{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/stripe/main/json-schema/stripe-post-coupons-request-schema.json",
  "title": "PostCouponsRequest",
  "x-generated": "2026-10-12",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/stripe-coupons-api-openapi.yml#/components/schemas/PostCouponsRequest",
  "type": "object",
  "properties": {
    "amount_off": {
      "description": "A positive integer representing the amount to subtract from an invoice total (required if `percent_off` is not passed).",
      "type": "integer"
    },
    "applies_to": {
      "description": "A hash containing directions for what this Coupon will apply discounts to.",
      "properties": {
        "products": {
          "items": {
            "maxLength": 5000,
            "type": "string"
          },
          "type": "array"
        }
      },
      "title": "applies_to_params",
      "type": "object"
    },
    "currency": {
      "description": "Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) of the `amount_off` parameter (required if `amount_off` is passed).",
      "type": "string"
    },
    "currency_options": {
      "additionalProperties": {
        "properties": {
          "amount_off": {
            "type": "integer"
          }
        },
        "required": [
          "amount_off"
        ],
        "title": "currency_option",
        "type": "object"
      },
      "description": "Coupons defined in each available currency option (only supported if `amount_off` is passed). Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).",
      "type": "object"
    },
    "duration": {
      "description": "Specifies how long the discount will be in effect if used on a subscription. Defaults to `once`.",
      "enum": [
        "forever",
        "once",
        "repeating"
      ],
      "type": "string",
      "x-stripeBypassValidation": true
    },
    "duration_in_months": {
      "description": "Required only if `duration` is `repeating`, in which case it must be a positive integer that specifies the number of months the discount will be in effect.",
      "type": "integer"
    },
    "expand": {
      "description": "Specifies which fields in the response should be expanded.",
      "items": {
        "maxLength": 5000,
        "type": "string"
      },
      "type": "array"
    },
    "id": {
      "description": "Unique string of your choice that will be used to identify this coupon when applying it to a customer. If you don't want to specify a particular code, you can leave the ID blank and we'll generate a random code for you.",
      "maxLength": 5000,
      "type": "string"
    },
    "max_redemptions": {
      "description": "A positive integer specifying the number of times the coupon can be redeemed before it's no longer valid. For example, you might have a 50% off coupon that the first 20 readers of your blog can use.",
      "type": "integer"
    },
    "metadata": {
      "anyOf": [
        {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        {
          "enum": [
            ""
          ],
          "type": "string"
        }
      ],
      "description": "Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`."
    },
    "name": {
      "description": "Name of the coupon displayed to customers on, for instance invoices, or receipts. By default the `id` is shown if `name` is not set.",
      "maxLength": 40,
      "type": "string"
    },
    "percent_off": {
      "description": "A positive float larger than 0, and smaller or equal to 100, that represents the discount the coupon will apply (required if `amount_off` is not passed).",
      "type": "number"
    },
    "redeem_by": {
      "description": "Unix timestamp specifying the last time at which the coupon can be redeemed. After the redeem_by date, the coupon can no longer be applied to new customers.",
      "format": "unix-time",
      "type": "integer"
    }
  }
}