> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Product

> Create a new product.



## OpenAPI

````yaml post /products
openapi: 3.1.0
info:
  title: public
  description: ''
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0
  version: 1.105.0
servers:
  - url: https://test.dodopayments.com/
    description: Test Mode Server Host
  - url: https://live.dodopayments.com/
    description: Live Mode Server Host
security: []
tags:
  - name: Products
  - name: Payments
  - name: Subscriptions
  - name: Addons
  - name: Customers
  - name: Refunds
  - name: Disputes
  - name: Events
  - name: License Keys
  - name: Entitlements
  - name: Licenses
  - name: Discounts
  - name: Meters
  - name: Credit Entitlements
  - name: Credit Entitlement Balances
  - name: Outgoing Webhooks
  - name: Checkout
  - name: Webhook Events
paths:
  /products:
    post:
      tags:
        - Products
      operationId: create_product
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateProductRequest'
        required: true
      responses:
        '200':
          description: Product Created Successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetProductResponse'
        '422':
          description: Invalid Request Object or Parameters
        '500':
          description: Something went wrong :(
      security:
        - API_KEY: []
      x-codeSamples:
        - lang: JavaScript
          source: |-
            import DodoPayments from 'dodopayments';

            const client = new DodoPayments({
              bearerToken: process.env['DODO_PAYMENTS_API_KEY'], // This is the default and can be omitted
            });

            const product = await client.products.create({
              name: 'name',
              price: {
                currency: 'AED',
                discount: 0,
                price: 0,
                purchasing_power_parity: true,
                type: 'one_time_price',
              },
              tax_category: 'digital_products',
            });

            console.log(product.brand_id);
        - lang: Python
          source: |-
            import os
            from dodopayments import DodoPayments

            client = DodoPayments(
                bearer_token=os.environ.get("DODO_PAYMENTS_API_KEY"),  # This is the default and can be omitted
            )
            product = client.products.create(
                name="name",
                price={
                    "currency": "AED",
                    "discount": 0,
                    "price": 0,
                    "purchasing_power_parity": True,
                    "type": "one_time_price",
                },
                tax_category="digital_products",
            )
            print(product.brand_id)
        - lang: Go
          source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/dodopayments/dodopayments-go\"\n\t\"github.com/dodopayments/dodopayments-go/option\"\n)\n\nfunc main() {\n\tclient := dodopayments.NewClient(\n\t\toption.WithBearerToken(\"My Bearer Token\"),\n\t)\n\tproduct, err := client.Products.New(context.TODO(), dodopayments.ProductNewParams{\n\t\tName: dodopayments.F(\"name\"),\n\t\tPrice: dodopayments.F[dodopayments.PriceUnionParam](dodopayments.PriceOneTimePriceParam{\n\t\t\tCurrency:              dodopayments.F(dodopayments.CurrencyAed),\n\t\t\tDiscount:              dodopayments.F(int64(0)),\n\t\t\tPrice:                 dodopayments.F(int64(0)),\n\t\t\tPurchasingPowerParity: dodopayments.F(true),\n\t\t\tType:                  dodopayments.F(dodopayments.PriceOneTimePriceTypeOneTimePrice),\n\t\t}),\n\t\tTaxCategory: dodopayments.F(dodopayments.TaxCategoryDigitalProducts),\n\t})\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", product.BrandID)\n}\n"
        - lang: Java
          source: |-
            package com.dodopayments.api.example;

            import com.dodopayments.api.client.DodoPaymentsClient;
            import com.dodopayments.api.client.okhttp.DodoPaymentsOkHttpClient;
            import com.dodopayments.api.models.misc.Currency;
            import com.dodopayments.api.models.misc.TaxCategory;
            import com.dodopayments.api.models.products.Price;
            import com.dodopayments.api.models.products.Product;
            import com.dodopayments.api.models.products.ProductCreateParams;

            public final class Main {
                private Main() {}

                public static void main(String[] args) {
                    DodoPaymentsClient client = DodoPaymentsOkHttpClient.fromEnv();

                    ProductCreateParams params = ProductCreateParams.builder()
                        .name("name")
                        .price(Price.OneTimePrice.builder()
                            .currency(Currency.AED)
                            .discount(0L)
                            .price(0)
                            .purchasingPowerParity(true)
                            .build())
                        .taxCategory(TaxCategory.DIGITAL_PRODUCTS)
                        .build();
                    Product product = client.products().create(params);
                }
            }
        - lang: Kotlin
          source: |-
            package com.dodopayments.api.example

            import com.dodopayments.api.client.DodoPaymentsClient
            import com.dodopayments.api.client.okhttp.DodoPaymentsOkHttpClient
            import com.dodopayments.api.models.misc.Currency
            import com.dodopayments.api.models.misc.TaxCategory
            import com.dodopayments.api.models.products.Price
            import com.dodopayments.api.models.products.Product
            import com.dodopayments.api.models.products.ProductCreateParams

            fun main() {
                val client: DodoPaymentsClient = DodoPaymentsOkHttpClient.fromEnv()

                val params: ProductCreateParams = ProductCreateParams.builder()
                    .name("name")
                    .price(Price.OneTimePrice.builder()
                        .currency(Currency.AED)
                        .discount(0L)
                        .price(0)
                        .purchasingPowerParity(true)
                        .build())
                    .taxCategory(TaxCategory.DIGITAL_PRODUCTS)
                    .build()
                val product: Product = client.products().create(params)
            }
        - lang: Ruby
          source: |-
            require "dodopayments"

            dodo_payments = Dodopayments::Client.new(
              bearer_token: "My Bearer Token",
              environment: "test_mode" # defaults to "live_mode"
            )

            product = dodo_payments.products.create(
              name: "name",
              price: {currency: :AED, discount: 0, price: 0, purchasing_power_parity: true, type: :one_time_price},
              tax_category: :digital_products
            )

            puts(product)
        - lang: PHP
          source: |-
            <?php

            require_once dirname(__DIR__) . '/vendor/autoload.php';

            use Dodopayments\Client;
            use Dodopayments\Core\Exceptions\APIException;
            use Dodopayments\CreditEntitlements\CbbOverageBehavior;
            use Dodopayments\Misc\TaxCategory;
            use Dodopayments\Misc\Currency;
            use Dodopayments\Products\CbbProrationBehavior;
            use Dodopayments\Subscriptions\TimeInterval;

            $client = new Client(
              bearerToken: getenv('DODO_PAYMENTS_API_KEY') ?: 'My Bearer Token',
              environment: 'test_mode',
            );

            try {
              $product = $client->products->create(
                name: 'name',
                price: [
                  'currency' => Currency::AED,
                  'discount' => 0,
                  'price' => 0,
                  'purchasingPowerParity' => true,
                  'type' => 'one_time_price',
                  'payWhatYouWant' => true,
                  'suggestedPrice' => 0,
                  'taxInclusive' => true,
                ],
                taxCategory: TaxCategory::DIGITAL_PRODUCTS,
                addons: ['string'],
                brandID: 'brand_id',
                creditEntitlements: [
                  [
                    'creditEntitlementID' => 'credit_entitlement_id',
                    'creditsAmount' => 'credits_amount',
                    'currency' => Currency::AED,
                    'expiresAfterDays' => 0,
                    'lowBalanceThresholdPercent' => 0,
                    'maxRolloverCount' => 0,
                    'overageBehavior' => CbbOverageBehavior::FORGIVE_AT_RESET,
                    'overageEnabled' => true,
                    'overageLimit' => 'overage_limit',
                    'pricePerUnit' => 'price_per_unit',
                    'prorationBehavior' => CbbProrationBehavior::PRORATE,
                    'rolloverEnabled' => true,
                    'rolloverPercentage' => 0,
                    'rolloverTimeframeCount' => 0,
                    'rolloverTimeframeInterval' => TimeInterval::DAY,
                    'trialCredits' => 'trial_credits',
                    'trialCreditsExpireAfterTrial' => true,
                  ],
                ],
                description: 'description',
                digitalProductDelivery: [
                  'externalURL' => 'external_url', 'instructions' => 'instructions'
                ],
                entitlements: [['entitlementID' => 'entitlement_id']],
                licenseKeyActivationMessage: 'license_key_activation_message',
                licenseKeyActivationsLimit: 0,
                licenseKeyDuration: ['count' => 0, 'interval' => TimeInterval::DAY],
                licenseKeyEnabled: true,
                metadata: ['foo' => 'string'],
                pricingMode: 'by_currency',
              );

              var_dump($product);
            } catch (APIException $e) {
              echo $e->getMessage();
            }
        - lang: C#
          source: |-
            using System;
            using DodoPayments.Client;
            using DodoPayments.Client.Models.Misc;
            using DodoPayments.Client.Models.Products;

            DodoPaymentsClient client = new();

            ProductCreateParams parameters = new()
            {
                Name = "name",
                Price = new OneTimePrice()
                {
                    Currency = Currency.Aed,
                    Discount = 0,
                    PriceValue = 0,
                    PurchasingPowerParity = true,
                    PayWhatYouWant = true,
                    SuggestedPrice = 0,
                    TaxInclusive = true,
                },
                TaxCategory = TaxCategory.DigitalProducts,
            };

            var product = await client.Products.Create(parameters);

            Console.WriteLine(product);
components:
  schemas:
    CreateProductRequest:
      type: object
      required:
        - name
        - tax_category
        - price
      properties:
        addons:
          type:
            - array
            - 'null'
          items:
            type: string
          description: Addons available for subscription product
        brand_id:
          type:
            - string
            - 'null'
          description: >-
            Brand id for the product, if not provided will default to primary
            brand
        credit_entitlements:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/AttachCreditEntitlementRequest'
          description: Optional credit entitlements to attach (max 5)
        description:
          type:
            - string
            - 'null'
          description: Optional description of the product
        digital_product_delivery:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/CreateDigitalProductDeliveryRequest'
              description: |-
                Choose how you would like you digital product delivered

                deprecated: use entitlements instead
        entitlements:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/AttachProductEntitlementRequest'
          description: Optional entitlements to attach to this product (max 50)
        license_key_activation_message:
          type:
            - string
            - 'null'
          description: |-
            Optional message displayed during license key activation

            deprecated: use entitlements instead. Ignored when a `license_key`
            entitlement is attached via the `entitlements` field.
          deprecated: true
          x-stainless-deprecation-message: >-
            Use the dedicated entitlements API to configure license-key
            delivery.
        license_key_activations_limit:
          type:
            - integer
            - 'null'
          format: int32
          description: |-
            The number of times the license key can be activated.
            Must be 0 or greater

            deprecated: use entitlements instead. Ignored when a `license_key`
            entitlement is attached via the `entitlements` field.
          deprecated: true
          x-stainless-deprecation-message: >-
            Use the dedicated entitlements API to configure license-key
            delivery.
        license_key_duration:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/LicenseKeyDuration'
              description: >-
                Duration configuration for the license key.

                Set to null if you don't want the license key to expire.

                For subscriptions, the lifetime of the license key is tied to
                the subscription period


                deprecated: use entitlements instead. Ignored when a
                `license_key`

                entitlement is attached via the `entitlements` field.
        license_key_enabled:
          type:
            - boolean
            - 'null'
          description: >-
            When true, generates and sends a license key to your customer.

            Defaults to false


            deprecated: use entitlements instead. If a `license_key` entitlement
            is

            also attached via the `entitlements` field, the `license_key_*`
            config

            fields below are ignored — the attached entitlement's config is the

            source of truth.
          deprecated: true
          x-stainless-deprecation-message: >-
            Use the dedicated entitlements API to configure license-key
            delivery.
        metadata:
          $ref: '#/components/schemas/Metadata'
          description: Additional metadata for the product
        name:
          type: string
          description: Name of the product
        price:
          $ref: '#/components/schemas/Price'
          description: Price configuration for the product
        pricing_mode:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/PricingMode'
              description: >-
                Pricing mode for localized pricing. When set, rules from

                /products/{id}/localized-prices apply at checkout. NULL means
                base-only

                (existing behavior).
        tax_category:
          $ref: '#/components/schemas/TaxCategory'
          description: Tax category applied to this product
    GetProductResponse:
      type: object
      required:
        - product_id
        - business_id
        - created_at
        - updated_at
        - is_recurring
        - tax_category
        - price
        - license_key_enabled
        - brand_id
        - metadata
        - credit_entitlements
        - entitlements
      properties:
        addons:
          type:
            - array
            - 'null'
          items:
            type: string
          description: Available Addons for subscription products
        brand_id:
          type: string
        business_id:
          type: string
          description: Unique identifier for the business to which the product belongs.
        created_at:
          type: string
          format: date-time
          description: Timestamp when the product was created.
        credit_entitlements:
          type: array
          items:
            $ref: '#/components/schemas/CreditEntitlementMappingResponse'
          description: Attached credit entitlements with settings
        description:
          type:
            - string
            - 'null'
          description: Description of the product, optional.
        digital_product_delivery:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/DigitalProductDelivery'
        entitlements:
          type: array
          items:
            $ref: '#/components/schemas/ProductEntitlementSummary'
          description: Attached entitlements (integration-based access grants)
        image:
          type:
            - string
            - 'null'
          description: URL of the product image, optional.
        is_recurring:
          type: boolean
          description: Indicates if the product is recurring (e.g., subscriptions).
        license_key_activation_message:
          type:
            - string
            - 'null'
          description: Message sent upon license key activation, if applicable.
          deprecated: true
          x-stainless-deprecation-message: >-
            Use the dedicated entitlements API to configure license-key
            delivery.
        license_key_activations_limit:
          type:
            - integer
            - 'null'
          format: int32
          description: Limit on the number of activations for the license key, if enabled.
          deprecated: true
          x-stainless-deprecation-message: >-
            Use the dedicated entitlements API to configure license-key
            delivery.
        license_key_duration:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/LicenseKeyDuration'
              description: Duration of the license key validity, if enabled.
        license_key_enabled:
          type: boolean
          description: Indicates whether the product requires a license key.
          deprecated: true
          x-stainless-deprecation-message: >-
            Use the dedicated entitlements API to configure license-key
            delivery.
        metadata:
          $ref: '#/components/schemas/Metadata'
          description: Additional custom data associated with the product
        name:
          type:
            - string
            - 'null'
          description: Name of the product, optional.
        price:
          $ref: '#/components/schemas/Price'
          description: Pricing information for the product.
        pricing_mode:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/PricingMode'
              description: >-
                Pricing mode for localized pricing. NULL means base-only (no
                localized rules apply).
        product_collection_id:
          type:
            - string
            - 'null'
          description: The product collection ID this product belongs to, if any
        product_id:
          type: string
          description: Unique identifier for the product.
        tax_category:
          $ref: '#/components/schemas/TaxCategory'
          description: Tax category associated with the product.
        updated_at:
          type: string
          format: date-time
          description: Timestamp when the product was last updated.
    AttachCreditEntitlementRequest:
      type: object
      description: Request struct for attaching a credit entitlement to a product
      required:
        - credit_entitlement_id
        - credits_amount
      properties:
        credit_entitlement_id:
          type: string
          description: ID of the credit entitlement to attach
        credits_amount:
          type: string
          description: Number of credits to grant when this product is purchased
        currency:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/Currency'
              description: Currency for credit-related pricing
        expires_after_days:
          type:
            - integer
            - 'null'
          format: int32
          description: Number of days after which credits expire
        low_balance_threshold_percent:
          type:
            - integer
            - 'null'
          format: int32
          description: Balance threshold percentage for low balance notifications (0-100)
        max_rollover_count:
          type:
            - integer
            - 'null'
          format: int32
          description: Maximum number of rollover cycles allowed
        overage_behavior:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/CbbOverageBehavior'
              description: Controls how overage is handled at billing cycle end.
        overage_enabled:
          type:
            - boolean
            - 'null'
          description: Whether overage usage is allowed beyond credit balance
        overage_limit:
          type:
            - string
            - 'null'
          description: Maximum amount of overage allowed
        price_per_unit:
          type:
            - string
            - 'null'
          description: Price per credit unit for purchasing additional credits
        proration_behavior:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/CbbProrationBehavior'
              description: Proration behavior for credit grants during plan changes
        rollover_enabled:
          type:
            - boolean
            - 'null'
          description: Whether unused credits can roll over to the next billing period
        rollover_percentage:
          type:
            - integer
            - 'null'
          format: int32
          description: Percentage of unused credits that can roll over (0-100)
        rollover_timeframe_count:
          type:
            - integer
            - 'null'
          format: int32
          description: Number of timeframe units for rollover window
        rollover_timeframe_interval:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/TimeInterval'
              description: Time interval for rollover window (day, week, month, year)
        trial_credits:
          type:
            - string
            - 'null'
          description: Credits granted during trial period
        trial_credits_expire_after_trial:
          type:
            - boolean
            - 'null'
          description: Whether trial credits expire when trial ends
    CreateDigitalProductDeliveryRequest:
      type: object
      title: Create Digital Product Delivery Request
      properties:
        external_url:
          type:
            - string
            - 'null'
          description: External URL to digital product
        instructions:
          type:
            - string
            - 'null'
          description: Instructions to download and use the digital product
    AttachProductEntitlementRequest:
      type: object
      description: |-
        Request struct for attaching an entitlement to a product.

        Mirrors the `credit_entitlements` attach shape — every "attach something
        to a product" array takes objects, not bare IDs. Uniform shape leaves
        room for per-attachment settings later without another API break.
      required:
        - entitlement_id
      properties:
        entitlement_id:
          type: string
          description: ID of the entitlement to attach to the product
    LicenseKeyDuration:
      type: object
      title: License Key Duration
      required:
        - count
        - interval
      properties:
        count:
          type: integer
          format: int32
        interval:
          $ref: '#/components/schemas/TimeInterval'
    Metadata:
      type: object
      additionalProperties:
        type: string
      propertyNames:
        type: string
    Price:
      oneOf:
        - allOf:
            - $ref: '#/components/schemas/OneTimePrice'
              description: One-time price details.
            - type: object
              required:
                - type
              properties:
                type:
                  type: string
                  enum:
                    - one_time_price
                  x-stainless-const: true
          title: One Time Price
          description: One-time price details.
        - allOf:
            - $ref: '#/components/schemas/RecurringPrice'
              description: Recurring price details.
            - type: object
              required:
                - type
              properties:
                type:
                  type: string
                  enum:
                    - recurring_price
                  x-stainless-const: true
          title: Recurring Price
          description: Recurring price details.
        - allOf:
            - $ref: '#/components/schemas/UsageBasedPrice'
              description: Usage Based price details.
            - type: object
              required:
                - type
              properties:
                type:
                  type: string
                  enum:
                    - usage_based_price
                  x-stainless-const: true
          title: Usage Based Price
          description: Usage Based price details.
      discriminator:
        propertyName: type
    PricingMode:
      type: string
      enum:
        - by_currency
        - by_country
    TaxCategory:
      type: string
      description: >-
        Represents the different categories of taxation applicable to various
        products and services.
      enum:
        - digital_products
        - saas
        - e_book
        - edtech
    CreditEntitlementMappingResponse:
      type: object
      description: Response struct for credit entitlement mapping
      required:
        - id
        - credit_entitlement_id
        - credit_entitlement_name
        - credit_entitlement_unit
        - credits_amount
        - rollover_enabled
        - overage_enabled
        - proration_behavior
        - trial_credits_expire_after_trial
        - overage_behavior
      properties:
        credit_entitlement_id:
          type: string
          description: ID of the credit entitlement
        credit_entitlement_name:
          type: string
          description: Name of the credit entitlement
        credit_entitlement_unit:
          type: string
          description: Unit label for the credit entitlement
        credits_amount:
          type: string
          description: Number of credits granted
        currency:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/Currency'
              description: Currency
        expires_after_days:
          type:
            - integer
            - 'null'
          format: int32
          description: Days until credits expire
        id:
          type: string
          format: uuid
          description: Unique ID of this mapping
        low_balance_threshold_percent:
          type:
            - integer
            - 'null'
          format: int32
          description: Low balance threshold percentage
        max_rollover_count:
          type:
            - integer
            - 'null'
          format: int32
          description: Maximum rollover cycles
        overage_behavior:
          $ref: '#/components/schemas/CbbOverageBehavior'
          description: Controls how overage is handled at billing cycle end.
        overage_enabled:
          type: boolean
          description: Whether overage is enabled
        overage_limit:
          type:
            - string
            - 'null'
          description: Overage limit
        price_per_unit:
          type:
            - string
            - 'null'
          description: Price per unit
        proration_behavior:
          $ref: '#/components/schemas/CbbProrationBehavior'
          description: Proration behavior for credit grants during plan changes
        rollover_enabled:
          type: boolean
          description: Whether rollover is enabled
        rollover_percentage:
          type:
            - integer
            - 'null'
          format: int32
          description: Rollover percentage
        rollover_timeframe_count:
          type:
            - integer
            - 'null'
          format: int32
          description: Rollover timeframe count
        rollover_timeframe_interval:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/TimeInterval'
              description: Rollover timeframe interval
        trial_credits:
          type:
            - string
            - 'null'
          description: Trial credits
        trial_credits_expire_after_trial:
          type: boolean
          description: Whether trial credits expire after trial
    DigitalProductDelivery:
      type: object
      title: Digital Product Delivery
      description: |-
        Digital-product-delivery payload, present on grants for `digital_files`
        entitlements. Each file carries a short-lived presigned download URL.
      required:
        - files
      properties:
        external_url:
          type:
            - string
            - 'null'
          description: |-
            Optional external URL, passed through from the entitlement
            configuration.
        files:
          type: array
          items:
            $ref: '#/components/schemas/DigitalProductDeliveryFile'
          description: One entry per attached file.
        instructions:
          type:
            - string
            - 'null'
          description: |-
            Optional human-readable delivery instructions, passed through from
            the entitlement configuration.
    ProductEntitlementSummary:
      type: object
      description: |-
        Summary of an entitlement attached to a product.

        `integration_config` uses [`IntegrationConfigResponse`] (NOT the
        persisted [`IntegrationConfig`]) so digital_files entitlements embed the
        resolved `digital_files` object — matching what `GET /entitlements/{id}`
        returns. All other variants pass through unchanged via
        `#[serde(untagged)]`.
      required:
        - id
        - integration_type
        - name
        - integration_config
      properties:
        description:
          type:
            - string
            - 'null'
        id:
          type: string
        integration_config:
          $ref: '#/components/schemas/IntegrationConfigResponse'
        integration_type:
          $ref: '#/components/schemas/EntitlementIntegrationType'
        name:
          type: string
    Currency:
      type: string
      enum:
        - AED
        - ALL
        - AMD
        - ANG
        - AOA
        - ARS
        - AUD
        - AWG
        - AZN
        - BAM
        - BBD
        - BDT
        - BGN
        - BHD
        - BIF
        - BMD
        - BND
        - BOB
        - BRL
        - BSD
        - BWP
        - BYN
        - BZD
        - CAD
        - CHF
        - CLP
        - CNY
        - COP
        - CRC
        - CUP
        - CVE
        - CZK
        - DJF
        - DKK
        - DOP
        - DZD
        - EGP
        - ETB
        - EUR
        - FJD
        - FKP
        - GBP
        - GEL
        - GHS
        - GIP
        - GMD
        - GNF
        - GTQ
        - GYD
        - HKD
        - HNL
        - HRK
        - HTG
        - HUF
        - IDR
        - ILS
        - INR
        - IQD
        - JMD
        - JOD
        - JPY
        - KES
        - KGS
        - KHR
        - KMF
        - KRW
        - KWD
        - KYD
        - KZT
        - LAK
        - LBP
        - LKR
        - LRD
        - LSL
        - LYD
        - MAD
        - MDL
        - MGA
        - MKD
        - MMK
        - MNT
        - MOP
        - MRU
        - MUR
        - MVR
        - MWK
        - MXN
        - MYR
        - MZN
        - NAD
        - NGN
        - NIO
        - NOK
        - NPR
        - NZD
        - OMR
        - PAB
        - PEN
        - PGK
        - PHP
        - PKR
        - PLN
        - PYG
        - QAR
        - RON
        - RSD
        - RUB
        - RWF
        - SAR
        - SBD
        - SCR
        - SEK
        - SGD
        - SHP
        - SLE
        - SLL
        - SOS
        - SRD
        - SSP
        - STN
        - SVC
        - SZL
        - THB
        - TND
        - TOP
        - TRY
        - TTD
        - TWD
        - TZS
        - UAH
        - UGX
        - USD
        - UYU
        - UZS
        - VES
        - VND
        - VUV
        - WST
        - XAF
        - XCD
        - XOF
        - XPF
        - YER
        - ZAR
        - ZMW
    CbbOverageBehavior:
      type: string
      description: >-
        Controls how overage is handled at the end of a billing cycle.


        | Preset                  | Charge at billing | Credits reduce overage |
        Preserve overage at reset |

        |-------------------------|:-----------------:|:---------------------:|:-------------------------:|

        | `forgive_at_reset`      | No                | No                    |
        No                        |

        | `invoice_at_billing`    | Yes               | No                    |
        No                        |

        | `carry_deficit`         | No                | No                    |
        Yes                       |

        | `carry_deficit_auto_repay` | No             | Yes                   |
        Yes                       |
      enum:
        - forgive_at_reset
        - invoice_at_billing
        - carry_deficit
        - carry_deficit_auto_repay
    CbbProrationBehavior:
      type: string
      enum:
        - prorate
        - no_prorate
    TimeInterval:
      type: string
      enum:
        - Day
        - Week
        - Month
        - Year
    OneTimePrice:
      type: object
      title: One Time Price
      required:
        - price
        - currency
        - discount
        - purchasing_power_parity
      properties:
        currency:
          $ref: '#/components/schemas/Currency'
          description: The currency in which the payment is made.
        discount:
          type: integer
          format: int64
          description: >-
            Discount applied to the price, represented as a percentage (0 to
            100).
        pay_what_you_want:
          type: boolean
          description: >-
            Indicates whether the customer can pay any amount they choose.

            If set to `true`, the [`price`](Self::price) field is the minimum
            amount.
        price:
          type: integer
          format: int32
          description: >-
            The payment amount, in the smallest denomination of the currency
            (e.g., cents for USD).

            For example, to charge $1.00, pass `100`.


            If [`pay_what_you_want`](Self::pay_what_you_want) is set to `true`,
            this field represents

            the **minimum** amount the customer must pay.
        purchasing_power_parity:
          type: boolean
          description: >-
            Indicates if purchasing power parity adjustments are applied to the
            price.

            Purchasing power parity feature is not available as of now.
        suggested_price:
          type:
            - integer
            - 'null'
          format: int32
          description: >-
            A suggested price for the user to pay. This value is only considered
            if

            [`pay_what_you_want`](Self::pay_what_you_want) is `true`. Otherwise,
            it is ignored.
        tax_inclusive:
          type:
            - boolean
            - 'null'
          description: Indicates if the price is tax inclusive.
    RecurringPrice:
      type: object
      title: Recurring Price
      required:
        - price
        - currency
        - discount
        - purchasing_power_parity
        - payment_frequency_count
        - payment_frequency_interval
        - subscription_period_count
        - subscription_period_interval
      properties:
        currency:
          $ref: '#/components/schemas/Currency'
          description: The currency in which the payment is made.
        discount:
          type: integer
          format: int64
          description: >-
            Discount applied to the price, represented as a percentage (0 to
            100).
        payment_frequency_count:
          type: integer
          format: int32
          description: >-
            Number of units for the payment frequency.

            For example, a value of `1` with a `payment_frequency_interval` of
            `month` represents monthly payments.
        payment_frequency_interval:
          $ref: '#/components/schemas/TimeInterval'
          description: >-
            The time interval for the payment frequency (e.g., day, month,
            year).
        price:
          type: integer
          format: int32
          description: >-
            The payment amount. Represented in the lowest denomination of the
            currency (e.g., cents for USD).

            For example, to charge $1.00, pass `100`.
        purchasing_power_parity:
          type: boolean
          description: >-
            Indicates if purchasing power parity adjustments are applied to the
            price.

            Purchasing power parity feature is not available as of now
        subscription_period_count:
          type: integer
          format: int32
          description: >-
            Number of units for the subscription period.

            For example, a value of `12` with a `subscription_period_interval`
            of `month` represents a one-year subscription.
        subscription_period_interval:
          $ref: '#/components/schemas/TimeInterval'
          description: >-
            The time interval for the subscription period (e.g., day, month,
            year).
        tax_inclusive:
          type:
            - boolean
            - 'null'
          description: Indicates if the price is tax inclusive
        trial_period_days:
          type: integer
          format: int32
          description: >-
            Number of days for the trial period. A value of `0` indicates no
            trial period.
    UsageBasedPrice:
      type: object
      title: Usage Based Price
      required:
        - fixed_price
        - currency
        - discount
        - purchasing_power_parity
        - payment_frequency_count
        - payment_frequency_interval
        - subscription_period_count
        - subscription_period_interval
      properties:
        currency:
          $ref: '#/components/schemas/Currency'
          description: The currency in which the payment is made.
        discount:
          type: integer
          format: int64
          description: >-
            Discount applied to the price, represented as a percentage (0 to
            100).
        fixed_price:
          type: integer
          format: int32
          description: >-
            The fixed payment amount. Represented in the lowest denomination of
            the currency (e.g., cents for USD).

            For example, to charge $1.00, pass `100`.
        meters:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/AddMeterToPrice'
        payment_frequency_count:
          type: integer
          format: int32
          description: >-
            Number of units for the payment frequency.

            For example, a value of `1` with a `payment_frequency_interval` of
            `month` represents monthly payments.
        payment_frequency_interval:
          $ref: '#/components/schemas/TimeInterval'
          description: >-
            The time interval for the payment frequency (e.g., day, month,
            year).
        purchasing_power_parity:
          type: boolean
          description: >-
            Indicates if purchasing power parity adjustments are applied to the
            price.

            Purchasing power parity feature is not available as of now
        subscription_period_count:
          type: integer
          format: int32
          description: >-
            Number of units for the subscription period.

            For example, a value of `12` with a `subscription_period_interval`
            of `month` represents a one-year subscription.
        subscription_period_interval:
          $ref: '#/components/schemas/TimeInterval'
          description: >-
            The time interval for the subscription period (e.g., day, month,
            year).
        tax_inclusive:
          type:
            - boolean
            - 'null'
          description: Indicates if the price is tax inclusive
    DigitalProductDeliveryFile:
      type: object
      title: Digital Product Delivery File
      description: One file in a digital-product delivery payload.
      required:
        - file_id
        - download_url
        - filename
        - expires_in
      properties:
        content_type:
          type:
            - string
            - 'null'
          description: Optional content-type declared at upload.
        download_url:
          type: string
          description: Short-lived presigned URL for downloading the file.
        expires_in:
          type: integer
          format: int64
          description: Seconds until `download_url` expires.
        file_id:
          type: string
          description: Identifier of the attached file.
        file_size:
          type:
            - integer
            - 'null'
          format: int64
          description: Optional size of the file in bytes.
        filename:
          type: string
          description: Original filename of the attached file.
    IntegrationConfigResponse:
      oneOf:
        - type: object
          title: Github Config
          required:
            - target_id
            - permission
          properties:
            permission:
              $ref: '#/components/schemas/GithubPermission'
              description: Permission to grant on the repository.
            target_id:
              type: string
              description: Repository or organisation slug to grant access to.
        - type: object
          title: Discord Config
          required:
            - guild_id
          properties:
            guild_id:
              type: string
              description: Discord guild (server) ID.
            role_id:
              type:
                - string
                - 'null'
              description: Optional Discord role to assign within the guild.
        - type: object
          title: Telegram Config
          required:
            - chat_id
          properties:
            chat_id:
              type: string
              description: >-
                Telegram chat ID. For groups this is typically a negative
                integer.
        - type: object
          title: Figma Config
          required:
            - figma_file_id
          properties:
            figma_file_id:
              type: string
              description: Figma file identifier to grant access to.
        - type: object
          title: Framer Config
          required:
            - framer_template_id
          properties:
            framer_template_id:
              type: string
              description: Framer template identifier to grant access to.
        - type: object
          title: Notion Config
          required:
            - notion_template_id
          properties:
            notion_template_id:
              type: string
              description: Notion template identifier to grant access to.
        - type: object
          title: Digital Files Config
          required:
            - digital_files
          properties:
            digital_files:
              $ref: '#/components/schemas/ResolvedDigitalFiles'
              description: |-
                Populated digital-files payload with each file's metadata and a
                short-lived presigned download URL.
        - type: object
          title: License Key Config
          properties:
            activation_message:
              type:
                - string
                - 'null'
              description: |-
                Optional message displayed when a customer activates the license
                key (≤ 2500 characters).
            activations_limit:
              type:
                - integer
                - 'null'
              format: int32
              description: >-
                Maximum activations allowed per issued license key. Omit for
                unlimited.
            duration_count:
              type:
                - integer
                - 'null'
              format: int32
              description: |-
                Validity duration of issued license keys. Provide both
                `duration_count` and `duration_interval` together for a fixed
                duration; omit both for non-expiring keys.
            duration_interval:
              oneOf:
                - type: 'null'
                - $ref: '#/components/schemas/TimeInterval'
                  description: Unit of `duration_count`.
            fulfillment_mode:
              oneOf:
                - type: 'null'
                - $ref: '#/components/schemas/FulfillmentMode'
                  description: >-
                    How license keys are fulfilled. `auto` (default) generates
                    and delivers

                    keys to customers automatically; `manual` creates pending
                    grants that you

                    fulfill with the supplied key via `POST
                    /grants/{grant_id}/license-key`.
      description: |-
        Integration-specific configuration on an entitlement read response.

        For `digital_files` entitlements the response includes presigned
        download URLs for each attached file; other integrations match the
        shape supplied at creation.
    EntitlementIntegrationType:
      type: string
      enum:
        - discord
        - telegram
        - github
        - figma
        - framer
        - notion
        - digital_files
        - license_key
    AddMeterToPrice:
      type: object
      title: Add Meter To Price
      required:
        - meter_id
      properties:
        credit_entitlement_id:
          type:
            - string
            - 'null'
          description: >-
            Optional credit entitlement ID to link this meter to for
            credit-based billing
        description:
          type:
            - string
            - 'null'
          description: >-
            Meter description. Will ignored on Request, but will be shown in
            response
        free_threshold:
          type:
            - integer
            - 'null'
          format: int64
        measurement_unit:
          type:
            - string
            - 'null'
          description: >-
            Meter measurement unit. Will ignored on Request, but will be shown
            in response
        meter_id:
          type: string
        meter_units_per_credit:
          type:
            - string
            - 'null'
          description: >-
            Number of meter units that equal one credit. Required when
            credit_entitlement_id is set.
        name:
          type:
            - string
            - 'null'
          description: Meter name. Will ignored on Request, but will be shown in response
        price_per_unit:
          type:
            - string
            - 'null'
          description: >-
            The price per unit in lowest denomination. Must be greater than
            zero. Supports up to 5 digits before decimal point and 12 decimal
            places.
          example: '10.50'
    GithubPermission:
      type: string
      description: Repository permission to grant on a `github` entitlement.
      enum:
        - pull
        - push
        - admin
        - maintain
        - triage
    ResolvedDigitalFiles:
      type: object
      description: |-
        Populated digital-files payload on entitlement read responses. Each file
        carries a short-lived presigned download URL.
      required:
        - files
      properties:
        external_url:
          type:
            - string
            - 'null'
          description: |-
            Optional external URL, passed through from the entitlement
            configuration.
        files:
          type: array
          items:
            $ref: '#/components/schemas/ResolvedDigitalFile'
          description: One entry per attached file.
        instructions:
          type:
            - string
            - 'null'
          description: |-
            Optional human-readable delivery instructions, passed through from
            the entitlement configuration.
    FulfillmentMode:
      type: string
      description: How license keys for this entitlement are fulfilled.
      enum:
        - auto
        - manual
    ResolvedDigitalFile:
      type: object
      description: One file in a resolved digital-files payload.
      required:
        - file_id
        - download_url
        - filename
        - expires_in
      properties:
        content_type:
          type:
            - string
            - 'null'
          description: Optional content-type declared at upload.
        download_url:
          type: string
          description: Short-lived presigned URL for downloading the file.
        expires_in:
          type: integer
          format: int64
          description: Seconds until `download_url` expires.
        file_id:
          type: string
          description: Identifier of the attached file.
        file_size:
          type:
            - integer
            - 'null'
          format: int64
          description: Optional size of the file in bytes.
        filename:
          type: string
          description: Original filename of the attached file.
  securitySchemes:
    API_KEY:
      type: http
      scheme: bearer

````