Lnkbase Newsletter Docs

MCP tools

Endpoint https://hive.lnkbase.com/mcp · see the MCP guide to connect Claude or ChatGPT.

list_posts — List posts

List posts (newest first) with status and headline stats.

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "draft|scheduled|published|archived"
    },
    "limit": {
      "type": "integer",
      "description": "Max results (default 20, max 100)"
    },
    "query": {
      "type": "string",
      "description": "Search in titles"
    }
  },
  "required": [],
  "additionalProperties": false
}

get_post — Get post

Get a post: metadata, content as Markdown-like text, and engagement stats.

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Post id or slug"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}

draft_post — Draft a post

Create a draft post from Markdown (headings, lists, quotes, code fences, images, tables; a line "--- paywall ---" inserts a paywall break). Optionally start from a template.

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "Post title"
    },
    "subtitle": {
      "type": "string",
      "description": "Subtitle"
    },
    "markdown": {
      "type": "string",
      "description": "Body in Markdown"
    },
    "template_id": {
      "type": "string",
      "description": "Template id to start from"
    },
    "email_subject": {
      "type": "string",
      "description": "Email subject (defaults to title)"
    },
    "preview_text": {
      "type": "string",
      "description": "Inbox preview text"
    },
    "audience": {
      "type": "string",
      "description": "all|free|premium"
    },
    "platform": {
      "type": "string",
      "description": "email|web|both"
    }
  },
  "required": [
    "title"
  ],
  "additionalProperties": false
}

update_post — Update a post

Edit a post: replace the body (markdown), append/prepend markdown, or change title/subtitle/subject/preview/audience.

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Post id or slug"
    },
    "title": {
      "type": "string",
      "description": "New title"
    },
    "subtitle": {
      "type": "string",
      "description": ""
    },
    "email_subject": {
      "type": "string",
      "description": ""
    },
    "preview_text": {
      "type": "string",
      "description": ""
    },
    "audience": {
      "type": "string",
      "description": "all|free|premium"
    },
    "markdown": {
      "type": "string",
      "description": "Replace the whole body"
    },
    "append_markdown": {
      "type": "string",
      "description": "Add to the end"
    },
    "prepend_markdown": {
      "type": "string",
      "description": "Add to the beginning"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}

set_ab_test — Set A/B or multivariate test

Configure an A/B test on a draft or scheduled post: either subjects (2-5 subject lines) or variants (2-4 combinations of subject, preview_text, from_name and content "a" = main / "b" = Variant B content, set with alt_markdown). A sample receives the variants; the winner (by opens or clicks) goes to everyone else. send_timing optionally delivers by send-time optimization ({"mode":"sto"}) or local time zone ({"mode":"timezone","local_time":"09:00"}).

{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "string",
      "description": "Post id or slug"
    },
    "subjects": {
      "type": "array",
      "description": "2-5 subject lines",
      "items": {
        "type": "string"
      }
    },
    "variants": {
      "type": "array",
      "description": "2-4 variants {subject?, preview_text?, from_name?, content: a|b}",
      "items": {
        "type": "object"
      }
    },
    "alt_markdown": {
      "type": "string",
      "description": "Variant B content (Markdown)"
    },
    "sample_pct": {
      "type": "integer",
      "description": "Percent of audience in the test (2-50, default 20)"
    },
    "wait_minutes": {
      "type": "integer",
      "description": "Minutes before picking the winner (default 60)"
    },
    "metric": {
      "type": "string",
      "description": "opens|clicks"
    },
    "send_timing": {
      "type": "object",
      "description": "Optional delivery timing",
      "additionalProperties": true
    }
  },
  "required": [
    "post_id"
  ],
  "additionalProperties": false
}

get_stats — Get stats

Answer questions like "what was my open rate / CTR / revenue last month?". Returns numbers plus a plain-English summary. Pass post_id for a single post.

{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer",
      "description": "Period in days (default 30)"
    },
    "post_id": {
      "type": "string",
      "description": "Optional post id or slug"
    }
  },
  "required": [],
  "additionalProperties": false
}

compare_posts — Compare posts

Compare performance across many posts in one request (open rate, CTR, clicks, unsubscribes, web views), sorted.

{
  "type": "object",
  "properties": {
    "post_ids": {
      "type": "array",
      "description": "Specific post ids (optional)",
      "items": {
        "type": "string"
      }
    },
    "limit": {
      "type": "integer",
      "description": "Most recent N published posts when post_ids is omitted (default 20, max 100)"
    },
    "sort_by": {
      "type": "string",
      "description": "open_rate|click_rate|unique_clicks|unsubscribes|web_views|published_at"
    }
  },
  "required": [],
  "additionalProperties": false
}

deliverability_by_provider — Deliverability by mailbox provider

Delivery, bounce, complaint, open and click rates per mailbox provider (Gmail, Outlook, Yahoo, Apple…) for a post.

{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "string",
      "description": "Post id or slug"
    }
  },
  "required": [
    "post_id"
  ],
  "additionalProperties": false
}

reports — Growth & earnings reports

Subscriber growth report (daily new/unsubscribed + acquisition sources) or earnings report (orders by day/kind, MRR, ads/boost earnings).

{
  "type": "object",
  "properties": {
    "report": {
      "type": "string",
      "description": "growth|earnings"
    },
    "days": {
      "type": "integer",
      "description": "Period in days (default 30)"
    }
  },
  "required": [
    "report"
  ],
  "additionalProperties": false
}

get_subscriber — Look up a subscriber

A subscriber's full profile, tags, acquisition source, engagement score, per-post engagement history and recent activity.

{
  "type": "object",
  "properties": {
    "email_or_id": {
      "type": "string",
      "description": "Email address or subscriber id"
    }
  },
  "required": [
    "email_or_id"
  ],
  "additionalProperties": false
}

subscriber_intelligence — Subscriber intelligence

action: subscriber {email_or_id} (value score, lifetime value, purchase likelihood, churn risk, public signals) | top {sort?: value|clv|purchase|churn, limit?} | anomalies (unusual changes in the last 24h vs the previous 14 days) | next_actions (data-driven suggested next steps).

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "description": "subscriber | top | anomalies | next_actions"
    },
    "email_or_id": {
      "type": "string",
      "description": "For action=subscriber"
    },
    "sort": {
      "type": "string",
      "description": "value|clv|purchase|churn"
    },
    "limit": {
      "type": "integer",
      "description": "Max results (default 20)"
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false
}

add_subscriber — Add a subscriber

Subscribe an email address (validated; double opt-in respected) with optional tags.

{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Email"
    },
    "name": {
      "type": "string",
      "description": "Name"
    },
    "tags": {
      "type": "array",
      "description": "Tags to add",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "email"
  ],
  "additionalProperties": false
}

list_segments — List segments

List audience segments with subscriber counts.

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}

create_segment_from_description — Build a segment

Build a segment from a plain-English description. Translate the description into rules: {"op":"and"|"or","rules":[{"field","cmp","value"} | nested group]}. Fields (comparators): email (contains|not_contains|equals|ends_with); name (contains|equals|is_empty|not_empty); status (eq|neq; values: active,pending,unsubscribed,bounced,complained); tier (eq|neq; values: free,premium); tier_id (eq|neq); subscription_status (eq|neq; values: trialing,active,paused,past_due,canceled); trial (is_true|is_false); source (eq|neq; values: website,form,magic_link,import,api,referral,recommendation,boost,manual,event,product,linkinbio); source_detail (equals|contains); utm_source (equals|contains|is_empty|not_empty); utm_medium (equals|contains|is_empty|not_empty); utm_campaign (equals|contains|is_empty|not_empty); country (equals|neq); created_at (within_days|older_than_days|before|after); engagement (gt|lt|eq); open_count (gt|lt|eq); click_count (gt|lt|eq); referral_count (gt|lt|eq); last_open_at (within_days|not_within_days|never); last_click_at (within_days|not_within_days|never); tag (has|not_has); custom (equals|neq|contains|gt|lt|exists|not_exists); opened_post (yes|no); clicked_post (yes|no); clicked_url (contains); automation (started|not_started|completed|active); segment (in|not_in); list (in|not_in); poll (answered|chose|not_answered); survey (responded|not_responded|answer_equals); purchased (yes|no|any); event_registered (yes|no); community_member (is_true|is_false); condition_set (matches|not_matches); ext_purchased (contains|not_contains); ext_platform (eq|neq; values: shopify,woocommerce,stripe); ext_total_spent (gt|lt|eq); ext_orders_count (gt|lt|eq); ext_last_order (within_days|not_within_days|never); cart_abandoned (is_true|is_false); job_title (contains|equals|is_empty|not_empty); company (contains|equals|is_empty|not_empty); has_social (is_true|is_false); business_email (is_true|is_false); value_score (gt|lt|eq); value_percentile (gt|lt); clv (gt|lt); purchase_likelihood (eq|neq; values: high,medium,low); churn_risk (eq|neq; values: high,medium,low). Notes: days-based comparators take a number; tag takes the tag name; custom takes {"key","value"}; poll takes {"poll_id","option_id"}; segment/list/automation/post/product/event take an id. Set dry_run to preview the count without saving.

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Segment name"
    },
    "description": {
      "type": "string",
      "description": "The plain-English description"
    },
    "rules": {
      "type": "object",
      "description": "Rule group JSON",
      "additionalProperties": true
    },
    "kind": {
      "type": "string",
      "description": "dynamic (default) | static"
    },
    "dry_run": {
      "type": "boolean",
      "description": "Only count matches"
    }
  },
  "required": [
    "name",
    "rules"
  ],
  "additionalProperties": false
}

tag_subscriber — Tag a subscriber

Add tags to a subscriber.

{
  "type": "object",
  "properties": {
    "email_or_id": {
      "type": "string",
      "description": "Email or id"
    },
    "tags": {
      "type": "array",
      "description": "Tags",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "email_or_id",
    "tags"
  ],
  "additionalProperties": false
}

list_automations — List automations

List automations with trigger, status, enrollment counts and whether unpublished draft changes exist.

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}

create_automation — Create an automation

Create an automation (saved as a draft; activate=true publishes it and turns it on). trigger = {"type", "config"}; types: signup (Subscriber signs up; config: sources,source_details); confirmed (Subscriber confirms email); welcome (Welcome (new subscriber, after confirmation)); tag_added (Tag is added; config: tag); field_updated (Custom field is updated; config: key); list_subscribed (Joins a newsletter list; config: list_id); upgraded (Upgrades to paid; config: tier_id); downgraded (Downgrades / cancels); purchase (Purchases a product; config: product_id); event_registered (Registers for an event; config: event_id); survey_submitted (Submits a survey; config: survey_id); poll_voted (Votes in a poll; config: poll_id); email_opened (Opens an email; config: post_id); link_clicked (Clicks a link; config: post_id,url_contains); referral_milestone (Reaches a referral milestone); segment_entered (Enters a segment; config: segment_id); date_field (Date in custom field (birthday, renewal…); config: key,offset_days); inactive (Becomes inactive (no opens for N days); config: days); api (Enrolled via API or manually); external_purchase (Buys in your store (Shopify / WooCommerce / Stripe); config: platform,product_contains,min_total); cart_abandoned (Abandons a cart (Shopify / WooCommerce); config: delay_hours,min_value); webhook (Incoming webhook (Calendly, Typeform, Thinkific, Kajabi, Zapier…); config: email_path,name_path,tags,field_map,double_opt_in). steps = [{"id","type","config","yes"?,"no"?}]; step types: send_email=Send email, delay=Wait for a time, wait_until=Wait until…, condition=If / else branch, ab_split=Random split, add_tag=Add tag, remove_tag=Remove tag, update_field=Update custom field, add_to_list=Add to list, remove_from_list=Remove from list, webhook=Call webhook, enroll=Enroll in another automation, grant_premium=Grant premium access, notify=Notify team, unsubscribe=Unsubscribe, exit=Exit automation. Configs: send_email {subject, preview_text, markdown (converted) or doc}, delay {amount, unit: minutes|hours|days|weeks}, condition {rules} with yes/no branches, add_tag {tags}, update_field {key,value}, webhook {url, method}, wait_until {mode: datetime|weekday_time|condition, ...}.

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name"
    },
    "description": {
      "type": "string",
      "description": ""
    },
    "trigger": {
      "type": "object",
      "description": "Trigger",
      "additionalProperties": true
    },
    "triggers": {
      "type": "array",
      "description": "Several entry points [{type, config}] — subscribers enter when any matches (use instead of trigger)",
      "items": {
        "type": "object"
      }
    },
    "template": {
      "type": "string",
      "description": "Optional template key from list_automation_templates; trigger/steps override it"
    },
    "steps": {
      "type": "array",
      "description": "Steps",
      "items": {
        "type": "object"
      }
    },
    "allow_reentry": {
      "type": "boolean",
      "description": "Let subscribers enter more than once"
    },
    "activate": {
      "type": "boolean",
      "description": "Publish and turn on immediately"
    }
  },
  "required": [],
  "additionalProperties": false
}

list_automation_templates — Automation templates

List the 45-template automation library (welcome series, lead magnets, courses, launches, cart abandonment, win-back, webinars, paid trials, churn save, birthdays, Calendly/Typeform/Thinkific webhooks…). Pass a key as `template` to create_automation.

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "description": "Optional category filter"
    }
  },
  "required": [],
  "additionalProperties": false
}

update_automation — Edit an automation

Edit an automation. Trigger/step changes go to a draft version while the live one keeps running; publish=true makes them live (running journeys continue on the new version). status: active (publishes the draft and turns it on) | paused.

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Automation id"
    },
    "name": {
      "type": "string",
      "description": ""
    },
    "description": {
      "type": "string",
      "description": ""
    },
    "trigger": {
      "type": "object",
      "description": "Trigger",
      "additionalProperties": true
    },
    "triggers": {
      "type": "array",
      "description": "Several entry points [{type, config}] (OR)",
      "items": {
        "type": "object"
      }
    },
    "steps": {
      "type": "array",
      "description": "Steps",
      "items": {
        "type": "object"
      }
    },
    "allow_reentry": {
      "type": "boolean"
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "paused"
      ]
    },
    "publish": {
      "type": "boolean",
      "description": "Publish draft changes"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}

enroll_subscriber — Enroll in automation

Enroll a subscriber into an active automation.

{
  "type": "object",
  "properties": {
    "automation_id": {
      "type": "string",
      "description": "Automation id"
    },
    "email_or_id": {
      "type": "string",
      "description": "Subscriber"
    }
  },
  "required": [
    "automation_id",
    "email_or_id"
  ],
  "additionalProperties": false
}

generate_image — Generate an AI image

Generate an image from a prompt and save it to the media library. Returns the image URL to use in posts.

{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "Image description"
    }
  },
  "required": [
    "prompt"
  ],
  "additionalProperties": false
}

manage_website — Website pages, redirects & SEO

Manage the website. action: list_pages | get_page | create_page {title, slug?, markdown|html|sections, status?, seo?, paywall?} | update_page {page_id, ...} | list_redirects | create_redirect {from_path, to_url, code?} | delete_redirect {redirect_id} | get_seo | update_seo {robots_txt?, block_ai_crawlers?, blocked_crawlers?, google_news?, ga_measurement_id?}.

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "description": "Action name"
    },
    "page_id": {
      "type": "string",
      "description": ""
    },
    "title": {
      "type": "string",
      "description": ""
    },
    "slug": {
      "type": "string",
      "description": ""
    },
    "markdown": {
      "type": "string",
      "description": ""
    },
    "html": {
      "type": "string",
      "description": ""
    },
    "sections": {
      "type": "array",
      "description": "Builder sections",
      "items": {
        "type": "object"
      }
    },
    "status": {
      "type": "string",
      "description": "draft|published"
    },
    "seo": {
      "type": "object",
      "description": "{title, description, og_image, noindex}",
      "additionalProperties": true
    },
    "paywall": {
      "type": "string",
      "description": "none|subscribers|premium"
    },
    "show_in_nav": {
      "type": "boolean"
    },
    "from_path": {
      "type": "string",
      "description": ""
    },
    "to_url": {
      "type": "string",
      "description": ""
    },
    "code": {
      "type": "integer",
      "description": "301|302"
    },
    "redirect_id": {
      "type": "string",
      "description": ""
    },
    "robots_txt": {
      "type": "string",
      "description": ""
    },
    "block_ai_crawlers": {
      "type": "boolean"
    },
    "blocked_crawlers": {
      "type": "array",
      "description": "",
      "items": {
        "type": "string"
      }
    },
    "google_news": {
      "type": "boolean"
    },
    "ga_measurement_id": {
      "type": "string",
      "description": ""
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false
}

community — Community posts & DMs

Read and reply in the community. action: list_posts {channel?, limit?} | get_post {post_id} (with comments) | reply_post {post_id, body} | list_dms (latest conversations) | get_dm {subscriber_id} | reply_dm {subscriber_id, body}.

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "description": ""
    },
    "channel": {
      "type": "string",
      "description": "Channel slug"
    },
    "post_id": {
      "type": "string",
      "description": ""
    },
    "subscriber_id": {
      "type": "string",
      "description": ""
    },
    "body": {
      "type": "string",
      "description": "Reply text"
    },
    "limit": {
      "type": "integer",
      "description": ""
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false
}

ads — Ad offers & revenue

action: list_opportunities {status?: available|accepted|declined|placed|completed} | revenue_report {days?} (per placement and per post, bot clicks filtered).

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "description": ""
    },
    "status": {
      "type": "string",
      "description": ""
    },
    "days": {
      "type": "integer",
      "description": ""
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false
}

podcasts — Podcast shows & episodes

Manage podcast shows and episodes. Actions: list_shows | create_show {title, description?, author?, owner_email?, cover_url?, language?, category? ("Technology" or "Business|Marketing"), explicit?, kind?: episodic|serial, access?: public|premium|both, copyright?} | update_show {podcast_id, …same fields} list_episodes {podcast_id, status?} | create_episode {podcast_id, title, description?, audio_url?, season?, number?, episode_type?: full|trailer|bonus, premium?, explicit?, image_url?, transcript?, status?: draft|published|scheduled, publish_at? (ISO)} update_episode {episode_id, …episode fields} | archive_episode {episode_id} (removed from feeds, restorable) | unarchive_episode {episode_id} (back to draft) | delete_episode {episode_id} (permanent, removes audio + download stats). Publishing or scheduling needs audio (audio_url, or a file uploaded in the dashboard). publish_at in the future schedules; in the past publishes.

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "list_shows",
        "create_show",
        "update_show",
        "list_episodes",
        "create_episode",
        "update_episode",
        "archive_episode",
        "unarchive_episode",
        "delete_episode"
      ]
    },
    "podcast_id": {
      "type": "string",
      "description": "Show id"
    },
    "episode_id": {
      "type": "string",
      "description": "Episode id"
    },
    "title": {
      "type": "string",
      "description": ""
    },
    "description": {
      "type": "string",
      "description": "Show description (plain text) or episode show notes (HTML allowed)"
    },
    "author": {
      "type": "string",
      "description": "Show author"
    },
    "owner_email": {
      "type": "string",
      "description": "Show owner email (Apple/Spotify verification)"
    },
    "cover_url": {
      "type": "string",
      "description": "Show cover art URL (3000×3000)"
    },
    "language": {
      "type": "string",
      "description": "e.g. en"
    },
    "category": {
      "type": "string",
      "description": "Apple category, optionally \"Category|Subcategory\""
    },
    "kind": {
      "type": "string",
      "enum": [
        "episodic",
        "serial"
      ]
    },
    "access": {
      "type": "string",
      "enum": [
        "public",
        "premium",
        "both"
      ]
    },
    "copyright": {
      "type": "string",
      "description": ""
    },
    "audio_url": {
      "type": "string",
      "description": "Public audio file URL"
    },
    "season": {
      "type": "integer",
      "description": ""
    },
    "number": {
      "type": "integer",
      "description": ""
    },
    "episode_type": {
      "type": "string",
      "enum": [
        "full",
        "trailer",
        "bonus"
      ]
    },
    "premium": {
      "type": "boolean",
      "description": "Episode only for paid subscribers"
    },
    "explicit": {
      "type": "boolean"
    },
    "image_url": {
      "type": "string",
      "description": "Episode artwork URL"
    },
    "transcript": {
      "type": "string",
      "description": "Plain-text transcript"
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "published",
        "scheduled",
        "archived"
      ]
    },
    "publish_at": {
      "type": "string",
      "description": "ISO date-time"
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false
}

products — Digital products & promo codes

Manage digital products and promo codes. Promo codes (a.k.a. coupons/offers — one concept in OpenHive) discount paid subscriptions, products or event tickets; readers enter them at checkout or use the share link (?code=…). Actions: list | get_product {product_id} | create_product {name, price (USD, 0 = free lead magnet), kind?, description?, link_url?, content?, status?} | update_product {product_id, name?, price?, kind?, description?, link_url?, content?, status?: active|draft|archived} | archive_product {product_id} (hidden from the shop, buyers keep access) | list_promo_codes {active_only?} | create_promo_code {code, percent_off? | amount_off (USD)?, applies_to?: all|subscription|product|event, target_id?, duration?: once|repeating|forever, duration_months?, max_redemptions?, expires_at? (ISO), name?} | update_promo_code {code or promo_code_id, active?, name?, max_redemptions?, expires_at? (ISO or null)} | delete_promo_code {code or promo_code_id}. create_coupon is accepted as an alias of create_promo_code.

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "list",
        "get_product",
        "create_product",
        "update_product",
        "archive_product",
        "list_promo_codes",
        "create_promo_code",
        "create_coupon",
        "update_promo_code",
        "delete_promo_code"
      ]
    },
    "product_id": {
      "type": "string",
      "description": "Product id"
    },
    "name": {
      "type": "string",
      "description": "Product name, or promo code label"
    },
    "price": {
      "type": "number",
      "description": "USD"
    },
    "kind": {
      "type": "string",
      "enum": [
        "download",
        "link",
        "guide",
        "template",
        "ebook",
        "membership",
        "coaching"
      ]
    },
    "description": {
      "type": "string",
      "description": ""
    },
    "link_url": {
      "type": "string",
      "description": "For link products"
    },
    "content": {
      "type": "string",
      "description": "Guide body (HTML or text)"
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "draft",
        "archived"
      ]
    },
    "code": {
      "type": "string",
      "description": "Promo code, e.g. SPRING25"
    },
    "promo_code_id": {
      "type": "string",
      "description": "Promo code id"
    },
    "percent_off": {
      "type": "integer",
      "description": "0-100"
    },
    "amount_off": {
      "type": "number",
      "description": "USD off (when not using percent_off)"
    },
    "applies_to": {
      "type": "string",
      "enum": [
        "all",
        "subscription",
        "product",
        "event"
      ]
    },
    "target_id": {
      "type": "string",
      "description": "Tier / product / event id the code is limited to"
    },
    "duration": {
      "type": "string",
      "enum": [
        "once",
        "repeating",
        "forever"
      ],
      "description": "Subscriptions: how long the discount applies"
    },
    "duration_months": {
      "type": "integer",
      "description": "For duration=repeating"
    },
    "max_redemptions": {
      "type": [
        "integer",
        "null"
      ],
      "description": "null = unlimited"
    },
    "expires_at": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO date; null = never"
    },
    "active": {
      "type": "boolean"
    },
    "active_only": {
      "type": "boolean"
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false
}

send_transactional — Send a transactional email

Send one transactional email (receipt, password reset, notification) to a single recipient, from a saved template (template_id = id or slug) or subject + markdown/html/text. merge_vars fill {{key}} / {{nested.key}} tags. Does not use the newsletter allowance; capped per day. Use idempotency_key to make retries safe.

{
  "type": "object",
  "properties": {
    "to": {
      "type": "string",
      "description": "Recipient email"
    },
    "template_id": {
      "type": "string",
      "description": "Template id or slug"
    },
    "subject": {
      "type": "string",
      "description": "Subject (required without a template)"
    },
    "markdown": {
      "type": "string",
      "description": "Markdown body"
    },
    "html": {
      "type": "string",
      "description": "HTML body"
    },
    "text": {
      "type": "string",
      "description": "Plain-text body"
    },
    "merge_vars": {
      "type": "object",
      "description": "Merge variables",
      "additionalProperties": true
    },
    "reply_to": {
      "type": "string",
      "description": "Reply-To address"
    },
    "tags": {
      "type": "array",
      "description": "Tags for the message log",
      "items": {
        "type": "string"
      }
    },
    "idempotency_key": {
      "type": "string",
      "description": "Repeat-safe key"
    },
    "track": {
      "type": "boolean",
      "description": "Track opens and clicks"
    }
  },
  "required": [
    "to"
  ],
  "additionalProperties": false
}

snippets — Reusable content snippets

Manage reusable content blocks (signature, sponsor banner, footer CTA…). action: list | get {snippet_id} | create {name, markdown | blocks, description?} | update {snippet_id, name?, markdown? | blocks?, description?} | delete {snippet_id}. To use one in a post, add the block {"type":"snippet","data":{"snippet_id":"…"}} (synced: later snippet edits show up everywhere) or copy its blocks.

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "list",
        "get",
        "create",
        "update",
        "delete"
      ]
    },
    "snippet_id": {
      "type": "string",
      "description": "Snippet id"
    },
    "name": {
      "type": "string",
      "description": "Snippet name"
    },
    "description": {
      "type": "string",
      "description": ""
    },
    "markdown": {
      "type": "string",
      "description": "Content in Markdown"
    },
    "blocks": {
      "type": "array",
      "description": "Editor blocks (alternative to markdown)",
      "items": {
        "type": "object"
      }
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false
}

create_coded_template — Create a coded (HTML) template

Create a custom-coded email template from a full HTML document. Scripts/unsafe attributes are removed; merge tags work ({{subscriber.first_name|there}}, {{publication.name}}); {{unsubscribe_url}} is required and added automatically when missing. Posts created from it are sent exactly as written (links tracked).

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Template name"
    },
    "description": {
      "type": "string",
      "description": ""
    },
    "html": {
      "type": "string",
      "description": "Full HTML email document"
    }
  },
  "required": [
    "name",
    "html"
  ],
  "additionalProperties": false
}

check_subject_line — Check a subject line

Score an email subject line 0-100 with advice: length (30-50 chars), words, preview text, spam-trigger words, ALL CAPS / !!!, emoji count, personalization merge tag, question/number. Also returns the publication’s top past subject lines by open rate.

{
  "type": "object",
  "properties": {
    "subject": {
      "type": "string",
      "description": "Subject line"
    },
    "preview_text": {
      "type": "string",
      "description": "Preview text (optional)"
    }
  },
  "required": [
    "subject"
  ],
  "additionalProperties": false
}

search_docs — Search OpenHive docs

Search the OpenHive documentation (setup, deploy, API, MCP, deliverability, support) without leaving the chat.

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "What to look for"
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false
}