> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Gumroad

The Gumroad connector lets your AI agent act in each user's Gumroad account. Each user signs in to Gumroad once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 60 tools.

**Authentication:** OAuth 2.0
**Categories:** Marketing, Media
**Tools:** 60: 26 read, 28 write, 6 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own Gumroad app
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=GUMROAD)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Gumroad connection

   In **AgentKit > Connections**, create a Gumroad connection and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   Gumroad connections use your own OAuth app. Register one with Gumroad and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the Gumroad connection.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'gumroad'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Gumroad:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'gumroad_get_refund_policy',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "gumroad"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Gumroad:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="gumroad_get_refund_policy",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'gumroad_get_email',
  toolInput: {
    email_id: '<email_id>',
  },
  connector: 'gumroad',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="gumroad_get_email",
    tool_input={
        "email_id": "<email_id>",
    },
    connection_name="gumroad",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `gumroad_get_email`

Get Email · Read-only

Retrieve one audience email with its HTML body and audience filters.
Returns the email object with id, subject, message, state, audience_type, published_at, scheduled_at and recipients_count.
Use to read one email. Use gumroad_list_emails to find ids.
Requires an email id from gumroad_list_emails.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `email_id` (`string`, required): ID of the audience email, as returned by gumroad_list_emails (the id field, for example bfi_30HLgGWL8H2wo_Gzlg==).

Example input: `{"email_id":"<email_id>"}`

### `gumroad_get_offer_code`

Get Product Offer Code · Read-only

Retrieve one offer code of a product.
Returns the offer_code object with id, name, amount_cents or percent_off, max_purchase_count, universal and times_used.
Use to inspect one code. Use gumroad_list_offer_codes to browse the codes on a product.
Requires ids from gumroad_list_products and gumroad_list_offer_codes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `offer_code_id` (`string`, required): ID of the offer code, as returned by gumroad_list_offer_codes or gumroad_list_store_offer_codes (the id field, for example ZjCx1xkLQq9GeoV2sS8hTQ==).
- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"offer_code_id":"<offer_code_id>","product_id":"<product_id>"}`

### `gumroad_get_payout`

Get Payout · Read-only

Retrieve one payout with the sales, refunds and disputes it covers.
Returns the payout object with id, amount, currency, status, processed_at and the sales, refunded_sales and disputed_sales behind it (plus transactions when requested).
Use to reconcile a specific payout. Use gumroad_list_payouts to find payout ids.
Requires a payout id from gumroad_list_payouts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `payout_id` (`string`, required): ID of the payout, as returned by gumroad_list_payouts (the id field, for example bD3mQqHZ0C0nE2sa-Hx6JA==).
- `include_sales` (`string`, optional): Set to false to leave the sales, refunded_sales and disputed_sales details out of the response. Defaults to true. One of: `true`, `false`.
- `include_transactions` (`string`, optional): Set to true to include a transactions array with every balance-affecting transaction in the payout, as in the exported payout CSV. Defaults to false. One of: `true`, `false`.

Example input: `{"payout_id":"<payout_id>"}`

### `gumroad_get_product`

Get Product · Read-only

Retrieve the full details of one product.
Returns the product object with name, description, price, currency, published, short_url, tags, category, variants, recurrences, custom_fields and, with the right scope, sales_count and sales_usd_cents.
Use to inspect a single product. Use gumroad_list_products to browse all products.
Requires a product id from gumroad_list_products.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_get_refund_policy`

Get Refund Policy · Read-only

Retrieve the account-level refund policy.
Returns the refund_policy object with refund_period, title, fine_print and in_effect (whether buyers currently see it).
Use to check the store-wide refund terms before changing them with gumroad_update_refund_policy.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `gumroad_get_sale`

Get Sale · Read-only

Retrieve the full details of one sale.
Returns the sale object with id, email, product_name, price, currency, fees, tax, refund and dispute flags, variants, custom_fields and subscription details.
Use to inspect a single order. Use gumroad_list_sales to find sales.
Requires a sale id from gumroad_list_sales.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `sale_id` (`string`, required): ID of the sale, as returned by gumroad_list_sales (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{"sale_id":"<sale_id>"}`

### `gumroad_get_store_offer_code`

Get Store Offer Code · Read-only

Retrieve one of the store's offer codes by id.
Returns the offer_code object with id, name, amount or percentage, universal, auto_apply, valid_at, expires_at and times_used.
Use when you have a code id but not its product. Use gumroad_get_offer_code when scoping to a product.
Requires an offer code id from gumroad_list_store_offer_codes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `offer_code_id` (`string`, required): ID of the offer code, as returned by gumroad_list_offer_codes or gumroad_list_store_offer_codes (the id field, for example ZjCx1xkLQq9GeoV2sS8hTQ==).

Example input: `{"offer_code_id":"<offer_code_id>"}`

### `gumroad_get_subscriber`

Get Subscriber · Read-only

Retrieve one subscriber of a product.
Returns the subscriber object with id, email, product_id, status, recurrence, created_at, cancelled_at, ended_at, failed_at, free_trial_ends_at and license_key.
Use to check a subscription's status. Use gumroad_list_subscribers to browse.
Requires a subscriber id from gumroad_list_subscribers.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `subscriber_id` (`string`, required): ID of the subscriber, as returned by gumroad_list_subscribers (the id field, for example GDzW4_aBdQc-o7Gbjng7lw==).

Example input: `{"subscriber_id":"<subscriber_id>"}`

### `gumroad_get_upcoming_payouts`

Get Upcoming Payouts · Read-only

Retrieve the seller's upcoming (not yet paid) payouts. There can be up to two at a time.
Returns a payouts array with amount, currency, status and the sales, refunded_sales and disputed_sales ids included in each (plus transactions when requested).
Use to see what is about to be paid out. Use gumroad_list_payouts for past payouts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `include_sales` (`string`, optional): Set to false to leave the sales, refunded_sales and disputed_sales details out of the response. Defaults to true. One of: `true`, `false`.
- `include_transactions` (`string`, optional): Set to true to include a transactions array with every balance-affecting transaction in the payout, as in the exported payout CSV. Defaults to false. One of: `true`, `false`.

Example input: `{}`

### `gumroad_get_user`

Get User · Read-only

Retrieve the authenticated seller's Gumroad account details.
Returns the user object with id, name, bio, email, twitter_handle, url and profile_picture_url.
Use to confirm which Gumroad account is connected before reading or changing products and sales.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `gumroad_get_variant`

Get Variant · Read-only

Retrieve one variant (option) of a product.
Returns the variant object with id, name, description, price_difference_cents and max_purchase_count.
Use to check a single option. Use gumroad_list_variants to browse all options in a category.
Requires ids from gumroad_list_products, gumroad_list_variant_categories and gumroad_list_variants.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `variant_category_id` (`string`, required): ID of the variant category, as returned by gumroad_list_variant_categories (for example mN7CdHiwHaR9FlxKvF-n-g==).
- `variant_id` (`string`, required): ID of the variant, as returned by gumroad_list_variants (for example kuaXCPHTmRuoK13rNGVbxg==).

Example input: `{"product_id":"<product_id>","variant_category_id":"<variant_category_id>","variant_id":"<variant_id>"}`

### `gumroad_get_variant_category`

Get Variant Category · Read-only

Retrieve one variant category of a product.
Returns the variant_category object with id and title.
Use to check a single category. Use gumroad_list_variant_categories to browse all of them.
Requires ids from gumroad_list_products and gumroad_list_variant_categories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `variant_category_id` (`string`, required): ID of the variant category, as returned by gumroad_list_variant_categories (for example mN7CdHiwHaR9FlxKvF-n-g==).

Example input: `{"product_id":"<product_id>","variant_category_id":"<variant_category_id>"}`

### `gumroad_get_workflow`

Get Workflow · Read-only

Retrieve one active workflow with its email steps and delivery statistics.
Returns the workflow object with id, name, audience_type, trigger, state, filters and its emails (the email steps with delivery statistics).
Use to inspect an automated email sequence. Use gumroad_list_workflows to find ids.
Requires a workflow id from gumroad_list_workflows.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `workflow_id` (`string`, required): ID of the workflow, as returned by gumroad_list_workflows (the id field, for example 7gT2Lq9wUqSbjJ3dEoV2Zw==).

Example input: `{"workflow_id":"<workflow_id>"}`

### `gumroad_list_categories`

List Categories · Read-only

List Gumroad's product category taxonomy as a flat list.
Returns a categories array with id, name, label, path and parent_id for each category.
Use to find a valid category path or taxonomy id before calling gumroad_create_product or gumroad_update_product.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `gumroad_list_custom_fields`

List Custom Fields · Read-only

List the custom checkout fields attached to a product.
Returns a custom_fields array with id, type, name, required, global, collect_per_product and products for each field.
Use to see what extra information buyers are asked for at checkout.
Requires a product id from gumroad_list_products.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_list_emails`

List Emails · Read-only

List the seller's audience emails, optionally filtered by state.
Returns an emails array with id, subject, state, audience_type, published_at, scheduled_at and recipients_count for each email, plus next_page_key when more results follow.
Use to find a draft to edit or send. Use gumroad_get_email for the full body of one email.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page_key` (`string`, optional): Cursor for the next page of emails. Pass the next_page_key value from the previous response; omit for the first page.
- `type` (`string`, optional): Return only emails in this state: published, scheduled or draft. Omit to list all. One of: `published`, `scheduled`, `draft`.

Example input: `{}`

### `gumroad_list_offer_codes`

List Product Offer Codes · Read-only

List the offer codes that apply to one product, including universal codes that apply to every product.
Returns an offer_codes array with id, name, amount_cents or percent_off, max_purchase_count, universal and times_used for each code.
Use to see the discounts on one product. Use gumroad_list_store_offer_codes to list every code in the store.
Requires a product id from gumroad_list_products.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_list_payouts`

List Payouts · Read-only

List the seller's payouts, newest first, optionally filtered by date.
Returns a payouts array with id (null for the upcoming payout), amount, currency, status, created_at, processed_at, payment_processor and bank_account_visual or paypal_email, plus next_page_key when more results follow.
Use to review money paid out. Use gumroad_get_payout for the sales behind one payout.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Return only payouts after this date, in YYYY-MM-DD format, for example 2026-01-01.
- `before` (`string`, optional): Return only payouts before this date, in YYYY-MM-DD format, for example 2026-02-01.
- `include_upcoming` (`string`, optional): Set to false to leave the upcoming payout out of the list. Defaults to true. One of: `true`, `false`.
- `page_key` (`string`, optional): Cursor for the next page of payouts. Pass the next_page_key value from the previous response; omit for the first page.

Example input: `{}`

### `gumroad_list_product_reviews`

List Product Reviews · Read-only

List the public reviews shown on a product page, newest first.
Returns a product_reviews array with id, rating, message, created_at, purchase_id, rater_name and response (up to 100 per page), plus next_page_key when more results follow. Star-only ratings without a message are not included.
Use to read customer feedback for one product.
Requires a product id from gumroad_list_products.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `page_key` (`string`, optional): Cursor for the next page of reviews. Pass the next_page_key value from the previous response; omit for the first page.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_list_products`

List Products · Read-only

List the authenticated seller's products, newest first.
Returns a products array (id, name, price, currency, published, short_url, tags, sales_count and variants for each product), plus next_page_key and next_page_url when more results follow.
Use to browse the catalog or find a product id. Use gumroad_get_product for the full details of one product.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page_key` (`string`, optional): Cursor for the next page of products. Pass the next_page_key value from the previous response; omit for the first page.

Example input: `{}`

### `gumroad_list_sales`

List Sales · Read-only

List the seller's successful sales, newest first, optionally filtered by date, product, buyer or license key.
Returns a sales array (id, email, product_name, price, currency, created_at, refunded flags, variants, order_id and more) with 10 sales per page, plus next_page_key when more results follow.
Use to review orders or find a sale id. Use gumroad_get_sale for one sale.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `after` (`string`, optional): Return only sales after this date, in YYYY-MM-DD format, for example 2026-01-01.
- `before` (`string`, optional): Return only sales before this date, in YYYY-MM-DD format, for example 2026-02-01.
- `email` (`string`, optional): Return only sales to this buyer email, for example buyer@example.com.
- `license_key` (`string`, optional): Return only the sale that issued this license key, for example 85DB562A-C11D4B06-A2335A6B-8C079166.
- `name` (`string`, optional): Return only sales to buyers with this name, for example Jane Doe.
- `order_id` (`string`, optional): Return only the sale with this numeric order id, for example 123456789.
- `page_key` (`string`, optional): Cursor for the next page of sales. Pass the next_page_key value from the previous response; omit for the first page.
- `product_id` (`string`, optional): Return only sales of this product (the id from gumroad_list_products, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{}`

### `gumroad_list_store_offer_codes`

List Store Offer Codes · Read-only

List every non-deleted offer code in the seller's store, including scheduled and expired codes.
Returns an offer_codes array with id, name, amount or percentage, universal, auto_apply, valid_at, expires_at and times_used, plus next_page_key when more results follow.
Use to audit all discounts at once. Use gumroad_list_offer_codes for the codes on one product.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `auto_apply` (`string`, optional): Filter by automatic application: true lists only auto-applied codes, false lists only the rest. Omit to list all codes. One of: `true`, `false`.
- `page_key` (`string`, optional): Cursor for the next page of offer codes. Pass the next_page_key value from the previous response; omit for the first page.

Example input: `{}`

### `gumroad_list_subscribers`

List Subscribers · Read-only

List the active subscribers of a membership or subscription product.
Returns a subscribers array with id, email, product_id, status, recurrence, created_at, cancelled_at, ended_at, failed_at and license_key for each subscriber, plus next_page_key when paginated.
Use to review who is subscribed to a product. Use gumroad_get_subscriber for one subscriber.
Requires a product id from gumroad_list_products.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `email` (`string`, optional): Return only subscribers with this email address, for example buyer@example.com.
- `page_key` (`string`, optional): Cursor for the next page of subscribers. Pass the next_page_key value from the previous response; omit for the first page.
- `paginated` (`string`, optional): Set to true to cap the response at 100 subscribers and receive next_page_key for further pages. Without it all subscribers are returned in one response. One of: `true`, `false`.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_list_variant_categories`

List Variant Categories · Read-only

List the variant categories of a product, such as Size or Tier groupings.
Returns a variant_categories array with id and title for each category.
Use to find a variant category id. Use gumroad_list_variants to see the options inside a category.
Requires a product id from gumroad_list_products.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_list_variants`

List Variants · Read-only

List the variants (options) inside a variant category of a product.
Returns a variants array with id, name, description, price_difference_cents and max_purchase_count for each variant.
Use to browse the options of one category. Use gumroad_get_variant for a single option.
Requires ids from gumroad_list_products and gumroad_list_variant_categories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `variant_category_id` (`string`, required): ID of the variant category, as returned by gumroad_list_variant_categories (for example mN7CdHiwHaR9FlxKvF-n-g==).

Example input: `{"product_id":"<product_id>","variant_category_id":"<variant_category_id>"}`

### `gumroad_list_workflows`

List Workflows · Read-only

List the seller's active email workflows, newest first.
Returns a workflows array with id, name, audience_type, trigger, state, published_at and emails_count for each workflow.
Use to find an automated email sequence. Use gumroad_get_workflow for its email steps and delivery statistics.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `gumroad_create_custom_field`

Create Custom Field · Write

Add a custom checkout field to a product.
Returns the created custom_field object with id, type, name and required.
Use to collect extra buyer information such as a phone number. Use gumroad_update_custom_field to change whether it is required.
Requires a product id from gumroad_list_products.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Label of the custom field shown to buyers at checkout, for example phone number.
- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `required` (`string`, optional): Whether buyers must fill the field in: true or false. Defaults to false. One of: `true`, `false`.

Example input: `{"name":"<name>","product_id":"<product_id>"}`

### `gumroad_create_email`

Create Email · Write

Create a draft audience email, or send it immediately when publish is true.
Returns the created email object with id, subject, state and audience_type.
Use to write a newsletter or product update. Schedule a draft later with gumroad_schedule_email. Sending reaches real customers and cannot be undone.
For audience product, also pass product_id.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `body` (`string`, required): HTML body of the email, for example Hello, world!
.
- `subject` (`string`, required): Subject line of the email, for example Launch update.
- `audience` (`string`, optional): Who receives the email: all, audience, customers, seller, followers, follower or product. Defaults to audience. One of: `all`, `audience`, `customers`, `seller`, `followers`, `follower`, `product`.
- `product_id` (`string`, optional): Product id (or permalink) whose buyers receive the email. Required when audience is product, for example A-m3CDDC5dlrSdKZp0RFhA==.
- `publish` (`boolean`, optional): Set true to send the email immediately instead of saving a draft.

Example input: `{"body":"<body>","subject":"<subject>"}`

### `gumroad_create_offer_code`

Create Offer Code · Write

Create a discount code for a product, or for every product when universal is true.
Returns the created offer_code object with id, name, amount_cents or percent_off, universal and max_purchase_count.
Use to add a coupon. Use gumroad_update_offer_code to change an existing code.
Requires a product id from gumroad_list_products.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `amount_off` (`integer`, required): Discount amount. With offer_type cents (the default) this is cents, for example 200 for $2.00 off. With offer_type percent it is the percentage, for example 25 for 25 percent off.
- `name` (`string`, required): The coupon code buyers type at checkout, for example SUMMER25.
- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `max_purchase_count` (`integer`, optional): Maximum number of times the code can be redeemed, for example 100.
- `minimum_amount_cents` (`integer`, optional): Minimum order total in cents required for the code to apply, for example 1000 for $10.00.
- `offer_type` (`string`, optional): How amount_off is interpreted: cents (fixed amount, the default) or percent. One of: `cents`, `percent`.
- `universal` (`boolean`, optional): Set true to make the code apply to all of the seller's products. Defaults to false (this product only).

Example input: `{"amount_off":1,"name":"<name>","product_id":"<product_id>"}`

### `gumroad_create_product`

Create Product · Write

Create a new product in the seller's store, published immediately unless draft is true.
Returns the created product object (id, name, price, published, short_url and more) and a warning when publishing was blocked and the product was saved as a draft.
Use to add a product. Use gumroad_update_product to change an existing product and gumroad_enable_product to publish a draft.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the product shown on its page, for example Pencil Icon PSD.
- `price` (`integer`, required): Price in the smallest unit of the product currency, for example 100 for $1.00 in USD. Required, even for pay-what-you-want products (it is then the minimum price).
- `category` (`string`, optional): Full category path from gumroad_list_categories, for example design/ui-and-web/figma. Do not send together with taxonomy_id.
- `custom_permalink` (`string`, optional): Custom URL slug for the product page, for example pencil. Must be unique within the seller's store.
- `custom_summary` (`string`, optional): Short summary shown on the product page, for example You'll get one PSD file.
- `customizable_price` (`boolean`, optional): Set true to let buyers pay what they want, with price acting as the minimum.
- `description` (`string`, optional): Product description as HTML, for example Vector icon pack.
.
- `draft` (`boolean`, optional): Set true to save the product as an unpublished draft instead of publishing it. Defaults to false.
- `max_purchase_count` (`integer`, optional): Maximum number of sales allowed before the product sells out, for example 100.
- `native_type` (`string`, optional): Product type. One of digital (default), course, ebook, membership, bundle, coffee, call or commission. Cannot be changed after creation. One of: `digital`, `course`, `ebook`, `membership`, `bundle`, `coffee`, `call`, `commission`.
- `price_currency_type` (`string`, optional): ISO 4217 currency code in lowercase, for example usd or eur. Defaults to the seller's account currency.
- `refund_fine_print` (`string`, optional): Fine print for the product-level refund policy. Requires refund_period unless the product already has one enabled, and cannot be combined with inherit.
- `refund_period` (`string`, optional): Product-level refund policy window in days. One of inherit (use the account default), none, 7, 14, 30 or 183. Only available when the account-level refund policy is not in effect. One of: `inherit`, `none`, `7`, `14`, `30`, `183`.
- `subscription_duration` (`string`, optional): Billing period for membership products only. One of monthly, quarterly, biannually, yearly or every_two_years. One of: `monthly`, `quarterly`, `biannually`, `yearly`, `every_two_years`.
- `suggested_price_cents` (`integer`, optional): Suggested price in cents shown to buyers on a pay-what-you-want product, for example 500.
- `tags` (`array`, optional): Tags for the product as an array of strings, for example ["pencil", "icon"].
- `taxonomy_id` (`integer`, optional): Numeric category id from gumroad_list_categories, for example 123. Alias for category; do not send both.

Example input: `{"name":"<name>","price":1}`

### `gumroad_create_variant`

Create Variant · Write

Create a new variant (option) inside a variant category.
Returns the created variant object with id, name, price_difference_cents and max_purchase_count.
Use to add an option such as Red or Large with an optional price bump. Use gumroad_update_variant to change an existing option.
Requires ids from gumroad_list_products and gumroad_list_variant_categories.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the variant, for example Red.
- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `variant_category_id` (`string`, required): ID of the variant category, as returned by gumroad_list_variant_categories (for example mN7CdHiwHaR9FlxKvF-n-g==).
- `max_purchase_count` (`integer`, optional): Maximum number of sales allowed for this variant before it sells out, for example 50.
- `price_difference_cents` (`integer`, optional): Amount in cents added to the product's base price when buyers pick this variant, for example 250 for $2.50 extra. Use 0 for no price change.

Example input: `{"name":"<name>","product_id":"<product_id>","variant_category_id":"<variant_category_id>"}`

### `gumroad_create_variant_category`

Create Variant Category · Write

Create a new variant category on a product.
Returns the created variant_category object with id and title.
Use to add a group of options such as Size or Color. Use gumroad_create_variant afterwards to add options inside it.
Requires a product id from gumroad_list_products.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `title` (`string`, required): Title of the variant category, for example Colors.

Example input: `{"product_id":"<product_id>","title":"<title>"}`

### `gumroad_decrement_license_uses`

Decrement License Uses · Write

Decrease a license key's uses count by one (never below zero).
Returns success, the new uses count and the license purchase details.
Use to give back a use, for example when a device is deactivated.
Requires a product id from gumroad_list_products and the customer's license key.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `license_key` (`string`, required): The license key issued to the customer, for example 85DB562A-C11D4B06-A2335A6B-8C079166.
- `product_id` (`string`, required): ID of the product the license belongs to (the id field from gumroad_list_products, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{"license_key":"<license_key>","product_id":"<product_id>"}`

### `gumroad_disable_license`

Disable License · Write

Disable a license key so it no longer verifies.
Returns success, the license uses count and the purchase details.
Use to cut off a customer's license. Use gumroad_enable_license to reverse it.
Requires a product id from gumroad_list_products and the customer's license key.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `license_key` (`string`, required): The license key issued to the customer, for example 85DB562A-C11D4B06-A2335A6B-8C079166.
- `product_id` (`string`, required): ID of the product the license belongs to (the id field from gumroad_list_products, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{"license_key":"<license_key>","product_id":"<product_id>"}`

### `gumroad_disable_product`

Disable Product · Write

Unpublish a product so buyers can no longer purchase it, without deleting it.
Returns the product object with published set to false.
Use to take a product offline temporarily. Use gumroad_delete_product to remove it permanently.
Requires a product id from gumroad_list_products.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_enable_license`

Enable License · Write

Re-enable a disabled license key.
Returns success, the license uses count and the purchase details.
Use to restore a license that gumroad_disable_license turned off.
Requires a product id from gumroad_list_products and the customer's license key.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `license_key` (`string`, required): The license key issued to the customer, for example 85DB562A-C11D4B06-A2335A6B-8C079166.
- `product_id` (`string`, required): ID of the product the license belongs to (the id field from gumroad_list_products, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{"license_key":"<license_key>","product_id":"<product_id>"}`

### `gumroad_enable_product`

Enable Product · Write

Publish a product so buyers can purchase it.
Returns the product object with published set to true.
Use to publish a draft or re-enable a disabled product. Use gumroad_disable_product to unpublish.
Requires a product id from gumroad_list_products.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_mark_sale_as_shipped`

Mark Sale as Shipped · Write

Mark a sale of a physical product as shipped.
Returns the updated sale object.
Use after fulfilling an order that requires shipping.
Requires a sale id from gumroad_list_sales.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `sale_id` (`string`, required): ID of the sale, as returned by gumroad_list_sales (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==).
- `tracking_url` (`string`, optional): Full http or https tracking URL for the shipment, for example https://tools.usps.com/go/TrackConfirmAction?tLabels=9400.

Example input: `{"sale_id":"<sale_id>"}`

### `gumroad_preview_email`

Send Email Preview · Write

Send a preview of an audience email to the seller's own email address.
Returns the email object that was previewed (id, subject, state).
Use to proofread a draft before sending it with gumroad_send_email.
Requires an email id from gumroad_list_emails.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `email_id` (`string`, required): ID of the audience email, as returned by gumroad_list_emails (the id field, for example bfi_30HLgGWL8H2wo_Gzlg==).

Example input: `{"email_id":"<email_id>"}`

### `gumroad_refund_sale`

Refund Sale · Write

Refund a sale in full, or partially when amount_cents is given.
Returns the updated sale object with its refund status.
Use to return money to a buyer. Use gumroad_revoke_sale_access to cut off access without refunding.
Requires a sale id from gumroad_list_sales.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `sale_id` (`string`, required): ID of the sale, as returned by gumroad_list_sales (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==).
- `amount_cents` (`integer`, optional): Amount to refund in minor units of the sale's currency (the currency field on the sale), for example 200 for 2.00. Most currencies have 100 minor units; jpy has none, so 200 means 200 yen. Omit to refund the full remaining amount. Several partial refunds are allowed until the sale is fully refunded.

Example input: `{"sale_id":"<sale_id>"}`

### `gumroad_resend_receipt`

Resend Receipt · Write

Resend the purchase receipt email for a sale to the customer.
Returns success true and a confirmation message.
Use when a buyer lost their receipt or download link.
Requires a sale id from gumroad_list_sales.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `sale_id` (`string`, required): ID of the sale, as returned by gumroad_list_sales (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{"sale_id":"<sale_id>"}`

### `gumroad_revoke_sale_access`

Revoke Sale Access · Write

Revoke a buyer's access to a sale without refunding it.
Returns the updated sale object with access_revoked set to true.
Use to cut off library and download access. Refused for refunded sales, physical products and subscriptions. Use gumroad_undo_revoke_sale_access to restore access.
Requires a sale id from gumroad_list_sales.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `sale_id` (`string`, required): ID of the sale, as returned by gumroad_list_sales (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{"sale_id":"<sale_id>"}`

### `gumroad_rotate_license`

Rotate License · Write

Replace a license key with a new one. The old key stops working.
Returns success, the uses count and the purchase details including the new license_key.
Use when a customer's key has leaked. Use gumroad_disable_license to switch a key off without issuing a new one.
Requires a product id from gumroad_list_products and the customer's current license key.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `license_key` (`string`, required): The license key issued to the customer, for example 85DB562A-C11D4B06-A2335A6B-8C079166.
- `product_id` (`string`, required): ID of the product the license belongs to (the id field from gumroad_list_products, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{"license_key":"<license_key>","product_id":"<product_id>"}`

### `gumroad_schedule_email`

Schedule Email · Write

Schedule a draft audience email to publish at a set time. Scheduling again replaces the earlier time.
Returns the email object with state scheduled and scheduled_at.
Use to send later. Use gumroad_unschedule_email to cancel.
Requires a draft email id from gumroad_list_emails.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `email_id` (`string`, required): ID of the audience email, as returned by gumroad_list_emails (the id field, for example bfi_30HLgGWL8H2wo_Gzlg==).
- `to_be_published_at` (`string`, required): Publish date and time in the seller's timezone, formatted YYYY-MM-DD HH:MM, for example 2026-07-01 14:00.

Example input: `{"email_id":"<email_id>","to_be_published_at":"<to_be_published_at>"}`

### `gumroad_send_email`

Send Email · Write

Publish a draft audience email and send it to its audience now.
Returns the email object with its new state.
Use when the draft is final. This reaches real customers and cannot be undone. Use gumroad_schedule_email to send later.
Requires a draft email id from gumroad_list_emails.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `email_id` (`string`, required): ID of the audience email, as returned by gumroad_list_emails (the id field, for example bfi_30HLgGWL8H2wo_Gzlg==).

Example input: `{"email_id":"<email_id>"}`

### `gumroad_undo_revoke_sale_access`

Undo Revoke Sale Access · Write

Restore a buyer's access to a sale whose access was previously revoked.
Returns the updated sale object with access_revoked set to false.
Use to reverse gumroad_revoke_sale_access.
Requires a sale id from gumroad_list_sales.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `sale_id` (`string`, required): ID of the sale, as returned by gumroad_list_sales (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==).

Example input: `{"sale_id":"<sale_id>"}`

### `gumroad_unschedule_email`

Unschedule Email · Write

Cancel a scheduled audience email and turn it back into a draft.
Returns the email object with state draft.
Use to stop a scheduled send.
Requires a scheduled email id from gumroad_list_emails.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `email_id` (`string`, required): ID of the audience email, as returned by gumroad_list_emails (the id field, for example bfi_30HLgGWL8H2wo_Gzlg==).

Example input: `{"email_id":"<email_id>"}`

### `gumroad_update_custom_field`

Update Custom Field · Write

Change whether a product's custom checkout field is required.
Returns the updated custom_field object with id, type, name and required.
Use to make a field mandatory or optional. Use gumroad_create_custom_field to add a new field.
Requires a product id from gumroad_list_products and a field name from gumroad_list_custom_fields.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `name` (`string`, required): Name of the custom field exactly as shown by gumroad_list_custom_fields, for example phone number.
- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `required` (`string`, required): Whether buyers must fill the field in: true or false. One of: `true`, `false`.

Example input: `{"name":"<name>","product_id":"<product_id>","required":"true"}`

### `gumroad_update_offer_code`

Update Offer Code · Write

Update a store offer code. Only the fields you pass are changed.
Returns the updated offer_code object with id, name, amount_cents or percent_off, max_purchase_count, minimum_amount_cents, auto_apply, valid_at and expires_at.
Use to change limits, validity dates or automatic application of a code. Use gumroad_create_offer_code to add a new code.
Requires an offer code id from gumroad_list_store_offer_codes or gumroad_list_offer_codes.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `offer_code_id` (`string`, required): ID of the offer code, as returned by gumroad_list_offer_codes or gumroad_list_store_offer_codes (the id field, for example ZjCx1xkLQq9GeoV2sS8hTQ==).
- `auto_apply` (`boolean`, optional): Set true to apply a universal code automatically on product pages and profile cards. Disabling it clears sale_label.
- `expires_at` (`string`, optional): End time as an RFC 3339 timestamp with a time zone, for example 2026-12-01T00:00:00-05:00. An end requires a start, and must come after it.
- `max_purchase_count` (`integer`, optional): New maximum number of redemptions, for example 100.
- `minimum_amount_cents` (`integer`, optional): New minimum order total in cents required for the code to apply, for example 1000.
- `sale_label` (`string`, optional): Plain-text label of up to 32 characters shown for an automatic sale, for example Black Friday. Shows Sale when blank.
- `valid_at` (`string`, optional): Start time as an RFC 3339 timestamp with a time zone, for example 2026-11-27T00:00:00-05:00.

Example input: `{"offer_code_id":"<offer_code_id>"}`

### `gumroad_update_product`

Update Product · Write

Update fields on an existing product. Only the fields you pass are changed.
Returns the updated product object and a warning when an offer code became invalid for the product.
Use to rename, reprice, retag or reconfigure a product. Use gumroad_enable_product or gumroad_disable_product to publish or unpublish.
Requires a product id from gumroad_list_products.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `category` (`string`, optional): Full category path from gumroad_list_categories, for example design/ui-and-web/figma. Do not send together with taxonomy_id.
- `custom_permalink` (`string`, optional): New custom URL slug for the product page, for example pencil-v2.
- `custom_receipt` (`string`, optional): Custom text added to the purchase receipt, for example Thanks for your purchase!
- `custom_summary` (`string`, optional): Short summary shown on the product page, for example You'll get one PSD file.
- `customizable_price` (`boolean`, optional): Set true to enable pay-what-you-want pricing, false to disable it.
- `description` (`string`, optional): New product description as HTML, for example Updated icon pack.
.
- `display_product_reviews` (`boolean`, optional): Set true to show reviews on the product page.
- `is_adult` (`boolean`, optional): Set true to mark the product as adult content.
- `max_purchase_count` (`integer`, optional): Maximum number of sales allowed before the product sells out, for example 100.
- `name` (`string`, optional): New name of the product, for example Pencil Icon PSD v2.
- `price` (`integer`, optional): New price in the smallest currency unit, for example 200 for $2.00. Not allowed for tiered memberships; use gumroad_update_variant to change tier pricing.
- `price_currency_type` (`string`, optional): ISO 4217 currency code in lowercase, for example usd or eur.
- `quantity_enabled` (`boolean`, optional): Set true to let buyers choose a quantity at checkout.
- `refund_fine_print` (`string`, optional): Fine print for the product-level refund policy. Requires refund_period unless the product already has one enabled, and cannot be combined with inherit. An empty string clears it.
- `refund_period` (`string`, optional): Product-level refund policy window in days. One of inherit (switch back to the account default), none, 7, 14, 30 or 183. Only available when the account-level refund policy is not in effect. One of: `inherit`, `none`, `7`, `14`, `30`, `183`.
- `should_show_sales_count` (`boolean`, optional): Set true to show the number of sales on the product page.
- `suggested_price_cents` (`integer`, optional): Suggested price in cents for a pay-what-you-want product, for example 500.
- `tags` (`array`, optional): Tags as an array of strings, for example ["pencil", "icon"]. This fully replaces the existing tags.
- `taxonomy_id` (`integer`, optional): Numeric category id from gumroad_list_categories, for example 123. Alias for category; do not send both.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_update_refund_policy`

Update Refund Policy · Write

Update the account-level refund policy.
Returns the updated refund_policy object with refund_period, title, fine_print and in_effect.
Use to change the store-wide refund window. Rejected when the account-level policy is not in effect; set product-level policies with gumroad_update_product instead.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `refund_period` (`string`, required): Refund window in days. One of none, 7, 14, 30 or 183. One of: `none`, `7`, `14`, `30`, `183`.
- `fine_print` (`string`, optional): Fine print shown with the policy, up to 3000 characters. HTML is stripped. An empty string clears it.

Example input: `{"refund_period":"none"}`

### `gumroad_update_variant`

Update Variant · Write

Update a variant (option) of a product. Only the fields you pass are changed.
Returns the updated variant object with id, name, price_difference_cents and max_purchase_count.
Use to rename an option or change its price difference. Use gumroad_update_variant_category to rename the whole group.
Requires ids from gumroad_list_products, gumroad_list_variant_categories and gumroad_list_variants.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `variant_category_id` (`string`, required): ID of the variant category, as returned by gumroad_list_variant_categories (for example mN7CdHiwHaR9FlxKvF-n-g==).
- `variant_id` (`string`, required): ID of the variant, as returned by gumroad_list_variants (for example kuaXCPHTmRuoK13rNGVbxg==).
- `max_purchase_count` (`integer`, optional): New maximum number of sales allowed for this variant, for example 50.
- `name` (`string`, optional): New name of the variant, for example Dark Red.
- `price_difference_cents` (`integer`, optional): New amount in cents added to the product's base price for this variant, for example 150.

Example input: `{"product_id":"<product_id>","variant_category_id":"<variant_category_id>","variant_id":"<variant_id>"}`

### `gumroad_update_variant_category`

Update Variant Category · Write

Rename a variant category of a product.
Returns the updated variant_category object with id and title.
Use to change a category title. Use gumroad_update_variant to change one of its options.
Requires ids from gumroad_list_products and gumroad_list_variant_categories.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `title` (`string`, required): New title of the variant category, for example Sizes.
- `variant_category_id` (`string`, required): ID of the variant category, as returned by gumroad_list_variant_categories (for example mN7CdHiwHaR9FlxKvF-n-g==).

Example input: `{"product_id":"<product_id>","title":"<title>","variant_category_id":"<variant_category_id>"}`

### `gumroad_verify_license`

Verify License · Write

Verify a customer's license key for a product and count one use unless increment_uses_count is false.
Returns success, the license uses count and the purchase details (email, price, refunded, chargebacked, variants, subscription dates).
Use to check that a license key is valid. Pass increment_uses_count false to check without consuming a use.
Requires a product id from gumroad_list_products.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `license_key` (`string`, required): The license key issued to the customer, for example 85DB562A-C11D4B06-A2335A6B-8C079166.
- `product_id` (`string`, required): ID of the product the license belongs to (the id field from gumroad_list_products, for example A-m3CDDC5dlrSdKZp0RFhA==).
- `increment_uses_count` (`boolean`, optional): Set false to verify without incrementing the license's uses count. Defaults to true, which counts one use per call.

Example input: `{"license_key":"<license_key>","product_id":"<product_id>"}`

### `gumroad_delete_custom_field`

Delete Custom Field · Destructive

Remove a custom checkout field from a product.
Returns success true and a confirmation message.
Use to stop collecting that information at checkout.
Requires a product id from gumroad_list_products and a field name from gumroad_list_custom_fields.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `name` (`string`, required): Name of the custom field exactly as shown by gumroad_list_custom_fields, for example phone number.
- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"name":"<name>","product_id":"<product_id>"}`

### `gumroad_delete_email`

Delete Email · Destructive

Delete an audience email.
Returns success true and a confirmation message.
Use to discard a draft or remove a published email.
Requires an email id from gumroad_list_emails.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `email_id` (`string`, required): ID of the audience email, as returned by gumroad_list_emails (the id field, for example bfi_30HLgGWL8H2wo_Gzlg==).

Example input: `{"email_id":"<email_id>"}`

### `gumroad_delete_offer_code`

Delete Offer Code · Destructive

Permanently delete an offer code of a product.
Returns success true and a confirmation message.
Use to retire a coupon for good.
Requires ids from gumroad_list_products and gumroad_list_offer_codes.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `offer_code_id` (`string`, required): ID of the offer code, as returned by gumroad_list_offer_codes or gumroad_list_store_offer_codes (the id field, for example ZjCx1xkLQq9GeoV2sS8hTQ==).
- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"offer_code_id":"<offer_code_id>","product_id":"<product_id>"}`

### `gumroad_delete_product`

Delete Product · Destructive

Permanently delete a product.
Returns success true and a confirmation message.
Use only when the product must be removed for good. Use gumroad_disable_product to unpublish it while keeping it.
Requires a product id from gumroad_list_products.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.

Example input: `{"product_id":"<product_id>"}`

### `gumroad_delete_variant`

Delete Variant · Destructive

Permanently delete a variant (option) of a product.
Returns success true and a confirmation message.
Use to remove a single option. Use gumroad_delete_variant_category to remove the whole group.
Requires ids from gumroad_list_products, gumroad_list_variant_categories and gumroad_list_variants.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `variant_category_id` (`string`, required): ID of the variant category, as returned by gumroad_list_variant_categories (for example mN7CdHiwHaR9FlxKvF-n-g==).
- `variant_id` (`string`, required): ID of the variant, as returned by gumroad_list_variants (for example kuaXCPHTmRuoK13rNGVbxg==).

Example input: `{"product_id":"<product_id>","variant_category_id":"<variant_category_id>","variant_id":"<variant_id>"}`

### `gumroad_delete_variant_category`

Delete Variant Category · Destructive

Permanently delete a variant category of a product.
Returns success true and a confirmation message.
Use only when the whole group of options should be removed. Use gumroad_delete_variant to remove a single option.
Requires ids from gumroad_list_products and gumroad_list_variant_categories.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `product_id` (`string`, required): ID of the product, as returned by gumroad_list_products (the id field, for example A-m3CDDC5dlrSdKZp0RFhA==). The product's custom permalink also works.
- `variant_category_id` (`string`, required): ID of the variant category, as returned by gumroad_list_variant_categories (for example mN7CdHiwHaR9FlxKvF-n-g==).

Example input: `{"product_id":"<product_id>","variant_category_id":"<variant_category_id>"}`

## Related

Other Marketing connectors ([all 87](/agentkit/connectors/?category=marketing)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Mailchimp](/agentkit/connectors/mailchimp/): Scalekit connector, OAuth, 73 tools
- [Twitter / X](/agentkit/connectors/twitteroauth/): Scalekit connector, OAuth, 92 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
