Skip to main content
Glama
thenavidm
by thenavidm

Create subscription

create_subscription
Destructive

Subscribe an email address to a Beehiiv publication, set tiers or automations, and send a welcome email. Requires confirm=true because it changes account state.

Instructions

Create subscription. Changes account state and requires confirm=true for the user-requested action. OAuth integrations require subscriptions:write.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tierNoThe tier for this subscription.
emailNoThe email address of the subscription.
accountNoNamed private account from BEEHIIV_ACCOUNTS. Defaults to BEEHIIV_DEFAULT_ACCOUNT or the first configured account.
confirmNoSet true only when the user asked for exactly this action.
payloadNoComplete JSON body instead of individual body flags. Supports nullable fields and nested bulk structures. Cannot be combined with body flags or payload_file.
utm_termNoThe acquisition term; typically the keyword or search term
utm_mediumNoThe medium of the subscription
utm_sourceNoThe source of the subscription.
utm_contentNoThe acquisition content; typically used for A/B testing or ad variations
payload_fileNoLocal JSON request body file, at most 5 MB. Contents are validated before the API call and are never logged.
utm_campaignNoThe acquisition campaign of the subscription
custom_fieldsNo
premium_tiersNo
referral_codeNoThis should be a subscribers referral_code. This gives referral credit for the new subscription.
automation_idsNo
publication_idYesThe prefixed ID of the publication object
referring_siteNoThe website that the subscriber was referred from
premium_tier_idsNo
send_welcome_emailNo
stripe_customer_idNoThe Stripe customer ID for this subscription.
double_opt_overrideNo
newsletter_list_idsNoAn array of newsletter list prefixed IDs to subscribe the new subscription to. The newsletter lists must belong to the same publication.
reactivate_existingNo
complimentary_gift_idNo
skip_newsletter_list_auto_subscribeNoWhen true, the subscriber will not be auto-subscribed to newsletter lists configured with auto-subscribe. Defaults to false.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed60 schema fields changedv3.0.1
    • addedInput schema / $defs
      Added value: +{
      +  "ComplimentaryAccessId": {
      +    "description": "The prefixed ID of a complimentary access object to apply to this subscription. The complimentary access must belong to the same publication.",
      +    "pattern": "^(comp_access_[0-9a-fA-F\\-]+)$",
      +    "title": "ComplimentaryAccessId",
      +    "type": "string"
      +  },
      +  "DoubleOptOverride": {
      +    "description": "Override the publication's default double opt-in settings for this subscription. Possible values are: - \"on\" : The subscriber will receive a double opt-in confirmation email and will need to confirm their subscription prior to being marked as active. - \"off\" : The subscriber will be marked as active immediately and will not receive a double opt-in confirmation email. - \"not_set\" : The publication's default double opt-in settings will be applied to this subscription.",
      +    "title": "DoubleOptOverride",
      +    "type": "string"
      +  },
      +  "automation_ids": {
      +    "description": "Enroll the subscriber into automations after their subscription has been created. Requires the automations to have an active *Add by API* trigger.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "custom_fields": {
      +    "description": "The custom fields must already exist for the publication. Any new custom fields here will be discarded.",
      +    "items": {
      +      "additionalProperties": false,
      +      "description": "The object required for setting custom field values on a subscription",
      +      "properties": {
      +        "name": {
      +          "description": "The name of the existing custom field",
      +          "type": "string"
      +        },
      +        "value": {
      +          "description": "The value stored for the subscription",
      +          "oneOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "format": "double",
      +              "type": "number"
      +            },
      +            {
      +              "type": "boolean"
      +            },
      +            {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          ],
      +          "title": "CustomFieldDataType"
      +        }
      +      },
      +      "title": "CustomFieldValue",
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  "premium_tier_ids": {
      +    "description": "An array of premium tier IDs to assign to this subscription. When provided, the subscription will be assigned to these specific premium tiers. Can be combined with `premium_tiers` to include tiers from both (duplicates are removed). Takes precedence over the `tier` parameter.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "premium_tiers": {
      +    "description": "An array of premium tier names to assign to this subscription. When provided, the subscription will be assigned to premium tiers matching these names. Can be combined with `premium_tier_ids` to include tiers from both (duplicates are removed). Takes precedence over the `tier` parameter.",
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "reactivate_existing": {
      +    "default": false,
      +    "description": "Whether or not to reactivate the subscription if they have already unsubscribed. This option should be used only if the subscriber is knowingly resubscribing.",
      +    "type": "boolean"
      +  }
      +}
    • addedInput schema / properties / automation_ids / $ref
      Added value: +"#/$defs/automation_ids"
    • removedInput schema / properties / automation_ids / description
      Removed value: -"Enroll the subscriber into automations after their subscription has been created. Requires the automations to have an active *Add by API* trigger."
    • removedInput schema / properties / automation_ids / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / automation_ids / type
      Removed value: -"array"
    • addedInput schema / properties / complimentary_gift_id / $ref
      Added value: +"#/$defs/ComplimentaryAccessId"
    • removedInput schema / properties / complimentary_gift_id / description
      Removed value: -"The prefixed ID of a complimentary access object to apply to this subscription. The complimentary access must belong to the same publication."
    • removedInput schema / properties / complimentary_gift_id / pattern
      Removed value: -"^(comp_access_[0-9a-fA-F\\-]+)$"
    • removedInput schema / properties / complimentary_gift_id / title
      Removed value: -"ComplimentaryAccessId"
    • removedInput schema / properties / complimentary_gift_id / type
      Removed value: -"string"
    • changedInput schema / properties / confirm / description
      Previous value: -"Must be true for every account mutation. Confirms only the user-requested action."New value: +"Set true only when the user asked for exactly this action."
    • addedInput schema / properties / custom_fields / $ref
      Added value: +"#/$defs/custom_fields"
    • removedInput schema / properties / custom_fields / description
      Removed value: -"The custom fields must already exist for the publication. Any new custom fields here will be discarded."
    • removedInput schema / properties / custom_fields / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "The object required for setting custom field values on a subscription",
      -  "properties": {
      -    "name": {
      -      "description": "The name of the existing custom field",
      -      "type": "string"
      -    },
      -    "value": {
      -      "description": "The value stored for the subscription",
      -      "oneOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "format": "double",
      -          "type": "number"
      -        },
      -        {
      -          "type": "boolean"
      -        },
      -        {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        }
      -      ],
      -      "title": "CustomFieldDataType"
      -    }
      -  },
      -  "title": "CustomFieldValue",
      -  "type": "object"
      -}
    • removedInput schema / properties / custom_fields / type
      Removed value: -"array"
    • addedInput schema / properties / double_opt_override / $ref
      Added value: +"#/$defs/DoubleOptOverride"
    • removedInput schema / properties / double_opt_override / description
      Removed value: -"Override the publication's default double opt-in settings for this subscription. Possible values are: - \"on\" : The subscriber will receive a double opt-in confirmation email and will need to confirm their subscription prior to being marked as active. - \"off\" : The subscriber will be marked as active immediately and will not receive a double opt-in confirmation email. - \"not_set\" : The publication's default double opt-in settings will be applied to this subscription."
    • removedInput schema / properties / double_opt_override / title
      Removed value: -"DoubleOptOverride"
    • removedInput schema / properties / double_opt_override / type
      Removed value: -"string"
    • addedInput schema / properties / payload / properties / automation_ids / $ref
      Added value: +"#/$defs/automation_ids"
    • removedInput schema / properties / payload / properties / automation_ids / description
      Removed value: -"Enroll the subscriber into automations after their subscription has been created. Requires the automations to have an active *Add by API* trigger."
    • removedInput schema / properties / payload / properties / automation_ids / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / payload / properties / automation_ids / type
      Removed value: -"array"
    • addedInput schema / properties / payload / properties / complimentary_gift_id / $ref
      Added value: +"#/$defs/ComplimentaryAccessId"
    • removedInput schema / properties / payload / properties / complimentary_gift_id / description
      Removed value: -"The prefixed ID of a complimentary access object to apply to this subscription. The complimentary access must belong to the same publication."
    • removedInput schema / properties / payload / properties / complimentary_gift_id / pattern
      Removed value: -"^(comp_access_[0-9a-fA-F\\-]+)$"
    • removedInput schema / properties / payload / properties / complimentary_gift_id / title
      Removed value: -"ComplimentaryAccessId"
    • removedInput schema / properties / payload / properties / complimentary_gift_id / type
      Removed value: -"string"
    • addedInput schema / properties / payload / properties / custom_fields / $ref
      Added value: +"#/$defs/custom_fields"
    • removedInput schema / properties / payload / properties / custom_fields / description
      Removed value: -"The custom fields must already exist for the publication. Any new custom fields here will be discarded."
    • removedInput schema / properties / payload / properties / custom_fields / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "The object required for setting custom field values on a subscription",
      -  "properties": {
      -    "name": {
      -      "description": "The name of the existing custom field",
      -      "type": "string"
      -    },
      -    "value": {
      -      "description": "The value stored for the subscription",
      -      "oneOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "format": "double",
      -          "type": "number"
      -        },
      -        {
      -          "type": "boolean"
      -        },
      -        {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        }
      -      ],
      -      "title": "CustomFieldDataType"
      -    }
      -  },
      -  "title": "CustomFieldValue",
      -  "type": "object"
      -}
    • removedInput schema / properties / payload / properties / custom_fields / type
      Removed value: -"array"
    • addedInput schema / properties / payload / properties / double_opt_override / $ref
      Added value: +"#/$defs/DoubleOptOverride"
    • removedInput schema / properties / payload / properties / double_opt_override / description
      Removed value: -"Override the publication's default double opt-in settings for this subscription. Possible values are: - \"on\" : The subscriber will receive a double opt-in confirmation email and will need to confirm their subscription prior to being marked as active. - \"off\" : The subscriber will be marked as active immediately and will not receive a double opt-in confirmation email. - \"not_set\" : The publication's default double opt-in settings will be applied to this subscription."
    • removedInput schema / properties / payload / properties / double_opt_override / title
      Removed value: -"DoubleOptOverride"
    • removedInput schema / properties / payload / properties / double_opt_override / type
      Removed value: -"string"
    • addedInput schema / properties / payload / properties / premium_tier_ids / $ref
      Added value: +"#/$defs/premium_tier_ids"
    • removedInput schema / properties / payload / properties / premium_tier_ids / description
      Removed value: -"An array of premium tier IDs to assign to this subscription. When provided, the subscription will be assigned to these specific premium tiers. Can be combined with `premium_tiers` to include tiers from both (duplicates are removed). Takes precedence over the `tier` parameter."
    • removedInput schema / properties / payload / properties / premium_tier_ids / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / payload / properties / premium_tier_ids / type
      Removed value: -"array"
    • addedInput schema / properties / payload / properties / premium_tiers / $ref
      Added value: +"#/$defs/premium_tiers"
    • removedInput schema / properties / payload / properties / premium_tiers / description
      Removed value: -"An array of premium tier names to assign to this subscription. When provided, the subscription will be assigned to premium tiers matching these names. Can be combined with `premium_tier_ids` to include tiers from both (duplicates are removed). Takes precedence over the `tier` parameter."
    • removedInput schema / properties / payload / properties / premium_tiers / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / payload / properties / premium_tiers / type
      Removed value: -"array"
    • addedInput schema / properties / payload / properties / reactivate_existing / $ref
      Added value: +"#/$defs/reactivate_existing"
    • removedInput schema / properties / payload / properties / reactivate_existing / default
      Removed value: -false
    • removedInput schema / properties / payload / properties / reactivate_existing / description
      Removed value: -"Whether or not to reactivate the subscription if they have already unsubscribed. This option should be used only if the subscriber is knowingly resubscribing."
    • removedInput schema / properties / payload / properties / reactivate_existing / type
      Removed value: -"boolean"
    • addedInput schema / properties / premium_tier_ids / $ref
      Added value: +"#/$defs/premium_tier_ids"
    • removedInput schema / properties / premium_tier_ids / description
      Removed value: -"An array of premium tier IDs to assign to this subscription. When provided, the subscription will be assigned to these specific premium tiers. Can be combined with `premium_tiers` to include tiers from both (duplicates are removed). Takes precedence over the `tier` parameter."
    • removedInput schema / properties / premium_tier_ids / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / premium_tier_ids / type
      Removed value: -"array"
    • addedInput schema / properties / premium_tiers / $ref
      Added value: +"#/$defs/premium_tiers"
    • removedInput schema / properties / premium_tiers / description
      Removed value: -"An array of premium tier names to assign to this subscription. When provided, the subscription will be assigned to premium tiers matching these names. Can be combined with `premium_tier_ids` to include tiers from both (duplicates are removed). Takes precedence over the `tier` parameter."
    • removedInput schema / properties / premium_tiers / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / premium_tiers / type
      Removed value: -"array"
    • addedInput schema / properties / reactivate_existing / $ref
      Added value: +"#/$defs/reactivate_existing"
    • removedInput schema / properties / reactivate_existing / default
      Removed value: -false
    • removedInput schema / properties / reactivate_existing / description
      Removed value: -"Whether or not to reactivate the subscription if they have already unsubscribed. This option should be used only if the subscriber is knowingly resubscribing."
    • removedInput schema / properties / reactivate_existing / type
      Removed value: -"boolean"
  2. First observedv2.0.0

TDQS

B3.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds two things annotations cannot: the confirm=true gate for user-requested actions and the OAuth scope requirement (subscriptions:write). 'Changes account state' is largely redundant with destructiveHint. Side effects like welcome emails or reactivation behavior are not covered, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences with no padding; the confirm and scope constraints arrive early. The opening 'Create subscription' sentence is pure duplication of the name/title and earns no place, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 25-parameter mutation tool with nested objects and no output schema, the description omits what is created/returned, how the nested payload is structured, and what happens on conflicts with existing subscriptions. The confirm and scope notes are welcome but leave most of the complexity undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 25 parameters at 68% schema coverage, the description only touches one of them (confirm=true) and says nothing about the payload/body-flags/payload_file mutual exclusivity, premium tier precedence, or reactivate_existing semantics. The schema carries nearly the entire burden for a highly complex parameter set, so the description fails to compensate for the remaining gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence, 'Create subscription,' is a verb+resource statement but restates the tool name and title verbatim and adds no scope or differentiating detail. With siblings like create_bulk_subscription and create_newsletter_list_subscription in the same family, the description does nothing to help an agent tell them apart. It is clear but minimally informative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The confirm=true requirement implies a usage condition (only when the user asked for exactly this action), which is a real prerequisite. However, it never states when to prefer this tool over create_bulk_subscription, update_subscription, or patch_subscription, nor any when-not conditions. Usage is implied rather than explained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools