LeaderboardBack to leaderboard — loading return destination
Opening report…
Loading report overview
M
MCP server
server.example.com/mcp
Tools and resources for your MCP client, with a public quality report and detailed checks.
Protocol
MCP 2025-11-25
Server version
1.0.0
Website
server.example.com
Supports
Tools · Resources
Overall score
90 /100
How is this score calculated?
Server metadata
Loading server metadata
Reviewed90/100
Discoverability
Loading discoverability
Reviewed90/100
Protocol
Loading protocol
Reviewed90/100
Tools
Loading tools
Reviewed90/100
MCP Apps
Loading mcp apps
Reviewed90/100
Tool documentation quality
Loading tool documentation quality
Reviewed90/100
LeaderboardBack to leaderboard — loading return destination
B
Beacons
beacons.ai/api/v001/creator/mcp
Beacons MCP gives you access to all your tools on Beacons, for creators and managers. Update your Link in Bio, Media Kit, Smart Replies, websites, and products. Check on your analytics for all of these. Access your connected social analytics. All your data you can access in the app is available on this MCP.
Call list_organizations first; org-scoped tools need an organization_uid from that list, and only paid Beacons for Managers orgs work — the agency tools are hidden without one. Self-scoped tools work for every creator. Managers read rosters, creator profiles, social stats, content, brand mentions, Smart Reply triggers, and link-in-bio analytics, and edit, as far as their portal role allows, the agency's own records with send_organization_creator_invite and create_organization_creator (invite a Beacons creator onto the roster, or add one by hand) and update_organization_creator (a roster creator's status, management type and private note) and set_organization_info (the organization's name, contact, public visibility, logo and badge) and set_organization_brand_kit (the colours and fonts every roster, deck and agency Media Kit renders in, restyling the ones already made), the agency-branded Media Kits themselves (create_organization_media_kit builds one for a roster creator, update_organization_media_kit renames it or shows and hides its sections, update_organization_media_kit_brand_partners adds and removes its past brand partners; an agency Media Kit cannot be deleted), and the agency’s own campaign and pitch reports (create_organization_report, update_organization_report for its name, budget, CPM goal, brand logo and what the brand is shown, get_organization_report for how it performed, and set_organization_report_creators / set_organization_report_pitch_materials for who and what it shows, and update_organization_report_posts to link the posts list_organization_creator_posts finds, Instagram Stories included). Self-scoped tools (send_push_notification, the product analytics for the caller's own Media Kit, short links, Smart Replies, invoices and email broadcasts, the Media Kit editing tools — appearance, bio, rate card, brand partners, case studies, social blocks — plus email sender settings and update_store_product/get_shop_product (create or edit any Shop product
Discoverability
1 pass · 1 partial1 passed · 1 partial25/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
List the management organizations you belong to. Call this first — the org-scoped tools take one of the returned organization_uids. Each membership carries has_paid_management_plan; the org-scoped tools refuse organizations without a paid Beacons for Managers plan.
Describe the returned information so the agent knows whether it will answer the request.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Send a push notification to the authenticated user's Beacons native mobile app. The recipient is the caller — there is no recipient argument. Title max 50 characters, body max 178. Optional deeplink is a relative in-app path (for example website/home), never an external URL. This is a write — it delivers a real notification to the caller's phone.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
Notification title (max 50 characters).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body
Notification body (max 178 characters).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
deeplink
Optional relative in-app path to open when the notification is tapped (for example website/home). External URLs are refused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Read one of your broadcasts: what it says and how it performed. Returns its title, subject, preview_line (the inbox preheader) and body — the body as every block in the email in order, with the copy of each text block, the label and URL of each button, the titles and URLs inside image blocks, and the link_id, title and URL of each card and video in links and video blocks — so use this to preview, show or read a draft back before or after editing it with update_email_marketing_broadcast. Also delivery, open, click, bounce, spam, drop, and unsubscribe counts and rates, clicks by URL, a 30-day activity summary, and who the broadcast was sent to, as the names of the audience groups it targets, the store products whose buyers it adds or leaves out, and a count of any addresses entered individually. send_blocker says why it will not send: no subject, body text or audience, scheduled with nothing queued, or marked sent with nothing delivered. Call list_email_marketing_broadcasts first and pass its message_id. Subscriber identities and email addresses are not returned.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
message_id
Broadcast UUID from list_email_marketing_broadcasts.
{
"name": "get_email_marketing_broadcast",
"description": "Read one of your broadcasts: what it says and how it performed. Returns its title, subject, preview_line (the inbox preheader) and body — the body as every block in the email in order, with the copy of each text block, the label and URL of each button, the titles and URLs inside image blocks, and the link_id, title and URL of each card and video in links and video blocks — so use this to preview, show or read a draft back before or after editing it with update_email_marketing_broadcast. Also delivery, open, click, bounce, spam, drop, and unsubscribe counts and rates, clicks by URL, a 30-day activity summary, and who the broadcast was sent to, as the names of the audience groups it targets, the store products whose buyers it adds or leaves out, and a count of any addresses entered individually. send_blocker says why it will not send: no subject, body text or audience, scheduled with nothing queued, or marked sent with nothing delivered. Call list_email_marketing_broadcasts first and pass its message_id. Subscriber identities and email addresses are not returned.",
"inputSchema": {
"type": "object",
"required": [
"message_id"
],
"properties": {
"message_id": {
"type": "string",
"description": "Broadcast UUID from list_email_marketing_broadcasts."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"broadcast",
"body",
"total_block_count",
"clicks_by_url",
"clicks_by_url_truncated",
"activity_by_day",
"note"
],
"properties": {
"body": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
{
"type": "null"
}
]
},
"note": {
"type": "string"
},
"status": {
"type": "string"
},
"broadcast": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"clicks_by_url": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
{
"type": "null"
}
]
},
"activity_by_day": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
{
"type": "null"
}
]
},
"total_block_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"clicks_by_url_truncated": {
"type": "boolean"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get email marketing broadcast",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Render a QR code, optionally in the creator's colors with a logo in the middle. Omit url to encode the creator's own Link in Bio page — the custom domain when one is mapped, else beacons.ai/<handle> — which is the QR they mean by "a QR code for my page"; pass url for any other link. This is a write — it saves a PNG under your own Beacons media prefix and returns file_url, the link the creator can download and print. Hand that link over as-is rather than rebuilding the image from the preview. Only http and https links are encoded. The code is fixed to the URL given, so prefer a Beacons short link when the destination may change. Styling that would stop the code scanning is refused, not silently softened.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
url
The absolute http(s) URL to encode. Omit it to encode the creator's own Link in Bio page.
Clear enough to supply this argument.
width_pixels
Width in pixels of the saved PNG (default 1024, min 512, max 2048). The inline preview is always 512px regardless.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
foreground_color
Hex color of the code itself (#RGB or #RRGGBB, default #000000). It must be DARKER than background_color and hit 4.5:1 contrast against it, or the call is refused — a light-on-dark or low-contrast code does not scan reliably.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
background_color
Hex color behind the code (#RGB or #RRGGBB, default #ffffff).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
module_style
Shape of the code's dots: square (default), rounded, or dots. The three corner squares stay solid whatever you pick, because scanners locate the code by them.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
logo_image_url
Absolute https link to a small logo to place in the middle of the code. It is re-hosted on Beacons first. Keep it simple and high contrast — it covers part of the code, and only the error correction built into every code makes that readable.
{
"name": "generate_qr_code",
"description": "Render a QR code, optionally in the creator's colors with a logo in the middle. Omit url to encode the creator's own Link in Bio page — the custom domain when one is mapped, else beacons.ai/<handle> — which is the QR they mean by \"a QR code for my page\"; pass url for any other link. This is a write — it saves a PNG under your own Beacons media prefix and returns file_url, the link the creator can download and print. Hand that link over as-is rather than rebuilding the image from the preview. Only http and https links are encoded. The code is fixed to the URL given, so prefer a Beacons short link when the destination may change. Styling that would stop the code scanning is refused, not silently softened.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"url": {
"type": "string",
"description": "The absolute http(s) URL to encode. Omit it to encode the creator's own Link in Bio page."
},
"module_style": {
"enum": [
"square",
"rounded",
"dots"
],
"type": "string",
"description": "Shape of the code's dots: square (default), rounded, or dots. The three corner squares stay solid whatever you pick, because scanners locate the code by them."
},
"width_pixels": {
"type": "integer",
"description": "Width in pixels of the saved PNG (default 1024, min 512, max 2048). The inline preview is always 512px regardless."
},
"logo_image_url": {
"type": "string",
"description": "Absolute https link to a small logo to place in the middle of the code. It is re-hosted on Beacons first. Keep it simple and high contrast — it covers part of the code, and only the error correction built into every code makes that readable."
},
"background_color": {
"type": "string",
"description": "Hex color behind the code (#RGB or #RRGGBB, default #ffffff)."
},
"foreground_color": {
"type": "string",
"description": "Hex color of the code itself (#RGB or #RRGGBB, default #000000). It must be DARKER than background_color and hit 4.5:1 contrast against it, or the call is refused — a light-on-dark or low-contrast code does not scan reliably."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"url",
"file_url",
"width_pixels",
"foreground_color",
"background_color",
"module_style",
"logo_image_url"
],
"properties": {
"url": {
"type": "string"
},
"file_url": {
"type": "string"
},
"module_style": {
"type": "string"
},
"width_pixels": {
"type": "number"
},
"logo_image_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"background_color": {
"type": "string"
},
"foreground_color": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Generate QR code",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Edit your Media Kit profile: display name, header content category chips, profile photo, About bio, or collaboration contact form. Read get_media_kit first, then pass exactly one of header, bio, or contact_info; omitted fields stay unchanged and only documented empty values clear them. header.categories replaces the content category chips on the Media Kit and on Link in Bio (at most 5 Beacons content category names; an empty list clears them). header.headline is one freeform chip instead, and the two cannot be combined. Bio/contact writes and display-name, headline, or categories edits require confirmation; photo, pronouns, and location-only edits apply immediately. Brand Deal Profile content categories are a separate list and are not changed here. Offer bio or contact drafts without calling this tool; their pick of a draft is the go-ahead to call it in that same turn, and the confirmation it returns is the only gate — never ask for approval before calling.
The description explains the capability, when to use it, and what to expect.
Inputs57/100
14 of 19 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
header › display_name
The name shown on the header, up to 200 characters. Empty string clears it (the page then shows @handle).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header › pronouns
Pronouns shown on the header, up to 200 characters. Empty string clears them.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header › headline
One freeform tagline chip, up to 200 characters. Empty string clears every chip. Do not combine with categories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header › categories
Content category chips on the public header, in display order, at most 5. Each entry is one Beacons content category name. Replaces the whole list; an empty list or null clears every chip. Omit to leave the chips unchanged. Do not combine with headline. Does not change Brand Deal Profile content categories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header › location
Location shown on the header, up to 200 characters. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header › profile_image_url
Reachable HTTPS profile-photo URL, up to 2048 characters. Empty string clears it. For chat uploads use media_id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header › media_id
Creator-owned gallery photo UUID from a chat upload or search_media. Copies it into My Media for the profile photo. Do not combine with profile_image_url.
Clear enough to supply this argument.
header › anyOf › 0 › profile_image_url
Not provided
Missing description. Explain what this value means and how to supply it.
header › anyOf › 1 › media_id
Not provided
Missing description. Explain what this value means and how to supply it.
bio › bio
The bio text, up to 2000 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bio › heading
Optional heading shown above the bio, up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contact_info › contact_email
Inbox that receives collaboration-form submissions, up to 200 characters. Empty string clears it so submissions fall back to the account email.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contact_info › title
Contact-block heading, up to 200 characters. Omit to keep it; empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contact_info › message
Collaboration-form copy, up to 2000 characters. Omit to keep it; empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
change_summary
A few words in the creator's own terms describing the change, e.g. "making the background yellow". Omit when no concise summary is available. No names, emails, or other personal details.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmation_token
Token from a needs_confirmation result. Repeat the request with this token after user approval. A brand_partner or case_study token may also be passed inside that object. Chat still requires approval in a later user turn.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
oneOf › 0 › header
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 1 › bio
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 2 › contact_info
Not provided
Missing description. Explain what this value means and how to supply it.
{
"name": "set_media_kit_profile",
"description": "Edit your Media Kit profile: display name, header content category chips, profile photo, About bio, or collaboration contact form. Read get_media_kit first, then pass exactly one of header, bio, or contact_info; omitted fields stay unchanged and only documented empty values clear them. header.categories replaces the content category chips on the Media Kit and on Link in Bio (at most 5 Beacons content category names; an empty list clears them). header.headline is one freeform chip instead, and the two cannot be combined. Bio/contact writes and display-name, headline, or categories edits require confirmation; photo, pronouns, and location-only edits apply immediately. Brand Deal Profile content categories are a separate list and are not changed here. Offer bio or contact drafts without calling this tool; their pick of a draft is the go-ahead to call it in that same turn, and the confirmation it returns is the only gate — never ask for approval before calling.",
"inputSchema": {
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"header"
],
"properties": {
"header": {}
}
},
{
"type": "object",
"required": [
"bio"
],
"properties": {
"bio": {}
}
},
{
"type": "object",
"required": [
"contact_info"
],
"properties": {
"contact_info": {}
}
}
],
"required": [],
"properties": {
"bio": {
"type": "object",
"required": [
"bio"
],
"properties": {
"bio": {
"type": "string",
"description": "The bio text, up to 2000 characters."
},
"heading": {
"type": "string",
"description": "Optional heading shown above the bio, up to 200 characters."
}
},
"description": "Set the About/bio text and optionally its heading. This is not the header tagline. Every write requires confirmation, including a new bio; drafting ideas alone must not publish.",
"additionalProperties": false
},
"header": {
"type": "object",
"anyOf": [
{
"type": "object",
"properties": {
"profile_image_url": {
"not": {}
}
}
},
{
"type": "object",
"properties": {
"media_id": {
"not": {}
}
}
}
],
"required": [],
"properties": {
"headline": {
"type": "string",
"description": "One freeform tagline chip, up to 200 characters. Empty string clears every chip. Do not combine with categories."
},
"location": {
"type": "string",
"description": "Location shown on the header, up to 200 characters. Empty string clears it."
},
"media_id": {
"type": "string",
"description": "Creator-owned gallery photo UUID from a chat upload or search_media. Copies it into My Media for the profile photo. Do not combine with profile_image_url."
},
"pronouns": {
"type": "string",
"description": "Pronouns shown on the header, up to 200 characters. Empty string clears them."
},
"categories": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5
},
{
"type": "null"
}
],
"description": "Content category chips on the public header, in display order, at most 5. Each entry is one Beacons content category name. Replaces the whole list; an empty list or null clears every chip. Omit to leave the chips unchanged. Do not combine with headline. Does not change Brand Deal Profile content categories."
},
"display_name": {
"type": "string",
"description": "The name shown on the header, up to 200 characters. Empty string clears it (the page then shows @handle)."
},
"profile_image_url": {
"type": "string",
"description": "Reachable HTTPS profile-photo URL, up to 2048 characters. Empty string clears it. For chat uploads use media_id."
}
},
"description": "Existing header: display name, content category chips, pronouns, location, or profile photo; not About/bio or Cover Image. categories replaces those chips; headline is one freeform chip instead. {} uses a recent chat upload.",
"additionalProperties": false
},
"contact_info": {
"type": "object",
"required": [],
"properties": {
"title": {
"type": "string",
"description": "Contact-block heading, up to 200 characters. Omit to keep it; empty string clears it."
},
"message": {
"type": "string",
"description": "Collaboration-form copy, up to 2000 characters. Omit to keep it; empty string clears it."
},
"contact_email": {
"type": "string",
"description": "Inbox that receives collaboration-form submissions, up to 200 characters. Empty string clears it so submissions fall back to the account email."
}
},
"description": "Edit the existing collaboration contact form: destination inbox, heading, or message. Pass at least one field. Does not change the account email or send a message. Requires confirmation.",
"additionalProperties": false
},
"change_summary": {
"type": "string",
"maxLength": 80,
"description": "A few words in the creator's own terms describing the change, e.g. \"making the background yellow\". Omit when no concise summary is available. No names, emails, or other personal details."
},
"confirmation_token": {
"type": "string",
"description": "Token from a needs_confirmation result. Repeat the request with this token after user approval. A brand_partner or case_study token may also be passed inside that object. Chat still requires approval in a later user turn."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [],
"properties": {
"status": {
"type": "string"
},
"media_kit_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"confirmation_token": {
"type": "string"
}
},
"additionalProperties": true
},
"annotations": {
"title": "set media kit profile",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Edit your Media Kit portfolio: add, update, hide, show, or remove manual rate-card prices; change past-partner logos; change case studies and the total views, likes and comments they display; or change featured portfolio/press links. Read get_media_kit first, then pass exactly one of rate, brand_partner, case_study, or featured_link. Rate update/remove uses rate_id, not the deliverable name, and remove requires confirmation. Set rate.display false to hide one line without deleting it and true to show it again. brand_partner, case_study, and featured_link share optional placement; case studies use brand_name plus title, and retitling one takes the title it has now plus new_title rather than a changed title alone. featured_link can set subtitle, image, open-in-new-tab, countdown, and scheduling (unix seconds); action add creates the links block when the kit has none, and action update still needs an existing row. Pass every supplied case-study post in deliverables to merge them in one edit. Post-only additions apply immediately, including new studies; analytics and other case-study field edits require confirmation in chat. Destructive rate or brand-partner edits require confirmation; additive partners, rate adds/updates, rate visibility, featured links, and placement-only moves apply immediately. This does not change brand deals, structured pricing, block visibility, or rate-card line order.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
68 of 72 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
rate › action
add creates a line or updates the one matching deliverable for backwards compatibility; update changes the row named by rate_id; remove deletes that row after confirmation. Omit to keep the legacy add-or-update behavior.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
rate › rate_id
Stable row identity from get_media_kit. Required for update and remove. Never pass the display position or deliverable name as an identity.
Clear enough to supply this argument.
rate › deliverable
Add only: deliverable name, e.g. "Instagram Reel", up to 200 characters. Matching an existing manual rate keeps the legacy non-duplicating add behavior. Update and remove keep the stored name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
rate › price_usd
USD price as written by the creator: 1500 means $1,500, not 15. Finite number from 0 to 10000000, rounded to two decimal places. Required for a new line; omit on update to keep its price. Other currencies are unsupported.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
rate › description
Optional detail, e.g. "includes one round of revisions". Up to 2000 characters. Omit to leave the stored text; pass an empty string to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
rate › display
false hides this rate-card line from the public Media Kit without deleting it; true shows it. Omit to keep its current visibility.
Clear enough to supply this argument.
rate › confirmation_token
Opaque token from a needs_confirmation result. Required to commit remove. Repeating the remove without this token does not write.
Clear enough to supply this argument.
brand_partner › action
add puts a brand on the logo strip; update changes an existing entry; remove takes it off. Destructive updates/removals require confirmation.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › brand_name
Brand name, up to 200 characters. For update/remove use its current name; matching ignores case and surrounding whitespace. Duplicate matches are refused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › new_brand_name
Update only: replacement name, up to 200 characters. Omit to keep the current name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › logo_url
HTTPS logo URL, up to 2048 characters. Omit on add to look up the logo by brand name. Omit on update to keep it; empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › website_domain
Website hostname with optional path, up to 200 characters: nike.com, not https://nike.com. No credentials, query, or fragment. Omit on update to keep it; empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › name_only
Optional on add. Skips the brand-logo lookup and writes the name alone. Use it when the creator wants no logo, not merely because they gave none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › confirmation_token
Opaque token from a needs_confirmation result. Required to commit a remove, or an update that clears or overwrites a non-empty field. Repeating the original arguments without this token does not write.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › placement › position
top or bottom. On page_layout, top is first after the header.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › placement › index
0-based index. On page_layout, 0 is the header and is refused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › placement › before
sibling identity
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_partner › placement › after
sibling identity
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › brand_name
Brand on the case study, up to 200 characters. Matching ignores case and surrounding whitespace. Identity is brand_name plus title; a new pair adds a row.
Clear enough to supply this argument.
case_study › title
Project title and the second half of row identity, up to 200 characters. Matching ignores case and surrounding whitespace. Always the title the row has NOW: on a retitle pass this one and put the replacement in new_title. Required for a new case study; omit on update to keep the stored title when that brand has exactly one study.
Clear enough to supply this argument.
case_study › new_title
Update only: replacement project title, up to 200 characters. The row is found by brand_name plus title and rewritten in place, keeping every other field. Omit unless the title is changing, and never pass it to create a case study.
Clear enough to supply this argument.
case_study › description
What you did and how it went, up to 2000 characters. Omit to keep the stored text; pass an empty string to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › time_period
When it ran, in your own words, e.g. "Summer 2026". Up to 200 characters. Omit to keep the stored period; pass an empty string to clear it.
Clear enough to supply this argument.
case_study › start_date
Calendar day the project started, YYYY-MM-DD. Omit to keep it; empty string clears it. Shown as a date beside time_period, which stays your own wording.
Clear enough to supply this argument.
case_study › end_date
Calendar day the project ended, YYYY-MM-DD. Omit to keep it; empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › rate_minor_units
What the brand paid, counted in the currency's smallest unit: 150000 is $1,500. Integer from 0 to 100000000000; null clears it. Never pass a face value. Pass rate_currency beside any amount.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › rate_currency
ISO 4217 code rate_minor_units is counted in. Required with any amount, and only usd is supported. Never send it alone.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › show_rate
Whether the rate is meant to be public. Stored on the case study, but the page prints the rate whenever one is set, so clear rate_minor_units to take an amount off the page.
Clear enough to supply this argument.
case_study › categories
Content categories for this project, replacing the stored list. Up to 5, each up to 200 characters; an empty array clears them. Omit to keep them.
Clear enough to supply this argument.
case_study › cover_image_url
Public https image across the top of this case study, up to 2048 characters. Omit to keep it; empty string clears it. This is not the Media Kit Cover Image.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › logo_url
Public https brand logo shown on this case study, up to 2048 characters. Omit to keep it; on a new case study an omitted logo is inherited from the brand elsewhere on the kit or looked up by name. Empty string clears it. Never touches the logo strip.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › website_domain
Brand hostname with optional path for this case study: nike.com, not https://nike.com. Up to 200 characters. Omit to keep it; empty string clears it. Never touches the logo strip.
Clear enough to supply this argument.
case_study › spotlight
true features this case study at the top of the block.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › hidden
true hides this case study from the public page without deleting it; false shows it again.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › deliverable › url
Post URL and row identity, up to 2048 characters. HTTP/HTTPS only. Paste the link the creator gives you: a watch or share URL is stored in the embed shape the page needs, and matching ignores scheme, letter case, trailing slashes, and which of those shapes was pasted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › deliverable › platform
Where the post lives. Pass it for a new deliverable: one stored without a platform never appears on the page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › deliverable › show_analytics
Show this post's own view, like, and comment counts. Defaults to true on a new deliverable.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › deliverables › items › url
Post URL and row identity, up to 2048 characters. HTTP/HTTPS only. Paste the link the creator gives you: a watch or share URL is stored in the embed shape the page needs, and matching ignores scheme, letter case, trailing slashes, and which of those shapes was pasted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › deliverables › items › platform
Where the post lives. Pass it for a new deliverable: one stored without a platform never appears on the page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Show this post's own view, like, and comment counts. Defaults to true on a new deliverable.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › custom_insight › title
Label under the figure, e.g. "Sales lift", up to 200 characters. Row identity, matched ignoring case and surrounding whitespace.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › custom_insight › value
The figure exactly as it should read, e.g. "+34%", up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › performance › show_total_views
Show total views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › performance › show_total_likes
Show total likes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › performance › show_total_comments
Show total comments.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › confirmation_token
Opaque token from a needs_confirmation result. Required to commit the proposed change. Repeating the original arguments without this token does not write.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › placement › position
top or bottom. On page_layout, top is first after the header.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › placement › index
0-based index. On page_layout, 0 is the header and is refused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › placement › before
sibling identity
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
case_study › placement › after
sibling identity
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › url
Link URL and row identity, up to 2048 characters. HTTP/HTTPS only; omitted scheme becomes HTTPS. Matching ignores scheme, letter case, and trailing slashes. A different URL addresses a different row, not a URL rename.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › title
Link label, up to 200 characters. Omit or pass blank text on update to keep the stored title; blank does not clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › action
add (default) creates a row or updates the matching URL. update requires a matching URL. Both apply immediately; remove is unsupported.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › subtitle
Secondary line. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › display
false hides this row only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › imageUrl
HTTPS image. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › picture
HTTPS picture. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › animation
Hover motion.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › open_in_new_tab
Open the URL in a new tab.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › countdown › anyOf › 0 › unix_time
Unix seconds.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Unix seconds when the row hides. After start; not past.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › placement › position
top or bottom. On page_layout, top is first after the header.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › placement › index
0-based index. On page_layout, 0 is the header and is refused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › placement › before
sibling identity
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_link › placement › after
sibling identity
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
change_summary
A few words in the creator's own terms describing the change, e.g. "making the background yellow". Omit when no concise summary is available. No names, emails, or other personal details.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmation_token
Token from a needs_confirmation result. Repeat the request with this token after user approval. A brand_partner or case_study token may also be passed inside that object. Chat still requires approval in a later user turn.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
oneOf › 0 › rate
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 1 › brand_partner
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 2 › case_study
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 3 › featured_link
Not provided
Missing description. Explain what this value means and how to supply it.
{
"name": "set_media_kit_portfolio",
"description": "Edit your Media Kit portfolio: add, update, hide, show, or remove manual rate-card prices; change past-partner logos; change case studies and the total views, likes and comments they display; or change featured portfolio/press links. Read get_media_kit first, then pass exactly one of rate, brand_partner, case_study, or featured_link. Rate update/remove uses rate_id, not the deliverable name, and remove requires confirmation. Set rate.display false to hide one line without deleting it and true to show it again. brand_partner, case_study, and featured_link share optional placement; case studies use brand_name plus title, and retitling one takes the title it has now plus new_title rather than a changed title alone. featured_link can set subtitle, image, open-in-new-tab, countdown, and scheduling (unix seconds); action add creates the links block when the kit has none, and action update still needs an existing row. Pass every supplied case-study post in deliverables to merge them in one edit. Post-only additions apply immediately, including new studies; analytics and other case-study field edits require confirmation in chat. Destructive rate or brand-partner edits require confirmation; additive partners, rate adds/updates, rate visibility, featured links, and placement-only moves apply immediately. This does not change brand deals, structured pricing, block visibility, or rate-card line order.",
"inputSchema": {
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"rate"
],
"properties": {
"rate": {}
}
},
{
"type": "object",
"required": [
"brand_partner"
],
"properties": {
"brand_partner": {}
}
},
{
"type": "object",
"required": [
"case_study"
],
"properties": {
"case_study": {}
}
},
{
"type": "object",
"required": [
"featured_link"
],
"properties": {
"featured_link": {}
}
}
],
"required": [],
"properties": {
"rate": {
"type": "object",
"required": [],
"properties": {
"action": {
"enum": [
"add",
"update",
"remove"
],
"type": "string",
"description": "add creates a line or updates the one matching deliverable for backwards compatibility; update changes the row named by rate_id; remove deletes that row after confirmation. Omit to keep the legacy add-or-update behavior."
},
"display": {
"type": "boolean",
"description": "false hides this rate-card line from the public Media Kit without deleting it; true shows it. Omit to keep its current visibility."
},
"rate_id": {
"type": "string",
"description": "Stable row identity from get_media_kit. Required for update and remove. Never pass the display position or deliverable name as an identity."
},
"price_usd": {
"type": "number",
"description": "USD price as written by the creator: 1500 means $1,500, not 15. Finite number from 0 to 10000000, rounded to two decimal places. Required for a new line; omit on update to keep its price. Other currencies are unsupported."
},
"deliverable": {
"type": "string",
"description": "Add only: deliverable name, e.g. \"Instagram Reel\", up to 200 characters. Matching an existing manual rate keeps the legacy non-duplicating add behavior. Update and remove keep the stored name."
},
"description": {
"type": "string",
"description": "Optional detail, e.g. \"includes one round of revisions\". Up to 2000 characters. Omit to leave the stored text; pass an empty string to clear it."
},
"confirmation_token": {
"type": "string",
"description": "Opaque token from a needs_confirmation result. Required to commit remove. Repeating the remove without this token does not write."
}
},
"description": "Add, update, hide, show, or remove one manual rate-card line. Update and remove address the stable rate_id returned by get_media_kit, so duplicate deliverable names stay distinct. Does not edit structured pricing, rename a line, or change line order.",
"additionalProperties": false
},
"case_study": {
"type": "object",
"required": [
"brand_name"
],
"properties": {
"title": {
"type": "string",
"description": "Project title and the second half of row identity, up to 200 characters. Matching ignores case and surrounding whitespace. Always the title the row has NOW: on a retitle pass this one and put the replacement in new_title. Required for a new case study; omit on update to keep the stored title when that brand has exactly one study."
},
"hidden": {
"type": "boolean",
"description": "true hides this case study from the public page without deleting it; false shows it again."
},
"end_date": {
"type": "string",
"description": "Calendar day the project ended, YYYY-MM-DD. Omit to keep it; empty string clears it."
},
"logo_url": {
"type": "string",
"description": "Public https brand logo shown on this case study, up to 2048 characters. Omit to keep it; on a new case study an omitted logo is inherited from the brand elsewhere on the kit or looked up by name. Empty string clears it. Never touches the logo strip."
},
"new_title": {
"type": "string",
"description": "Update only: replacement project title, up to 200 characters. The row is found by brand_name plus title and rewritten in place, keeping every other field. Omit unless the title is changing, and never pass it to create a case study."
},
"placement": {
"type": "object",
"properties": {
"after": {
"type": "string",
"description": "sibling identity"
},
"index": {
"type": "integer",
"minimum": 0,
"description": "0-based index. On page_layout, 0 is the header and is refused."
},
"before": {
"type": "string",
"description": "sibling identity"
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "top or bottom. On page_layout, top is first after the header."
}
},
"description": "Exactly one of position, index, before, or after.",
"additionalProperties": false
},
"show_rate": {
"type": "boolean",
"description": "Whether the rate is meant to be public. Stored on the case study, but the page prints the rate whenever one is set, so clear rate_minor_units to take an amount off the page."
},
"spotlight": {
"type": "boolean",
"description": "true features this case study at the top of the block."
},
"brand_name": {
"type": "string",
"description": "Brand on the case study, up to 200 characters. Matching ignores case and surrounding whitespace. Identity is brand_name plus title; a new pair adds a row."
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "Content categories for this project, replacing the stored list. Up to 5, each up to 200 characters; an empty array clears them. Omit to keep them."
},
"start_date": {
"type": "string",
"description": "Calendar day the project started, YYYY-MM-DD. Omit to keep it; empty string clears it. Shown as a date beside time_period, which stays your own wording."
},
"deliverable": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Post URL and row identity, up to 2048 characters. HTTP/HTTPS only. Paste the link the creator gives you: a watch or share URL is stored in the embed shape the page needs, and matching ignores scheme, letter case, trailing slashes, and which of those shapes was pasted."
},
"platform": {
"enum": [
"instagram",
"tiktok",
"youtube",
"twitter",
"twitch"
],
"type": "string",
"description": "Where the post lives. Pass it for a new deliverable: one stored without a platform never appears on the page."
},
"show_analytics": {
"type": "boolean",
"description": "Show this post's own view, like, and comment counts. Defaults to true on a new deliverable."
}
},
"description": "One post produced for the project, added or updated on its own so the other deliverables are left alone. Removing one is unsupported.",
"additionalProperties": false
},
"description": {
"type": "string",
"description": "What you did and how it went, up to 2000 characters. Omit to keep the stored text; pass an empty string to clear it."
},
"performance": {
"type": "object",
"required": [],
"properties": {
"show_total_likes": {
"type": "boolean",
"description": "Show total likes."
},
"show_total_views": {
"type": "boolean",
"description": "Show total views."
},
"show_total_comments": {
"type": "boolean",
"description": "Show total comments."
}
},
"description": "Which totals across every deliverable the page shows. Beacons computes the numbers from the posts; these only choose what is displayed. A new case study starts with all three on, matching the Beacons editor; omit them unless the creator asks for a total to be hidden.",
"additionalProperties": false
},
"time_period": {
"type": "string",
"description": "When it ran, in your own words, e.g. \"Summer 2026\". Up to 200 characters. Omit to keep the stored period; pass an empty string to clear it."
},
"deliverables": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Post URL and row identity, up to 2048 characters. HTTP/HTTPS only. Paste the link the creator gives you: a watch or share URL is stored in the embed shape the page needs, and matching ignores scheme, letter case, trailing slashes, and which of those shapes was pasted."
},
"platform": {
"enum": [
"instagram",
"tiktok",
"youtube",
"twitter",
"twitch"
],
"type": "string",
"description": "Where the post lives. Pass it for a new deliverable: one stored without a platform never appears on the page."
},
"show_analytics": {
"type": "boolean",
"description": "Show this post's own view, like, and comment counts. Defaults to true on a new deliverable."
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "Attach or update 1 to 100 posts together, merging by URL and preserving other posts. Include every supplied URL. URLs must be distinct after normalization. Pass this or deliverable, not both."
},
"rate_currency": {
"enum": [
"usd"
],
"type": "string",
"description": "ISO 4217 code rate_minor_units is counted in. Required with any amount, and only usd is supported. Never send it alone."
},
"custom_insight": {
"type": "object",
"required": [
"title",
"value"
],
"properties": {
"title": {
"type": "string",
"description": "Label under the figure, e.g. \"Sales lift\", up to 200 characters. Row identity, matched ignoring case and surrounding whitespace."
},
"value": {
"type": "string",
"description": "The figure exactly as it should read, e.g. \"+34%\", up to 200 characters."
}
},
"description": "One named result, added or updated on its own so the other insights are left alone. Removing one is unsupported.",
"additionalProperties": false
},
"website_domain": {
"type": "string",
"description": "Brand hostname with optional path for this case study: nike.com, not https://nike.com. Up to 200 characters. Omit to keep it; empty string clears it. Never touches the logo strip."
},
"cover_image_url": {
"type": "string",
"description": "Public https image across the top of this case study, up to 2048 characters. Omit to keep it; empty string clears it. This is not the Media Kit Cover Image."
},
"rate_minor_units": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
],
"description": "What the brand paid, counted in the currency's smallest unit: 150000 is $1,500. Integer from 0 to 100000000000; null clears it. Never pass a face value. Pass rate_currency beside any amount."
},
"confirmation_token": {
"type": "string",
"description": "Opaque token from a needs_confirmation result. Required to commit the proposed change. Repeating the original arguments without this token does not write."
}
},
"description": "Add, update, or retitle a case study by brand_name plus title: the story, the dates, the rate, the posts that ran, and the results. Two studies for the same brand are distinct rows. To retitle one, pass the title it has now plus new_title — passing a changed title alone addresses a different row, not a rename. Use deliverables for all supplied posts in one edit, preserving other posts. Post-only additions with brand_name and title apply immediately, including a new case study; changes to analytics or other fields require confirmation in chat. A placement-only move of an existing row applies immediately. Pass brand_name and at least one other field; omitted fields keep their stored value. This does not edit the logo strip or delete a case study, deliverable, or insight.",
"additionalProperties": false
},
"brand_partner": {
"type": "object",
"required": [
"action",
"brand_name"
],
"properties": {
"action": {
"enum": [
"add",
"update",
"remove"
],
"type": "string",
"description": "add puts a brand on the logo strip; update changes an existing entry; remove takes it off. Destructive updates/removals require confirmation."
},
"logo_url": {
"type": "string",
"description": "HTTPS logo URL, up to 2048 characters. Omit on add to look up the logo by brand name. Omit on update to keep it; empty string clears it."
},
"name_only": {
"type": "boolean",
"description": "Optional on add. Skips the brand-logo lookup and writes the name alone. Use it when the creator wants no logo, not merely because they gave none."
},
"placement": {
"type": "object",
"properties": {
"after": {
"type": "string",
"description": "sibling identity"
},
"index": {
"type": "integer",
"minimum": 0,
"description": "0-based index. On page_layout, 0 is the header and is refused."
},
"before": {
"type": "string",
"description": "sibling identity"
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "top or bottom. On page_layout, top is first after the header."
}
},
"description": "Exactly one of position, index, before, or after.",
"additionalProperties": false
},
"brand_name": {
"type": "string",
"description": "Brand name, up to 200 characters. For update/remove use its current name; matching ignores case and surrounding whitespace. Duplicate matches are refused."
},
"new_brand_name": {
"type": "string",
"description": "Update only: replacement name, up to 200 characters. Omit to keep the current name."
},
"website_domain": {
"type": "string",
"description": "Website hostname with optional path, up to 200 characters: nike.com, not https://nike.com. No credentials, query, or fragment. Omit on update to keep it; empty string clears it."
},
"confirmation_token": {
"type": "string",
"description": "Opaque token from a needs_confirmation result. Required to commit a remove, or an update that clears or overwrites a non-empty field. Repeating the original arguments without this token does not write."
}
},
"description": "Add, update, or remove one past-partner logo-strip entry. Use the separate case_study object for case studies; removing a logo leaves the case study intact.",
"additionalProperties": false
},
"featured_link": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Link URL and row identity, up to 2048 characters. HTTP/HTTPS only; omitted scheme becomes HTTPS. Matching ignores scheme, letter case, and trailing slashes. A different URL addresses a different row, not a URL rename."
},
"title": {
"type": "string",
"description": "Link label, up to 200 characters. Omit or pass blank text on update to keep the stored title; blank does not clear it."
},
"action": {
"enum": [
"add",
"update"
],
"type": "string",
"description": "add (default) creates a row or updates the matching URL. update requires a matching URL. Both apply immediately; remove is unsupported."
},
"display": {
"type": "boolean",
"description": "false hides this row only."
},
"picture": {
"type": "string",
"description": "HTTPS picture. Empty string clears it."
},
"imageUrl": {
"type": "string",
"description": "HTTPS image. Empty string clears it."
},
"subtitle": {
"type": "string",
"description": "Secondary line. Empty string clears it."
},
"animation": {
"enum": [
"none",
"bounce",
"jello",
"pulse",
"shake",
"tada",
"wobble"
],
"type": "string",
"description": "Hover motion."
},
"countdown": {
"anyOf": [
{
"type": "object",
"required": [
"unix_time"
],
"properties": {
"unix_time": {
"type": "integer",
"description": "Unix seconds."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Countdown in unix seconds. Null clears it."
},
"placement": {
"type": "object",
"properties": {
"after": {
"type": "string",
"description": "sibling identity"
},
"index": {
"type": "integer",
"minimum": 0,
"description": "0-based index. On page_layout, 0 is the header and is refused."
},
"before": {
"type": "string",
"description": "sibling identity"
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "top or bottom. On page_layout, top is first after the header."
}
},
"description": "Exactly one of position, index, before, or after.",
"additionalProperties": false
},
"scheduling": {
"anyOf": [
{
"type": "object",
"properties": {
"end_unix_time": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Unix seconds when the row hides. After start; not past."
},
"start_unix_time": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Unix seconds when the row appears."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Appear/hide window in unix seconds. Null clears it."
},
"open_in_new_tab": {
"type": "boolean",
"description": "Open the URL in a new tab."
}
},
"description": "Add or update a portfolio, press, or campaign link. action add creates the links block when the kit has none. Does not delete a link or change block visibility.",
"additionalProperties": false
},
"change_summary": {
"type": "string",
"maxLength": 80,
"description": "A few words in the creator's own terms describing the change, e.g. \"making the background yellow\". Omit when no concise summary is available. No names, emails, or other personal details."
},
"confirmation_token": {
"type": "string",
"description": "Token from a needs_confirmation result. Repeat the request with this token after user approval. A brand_partner or case_study token may also be passed inside that object. Chat still requires approval in a later user turn."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [],
"properties": {
"status": {
"type": "string"
},
"media_kit_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"confirmation_token": {
"type": "string"
}
},
"additionalProperties": true
},
"annotations": {
"title": "set media kit portfolio",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Change Media Kit text, button and card colors with their hover states, the font, the corner preset, the background color, accents, the webpage/resume header layout, Cover Image, whole-block visibility, page_layout order and where a block sits by position, or featured-links layout. Read get_media_kit (whole kit or section design), then pass exactly one of appearance, cover, block_visibility, order, or featured_links. New color treatments are solid-only: background_color writes both surfaces and is refused on a stored non-solid background unless the same call sets background_type to solid, while background_color1 paints the whole main kit and background_color2 paints social analytics below it. Passing the individual colors preserves any existing legacy treatment. Unreadable color pairs are refused; text on a background image or video already stored cannot be contrast-checked (card, button, and accent pairs still are). Link in Bio page settings that share the same stored document are not editable here, and naming one says so. featured_links is the block heading and layout — column count, carousel, image aspect ratio and text alignment — not the rows. Hiding is not deletion; this does not edit individual social metrics. Changes apply immediately; omitted fields stay unchanged.
Describe the returned information so the agent knows whether it will answer the request.
Inputs68/100
46 of 53 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
appearance › background_color
Solid hex; writes both surfaces. Refused when the stored background is non-solid unless this call sets background_type to solid, and refused if the surfaces already differ.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › background_color1
Whole main Media Kit surface hex in solid mode. Preserves the existing treatment. Not with background_color.
Clear enough to supply this argument.
appearance › background_color2
Social analytics surface below the main Media Kit, hex in solid mode. Preserves the existing treatment. Not with background_color.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › background_type
Background kind. The Customize palette only paints solid.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › text_color
Body text hex.
Clear enough to supply this argument.
appearance › text_hover_color
Text hover hex.
Clear enough to supply this argument.
appearance › button_color
Button fill hex.
Clear enough to supply this argument.
appearance › button_text_color
Button label hex.
Clear enough to supply this argument.
appearance › button_hover_background_color
Button hover fill hex.
Clear enough to supply this argument.
appearance › card_color
Card fill hex.
Clear enough to supply this argument.
appearance › font_family
CSS font-family list, up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › component_shape
Corner preset. Does not choose webpage/resume layout.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › layout
Header arrangement. Does not reorder content blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › accent_color1
Primary accent color hex.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › accent_color2
Second accent color hex, retained for existing legacy treatments.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › accent_type
How the accent pair renders. The Customize palette only paints solid.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › accent_text_color
Text over the accent, hex.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cover › cover_image_url
Reachable HTTPS Cover Image URL, up to 2048 characters. Empty string removes it. Recommended size: 2800×1200. For chat uploads use media_id.
Clear enough to supply this argument.
cover › media_id
Creator-owned gallery photo UUID from a chat upload or search_media. Copies it into My Media for the Cover Image. Do not combine with cover_image_url.
Clear enough to supply this argument.
cover › anyOf › 0 › cover_image_url
Not provided
Missing description. Explain what this value means and how to supply it.
cover › anyOf › 1 › media_id
Not provided
Missing description. Explain what this value means and how to supply it.
block_visibility › block
Block to show/hide: text_block is About/bio; rates is the rate card; case_studies is past projects, not brand_logos (partner logos). Social names select one platform. Aliases: bio/about/text, rate card, past partners/logo strip, and brand_partnerships/past_projects/collaborations for case studies.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
block_visibility › displayed
true shows the block; false hides it without deleting content. Showing does not unlock a gated block. The read uses displayed, or rates_displayed for the rate card.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
order › block
Block to move. Same names as block_visibility. The header cannot be moved.
Explain the meaning of this value, not just its name.
order › position
top or bottom. On page_layout, top is first after the header.
Explain the meaning of this value, not just its name.
order › index
0-based index. On page_layout, 0 is the header and is refused.
Explain the meaning of this value, not just its name.
order › before
sibling identity
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
order › after
sibling identity
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › headline
Block heading. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › description
Block description. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › link_type
carousel or classic.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › collapse_style
collapsed or exposed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › block_size
small or large.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › image_placement
left, right, or alternating.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › filter_overlay
light, dark, or none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › carousel_image_aspect_ratio
Carousel image crop.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › carousel_text_alignment
Carousel text alignment.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › one_column_image_aspect_ratio
Single-column image crop.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › show_text
Show titles on image layouts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › text_alignment
left, center, or right.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › text_position
none, top, center, or bottom.
Clear enough to supply this argument.
featured_links › text_size
small, medium, large, or xLarge.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › wrap_text
Wrap long titles.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › box_shadow
Show a row shadow.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
featured_links › link_outline
Show a row outline.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
change_summary
A few words in the creator's own terms describing the change, e.g. "making the background yellow". Omit when no concise summary is available. No names, emails, or other personal details.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmation_token
Token from a needs_confirmation result. Repeat the request with this token after user approval. A brand_partner or case_study token may also be passed inside that object. Chat still requires approval in a later user turn.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
oneOf › 0 › appearance
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 1 › cover
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 2 › block_visibility
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 3 › order
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 4 › featured_links
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Add a social-statistics block, rename its handle, show or hide statistics, set the stat range every stats block reports over (30 or 90 days, or the last 10 or 20 posts — nothing longer than 90 days exists, so a year of stats cannot go on the Media Kit), edit the follower strip — including adding, updating, or removing a manual follower count for a platform with no account attached — or type in the audience age, gender, top countries and top cities by hand for instagram or tiktok when the platform gives no Insights. Read get_media_kit (section social). Pass exactly one of platform, followers, demographics, or stat_range. For a stats block, pass platform; username to add or rename; metrics as display* names from that read to booleans. Omitted names stay stored; invalid names are refused with the valid list. This does not connect an account: to connect or reconnect one, call list_connections and give the creator the fix_url it returns — never ask for an OAuth token. Removing a manual follower count requires confirmation; add and update apply immediately. Synced or scraped rows cannot be removed — hide them with followers.display false. demographics values are percentages of the whole audience and are stored as creator-entered estimates shown only where Insights are missing — never report them to a brand as measured. Whole-block visibility is set_media_kit_design.
The description explains the capability, when to use it, and what to expect.
Inputs51/100
22 of 33 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
username
Handle without @, spaces, or a URL, up to 200 characters. Required when adding a block; omit to keep the stored handle.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
metrics
display* names to booleans. true shows; false hides. Names invalid for this platform are refused. Omitted names stay stored.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followers › action
add (default) creates a row or updates the matching platform. update requires a matching platform: a manual count for num_followers, or a synced or scraped row for display. remove deletes a matching manual count after confirmation. Add and update apply immediately.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followers › platform
Platform key and row identity, e.g. lemon8, bluesky, or instagram, up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followers › display
true shows this platform on the strip; false hides it without hiding the followers block.
Clear enough to supply this argument.
followers › platform_username
Handle on a synced or scraped strip row, without @, spaces, or a URL. Required when several accounts share the platform.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followers › platform_value
Handle for a manual count, without @, spaces, or a URL, up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followers › platform_url
HTTPS profile URL for a manual count, up to 2048 characters. Required when adding a manual count so it appears on the page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followers › num_followers
Integer follower count, 1 to 1000000000. Required when adding a manual count. Refused while an account for that platform is attached to this Beacons account, or the strip has a scraped row for it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followers › confirmation_token
Opaque token from a needs_confirmation result. Required to commit a remove. Repeating the original arguments without this token does not write. Chat still requires approval in a later user turn.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
stat_range
The one window every social statistics block reports post-derived numbers over: last_30_days (default), last_90_days, last_10_posts, or last_20_posts. Applies to all platforms at once. Nothing longer than 90 days is available. Applies immediately.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
demographics › platform
instagram or tiktok. Other platforms store no manual audience splits.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
demographics › username
Handle these numbers belong to, without @, spaces, or a URL. Omit to use the handle on this platform’s Media Kit block, which is the only one that can display them.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
demographics › age_gender › female
Percent of the audience that is female, 0 to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
demographics › age_gender › male
Percent of the audience that is male, 0 to 100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
demographics › age_gender › age › 13-17
Not provided
Missing description. Explain what this value means and how to supply it.
demographics › age_gender › age › 18-24
Not provided
Missing description. Explain what this value means and how to supply it.
demographics › age_gender › age › 25-34
Not provided
Missing description. Explain what this value means and how to supply it.
demographics › age_gender › age › 35-44
Not provided
Missing description. Explain what this value means and how to supply it.
demographics › age_gender › age › 45-54
Not provided
Missing description. Explain what this value means and how to supply it.
demographics › age_gender › age › 55-64
Not provided
Missing description. Explain what this value means and how to supply it.
demographics › age_gender › age › 65-
Not provided
Missing description. Explain what this value means and how to supply it.
demographics › top_countries › items › code
Two-letter ISO country code, e.g. US, GB, PH.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
demographics › top_countries › items › value
Percent of the audience in this country.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
demographics › top_cities › items › name
City as it should read on the page, e.g. Los Angeles, California.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
demographics › top_cities › items › value
Percent of the audience in this city.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
change_summary
A few words in the creator's own terms describing the change, e.g. "making the background yellow". Omit when no concise summary is available. No names, emails, or other personal details.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmation_token
Token from a needs_confirmation result. Repeat the same fields with this token after user approval. May also be passed inside followers. Chat still requires approval in a later user turn.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
oneOf › 0 › platform
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 1 › followers
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 2 › demographics
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 3 › stat_range
Not provided
Missing description. Explain what this value means and how to supply it.
{
"name": "set_media_kit_social",
"description": "Add a social-statistics block, rename its handle, show or hide statistics, set the stat range every stats block reports over (30 or 90 days, or the last 10 or 20 posts — nothing longer than 90 days exists, so a year of stats cannot go on the Media Kit), edit the follower strip — including adding, updating, or removing a manual follower count for a platform with no account attached — or type in the audience age, gender, top countries and top cities by hand for instagram or tiktok when the platform gives no Insights. Read get_media_kit (section social). Pass exactly one of platform, followers, demographics, or stat_range. For a stats block, pass platform; username to add or rename; metrics as display* names from that read to booleans. Omitted names stay stored; invalid names are refused with the valid list. This does not connect an account: to connect or reconnect one, call list_connections and give the creator the fix_url it returns — never ask for an OAuth token. Removing a manual follower count requires confirmation; add and update apply immediately. Synced or scraped rows cannot be removed — hide them with followers.display false. demographics values are percentages of the whole audience and are stored as creator-entered estimates shown only where Insights are missing — never report them to a brand as measured. Whole-block visibility is set_media_kit_design.",
"inputSchema": {
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"platform"
],
"properties": {
"platform": {}
}
},
{
"type": "object",
"required": [
"followers"
],
"properties": {
"followers": {}
}
},
{
"type": "object",
"required": [
"demographics"
],
"properties": {
"demographics": {}
}
},
{
"type": "object",
"required": [
"stat_range"
],
"properties": {
"stat_range": {}
}
}
],
"required": [],
"properties": {
"metrics": {
"type": "object",
"description": "display* names to booleans. true shows; false hides. Names invalid for this platform are refused. Omitted names stay stored.",
"additionalProperties": {
"type": "boolean"
}
},
"platform": {
"enum": [
"instagram",
"youtube",
"tiktok",
"twitter",
"twitch",
"facebook",
"snapchat",
"threads",
"linkedin",
"pinterest"
],
"type": "string",
"description": "One of: instagram, youtube, tiktok, twitter, twitch, facebook, snapchat, threads, linkedin, pinterest."
},
"username": {
"type": "string",
"description": "Handle without @, spaces, or a URL, up to 200 characters. Required when adding a block; omit to keep the stored handle."
},
"followers": {
"type": "object",
"required": [
"platform"
],
"properties": {
"action": {
"enum": [
"add",
"update",
"remove"
],
"type": "string",
"description": "add (default) creates a row or updates the matching platform. update requires a matching platform: a manual count for num_followers, or a synced or scraped row for display. remove deletes a matching manual count after confirmation. Add and update apply immediately."
},
"display": {
"type": "boolean",
"description": "true shows this platform on the strip; false hides it without hiding the followers block."
},
"platform": {
"type": "string",
"description": "Platform key and row identity, e.g. lemon8, bluesky, or instagram, up to 200 characters."
},
"platform_url": {
"type": "string",
"description": "HTTPS profile URL for a manual count, up to 2048 characters. Required when adding a manual count so it appears on the page."
},
"num_followers": {
"type": "integer",
"maximum": 1000000000,
"minimum": 1,
"description": "Integer follower count, 1 to 1000000000. Required when adding a manual count. Refused while an account for that platform is attached to this Beacons account, or the strip has a scraped row for it."
},
"platform_value": {
"type": "string",
"description": "Handle for a manual count, without @, spaces, or a URL, up to 200 characters."
},
"platform_username": {
"type": "string",
"description": "Handle on a synced or scraped strip row, without @, spaces, or a URL. Required when several accounts share the platform."
},
"confirmation_token": {
"type": "string",
"description": "Opaque token from a needs_confirmation result. Required to commit a remove. Repeating the original arguments without this token does not write. Chat still requires approval in a later user turn."
}
},
"description": "Add, update, or remove one follower-strip row. Manual counts are keyed on platform. remove deletes a matching manual count after confirmation; a synced or scraped row cannot be removed — hide it with display false. This does not connect an account: for that call list_connections and give the creator its fix_url. Whole-block visibility is set_media_kit_design.",
"additionalProperties": false
},
"stat_range": {
"enum": [
"last_30_days",
"last_90_days",
"last_10_posts",
"last_20_posts"
],
"type": "string",
"description": "The one window every social statistics block reports post-derived numbers over: last_30_days (default), last_90_days, last_10_posts, or last_20_posts. Applies to all platforms at once. Nothing longer than 90 days is available. Applies immediately."
},
"demographics": {
"type": "object",
"anyOf": [
{
"required": [
"age_gender"
]
},
{
"required": [
"top_countries"
]
},
{
"required": [
"top_cities"
]
}
],
"required": [
"platform"
],
"properties": {
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "instagram or tiktok. Other platforms store no manual audience splits."
},
"username": {
"type": "string",
"description": "Handle these numbers belong to, without @, spaces, or a URL. Omit to use the handle on this platform’s Media Kit block, which is the only one that can display them."
},
"age_gender": {
"type": "object",
"required": [
"female",
"male",
"age"
],
"properties": {
"age": {
"type": "object",
"required": [
"13-17",
"18-24",
"25-34",
"35-44",
"45-54",
"55-64",
"65-"
],
"properties": {
"65-": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"13-17": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"18-24": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"25-34": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"35-44": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"45-54": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"55-64": {
"type": "number",
"maximum": 100,
"minimum": 0
}
},
"description": "Percent of the audience in each bucket. All seven are required: 13-17, 18-24, 25-34, 35-44, 45-54, 55-64, 65-.",
"additionalProperties": false
},
"male": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Percent of the audience that is male, 0 to 100."
},
"female": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Percent of the audience that is female, 0 to 100."
}
},
"description": "Whole age and gender breakdown. Send female, male, and every age bucket together — the stored per-gender breakdown is computed across all of them, so a partial map is refused. On instagram and tiktok the page renormalizes female and male to total 100, so they can read back different from what was sent.",
"additionalProperties": false
},
"top_cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"value"
],
"properties": {
"name": {
"type": "string",
"description": "City as it should read on the page, e.g. Los Angeles, California."
},
"value": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Percent of the audience in this city."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1,
"description": "Top audience cities, 1 to 10 rows. Replaces the whole stored list. Leave out to keep what is stored; this cannot clear a saved list."
},
"top_countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"code",
"value"
],
"properties": {
"code": {
"type": "string",
"description": "Two-letter ISO country code, e.g. US, GB, PH."
},
"value": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Percent of the audience in this country."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1,
"description": "Top audience countries, 1 to 10 rows. Replaces the whole stored list. Leave out to keep what is stored; this cannot clear a saved list."
}
},
"description": "Audience splits the creator types in by hand for instagram or tiktok, shown where the platform supplies no Insights. Every value is a percentage of the whole audience, 0 to 100, and each group must total 100 or less. Send any of age_gender, top_countries, top_cities; omitted ones keep their stored values. These are creator estimates, never measured platform data.",
"additionalProperties": false
},
"change_summary": {
"type": "string",
"maxLength": 80,
"description": "A few words in the creator's own terms describing the change, e.g. \"making the background yellow\". Omit when no concise summary is available. No names, emails, or other personal details."
},
"confirmation_token": {
"type": "string",
"description": "Token from a needs_confirmation result. Repeat the same fields with this token after user approval. May also be passed inside followers. Chat still requires approval in a later user turn."
}
},
"description": "Pass exactly one of platform (stats block), followers (follower strip), demographics, or stat_range.",
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [],
"properties": {
"note": {
"type": "string"
},
"saved": {
"type": "array",
"items": {
"type": "string"
}
},
"failed": {
"type": "array",
"items": {
"type": "string"
}
},
"status": {
"type": "string"
},
"metrics": {
"type": "object",
"additionalProperties": {
"type": "boolean"
}
},
"platform": {
"type": "string"
},
"username": {
"type": "string"
},
"displayed": {
"type": "boolean"
},
"stat_range": {
"type": "string"
},
"media_kit_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"confirmation_token": {
"type": "string"
},
"manual_demographics": {
"anyOf": [
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
},
"previous_stat_range": {
"type": "string"
}
},
"additionalProperties": true
},
"annotations": {
"title": "set media kit social",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Publish or unpublish your Media Kit, set visitor gating and tracking, edit search and link-preview title and description, or set sharing. Pass only fields to change. Turning a visitor gate on decides what all seven sections do, so a kit that has never chosen its locked sections needs lock and locked_blocks together — gating the rate card alone means rates true and the other six false. Tightening privacy or turning tracking off applies immediately. Publishing, exposing more content, or turning tracking on requires confirmation. "Make it private" is four different results here — taking the whole page down, gating it behind a visitor email or password, gating single sections such as the rate card, and opting out of Beacons opportunity sharing — so ask which one before writing, and never default to taking the page down, the only one that breaks links a brand already holds. The public web address and the kit page list are not editable here; get_media_kit still reports both. Does not reveal hidden blocks, set a password, or delete the kit.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
enabled
Whether the Media Kit is public. False takes the whole page down for visitors; it does not delete anything.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
lock
What a visitor must do to see the locked blocks. "unlocked" means anyone with the link sees everything. "email" asks for their email, "password" for the password set in Beacons, "approved_access" makes you approve each visitor, and "brand_deal_offer" asks them to send a deal request first. Turning a gate on for a kit that has never chosen locked sections requires locked_blocks in the same call. "password" opens only for a password set in the Beacons editor, which this tool cannot set or read — a kit with none rejects every visitor, so say where it is set whenever this gate goes on.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
locked_blocks › contact_form
Gate the collaboration contact form.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
locked_blocks › text
Gate the About/bio text section.
Clear enough to supply this argument.
locked_blocks › rates
Gate the rate card and its prices.
Clear enough to supply this argument.
locked_blocks › past_projects
Gate case studies/past projects, not the brand-logo strip.
Clear enough to supply this argument.
locked_blocks › brand_logos
Gate the past-partner logo strip, not case studies.
Clear enough to supply this argument.
locked_blocks › social_analytics
Gate social statistics across platforms, not one metric or platform.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
locked_blocks › links
Gate the featured portfolio, press, and campaign links.
Clear enough to supply this argument.
should_track_media_kit_visitors
Record visitor identities. False tightens privacy and applies immediately; true requires confirmation. Grouped with gating, not SEO.
Clear enough to supply this argument.
marketing › meta_title
Search and tab title, up to 100 characters. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
marketing › meta_description
Search description, up to 300 characters. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
allow_share_media_kit
Let Beacons share this kit with opportunities in the network.
Clear enough to supply this argument.
change_summary
A few words in the creator's own terms describing the change, e.g. "making the background yellow". Omit when no concise summary is available. No names, emails, or other personal details.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmation_token
Token from a needs_confirmation result. Repeat the request with this token after user approval. A brand_partner or case_study token may also be passed inside that object. Chat still requires approval in a later user turn.
{
"name": "set_media_kit_settings",
"description": "Publish or unpublish your Media Kit, set visitor gating and tracking, edit search and link-preview title and description, or set sharing. Pass only fields to change. Turning a visitor gate on decides what all seven sections do, so a kit that has never chosen its locked sections needs lock and locked_blocks together — gating the rate card alone means rates true and the other six false. Tightening privacy or turning tracking off applies immediately. Publishing, exposing more content, or turning tracking on requires confirmation. \"Make it private\" is four different results here — taking the whole page down, gating it behind a visitor email or password, gating single sections such as the rate card, and opting out of Beacons opportunity sharing — so ask which one before writing, and never default to taking the page down, the only one that breaks links a brand already holds. The public web address and the kit page list are not editable here; get_media_kit still reports both. Does not reveal hidden blocks, set a password, or delete the kit.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"lock": {
"enum": [
"unlocked",
"email",
"password",
"approved_access",
"brand_deal_offer"
],
"type": "string",
"description": "What a visitor must do to see the locked blocks. \"unlocked\" means anyone with the link sees everything. \"email\" asks for their email, \"password\" for the password set in Beacons, \"approved_access\" makes you approve each visitor, and \"brand_deal_offer\" asks them to send a deal request first. Turning a gate on for a kit that has never chosen locked sections requires locked_blocks in the same call. \"password\" opens only for a password set in the Beacons editor, which this tool cannot set or read — a kit with none rejects every visitor, so say where it is set whenever this gate goes on."
},
"enabled": {
"type": "boolean",
"description": "Whether the Media Kit is public. False takes the whole page down for visitors; it does not delete anything."
},
"marketing": {
"type": "object",
"properties": {
"meta_title": {
"type": "string",
"description": "Search and tab title, up to 100 characters. Empty string clears it."
},
"meta_description": {
"type": "string",
"description": "Search description, up to 300 characters. Empty string clears it."
}
},
"description": "Search and link-preview title and description. Same field-merge as Link in Bio SEO: named keys only; empty string clears.",
"additionalProperties": false
},
"locked_blocks": {
"type": "object",
"properties": {
"text": {
"type": "boolean",
"description": "Gate the About/bio text section."
},
"links": {
"type": "boolean",
"description": "Gate the featured portfolio, press, and campaign links."
},
"rates": {
"type": "boolean",
"description": "Gate the rate card and its prices."
},
"brand_logos": {
"type": "boolean",
"description": "Gate the past-partner logo strip, not case studies."
},
"contact_form": {
"type": "boolean",
"description": "Gate the collaboration contact form."
},
"past_projects": {
"type": "boolean",
"description": "Gate case studies/past projects, not the brand-logo strip."
},
"social_analytics": {
"type": "boolean",
"description": "Gate social statistics across platforms, not one metric or platform."
}
},
"description": "Sections requiring the selected visitor gate: true gates; false allows access without unlocking. Only named sections change; an omitted section keeps whatever it is stored as, and a section stored as nothing counts as gated. So turning a gate on for a kit that has never chosen its locked sections must name true or false for all seven here, in the same call as lock — read get_media_kit settings first and send back what each section is already set to, rather than gating a section the creator had open. No gating effect while lock is unlocked. Does not show hidden blocks; visibility is separate.",
"additionalProperties": false
},
"change_summary": {
"type": "string",
"maxLength": 80,
"description": "A few words in the creator's own terms describing the change, e.g. \"making the background yellow\". Omit when no concise summary is available. No names, emails, or other personal details."
},
"confirmation_token": {
"type": "string",
"description": "Token from a needs_confirmation result. Repeat the request with this token after user approval. A brand_partner or case_study token may also be passed inside that object. Chat still requires approval in a later user turn."
},
"allow_share_media_kit": {
"type": "boolean",
"description": "Let Beacons share this kit with opportunities in the network."
},
"should_track_media_kit_visitors": {
"type": "boolean",
"description": "Record visitor identities. False tightens privacy and applies immediately; true requires confirmation. Grouped with gating, not SEO."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [],
"properties": {
"status": {
"type": "string"
},
"media_kit_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"confirmation_token": {
"type": "string"
}
},
"additionalProperties": true
},
"annotations": {
"title": "set media kit settings",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Change your email sender settings: the default from-name and reply-to address for broadcasts and automated emails, so replies land in the inbox you choose, your email logo, footer social links, single- or double-opt-in mode, and whether the Beacons logo shows in your email footer. The sender (From) address itself is read-only. Pass any subset; each field you pass REPLACES the current value, and social_links replaces the whole list — call get_email_marketing_settings first so you keep what you did not mean to change. Setting show_beacons_logo to false is refused unless your plan includes email branding: the call returns status needs_upgrade and writes nothing at all, including the other fields it carried. Setting it back to true works on any plan. This does not touch your SendGrid API key or your subscriber lists — neither is editable through this tool.
The description explains the capability, when to use it, and what to expect.
Inputs64/100
5 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
from_name
Sender name shown on broadcasts.
Clear enough to supply this argument.
reply_to_email
Reply-to address for broadcasts.
Clear enough to supply this argument.
logo_url
https URL of the logo shown in emails.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
social_links › items › platform
Not provided
Missing description. Explain what this value means and how to supply it.
social_links › items › url
Not provided
Missing description. Explain what this value means and how to supply it.
is_double_opt_in_enabled
True for double opt-in confirmation; false for single opt-in.
Explain what happens when this optional value is omitted.
show_beacons_logo
Show the Beacons logo in your email footer. False hides it and needs a plan that includes email branding; true works on any plan.
{
"name": "set_email_marketing_settings",
"description": "Change your email sender settings: the default from-name and reply-to address for broadcasts and automated emails, so replies land in the inbox you choose, your email logo, footer social links, single- or double-opt-in mode, and whether the Beacons logo shows in your email footer. The sender (From) address itself is read-only. Pass any subset; each field you pass REPLACES the current value, and social_links replaces the whole list — call get_email_marketing_settings first so you keep what you did not mean to change. Setting show_beacons_logo to false is refused unless your plan includes email branding: the call returns status needs_upgrade and writes nothing at all, including the other fields it carried. Setting it back to true works on any plan. This does not touch your SendGrid API key or your subscriber lists — neither is editable through this tool.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"logo_url": {
"type": "string",
"description": "https URL of the logo shown in emails."
},
"from_name": {
"type": "string",
"description": "Sender name shown on broadcasts."
},
"social_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"platform",
"url"
],
"properties": {
"url": {
"type": "string"
},
"platform": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Footer social links, each { platform, url } with an https url."
},
"reply_to_email": {
"type": "string",
"description": "Reply-to address for broadcasts."
},
"show_beacons_logo": {
"type": "boolean",
"description": "Show the Beacons logo in your email footer. False hides it and needs a plan that includes email branding; true works on any plan."
},
"is_double_opt_in_enabled": {
"type": "boolean",
"description": "True for double opt-in confirmation; false for single opt-in."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"fields_updated",
"note"
],
"properties": {
"note": {
"type": "string"
},
"status": {
"enum": [
"needs_upgrade"
],
"type": "string"
},
"fields_updated": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set email marketing settings",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Create or edit one of your own Shop products. Omit product_id to create a supported product (digital-products, course, appointments, external-link, membership; defaults to digital-products); appointments require time_zone (an IANA name); external-link products require external_url, the absolute https page the product redirects buyers to instead of a checkout, and deliver no files. A membership charges a recurring price and needs only a title and a positive price_minor_units; interval says how often it bills and defaults to month. Creating one starts billing in the same call when the creator has Stripe or PayPal attached, so the confirmation must say the amount, the interval, and that the price and currency are fixed once billing starts. With no processor attached the membership is created but cannot take payment, and the creator connects one at the payouts page in payouts_url. How many payments the buyer makes is chosen at setup_url, the Recurring price section of the Store builder. Product images go in checkout_images, the Media gallery of the Store product editor, whether the product is being created or edited. Pass product_id to patch an existing product with any of the canonical fields — the title, checkout_description and CTA text, the product images, the thumbnail override, SEO meta title and description, checkout reviews, and the confirmation email subject and body. Omitted fields stay unchanged. Existing appointment products also accept the slot length, the break buffers before and after each meeting, the minimum booking notice in hours, the booking horizon in days, the conference type, weekly availability windows given as start and end block hours, and blocked dates added or removed. Do not mix schedule fields with standard product fields in one request. Creating a product, or changing price_minor_units, strikethrough_price_minor_units, course content, or adding, editing, or deleting a review, returns a proposal that nothing has been written yet; call again with the identical arguments after the creator confirms to apply it. Send only the fields that change: a rename, price change, or show/hide needs no read first, only the product_id from list_store_products. Call get_shop_product first when the edit depends on current contents (checkout_description HTML, checkout_images, review ids, or appointment availability and blocked dates being removed); it reports every field under the same names this tool writes. product_type cannot be changed on an existing product. checkout_description is the product description — the Description section of the Store product editor, and the copy buyers read on the product page. An unqualified request to change the description means checkout_description; the separate description field is a catalog caption and is written only when the creator names it. To change checkout_description, preserve the untouched rich HTML and pass the expected_store_item_version returned by that read. checkout_fields_to_add and checkout_fields_to_remove control what the checkout asks buyers for beyond name and email: a phone number, a birthday, a location, or one custom question. Both are additive against what is already there, both need the same typed confirmation, and get_shop_product reports the current set as active_checkout_fields. That is the per-product checkout form, not checkout_description (the page copy), not confirmation_email_body, and not a store-wide setting. files_to_add attaches files the creator has sent you to a digital product — the Upload file button in the builder's Product Files panel — on an existing product or on the one being created: pass the media_id of each attached file from the message's attachment list. links_to_add is the Add a link button: a link buyers receive after checkout, with an optional title. A digital product holds at most 6 files and links together, and a free product on an account without a Store plan holds at most 50 MB of files. Adding either to an existing product needs expected_store_item_version and the same typed confirmation, in a request of its own. Neither can be added to courses, appointments, memberships or external-link products. files_to_remove deletes existing files or links from a digital product — the builder's delete button — each named by the item_ordering get_shop_product returned; it needs expected_store_item_version and the same typed confirmation, in a request of its own, and an uploaded file is deleted for good. files_to_replace swaps an uploaded file for one the creator has sent you, in the same place in the list — how a corrected PDF reaches buyers: pass the old entry's item_ordering and the new file's media_id, with expected_store_item_version and the same typed confirmation, in a request of its own. It changes only what buyers download after checkout, never checkout_images. This tool does not rename or reorder existing files or links. Once a membership is billing its price, currency and interval are fixed here — changing them mints a new provider price, which only the Store builder does — but its title, checkout_description and every other presentation field still change normally. Coming soon is waitlist_enabled: true swaps checkout for a waitlist signup that adds each email to the creator's Audience, false brings checkout back, and waitlist_heading, waitlist_description, waitlist_button_text, waitlist_launch_text and waitlist_show_price set what the waitlist shows.
The description explains the capability, when to use it, and what to expect.
Inputs64/100
63 of 81 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
product_id
The id of one of your own Store products. Omit to create a new one — read it from list_store_products or get_shop_product.
Clear enough to supply this argument.
product_type
Create only. One of: digital-products, course, appointments, external-link, membership. Defaults to digital-products. Rejected when product_id is present — an existing product cannot change type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
interval
Create only, memberships only. How often the membership bills: week, month, year. Defaults to month unless the creator says otherwise. It is fixed once billing starts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
time_zone
Required when creating an appointment and accepted when editing an existing appointment schedule: an IANA time zone name, e.g. America/New_York.
Clear enough to supply this argument.
external_url
Create only, required when product_type is external-link: the absolute https URL the product redirects to (an Etsy listing, an Amazon page, a course on another site). Rejected for other product types and on an existing product — the destination cannot change after creation.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
expected_store_item_version
Required when checkout_description, review_to_add, review_to_update, review_to_delete, files_to_add, links_to_add, files_to_remove, or files_to_replace is present on an existing product. Pass read_only.store_item_version from the latest get_shop_product response so an edit never applies to a product that changed after it was read. For review_to_add, files_to_add, or links_to_add, store_item_version from the latest list_store_products response also works.
Clear enough to supply this argument.
expected_shop_product_document_version
Required when course_title or course_description is present. Pass read_only.shop_product_document_version from the latest get_shop_product response.
Clear enough to supply this argument.
review_to_add › name
Not provided
Missing description. Explain what this value means and how to supply it.
review_to_add › stars
Not provided
Missing description. Explain what this value means and how to supply it.
review_to_add › text
Not provided
Missing description. Explain what this value means and how to supply it.
review_to_update › id
The existing review id returned by get_shop_product.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
review_to_update › name
Not provided
Missing description. Explain what this value means and how to supply it.
review_to_update › stars
Not provided
Missing description. Explain what this value means and how to supply it.
review_to_update › text
Not provided
Missing description. Explain what this value means and how to supply it.
review_to_delete › id
The existing review id returned by get_shop_product.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
files_to_add › items › media_id
The media_id of a file the creator sent, from the message's attachment list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
files_to_add › items › filename
The name buyers see. Defaults to the file's own name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links_to_add › items › url
The absolute https URL buyers open after checkout. It may not already be on the product.
Clear enough to supply this argument.
links_to_add › items › title
The link name buyers see. Defaults to Untitled URL.
Clear enough to supply this argument.
files_to_remove › items › item_ordering
The item_ordering of one entry in the files get_shop_product returned for this product.
Clear enough to supply this argument.
files_to_replace › items › item_ordering
The item_ordering of the uploaded file to replace, from the files get_shop_product returned.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
files_to_replace › items › media_id
The media_id of the file the creator sent, from the message's attachment list.
Clear enough to supply this argument.
files_to_replace › items › filename
The name buyers see. Defaults to the new file's own name.
Clear enough to supply this argument.
slot_time_in_minutes
Appointment slot length in minutes.
Clear enough to supply this argument.
prevent_booking_from_current_time_in_hours
Appointment minimum booking notice in hours.
Clear enough to supply this argument.
break_before_meeting_in_minutes
Appointment buffer before each meeting.
Clear enough to supply this argument.
break_after_meeting_in_minutes
Appointment buffer after each meeting.
Clear enough to supply this argument.
max_days_can_schedule
Appointment booking horizon in days.
Clear enough to supply this argument.
conference_type
Appointment meeting link type. zoom is refused unless Zoom is connected; google-meet issues a link only once Google Calendar is connected. Check with list_connections first.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocked_dates
YYYY-MM-DD appointment blackout dates to add.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocked_dates_to_remove
Exact YYYY-MM-DD blackout dates to remove after confirmation.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
checkout_fields_to_remove
Checkout fields to stop asking buyers for. Removing a field also stops it being mandatory, and removing custom discards the question wording. Answers buyers already gave on past orders are kept. Naming a field the checkout does not ask for is an error.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
checkout_fields_to_add
Checkout fields to start asking buyers for: phone_number, birthday, location, custom. Adds to what the checkout already asks — fields left out keep asking exactly as they are, and naming one that is already on is a no-op. A product holds at most one custom question; word it with contact_custom_field_name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
The catalog product name. 1-200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
A short plain-text catalog caption. This is NOT the product description — that is checkout_description. An unqualified request to change the description always means checkout_description, never this field. Write this one only when the creator names it explicitly. Omit it, or send null or a blank string, when there is none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
availability
true to show the product in the catalog, false to hide it. Hiding does not delete the product or stop its standalone page from selling.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inventory
Units in stock, 0-100000, or null for unlimited.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cta_text
The checkout button label on the product page, up to 30 characters, or null for the default. Link in Bio product cards keep their own button label; the result lists what they show.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
poster_image_url
Absolute https URL for a separate thumbnail override on store tiles, emails and share previews, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
meta_seo_title
The page SEO title, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
meta_seo_description
The page SEO description, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
checkout_description
The product description: the Description section of the Store product editor, and the copy buyers read on the product page. An unqualified request to change the description means this field. Sanitized rich HTML, or null to clear it. Read it with get_shop_product, preserve unchanged tags and attributes, and send the complete updated HTML with expected_store_item_version. Existing formatting is never flattened to plain text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
checkout_images › items › file_path
Not provided
Missing description. Explain what this value means and how to supply it.
checkout_images › items › image_url
Not provided
Missing description. Explain what this value means and how to supply it.
checkout_images › items › media_type
Not provided
Missing description. Explain what this value means and how to supply it.
checkout_images › items › platform
Not provided
Missing description. Explain what this value means and how to supply it.
checkout_reviews › items › id
Not provided
Missing description. Explain what this value means and how to supply it.
checkout_reviews › items › name
Not provided
Missing description. Explain what this value means and how to supply it.
checkout_reviews › items › stars
Not provided
Missing description. Explain what this value means and how to supply it.
checkout_reviews › items › text
Not provided
Missing description. Explain what this value means and how to supply it.
post_purchase_message
Message shown to the buyer right after checkout, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmation_email_subject
Subject of the purchase confirmation email, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmation_email_body
Body of the purchase confirmation email, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
access_duration_days
Days after purchase the buyer keeps access, or null for lifetime access. Applies to future orders only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
custom_slug
A readable URL slug for this product (letters, numbers, and hyphens only), or null to remove it and fall back to the UUID URL.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layout_type
The product page layout: two-column, sticky-column, one-column. A product already storing a retired layout keeps it until you change it to a current one — resubmitting the stored value is a no-op. Colors and font of the product page are set with set_store_product_appearance.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include_full_description
Show the full checkout_description on the product page instead of truncating it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include_strikethrough_price
Show a strikethrough original price.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
course_title
The learner-facing course title, 1-200 characters. Only accepted for an existing course product.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
course_description
Sanitized rich HTML for the learner-facing course description, or null to clear it. Only accepted for an existing course product.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
required_checkout_fields › phone_number
Not provided
Missing description. Explain what this value means and how to supply it.
required_checkout_fields › birthday
Not provided
Missing description. Explain what this value means and how to supply it.
required_checkout_fields › location
Not provided
Missing description. Explain what this value means and how to supply it.
required_checkout_fields › custom
Not provided
Missing description. Explain what this value means and how to supply it.
contact_custom_field_name
The wording of the custom checkout question, e.g. "What size do you want?". Only accepted when the custom field is already on the checkout or is being turned on in the same call. There is no way to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
location_field_type
How much of an address the checkout location field asks for: full_address, partial_address, country, postal_code. Only accepted when the location field is already on the checkout or is being turned on in the same call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
waitlist_enabled
Coming soon: true marks the product as coming soon, so the product page shows a waitlist signup instead of checkout and nobody can buy it. Each email that joins is added to the creator's Audience, so the creator can email the waitlist at launch. false ends Coming soon and brings checkout back.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
waitlist_heading
The Coming soon waitlist heading, e.g. "Something big is coming".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
waitlist_description
The Coming soon waitlist subtitle. Unset, buyers see "Be the first to know".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
waitlist_button_text
The Coming soon waitlist button label, up to 30 characters. Unset, it reads "Notify me".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
waitlist_launch_text
The launch date line on the Coming soon waitlist, as free text, e.g. "Launching August 29".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
waitlist_show_price
Show the price on the Coming soon waitlist.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
price_minor_units
The active price in minor units. Omit currency to keep the current currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
currency
Lowercase ISO 4217 currency code. Omit price_minor_units to keep the current amount.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
strikethrough_price_minor_units
The original price shown struck through, in minor units of the same currency, or null to clear it. Must exceed the active price when set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "update_store_product",
"description": "Create or edit one of your own Shop products. Omit product_id to create a supported product (digital-products, course, appointments, external-link, membership; defaults to digital-products); appointments require time_zone (an IANA name); external-link products require external_url, the absolute https page the product redirects buyers to instead of a checkout, and deliver no files. A membership charges a recurring price and needs only a title and a positive price_minor_units; interval says how often it bills and defaults to month. Creating one starts billing in the same call when the creator has Stripe or PayPal attached, so the confirmation must say the amount, the interval, and that the price and currency are fixed once billing starts. With no processor attached the membership is created but cannot take payment, and the creator connects one at the payouts page in payouts_url. How many payments the buyer makes is chosen at setup_url, the Recurring price section of the Store builder. Product images go in checkout_images, the Media gallery of the Store product editor, whether the product is being created or edited. Pass product_id to patch an existing product with any of the canonical fields — the title, checkout_description and CTA text, the product images, the thumbnail override, SEO meta title and description, checkout reviews, and the confirmation email subject and body. Omitted fields stay unchanged. Existing appointment products also accept the slot length, the break buffers before and after each meeting, the minimum booking notice in hours, the booking horizon in days, the conference type, weekly availability windows given as start and end block hours, and blocked dates added or removed. Do not mix schedule fields with standard product fields in one request. Creating a product, or changing price_minor_units, strikethrough_price_minor_units, course content, or adding, editing, or deleting a review, returns a proposal that nothing has been written yet; call again with the identical arguments after the creator confirms to apply it. Send only the fields that change: a rename, price change, or show/hide needs no read first, only the product_id from list_store_products. Call get_shop_product first when the edit depends on current contents (checkout_description HTML, checkout_images, review ids, or appointment availability and blocked dates being removed); it reports every field under the same names this tool writes. product_type cannot be changed on an existing product. checkout_description is the product description — the Description section of the Store product editor, and the copy buyers read on the product page. An unqualified request to change the description means checkout_description; the separate description field is a catalog caption and is written only when the creator names it. To change checkout_description, preserve the untouched rich HTML and pass the expected_store_item_version returned by that read. checkout_fields_to_add and checkout_fields_to_remove control what the checkout asks buyers for beyond name and email: a phone number, a birthday, a location, or one custom question. Both are additive against what is already there, both need the same typed confirmation, and get_shop_product reports the current set as active_checkout_fields. That is the per-product checkout form, not checkout_description (the page copy), not confirmation_email_body, and not a store-wide setting. files_to_add attaches files the creator has sent you to a digital product — the Upload file button in the builder's Product Files panel — on an existing product or on the one being created: pass the media_id of each attached file from the message's attachment list. links_to_add is the Add a link button: a link buyers receive after checkout, with an optional title. A digital product holds at most 6 files and links together, and a free product on an account without a Store plan holds at most 50 MB of files. Adding either to an existing product needs expected_store_item_version and the same typed confirmation, in a request of its own. Neither can be added to courses, appointments, memberships or external-link products. files_to_remove deletes existing files or links from a digital product — the builder's delete button — each named by the item_ordering get_shop_product returned; it needs expected_store_item_version and the same typed confirmation, in a request of its own, and an uploaded file is deleted for good. files_to_replace swaps an uploaded file for one the creator has sent you, in the same place in the list — how a corrected PDF reaches buyers: pass the old entry's item_ordering and the new file's media_id, with expected_store_item_version and the same typed confirmation, in a request of its own. It changes only what buyers download after checkout, never checkout_images. This tool does not rename or reorder existing files or links. Once a membership is billing its price, currency and interval are fixed here — changing them mints a new provider price, which only the Store builder does — but its title, checkout_description and every other presentation field still change normally. Coming soon is waitlist_enabled: true swaps checkout for a waitlist signup that adds each email to the creator's Audience, false brings checkout back, and waitlist_heading, waitlist_description, waitlist_button_text, waitlist_launch_text and waitlist_show_price set what the waitlist shows.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The catalog product name. 1-200 characters."
},
"cta_text": {
"type": [
"string",
"null"
],
"maxLength": 30,
"description": "The checkout button label on the product page, up to 30 characters, or null for the default. Link in Bio product cards keep their own button label; the result lists what they show."
},
"currency": {
"type": "string",
"description": "Lowercase ISO 4217 currency code. Omit price_minor_units to keep the current amount."
},
"interval": {
"enum": [
"week",
"month",
"year"
],
"type": "string",
"description": "Create only, memberships only. How often the membership bills: week, month, year. Defaults to month unless the creator says otherwise. It is fixed once billing starts."
},
"inventory": {
"type": [
"integer",
"null"
],
"maximum": 100000,
"minimum": 0,
"description": "Units in stock, 0-100000, or null for unlimited."
},
"time_zone": {
"type": "string",
"description": "Required when creating an appointment and accepted when editing an existing appointment schedule: an IANA time zone name, e.g. America/New_York."
},
"product_id": {
"type": "string",
"description": "The id of one of your own Store products. Omit to create a new one — read it from list_store_products or get_shop_product."
},
"custom_slug": {
"type": [
"string",
"null"
],
"pattern": "^[A-Za-z0-9-]+$",
"maxLength": 80,
"description": "A readable URL slug for this product (letters, numbers, and hyphens only), or null to remove it and fall back to the UUID URL."
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 2000,
"description": "A short plain-text catalog caption. This is NOT the product description — that is checkout_description. An unqualified request to change the description always means checkout_description, never this field. Write this one only when the creator names it explicitly. Omit it, or send null or a blank string, when there is none."
},
"layout_type": {
"type": "string",
"description": "The product page layout: two-column, sticky-column, one-column. A product already storing a retired layout keeps it until you change it to a current one — resubmitting the stored value is a no-op. Colors and font of the product page are set with set_store_product_appearance."
},
"availability": {
"type": "boolean",
"description": "true to show the product in the catalog, false to hide it. Hiding does not delete the product or stop its standalone page from selling."
},
"course_title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The learner-facing course title, 1-200 characters. Only accepted for an existing course product."
},
"external_url": {
"type": "string",
"maxLength": 2048,
"description": "Create only, required when product_type is external-link: the absolute https URL the product redirects to (an Etsy listing, an Amazon page, a course on another site). Rejected for other product types and on an existing product — the destination cannot change after creation."
},
"files_to_add": {
"type": "array",
"items": {
"type": "object",
"required": [
"media_id"
],
"properties": {
"filename": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The name buyers see. Defaults to the file's own name."
},
"media_id": {
"type": "string",
"description": "The media_id of a file the creator sent, from the message's attachment list."
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1,
"description": "Digital products only. Documents and images the creator sent you, delivered to buyers after checkout. Existing files and links plus new ones may not exceed 6."
},
"links_to_add": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The absolute https URL buyers open after checkout. It may not already be on the product."
},
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The link name buyers see. Defaults to Untitled URL."
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1,
"description": "Digital products only. Links buyers receive after checkout, counted with files toward the limit of 6."
},
"product_type": {
"enum": [
"digital-products",
"course",
"appointments",
"external-link",
"membership"
],
"type": "string",
"description": "Create only. One of: digital-products, course, appointments, external-link, membership. Defaults to digital-products. Rejected when product_id is present — an existing product cannot change type."
},
"blocked_dates": {
"type": "array",
"items": {
"type": "string"
},
"description": "YYYY-MM-DD appointment blackout dates to add."
},
"review_to_add": {
"type": "object",
"required": [
"name",
"stars",
"text"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"text": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"stars": {
"type": "integer",
"maximum": 5,
"minimum": 1
}
},
"description": "One manual customer review to append without replacing existing reviews. The server creates its id.",
"additionalProperties": false
},
"meta_seo_title": {
"type": [
"string",
"null"
],
"maxLength": 200,
"description": "The page SEO title, or null to clear it."
},
"checkout_images": {
"type": "array",
"items": {
"type": "object",
"required": [
"file_path",
"image_url"
],
"properties": {
"platform": {
"type": "string"
},
"file_path": {
"type": "string"
},
"image_url": {
"type": "string"
},
"media_type": {
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "The product's images, up to 20: the gallery the creator manages in the Store product editor Media section and the images buyers see on the product page. Every product image the creator sends or asks for goes here, when creating the product or editing it. Each image sets file_path and image_url to its https URL. It replaces the whole gallery, so on an existing product send the current list from get_shop_product back whole: an added image goes first, and a new main image replaces the first entry. Pass [] to clear it."
},
"conference_type": {
"enum": [
"google-meet",
"zoom",
"none"
],
"type": "string",
"description": "Appointment meeting link type. zoom is refused unless Zoom is connected; google-meet issues a link only once Google Calendar is connected. Check with list_connections first."
},
"files_to_remove": {
"type": "array",
"items": {
"type": "object",
"required": [
"item_ordering"
],
"properties": {
"item_ordering": {
"type": "number",
"description": "The item_ordering of one entry in the files get_shop_product returned for this product."
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1,
"description": "Digital products only. Existing files or links to delete from the product, at most 6. Buyers stop receiving them, and an uploaded file is deleted from storage."
},
"checkout_reviews": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"stars",
"text"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string",
"maxLength": 200
},
"text": {
"type": "string",
"maxLength": 500
},
"stars": {
"type": "integer",
"maximum": 5,
"minimum": 1
}
},
"additionalProperties": false
},
"maxItems": 100,
"description": "The checkout page reviews, up to 100. On create only. To change reviews on an existing product, use review_to_add, review_to_update, or review_to_delete."
},
"files_to_replace": {
"type": "array",
"items": {
"type": "object",
"required": [
"item_ordering",
"media_id"
],
"properties": {
"filename": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The name buyers see. Defaults to the new file's own name."
},
"media_id": {
"type": "string",
"description": "The media_id of the file the creator sent, from the message's attachment list."
},
"item_ordering": {
"type": "number",
"description": "The item_ordering of the uploaded file to replace, from the files get_shop_product returned."
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1,
"description": "Digital products only. Uploaded files to swap for documents or images the creator sent you, each keeping its place in the list. Buyers download the new file after checkout, past buyers included, and the old one is deleted from storage. Product images are unaffected."
},
"poster_image_url": {
"type": [
"string",
"null"
],
"maxLength": 2048,
"description": "Absolute https URL for a separate thumbnail override on store tiles, emails and share previews, or null to clear it."
},
"review_to_delete": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "The existing review id returned by get_shop_product."
}
},
"description": "Remove one customer review by id. Manual and verified testimonials can both be deleted.",
"additionalProperties": false
},
"review_to_update": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "The existing review id returned by get_shop_product."
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"text": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"stars": {
"type": "integer",
"maximum": 5,
"minimum": 1
}
},
"description": "Patch one existing manual customer review by id. Supply at least one of name, stars, or text; omitted fields stay unchanged.",
"minProperties": 2,
"additionalProperties": false
},
"waitlist_enabled": {
"type": "boolean",
"description": "Coming soon: true marks the product as coming soon, so the product page shows a waitlist signup instead of checkout and nobody can buy it. Each email that joins is added to the creator's Audience, so the creator can email the waitlist at launch. false ends Coming soon and brings checkout back."
},
"waitlist_heading": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The Coming soon waitlist heading, e.g. \"Something big is coming\"."
},
"price_minor_units": {
"type": "integer",
"minimum": 0,
"description": "The active price in minor units. Omit currency to keep the current currency."
},
"course_description": {
"type": [
"string",
"null"
],
"maxLength": 20000,
"description": "Sanitized rich HTML for the learner-facing course description, or null to clear it. Only accepted for an existing course product."
},
"location_field_type": {
"enum": [
"full_address",
"partial_address",
"country",
"postal_code"
],
"type": "string",
"description": "How much of an address the checkout location field asks for: full_address, partial_address, country, postal_code. Only accepted when the location field is already on the checkout or is being turned on in the same call."
},
"waitlist_show_price": {
"type": "boolean",
"description": "Show the price on the Coming soon waitlist."
},
"access_duration_days": {
"type": [
"integer",
"null"
],
"maximum": 36500,
"minimum": 1,
"description": "Days after purchase the buyer keeps access, or null for lifetime access. Applies to future orders only."
},
"checkout_description": {
"type": [
"string",
"null"
],
"maxLength": 20000,
"description": "The product description: the Description section of the Store product editor, and the copy buyers read on the product page. An unqualified request to change the description means this field. Sanitized rich HTML, or null to clear it. Read it with get_shop_product, preserve unchanged tags and attributes, and send the complete updated HTML with expected_store_item_version. Existing formatting is never flattened to plain text."
},
"meta_seo_description": {
"type": [
"string",
"null"
],
"maxLength": 2000,
"description": "The page SEO description, or null to clear it."
},
"slot_time_in_minutes": {
"type": "integer",
"description": "Appointment slot length in minutes."
},
"waitlist_button_text": {
"type": "string",
"maxLength": 30,
"minLength": 1,
"description": "The Coming soon waitlist button label, up to 30 characters. Unset, it reads \"Notify me\"."
},
"waitlist_description": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "The Coming soon waitlist subtitle. Unset, buyers see \"Be the first to know\"."
},
"waitlist_launch_text": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The launch date line on the Coming soon waitlist, as free text, e.g. \"Launching August 29\"."
},
"max_days_can_schedule": {
"type": "integer",
"description": "Appointment booking horizon in days."
},
"post_purchase_message": {
"type": [
"string",
"null"
],
"maxLength": 2000,
"description": "Message shown to the buyer right after checkout, or null to clear it."
},
"checkout_fields_to_add": {
"type": "array",
"items": {
"enum": [
"phone_number",
"birthday",
"location",
"custom"
],
"type": "string"
},
"maxItems": 4,
"description": "Checkout fields to start asking buyers for: phone_number, birthday, location, custom. Adds to what the checkout already asks — fields left out keep asking exactly as they are, and naming one that is already on is a no-op. A product holds at most one custom question; word it with contact_custom_field_name."
},
"blocked_dates_to_remove": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact YYYY-MM-DD blackout dates to remove after confirmation."
},
"confirmation_email_body": {
"type": [
"string",
"null"
],
"maxLength": 5000,
"description": "Body of the purchase confirmation email, or null to clear it."
},
"appointment_availability": {
"type": "array",
"items": {
"type": "object",
"required": [
"day_of_week",
"start_block_hour",
"end_block_hour"
],
"properties": {
"day_of_week": {
"type": "integer",
"description": "0 = Sunday through 6 = Saturday."
},
"end_block_hour": {
"type": "number",
"description": "Later fractional hour, at most 24."
},
"start_block_hour": {
"type": "number",
"description": "Fractional hour in 15-minute steps."
}
},
"additionalProperties": false
},
"description": "Weekly windows to add or replace by day and start hour."
},
"include_full_description": {
"type": "boolean",
"description": "Show the full checkout_description on the product page instead of truncating it."
},
"required_checkout_fields": {
"type": "object",
"properties": {
"custom": {
"type": "boolean"
},
"birthday": {
"type": "boolean"
},
"location": {
"type": "boolean"
},
"phone_number": {
"type": "boolean"
}
},
"description": "Which checkout fields the buyer must fill in before paying, e.g. {\"phone_number\": true}. Only accepted for a field the checkout already asks for or that checkout_fields_to_add turns on in the same call. Fields left out keep their current setting.",
"additionalProperties": false
},
"checkout_fields_to_remove": {
"type": "array",
"items": {
"enum": [
"phone_number",
"birthday",
"location",
"custom"
],
"type": "string"
},
"maxItems": 4,
"description": "Checkout fields to stop asking buyers for. Removing a field also stops it being mandatory, and removing custom discards the question wording. Answers buyers already gave on past orders are kept. Naming a field the checkout does not ask for is an error."
},
"contact_custom_field_name": {
"type": "string",
"maxLength": 200,
"description": "The wording of the custom checkout question, e.g. \"What size do you want?\". Only accepted when the custom field is already on the checkout or is being turned on in the same call. There is no way to clear it."
},
"confirmation_email_subject": {
"type": [
"string",
"null"
],
"maxLength": 200,
"description": "Subject of the purchase confirmation email, or null to clear it."
},
"expected_store_item_version": {
"type": "string",
"description": "Required when checkout_description, review_to_add, review_to_update, review_to_delete, files_to_add, links_to_add, files_to_remove, or files_to_replace is present on an existing product. Pass read_only.store_item_version from the latest get_shop_product response so an edit never applies to a product that changed after it was read. For review_to_add, files_to_add, or links_to_add, store_item_version from the latest list_store_products response also works."
},
"include_strikethrough_price": {
"type": "boolean",
"description": "Show a strikethrough original price."
},
"break_after_meeting_in_minutes": {
"type": "integer",
"description": "Appointment buffer after each meeting."
},
"break_before_meeting_in_minutes": {
"type": "integer",
"description": "Appointment buffer before each meeting."
},
"strikethrough_price_minor_units": {
"type": [
"integer",
"null"
],
"minimum": 0,
"description": "The original price shown struck through, in minor units of the same currency, or null to clear it. Must exceed the active price when set."
},
"appointment_availability_to_remove": {
"type": "array",
"items": {
"type": "object",
"required": [
"day_of_week",
"start_block_hour",
"end_block_hour"
],
"properties": {
"day_of_week": {
"type": "integer",
"description": "0 = Sunday through 6 = Saturday."
},
"end_block_hour": {
"type": "number",
"description": "Later fractional hour, at most 24."
},
"start_block_hour": {
"type": "number",
"description": "Fractional hour in 15-minute steps."
}
},
"additionalProperties": false
},
"description": "Exact weekly windows to remove after confirmation."
},
"expected_shop_product_document_version": {
"type": "string",
"description": "Required when course_title or course_description is present. Pass read_only.shop_product_document_version from the latest get_shop_product response."
},
"prevent_booking_from_current_time_in_hours": {
"type": "integer",
"description": "Appointment minimum booking notice in hours."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"fields_updated",
"note"
],
"properties": {
"note": {
"type": "string"
},
"files": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"title": {
"type": "string"
},
"reason": {
"enum": [
"proposed",
"reply_not_recognized",
"reply_check_unavailable",
"proposal_unknown",
"proposed_this_turn",
"declined",
"superseded"
],
"type": "string"
},
"status": {
"enum": [
"needs_confirmation",
"needs_connect",
"ok",
"partial_sync",
"unknown",
"declined",
"needs_upgrade"
],
"type": "string"
},
"current": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"cta_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"currency": {
"type": "string"
},
"interval": {
"type": "string"
},
"proposed": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"inventory": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"setup_url": {
"type": "string"
},
"time_zone": {
"type": "string"
},
"product_id": {
"type": "string"
},
"custom_slug": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"layout_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"payouts_url": {
"type": "string"
},
"proposal_id": {
"type": "string"
},
"availability": {
"type": "boolean"
},
"course_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"external_url": {
"type": "string"
},
"product_type": {
"type": "string"
},
"blocked_dates": {
"type": "array",
"items": {
"type": "string"
}
},
"required_plan": {
"type": "string"
},
"sync_failures": {
"type": "array",
"items": {
"type": "string"
}
},
"fields_updated": {
"type": "array",
"items": {
"type": "string"
}
},
"meta_seo_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"pending_fields": {
"type": "array",
"items": {
"type": "string"
}
},
"checkout_images": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"checkout_reviews": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"fields_to_create": {
"type": "array",
"items": {
"type": "string"
}
},
"poster_image_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"waitlist_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"waitlist_heading": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"membership_config": {
"type": "object",
"required": [
"interval",
"total_cycles",
"price_minor_units",
"currency",
"stripe_configured",
"paypal_configured",
"billing_status"
],
"properties": {
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"interval": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"total_cycles": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"billing_status": {
"enum": [
"pending_payment_setup",
"live",
"live_terms_unavailable"
],
"type": "string"
},
"paypal_configured": {
"type": "boolean"
},
"price_minor_units": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"stripe_configured": {
"type": "boolean"
}
},
"additionalProperties": false
},
"price_minor_units": {
"type": "integer"
},
"appointment_config": {
"anyOf": [
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
},
"course_description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"blocked_dates_added": {
"type": "array",
"items": {
"type": "string"
}
},
"location_field_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"waitlist_show_price": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"access_duration_days": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"checkout_description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"meta_seo_description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"waitlist_button_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"waitlist_description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"waitlist_launch_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"blocked_dates_removed": {
"type": "array",
"items": {
"type": "string"
}
},
"post_purchase_message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"conference_integration": {
"type": "object",
"required": [
"type",
"connected",
"connect_url"
],
"properties": {
"type": {
"type": "string"
},
"connected": {
"type": "boolean"
},
"connect_url": {
"type": "string"
}
},
"additionalProperties": false
},
"confirmation_email_body": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"appointment_availability": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"include_full_description": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"link_in_bio_card_buttons": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required_checkout_fields": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"contact_custom_field_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"confirmation_email_subject": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"include_strikethrough_price": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"strikethrough_price_minor_units": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"appointment_availability_removed": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"appointment_availability_upserted": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update store product",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Set the layout, colors, and font of ONE of your own Store product pages — the Store builder's Design drawer: layout (Original, Landscape, Dynamic), page background, text, link, buy button (CTA) and button-text colors, block background and block text colors, and font. Only the fields you pass change, it applies immediately, and your other products and your Link in Bio are untouched (recolor the whole Link in Bio with set_link_in_bio_appearance). Creators speak in color words and schemes ("navy blue and cream", "earthy", "match my logo"): translate them into #RRGGBB values yourself, and when they name a scheme rather than a field, choose harmonious values for all seven color fields with readable contrast on each text-on-fill pair. Read the current design first from page_appearance on get_shop_product.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
product_id
The id of one of your own Store products, from list_store_products.
Clear enough to supply this argument.
layout_type
The desktop layout: two-column (Original, the default), one-column (Landscape), or sticky-column (Dynamic, where the buy box follows the scroll). Phones always use the mobile layout. A product already storing a retired layout keeps it until you change it to a current one; resubmitting the stored value is a no-op.
Clear enough to supply this argument.
font_family
The page font, as the exact stored value. The Store builder labels each by its first family name (Poppins is the default), except Baskerville, which is 'Libre Baskerville', sans-serif. A product already storing another font keeps it; resubmitting it is a no-op.
Clear enough to supply this argument.
background_color
Page background color. A 6-digit hex color, #RRGGBB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
text_color
Body text color, on the page background. A 6-digit hex color, #RRGGBB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
hyperlink_color
Link color, on the page background. A 6-digit hex color, #RRGGBB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cta_background_color
Buy button fill. A 6-digit hex color, #RRGGBB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cta_text_color
Buy button text color, on the button fill. A 6-digit hex color, #RRGGBB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
block_background_color
Content block fill. Renders only on the Original (two-column) layout. A 6-digit hex color, #RRGGBB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
block_text_color
Content block text color, on the block fill. Renders only on the Original (two-column) layout. A 6-digit hex color, #RRGGBB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "set_store_product_appearance",
"description": "Set the layout, colors, and font of ONE of your own Store product pages — the Store builder's Design drawer: layout (Original, Landscape, Dynamic), page background, text, link, buy button (CTA) and button-text colors, block background and block text colors, and font. Only the fields you pass change, it applies immediately, and your other products and your Link in Bio are untouched (recolor the whole Link in Bio with set_link_in_bio_appearance). Creators speak in color words and schemes (\"navy blue and cream\", \"earthy\", \"match my logo\"): translate them into #RRGGBB values yourself, and when they name a scheme rather than a field, choose harmonious values for all seven color fields with readable contrast on each text-on-fill pair. Read the current design first from page_appearance on get_shop_product.",
"inputSchema": {
"type": "object",
"required": [
"product_id"
],
"properties": {
"product_id": {
"type": "string",
"description": "The id of one of your own Store products, from list_store_products."
},
"text_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Body text color, on the page background. A 6-digit hex color, #RRGGBB."
},
"font_family": {
"enum": [
"Poppins, sans-serif",
"Saira, sans-serif",
"Mulish, sans-serif",
"Roboto, sans-serif",
"Jost, sans-serif",
"Helvetica, sans-serif",
"Quicksand, sans-serif",
"Merriweather, serif",
"Solway, serif",
"Arvo, serif",
"'Libre Baskerville', sans-serif",
"Itim, sans-serif",
"Bellota, sans-serif",
"Aldrich, sans-serif",
"'Palanquin Dark', sans-serif"
],
"type": "string",
"description": "The page font, as the exact stored value. The Store builder labels each by its first family name (Poppins is the default), except Baskerville, which is 'Libre Baskerville', sans-serif. A product already storing another font keeps it; resubmitting it is a no-op."
},
"layout_type": {
"type": "string",
"description": "The desktop layout: two-column (Original, the default), one-column (Landscape), or sticky-column (Dynamic, where the buy box follows the scroll). Phones always use the mobile layout. A product already storing a retired layout keeps it until you change it to a current one; resubmitting the stored value is a no-op."
},
"cta_text_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Buy button text color, on the button fill. A 6-digit hex color, #RRGGBB."
},
"hyperlink_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Link color, on the page background. A 6-digit hex color, #RRGGBB."
},
"background_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Page background color. A 6-digit hex color, #RRGGBB."
},
"block_text_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Content block text color, on the block fill. Renders only on the Original (two-column) layout. A 6-digit hex color, #RRGGBB."
},
"cta_background_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Buy button fill. A 6-digit hex color, #RRGGBB."
},
"block_background_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Content block fill. Renders only on the Original (two-column) layout. A 6-digit hex color, #RRGGBB."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"product_id",
"fields_updated",
"page_appearance",
"previous",
"warnings",
"contrast",
"public_url"
],
"properties": {
"status": {
"enum": [
"ok"
],
"type": "string"
},
"contrast": {
"type": "array",
"items": {
"type": "object",
"required": [
"foreground",
"background",
"ratio"
],
"properties": {
"ratio": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"background": {
"type": "string"
},
"foreground": {
"type": "string"
}
},
"additionalProperties": false
}
},
"previous": {
"type": "object",
"required": [],
"properties": {
"text_color": {
"type": "string"
},
"font_family": {
"type": "string"
},
"layout_type": {
"type": "string"
},
"cta_text_color": {
"type": "string"
},
"hyperlink_color": {
"type": "string"
},
"background_color": {
"type": "string"
},
"block_text_color": {
"type": "string"
},
"cta_background_color": {
"type": "string"
},
"block_background_color": {
"type": "string"
}
},
"additionalProperties": false
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"product_id": {
"type": "string"
},
"public_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"fields_updated": {
"type": "array",
"items": {
"type": "string"
}
},
"page_appearance": {
"type": "object",
"required": [
"layout_type",
"font_family",
"background_color",
"text_color",
"hyperlink_color",
"cta_background_color",
"cta_text_color",
"block_background_color",
"block_text_color"
],
"properties": {
"text_color": {
"type": "string"
},
"font_family": {
"type": "string"
},
"layout_type": {
"type": "string"
},
"cta_text_color": {
"type": "string"
},
"hyperlink_color": {
"type": "string"
},
"background_color": {
"type": "string"
},
"block_text_color": {
"type": "string"
},
"cta_background_color": {
"type": "string"
},
"block_background_color": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set store product appearance",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Create, update, or delete one of your Store discount codes. Store discount codes are percentage-only; there are no fixed-amount or flat-rate codes. When the creator asks for an amount off, such as $10 off, tell them the Store supports only percentage discounts and offer the equivalent percentage of the product price from list_store_products; an amount at or above that price can only be 100% off (a free order). Omit discount_code_id to create a code; pass it from list_discount_codes to update or delete that exact row — never look a row up by code text, because duplicates can exist. Pass delete true with only discount_code_id to permanently delete that row; do not combine delete with discount_code, discount_amount, or store_item_id. discount_code is trimmed and uppercased, 1–200 characters, required on create. discount_amount is a 0–1 fraction required on create: 0.2 means 20% off and 1 means 100% off (a free order). Zero is invalid. A code works on exactly one product at checkout: store_item_id is required on create and must be one owned, non-deleted product from list_store_products. There is no code that covers every product; for several products, create one code per product, each with its own text. On update, omitted fields stay unchanged, store_item_id moves the code to another product, and a code attached to no product needs store_item_id before it can be updated. The same normalized code cannot be reused anywhere on the account — a code already in use on any product blocks a new or updated code with the same text. There is no expiry, usage limit, minimum-order rule, disable, archive, or restore. Create and update apply immediately. A delete first shows the code and writes nothing; after the creator confirms, call this tool again with the same discount_code_id and delete true to apply it.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
discount_code_id
The id of one of your own discount codes, from list_discount_codes. Omit to create. Required to update or delete. read it from list_discount_codes.
Clear enough to supply this argument.
discount_code
The code buyers type at checkout. Trimmed and stored uppercase. Up to 200 characters. Required on create. Do not send with delete true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
discount_amount
Percentage as a 0–1 fraction: 0.2 means 20% off, 1 means 100% off. Required on create. Greater than 0 and at most 1. Do not send with delete true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
store_item_id
The one product this code works on at checkout, from list_store_products. Required on create, and on updating a code attached to no product. Omitted on update: keep the current product. Do not send with delete true.
Clear enough to supply this argument.
delete
Pass true with only discount_code_id to permanently delete that code. Omit or false to create or update.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "set_discount_code",
"description": "Create, update, or delete one of your Store discount codes. Store discount codes are percentage-only; there are no fixed-amount or flat-rate codes. When the creator asks for an amount off, such as $10 off, tell them the Store supports only percentage discounts and offer the equivalent percentage of the product price from list_store_products; an amount at or above that price can only be 100% off (a free order). Omit discount_code_id to create a code; pass it from list_discount_codes to update or delete that exact row — never look a row up by code text, because duplicates can exist. Pass delete true with only discount_code_id to permanently delete that row; do not combine delete with discount_code, discount_amount, or store_item_id. discount_code is trimmed and uppercased, 1–200 characters, required on create. discount_amount is a 0–1 fraction required on create: 0.2 means 20% off and 1 means 100% off (a free order). Zero is invalid. A code works on exactly one product at checkout: store_item_id is required on create and must be one owned, non-deleted product from list_store_products. There is no code that covers every product; for several products, create one code per product, each with its own text. On update, omitted fields stay unchanged, store_item_id moves the code to another product, and a code attached to no product needs store_item_id before it can be updated. The same normalized code cannot be reused anywhere on the account — a code already in use on any product blocks a new or updated code with the same text. There is no expiry, usage limit, minimum-order rule, disable, archive, or restore. Create and update apply immediately. A delete first shows the code and writes nothing; after the creator confirms, call this tool again with the same discount_code_id and delete true to apply it.",
"inputSchema": {
"type": "object",
"properties": {
"delete": {
"type": "boolean",
"description": "Pass true with only discount_code_id to permanently delete that code. Omit or false to create or update."
},
"discount_code": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The code buyers type at checkout. Trimmed and stored uppercase. Up to 200 characters. Required on create. Do not send with delete true."
},
"store_item_id": {
"type": "string",
"description": "The one product this code works on at checkout, from list_store_products. Required on create, and on updating a code attached to no product. Omitted on update: keep the current product. Do not send with delete true."
},
"discount_amount": {
"type": "number",
"maximum": 1,
"description": "Percentage as a 0–1 fraction: 0.2 means 20% off, 1 means 100% off. Required on create. Greater than 0 and at most 1. Do not send with delete true.",
"exclusiveMinimum": 0
},
"discount_code_id": {
"type": "string",
"description": "The id of one of your own discount codes, from list_discount_codes. Omit to create. Required to update or delete. read it from list_discount_codes."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"note"
],
"properties": {
"note": {
"type": "string"
},
"reason": {
"enum": [
"proposed",
"reply_not_recognized",
"reply_check_unavailable",
"proposal_unknown",
"declined",
"superseded"
],
"type": "string"
},
"status": {
"enum": [
"needs_confirmation",
"ok",
"declined"
],
"type": "string"
},
"current": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"writable": {
"type": "boolean"
},
"operation": {
"enum": [
"delete",
"created",
"updated",
"deleted"
],
"type": "string"
},
"time_added": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"proposal_id": {
"type": "string"
},
"discount_code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"discount_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"store_item_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"discount_amount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"discount_code_id": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set discount code",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Edit your store-wide settings: terms and conditions, whether they are shown at checkout, the four tracking pixel ids, and whether the Beacons logo is hidden. Pass only the fields you are changing; anything you leave out keeps its current value. Pixel fields take the id only (GA4 Measurement ID, Meta Pixel ID, TikTok Pixel ID, Pinterest Tag ID), up to 30 characters, not the full snippet. An empty string clears that pixel. hide_branding is refused unless you are on Creator or higher, and SETTING a pixel id is refused unless you are on Creator Plus or higher — the store page only fires pixels on that plan. A refused call returns status needs_upgrade with the required_plan and writes nothing at all, including the other fields it carried. Clearing a pixel works on any plan. Whether you are emailed or pushed when something sells is NOT here — that is set_account_notification_settings. enable_payment_plans is not writable here.
The description explains the capability, when to use it, and what to expect.
Inputs79/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
terms_and_conditions
Checkout legal copy as HTML. Up to 20000 characters. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
enable_terms_and_conditions
Show the terms at checkout before a buyer pays.
Clear enough to supply this argument.
google_analytics
GA4 Measurement ID (G-XXXXXXXX), up to 30 characters. Empty string clears it. Setting an id needs Creator Plus or higher; clearing does not.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
meta_pixel
Meta Pixel ID, up to 30 characters. Empty string clears it. Setting an id needs Creator Plus or higher; clearing does not.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktok_pixel
TikTok Pixel ID, up to 30 characters. Empty string clears it. Setting an id needs Creator Plus or higher; clearing does not.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pinterest_tag
Pinterest Tag ID, up to 30 characters. Empty string clears it. Setting an id needs Creator Plus or higher; clearing does not.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
hide_branding
Hide the Beacons logo on the product page and confirmation email. Needs Creator or higher.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "set_store_settings",
"description": "Edit your store-wide settings: terms and conditions, whether they are shown at checkout, the four tracking pixel ids, and whether the Beacons logo is hidden. Pass only the fields you are changing; anything you leave out keeps its current value. Pixel fields take the id only (GA4 Measurement ID, Meta Pixel ID, TikTok Pixel ID, Pinterest Tag ID), up to 30 characters, not the full snippet. An empty string clears that pixel. hide_branding is refused unless you are on Creator or higher, and SETTING a pixel id is refused unless you are on Creator Plus or higher — the store page only fires pixels on that plan. A refused call returns status needs_upgrade with the required_plan and writes nothing at all, including the other fields it carried. Clearing a pixel works on any plan. Whether you are emailed or pushed when something sells is NOT here — that is set_account_notification_settings. enable_payment_plans is not writable here.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"meta_pixel": {
"type": "string",
"description": "Meta Pixel ID, up to 30 characters. Empty string clears it. Setting an id needs Creator Plus or higher; clearing does not."
},
"tiktok_pixel": {
"type": "string",
"description": "TikTok Pixel ID, up to 30 characters. Empty string clears it. Setting an id needs Creator Plus or higher; clearing does not."
},
"hide_branding": {
"type": "boolean",
"description": "Hide the Beacons logo on the product page and confirmation email. Needs Creator or higher."
},
"pinterest_tag": {
"type": "string",
"description": "Pinterest Tag ID, up to 30 characters. Empty string clears it. Setting an id needs Creator Plus or higher; clearing does not."
},
"google_analytics": {
"type": "string",
"description": "GA4 Measurement ID (G-XXXXXXXX), up to 30 characters. Empty string clears it. Setting an id needs Creator Plus or higher; clearing does not."
},
"terms_and_conditions": {
"type": "string",
"description": "Checkout legal copy as HTML. Up to 20000 characters. Empty string clears it."
},
"enable_terms_and_conditions": {
"type": "boolean",
"description": "Show the terms at checkout before a buyer pays."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"fields_updated",
"note"
],
"properties": {
"note": {
"type": "string"
},
"status": {
"enum": [
"needs_upgrade"
],
"type": "string"
},
"meta_pixel": {
"type": "string"
},
"tiktok_pixel": {
"type": "string"
},
"hide_branding": {
"type": "boolean"
},
"pinterest_tag": {
"type": "string"
},
"required_plan": {
"type": "string"
},
"fields_updated": {
"type": "array",
"items": {
"type": "string"
}
},
"cache_refreshed": {
"type": "boolean"
},
"google_analytics": {
"type": "string"
},
"terms_and_conditions": {
"type": "string"
},
"enable_terms_and_conditions": {
"type": "boolean"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set store settings",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Create a trackable Beacons short link pointing at a destination URL. Clicks are counted and readable through get_analytics with source links, whose overview lists every short link. Pass vanity_slug to get a readable URL on the creator’s handle as well as the generated one; both point at the same link and their clicks count together. A slug already in use on this handle is refused rather than reassigned.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
What the link is, for the creator’s own list. Max 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
destination_url
Absolute http(s) URL the short link redirects to.
Clear enough to supply this argument.
vanity_slug
Optional readable slug on the creator’s handle — letters, numbers, "_" and "-", at most 99 characters. Case-sensitive and never reassigned once taken.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "generate_short_link",
"description": "Create a trackable Beacons short link pointing at a destination URL. Clicks are counted and readable through get_analytics with source links, whose overview lists every short link. Pass vanity_slug to get a readable URL on the creator’s handle as well as the generated one; both point at the same link and their clicks count together. A slug already in use on this handle is refused rather than reassigned.",
"inputSchema": {
"type": "object",
"required": [
"title",
"destination_url"
],
"properties": {
"title": {
"type": "string",
"description": "What the link is, for the creator’s own list. Max 200 characters."
},
"vanity_slug": {
"type": "string",
"description": "Optional readable slug on the creator’s handle — letters, numbers, \"_\" and \"-\", at most 99 characters. Case-sensitive and never reassigned once taken."
},
"destination_url": {
"type": "string",
"description": "Absolute http(s) URL the short link redirects to."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"short_id",
"short_url",
"custom_short_urls",
"title",
"destination_url",
"note"
],
"properties": {
"note": {
"type": "string"
},
"title": {
"type": "string"
},
"short_id": {
"type": "string"
},
"short_url": {
"type": "string"
},
"destination_url": {
"type": "string"
},
"custom_short_urls": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Generate short link",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Repoint or retitle one of your own short links. The short URL and any vanity URLs keep working and keep their clicks. Vanity slugs are NOT changed. The redirect caches its destination for up to 10 minutes, so a repoint is not instant everywhere.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
short_id
The short link’s slug — the last path segment of its bcns.link URL, as the get_analytics links overview returns it.
Clear enough to supply this argument.
title
New title. Max 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
destination_url
New absolute http(s) destination. Omit to keep the current one.
{
"name": "update_short_link",
"description": "Repoint or retitle one of your own short links. The short URL and any vanity URLs keep working and keep their clicks. Vanity slugs are NOT changed. The redirect caches its destination for up to 10 minutes, so a repoint is not instant everywhere.",
"inputSchema": {
"type": "object",
"required": [
"short_id"
],
"properties": {
"title": {
"type": "string",
"description": "New title. Max 200 characters."
},
"short_id": {
"type": "string",
"description": "The short link’s slug — the last path segment of its bcns.link URL, as the get_analytics links overview returns it."
},
"destination_url": {
"type": "string",
"description": "New absolute http(s) destination. Omit to keep the current one."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"short_id",
"short_url",
"title",
"destination_url",
"custom_short_urls",
"note"
],
"properties": {
"note": {
"type": "string"
},
"title": {
"type": "string"
},
"short_id": {
"type": "string"
},
"short_url": {
"type": "string"
},
"destination_url": {
"type": "string"
},
"custom_short_urls": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update short link",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Who you are on Beacons: your username (handle), your public page URL, any custom domain, whether your email is verified, and which plans are active. Use this first when a question depends on what the account already has set up — "what is my url", "am I on Pro", "is my email verified". Also use it when you want a new username or page URL — "change my username", "update my username", "fix my Beacons URL", "change my page url": it returns the rules a new username must meet, what a username change does to your Beacons link and other links, whether this account can change it, and the Settings link where you make the change. It never renames. Call it again for each new name they suggest, because its rules are not carried into later messages. Reports entitlement, never billing: no amounts, invoices, cards, or renewal dates.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"name": "get_account",
"description": "Who you are on Beacons: your username (handle), your public page URL, any custom domain, whether your email is verified, and which plans are active. Use this first when a question depends on what the account already has set up — \"what is my url\", \"am I on Pro\", \"is my email verified\". Also use it when you want a new username or page URL — \"change my username\", \"update my username\", \"fix my Beacons URL\", \"change my page url\": it returns the rules a new username must meet, what a username change does to your Beacons link and other links, whether this account can change it, and the Settings link where you make the change. It never renames. Call it again for each new name they suggest, because its rules are not carried into later messages. Reports entitlement, never billing: no amounts, invoices, cards, or renewal dates.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"beacons_username",
"public_url",
"custom_domains",
"email_verified",
"country",
"active_plan_ids",
"has_beam_pro",
"management_organization_count",
"has_managers_subscription",
"note",
"username"
],
"properties": {
"note": {
"type": "string"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"username": {
"type": "object",
"required": [
"can_change",
"blocked_reason",
"rules",
"what_changes",
"settings_url",
"note"
],
"properties": {
"note": {
"type": "string"
},
"rules": {
"type": "array",
"items": {
"type": "string"
}
},
"can_change": {
"type": "boolean"
},
"settings_url": {
"type": "string"
},
"what_changes": {
"type": "array",
"items": {
"type": "string"
}
},
"blocked_reason": {
"anyOf": [
{
"enum": [
"no_username",
"contact_support",
"status_unknown"
],
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"public_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"has_beam_pro": {
"type": "boolean",
"description": "Deprecated and always true: Beam is free for every creator."
},
"custom_domains": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"email_verified": {
"type": "boolean"
},
"active_plan_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"beacons_username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"has_managers_subscription": {
"type": "boolean"
},
"management_organization_count": {
"type": "number"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get account",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Every integration on your account in one list — social accounts, payout methods, custom domains and the Google Workspace on them, and the Google Calendar and Zoom connections behind appointment bookings — each with whether it is connected, what broke and why in plain words, and a link to the page that repairs it. Use for "reconnect my Instagram", "why won't my YouTube connect", "why are my stats not syncing", "is my Stripe set up", "what email is my PayPal or Stripe on", "which PayPal connection does checkout use", "Express Checkout or Complete Payments" (Beacons has one PayPal connection, sometimes called PayPal Marketplace), "is my calendar connected for bookings", "do I have Google Workspace", "why isn't my custom domain connecting", "when does my domain renew", "when was my domain last renewed", "when did I last pay for my domain". Each custom domain carries a live DNS and SSL check and, for one bought through Beacons, its expiration date, auto-renew, renewal price and the last time Beacons charged for it. Also for "disconnect my tiktok", "unlink my Instagram", "switch to a different TikTok account", "disconnect my Google Calendar" or "disconnect Zoom": the creator disconnects or switches an account themselves in Settings, and this gives the steps and the link. A social account that failed to connect is listed even if it was never linked, a failed sign-in is listed even when another account on that platform is connected, and a failure with no specific cause carries a support code for Beacons support. Reconnecting is an OAuth round trip and cannot be done here, so a broken integration comes back with a fix link. A payout method reports whether it is attached and the email on that Stripe or PayPal account, never the account id. A conferencing entry reports that a grant is stored, not that it still works — for whether Beam itself can read the calendar, call get_google_calendar_connection_status instead.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Your store catalog: title, price, availability, inventory, and setup health flags (missing_delivery_asset, no_image, no_description, hidden, zero_views). Filter with product_type, availability, and search (case-insensitive title match). Omit every filter to list newest-first up to limit — the same unfiltered page as before. product_type values and what each supports: digital-products (file download after purchase; ~70% of catalog and ~93% of paid orders — ~84% of digital-product orders are free, so a store question is not automatically a revenue question), external-link (sends the buyer to a URL you host), beacons-affiliate (Beacons marketplace affiliate listing), appointments (bookable calendar time), brand-affiliate (a brand affiliate product on your store), course (gated course content), shopify-rye (Shopify product sold through Rye), membership (recurring membership access), shopify-rye-marketplace (Shopify marketplace product sold through Rye). missing_delivery_asset is only raised for digital-products and course. hidden is availability false. Prices are what a buyer is charged. Every product carries public_url, its shareable product page link, so "what are the links to my products" is answered from this tool alone — one call, no per-product follow-up. Rename, show, hide, or reprice a product by passing its product_id straight to update_store_product — no get_shop_product read first. store_item_version is the expected_store_item_version for adding a file, link, or review. Read the product with get_shop_product only when the edit needs its current contents: its checkout_description HTML, checkout_images, review ids, or the appointment availability and blocked dates being removed. Files are edited in Beacons. zero_views is a setup health flag (true when no views have been counted for the product page yet; today's views may not be counted), not a view count. Use it to decide whether to look up views; do not name the flag to the creator. For exact product page views, orders, and conversion rate per product, call get_analytics with source products, group_by product, metrics page_views, orders, conversion_rate. Never tell the creator view counts are unavailable. total_count is the number of products matching the filters across the whole catalog, independent of limit. Answer "how many products do I have" from total_count, never from the length of the returned list.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
How many products to return (default 50, max 200).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
product_type
Return only this catalog category. Omit for every type. One of: digital-products, appointments, membership, course, shopify-rye, external-link, shopify-rye-marketplace, beacons-affiliate, brand-affiliate.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
availability
true for storefront-visible products, false for hidden ones. Omit for both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Case-insensitive title match. Omit for no title filter.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "list_store_products",
"description": "Your store catalog: title, price, availability, inventory, and setup health flags (missing_delivery_asset, no_image, no_description, hidden, zero_views). Filter with product_type, availability, and search (case-insensitive title match). Omit every filter to list newest-first up to limit — the same unfiltered page as before. product_type values and what each supports: digital-products (file download after purchase; ~70% of catalog and ~93% of paid orders — ~84% of digital-product orders are free, so a store question is not automatically a revenue question), external-link (sends the buyer to a URL you host), beacons-affiliate (Beacons marketplace affiliate listing), appointments (bookable calendar time), brand-affiliate (a brand affiliate product on your store), course (gated course content), shopify-rye (Shopify product sold through Rye), membership (recurring membership access), shopify-rye-marketplace (Shopify marketplace product sold through Rye). missing_delivery_asset is only raised for digital-products and course. hidden is availability false. Prices are what a buyer is charged. Every product carries public_url, its shareable product page link, so \"what are the links to my products\" is answered from this tool alone — one call, no per-product follow-up. Rename, show, hide, or reprice a product by passing its product_id straight to update_store_product — no get_shop_product read first. store_item_version is the expected_store_item_version for adding a file, link, or review. Read the product with get_shop_product only when the edit needs its current contents: its checkout_description HTML, checkout_images, review ids, or the appointment availability and blocked dates being removed. Files are edited in Beacons. zero_views is a setup health flag (true when no views have been counted for the product page yet; today's views may not be counted), not a view count. Use it to decide whether to look up views; do not name the flag to the creator. For exact product page views, orders, and conversion rate per product, call get_analytics with source products, group_by product, metrics page_views, orders, conversion_rate. Never tell the creator view counts are unavailable. total_count is the number of products matching the filters across the whole catalog, independent of limit. Answer \"how many products do I have\" from total_count, never from the length of the returned list.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "How many products to return (default 50, max 200)."
},
"search": {
"type": "string",
"description": "Case-insensitive title match. Omit for no title filter."
},
"availability": {
"type": "boolean",
"description": "true for storefront-visible products, false for hidden ones. Omit for both."
},
"product_type": {
"enum": [
"digital-products",
"appointments",
"membership",
"course",
"shopify-rye",
"external-link",
"shopify-rye-marketplace",
"beacons-affiliate",
"brand-affiliate"
],
"type": "string",
"description": "Return only this catalog category. Omit for every type. One of: digital-products, appointments, membership, course, shopify-rye, external-link, shopify-rye-marketplace, beacons-affiliate, brand-affiliate."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"products",
"product_count",
"total_count",
"has_more",
"note"
],
"properties": {
"note": {
"type": "string"
},
"has_more": {
"type": "boolean"
},
"products": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"truncated": {
"type": "boolean"
},
"total_count": {
"type": "number"
},
"amounts_note": {
"type": "string"
},
"product_count": {
"type": "number"
},
"filters_applied": {
"type": "object",
"required": [
"product_type",
"availability",
"search"
],
"properties": {
"search": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"availability": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"product_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"products_hidden": {
"type": "array",
"items": {
"type": "string"
}
},
"products_no_image": {
"type": "array",
"items": {
"type": "string"
}
},
"products_zero_views": {
"type": "array",
"items": {
"type": "string"
}
},
"products_no_description": {
"type": "array",
"items": {
"type": "string"
}
},
"products_missing_delivery_asset": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get store products",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
List your Store discount codes, newest first. discount_amount is a 0–1 fraction: 0.2 means 20% off. store_item_id is the one product a code works on at checkout; a row with store_item_id null is attached to no product, so buyers cannot redeem it anywhere until set_discount_code gives it one. Optional discount_code is an exact match after trim and uppercase. Optional store_item_id omitted returns every code, null returns only codes attached to no product, and a UUID returns codes for that product. Store discount codes are percentage-only; there are no fixed-amount or flat-rate codes. writable is true on every row: set_discount_code can update it, or delete it with delete true and that row's discount_code_id. There is no expiry, usage-limit, or minimum-order capability.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
discount_code
Optional exact code filter, trimmed and uppercased before matching.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
store_item_id
Omitted: every code. Null: only codes attached to no product, which buyers cannot redeem. UUID: codes for that owned product.
Clear enough to supply this argument.
limit
How many codes to return (default 50, max 200).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "list_discount_codes",
"description": "List your Store discount codes, newest first. discount_amount is a 0–1 fraction: 0.2 means 20% off. store_item_id is the one product a code works on at checkout; a row with store_item_id null is attached to no product, so buyers cannot redeem it anywhere until set_discount_code gives it one. Optional discount_code is an exact match after trim and uppercase. Optional store_item_id omitted returns every code, null returns only codes attached to no product, and a UUID returns codes for that product. Store discount codes are percentage-only; there are no fixed-amount or flat-rate codes. writable is true on every row: set_discount_code can update it, or delete it with delete true and that row's discount_code_id. There is no expiry, usage-limit, or minimum-order capability.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "How many codes to return (default 50, max 200)."
},
"discount_code": {
"type": "string",
"description": "Optional exact code filter, trimmed and uppercased before matching."
},
"store_item_id": {
"type": [
"string",
"null"
],
"description": "Omitted: every code. Null: only codes attached to no product, which buyers cannot redeem. UUID: codes for that owned product."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"discount_codes",
"truncated",
"note"
],
"properties": {
"note": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"discount_codes": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "List discount codes",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Read which notifications reach you: the emails and mobile pushes for store activity — a free download, a paid sale, a new subscriber — and whether Beacons emails you a receipt when it charges your own Beacons subscription. Answers "am I notified when someone buys something?" and "do I get a receipt for my Beacons subscription?". Each field is true when that notification is currently being sent. Appointment booking reminders are always sent and are not listed. There is no notification timing, quiet hours, digest, or per-product notification setting. Read-only — set_account_notification_settings changes any of it.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"name": "get_account_notification_settings",
"description": "Read which notifications reach you: the emails and mobile pushes for store activity — a free download, a paid sale, a new subscriber — and whether Beacons emails you a receipt when it charges your own Beacons subscription. Answers \"am I notified when someone buys something?\" and \"do I get a receipt for my Beacons subscription?\". Each field is true when that notification is currently being sent. Appointment booking reminders are always sent and are not listed. There is no notification timing, quiet hours, digest, or per-product notification setting. Read-only — set_account_notification_settings changes any of it.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"settings",
"note"
],
"properties": {
"note": {
"type": "string"
},
"settings": {
"type": "object",
"required": [
"email_on_free_sale",
"email_on_paid_sale",
"push_on_sale",
"push_on_new_subscriber",
"push_on_affiliate_recommendations",
"email_on_subscription_charge"
],
"properties": {
"push_on_sale": {
"type": "boolean"
},
"email_on_free_sale": {
"type": "boolean"
},
"email_on_paid_sale": {
"type": "boolean"
},
"push_on_new_subscriber": {
"type": "boolean"
},
"email_on_subscription_charge": {
"type": "boolean"
},
"push_on_affiliate_recommendations": {
"type": "boolean"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get notification settings",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Turn your notifications on or off. Use this whenever someone wants to stop or start being notified — "stop emailing me every time something sells", "turn push notifications back on for new sales", "notify me about subscribers but not free downloads", "send me a receipt for my Beacons subscription". Covers store activity (free sales, paid sales, new subscribers, affiliate suggestions) and the receipt for your own Beacons subscription charge. Pass only the fields you are changing; every other notification is left exactly as it was. Each field is true to receive that notification and false to stop it. This changes ONLY whether notifications are sent — it cannot change your plan, your card, what you are charged, or anything else about your subscription, and it does not touch your store settings. It is NOT your email marketing sender settings (set_email_marketing_settings), and NOT Beam's own daily brief, reminders, or proactive texts, which live in Beam's settings. Notification timing, quiet hours, digests, and per-product notification settings do not exist — do not offer them. Free on every plan.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
email_on_free_sale
Email you when a free ($0) download or sale comes in. False stops those emails.
Clear enough to supply this argument.
email_on_paid_sale
Email you when a paid (over $0) sale comes in. This same setting also controls the email you get when a subscriber cancels a membership, so turning it off silences both.
Clear enough to supply this argument.
email_on_subscription_charge
Email you a receipt when Beacons charges your own recurring Beacons subscription. Off by default. This only controls whether that receipt email is sent — it does not change your plan, your card, what you are charged, or anything else about the subscription.
Clear enough to supply this argument.
push_on_sale
Send a mobile push notification on every sale, free or paid, to the Beacons app.
Clear enough to supply this argument.
push_on_new_subscriber
Send a mobile push notification when someone new subscribes, to the Beacons app.
Clear enough to supply this argument.
push_on_affiliate_recommendations
Send a mobile push notification recommending affiliate products to promote. This is a suggestion from Beacons, not a notification about your own store activity.
{
"name": "set_account_notification_settings",
"description": "Turn your notifications on or off. Use this whenever someone wants to stop or start being notified — \"stop emailing me every time something sells\", \"turn push notifications back on for new sales\", \"notify me about subscribers but not free downloads\", \"send me a receipt for my Beacons subscription\". Covers store activity (free sales, paid sales, new subscribers, affiliate suggestions) and the receipt for your own Beacons subscription charge. Pass only the fields you are changing; every other notification is left exactly as it was. Each field is true to receive that notification and false to stop it. This changes ONLY whether notifications are sent — it cannot change your plan, your card, what you are charged, or anything else about your subscription, and it does not touch your store settings. It is NOT your email marketing sender settings (set_email_marketing_settings), and NOT Beam's own daily brief, reminders, or proactive texts, which live in Beam's settings. Notification timing, quiet hours, digests, and per-product notification settings do not exist — do not offer them. Free on every plan.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"push_on_sale": {
"type": "boolean",
"description": "Send a mobile push notification on every sale, free or paid, to the Beacons app."
},
"email_on_free_sale": {
"type": "boolean",
"description": "Email you when a free ($0) download or sale comes in. False stops those emails."
},
"email_on_paid_sale": {
"type": "boolean",
"description": "Email you when a paid (over $0) sale comes in. This same setting also controls the email you get when a subscriber cancels a membership, so turning it off silences both."
},
"push_on_new_subscriber": {
"type": "boolean",
"description": "Send a mobile push notification when someone new subscribes, to the Beacons app."
},
"email_on_subscription_charge": {
"type": "boolean",
"description": "Email you a receipt when Beacons charges your own recurring Beacons subscription. Off by default. This only controls whether that receipt email is sent — it does not change your plan, your card, what you are charged, or anything else about the subscription."
},
"push_on_affiliate_recommendations": {
"type": "boolean",
"description": "Send a mobile push notification recommending affiliate products to promote. This is a suggestion from Beacons, not a notification about your own store activity."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"fields_updated",
"settings",
"note"
],
"properties": {
"note": {
"type": "string"
},
"settings": {
"type": "object",
"required": [
"email_on_free_sale",
"email_on_paid_sale",
"push_on_sale",
"push_on_new_subscriber",
"push_on_affiliate_recommendations",
"email_on_subscription_charge"
],
"properties": {
"push_on_sale": {
"type": "boolean"
},
"email_on_free_sale": {
"type": "boolean"
},
"email_on_paid_sale": {
"type": "boolean"
},
"push_on_new_subscriber": {
"type": "boolean"
},
"email_on_subscription_charge": {
"type": "boolean"
},
"push_on_affiliate_recommendations": {
"type": "boolean"
}
},
"additionalProperties": false
},
"fields_updated": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set notification settings",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Your store-wide settings in one place: terms and conditions, whether Beacons branding is hidden, whether payment plans are offered, the four tracking pixels. Currency is set per product with update_store_product. There is no store-wide currency, tax, category, shipping, or abandoned-cart setting, and which sale notifications reach you lives in get_account_notification_settings, not here. Read-only.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Your store orders with per-currency totals: what sold, what state each order is in (completed, refunded, declined, or still open), the buyer name, email and shipping address on each order, and both gross earnings and earnings net of the Beacons fee. Also your Beacons affiliate sales, orders for another creator's product you resell, with the commission, Beacons fee and payout you earned on each and its commission status (available, processing, in-flight, paid, denied), in affiliate_orders and affiliate_by_currency. This is the read for who bought or ordered a physical product and where to ship or mail it: buyer shipping addresses are in shipping_address_line_1 through shipping_country, and shipping_address_status says whether one is on file. Each store order also carries the buyer's answer to the product's custom checkout question in checkout_answers. Also holds donations and legacy paid requests, so the response says how many of the orders are actual storefront sales. State comes from the order timestamps, so a refund is never hidden behind the completion before it, and refunded orders are excluded from earnings rather than deducted. Every order carries the traffic source it came from (instagram, tiktok, youtube, facebook, direct, and so on), and by_source rolls those up per currency with an average order value, read against the account's own average in by_currency, which is what answers which source drives higher-value orders. This is also the read for how many active members or subscribers a membership has: every membership renewal is its own order, so by_membership counts members per membership product (active right now, ended or cancelled, and started in the date range), and each membership order says whether its recurring subscription is still active. When a buyer never got their receipt, this is the read that finds the order: pass its order_id to send_store_order_confirmation to resend that confirmation email. Optional filters: order_id (one order), product_id (one product; this is orders.asset_id), state (completed / refunded / declined / open), status (raw orders.status, usually store_purchase or donation), since and until (YYYY-MM-DD). Returns order objects, not a spreadsheet download. This tool never refunds, edits, or deletes an order.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
How many orders to return (default 25, max 100).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Only orders created on or after this date (YYYY-MM-DD). Omit for all time.
Clear enough to supply this argument.
until
Only orders created on or before this date (YYYY-MM-DD). Omit for no end bound.
Clear enough to supply this argument.
order_id
Return only this order. Must be one of your own order ids.
Clear enough to supply this argument.
product_id
Return only orders for this Shop product. This is store_items.id / orders.asset_id, from list_store_products.
Clear enough to supply this argument.
state
Derived order state: completed, refunded, declined, or open. Use this for "refunded orders" — raw status on a store purchase is almost always store_purchase.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Raw orders.status type, most often store_purchase or donation. Not the completed/refunded/declined/open state — use state for that.
{
"name": "list_store_orders",
"description": "Your store orders with per-currency totals: what sold, what state each order is in (completed, refunded, declined, or still open), the buyer name, email and shipping address on each order, and both gross earnings and earnings net of the Beacons fee. Also your Beacons affiliate sales, orders for another creator's product you resell, with the commission, Beacons fee and payout you earned on each and its commission status (available, processing, in-flight, paid, denied), in affiliate_orders and affiliate_by_currency. This is the read for who bought or ordered a physical product and where to ship or mail it: buyer shipping addresses are in shipping_address_line_1 through shipping_country, and shipping_address_status says whether one is on file. Each store order also carries the buyer's answer to the product's custom checkout question in checkout_answers. Also holds donations and legacy paid requests, so the response says how many of the orders are actual storefront sales. State comes from the order timestamps, so a refund is never hidden behind the completion before it, and refunded orders are excluded from earnings rather than deducted. Every order carries the traffic source it came from (instagram, tiktok, youtube, facebook, direct, and so on), and by_source rolls those up per currency with an average order value, read against the account's own average in by_currency, which is what answers which source drives higher-value orders. This is also the read for how many active members or subscribers a membership has: every membership renewal is its own order, so by_membership counts members per membership product (active right now, ended or cancelled, and started in the date range), and each membership order says whether its recurring subscription is still active. When a buyer never got their receipt, this is the read that finds the order: pass its order_id to send_store_order_confirmation to resend that confirmation email. Optional filters: order_id (one order), product_id (one product; this is orders.asset_id), state (completed / refunded / declined / open), status (raw orders.status, usually store_purchase or donation), since and until (YYYY-MM-DD). Returns order objects, not a spreadsheet download. This tool never refunds, edits, or deletes an order.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "How many orders to return (default 25, max 100)."
},
"since": {
"type": "string",
"description": "Only orders created on or after this date (YYYY-MM-DD). Omit for all time."
},
"state": {
"enum": [
"completed",
"refunded",
"declined",
"open"
],
"type": "string",
"description": "Derived order state: completed, refunded, declined, or open. Use this for \"refunded orders\" — raw status on a store purchase is almost always store_purchase."
},
"until": {
"type": "string",
"description": "Only orders created on or before this date (YYYY-MM-DD). Omit for no end bound."
},
"status": {
"type": "string",
"description": "Raw orders.status type, most often store_purchase or donation. Not the completed/refunded/declined/open state — use state for that."
},
"order_id": {
"type": "string",
"description": "Return only this order. Must be one of your own order ids."
},
"product_id": {
"type": "string",
"description": "Return only orders for this Shop product. This is store_items.id / orders.asset_id, from list_store_products."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"orders",
"by_currency",
"by_source",
"by_membership",
"affiliate_orders",
"affiliate_by_currency",
"note"
],
"properties": {
"note": {
"type": "string"
},
"orders": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"by_source": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"truncated": {
"type": "boolean"
},
"by_currency": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"amounts_note": {
"type": "string"
},
"by_membership": {
"type": "array",
"items": {
"type": "object",
"required": [
"product_id",
"title",
"member_count",
"active_member_count",
"ended_member_count",
"members_started_in_range"
],
"properties": {
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"product_id": {
"type": "string"
},
"member_count": {
"type": "integer"
},
"ended_member_count": {
"type": "integer"
},
"active_member_count": {
"type": "integer"
},
"members_started_in_range": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
},
"affiliate_orders": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"affiliate_truncated": {
"type": "boolean"
},
"returned_order_count": {
"type": "number"
},
"affiliate_by_currency": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get store orders",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Align the title with the capability actually described by this tool.
Description95/100
Money questions about getting paid: "when do I get paid", "have I been paid", "where is my money", "what is my payout history", "am I set up to get paid", "how much have I made", "how much have I earned", "cash me out", "is my PayPal or Stripe connected", "which PayPal connection does checkout use". Returns whether a Stripe or PayPal method is attached (with a repair link when none is), lifetime earnings as gross and Beacons fee per currency, Beacons affiliate commissions earned reselling another creator's product (available to cash out, in payout, and paid), and the link to the Payouts page in Beacons. Call it for any of those asks — do not refuse them. For store sales it CANNOT report your available balance, next payout date, tax documents, or the record of individual payouts already sent: Beacons does not hold those, Stripe and PayPal do, and they are reached through the Payouts page this tool returns. Say so and hand over that link rather than inferring any of it from earnings. Beacons cannot move money, so there is no cash-out tool — a creator asking to cash out gets the same page.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
since
Only orders completed on or after this calendar date (YYYY-MM-DD). Omit for all time.
{
"name": "list_payouts",
"description": "Money questions about getting paid: \"when do I get paid\", \"have I been paid\", \"where is my money\", \"what is my payout history\", \"am I set up to get paid\", \"how much have I made\", \"how much have I earned\", \"cash me out\", \"is my PayPal or Stripe connected\", \"which PayPal connection does checkout use\". Returns whether a Stripe or PayPal method is attached (with a repair link when none is), lifetime earnings as gross and Beacons fee per currency, Beacons affiliate commissions earned reselling another creator's product (available to cash out, in payout, and paid), and the link to the Payouts page in Beacons. Call it for any of those asks — do not refuse them. For store sales it CANNOT report your available balance, next payout date, tax documents, or the record of individual payouts already sent: Beacons does not hold those, Stripe and PayPal do, and they are reached through the Payouts page this tool returns. Say so and hand over that link rather than inferring any of it from earnings. Beacons cannot move money, so there is no cash-out tool — a creator asking to cash out gets the same page.",
"inputSchema": {
"type": "object",
"properties": {
"since": {
"type": "string",
"description": "Only orders completed on or after this calendar date (YYYY-MM-DD). Omit for all time."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"payout_methods",
"has_payout_method",
"earnings_by_currency",
"affiliate_commissions_by_currency",
"payouts_page",
"unavailable_here",
"note"
],
"properties": {
"note": {
"type": "string"
},
"amounts_note": {
"type": "string"
},
"payouts_page": {
"type": "object",
"required": [
"pathname",
"url"
],
"properties": {
"url": {
"type": "string"
},
"pathname": {
"type": "string"
}
},
"additionalProperties": false
},
"payout_methods": {
"type": "object",
"required": [
"stripe_connected",
"paypal_connected",
"paypal_marketplace_connected",
"paypal_integration",
"email_verified",
"payments_suspended"
],
"properties": {
"email_verified": {
"type": "boolean"
},
"paypal_connected": {
"type": "boolean",
"description": "Deprecated: read paypal_integration. True when a PayPal merchant account is connected; checkout still refuses it while email_verified is false or payments_suspended is true."
},
"stripe_connected": {
"type": "boolean"
},
"payments_suspended": {
"type": "boolean"
},
"paypal_integration": {
"anyOf": [
{
"enum": [
"ppcp",
"express_checkout"
],
"type": "string"
},
{
"type": "null"
}
]
},
"paypal_marketplace_connected": {
"type": "boolean",
"description": "Deprecated: always equal to paypal_connected."
}
},
"additionalProperties": false
},
"unavailable_here": {
"type": "array",
"items": {
"type": "string"
}
},
"has_payout_method": {
"type": "boolean"
},
"earnings_by_currency": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"affiliate_commissions_by_currency": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get payouts",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Your recent posts on one platform (up to 20 from the last 60 days), newest first, with thumbnail, content type, title, duration, caption, available view/like/comment counts and permalink. This is the source of post identity: work out which post the creator means from these captions, permalinks, timestamps and thumbnails, never from a Smart Reply list. post_source says whether Instagram was checked live. Never call a cached result latest, newest, or today. Use instagram_post_id for Smart Reply and content_id for Link in Bio feed post_ids; never construct an id from a URL. Feed writes resolve owned cached posts and may refuse a live Instagram post until it is cached. A healthy connection is only needed for Instagram auto-sync, not static cached feeds.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
platform
Which platform to read (default instagram).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
How many posts to return, newest first (default and max 20).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include_existing_triggers
Adds existing_trigger, the Smart Reply automation already on each Instagram post (default false). Opt in only to report what is running on a post you have already identified — never to work out which post the creator means.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Comments on one of your own Instagram or TikTok posts: each comment's text, author username, and like count. Pass that post's instagram_post_id as content_id from list_creator_platform_posts — that field is the post id on Instagram and TikTok. Never invent one from a URL. If truncated is true, pass next_cursor back as cursor on the same platform and content_id to read the next page. If Instagram or TikTok is not connected or the session expired, the result carries reconnect_url: give the creator that link and do not invent comments.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
platform
Which connected platform to read comments from.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content_id
The post id from list_creator_platform_posts (instagram_post_id / content_id).
Clear enough to supply this argument.
limit
How many comments to return (default 50, max 250).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
next_cursor from a previous call; omit for the first page.
{
"name": "get_post_comments",
"description": "Comments on one of your own Instagram or TikTok posts: each comment's text, author username, and like count. Pass that post's instagram_post_id as content_id from list_creator_platform_posts — that field is the post id on Instagram and TikTok. Never invent one from a URL. If truncated is true, pass next_cursor back as cursor on the same platform and content_id to read the next page. If Instagram or TikTok is not connected or the session expired, the result carries reconnect_url: give the creator that link and do not invent comments.",
"inputSchema": {
"type": "object",
"required": [
"platform",
"content_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 250,
"minimum": 1,
"description": "How many comments to return (default 50, max 250)."
},
"cursor": {
"type": "string",
"description": "next_cursor from a previous call; omit for the first page."
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "Which connected platform to read comments from."
},
"content_id": {
"type": "string",
"description": "The post id from list_creator_platform_posts (instagram_post_id / content_id)."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"comments",
"count",
"truncated",
"connected",
"status",
"reconnect_url",
"next_cursor",
"note"
],
"properties": {
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"count": {
"type": "number"
},
"status": {
"type": "string"
},
"comments": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"connected": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
},
"next_cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"reconnect_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"comment_count_on_post": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get post comments",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Every Smart Reply automation on your Instagram account — post-specific, any-post, and DM/story — with per-automation send and click stats and whether the Instagram connection is healthy. It identifies the one Instagram account configured for Smart Reply and every Instagram account connected to Beacons. Smart Reply supports one account at a time, and this tool cannot switch it. It warns when account state is ambiguous or incomplete. Never use a Smart Reply list to identify a post. Post identity comes only from published-post metadata and image or content evidence — the captions, permalinks, timestamps and thumbnails from list_creator_platform_posts. Once you have an instagram_post_id from there, call this with that id to see whether that post already has an automation. Called with no arguments it is the whole inventory, which answers "what automations do I have?" and nothing about which post the creator means. A post automation shadows any-post automations on its post, and duplicate keywords across any-post or across DM automations are rejected.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
instagram_post_id
Narrows the post automations to this one post, once you have identified it with list_creator_platform_posts. The any-post and DM automations are still returned whole.
{
"name": "list_smart_replies",
"description": "Every Smart Reply automation on your Instagram account — post-specific, any-post, and DM/story — with per-automation send and click stats and whether the Instagram connection is healthy. It identifies the one Instagram account configured for Smart Reply and every Instagram account connected to Beacons. Smart Reply supports one account at a time, and this tool cannot switch it. It warns when account state is ambiguous or incomplete. Never use a Smart Reply list to identify a post. Post identity comes only from published-post metadata and image or content evidence — the captions, permalinks, timestamps and thumbnails from list_creator_platform_posts. Once you have an instagram_post_id from there, call this with that id to see whether that post already has an automation. Called with no arguments it is the whole inventory, which answers \"what automations do I have?\" and nothing about which post the creator means. A post automation shadows any-post automations on its post, and duplicate keywords across any-post or across DM automations are rejected.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"instagram_post_id": {
"type": "string",
"description": "Narrows the post automations to this one post, once you have identified it with list_creator_platform_posts. The any-post and DM automations are still returned whole."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"comment_triggers",
"global_triggers",
"dm_triggers",
"trigger_stats",
"instagram_session_expired",
"smart_reply_instagram_username",
"connected_instagram_usernames",
"smart_reply_account_limit",
"watermark_hide_allowed",
"note"
],
"properties": {
"note": {
"type": "string"
},
"dm_triggers": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"trigger_stats": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"global_triggers": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"comment_triggers": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"watermark_hide_allowed": {
"type": "boolean"
},
"instagram_session_expired": {
"type": "boolean"
},
"smart_reply_account_limit": {
"type": "integer"
},
"connected_instagram_usernames": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"smart_reply_instagram_username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Smart Replies",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Create, edit, or move one Instagram Smart Reply automation, Beacons' built-in alternative to ManyChat. Omit trigger_id to create; pass the trigger_id from a list tool to edit. Passing a trigger_type that differs from the automation's current one moves it — it keeps its id and its stats, and moving to a DM automation drops its public comment replies. Keywords are lowercased and deduped. exact_match defaults to true, which is what the builder does — contains matching is broad, so a keyword of "link" also fires on "linkedin". Destinations become buttons (max 3): an external_link needs only its url, while link_in_bio, products and collections also need the item_id of something the creator owns. Never use a Smart Reply list to identify a post. Post identity comes only from published-post metadata and image or content evidence — the captions, permalinks, timestamps and thumbnails from list_creator_platform_posts. Once the post is chosen, list_smart_replies with that instagram_post_id says whether it is free, and duplicate keywords across any-post or across DM automations are rejected. A create aimed at a post that already has an automation is refused: edit that automation by its trigger_id, or pick another post. The same call can change opening DM copy, follower gating, the one-time no-click reminder, and email collection — which asks the recipient to reply with their email address and saves it to the audience list. Plans below Creator Plus add a Sent with Beacons note after the payload. This tool cannot undo a completed change. If the creator asks to undo, never create or pause another automation; re-read the current automation and explain that its previous values are unavailable. Call list_smart_replies first. This tool writes only to smart_reply_instagram_username; it cannot target or switch to another connected Instagram account.
The description explains the capability, when to use it, and what to expect.
Inputs74/100
19 of 22 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
trigger_type
'post' runs on one post, 'global' on any post, 'dm' on DMs and story replies.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
instagram_post_id
Required for trigger_type "post". Use the id from list_creator_platform_posts, never one built from a URL.
Clear enough to supply this argument.
trigger_id
Omit to create a new automation; pass it to edit an existing one.
Clear enough to supply this argument.
keywords
At least one trigger word. There is no keyword-less catch-all — if they asked to answer every story reply or DM, ask for a word and call again once they give one. Do not create_gap_report.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message_text
The DM that gets sent (max 900 characters). With destinations attached it becomes a card title, which Instagram cuts near 80 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
exact_match
True (default) matches the whole comment; false matches the keyword anywhere in it.
Clear enough to supply this argument.
destinations › items › source
Not provided
Missing description. Explain what this value means and how to supply it.
destinations › items › url
Not provided
Missing description. Explain what this value means and how to supply it.
destinations › items › button_text
Not provided
Missing description. Explain what this value means and how to supply it.
destinations › items › item_id
Required unless source is 'external_link'. When editing, pass back the item_id from list_smart_replies so the existing tracked link and its click history are kept.
Clear enough to supply this argument.
comment_reply_variations
Up to 10 public replies posted on the comment, picked at random per fire so the comment section does not look automated. Comment automations only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
opening_dm_enabled
Use a tap-to-open message before the payload. Comment automations only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
opening_dm_text
Opening message shown before the payload (max 80 characters).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
opening_dm_button_text
Opening message button label (max 20 characters).
Clear enough to supply this argument.
require_follow_enabled
When true, only followers receive the payload. Asked after the email step when both are on. Requires an opening DM.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
follow_nudge_text
Message sent to a non-follower (max 200 characters).
Clear enough to supply this argument.
follow_up_enabled
Send one reminder when the recipient does not open the payload link. Requires a destination and, for comment automations, an opening DM.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
follow_up_text
No-click reminder message (max 200 characters).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
follow_up_delay_minutes
Send the no-click reminder after 30 minutes, 2 hours, or 12 hours.
Clear enough to supply this argument.
collect_email_enabled
Ask the recipient to reply with their email address before the payload goes out, and save a valid reply to the audience list. This is the first step of the conversation, and the link is withheld until it clears. Requires an opening DM on comment automations.
Clear enough to supply this argument.
collect_email_text
Message asking for the email address (max 200 characters). A subscription consent notice is appended when it sends, so do not write one.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
collect_email_confirm_text
Deprecated and ignored. No confirmation message is sent any more: the payload link follows a saved email immediately and acknowledges it. Still accepted so existing callers do not break, but never stored or sent.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "set_smart_reply",
"description": "Create, edit, or move one Instagram Smart Reply automation, Beacons' built-in alternative to ManyChat. Omit trigger_id to create; pass the trigger_id from a list tool to edit. Passing a trigger_type that differs from the automation's current one moves it — it keeps its id and its stats, and moving to a DM automation drops its public comment replies. Keywords are lowercased and deduped. exact_match defaults to true, which is what the builder does — contains matching is broad, so a keyword of \"link\" also fires on \"linkedin\". Destinations become buttons (max 3): an external_link needs only its url, while link_in_bio, products and collections also need the item_id of something the creator owns. Never use a Smart Reply list to identify a post. Post identity comes only from published-post metadata and image or content evidence — the captions, permalinks, timestamps and thumbnails from list_creator_platform_posts. Once the post is chosen, list_smart_replies with that instagram_post_id says whether it is free, and duplicate keywords across any-post or across DM automations are rejected. A create aimed at a post that already has an automation is refused: edit that automation by its trigger_id, or pick another post. The same call can change opening DM copy, follower gating, the one-time no-click reminder, and email collection — which asks the recipient to reply with their email address and saves it to the audience list. Plans below Creator Plus add a Sent with Beacons note after the payload. This tool cannot undo a completed change. If the creator asks to undo, never create or pause another automation; re-read the current automation and explain that its previous values are unavailable. Call list_smart_replies first. This tool writes only to smart_reply_instagram_username; it cannot target or switch to another connected Instagram account.",
"inputSchema": {
"type": "object",
"required": [
"trigger_type",
"keywords",
"message_text"
],
"properties": {
"keywords": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "At least one trigger word. There is no keyword-less catch-all — if they asked to answer every story reply or DM, ask for a word and call again once they give one. Do not create_gap_report."
},
"trigger_id": {
"type": "string",
"description": "Omit to create a new automation; pass it to edit an existing one."
},
"exact_match": {
"type": "boolean",
"description": "True (default) matches the whole comment; false matches the keyword anywhere in it."
},
"destinations": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"url",
"button_text"
],
"properties": {
"url": {
"type": "string"
},
"source": {
"enum": [
"external_link",
"link_in_bio",
"products",
"collections"
],
"type": "string"
},
"item_id": {
"type": "string",
"description": "Required unless source is 'external_link'. When editing, pass back the item_id from list_smart_replies so the existing tracked link and its click history are kept."
},
"button_text": {
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 3,
"description": "Up to 3 tappable buttons. Omit for a plain text DM."
},
"message_text": {
"type": "string",
"maxLength": 900,
"description": "The DM that gets sent (max 900 characters). With destinations attached it becomes a card title, which Instagram cuts near 80 characters."
},
"trigger_type": {
"enum": [
"post",
"global",
"dm"
],
"type": "string",
"description": "'post' runs on one post, 'global' on any post, 'dm' on DMs and story replies."
},
"follow_up_text": {
"type": "string",
"maxLength": 200,
"description": "No-click reminder message (max 200 characters)."
},
"opening_dm_text": {
"type": "string",
"maxLength": 80,
"description": "Opening message shown before the payload (max 80 characters)."
},
"follow_nudge_text": {
"type": "string",
"maxLength": 200,
"description": "Message sent to a non-follower (max 200 characters)."
},
"follow_up_enabled": {
"type": "boolean",
"description": "Send one reminder when the recipient does not open the payload link. Requires a destination and, for comment automations, an opening DM."
},
"instagram_post_id": {
"type": "string",
"description": "Required for trigger_type \"post\". Use the id from list_creator_platform_posts, never one built from a URL."
},
"collect_email_text": {
"type": "string",
"maxLength": 200,
"description": "Message asking for the email address (max 200 characters). A subscription consent notice is appended when it sends, so do not write one."
},
"opening_dm_enabled": {
"type": "boolean",
"description": "Use a tap-to-open message before the payload. Comment automations only."
},
"collect_email_enabled": {
"type": "boolean",
"description": "Ask the recipient to reply with their email address before the payload goes out, and save a valid reply to the audience list. This is the first step of the conversation, and the link is withheld until it clears. Requires an opening DM on comment automations."
},
"opening_dm_button_text": {
"type": "string",
"maxLength": 20,
"description": "Opening message button label (max 20 characters)."
},
"require_follow_enabled": {
"type": "boolean",
"description": "When true, only followers receive the payload. Asked after the email step when both are on. Requires an opening DM."
},
"follow_up_delay_minutes": {
"enum": [
30,
120,
720
],
"type": "integer",
"description": "Send the no-click reminder after 30 minutes, 2 hours, or 12 hours."
},
"comment_reply_variations": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"description": "Up to 10 public replies posted on the comment, picked at random per fire so the comment section does not look automated. Comment automations only."
},
"collect_email_confirm_text": {
"type": "string",
"maxLength": 200,
"description": "Deprecated and ignored. No confirmation message is sent any more: the payload link follows a saved email immediately and acknowledges it. Still accepted so existing callers do not break, but never stored or sent."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"trigger_id",
"trigger_type",
"moved_from",
"keywords",
"exact_match",
"opening_dm_enabled",
"opening_dm_text",
"opening_dm_button_text",
"require_follow_enabled",
"follow_nudge_text",
"follow_up_enabled",
"follow_up_text",
"follow_up_delay_minutes",
"collect_email_enabled",
"collect_email_text",
"collect_email_confirm_text",
"saved",
"note"
],
"properties": {
"note": {
"type": "string"
},
"saved": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"keywords": {
"type": "array",
"items": {
"type": "string"
}
},
"moved_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"trigger_id": {
"type": "string"
},
"exact_match": {
"type": "boolean"
},
"trigger_type": {
"type": "string"
},
"follow_up_text": {
"type": "string"
},
"opening_dm_text": {
"type": "string"
},
"follow_nudge_text": {
"type": "string"
},
"follow_up_enabled": {
"type": "boolean"
},
"collect_email_text": {
"type": "string"
},
"opening_dm_enabled": {
"type": "boolean"
},
"collect_email_enabled": {
"type": "boolean"
},
"opening_dm_button_text": {
"type": "string"
},
"require_follow_enabled": {
"type": "boolean"
},
"follow_up_delay_minutes": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"collect_email_confirm_text": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set Smart Reply",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Pause or resume one automation. Pausing keeps its keywords, message and all of its stats, so it is the reversible way to turn something off. Pausing a post automation lets any-post automations run on that post again. Call list_smart_replies first. This tool writes only to smart_reply_instagram_username; it cannot target or switch to another connected Instagram account.
The description explains the capability, when to use it, and what to expect.
Inputs78/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
trigger_type
'post' runs on one post, 'global' on any post, 'dm' on DMs and story replies.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
instagram_post_id
Required for trigger_type "post".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
trigger_id
Required for trigger_type "global" or "dm".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "set_smart_reply_active",
"description": "Pause or resume one automation. Pausing keeps its keywords, message and all of its stats, so it is the reversible way to turn something off. Pausing a post automation lets any-post automations run on that post again. Call list_smart_replies first. This tool writes only to smart_reply_instagram_username; it cannot target or switch to another connected Instagram account.",
"inputSchema": {
"type": "object",
"required": [
"trigger_type",
"is_active"
],
"properties": {
"is_active": {
"type": "boolean",
"description": "False pauses the automation, true resumes it."
},
"trigger_id": {
"type": "string",
"description": "Required for trigger_type \"global\" or \"dm\"."
},
"trigger_type": {
"enum": [
"post",
"global",
"dm"
],
"type": "string",
"description": "'post' runs on one post, 'global' on any post, 'dm' on DMs and story replies."
},
"instagram_post_id": {
"type": "string",
"description": "Required for trigger_type \"post\"."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"trigger_type",
"is_active",
"note"
],
"properties": {
"note": {
"type": "string"
},
"is_active": {
"type": "boolean"
},
"trigger_id": {
"type": "string"
},
"trigger_type": {
"type": "string"
},
"instagram_post_id": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Pause or resume Smart Reply",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Your own brand deals — the most recently active ones, up to `limit` (default 100, max 250; `truncated: true` means more exist). Call it ONCE with no filters and read the list; nothing is gained by one call per status, and no status called ACTIVE. Statuses are PITCHED, DETECTED, NEW, NEGOTIATING, PRODUCTION, AWAITING_PAYMENT, COMPLETED, DECLINED. Archived deals are left out unless you ask for them, and threads already flagged as not-a-deal never appear. Filter only when the creator asked for a specific subset.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
One lifecycle status. Omit to get every status in one call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
is_archived
Pass true to read archived deals instead of live ones.
Explain what happens when this optional value is omitted.
brand_name_query
Case-insensitive substring of the brand name.
Clear enough to supply this argument.
deal_name_query
Case-insensitive substring of the deal name or its email subject line.
Clear enough to supply this argument.
limit
Max results (default 100, max 250); there is no pagination — truncated: true means more rows exist beyond this cap.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
One of your own brand deals in full: terms, deliverable counts, your notes, and the suggested-rate range Beacons precomputed for it. That range is frozen until the deal changes — use get_pricing_estimate to price a different or hypothetical bundle.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
The email conversation behind one of your own deals, live from your connected Gmail. Returns gmail_thread_id and each message's gmail_message_id, sender, time, and body, plus saved file context. Copy those Gmail fields verbatim when replying or forwarding; Beacons UUIDs are never valid Gmail ids.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Your own saved deal criteria — minimum rates, categories you want or avoid, dealbreakers. Read them before judging whether a deal is a fit or advising on a negotiation, and cite the one you relied on.
Describe the returned information so the agent knows whether it will answer the request.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
What you should charge for a bundle of deliverables, priced live against your own audience and rate history. Call it with nothing for a baseline on one Instagram Reel, with brand_deal_id to price a deal as it stands, or with deliverables/add_ons for a what-if. A deliverables entry overrides its own type ON TOP of the deal bundle and cannot remove a type (a zero count is ignored). Nothing is saved, so price as many variations as the conversation needs.
The description explains the capability, when to use it, and what to expect.
Inputs20/100
1 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_deal_id
A deal id from search_brand_deals — prices that deal's own deliverables and scores its brand.
Clear enough to supply this argument.
deliverables › items › type
Not provided
Missing description. Explain what this value means and how to supply it.
deliverables › items › count
Not provided
Missing description. Explain what this value means and how to supply it.
add_ons › items › type
Not provided
Missing description. Explain what this value means and how to supply it.
add_ons › items › duration
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
Your own brand-deal reminders. Call it ONCE with no filters for every pending reminder across all types and deals; filter only for a specific subset. Already-sent reminders are excluded unless you ask for them.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
3 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
brand_deal_id
Only reminders on this deal.
Clear enough to supply this argument.
reminder_type
Not provided
Missing description. Explain what this value means and how to supply it.
include_sent
Include reminders that already fired. Defaults to false.
Clear enough to supply this argument.
limit
Max results (default 100, max 250); there is no pagination — truncated: true means more rows exist beyond this cap.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Which reminder channels your account can use right now — email, SMS, Google Calendar. Read it before promising a reminder on a channel: an unconfigured one names the setting that has to change.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
What Beacons knows about one brand: industry, size, headquarters, whether it runs an affiliate program you could join, and how often YOU have publicly posted about it. Take the beacons_brand_uid from a deal via get_brand_deal.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Public social accounts posting about a brand most often, with handles and counts. Evidence that the brand works with creators in this space — a mention is organic unless proven otherwise, never proof anyone was paid.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
beacons_brand_uid
The brand uid returned by get_brand_deal.
Clear enough to supply this argument.
limit
How many accounts (default 10, max 50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Inspect your Media Kit and read your Brand Deal Profile completion percentage, checklist, and missing fields (section profile). The checklist is separate from Media Kit publication and visibility. Media Kit fields include profile/header including content category chips, About bio, contact form, rate-card prices, brand logos, case studies, featured links, appearance, social blocks, follower-strip sources, creator-entered audience demographics, privacy, SEO, slug, sharing, and pages. page_layout, brand_logos, case_studies, and featured_links are in display order. Read before editing or after an uncertain write; omit section for everything, including hidden content and its visibility. Copy only fields published by the write schema; nulls and read-only display fields are not write arguments. Does not return page-view history. Stored follower, gender, age-group, country, and city statistics are get_analytics with source accounts. Quote those when present. manual_demographics here fill only a field that tool left null, and they are creator-entered overrides.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
section
Omit for the whole kit. profile: header, bio, contact form, and Brand Deal Profile completion checklist with missing fields; portfolio: rates, logos, case studies, and links in display order and their visibility; design: appearance, cover, block_visibility (the show/hide state of every block on the page, keyed by the same block names set_media_kit_design accepts), page_layout, and featured-links layout — not the content of those blocks; social: platform blocks, handles, per-metric visibility, follower-strip sources (synced, scraped, manual), and manual_demographics — the creator-entered age, gender, top-country and top-city splits; settings: publication, gates, tracking, SEO, slug, sharing, pages — not block visibility. Verify a write by reading the section containing the changed fields.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Your current email sender settings: the read-only sender (From) address your emails, newsletters, broadcasts and automations are sent from, the default from-name and reply-to address (where replies land) for broadcasts and automated emails, your email logo, footer social links, single- or double-opt-in mode, whether the Beacons logo shows in your email footer, and safe custom-domain status. The read half of set_email_marketing_settings, under the same argument names — read it first, because that tool replaces each field it is given and replaces social_links wholesale. Your SendGrid key and subscriber lists are not readable here.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Every canonical field of one of your own Shop products, under the exact same names update_store_product writes: title, price, checkout content, emails, layout, custom_slug, and more. page_appearance is the product page design under the names set_store_product_appearance writes — layout, font, and the page background, text, link, button, button-text, and block colors — with Store defaults filled in for anything never set. Course products include learner-facing course_title and course_description. waitlist_enabled says whether the product is Coming soon (a waitlist signup instead of checkout), with the waitlist copy in waitlist_heading, waitlist_description, waitlist_button_text and waitlist_launch_text, and waitlist_show_price. External-link products include external_url, the page the product redirects buyers to. Membership products deliver no files and include membership_config — the recurring price and currency, how often it bills, how many payments it takes, whether Stripe and PayPal are configured, and billing_status — plus setup_url, the Recurring price section of the Store builder. billing_status is live once a provider is charging, which update_store_product starts when it creates a membership for a creator with Stripe or PayPal attached. It is pending_payment_setup while nothing is charging, and interval and total_cycles are then null because nothing has chosen them yet. live_terms_unavailable means the provider terms could not be read, so report what is null as unknown rather than quoting a price. Also returns delivered files in display order, a read_only block (id, type, sales, sync status, store_item_version, shop_product_document_version), plus appointment_config, appointment_availability, and blocked_dates for appointment products. public_url is that product page's shareable link — the same one Beacons copies, using your custom domain when one is mapped and custom_slug when the product has one. Answer "what is the link to this product" from it; never build a URL by hand. It is null only when the account has no handle and no mapped domain. A hidden product (availability false) still has a public_url, so read availability before calling the page live. checkout_description is the product description — the Description section of the Store product editor, and the copy buyers read on the product page — as sanitized rich HTML that Beam chat renders as formatted text. The separate description field is a catalog caption, and is not what a creator means by the description. active_checkout_fields lists what the checkout already asks buyers for beyond name and email — read it before changing that set so you can tell the creator what is already on. Call this before update_store_product so a patch only changes the fields you mean to.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
product_id
The id of one of your own Store products, from list_store_products.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Read your Link in Bio before editing or after an uncertain write. Omit selectors for every page with its ordered block summaries, the current appearance (colors including the link and block shadow colors, fonts, background) and site settings — the Disclaimers (sensitive content age warning, cookie notice), the SEO site title and site description, tracking pixels, UTM source and medium, and visitor pop-up — plus integrity warnings; a dangling_layout_entry includes repairable, which says whether the empty slot can be dropped with update_link_in_bio_blocks or needs cleanup in the Beacons editor, and an orphan_block_body includes repairable, which says whether that off-layout block can be put back on the page with a placement write, plus blocked_by when it cannot — pinned_header for the page header, account_cap or account_type_cap when the account already holds its maximum. The whole-account and page reads also return blocks_used and blocks_allowed: the editor allows 100 blocks per account across every page, hidden blocks and spacers included, and no plan raises it; block_type_usage gives each type's used and allowed count across the account. When a creator says Add block is greyed out, compare blocks_used with blocks_allowed first — at the cap, a block has to be deleted in the Beacons editor, or two merged, before another can be added. A multiple_header_blocks warning lists every shown header and the pinned one the editor edits; the others can only be hidden. Pass page for one page, or block_id for that block's full editable content and field limits — for a links block that is its links, each with its link_id, URL, title, subtitle, display and archived state, 50 at a time: links_total counts every link on the block, and while next_offset is not null, read again with that block_id and links_offset set to it (links_limit up to 100) until you have seen them all — or block_ids to read several blocks in one call, which returns each block's first window; read a later window of one of them with its block_id and links_offset. The whole-account read also returns affiliate_collections, every one of the creator's Affiliate Products collections with its collection_id, title, product_count and share_url, the link that opens that collection on their public page (null when the page link could not be read), whether or not an Affiliate block lists it; it is omitted when they have no collections and null when they could not be read. An affiliate block read also returns collection_share_urls, the shareable link that opens each of the creator's affiliate collections on their public page, keyed by collection_id, or null when the page link could not be read; give that link when a creator asks for a link to one collection, and wrap it with generate_short_link when they want a short link. Display and public render visibility are different: use the returned render verdict, and name blocks by block_name. A TikTok video in a Videos block is deliberately not shown when the page is opened inside the TikTok or Instagram app, and TikTok's own player shows a blank frame or 'Access denied' for a video that is private, deleted, region-restricted or has embedding turned off — neither is a Beacons fault, so explain it instead of reporting a gap. Missing setup returns empty pages; do not invent a page. Content category chips on the public page live on the Media Kit header: read them with get_media_kit and set or clear them with set_media_kit_profile header.categories.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
A canonical page_id from an earlier read, or 'home'. Omit to read every page; with block_id or block_ids it narrows the search to that page.
Clear enough to supply this argument.
block_id
A block_id from an earlier read. Pass it to read that one block in full instead of the page summaries; for more than one block, use block_ids instead.
Clear enough to supply this argument.
block_ids
1–20 unique block_ids from an earlier read, to read all of those blocks in full in one call. Returns blocks with one entry per block read, and errors with the block_id and code of each one that could not be read; the appearance is returned once. Cannot be combined with block_id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links_offset
With block_id, the 0-based position of the first link to return from a links block. Defaults to 0; pass the previous read's next_offset to read the next page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links_limit
With block_id, how many links to return from a links block, 1–100. Defaults to 50.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations100/100
All four behavior hints are declared.
{
"title": "Get Link in Bio",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
Output schema25/100
Describe the returned fields so an agent can interpret the result.
{
"name": "get_link_in_bio",
"description": "Read your Link in Bio before editing or after an uncertain write. Omit selectors for every page with its ordered block summaries, the current appearance (colors including the link and block shadow colors, fonts, background) and site settings — the Disclaimers (sensitive content age warning, cookie notice), the SEO site title and site description, tracking pixels, UTM source and medium, and visitor pop-up — plus integrity warnings; a dangling_layout_entry includes repairable, which says whether the empty slot can be dropped with update_link_in_bio_blocks or needs cleanup in the Beacons editor, and an orphan_block_body includes repairable, which says whether that off-layout block can be put back on the page with a placement write, plus blocked_by when it cannot — pinned_header for the page header, account_cap or account_type_cap when the account already holds its maximum. The whole-account and page reads also return blocks_used and blocks_allowed: the editor allows 100 blocks per account across every page, hidden blocks and spacers included, and no plan raises it; block_type_usage gives each type's used and allowed count across the account. When a creator says Add block is greyed out, compare blocks_used with blocks_allowed first — at the cap, a block has to be deleted in the Beacons editor, or two merged, before another can be added. A multiple_header_blocks warning lists every shown header and the pinned one the editor edits; the others can only be hidden. Pass page for one page, or block_id for that block's full editable content and field limits — for a links block that is its links, each with its link_id, URL, title, subtitle, display and archived state, 50 at a time: links_total counts every link on the block, and while next_offset is not null, read again with that block_id and links_offset set to it (links_limit up to 100) until you have seen them all — or block_ids to read several blocks in one call, which returns each block's first window; read a later window of one of them with its block_id and links_offset. The whole-account read also returns affiliate_collections, every one of the creator's Affiliate Products collections with its collection_id, title, product_count and share_url, the link that opens that collection on their public page (null when the page link could not be read), whether or not an Affiliate block lists it; it is omitted when they have no collections and null when they could not be read. An affiliate block read also returns collection_share_urls, the shareable link that opens each of the creator's affiliate collections on their public page, keyed by collection_id, or null when the page link could not be read; give that link when a creator asks for a link to one collection, and wrap it with generate_short_link when they want a short link. Display and public render visibility are different: use the returned render verdict, and name blocks by block_name. A TikTok video in a Videos block is deliberately not shown when the page is opened inside the TikTok or Instagram app, and TikTok's own player shows a blank frame or 'Access denied' for a video that is private, deleted, region-restricted or has embedding turned off — neither is a Beacons fault, so explain it instead of reporting a gap. Missing setup returns empty pages; do not invent a page. Content category chips on the public page live on the Media Kit header: read them with get_media_kit and set or clear them with set_media_kit_profile header.categories.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"page": {
"type": "string",
"description": "A canonical page_id from an earlier read, or 'home'. Omit to read every page; with block_id or block_ids it narrows the search to that page."
},
"block_id": {
"type": "string",
"description": "A block_id from an earlier read. Pass it to read that one block in full instead of the page summaries; for more than one block, use block_ids instead."
},
"block_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 20,
"minItems": 1,
"description": "1–20 unique block_ids from an earlier read, to read all of those blocks in full in one call. Returns blocks with one entry per block read, and errors with the block_id and code of each one that could not be read; the appearance is returned once. Cannot be combined with block_id.",
"uniqueItems": true
},
"links_limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "With block_id, how many links to return from a links block, 1–100. Defaults to 50."
},
"links_offset": {
"type": "integer",
"minimum": 0,
"description": "With block_id, the 0-based position of the first link to return from a links block. Defaults to 0; pass the previous read's next_offset to read the next page."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"block": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"pages": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"popup": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"blocks": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"errors": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"render": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"page_id": {
"type": "string"
},
"settings": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"supported": {
"type": "boolean"
},
"appearance": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"background": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"pages_used": {
"type": "number"
},
"request_id": {
"type": "string"
},
"blocks_used": {
"type": "number"
},
"links_total": {
"type": "integer"
},
"next_offset": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"page_settings": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"pages_allowed": {
"type": "number"
},
"blocks_allowed": {
"type": "number"
},
"header_options": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"writable_fields": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"block_type_usage": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"integrity_warnings": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"profile_picture_url": {
"type": "string"
},
"affiliate_collections": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
{
"type": "null"
}
]
},
"collection_share_urls": {
"anyOf": [
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
},
"attachable_collections": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Link in Bio",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Instagram, TikTok, YouTube and LinkedIn feeds use block_type instagram_feed, tiktok_feed, youtube_feed and linkedin_feed. Pass content_id values from list_creator_platform_posts as post_ids to select posts; never submit nested posts. Creates without post_ids select up to 6 newest eligible cached posts from the last 60 days. Updates replace posts when post_ids is supplied, auto-sync is enabled, or its count is changed. Empty or unavailable selections refuse. Instagram auto_sync true requires a healthy connection and selects the newest posts immediately; auto_sync_post_count is 1–30, defaults to 6, and may be supplied only when auto_sync is enabled. Hydrated Instagram and TikTok posts link to the original post. To switch to manual selection, pass auto_sync false with post_ids. YouTube must keep show_videos or show_shorts enabled; automatic selection uses posts in the enabled sections. For Email & SMS, show_name_fields and show_location_fields set the whole matching field group. Changing email or phone clears the legacy selector and keeps what it collected as the matching toggle; disabling phone, location, birthdate, or custom also removes stale requiredness, and disabling email makes the remaining phone field required. Create one Link in Bio block on your home page or a named page. Supported types include text and layout, links, signup and social-feed blocks, products, live events, media kit, Images (images), Videos (videos), Music (music), X/Twitter (social), Integrations (integrations), Follower count (followers), which is also how an Instagram, TikTok, YouTube or LinkedIn profile card is added, and Support (support), which collects tips through the creator's connected PayPal account and stays hidden on the live page until PayPal is set up. A spacer block's height (0–600 px) controls spacing between blocks. Images accept one image, given as a public HTTPS URL that is re-hosted for the creator or as one already hosted for them — including a public HTTPS URL named for a file they uploaded in this chat; Videos, Music, X/Twitter, and Integrations accept only their documented provider URLs; Follower count uses connected accounts and never caller-supplied totals. An email signup and an SMS signup are the SAME block_type email: an email signup passes show_email_field true and show_phone_number_field false, an SMS signup passes show_email_field false and show_phone_number_field true. The block must collect at least one of the two, and form_style link renders one input so it must collect exactly one. Fields cover the block title and subtitle, its body text, and the layout or style it renders with — the carousel or column arrangement, image aspect ratio and text alignment on a links block, a Videos block's column, carousel or rows layout (rows shows each video as a compact row that expands into the player), the collection card on an Affiliate products block (layout collection_card) or a Digital products block (layout_type collectionCard), which shows the products as one card with a photo collage that opens a full-screen product overlay, the target time and expiry copy on a countdown and whether it hides once the countdown ends, and the placeholder, submit and legal consent copy on a signup block. An Instagram, TikTok, YouTube or LinkedIn profile card is a followers block with layout profile_card and platform instagram, tiktok, youtube or linkedin, one followers block per card; its header (recent_posts or cover, Instagram and TikTok only), cover_image_url, title, show_stats and show_follow_button set the card's look, and the public page hides the card until that platform has stats. A new links block starts empty: add its links, including a featured link shown as a large 16:9 image card, with set_link_in_bio_links. A page's header is not created here: every page draws the site profile header, which lives on the home page, so read that header with get_link_in_bio and edit it with update_link_in_bio_blocks. A new digital products block starts empty; add products to it afterward with update_link_in_bio_blocks, one store_item_id from list_store_products per call — a digital-products block lists as many products as the creator wants, so keep calling to add the rest. Omitted fields take their defaults; a field that belongs to a different block type is ignored and echoed back in ignored_fields rather than refused. display defaults to false, so a block you do not explicitly publish is created HIDDEN; flip it later with update_link_in_bio_blocks. Name the new block to the creator by its product name (scrolling text block, never marquee block). A new block always lands at the bottom of its page — this call takes no placement; to position it, follow up with update_link_in_bio_blocks and a placement (position, index, before_block_id or after_block_id). NEVER auto-retry this call: after a transport failure, read the page back with get_link_in_bio and decide again.
The description explains the capability, when to use it, and what to expect.
Inputs73/100
105 of 110 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
block_type
Storage block_type. Use marquee for Scrolling Text, tours_and_events for Live events, media_kit_in_lib for Media kit, affiliate for Affiliate products, store for Digital products, email for Email & SMS, social for X/Twitter, integrations for Integrations, followers for Follower count, and support for Support.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
A canonical page_id from get_link_in_bio, or 'home'. Omit for the home page.
Clear enough to supply this argument.
display
Defaults to false — new blocks start hidden.
Clear enough to supply this argument.
display_name
Custom name shown in the editor; blank restores the product name. Up to 100 characters.
Clear enough to supply this argument.
headline
For images/videos/links/live events blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
For images/videos/links/email & sms blocks. Up to 2000 characters. For text blocks. Up to 10000 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layout
For images blocks. For videos blocks. For music blocks. For follower count blocks. For live events blocks. For affiliate products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
collapse_style
For images/videos/email & sms blocks. For links/digital products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
full_width
For images/instagram feed/tiktok feed/youtube feed/linkedin feed blocks.
Clear enough to supply this argument.
aspect_ratio
For images blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
grid_num_columns
For images blocks. 2–4.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image_scale_percent
For images blocks. 50–100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
thumbnail
For images/videos/links blocks. Schemes https, up to 2048 bytes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
integration_type
For integrations blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
integration_url
For integrations blocks. Schemes https, up to 2048 bytes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
platform
For follower count blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
For follower count/links/countdown/media kit blocks. Up to 100 characters. For text blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cover_image_url
For follower count blocks. Public HTTPS image, up to 2048 bytes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header
For follower count blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_stats › followers
Not provided
Missing description. Explain what this value means and how to supply it.
show_stats › subscribers
Not provided
Missing description. Explain what this value means and how to supply it.
show_stats › contents
Not provided
Missing description. Explain what this value means and how to supply it.
show_stats › total_views
Not provided
Missing description. Explain what this value means and how to supply it.
show_stats › total_likes
Not provided
Missing description. Explain what this value means and how to supply it.
show_follow_button
For follower count blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
auto_sync
For instagram feed blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
auto_sync_post_count
For instagram feed blocks. 1–30.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_videos
For youtube feed blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_shorts
For youtube feed blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content_type
For text blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
rich_text_description
For text blocks. Up to 50000 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
center_text
For text blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
transparent_background
For text/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
block_size
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
box_shadow
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filter_overlay
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image_placement
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
link_outline
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
link_type
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
multi_column_image_link_num_columns
For links/countdown blocks. 1–4.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
one_column_image_aspect_ratio
For links/countdown blocks. For digital products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_text
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
text_alignment
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
text_position
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
text_size
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
wrap_text
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
carousel_image_aspect_ratio
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
carousel_text_alignment
For links/countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
height
For space and dividers blocks. 0–600.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
seperator_style
For space and dividers blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
text
For scrolling text blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
style
For scrolling text blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
size
For scrolling text blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
direction
For scrolling text blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
subtitle
For countdown blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
target_unix_time
For countdown blocks. 0–4102444800000.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
expiry_title
For countdown blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
expiry_subtitle
For countdown blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
expiry_text
For countdown blocks. Up to 500 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
expiry_replacement_type
For countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
hide_after_countdown
For countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
countdown_style
For countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
hide_leading_zeros
For countdown blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_title
For support blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
support_description
For support blocks. Up to 500 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
support_item
For support blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
button_text
For support blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
unit_price
For support blocks. 1–10000.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
form_style
For support blocks. For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
community_title
For community blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
note_placeholder
For community blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_leaderboard
For community blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_new_comments_by_default
For community blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title_display_name
For media kit blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
call_to_action
For media kit blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_provider_logo
For live events blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header_title
For affiliate products blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
header_subtitle
For affiliate products blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
display_header
For affiliate products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layout_type
For digital products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
store_title
For digital products blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
store_subtitle
For digital products blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
enable_border
For digital products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
hide_prices
For digital products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
thumbnail_image_url
For email & sms blocks. Schemes https, up to 2048 bytes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
form_order
For email & sms blocks. Ordered values; every item must be one of name, email, phone_number, location, birthdate, custom.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
required_fields
For email & sms blocks. Ordered values; every item must be one of phone_number, custom, location, birthdate.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
redirect_page_id
For email & sms blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
placeholder_text
For email & sms blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
submit_text
For email & sms blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
success_message
For email & sms blocks. Up to 500 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_email_field
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_phone_number_field
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
is_notifications_enabled
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
legal_enabled
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
legal_text
For email & sms blocks. Up to 2000 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
legal_url
For email & sms blocks. Schemes http/https, up to 2048 bytes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name_field_text
For email & sms blocks. Up to 100 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
custom_field_text
For email & sms blocks. Up to 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_name_fields
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_location_fields
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_birthdate_field
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
show_custom_field
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
post_ids
For Instagram, TikTok, YouTube and LinkedIn feed blocks. Select 1–20 unique content_id values from list_creator_platform_posts in the desired order. Create omits this to use up to 6 newest eligible cached posts from the last 60 days; update omits it to keep posts unchanged unless enabling auto-sync or changing its count. Cannot be combined with Instagram auto_sync true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › source_url
The photo to add. A public HTTPS image URL is copied under this creator’s own media prefix and that copy is saved; a photo already hosted for them is used as-is. In chat, generate_image and search_media return a usable URL. A link that is not a reachable image, or is not HTTPS, is refused naming the field.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › destination_url
Optional HTTPS URL opened when the image is clicked.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
video_url
For Videos. One HTTPS YouTube, TikTok, Vimeo, or Twitch URL, including a TikTok share link. Beam stores its canonical embed URL with the video's title, author and thumbnail, which stay empty when the lookup fails.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
music_url
For Music. One HTTPS Spotify, Apple Music, SoundCloud player, or Bandcamp player URL; Beacons looks up the song's title, artist and cover art, and leaves them empty when the lookup fails. On an existing block it replaces only the first song's URL and keeps every other song; to add a song, change any other song, or edit Listen on links and pre-save links, use the music operation instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
social_url
For X/Twitter. One HTTPS x.com or twitter.com profile or post URL.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
integration_theme
For a Laylo integration only. Omit for every other provider.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations100/100
All four behavior hints are declared.
{
"title": "Add Link in Bio block",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
Output schema32/100
Describe the returned fields so an agent can interpret the result.
{
"name": "create_link_in_bio_block",
"description": "Instagram, TikTok, YouTube and LinkedIn feeds use block_type instagram_feed, tiktok_feed, youtube_feed and linkedin_feed. Pass content_id values from list_creator_platform_posts as post_ids to select posts; never submit nested posts. Creates without post_ids select up to 6 newest eligible cached posts from the last 60 days. Updates replace posts when post_ids is supplied, auto-sync is enabled, or its count is changed. Empty or unavailable selections refuse. Instagram auto_sync true requires a healthy connection and selects the newest posts immediately; auto_sync_post_count is 1–30, defaults to 6, and may be supplied only when auto_sync is enabled. Hydrated Instagram and TikTok posts link to the original post. To switch to manual selection, pass auto_sync false with post_ids. YouTube must keep show_videos or show_shorts enabled; automatic selection uses posts in the enabled sections. For Email & SMS, show_name_fields and show_location_fields set the whole matching field group. Changing email or phone clears the legacy selector and keeps what it collected as the matching toggle; disabling phone, location, birthdate, or custom also removes stale requiredness, and disabling email makes the remaining phone field required. Create one Link in Bio block on your home page or a named page. Supported types include text and layout, links, signup and social-feed blocks, products, live events, media kit, Images (images), Videos (videos), Music (music), X/Twitter (social), Integrations (integrations), Follower count (followers), which is also how an Instagram, TikTok, YouTube or LinkedIn profile card is added, and Support (support), which collects tips through the creator's connected PayPal account and stays hidden on the live page until PayPal is set up. A spacer block's height (0–600 px) controls spacing between blocks. Images accept one image, given as a public HTTPS URL that is re-hosted for the creator or as one already hosted for them — including a public HTTPS URL named for a file they uploaded in this chat; Videos, Music, X/Twitter, and Integrations accept only their documented provider URLs; Follower count uses connected accounts and never caller-supplied totals. An email signup and an SMS signup are the SAME block_type email: an email signup passes show_email_field true and show_phone_number_field false, an SMS signup passes show_email_field false and show_phone_number_field true. The block must collect at least one of the two, and form_style link renders one input so it must collect exactly one. Fields cover the block title and subtitle, its body text, and the layout or style it renders with — the carousel or column arrangement, image aspect ratio and text alignment on a links block, a Videos block's column, carousel or rows layout (rows shows each video as a compact row that expands into the player), the collection card on an Affiliate products block (layout collection_card) or a Digital products block (layout_type collectionCard), which shows the products as one card with a photo collage that opens a full-screen product overlay, the target time and expiry copy on a countdown and whether it hides once the countdown ends, and the placeholder, submit and legal consent copy on a signup block. An Instagram, TikTok, YouTube or LinkedIn profile card is a followers block with layout profile_card and platform instagram, tiktok, youtube or linkedin, one followers block per card; its header (recent_posts or cover, Instagram and TikTok only), cover_image_url, title, show_stats and show_follow_button set the card's look, and the public page hides the card until that platform has stats. A new links block starts empty: add its links, including a featured link shown as a large 16:9 image card, with set_link_in_bio_links. A page's header is not created here: every page draws the site profile header, which lives on the home page, so read that header with get_link_in_bio and edit it with update_link_in_bio_blocks. A new digital products block starts empty; add products to it afterward with update_link_in_bio_blocks, one store_item_id from list_store_products per call — a digital-products block lists as many products as the creator wants, so keep calling to add the rest. Omitted fields take their defaults; a field that belongs to a different block type is ignored and echoed back in ignored_fields rather than refused. display defaults to false, so a block you do not explicitly publish is created HIDDEN; flip it later with update_link_in_bio_blocks. Name the new block to the creator by its product name (scrolling text block, never marquee block). A new block always lands at the bottom of its page — this call takes no placement; to position it, follow up with update_link_in_bio_blocks and a placement (position, index, before_block_id or after_block_id). NEVER auto-retry this call: after a transport failure, read the page back with get_link_in_bio and decide again.",
"inputSchema": {
"type": "object",
"required": [
"block_type"
],
"properties": {
"page": {
"type": "string",
"description": "A canonical page_id from get_link_in_bio, or 'home'. Omit for the home page."
},
"size": {
"enum": [
"sm",
"md",
"lg",
"xl"
],
"type": "string",
"description": "For scrolling text blocks."
},
"text": {
"type": "string",
"description": "For scrolling text blocks. Up to 200 characters."
},
"image": {
"type": "object",
"required": [
"source_url"
],
"properties": {
"source_url": {
"type": "string",
"description": "The photo to add. A public HTTPS image URL is copied under this creator’s own media prefix and that copy is saved; a photo already hosted for them is used as-is. In chat, generate_image and search_media return a usable URL. A link that is not a reachable image, or is not HTTPS, is refused naming the field."
},
"destination_url": {
"type": "string",
"description": "Optional HTTPS URL opened when the image is clicked."
}
},
"description": "For Images. Add one image, from a public HTTPS URL or one already hosted for this creator. New image entries are appended.",
"additionalProperties": false
},
"style": {
"enum": [
"straight",
"wave"
],
"type": "string",
"description": "For scrolling text blocks."
},
"title": {
"type": "string",
"description": "For follower count/links/countdown/media kit blocks. Up to 100 characters. For text blocks. Up to 200 characters."
},
"header": {
"enum": [
"",
"recent_posts",
"cover"
],
"type": "string",
"description": "For follower count blocks."
},
"height": {
"type": "integer",
"maximum": 600,
"minimum": 0,
"description": "For space and dividers blocks. 0–600."
},
"layout": {
"enum": [
"column",
"carousel",
"grid",
"rows",
"collapsible",
"exposed",
"embed",
"counts",
"profile_card",
"show-all",
"scrollable",
"expander",
"pagination",
"bento_grid",
"collection_card"
],
"type": "string",
"description": "For images blocks. For videos blocks. For music blocks. For follower count blocks. For live events blocks. For affiliate products blocks."
},
"display": {
"type": "boolean",
"description": "Defaults to false — new blocks start hidden."
},
"headline": {
"type": "string",
"description": "For images/videos/links/live events blocks. Up to 100 characters."
},
"platform": {
"enum": [
"",
"instagram",
"youtube",
"tiktok",
"linkedin"
],
"type": "string",
"description": "For follower count blocks."
},
"post_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 20,
"minItems": 1,
"description": "For Instagram, TikTok, YouTube and LinkedIn feed blocks. Select 1–20 unique content_id values from list_creator_platform_posts in the desired order. Create omits this to use up to 6 newest eligible cached posts from the last 60 days; update omits it to keep posts unchanged unless enabling auto-sync or changing its count. Cannot be combined with Instagram auto_sync true.",
"uniqueItems": true
},
"subtitle": {
"type": "string",
"description": "For countdown blocks. Up to 200 characters."
},
"auto_sync": {
"type": "boolean",
"description": "For instagram feed blocks."
},
"direction": {
"enum": [
"left",
"right"
],
"type": "string",
"description": "For scrolling text blocks."
},
"legal_url": {
"type": "string",
"description": "For email & sms blocks. Schemes http/https, up to 2048 bytes."
},
"link_type": {
"enum": [
"classic",
"carousel",
"imageGrid",
"card"
],
"type": "string",
"description": "For links/countdown blocks."
},
"music_url": {
"type": "string",
"description": "For Music. One HTTPS Spotify, Apple Music, SoundCloud player, or Bandcamp player URL; Beacons looks up the song's title, artist and cover art, and leaves them empty when the lookup fails. On an existing block it replaces only the first song's URL and keeps every other song; to add a song, change any other song, or edit Listen on links and pre-save links, use the music operation instead."
},
"show_text": {
"type": "boolean",
"description": "For links/countdown blocks."
},
"text_size": {
"enum": [
"small",
"medium",
"large",
"xLarge"
],
"type": "string",
"description": "For links/countdown blocks."
},
"thumbnail": {
"type": "string",
"description": "For images/videos/links blocks. Schemes https, up to 2048 bytes."
},
"video_url": {
"type": "string",
"description": "For Videos. One HTTPS YouTube, TikTok, Vimeo, or Twitch URL, including a TikTok share link. Beam stores its canonical embed URL with the video's title, author and thumbnail, which stay empty when the lookup fails."
},
"wrap_text": {
"type": "boolean",
"description": "For links/countdown blocks."
},
"block_size": {
"enum": [
"small",
"large"
],
"type": "string",
"description": "For links/countdown blocks."
},
"block_type": {
"enum": [
"text",
"links",
"spacer",
"marquee",
"countdown",
"community",
"media_kit_in_lib",
"tours_and_events",
"affiliate",
"store",
"email",
"instagram_feed",
"tiktok_feed",
"youtube_feed",
"linkedin_feed",
"images",
"videos",
"music",
"social",
"integrations",
"followers",
"support"
],
"type": "string",
"description": "Storage block_type. Use marquee for Scrolling Text, tours_and_events for Live events, media_kit_in_lib for Media kit, affiliate for Affiliate products, store for Digital products, email for Email & SMS, social for X/Twitter, integrations for Integrations, followers for Follower count, and support for Support."
},
"box_shadow": {
"type": "boolean",
"description": "For links/countdown blocks."
},
"card_title": {
"type": "string",
"description": "For support blocks. Up to 100 characters."
},
"form_order": {
"type": "array",
"items": {
"enum": [
"name",
"email",
"phone_number",
"location",
"birthdate",
"custom"
],
"type": "string"
},
"maxItems": 6,
"minItems": 6,
"description": "For email & sms blocks. Ordered values; every item must be one of name, email, phone_number, location, birthdate, custom.",
"uniqueItems": true
},
"form_style": {
"enum": [
"button",
"card",
"link"
],
"type": "string",
"description": "For support blocks. For email & sms blocks."
},
"full_width": {
"type": "boolean",
"description": "For images/instagram feed/tiktok feed/youtube feed/linkedin feed blocks."
},
"legal_text": {
"type": "string",
"description": "For email & sms blocks. Up to 2000 characters."
},
"show_stats": {
"type": "object",
"properties": {
"contents": {
"type": "boolean"
},
"followers": {
"type": "boolean"
},
"subscribers": {
"type": "boolean"
},
"total_likes": {
"type": "boolean"
},
"total_views": {
"type": "boolean"
}
},
"description": "For follower count blocks. Keys followers, subscribers, contents, total_views, total_likes; false hides that item, an omitted key shows it.",
"additionalProperties": false
},
"social_url": {
"type": "string",
"description": "For X/Twitter. One HTTPS x.com or twitter.com profile or post URL."
},
"unit_price": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "For support blocks. 1–10000."
},
"button_text": {
"type": "string",
"description": "For support blocks. Up to 100 characters."
},
"center_text": {
"type": "boolean",
"description": "For text blocks."
},
"description": {
"type": "string",
"description": "For images/videos/links/email & sms blocks. Up to 2000 characters. For text blocks. Up to 10000 characters."
},
"expiry_text": {
"type": "string",
"description": "For countdown blocks. Up to 500 characters."
},
"hide_prices": {
"type": "boolean",
"description": "For digital products blocks."
},
"layout_type": {
"enum": [
"bigStackCard",
"smallStackCard",
"oneColumnImage",
"carousel",
"leftImageRightText",
"rightImageLeftText",
"alternatingImageText",
"storyCard",
"grid",
"collectionCard"
],
"type": "string",
"description": "For digital products blocks."
},
"show_shorts": {
"type": "boolean",
"description": "For youtube feed blocks."
},
"show_videos": {
"type": "boolean",
"description": "For youtube feed blocks."
},
"store_title": {
"type": "string",
"description": "For digital products blocks. Up to 100 characters."
},
"submit_text": {
"type": "string",
"description": "For email & sms blocks. Up to 100 characters."
},
"aspect_ratio": {
"enum": [
"",
"1:1",
"3:2",
"16:9",
"3:1"
],
"type": "string",
"description": "For images blocks."
},
"content_type": {
"enum": [
"markdown",
"rich_text"
],
"type": "string",
"description": "For text blocks."
},
"display_name": {
"type": "string",
"description": "Custom name shown in the editor; blank restores the product name. Up to 100 characters."
},
"expiry_title": {
"type": "string",
"description": "For countdown blocks. Up to 100 characters."
},
"header_title": {
"type": "string",
"description": "For affiliate products blocks. Up to 100 characters."
},
"link_outline": {
"type": "boolean",
"description": "For links/countdown blocks."
},
"support_item": {
"type": "string",
"description": "For support blocks. Up to 100 characters."
},
"enable_border": {
"type": "boolean",
"description": "For digital products blocks."
},
"legal_enabled": {
"type": "boolean",
"description": "For email & sms blocks."
},
"text_position": {
"enum": [
"none",
"top",
"center",
"bottom"
],
"type": "string",
"description": "For links/countdown blocks."
},
"call_to_action": {
"type": "string",
"description": "For media kit blocks. Up to 100 characters."
},
"collapse_style": {
"enum": [
"exposed",
"collapsed"
],
"type": "string",
"description": "For images/videos/email & sms blocks. For links/digital products blocks."
},
"display_header": {
"type": "boolean",
"description": "For affiliate products blocks."
},
"filter_overlay": {
"enum": [
"light",
"dark",
"none"
],
"type": "string",
"description": "For links/countdown blocks."
},
"store_subtitle": {
"type": "string",
"description": "For digital products blocks. Up to 200 characters."
},
"text_alignment": {
"enum": [
"left",
"center",
"right"
],
"type": "string",
"description": "For links/countdown blocks."
},
"community_title": {
"type": "string",
"description": "For community blocks. Up to 100 characters."
},
"countdown_style": {
"enum": [
"boxes",
"inline",
"largeDigits"
],
"type": "string",
"description": "For countdown blocks."
},
"cover_image_url": {
"type": "string",
"description": "For follower count blocks. Public HTTPS image, up to 2048 bytes."
},
"expiry_subtitle": {
"type": "string",
"description": "For countdown blocks. Up to 200 characters."
},
"header_subtitle": {
"type": "string",
"description": "For affiliate products blocks. Up to 200 characters."
},
"image_placement": {
"enum": [
"left",
"right",
"alternating"
],
"type": "string",
"description": "For links/countdown blocks."
},
"integration_url": {
"type": "string",
"description": "For integrations blocks. Schemes https, up to 2048 bytes."
},
"name_field_text": {
"type": "string",
"description": "For email & sms blocks. Up to 100 characters."
},
"required_fields": {
"type": "array",
"items": {
"enum": [
"phone_number",
"custom",
"location",
"birthdate"
],
"type": "string"
},
"maxItems": 4,
"minItems": 0,
"description": "For email & sms blocks. Ordered values; every item must be one of phone_number, custom, location, birthdate.",
"uniqueItems": true
},
"seperator_style": {
"enum": [
"none",
"thin",
"dash",
"thick",
"ellipses"
],
"type": "string",
"description": "For space and dividers blocks."
},
"success_message": {
"type": "string",
"description": "For email & sms blocks. Up to 500 characters."
},
"grid_num_columns": {
"type": "integer",
"maximum": 4,
"minimum": 2,
"description": "For images blocks. 2–4."
},
"integration_type": {
"enum": [
"spring",
"topmate",
"trend",
"oasis",
"bookvid",
"proxi",
"buymeacoffee",
"provecho",
"pietra",
"kit",
"laylo",
"kofi",
"quikplace",
"split",
"delphi",
"ffm.to",
"fourthwall"
],
"type": "string",
"description": "For integrations blocks."
},
"note_placeholder": {
"type": "string",
"description": "For community blocks. Up to 200 characters."
},
"placeholder_text": {
"type": "string",
"description": "For email & sms blocks. Up to 200 characters."
},
"redirect_page_id": {
"type": "string",
"description": "For email & sms blocks. Up to 100 characters."
},
"show_email_field": {
"type": "boolean",
"description": "For email & sms blocks."
},
"show_leaderboard": {
"type": "boolean",
"description": "For community blocks."
},
"show_name_fields": {
"enum": [
"",
"full_name",
"first_name",
"first_name_last_name"
],
"type": "string",
"description": "For email & sms blocks."
},
"target_unix_time": {
"type": "integer",
"maximum": 4102444800000,
"minimum": 0,
"description": "For countdown blocks. 0–4102444800000."
},
"custom_field_text": {
"type": "string",
"description": "For email & sms blocks. Up to 200 characters."
},
"integration_theme": {
"enum": [
"light",
"dark"
],
"type": "string",
"description": "For a Laylo integration only. Omit for every other provider."
},
"show_custom_field": {
"type": "boolean",
"description": "For email & sms blocks."
},
"hide_leading_zeros": {
"type": "boolean",
"description": "For countdown blocks."
},
"show_follow_button": {
"type": "boolean",
"description": "For follower count blocks."
},
"show_provider_logo": {
"type": "boolean",
"description": "For live events blocks."
},
"title_display_name": {
"type": "string",
"description": "For media kit blocks. Up to 100 characters."
},
"image_scale_percent": {
"type": "integer",
"maximum": 100,
"minimum": 50,
"description": "For images blocks. 50–100."
},
"support_description": {
"type": "string",
"description": "For support blocks. Up to 500 characters."
},
"thumbnail_image_url": {
"type": "string",
"description": "For email & sms blocks. Schemes https, up to 2048 bytes."
},
"auto_sync_post_count": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "For instagram feed blocks. 1–30."
},
"hide_after_countdown": {
"type": "boolean",
"description": "For countdown blocks."
},
"show_birthdate_field": {
"type": "boolean",
"description": "For email & sms blocks."
},
"show_location_fields": {
"enum": [
"",
"full_address",
"partial_address",
"country",
"postal_code"
],
"type": "string",
"description": "For email & sms blocks."
},
"rich_text_description": {
"type": "string",
"description": "For text blocks. Up to 50000 characters."
},
"transparent_background": {
"type": "boolean",
"description": "For text/countdown blocks."
},
"carousel_text_alignment": {
"enum": [
"left",
"center",
"right"
],
"type": "string",
"description": "For links/countdown blocks."
},
"expiry_replacement_type": {
"enum": [
"text",
"link"
],
"type": "string",
"description": "For countdown blocks."
},
"show_phone_number_field": {
"type": "boolean",
"description": "For email & sms blocks."
},
"is_notifications_enabled": {
"type": "boolean",
"description": "For email & sms blocks."
},
"carousel_image_aspect_ratio": {
"enum": [
"",
"1:1",
"3:2",
"16:9",
"3:1",
"2:3"
],
"type": "string",
"description": "For links/countdown blocks."
},
"show_new_comments_by_default": {
"type": "boolean",
"description": "For community blocks."
},
"one_column_image_aspect_ratio": {
"enum": [
"",
"1:1",
"3:2",
"16:9",
"3:1",
"2:3"
],
"type": "string",
"description": "For links/countdown blocks. For digital products blocks."
},
"multi_column_image_link_num_columns": {
"type": "integer",
"maximum": 4,
"minimum": 1,
"description": "For links/countdown blocks. 1–4."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"request_id",
"status",
"page_id",
"block",
"render",
"note"
],
"properties": {
"note": {
"type": "string"
},
"block": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"render": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"status": {
"enum": [
"ok",
"partial_sync"
],
"type": "string"
},
"page_id": {
"type": "string"
},
"request_id": {
"type": "string"
},
"ignored_fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Add Link in Bio block",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Edit existing Link in Bio blocks: pass blocks, one entry per block, each with its block_id, its page, and either fields or a placement that reorders it — or moves it to another page. One block is a one-entry blocks call. Fields cover a block's custom display name, title, subtitle and body text as markdown or sanitized rich text, its display (show or hide), the layout or style a links, digital-products, live-events or scrolling-text block renders with — carousel or column arrangement, image aspect ratio, text alignment and text position — a Videos block's rows layout, the collection card on an Affiliate products block (layout collection_card) or a Digital products block (layout_type collectionCard), an Instagram, TikTok, YouTube or LinkedIn profile card on a followers block (layout profile_card with its platform, header, cover_image_url, show_stats and show_follow_button), a source_url and optional click destination_url on an images block, where a public HTTPS image is re-hosted for the creator and one already hosted for them is kept, the provider URL on a video, X/Twitter social or integration block, the songs on a music block — add a song, album or playlist, change any song's link, give it Listen on links (the same song on Apple Music, Spotify or another platform), or add an upcoming release with its release date, description and pre-save links (Listen on links and upcoming releases show in the block's rows layout), through the music operation by music_id (music_url still swaps only the first song and keeps the others) — where a new or changed video or song link fills the title, artist and artwork Beacons looks up, an event's location, a countdown's target time, expiry copy and expiry replacement type, the placeholder, submit and legal consent copy plus the signup thumbnail, form field order, required fields and redirect page on an email or SMS signup block, a header block's title, display name, logo, banner, profile-picture outline, shape and width, header size and social-icon size (content category chips are set_media_kit_profile header.categories, not a field here), an affiliate block's header visibility, the card image ratio, the products a digital-products block lists — one store_item_id from list_store_products per one-entry call, adding, re-listing or repositioning one of the several a block can hold — and the posts a feed block shows. Per-item edits go through the operation object for the block's type, and each one can also REMOVE an item: remove true with an image_id, video_id or music_id deletes that entry from an Images, Videos or Music block, remove true with a post_id takes one post off an Instagram, TikTok, YouTube or LinkedIn feed block, and the affiliate_collection operation attaches, reorders or removes one of the creator's affiliate collections on an affiliate block, or removes or reorders one product inside one, or adds an affiliate product from a supported merchant's product URL — one product_url per call, into a new collection or an existing collection_id, turned into the creator's tracked affiliate link. Removing an item is a real delete of that entry, not a hide, and it never deletes the block — the last item out leaves an empty block. Adding a post to a feed block is still post_ids, which replaces the whole selection. A links block currently rendering a custom vibes layout accepts link_type like any other — setting classic converts it back, the same single click the editor gives; only the generated vibes HTML itself stays in the Design-with-AI surface. Give each entry exactly one of fields or placement, and inside fields exactly one operation object; omitted fields stay unchanged, and null clears only nullable fields. Read the block with get_link_in_bio first; use set_link_in_bio_links for links-block entries, including whether a link is featured as a large 16:9 image card, and a countdown's single replacement link. Hiding a block is what a request to delete or permanently remove one gets: display false takes it off the public page and preserves its content, so tell the creator it was hidden rather than deleted, that it is reversible, and that a permanent delete is done in the Beacons editor — never report a hide as a deletion. A duplicate header block only allows display to change — false hides it, true restores it — and the profile header's display and profile_picture_url are sent without header block fields. The header banner and logo are site-wide rather than per page: both live on the home page's profile header, and the banner renders only under the banner and profile header layouts. To drop a dangling_layout_entry, require repairable true, give its entry that page_id as page, and set fields.display false; repairable false needs the editor. To put an orphan_block_body back on the page, require repairable true, give its entry its block_id, its page_id as page and a placement — the block keeps its content and rejoins the layout where you place it. After an uncertain write, read back before retrying. Entries apply together in one write or not at all, against one slot of the write budget — always put several block edits in one blocks call, because one call per block runs the budget out partway and leaves the page half-changed. The result lists each entry plus the final block order of every page it touched. These edits go only in a one-entry blocks call, and a batch of two or more naming one is refused whole with BATCH_UNSUPPORTED_OPERATION, which lists every such entry: display on the profile header; display, integration_type, integration_url and integration_theme on an integrations block; profile_picture_url; store_item_id, store_item_placement and listing_status on a digital products block; affiliate_collection on an affiliate products block; nickname, header_bio and header_location on a header block; the dangling_layout_entry and orphan_block_body repairs. Re-send the rest together and each of those as its own one-entry blocks call. After OUTCOME_UNKNOWN, read details.block_ids back with get_link_in_bio block_ids and re-send only the edits that are absent.
The description explains the capability, when to use it, and what to expect.
Inputs70/100
182 of 195 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
blocks › items › block_id
A block_id from get_link_in_bio.
Clear enough to supply this argument.
blocks › items › page
Required. The canonical page_id from get_link_in_bio that holds this block, or 'home'.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › display
Show or hide the block. Works on every block type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › display_name
For every block. Custom name shown in the editor; blank restores the product name. Up to 100 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › profile_picture_url
Authoritative home header only; send without block fields. Public HTTPS image URL re-hosted on Beacons before saving; null or empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › store_item_id
For store blocks. The product id from list_store_products. Pass it to add that product to the block, to change its listing_status, or to position it with store_item_placement. Passing a product the block already lists also refreshes its card (price, title, images, description) from the Store. A store block holds several products; add them one call at a time.
Clear enough to supply this argument.
blocks › items › fields › store_item_placement › position
Move this product to the top or bottom of the block.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › store_item_placement › index
Move this product to this 0-based index.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › listing_status
For store blocks. listed shows the product on the page; hidden keeps the listing but hides the product.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › headline
For images/videos/links/live events blocks. Up to 100 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › description
For images/videos/links/email & sms blocks. Up to 2000 characters; null clears it. For text blocks. Up to 10000 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › layout
For images blocks. For videos blocks. For music blocks. For follower count blocks. For live events blocks. For affiliate products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › collapse_style
For images/videos/email & sms blocks. For links/digital products blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › full_width
For images/instagram feed/tiktok feed/youtube feed/linkedin feed blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › aspect_ratio
For images blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › grid_num_columns
For images blocks. 2–4.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image_scale_percent
For images blocks. 50–100.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › thumbnail
For images/videos/links blocks. Schemes https, up to 2048 bytes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › integration_type
For integrations blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › integration_url
For integrations blocks. Schemes https, up to 2048 bytes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › platform
For follower count blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › title
For follower count/header/links/countdown/media kit blocks. Up to 100 characters; null clears it. For text blocks. Up to 200 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › cover_image_url
For follower count blocks. Public HTTPS image, up to 2048 bytes; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › header
For follower count blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › show_stats › followers
Not provided
Missing description. Explain what this value means and how to supply it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › legal_enabled
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › legal_text
For email & sms blocks. Up to 2000 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › legal_url
For email & sms blocks. Schemes http/https, up to 2048 bytes; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › name_field_text
For email & sms blocks. Up to 100 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › custom_field_text
For email & sms blocks. Up to 200 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › show_name_fields
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › show_location_fields
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › show_birthdate_field
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › show_custom_field
For email & sms blocks.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › post_ids
Instagram, TikTok, YouTube and LinkedIn feeds use block_type instagram_feed, tiktok_feed, youtube_feed and linkedin_feed. Pass content_id values from list_creator_platform_posts as post_ids to select posts; never submit nested posts. Creates without post_ids select up to 6 newest eligible cached posts from the last 60 days. Updates replace posts when post_ids is supplied, auto-sync is enabled, or its count is changed. Empty or unavailable selections refuse. Instagram auto_sync true requires a healthy connection and selects the newest posts immediately; auto_sync_post_count is 1–30, defaults to 6, and may be supplied only when auto_sync is enabled. Hydrated Instagram and TikTok posts link to the original post. To switch to manual selection, pass auto_sync false with post_ids. YouTube must keep show_videos or show_shorts enabled; automatic selection uses posts in the enabled sections. For Instagram, TikTok, YouTube and LinkedIn feed blocks. Select 1–20 unique content_id values from list_creator_platform_posts in the desired order. Create omits this to use up to 6 newest eligible cached posts from the last 60 days; update omits it to keep posts unchanged unless enabling auto-sync or changing its count. Cannot be combined with Instagram auto_sync true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image › image_id
Existing image entry id from get_link_in_bio.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image › source_url
The replacement photo. A public HTTPS image URL is copied under this creator’s own media prefix and that copy is saved; a photo already hosted for them is used as-is. In chat, generate_image and search_media return a usable URL. A link that is not a reachable image, or is not HTTPS, is refused naming the field.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image › destination_url
HTTPS click destination; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image › position
Move this existing entry to the top or bottom.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image › index
Move this existing entry to this 0-based index.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image › before_image_id
Move directly before this existing image entry id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image › after_image_id
Move directly after this existing image entry id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › image › remove
Delete this entry from the block. Send it with the entry id and nothing else — a removal is never also an edit or a move. The other entries keep their order, and removing the last one leaves the block empty rather than deleting or hiding it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › video › video_id
Existing video entry id from get_link_in_bio.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › video › url
HTTPS YouTube, TikTok, Vimeo, or Twitch URL, including a TikTok share link. Beam stores its canonical embed URL, and a new or changed URL fills the title, author and thumbnail Beacons looks up; they stay empty when the lookup fails.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › video › position
Move this existing entry to the top or bottom.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › video › index
Move this existing entry to this 0-based index.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › video › before_video_id
Move directly before this existing video entry id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › video › after_video_id
Move directly after this existing video entry id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › video › remove
Delete this entry from the block. Send it with the entry id and nothing else — a removal is never also an edit or a move. The other entries keep their order, and removing the last one leaves the block empty rather than deleting or hiding it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › post › post_id
Existing post id from the posts array on the block read.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › post › position
Move this existing entry to the top or bottom.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › post › index
Move this existing entry to this 0-based index.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › post › before_post_id
Move directly before this existing post id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › post › after_post_id
Move directly after this existing post id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › post › remove
Delete this entry from the block. Send it with the entry id and nothing else — a removal is never also an edit or a move. The other entries keep their order, and removing the last one leaves the block empty rather than deleting or hiding it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music_url
For Music. One HTTPS Spotify, Apple Music, SoundCloud player, or Bandcamp player URL; Beacons looks up the song's title, artist and cover art, and leaves them empty when the lookup fails. On an existing block it replaces only the first song's URL and keeps every other song; to add a song, change any other song, or edit Listen on links and pre-save links, use the music operation instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › music_id
Existing song id from the music_urls entries on get_link_in_bio.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › url
HTTPS Spotify, Apple Music, SoundCloud player, or Bandcamp player URL. Beacons stores its embed URL and keeps the pasted link as the song's Open in link. Optional on a new upcoming release that has a release_at.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › release_at
Release date and time as ISO 8601 with the timezone offset the creator means, for an upcoming release. Before it the row shows a countdown and the pre-save buttons; after it the song plays normally. null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › description
Short copy shown with an upcoming release before release_at, up to 500 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › position
Move this existing entry to the top or bottom.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › index
Move this existing entry to this 0-based index.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › before_music_id
Move directly before this existing song id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › after_music_id
Move directly after this existing song id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › music › remove
Delete this entry from the block. Send it with the entry id and nothing else — a removal is never also an edit or a move. The other entries keep their order, and removing the last one leaves the block empty rather than deleting or hiding it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › social_url
For X/Twitter. One HTTPS x.com or twitter.com profile or post URL.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › integration_theme
For a Laylo integration only. Omit for every other provider.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
A collection id. One already in the block read's collections array is reordered or removed; one from attachable_collections is attached to the block. With product_url, the collection the product is appended to.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
An https product page URL from a supported merchant. Beacons turns it into the creator's tracked affiliate link and lists the product in a collection on this block. Combine only with collection_id or collection_title.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Drop the collection from this block, or the product from the collection. Send it with the ids and nothing else. Removing a collection takes it off this block only; the collection itself and its products stay in the affiliate catalogue.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › affiliate_collection › position
Move this existing entry to the top or bottom.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › fields › affiliate_collection › index
Move this existing entry to this 0-based index.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Move directly after this existing platform_profile_id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › placement › to_page
Destination page_id from get_link_in_bio, or 'home'. Omit to reorder on the current page. Must name a different page than the block is on. Empty string is refused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › placement › position
Move the block to the top (after a pinned header) or the bottom of the destination page. Pass exactly one of position, index, before_block_id, or after_block_id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › placement › index
0-based index in the resulting page_layout. 0 is refused when the first block is a header. On a move, the index may equal the destination length to append.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › placement › before_block_id
Place this block immediately before a different block on the destination page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › placement › after_block_id
Place this block immediately after a different block on the destination page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
blocks › items › placement › oneOf › 0 › position
Not provided
Missing description. Explain what this value means and how to supply it.
blocks › items › placement › oneOf › 1 › index
Not provided
Missing description. Explain what this value means and how to supply it.
{
"name": "update_link_in_bio_blocks",
"description": "Edit existing Link in Bio blocks: pass blocks, one entry per block, each with its block_id, its page, and either fields or a placement that reorders it — or moves it to another page. One block is a one-entry blocks call. Fields cover a block's custom display name, title, subtitle and body text as markdown or sanitized rich text, its display (show or hide), the layout or style a links, digital-products, live-events or scrolling-text block renders with — carousel or column arrangement, image aspect ratio, text alignment and text position — a Videos block's rows layout, the collection card on an Affiliate products block (layout collection_card) or a Digital products block (layout_type collectionCard), an Instagram, TikTok, YouTube or LinkedIn profile card on a followers block (layout profile_card with its platform, header, cover_image_url, show_stats and show_follow_button), a source_url and optional click destination_url on an images block, where a public HTTPS image is re-hosted for the creator and one already hosted for them is kept, the provider URL on a video, X/Twitter social or integration block, the songs on a music block — add a song, album or playlist, change any song's link, give it Listen on links (the same song on Apple Music, Spotify or another platform), or add an upcoming release with its release date, description and pre-save links (Listen on links and upcoming releases show in the block's rows layout), through the music operation by music_id (music_url still swaps only the first song and keeps the others) — where a new or changed video or song link fills the title, artist and artwork Beacons looks up, an event's location, a countdown's target time, expiry copy and expiry replacement type, the placeholder, submit and legal consent copy plus the signup thumbnail, form field order, required fields and redirect page on an email or SMS signup block, a header block's title, display name, logo, banner, profile-picture outline, shape and width, header size and social-icon size (content category chips are set_media_kit_profile header.categories, not a field here), an affiliate block's header visibility, the card image ratio, the products a digital-products block lists — one store_item_id from list_store_products per one-entry call, adding, re-listing or repositioning one of the several a block can hold — and the posts a feed block shows. Per-item edits go through the operation object for the block's type, and each one can also REMOVE an item: remove true with an image_id, video_id or music_id deletes that entry from an Images, Videos or Music block, remove true with a post_id takes one post off an Instagram, TikTok, YouTube or LinkedIn feed block, and the affiliate_collection operation attaches, reorders or removes one of the creator's affiliate collections on an affiliate block, or removes or reorders one product inside one, or adds an affiliate product from a supported merchant's product URL — one product_url per call, into a new collection or an existing collection_id, turned into the creator's tracked affiliate link. Removing an item is a real delete of that entry, not a hide, and it never deletes the block — the last item out leaves an empty block. Adding a post to a feed block is still post_ids, which replaces the whole selection. A links block currently rendering a custom vibes layout accepts link_type like any other — setting classic converts it back, the same single click the editor gives; only the generated vibes HTML itself stays in the Design-with-AI surface. Give each entry exactly one of fields or placement, and inside fields exactly one operation object; omitted fields stay unchanged, and null clears only nullable fields. Read the block with get_link_in_bio first; use set_link_in_bio_links for links-block entries, including whether a link is featured as a large 16:9 image card, and a countdown's single replacement link. Hiding a block is what a request to delete or permanently remove one gets: display false takes it off the public page and preserves its content, so tell the creator it was hidden rather than deleted, that it is reversible, and that a permanent delete is done in the Beacons editor — never report a hide as a deletion. A duplicate header block only allows display to change — false hides it, true restores it — and the profile header's display and profile_picture_url are sent without header block fields. The header banner and logo are site-wide rather than per page: both live on the home page's profile header, and the banner renders only under the banner and profile header layouts. To drop a dangling_layout_entry, require repairable true, give its entry that page_id as page, and set fields.display false; repairable false needs the editor. To put an orphan_block_body back on the page, require repairable true, give its entry its block_id, its page_id as page and a placement — the block keeps its content and rejoins the layout where you place it. After an uncertain write, read back before retrying. Entries apply together in one write or not at all, against one slot of the write budget — always put several block edits in one blocks call, because one call per block runs the budget out partway and leaves the page half-changed. The result lists each entry plus the final block order of every page it touched. These edits go only in a one-entry blocks call, and a batch of two or more naming one is refused whole with BATCH_UNSUPPORTED_OPERATION, which lists every such entry: display on the profile header; display, integration_type, integration_url and integration_theme on an integrations block; profile_picture_url; store_item_id, store_item_placement and listing_status on a digital products block; affiliate_collection on an affiliate products block; nickname, header_bio and header_location on a header block; the dangling_layout_entry and orphan_block_body repairs. Re-send the rest together and each of those as its own one-entry blocks call. After OUTCOME_UNKNOWN, read details.block_ids back with get_link_in_bio block_ids and re-send only the edits that are absent.",
"inputSchema": {
"type": "object",
"required": [
"blocks"
],
"properties": {
"blocks": {
"type": "array",
"items": {
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"fields"
],
"properties": {
"fields": {}
}
},
{
"type": "object",
"required": [
"placement"
],
"properties": {
"placement": {}
}
}
],
"required": [
"block_id",
"page"
],
"properties": {
"page": {
"type": "string",
"description": "Required. The canonical page_id from get_link_in_bio that holds this block, or 'home'."
},
"fields": {
"type": "object",
"properties": {
"post": {
"type": "object",
"required": [
"post_id"
],
"properties": {
"index": {
"type": "integer",
"minimum": 0,
"description": "Move this existing entry to this 0-based index."
},
"remove": {
"enum": [
true
],
"type": "boolean",
"description": "Delete this entry from the block. Send it with the entry id and nothing else — a removal is never also an edit or a move. The other entries keep their order, and removing the last one leaves the block empty rather than deleting or hiding it."
},
"post_id": {
"type": "string",
"description": "Existing post id from the posts array on the block read."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move this existing entry to the top or bottom."
},
"after_post_id": {
"type": "string",
"description": "Move directly after this existing post id."
},
"before_post_id": {
"type": "string",
"description": "Move directly before this existing post id."
}
},
"description": "For Instagram, TikTok, YouTube and LinkedIn feed blocks. Move or remove one post the block already shows, addressed by the post_id on the block read. Adding a post is post_ids, which replaces the whole selection; this operation never adds one. Cannot be combined with post_ids or with Instagram auto_sync.",
"minProperties": 2,
"additionalProperties": false
},
"size": {
"enum": [
"sm",
"md",
"lg",
"xl"
],
"type": "string",
"description": "For scrolling text blocks."
},
"text": {
"type": "string",
"description": "For scrolling text blocks. Up to 200 characters."
},
"image": {
"type": "object",
"properties": {
"index": {
"type": "integer",
"minimum": 0,
"description": "Move this existing entry to this 0-based index."
},
"remove": {
"enum": [
true
],
"type": "boolean",
"description": "Delete this entry from the block. Send it with the entry id and nothing else — a removal is never also an edit or a move. The other entries keep their order, and removing the last one leaves the block empty rather than deleting or hiding it."
},
"image_id": {
"type": "string",
"description": "Existing image entry id from get_link_in_bio."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move this existing entry to the top or bottom."
},
"source_url": {
"type": "string",
"description": "The replacement photo. A public HTTPS image URL is copied under this creator’s own media prefix and that copy is saved; a photo already hosted for them is used as-is. In chat, generate_image and search_media return a usable URL. A link that is not a reachable image, or is not HTTPS, is refused naming the field."
},
"after_image_id": {
"type": "string",
"description": "Move directly after this existing image entry id."
},
"before_image_id": {
"type": "string",
"description": "Move directly before this existing image entry id."
},
"destination_url": {
"type": [
"string",
"null"
],
"description": "HTTPS click destination; null clears it."
}
},
"description": "For Images. Omit image_id to append one image, from a public HTTPS URL or one already hosted for this creator. Pass image_id to edit, move, or remove an existing image. A new image is always appended.",
"minProperties": 1,
"additionalProperties": false
},
"music": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "HTTPS Spotify, Apple Music, SoundCloud player, or Bandcamp player URL. Beacons stores its embed URL and keeps the pasted link as the song's Open in link. Optional on a new upcoming release that has a release_at."
},
"index": {
"type": "integer",
"minimum": 0,
"description": "Move this existing entry to this 0-based index."
},
"remove": {
"enum": [
true
],
"type": "boolean",
"description": "Delete this entry from the block. Send it with the entry id and nothing else — a removal is never also an edit or a move. The other entries keep their order, and removing the last one leaves the block empty rather than deleting or hiding it."
},
"music_id": {
"type": "string",
"description": "Existing song id from the music_urls entries on get_link_in_bio."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move this existing entry to the top or bottom."
},
"release_at": {
"type": [
"string",
"null"
],
"description": "Release date and time as ISO 8601 with the timezone offset the creator means, for an upcoming release. Before it the row shows a countdown and the pre-save buttons; after it the song plays normally. null clears it."
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 500,
"description": "Short copy shown with an upcoming release before release_at, up to 500 characters; null clears it."
},
"presave_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"platform"
],
"properties": {
"url": {
"type": "string",
"description": "The http(s) pre-save link from the distributor."
},
"visible": {
"type": "boolean",
"description": "Show this pre-save button. Defaults to true."
},
"platform": {
"enum": [
"spotify",
"apple_music",
"amazon_music",
"deezer",
"tidal",
"youtube_music",
"other"
],
"type": "string",
"description": "The service the link pre-saves on; other labels the button with the link host."
}
},
"additionalProperties": false
},
"maxItems": 7,
"description": "The upcoming release's pre-save buttons, at most one per platform. Replaces the whole list, so send every button to keep; an empty array clears them."
},
"after_music_id": {
"type": "string",
"description": "Move directly after this existing song id."
},
"platform_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "An http(s) link to the song on that platform."
},
"visible": {
"type": "boolean",
"description": "Show this link under Listen on. Defaults to true."
},
"platform": {
"enum": [
"spotify",
"apple_music",
"youtube_music",
"youtube",
"amazon_music",
"tidal",
"deezer",
"soundcloud",
"audiomack",
"bandcamp",
"pandora",
"other"
],
"type": "string",
"description": "Optional. The platform the link is on; it must match the link's host, and other covers any host Beacons does not name."
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "The song's Listen on links: the same song on other platforms, such as an Apple Music link beside a Spotify song. Replaces the whole list, so send every link to keep; an empty array clears them. Up to 20."
},
"before_music_id": {
"type": "string",
"description": "Move directly before this existing song id."
}
},
"description": "For Music. Omit music_id to add one song (or album, playlist or upcoming release); a new song is always appended. Pass music_id to change that song, move it, or remove it. A new or changed url fills the title, artist and cover art Beacons looks up, and leaves them empty when the lookup fails. Listen on links and an upcoming release with its pre-save links show when the block layout is rows.",
"minProperties": 1,
"additionalProperties": false
},
"style": {
"enum": [
"straight",
"wave"
],
"type": "string",
"description": "For scrolling text blocks."
},
"title": {
"type": [
"string",
"null"
],
"description": "For follower count/header/links/countdown/media kit blocks. Up to 100 characters; null clears it. For text blocks. Up to 200 characters; null clears it."
},
"video": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "HTTPS YouTube, TikTok, Vimeo, or Twitch URL, including a TikTok share link. Beam stores its canonical embed URL, and a new or changed URL fills the title, author and thumbnail Beacons looks up; they stay empty when the lookup fails."
},
"index": {
"type": "integer",
"minimum": 0,
"description": "Move this existing entry to this 0-based index."
},
"remove": {
"enum": [
true
],
"type": "boolean",
"description": "Delete this entry from the block. Send it with the entry id and nothing else — a removal is never also an edit or a move. The other entries keep their order, and removing the last one leaves the block empty rather than deleting or hiding it."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move this existing entry to the top or bottom."
},
"video_id": {
"type": "string",
"description": "Existing video entry id from get_link_in_bio."
},
"after_video_id": {
"type": "string",
"description": "Move directly after this existing video entry id."
},
"before_video_id": {
"type": "string",
"description": "Move directly before this existing video entry id."
}
},
"description": "For Videos. Omit video_id to append one video. Pass video_id to edit, move, or remove an existing video. A new video is always appended.",
"minProperties": 1,
"additionalProperties": false
},
"header": {
"enum": [
"",
"recent_posts",
"cover"
],
"type": "string",
"description": "For follower count blocks."
},
"height": {
"type": "integer",
"maximum": 600,
"minimum": 0,
"description": "For space and dividers blocks. 0–600."
},
"layout": {
"enum": [
"column",
"carousel",
"grid",
"rows",
"collapsible",
"exposed",
"embed",
"counts",
"profile_card",
"show-all",
"scrollable",
"expander",
"pagination",
"bento_grid",
"collection_card"
],
"type": "string",
"description": "For images blocks. For videos blocks. For music blocks. For follower count blocks. For live events blocks. For affiliate products blocks."
},
"display": {
"type": "boolean",
"description": "Show or hide the block. Works on every block type."
},
"follower": {
"type": "object",
"required": [
"platform_profile_id"
],
"properties": {
"index": {
"type": "integer",
"minimum": 0,
"description": "Move this existing entry to this 0-based index."
},
"display": {
"type": "boolean",
"description": "Show or hide this platform inside the Follower count block."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move this existing entry to the top or bottom."
},
"platform_profile_id": {
"type": "string",
"description": "Existing platform_profile_id from get_link_in_bio."
},
"after_platform_profile_id": {
"type": "string",
"description": "Move directly after this existing platform_profile_id."
},
"before_platform_profile_id": {
"type": "string",
"description": "Move directly before this existing platform_profile_id."
}
},
"description": "For Follower count. Show, hide, or move one connected account already present in the block.",
"minProperties": 2,
"additionalProperties": false
},
"headline": {
"type": [
"string",
"null"
],
"description": "For images/videos/links/live events blocks. Up to 100 characters; null clears it."
},
"nickname": {
"type": [
"string",
"null"
],
"description": "For header blocks. Up to 40 characters; null clears it."
},
"platform": {
"enum": [
"",
"instagram",
"youtube",
"tiktok",
"linkedin"
],
"type": "string",
"description": "For follower count blocks."
},
"post_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 20,
"minItems": 1,
"description": "Instagram, TikTok, YouTube and LinkedIn feeds use block_type instagram_feed, tiktok_feed, youtube_feed and linkedin_feed. Pass content_id values from list_creator_platform_posts as post_ids to select posts; never submit nested posts. Creates without post_ids select up to 6 newest eligible cached posts from the last 60 days. Updates replace posts when post_ids is supplied, auto-sync is enabled, or its count is changed. Empty or unavailable selections refuse. Instagram auto_sync true requires a healthy connection and selects the newest posts immediately; auto_sync_post_count is 1–30, defaults to 6, and may be supplied only when auto_sync is enabled. Hydrated Instagram and TikTok posts link to the original post. To switch to manual selection, pass auto_sync false with post_ids. YouTube must keep show_videos or show_shorts enabled; automatic selection uses posts in the enabled sections. For Instagram, TikTok, YouTube and LinkedIn feed blocks. Select 1–20 unique content_id values from list_creator_platform_posts in the desired order. Create omits this to use up to 6 newest eligible cached posts from the last 60 days; update omits it to keep posts unchanged unless enabling auto-sync or changing its count. Cannot be combined with Instagram auto_sync true.",
"uniqueItems": true
},
"subtitle": {
"type": [
"string",
"null"
],
"description": "For countdown blocks. Up to 200 characters; null clears it."
},
"auto_sync": {
"type": "boolean",
"description": "For instagram feed blocks."
},
"direction": {
"enum": [
"left",
"right"
],
"type": "string",
"description": "For scrolling text blocks."
},
"legal_url": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Schemes http/https, up to 2048 bytes; null clears it."
},
"link_type": {
"enum": [
"classic",
"carousel",
"imageGrid",
"card"
],
"type": "string",
"description": "For links/countdown blocks."
},
"music_url": {
"type": "string",
"description": "For Music. One HTTPS Spotify, Apple Music, SoundCloud player, or Bandcamp player URL; Beacons looks up the song's title, artist and cover art, and leaves them empty when the lookup fails. On an existing block it replaces only the first song's URL and keeps every other song; to add a song, change any other song, or edit Listen on links and pre-save links, use the music operation instead."
},
"show_text": {
"type": "boolean",
"description": "For links/countdown blocks."
},
"text_size": {
"enum": [
"small",
"medium",
"large",
"xLarge"
],
"type": "string",
"description": "For links/countdown blocks."
},
"thumbnail": {
"type": "string",
"description": "For images/videos/links blocks. Schemes https, up to 2048 bytes."
},
"wrap_text": {
"type": "boolean",
"description": "For links/countdown blocks."
},
"block_size": {
"enum": [
"small",
"large"
],
"type": "string",
"description": "For links/countdown blocks."
},
"box_shadow": {
"type": "boolean",
"description": "For links/countdown blocks."
},
"card_title": {
"type": [
"string",
"null"
],
"description": "For support blocks. Up to 100 characters; null clears it."
},
"form_order": {
"type": "array",
"items": {
"enum": [
"name",
"email",
"phone_number",
"location",
"birthdate",
"custom"
],
"type": "string"
},
"maxItems": 6,
"minItems": 6,
"description": "For email & sms blocks. Ordered values; every item must be one of name, email, phone_number, location, birthdate, custom.",
"uniqueItems": true
},
"form_style": {
"enum": [
"button",
"card",
"link"
],
"type": "string",
"description": "For support blocks. For email & sms blocks."
},
"full_width": {
"type": "boolean",
"description": "For images/instagram feed/tiktok feed/youtube feed/linkedin feed blocks."
},
"header_bio": {
"type": [
"string",
"null"
],
"description": "For header blocks. Up to 60 characters; null clears it."
},
"legal_text": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Up to 2000 characters; null clears it."
},
"show_stats": {
"type": "object",
"properties": {
"contents": {
"type": "boolean"
},
"followers": {
"type": "boolean"
},
"subscribers": {
"type": "boolean"
},
"total_likes": {
"type": "boolean"
},
"total_views": {
"type": "boolean"
}
},
"description": "For follower count blocks. Keys followers, subscribers, contents, total_views, total_likes; false hides that item, an omitted key shows it.",
"additionalProperties": false
},
"social_url": {
"type": "string",
"description": "For X/Twitter. One HTTPS x.com or twitter.com profile or post URL."
},
"unit_price": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "For support blocks. 1–10000."
},
"button_text": {
"type": [
"string",
"null"
],
"description": "For support blocks. Up to 100 characters; null clears it."
},
"center_text": {
"type": "boolean",
"description": "For text blocks."
},
"description": {
"type": [
"string",
"null"
],
"description": "For images/videos/links/email & sms blocks. Up to 2000 characters; null clears it. For text blocks. Up to 10000 characters; null clears it."
},
"expiry_text": {
"type": [
"string",
"null"
],
"description": "For countdown blocks. Up to 500 characters; null clears it."
},
"header_size": {
"enum": [
"small",
"medium",
"big"
],
"type": "string",
"description": "For header blocks."
},
"header_type": {
"enum": [
"compact",
"full",
"responsive"
],
"type": "string",
"description": "For header blocks."
},
"hide_prices": {
"type": "boolean",
"description": "For digital products blocks."
},
"layout_type": {
"enum": [
"bigStackCard",
"smallStackCard",
"oneColumnImage",
"carousel",
"leftImageRightText",
"rightImageLeftText",
"alternatingImageText",
"storyCard",
"grid",
"collectionCard"
],
"type": "string",
"description": "For digital products blocks."
},
"show_shorts": {
"type": "boolean",
"description": "For youtube feed blocks."
},
"show_videos": {
"type": "boolean",
"description": "For youtube feed blocks."
},
"store_title": {
"type": [
"string",
"null"
],
"description": "For digital products blocks. Up to 100 characters; null clears it."
},
"submit_text": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Up to 100 characters; null clears it."
},
"aspect_ratio": {
"enum": [
"",
"1:1",
"3:2",
"16:9",
"3:1"
],
"type": "string",
"description": "For images blocks."
},
"content_type": {
"enum": [
"markdown",
"rich_text"
],
"type": "string",
"description": "For text blocks."
},
"display_name": {
"type": [
"string",
"null"
],
"description": "For every block. Custom name shown in the editor; blank restores the product name. Up to 100 characters; null clears it."
},
"expiry_title": {
"type": [
"string",
"null"
],
"description": "For countdown blocks. Up to 100 characters; null clears it."
},
"header_title": {
"type": [
"string",
"null"
],
"description": "For affiliate products blocks. Up to 100 characters; null clears it."
},
"link_outline": {
"type": "boolean",
"description": "For links/countdown blocks."
},
"social_array": {
"type": "array",
"items": {
"type": "object",
"required": [
"platform",
"value"
],
"properties": {
"value": {
"type": "string"
},
"platform": {
"enum": [
"email",
"phone",
"tiktok",
"instagram",
"stereo",
"twitter",
"youtube",
"facebook",
"twitch",
"kick",
"freshcut",
"snapchat",
"rednote",
"lemon8",
"linkedin",
"behance",
"pinterest",
"patreon",
"onlyfans",
"venmo",
"cashapp",
"discord",
"whatsapp",
"telegram",
"amazon",
"etsy",
"ebay",
"mercari",
"poshmark",
"spotify",
"soundcloud",
"applemusic",
"appletv",
"applepodcasts",
"ivoox",
"applebooks",
"deezer",
"pandora",
"tidal",
"bandcamp",
"medium",
"substack",
"beehiiv",
"vimeo",
"google_play_store",
"ios_app_store",
"github",
"gitlab",
"reddit",
"quora",
"quikplace",
"fanhouse",
"clubhouse",
"famous_birthdays",
"flipboard",
"goodreads",
"deviantart",
"mastodon",
"steam",
"xbox",
"tumblr",
"imdb",
"threads",
"phone_call",
"website",
"bluesky",
"ltk",
"shopmy"
],
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 68,
"description": "For header blocks. Ordered social icons; [] clears all icons."
},
"support_item": {
"type": [
"string",
"null"
],
"description": "For support blocks. Up to 100 characters; null clears it."
},
"enable_border": {
"type": "boolean",
"description": "For digital products blocks."
},
"header_layout": {
"enum": [
"classic",
"banner",
"portrait",
"compact",
"profile",
"organic",
"lorem",
"skybound",
"archway",
"capsule",
"polaroid",
"marquee",
"vibes"
],
"type": "string",
"description": "For header blocks."
},
"legal_enabled": {
"type": "boolean",
"description": "For email & sms blocks."
},
"store_item_id": {
"type": "string",
"description": "For store blocks. The product id from list_store_products. Pass it to add that product to the block, to change its listing_status, or to position it with store_item_placement. Passing a product the block already lists also refreshes its card (price, title, images, description) from the Store. A store block holds several products; add them one call at a time."
},
"text_position": {
"enum": [
"none",
"top",
"center",
"bottom"
],
"type": "string",
"description": "For links/countdown blocks."
},
"call_to_action": {
"type": [
"string",
"null"
],
"description": "For media kit blocks. Up to 100 characters; null clears it."
},
"collapse_style": {
"enum": [
"exposed",
"collapsed"
],
"type": "string",
"description": "For images/videos/email & sms blocks. For links/digital products blocks."
},
"display_header": {
"type": "boolean",
"description": "For affiliate products blocks."
},
"filter_overlay": {
"enum": [
"light",
"dark",
"none"
],
"type": "string",
"description": "For links/countdown blocks."
},
"listing_status": {
"enum": [
"listed",
"hidden"
],
"type": "string",
"description": "For store blocks. listed shows the product on the page; hidden keeps the listing but hides the product."
},
"store_subtitle": {
"type": [
"string",
"null"
],
"description": "For digital products blocks. Up to 200 characters; null clears it."
},
"text_alignment": {
"enum": [
"left",
"center",
"right"
],
"type": "string",
"description": "For links/countdown blocks."
},
"community_title": {
"type": [
"string",
"null"
],
"description": "For community blocks. Up to 100 characters; null clears it."
},
"countdown_style": {
"enum": [
"boxes",
"inline",
"largeDigits"
],
"type": "string",
"description": "For countdown blocks."
},
"cover_image_url": {
"type": [
"string",
"null"
],
"description": "For follower count blocks. Public HTTPS image, up to 2048 bytes; null clears it."
},
"expiry_subtitle": {
"type": [
"string",
"null"
],
"description": "For countdown blocks. Up to 200 characters; null clears it."
},
"header_location": {
"type": [
"string",
"null"
],
"description": "For header blocks. Up to 100 characters; null clears it."
},
"header_logo_url": {
"type": [
"string",
"null"
],
"description": "For header blocks. Schemes https, up to 2048 bytes; null clears it."
},
"header_subtitle": {
"type": [
"string",
"null"
],
"description": "For affiliate products blocks. Up to 200 characters; null clears it."
},
"image_placement": {
"enum": [
"left",
"right",
"alternating"
],
"type": "string",
"description": "For links/countdown blocks."
},
"integration_url": {
"type": "string",
"description": "For integrations blocks. Schemes https, up to 2048 bytes."
},
"name_field_text": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Up to 100 characters; null clears it."
},
"required_fields": {
"type": "array",
"items": {
"enum": [
"phone_number",
"custom",
"location",
"birthdate"
],
"type": "string"
},
"maxItems": 4,
"minItems": 0,
"description": "For email & sms blocks. Ordered values; every item must be one of phone_number, custom, location, birthdate.",
"uniqueItems": true
},
"seperator_style": {
"enum": [
"none",
"thin",
"dash",
"thick",
"ellipses"
],
"type": "string",
"description": "For space and dividers blocks."
},
"success_message": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Up to 500 characters; null clears it."
},
"grid_num_columns": {
"type": "integer",
"maximum": 4,
"minimum": 2,
"description": "For images blocks. 2–4."
},
"integration_type": {
"enum": [
"spring",
"topmate",
"trend",
"oasis",
"bookvid",
"proxi",
"buymeacoffee",
"provecho",
"pietra",
"kit",
"laylo",
"kofi",
"quikplace",
"split",
"delphi",
"ffm.to",
"fourthwall"
],
"type": "string",
"description": "For integrations blocks."
},
"note_placeholder": {
"type": [
"string",
"null"
],
"description": "For community blocks. Up to 200 characters; null clears it."
},
"placeholder_text": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Up to 200 characters; null clears it."
},
"redirect_page_id": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Up to 100 characters; null clears it."
},
"show_email_field": {
"type": "boolean",
"description": "For email & sms blocks."
},
"show_leaderboard": {
"type": "boolean",
"description": "For community blocks."
},
"show_name_fields": {
"enum": [
"",
"full_name",
"first_name",
"first_name_last_name"
],
"type": "string",
"description": "For email & sms blocks."
},
"social_icon_size": {
"enum": [
"small",
"medium",
"big"
],
"type": "string",
"description": "For header blocks."
},
"target_unix_time": {
"type": "integer",
"maximum": 4102444800000,
"minimum": 0,
"description": "For countdown blocks. 0–4102444800000."
},
"custom_field_text": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Up to 200 characters; null clears it."
},
"integration_theme": {
"enum": [
"light",
"dark"
],
"type": "string",
"description": "For a Laylo integration only. Omit for every other provider."
},
"show_custom_field": {
"type": "boolean",
"description": "For email & sms blocks."
},
"hide_leading_zeros": {
"type": "boolean",
"description": "For countdown blocks."
},
"show_follow_button": {
"type": "boolean",
"description": "For follower count blocks."
},
"show_provider_logo": {
"type": "boolean",
"description": "For live events blocks."
},
"title_display_name": {
"type": [
"string",
"null"
],
"description": "For media kit blocks. Up to 100 characters; null clears it."
},
"header_banner_image": {
"type": [
"string",
"null"
],
"description": "For header blocks. Schemes https, up to 2048 bytes; null clears it."
},
"image_scale_percent": {
"type": "integer",
"maximum": 100,
"minimum": 50,
"description": "For images blocks. 50–100."
},
"profile_picture_url": {
"type": [
"string",
"null"
],
"description": "Authoritative home header only; send without block fields. Public HTTPS image URL re-hosted on Beacons before saving; null or empty string clears it."
},
"support_description": {
"type": [
"string",
"null"
],
"description": "For support blocks. Up to 500 characters; null clears it."
},
"thumbnail_image_url": {
"type": [
"string",
"null"
],
"description": "For email & sms blocks. Schemes https, up to 2048 bytes; null clears it."
},
"affiliate_collection": {
"type": "object",
"properties": {
"index": {
"type": "integer",
"minimum": 0,
"description": "Move this existing entry to this 0-based index."
},
"remove": {
"enum": [
true
],
"type": "boolean",
"description": "Drop the collection from this block, or the product from the collection. Send it with the ids and nothing else. Removing a collection takes it off this block only; the collection itself and its products stay in the affiliate catalogue."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move this existing entry to the top or bottom."
},
"product_id": {
"type": "string",
"description": "A product id inside that collection. Pass it to remove or move the product instead of the collection."
},
"product_url": {
"type": "string",
"description": "An https product page URL from a supported merchant. Beacons turns it into the creator's tracked affiliate link and lists the product in a collection on this block. Combine only with collection_id or collection_title."
},
"collection_id": {
"type": "string",
"description": "A collection id. One already in the block read's collections array is reordered or removed; one from attachable_collections is attached to the block. With product_url, the collection the product is appended to."
},
"after_product_id": {
"type": "string",
"description": "Move the product directly after this product id in the collection."
},
"collection_title": {
"type": "string",
"maxLength": 100,
"description": "With product_url and no collection_id, the title of the new collection, up to 100 characters. Omitted, it is \"My Collection\"."
},
"before_product_id": {
"type": "string",
"description": "Move the product directly before this product id in the collection."
},
"after_collection_id": {
"type": "string",
"description": "Place the collection directly after this listed collection id."
},
"before_collection_id": {
"type": "string",
"description": "Place the collection directly before this listed collection id."
}
},
"description": "For Affiliate. Attach one of the creator's existing affiliate collections to the block, or reorder or remove one it already lists, or one product inside one. A collection_id the block does not list yet is attached, with an optional collection placement; one it already lists is reordered or removed. Add product_id to act on that product inside the collection instead. Listed ids come from the collections array on the block read and attachable ones from attachable_collections beside it. To add an affiliate product, send product_url alone, with collection_title to name the new collection it creates, or with the collection_id of an existing collection to append to; send one product URL per call and reuse the returned collection_id for the next. A URL already in that collection is not added twice, and a merchant Beacons does not support is refused with nothing added.",
"minProperties": 1,
"additionalProperties": false
},
"auto_sync_post_count": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "For instagram feed blocks. 1–30."
},
"hide_after_countdown": {
"type": "boolean",
"description": "For countdown blocks."
},
"show_birthdate_field": {
"type": "boolean",
"description": "For email & sms blocks."
},
"show_location_fields": {
"enum": [
"",
"full_address",
"partial_address",
"country",
"postal_code"
],
"type": "string",
"description": "For email & sms blocks."
},
"store_item_placement": {
"type": "object",
"properties": {
"index": {
"type": "integer",
"minimum": 0,
"description": "Move this product to this 0-based index."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move this product to the top or bottom of the block."
},
"after_store_item_id": {
"type": "string",
"description": "Place directly after this listed store_item_id."
},
"before_store_item_id": {
"type": "string",
"description": "Place directly before this listed store_item_id."
}
},
"description": "For store blocks. Position the product named by store_item_id among the ones the block already lists. Choose exactly one of position, index, before_store_item_id or after_store_item_id. Without it a newly added product goes first.",
"additionalProperties": false
},
"rich_text_description": {
"type": [
"string",
"null"
],
"description": "For text blocks. Up to 50000 characters; null clears it."
},
"transparent_background": {
"type": "boolean",
"description": "For text/countdown blocks."
},
"carousel_text_alignment": {
"enum": [
"left",
"center",
"right"
],
"type": "string",
"description": "For links/countdown blocks."
},
"expiry_replacement_type": {
"enum": [
"text",
"link"
],
"type": "string",
"description": "For countdown blocks."
},
"open_socials_in_new_tab": {
"type": "boolean",
"description": "For header blocks."
},
"show_phone_number_field": {
"type": "boolean",
"description": "For email & sms blocks."
},
"header_display_name_type": {
"enum": [
"nickname",
"logo"
],
"type": "string",
"description": "For header blocks."
},
"is_notifications_enabled": {
"type": "boolean",
"description": "For email & sms blocks."
},
"carousel_image_aspect_ratio": {
"enum": [
"",
"1:1",
"3:2",
"16:9",
"3:1",
"2:3"
],
"type": "string",
"description": "For links/countdown blocks."
},
"show_new_comments_by_default": {
"type": "boolean",
"description": "For community blocks."
},
"header_profile_picture_border": {
"enum": [
"none",
"solid"
],
"type": "string",
"description": "For header blocks."
},
"one_column_image_aspect_ratio": {
"enum": [
"",
"1:1",
"3:2",
"16:9",
"3:1",
"2:3"
],
"type": "string",
"description": "For links/countdown blocks. For digital products blocks."
},
"header_profile_picture_width_full": {
"type": "integer",
"maximum": 300,
"minimum": 50,
"description": "For header blocks. 50–300."
},
"multi_column_image_link_num_columns": {
"type": "integer",
"maximum": 4,
"minimum": 1,
"description": "For links/countdown blocks. 1–4."
},
"header_profile_picture_border_radius": {
"enum": [
10,
10000
],
"type": "integer",
"description": "For header blocks."
},
"header_profile_picture_width_compact": {
"type": "integer",
"maximum": 80,
"minimum": 50,
"description": "For header blocks. 50–80."
}
},
"description": "For Email & SMS, show_name_fields and show_location_fields set the whole matching field group. Changing email or phone clears the legacy selector and keeps what it collected as the matching toggle; disabling phone, location, birthdate, or custom also removes stale requiredness, and disabling email makes the remaining phone field required. Block text, display, feed selection, signup controls, Shop listings, media entries, provider embeds, integrations, or follower-account visibility. Display works on every type; other fields apply only to their documented types. Inapplicable fields are returned in ignored_fields; a call with no applicable edit refuses.",
"minProperties": 1,
"additionalProperties": false
},
"block_id": {
"type": "string",
"description": "A block_id from get_link_in_bio."
},
"placement": {
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"position"
],
"properties": {
"position": {}
}
},
{
"type": "object",
"required": [
"index"
],
"properties": {
"index": {}
}
},
{
"type": "object",
"required": [
"before_block_id"
],
"properties": {
"before_block_id": {}
}
},
{
"type": "object",
"required": [
"after_block_id"
],
"properties": {
"after_block_id": {}
}
}
],
"properties": {
"index": {
"type": "integer",
"minimum": 0,
"description": "0-based index in the resulting page_layout. 0 is refused when the first block is a header. On a move, the index may equal the destination length to append."
},
"to_page": {
"type": "string",
"description": "Destination page_id from get_link_in_bio, or 'home'. Omit to reorder on the current page. Must name a different page than the block is on. Empty string is refused."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move the block to the top (after a pinned header) or the bottom of the destination page. Pass exactly one of position, index, before_block_id, or after_block_id."
},
"after_block_id": {
"type": "string",
"description": "Place this block immediately after a different block on the destination page."
},
"before_block_id": {
"type": "string",
"description": "Place this block immediately before a different block on the destination page."
}
},
"description": "Reorder the block or move it to to_page. Choose one position, index, before_block_id or after_block_id; neighbors refer to the destination. A pinned header stays first, header blocks cannot move, and a block that is not on the page layout can be restored to its own page but never moved to another with to_page.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"maxItems": 20,
"minItems": 1,
"description": "The blocks this call edits, applied together in ONE write against one slot of the write budget: one entry for one block, one entry per block for several. Each entry names one block_id, its page (required: a canonical page_id or 'home'), and exactly one of fields or placement. Up to 20 entries on up to 5 pages. Entries apply together or not at all: if any entry is unusable nothing is written, and the refusal names it as blocks[i]. Placements apply in entry order against the layout the earlier entries left. Name each block once; a block's fields and its placement go in separate calls. Some edits are allowed only in a one-entry call; the tool description lists them."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"request_id",
"status",
"results",
"pages"
],
"properties": {
"pages": {
"type": "array",
"items": {
"type": "object",
"required": [
"page_id",
"block_ids"
],
"properties": {
"page_id": {
"type": "string"
},
"block_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}
},
"status": {
"enum": [
"ok",
"partial_sync"
],
"type": "string"
},
"results": {
"type": "array",
"items": {
"type": "object",
"required": [
"block_id",
"page_id",
"fields_written"
],
"properties": {
"note": {
"type": "string"
},
"block": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"render": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"page_id": {
"type": "string"
},
"block_id": {
"type": "string"
},
"repaired": {
"enum": [
"dangling_layout_entry",
"orphan_block_body"
],
"type": "string"
},
"from_page_id": {
"type": "string"
},
"fields_written": {
"type": "array",
"items": {
"type": "string"
}
},
"ignored_fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}
},
"request_id": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update Link in Bio blocks",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Add links to a links block or the single replacement-link slot on a countdown, or edit existing ones: the URL, the title, the subtitle, whether it is displayed, whether it opens in a new tab, whether it shows as a featured 16:9 image card, whether it is archived, a hosted thumbnail picture, an animation, a discount_code, and scheduling, whose boundaries are epoch-millisecond unix times. Pass links with one entry per link — one link is a one-entry links call — to write the whole list in one call and one slot of the write budget; always put several links in one call, because writing them one at a time runs the budget out partway and leaves the page half-built. This is not how you add a photo to the page — that is create_link_in_bio_block with block_type images and a public HTTPS source_url. Hiding or turning off a link uses display false without archived or archived_at; showing it uses display true. Archiving is what a request to delete or remove a link gets — it takes the link off the page, keeps it recoverable and stamps archived_at — so say the link was archived rather than deleted, and that a permanent delete is done in the Beacons editor. A link can be placed when it is added and repositioned later, with position, index, before_link_id or after_link_id on its entry, in a one-entry links call. A countdown accepts at most one link; set its expiry_replacement_type to link with update_link_in_bio_blocks to render it after the timer ends. Existing archive, safety-review, CAS, cap and retry semantics remain unchanged.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
18 of 20 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
block_id
The links block or countdown block to edit, from get_link_in_bio.
Clear enough to supply this argument.
page
A canonical page_id from get_link_in_bio, or 'home'. Omit to search every page — a block_id found on more than one page refuses until page is passed.
Clear enough to supply this argument.
links › items › link_id
The link to edit, from get_link_in_bio with block_id. Omit (or pass an empty string) to add a new link.
Clear enough to supply this argument.
links › items › url
The link destination. Schemes http/https/mailto/sms/tel, up to 2048 bytes. Required when adding; never nullable.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links › items › title
The link label, up to 100 characters; null clears it on update.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links › items › subtitle
Optional supporting copy, up to 500 characters; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links › items › animation
Attention animation. Use none to remove it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links › items › discount_code
Code visitors can copy before opening the link, up to 64 characters. Whitespace is trimmed; null clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links › items › display
Show (true) or hide (false) the link without archiving it. For hide or turn off requests, set display false and omit archived and archived_at. New links default to hidden.
Clear enough to supply this argument.
links › items › open_in_new_tab
Open the link in a new browser tab. Defaults to false.
Clear enough to supply this argument.
links › items › featured
Show the link as a large 16:9 image card. Takes effect only under the classic or classicLarge link_type and only when the link has an uploaded picture; otherwise the link keeps its normal look. Defaults to false.
Clear enough to supply this argument.
links › items › archived
Archive the link (true) or restore it (false). Use only for explicit archive, delete, remove, or restore requests, not hide or show requests. Archiving also hides it and stamps archived_at.
Clear enough to supply this argument.
links › items › archived_at
When the link was archived, in epoch milliseconds. Omit it — archiving stamps the current time.
Clear enough to supply this argument.
links › items › picture
Public HTTPS image URL re-hosted on Beacons; null or empty clears it.
Clear enough to supply this argument.
links › items › scheduling › start_unix_time
Not provided
Missing description. Explain what this value means and how to supply it.
links › items › scheduling › end_unix_time
Not provided
Missing description. Explain what this value means and how to supply it.
links › items › position
Place the link at the top or the bottom of its links block. Works both when adding a new link and when moving an existing one.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
links › items › index
0-based position among the block's links. When moving an existing link the last valid index is one less than the link count. When adding a link the count grows by one, so the last valid index equals the current link count, which appends. An index past the end is refused.
Clear enough to supply this argument.
links › items › before_link_id
Place the link directly above this link_id on the same block. Works when adding and when moving.
Clear enough to supply this argument.
links › items › after_link_id
Place the link directly below this link_id on the same block. Works when adding and when moving.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Set Link in Bio links",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
Output schema20/100
Describe the returned fields so an agent can interpret the result.
{
"name": "set_link_in_bio_links",
"description": "Add links to a links block or the single replacement-link slot on a countdown, or edit existing ones: the URL, the title, the subtitle, whether it is displayed, whether it opens in a new tab, whether it shows as a featured 16:9 image card, whether it is archived, a hosted thumbnail picture, an animation, a discount_code, and scheduling, whose boundaries are epoch-millisecond unix times. Pass links with one entry per link — one link is a one-entry links call — to write the whole list in one call and one slot of the write budget; always put several links in one call, because writing them one at a time runs the budget out partway and leaves the page half-built. This is not how you add a photo to the page — that is create_link_in_bio_block with block_type images and a public HTTPS source_url. Hiding or turning off a link uses display false without archived or archived_at; showing it uses display true. Archiving is what a request to delete or remove a link gets — it takes the link off the page, keeps it recoverable and stamps archived_at — so say the link was archived rather than deleted, and that a permanent delete is done in the Beacons editor. A link can be placed when it is added and repositioned later, with position, index, before_link_id or after_link_id on its entry, in a one-entry links call. A countdown accepts at most one link; set its expiry_replacement_type to link with update_link_in_bio_blocks to render it after the timer ends. Existing archive, safety-review, CAS, cap and retry semantics remain unchanged.",
"inputSchema": {
"type": "object",
"required": [
"block_id",
"links"
],
"properties": {
"page": {
"type": "string",
"description": "A canonical page_id from get_link_in_bio, or 'home'. Omit to search every page — a block_id found on more than one page refuses until page is passed."
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {
"url": {
"type": "string",
"description": "The link destination. Schemes http/https/mailto/sms/tel, up to 2048 bytes. Required when adding; never nullable."
},
"index": {
"type": "integer",
"minimum": 0,
"description": "0-based position among the block's links. When moving an existing link the last valid index is one less than the link count. When adding a link the count grows by one, so the last valid index equals the current link count, which appends. An index past the end is refused."
},
"title": {
"type": [
"string",
"null"
],
"description": "The link label, up to 100 characters; null clears it on update."
},
"display": {
"type": "boolean",
"description": "Show (true) or hide (false) the link without archiving it. For hide or turn off requests, set display false and omit archived and archived_at. New links default to hidden."
},
"link_id": {
"type": "string",
"description": "The link to edit, from get_link_in_bio with block_id. Omit (or pass an empty string) to add a new link."
},
"picture": {
"type": [
"string",
"null"
],
"description": "Public HTTPS image URL re-hosted on Beacons; null or empty clears it."
},
"archived": {
"type": "boolean",
"description": "Archive the link (true) or restore it (false). Use only for explicit archive, delete, remove, or restore requests, not hide or show requests. Archiving also hides it and stamps archived_at."
},
"featured": {
"type": "boolean",
"description": "Show the link as a large 16:9 image card. Takes effect only under the classic or classicLarge link_type and only when the link has an uploaded picture; otherwise the link keeps its normal look. Defaults to false."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Place the link at the top or the bottom of its links block. Works both when adding a new link and when moving an existing one."
},
"subtitle": {
"type": [
"string",
"null"
],
"description": "Optional supporting copy, up to 500 characters; null clears it."
},
"animation": {
"enum": [
"none",
"bounce",
"jello",
"pulse",
"shake",
"tada",
"wobble"
],
"type": "string",
"description": "Attention animation. Use none to remove it."
},
"scheduling": {
"type": "object",
"required": [
"start_unix_time",
"end_unix_time"
],
"properties": {
"end_unix_time": {
"type": [
"integer",
"null"
],
"maximum": 4102444800000,
"minimum": 0
},
"start_unix_time": {
"type": [
"integer",
"null"
],
"maximum": 4102444800000,
"minimum": 0
}
},
"description": "Start/end epoch milliseconds; null boundaries are allowed and both null clears.",
"additionalProperties": false
},
"archived_at": {
"type": "integer",
"maximum": 4102444800000,
"minimum": 0,
"description": "When the link was archived, in epoch milliseconds. Omit it — archiving stamps the current time."
},
"after_link_id": {
"type": "string",
"description": "Place the link directly below this link_id on the same block. Works when adding and when moving."
},
"discount_code": {
"type": [
"string",
"null"
],
"description": "Code visitors can copy before opening the link, up to 64 characters. Whitespace is trimmed; null clears it."
},
"before_link_id": {
"type": "string",
"description": "Place the link directly above this link_id on the same block. Works when adding and when moving."
},
"open_in_new_tab": {
"type": "boolean",
"description": "Open the link in a new browser tab. Defaults to false."
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "The links this call writes, in ONE write against one slot of the write budget — one entry for one link, one entry per link for several. Omit link_id in an entry to add a link, pass one to edit it. Entries without a placement are appended in the order given. A placement — exactly one of position, index, before_link_id or after_link_id — is allowed only in a one-entry call, where it places the link as it is added or moves an existing one. Up to 100 entries, and the whole call is refused if any entry is unusable or the block has no room for all of them — nothing is written and no link is left half-applied."
},
"block_id": {
"type": "string",
"description": "The links block or countdown block to edit, from get_link_in_bio."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"request_id",
"page_id",
"links",
"block",
"render"
],
"properties": {
"block": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"render": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"page_id": {
"type": "string"
},
"request_id": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set Link in Bio links",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Create a Link in Bio page with a unique title. Omit copy_from_page_id for an empty page, or pass a canonical page_id from get_link_in_bio to copy its blocks into the new page; copying home excludes its pinned header. The account page allowance is enforced. After a transport failure, read the pages back with get_link_in_bio before deciding whether to retry.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
page_title
The page's name in the navigation, up to 100 characters. It is also the page's public URL: the title lowercased with everything but letters, digits and hyphens removed, so "OFF TOP TV" serves at /offtoptv beneath the account handle.
Clear enough to supply this argument.
copy_from_page_id
Optional canonical page_id from get_link_in_bio to copy, including 'home'. Omit it to create an empty page.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Create Link in Bio page",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
Output schema43/100
Describe the returned fields so an agent can interpret the result.
{
"name": "create_link_in_bio_page",
"description": "Create a Link in Bio page with a unique title. Omit copy_from_page_id for an empty page, or pass a canonical page_id from get_link_in_bio to copy its blocks into the new page; copying home excludes its pinned header. The account page allowance is enforced. After a transport failure, read the pages back with get_link_in_bio before deciding whether to retry.",
"inputSchema": {
"type": "object",
"required": [
"page_title"
],
"properties": {
"page_title": {
"type": "string",
"description": "The page's name in the navigation, up to 100 characters. It is also the page's public URL: the title lowercased with everything but letters, digits and hyphens removed, so \"OFF TOP TV\" serves at /offtoptv beneath the account handle."
},
"copy_from_page_id": {
"type": "string",
"description": "Optional canonical page_id from get_link_in_bio to copy, including 'home'. Omit it to create an empty page."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"request_id",
"status",
"page",
"pages_used",
"pages_allowed",
"note"
],
"properties": {
"note": {
"type": "string"
},
"page": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"status": {
"enum": [
"ok",
"partial_sync"
],
"type": "string"
},
"pages_used": {
"type": "number"
},
"request_id": {
"type": "string"
},
"blocks_copied": {
"type": "number"
},
"pages_allowed": {
"type": "number"
},
"copied_from_page_id": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Link in Bio page",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Rename a Link in Bio page, show/hide it in the page navigation, or move it earlier or later in that navigation. Pass page_title, display, a placement, or any combination; at least one is required, and anything you omit stays as it is. Hiding a page takes it out of the navigation — its blocks are untouched and the page keeps its blocks and its page_id. Reordering is a permutation of the existing pages: every other page keeps its place and nothing is created or deleted. The home page can be renamed but NEVER hidden or moved: it is the Link in Bio itself, not one of the pages under it, and it is always first. Read the current titles, order and display flags with get_link_in_bio first. After a transport failure, re-read and re-send only if the change is absent.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
The page to change: a canonical page_id from get_link_in_bio, or 'home'.
Clear enough to supply this argument.
page_title
The page's new name, up to 100 characters. Renaming also changes the page's public URL, which is the title lowercased with everything but letters, digits and hyphens removed — the way to give a page the address a creator asks for. The old address stops pointing at this page, so say so before renaming one that has been shared.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
display
Show or hide the page in the navigation. Refused for 'home', which is always shown.
Clear enough to supply this argument.
position
Move the page to the top of the navigation (directly under home) or the bottom. Pass exactly one of position, index, before_page_id, or after_page_id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
index
0-based position in the navigation as get_link_in_bio lists it. 0 is home and is refused; the first movable slot is 1. An index past the last page is refused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
before_page_id
Move the page directly above this page_id. 'home' is refused — nothing sits above the home page.
Clear enough to supply this argument.
after_page_id
Move the page directly below this page_id, including 'home'.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Set Link in Bio page",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
Output schema31/100
Describe the returned fields so an agent can interpret the result.
{
"name": "set_link_in_bio_page",
"description": "Rename a Link in Bio page, show/hide it in the page navigation, or move it earlier or later in that navigation. Pass page_title, display, a placement, or any combination; at least one is required, and anything you omit stays as it is. Hiding a page takes it out of the navigation — its blocks are untouched and the page keeps its blocks and its page_id. Reordering is a permutation of the existing pages: every other page keeps its place and nothing is created or deleted. The home page can be renamed but NEVER hidden or moved: it is the Link in Bio itself, not one of the pages under it, and it is always first. Read the current titles, order and display flags with get_link_in_bio first. After a transport failure, re-read and re-send only if the change is absent.",
"inputSchema": {
"type": "object",
"required": [
"page"
],
"properties": {
"page": {
"type": "string",
"description": "The page to change: a canonical page_id from get_link_in_bio, or 'home'."
},
"index": {
"type": "integer",
"minimum": 0,
"description": "0-based position in the navigation as get_link_in_bio lists it. 0 is home and is refused; the first movable slot is 1. An index past the last page is refused."
},
"display": {
"type": "boolean",
"description": "Show or hide the page in the navigation. Refused for 'home', which is always shown."
},
"position": {
"enum": [
"top",
"bottom"
],
"type": "string",
"description": "Move the page to the top of the navigation (directly under home) or the bottom. Pass exactly one of position, index, before_page_id, or after_page_id."
},
"page_title": {
"type": "string",
"description": "The page's new name, up to 100 characters. Renaming also changes the page's public URL, which is the title lowercased with everything but letters, digits and hyphens removed — the way to give a page the address a creator asks for. The old address stops pointing at this page, so say so before renaming one that has been shared."
},
"after_page_id": {
"type": "string",
"description": "Move the page directly below this page_id, including 'home'."
},
"before_page_id": {
"type": "string",
"description": "Move the page directly above this page_id. 'home' is refused — nothing sits above the home page."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"request_id",
"status",
"page",
"note"
],
"properties": {
"note": {
"type": "string"
},
"page": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"status": {
"enum": [
"ok"
],
"type": "string"
},
"request_id": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set Link in Bio page",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
PERMANENTLY delete one Link in Bio page AND every block on it. This cannot be undone. The first call never deletes anything: it returns the page and how many blocks would be destroyed, and only a later call with the same page — after the creator has confirmed in their own next message — deletes. Show them the page name and the block count and stop; do not call again in the same turn. The home page cannot be deleted. To take a page out of the navigation without losing its blocks, use set_link_in_bio_page with display false instead. NEVER auto-retry this call.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
confirmation_token
MCP only: repeat the token from the proposal with the same page after approval, within 10 minutes. Chat confirms in a later user message without a token.
Clear enough to supply this argument.
page
The page to delete: a canonical page_id from get_link_in_bio. 'home' is refused.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Delete Link in Bio page",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
Output schema49/100
Describe the returned fields so an agent can interpret the result.
{
"name": "delete_link_in_bio_page",
"description": "PERMANENTLY delete one Link in Bio page AND every block on it. This cannot be undone. The first call never deletes anything: it returns the page and how many blocks would be destroyed, and only a later call with the same page — after the creator has confirmed in their own next message — deletes. Show them the page name and the block count and stop; do not call again in the same turn. The home page cannot be deleted. To take a page out of the navigation without losing its blocks, use set_link_in_bio_page with display false instead. NEVER auto-retry this call.",
"inputSchema": {
"type": "object",
"required": [
"page"
],
"properties": {
"page": {
"type": "string",
"description": "The page to delete: a canonical page_id from get_link_in_bio. 'home' is refused."
},
"confirmation_token": {
"type": "string",
"description": "MCP only: repeat the token from the proposal with the same page after approval, within 10 minutes. Chat confirms in a later user message without a token."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"request_id",
"status",
"page",
"note"
],
"properties": {
"note": {
"type": "string"
},
"page": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"status": {
"enum": [
"ok",
"needs_confirmation",
"partial_cleanup"
],
"type": "string"
},
"request_id": {
"type": "string"
},
"blocks_deleted": {
"type": "number"
},
"blocks_to_delete": {
"type": "number"
},
"confirmation_token": {
"type": "string"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete Link in Bio page",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Creator analytics for one source or several side by side: links (Link in Bio and short-link clicks and unique clicks by link, link type, country, device or referrer), pages (views of their Link in Bio and Media Kit pages, and Link in Bio click rate, by page, country, device or referrer), products (store earnings split into direct sales and affiliate commissions, orders, refunds, product page views and conversion rate by product, traffic source, device, purchaser country or discount code), posts (posts on connected Instagram, TikTok, YouTube and other accounts: views, likes, comments, shares, saves and engagement by platform, account, post, content type (reels, carousels, videos) or sponsored), accounts (each connected social account's followers, follower change and profile views by platform, account or time), subscribers (email-list and form subscribers: signups, still active, unsubscribes, net change and retention by signup form or referrer platform; subscriber country is not available), emails (marketing email sends: delivered, opens, clicks, bounces, spam reports, open, click and bounce rates and deliverability by broadcast vs automation, email, automation or time) or deals (brand-deal money paid to them: revenue, paid deals and average deal value by brand, brand category, currency or month) or replies (Smart Reply automations: comments and unique_commenters (distinct recorded commenters), events, DMs sent, skipped and failed and send rate by automation, comment vs DM, outcome, reason or UTC time) or invoices (invoices they sent brands through Beacons Invoicing: invoices issued, amount invoiced, still unpaid, invoices paid and amount paid by customer, currency, day, week or month). For a broad question across areas, such as their biggest wins this week, a weekly recap or how they are doing overall, pass sources (the areas to cover) and the window instead of source: one call returns each area's totals for that window and the one before it. A comparison within one area, such as one platform this week vs last, is a single-source breakdown grouped by week. Pass only source (with optional start_date and end_date) for that area's full overview, the call for a general question such as how their sales, traffic, posts, followers, list or emails are doing. links: clicks over time, clicks per link, recorded revenue and form signups per link (which link made the most money or leads), and the short-link catalog capped by limit. pages: Link in Bio visits over time with country, device and referrer breakdowns, and Media Kit views; these page views are not the Home dashboard's Total Views, which counts views on their social posts. products: earnings and orders against the previous window, all-time earnings (the Home Total Earnings card), top products, sources and purchaser countries, and conversion by product (no direct vs affiliate split; ask for affiliate_earnings). posts: the window's top posts by engagement. accounts: every linked account's followers and when they last synced, connection health, engagement, audience demographics and Instagram/Facebook 28-day unique reach with its source and update time, a rolling snapshot that ignores the dates (filters.city looks up one audience city); call it for 28-day reach or before answering why a follower count looks old or how to refresh it. subscribers: signups and still-active counts by signup form and day, never names, emails or phones; the source for how their email list is doing (for growing or shrinking, ask for signups, unsubscribes and net_change, which the overview lacks). emails: the Email Marketing dashboard's delivery, open, click, bounce and deliverability numbers with new subscribers and undeliverable contacts; the source for how their emails are performing. deals: brand-deal revenue paid in the window by month, brand and category, all-time closed revenue, open pipeline value by stage and what is awaiting payment; brand deals only, never added to products. replies: every Smart Reply automation with its all-time sends and link clicks, and the latest comment and DM events with why each sent, was skipped or failed. invoices: all-time totals per currency of what they invoiced, were paid and are still owed, with draft, outstanding, paid and overdue counts, ignoring the dates; never added to deals or products. Each overview adds a vocabulary of the source's metrics, dimensions, filters and rules for the next slice. Add metrics, group_by or filters for a breakdown with every group up to limit (1-100), not a fixed top-N summary; truncated true means more rows exist than were returned, so raise limit or narrow the filters. Breakdowns answer: how much of their earnings was affiliate commissions (affiliate_earnings), exact page views per product (each row carries the product title, so no product lookup is needed first), where buyers are located (purchaser country), sales or views by hour, day or day of week, earnings by traffic source, which discount code drove the most sales, which product earns most on weekends, how one link did each day (filters link, group_by day, metrics clicks and unique_clicks), which referrers click one link, which posts got the most engagement last month, when to post (views_per_post by publish hour, since total views by hour mostly count how many posts went out then), how many followers they gained this month, one platform's followers and profile views week over week (filter by that platform, group_by week), which form or platform brings the most subscribers, and any ranking the fixed reports truncate. For a time window shorter than a day (e.g. "the last 24 hours"), group by day and hour with start_date set to yesterday's YYYY-MM-DD date, end_date today and limit 48, then sum only additive metrics in the day-and-hour rows inside the window, using the current time and the returned timezone; for products, hour takes only direct_orders, direct_earnings or refunded_orders. Never sum comments or unique_commenters across groups; omit group_by for distinct totals in a calendar-date window. Reply with the number; do not explain hours, time zones or how it was counted unless the creator asks. Products hours are the creator's local time and Link in Bio hours are UTC; product page views have no hours, only days. Purchaser country is the country recorded on the order at checkout, not visitor or follower geography.
The description explains the capability, when to use it, and what to expect.
Inputs21/100
8 of 34 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
source
links (link clicks, UTC days), pages (Link in Bio visits and Media Kit views, UTC days), products (store orders and commissions on the creator’s local days, product page views on UTC days), posts (connected social accounts’ posts by publish time, UTC days), accounts (daily follower snapshots of each connected social account, UTC days), subscribers (email-list and form signups and unsubscribes, the creator’s local days), emails (marketing email sends by event time, UTC days) deals (brand-deal payments by the UTC day each was recorded), replies (Smart Reply comment and DM events, UTC days) or invoices (invoices sent to brands, by UTC creation day and paid date).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sources
Several sources instead of source, for a question across areas: each returns its totals for this window and the window of equal length before it (links clicks, pages views per page, products earnings and orders, posts published, accounts followers and follower change, subscribers signups, unsubscribes and net change, emails delivered, opens, open rate and clicks, deals revenue and paid deals, replies sends and failed, invoices paid and invoices_paid in USD). Their socials are posts and accounts together. Takes only start_date and end_date.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
start_date
First calendar day (YYYY-MM-DD, or today/tomorrow), UTC for links, pages, posts, accounts, emails, deals, replies and invoices and local for products and subscribers. Defaults to 30 days ago.
Clear enough to supply this argument.
end_date
Last calendar day (YYYY-MM-DD, or today/tomorrow), inclusive. Defaults to today.
Clear enough to supply this argument.
group_by
Up to 2 dimensions; required for a links breakdown, optional for the others (omit, with metrics, for one totals row). Omit metrics, group_by and filters for the overview of that source. links: link, link_type, country, device, referrer, day, hour, day_of_week. pages: page (link_in_bio or media_kit), country, device, referrer, day, hour, day_of_week; Media Kit views take day and day_of_week only. products: product, source, device, country, day, week, month, day_of_week, hour, discount_code (hour and discount_code count direct orders only: ask for direct_earnings or direct_orders). posts: platform, account, post, content_type, content_format, sponsored, day, week, month, day_of_week, hour (of publish time). accounts: platform, account, day, week, month, day_of_week. subscribers: source (signup form), referrer_platform, day, week, month, day_of_week, hour (local); no country. emails: kind (broadcast, welcome, post_purchase, other), message, automation, day, week, month, day_of_week, hour (UTC event time). deals: brand, category, currency, day, week, month (UTC day the payment was recorded). replies: trigger (automation), source (comment or dm), outcome, reason, day, week, day_of_week, hour (UTC). invoices: customer, currency, day, week, month (UTC creation day for issued, paid date for paid).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
metrics
links: clicks, unique_clicks (distinct visitor IPs), link_click_share_of_visits (a link’s clicks / every Link in Bio page visit in the group; needs a link filter or link grouping). pages: views (page-view events), click_rate (Link in Bio clicks / visits), creator_own_views and views_from_link_in_bio (Media Kit only, never added to views). products: earnings, direct_earnings, affiliate_earnings (affiliate commission money), orders, direct_orders, affiliate_commissions (how many commissions, not money), refunded_orders, page_views, conversion_rate (direct orders / page views); page_views and conversion_rate group by product or device, and page_views alone also by day, week, month or day_of_week. posts: posts, views, impressions, likes, comments, shares, saves, engagement (likes + comments + shares + saves), views_per_post, engagement_per_post, engagement_per_view (engagement / views). accounts: followers (latest snapshot), follower_change (last minus first snapshot; not by day), profile_views, accounts_reached and accounts_engaged (by day only); followers and follower_change cannot group by day_of_week. subscribers: signups, still_active (of those signups, still subscribed now), unsubscribes (in the window, whenever they signed up), net_change (signups - unsubscribes), retention_rate (still_active / signups); unsubscribes and net_change cannot use referrer_platform. emails: delivered, opens, clicks, bounces, spam_reports, dropped, open_rate (opens / delivered), click_rate (clicks / opens, as the product shows it), click_through_rate (clicks / delivered), bounce_rate, spam_rate, deliverability; subscriber list signups and unsubscribes are a separate source. deals: deal_revenue (money paid on completed deals, USD unless grouped or filtered by currency), paid_deals, avg_deal_value. replies: comments (distinct recorded comment IDs), unique_commenters (distinct commenter IDs on recorded comments), events, sends, skipped, failed, send_rate (sends / (sends + failed)); recorded from 2026-08-04 (sends) and 2026-09-30 (the rest). invoices: invoices_issued, invoiced (amount of sent invoices created in the window), unpaid (of those, still unpaid now), invoices_paid, paid (amount paid in the window); USD unless grouped or filtered by currency. Defaults to clicks, views, earnings, orders, posts, views, engagement, followers, follower_change, signups, still_active, delivered, opens, open_rate, clicks, click_rate, deal_revenue, paid_deals, sends, failed, send_rate, or invoiced, paid.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › link
Not provided
Missing description. Explain what this value means and how to supply it.
filters › link_type
Not provided
Missing description. Explain what this value means and how to supply it.
filters › country
Not provided
Missing description. Explain what this value means and how to supply it.
filters › device
Not provided
Missing description. Explain what this value means and how to supply it.
filters › referrer
Not provided
Missing description. Explain what this value means and how to supply it.
filters › page
Not provided
Missing description. Explain what this value means and how to supply it.
filters › product
Not provided
Missing description. Explain what this value means and how to supply it.
filters › source
Not provided
Missing description. Explain what this value means and how to supply it.
filters › discount_code
Not provided
Missing description. Explain what this value means and how to supply it.
filters › platform
Not provided
Missing description. Explain what this value means and how to supply it.
filters › account
Not provided
Missing description. Explain what this value means and how to supply it.
filters › content_type
Not provided
Missing description. Explain what this value means and how to supply it.
filters › content_format
Not provided
Missing description. Explain what this value means and how to supply it.
filters › sponsored
Not provided
Missing description. Explain what this value means and how to supply it.
filters › referrer_platform
Not provided
Missing description. Explain what this value means and how to supply it.
filters › kind
Not provided
Missing description. Explain what this value means and how to supply it.
filters › message
Not provided
Missing description. Explain what this value means and how to supply it.
filters › automation
Not provided
Missing description. Explain what this value means and how to supply it.
filters › brand
Not provided
Missing description. Explain what this value means and how to supply it.
filters › category
Not provided
Missing description. Explain what this value means and how to supply it.
filters › currency
Not provided
Missing description. Explain what this value means and how to supply it.
filters › trigger
Not provided
Missing description. Explain what this value means and how to supply it.
filters › outcome
Not provided
Missing description. Explain what this value means and how to supply it.
filters › reason
Not provided
Missing description. Explain what this value means and how to supply it.
filters › customer
Not provided
Missing description. Explain what this value means and how to supply it.
filters › city
Not provided
Missing description. Explain what this value means and how to supply it.
order_by
A requested metric (sorted high to low) or group_by dimension (sorted ascending). Defaults to the first metric, or the time dimension when grouping only by time.
{
"name": "get_analytics",
"description": "Creator analytics for one source or several side by side: links (Link in Bio and short-link clicks and unique clicks by link, link type, country, device or referrer), pages (views of their Link in Bio and Media Kit pages, and Link in Bio click rate, by page, country, device or referrer), products (store earnings split into direct sales and affiliate commissions, orders, refunds, product page views and conversion rate by product, traffic source, device, purchaser country or discount code), posts (posts on connected Instagram, TikTok, YouTube and other accounts: views, likes, comments, shares, saves and engagement by platform, account, post, content type (reels, carousels, videos) or sponsored), accounts (each connected social account's followers, follower change and profile views by platform, account or time), subscribers (email-list and form subscribers: signups, still active, unsubscribes, net change and retention by signup form or referrer platform; subscriber country is not available), emails (marketing email sends: delivered, opens, clicks, bounces, spam reports, open, click and bounce rates and deliverability by broadcast vs automation, email, automation or time) or deals (brand-deal money paid to them: revenue, paid deals and average deal value by brand, brand category, currency or month) or replies (Smart Reply automations: comments and unique_commenters (distinct recorded commenters), events, DMs sent, skipped and failed and send rate by automation, comment vs DM, outcome, reason or UTC time) or invoices (invoices they sent brands through Beacons Invoicing: invoices issued, amount invoiced, still unpaid, invoices paid and amount paid by customer, currency, day, week or month). For a broad question across areas, such as their biggest wins this week, a weekly recap or how they are doing overall, pass sources (the areas to cover) and the window instead of source: one call returns each area's totals for that window and the one before it. A comparison within one area, such as one platform this week vs last, is a single-source breakdown grouped by week. Pass only source (with optional start_date and end_date) for that area's full overview, the call for a general question such as how their sales, traffic, posts, followers, list or emails are doing. links: clicks over time, clicks per link, recorded revenue and form signups per link (which link made the most money or leads), and the short-link catalog capped by limit. pages: Link in Bio visits over time with country, device and referrer breakdowns, and Media Kit views; these page views are not the Home dashboard's Total Views, which counts views on their social posts. products: earnings and orders against the previous window, all-time earnings (the Home Total Earnings card), top products, sources and purchaser countries, and conversion by product (no direct vs affiliate split; ask for affiliate_earnings). posts: the window's top posts by engagement. accounts: every linked account's followers and when they last synced, connection health, engagement, audience demographics and Instagram/Facebook 28-day unique reach with its source and update time, a rolling snapshot that ignores the dates (filters.city looks up one audience city); call it for 28-day reach or before answering why a follower count looks old or how to refresh it. subscribers: signups and still-active counts by signup form and day, never names, emails or phones; the source for how their email list is doing (for growing or shrinking, ask for signups, unsubscribes and net_change, which the overview lacks). emails: the Email Marketing dashboard's delivery, open, click, bounce and deliverability numbers with new subscribers and undeliverable contacts; the source for how their emails are performing. deals: brand-deal revenue paid in the window by month, brand and category, all-time closed revenue, open pipeline value by stage and what is awaiting payment; brand deals only, never added to products. replies: every Smart Reply automation with its all-time sends and link clicks, and the latest comment and DM events with why each sent, was skipped or failed. invoices: all-time totals per currency of what they invoiced, were paid and are still owed, with draft, outstanding, paid and overdue counts, ignoring the dates; never added to deals or products. Each overview adds a vocabulary of the source's metrics, dimensions, filters and rules for the next slice. Add metrics, group_by or filters for a breakdown with every group up to limit (1-100), not a fixed top-N summary; truncated true means more rows exist than were returned, so raise limit or narrow the filters. Breakdowns answer: how much of their earnings was affiliate commissions (affiliate_earnings), exact page views per product (each row carries the product title, so no product lookup is needed first), where buyers are located (purchaser country), sales or views by hour, day or day of week, earnings by traffic source, which discount code drove the most sales, which product earns most on weekends, how one link did each day (filters link, group_by day, metrics clicks and unique_clicks), which referrers click one link, which posts got the most engagement last month, when to post (views_per_post by publish hour, since total views by hour mostly count how many posts went out then), how many followers they gained this month, one platform's followers and profile views week over week (filter by that platform, group_by week), which form or platform brings the most subscribers, and any ranking the fixed reports truncate. For a time window shorter than a day (e.g. \"the last 24 hours\"), group by day and hour with start_date set to yesterday's YYYY-MM-DD date, end_date today and limit 48, then sum only additive metrics in the day-and-hour rows inside the window, using the current time and the returned timezone; for products, hour takes only direct_orders, direct_earnings or refunded_orders. Never sum comments or unique_commenters across groups; omit group_by for distinct totals in a calendar-date window. Reply with the number; do not explain hours, time zones or how it was counted unless the creator asks. Products hours are the creator's local time and Link in Bio hours are UTC; product page views have no hours, only days. Purchaser country is the country recorded on the order at checkout, not visitor or follower geography.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "Rows to return, 1-100. Defaults to 25."
},
"source": {
"enum": [
"links",
"pages",
"products",
"posts",
"accounts",
"subscribers",
"emails",
"deals",
"replies",
"invoices"
],
"type": "string",
"description": "links (link clicks, UTC days), pages (Link in Bio visits and Media Kit views, UTC days), products (store orders and commissions on the creator’s local days, product page views on UTC days), posts (connected social accounts’ posts by publish time, UTC days), accounts (daily follower snapshots of each connected social account, UTC days), subscribers (email-list and form signups and unsubscribes, the creator’s local days), emails (marketing email sends by event time, UTC days) deals (brand-deal payments by the UTC day each was recorded), replies (Smart Reply comment and DM events, UTC days) or invoices (invoices sent to brands, by UTC creation day and paid date)."
},
"filters": {
"type": "object",
"properties": {
"city": {
"type": "array",
"items": {
"type": "string"
}
},
"kind": {
"type": "array",
"items": {
"type": "string"
}
},
"link": {
"type": "array",
"items": {
"type": "string"
}
},
"page": {
"type": "array",
"items": {
"type": "string"
}
},
"brand": {
"type": "array",
"items": {
"type": "string"
}
},
"device": {
"type": "array",
"items": {
"type": "string"
}
},
"reason": {
"type": "array",
"items": {
"type": "string"
}
},
"source": {
"type": "array",
"items": {
"type": "string"
}
},
"account": {
"type": "array",
"items": {
"type": "string"
}
},
"country": {
"type": "array",
"items": {
"type": "string"
}
},
"message": {
"type": "array",
"items": {
"type": "string"
}
},
"outcome": {
"type": "array",
"items": {
"type": "string"
}
},
"product": {
"type": "array",
"items": {
"type": "string"
}
},
"trigger": {
"type": "array",
"items": {
"type": "string"
}
},
"category": {
"type": "array",
"items": {
"type": "string"
}
},
"currency": {
"type": "array",
"items": {
"type": "string"
}
},
"customer": {
"type": "array",
"items": {
"type": "string"
}
},
"platform": {
"type": "array",
"items": {
"type": "string"
}
},
"referrer": {
"type": "array",
"items": {
"type": "string"
}
},
"link_type": {
"type": "array",
"items": {
"type": "string"
}
},
"sponsored": {
"type": "array",
"items": {
"type": "string"
}
},
"automation": {
"type": "array",
"items": {
"type": "string"
}
},
"content_type": {
"type": "array",
"items": {
"type": "string"
}
},
"discount_code": {
"type": "array",
"items": {
"type": "string"
}
},
"content_format": {
"type": "array",
"items": {
"type": "string"
}
},
"referrer_platform": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "Keep only rows matching every listed value set. links: link (link_ids), link_type (link_in_bio or custom_short_link), country, device, referrer. pages: page (link_in_bio or media_kit), country, device, referrer. products: product (product ids), source, device, country, discount_code (code text). posts: platform, account (platform/username), content_type, content_format, sponsored (true or false); stories are left out unless content_type includes story. accounts: platform, account. subscribers: source (e.g. store_purchase, email_list), referrer_platform. emails: kind, message (message ids), automation (automation ids). deals: brand (brand names), category, currency (e.g. usd, eur). replies: trigger (trigger ids), source, outcome, reason. invoices: customer (brand or customer names), currency (e.g. usd, eur). city (one city name) only alone on a source-only accounts call, to look that city up in the overview's audience cities.",
"additionalProperties": false
},
"metrics": {
"type": "array",
"items": {
"enum": [
"clicks",
"unique_clicks",
"link_click_share_of_visits",
"views",
"click_rate",
"creator_own_views",
"views_from_link_in_bio",
"earnings",
"direct_earnings",
"affiliate_earnings",
"orders",
"direct_orders",
"affiliate_commissions",
"refunded_orders",
"page_views",
"conversion_rate",
"posts",
"impressions",
"likes",
"comments",
"shares",
"saves",
"engagement",
"views_per_post",
"engagement_per_post",
"engagement_per_view",
"followers",
"follower_change",
"profile_views",
"accounts_reached",
"accounts_engaged",
"signups",
"still_active",
"unsubscribes",
"net_change",
"retention_rate",
"delivered",
"opens",
"bounces",
"spam_reports",
"dropped",
"open_rate",
"click_through_rate",
"bounce_rate",
"spam_rate",
"deliverability",
"deal_revenue",
"paid_deals",
"avg_deal_value",
"events",
"sends",
"skipped",
"failed",
"send_rate",
"unique_commenters",
"invoices_issued",
"invoiced",
"unpaid",
"invoices_paid",
"paid"
],
"type": "string"
},
"description": "links: clicks, unique_clicks (distinct visitor IPs), link_click_share_of_visits (a link’s clicks / every Link in Bio page visit in the group; needs a link filter or link grouping). pages: views (page-view events), click_rate (Link in Bio clicks / visits), creator_own_views and views_from_link_in_bio (Media Kit only, never added to views). products: earnings, direct_earnings, affiliate_earnings (affiliate commission money), orders, direct_orders, affiliate_commissions (how many commissions, not money), refunded_orders, page_views, conversion_rate (direct orders / page views); page_views and conversion_rate group by product or device, and page_views alone also by day, week, month or day_of_week. posts: posts, views, impressions, likes, comments, shares, saves, engagement (likes + comments + shares + saves), views_per_post, engagement_per_post, engagement_per_view (engagement / views). accounts: followers (latest snapshot), follower_change (last minus first snapshot; not by day), profile_views, accounts_reached and accounts_engaged (by day only); followers and follower_change cannot group by day_of_week. subscribers: signups, still_active (of those signups, still subscribed now), unsubscribes (in the window, whenever they signed up), net_change (signups - unsubscribes), retention_rate (still_active / signups); unsubscribes and net_change cannot use referrer_platform. emails: delivered, opens, clicks, bounces, spam_reports, dropped, open_rate (opens / delivered), click_rate (clicks / opens, as the product shows it), click_through_rate (clicks / delivered), bounce_rate, spam_rate, deliverability; subscriber list signups and unsubscribes are a separate source. deals: deal_revenue (money paid on completed deals, USD unless grouped or filtered by currency), paid_deals, avg_deal_value. replies: comments (distinct recorded comment IDs), unique_commenters (distinct commenter IDs on recorded comments), events, sends, skipped, failed, send_rate (sends / (sends + failed)); recorded from 2026-08-04 (sends) and 2026-09-30 (the rest). invoices: invoices_issued, invoiced (amount of sent invoices created in the window), unpaid (of those, still unpaid now), invoices_paid, paid (amount paid in the window); USD unless grouped or filtered by currency. Defaults to clicks, views, earnings, orders, posts, views, engagement, followers, follower_change, signups, still_active, delivered, opens, open_rate, clicks, click_rate, deal_revenue, paid_deals, sends, failed, send_rate, or invoiced, paid."
},
"sources": {
"type": "array",
"items": {
"enum": [
"links",
"pages",
"products",
"posts",
"accounts",
"subscribers",
"emails",
"deals",
"replies",
"invoices"
],
"type": "string"
},
"description": "Several sources instead of source, for a question across areas: each returns its totals for this window and the window of equal length before it (links clicks, pages views per page, products earnings and orders, posts published, accounts followers and follower change, subscribers signups, unsubscribes and net change, emails delivered, opens, open rate and clicks, deals revenue and paid deals, replies sends and failed, invoices paid and invoices_paid in USD). Their socials are posts and accounts together. Takes only start_date and end_date."
},
"end_date": {
"type": "string",
"description": "Last calendar day (YYYY-MM-DD, or today/tomorrow), inclusive. Defaults to today."
},
"group_by": {
"type": "array",
"items": {
"enum": [
"link",
"link_type",
"country",
"device",
"referrer",
"day",
"hour",
"day_of_week",
"page",
"product",
"source",
"week",
"month",
"discount_code",
"platform",
"account",
"post",
"content_type",
"content_format",
"sponsored",
"referrer_platform",
"kind",
"message",
"automation",
"brand",
"category",
"currency",
"trigger",
"outcome",
"reason",
"customer"
],
"type": "string"
},
"description": "Up to 2 dimensions; required for a links breakdown, optional for the others (omit, with metrics, for one totals row). Omit metrics, group_by and filters for the overview of that source. links: link, link_type, country, device, referrer, day, hour, day_of_week. pages: page (link_in_bio or media_kit), country, device, referrer, day, hour, day_of_week; Media Kit views take day and day_of_week only. products: product, source, device, country, day, week, month, day_of_week, hour, discount_code (hour and discount_code count direct orders only: ask for direct_earnings or direct_orders). posts: platform, account, post, content_type, content_format, sponsored, day, week, month, day_of_week, hour (of publish time). accounts: platform, account, day, week, month, day_of_week. subscribers: source (signup form), referrer_platform, day, week, month, day_of_week, hour (local); no country. emails: kind (broadcast, welcome, post_purchase, other), message, automation, day, week, month, day_of_week, hour (UTC event time). deals: brand, category, currency, day, week, month (UTC day the payment was recorded). replies: trigger (automation), source (comment or dm), outcome, reason, day, week, day_of_week, hour (UTC). invoices: customer, currency, day, week, month (UTC creation day for issued, paid date for paid)."
},
"order_by": {
"type": "string",
"description": "A requested metric (sorted high to low) or group_by dimension (sorted ascending). Defaults to the first metric, or the time dimension when grouping only by time."
},
"start_date": {
"type": "string",
"description": "First calendar day (YYYY-MM-DD, or today/tomorrow), UTC for links, pages, posts, accounts, emails, deals, replies and invoices and local for products and subscribers. Defaults to 30 days ago."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [],
"properties": {
"note": {
"type": "string"
},
"source": {
"type": "string"
},
"status": {
"type": "string"
},
"sources": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"end_date": {
"type": "string"
},
"timezone": {
"type": "string"
},
"breakdown": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"guidelines": {
"type": "string"
},
"start_date": {
"type": "string"
},
"vocabulary": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"local_today": {
"type": "string"
},
"short_links": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"additionalProperties": true
},
"annotations": {
"title": "Get analytics",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Get the creator's public Beacons page URL (their beacons.ai link or custom domain) — use when they ask for their page link, Beacons URL, or the link to share or paste. Always the signed-in creator's handle; there is no handle argument. Returns the canonical URL, the handle, and per-page URLs when they have more than one page. For a QR or barcode of that page, call generate_qr_code with no url. A missing handle or a Link in Bio that was never set up come back as DATA with a status, not as an error. page_available says whether the page is live or suspended by Beacons — use it for "my page says Link in Bio not available". Also returns the custom-domain mapping on the account and how to set one up — where the setting lives, the DNS records to add — so use it for "how do I use my own domain" and "my domain is not working".
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"name": "get_public_page_url",
"description": "Get the creator's public Beacons page URL (their beacons.ai link or custom domain) — use when they ask for their page link, Beacons URL, or the link to share or paste. Always the signed-in creator's handle; there is no handle argument. Returns the canonical URL, the handle, and per-page URLs when they have more than one page. For a QR or barcode of that page, call generate_qr_code with no url. A missing handle or a Link in Bio that was never set up come back as DATA with a status, not as an error. page_available says whether the page is live or suspended by Beacons — use it for \"my page says Link in Bio not available\". Also returns the custom-domain mapping on the account and how to set one up — where the setting lives, the DNS records to add — so use it for \"how do I use my own domain\" and \"my domain is not working\".",
"inputSchema": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"handle",
"canonical_url",
"pages"
],
"properties": {
"note": {
"type": "string"
},
"pages": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"detail": {
"type": "string"
},
"handle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"type": "string"
},
"failed_layer": {
"type": "string"
},
"canonical_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"custom_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"page_available": {
"type": "boolean"
},
"uses_custom_domain": {
"type": "boolean"
},
"custom_domain_setup": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"registered_unmapped_domains": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
},
"annotations": {
"title": "Get public page URL",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Change how your Link in Bio looks, across every page: text, link, header, button and card colors with their hover states, body and header fonts, the block theme with its corner radius, opacity, shadow and outline, the link shadow color and block shadow color (visible only where shadows are on: card_shadow turns block shadows on, and link-button shadows follow box_shadow on each Links block, set with update_link_in_bio_blocks), the page background — solid color, gradient, photo, video from their Media or a video link, or image tint, with the desktop surround — including taking a video or AI vibes background off the page, which a background color write replaces, and the page frame of navigation position, favicon, the Beacons footer logo, and the share, subscribe, add-to-contacts and sticky referral-footer toggles. Hiding the Beacons footer logo (page_settings.show_logo: false) needs Creator Plus or higher. Read get_link_in_bio first, then pass appearance, background, page_settings, or combine them in one atomic edit. Omitted fields stay unchanged; only documented nulls clear or inherit. Changes apply immediately, so keep foreground and background colors readable together. Does not edit blocks, visitor pop-ups or site marketing settings. After an uncertain write, read before retrying.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › text_color
Body text color: #RGB or #RRGGBB. There is no separate button or card text color — this one paints block labels, card text and the text typed into form inputs as well, and form placeholders draw it at 42% opacity.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › text_hover_color
Label color on the inverted CTAs — email subscribe and submit, booking, request forms, community blocks, store buttons and popups — which paint it at rest on button_hover_background_color: #RGB or #RRGGBB. It doubles as the label color a link button takes while the visitor hovers it.
Clear enough to supply this argument.
appearance › link_text_color
Link label color, or null to inherit the body text color. When set it overrides text_color on link labels, and links sit on card and button fills, so contrast it against card_background_color and button_background_color in its own right.
Clear enough to supply this argument.
appearance › header_text_color
Header text color, or null to let each header block fall back to its own color. When set it overrides both, and headers sit directly on the page background, so contrast it against background_color1/background_color2 rather than against the cards.
Clear enough to supply this argument.
appearance › button_background_color
Button fill color: #RGB or #RRGGBB. Button labels draw in text_color, so pick a fill that contrasts with it.
Clear enough to supply this argument.
appearance › button_hover_background_color
Fill of the inverted CTAs at rest, under a text_hover_color label: #RGB or #RRGGBB. It doubles as the fill a link button takes while the visitor hovers it.
Clear enough to supply this argument.
appearance › card_background_color
Card/block fill color: #RGB or #RRGGBB. Card text and form inputs draw in text_color, and placeholders at 42% of it, so keep the two far apart.
Clear enough to supply this argument.
appearance › font_family
Body font as a CSS font-family stack, e.g. "Poppins, sans-serif" or "Merriweather, serif".
Clear enough to supply this argument.
appearance › header_font_family
Header font as a CSS font-family stack, or null so headers inherit the body font.
Clear enough to supply this argument.
appearance › theme
Block corner shape. custom_border_radius only renders when this is custom.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › custom_border_radius
Block corner radius in px, 0-25. Only renders when theme is custom.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
appearance › opacity
Block transparency as a two-digit hex alpha suffix — "00" is fully transparent, "FF" fully opaque, "" also means fully opaque.
Clear enough to supply this argument.
appearance › card_shadow
Whether blocks cast a drop shadow. Link buttons ignore it: each Links block turns its own shadow on with box_shadow through update_link_in_bio_blocks.
Clear enough to supply this argument.
appearance › card_shadow_color
Block shadow color (Block ▸ Shadow in the editor): #RGB or #RRGGBB, or null to go back to a shadow derived from card_background_color. It only shows while card_shadow is true, so turn that on too when the creator wants to see it.
Clear enough to supply this argument.
appearance › button_shadow_color
Link button shadow color (Link block ▸ Shadow in the editor): #RGB or #RRGGBB, or null to go back to a shadow derived from button_background_color. It only shows on Links blocks whose box_shadow is on — card_shadow does not affect link buttons — so turn box_shadow on with update_link_in_bio_blocks when the creator wants to see it.
Clear enough to supply this argument.
appearance › card_outline
Whether blocks draw an outline border.
Clear enough to supply this argument.
background › background_color1
Primary background color: #RGB or #RRGGBB. The creator name, headers and every block label outside a card sit directly on it, so it has to contrast with the text colors this tool does not own. Writing it over a photo, video or AI vibes background replaces that background with the color, which is how a video or vibes background is taken off the page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
background › background_color2
Secondary background color: #RGB or #RRGGBB. Optional, but gradient types (gradientDown, gradientUp, linear, radial, diagonal) render a color pair — pass it whenever background_type is a gradient. Text crosses the whole gradient, so both ends need to contrast with it, not just this one.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
background › background_type
Background rendering type. Optional — omit to keep the current type when it already renders a color, else defaults to solid.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
background › filter
Tint laid over a background image: dark, light, or none. Only renders over an image background.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
background › colored_desktop_background
Whether desktop visitors see a solid color around the page instead of the page background.
Clear enough to supply this argument.
background › desktop_background_color
Color shown around the page on desktop: #RGB or #RRGGBB. Only renders when colored_desktop_background is true.
Clear enough to supply this argument.
background › background_image_url
Absolute https link to a photo to use as the page background — the creator can hand over any public image link and it is re-hosted on Beacons, so a link that later expires cannot blank their page. Sets the background type to image and applies to phone and desktop alike. PNG, JPEG, GIF or WebP, up to 5MB. To go back to a color instead, pass background_color1 and leave this out.
Clear enough to supply this argument.
background › background_video_media_id
media_id of a video in the creator's Media to play as the page background — a video they attached in chat is already there. MP4 only, up to 25MB. Sets the background type to video. Pass only one of background_image_url, background_video_media_id or background_video_url. To go back to a color instead, pass background_color1 and leave this out.
Clear enough to supply this argument.
background › background_video_url
Absolute https link to a video file to play as the page background — it is saved to the creator's Media on Beacons, so a link that later expires cannot blank their page. MP4 only, up to 25MB; a web page that plays a video is not a video file. Sets the background type to video. Pass only one of background_image_url, background_video_media_id or background_video_url.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page_settings › navigation
Where the navigation bar sits when the creator has more than one page.
Clear enough to supply this argument.
page_settings › favicon
Link to the image to use as the browser tab icon, or null to clear it. Any public https image link works. A square PNG, JPEG, GIF or WebP under 5MB is re-hosted on Beacons and the stored value is that copy; anything else, an .ico included, is stored as the link you gave.
Clear enough to supply this argument.
page_settings › show_logo
Whether the Beacons logo shows in the page footer. Turning it off needs Creator Plus or higher (the Creator plan does not include it); turning it back on is free on every plan.
Clear enough to supply this argument.
page_settings › show_share_button
Whether the share button shows on the page.
Clear enough to supply this argument.
page_settings › show_subscribe_button
Whether the subscribe button shows on the page.
Clear enough to supply this argument.
page_settings › show_add_to_contacts_button
Whether the add-to-contacts button shows on the page.
Clear enough to supply this argument.
page_settings › show_sticky_referral_footer
Whether the sticky Beacons referral footer shows, which earns the creator referral credit.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Set Link in Bio appearance",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
Output schema35/100
Describe the returned fields so an agent can interpret the result.
{
"name": "set_link_in_bio_appearance",
"description": "Change how your Link in Bio looks, across every page: text, link, header, button and card colors with their hover states, body and header fonts, the block theme with its corner radius, opacity, shadow and outline, the link shadow color and block shadow color (visible only where shadows are on: card_shadow turns block shadows on, and link-button shadows follow box_shadow on each Links block, set with update_link_in_bio_blocks), the page background — solid color, gradient, photo, video from their Media or a video link, or image tint, with the desktop surround — including taking a video or AI vibes background off the page, which a background color write replaces, and the page frame of navigation position, favicon, the Beacons footer logo, and the share, subscribe, add-to-contacts and sticky referral-footer toggles. Hiding the Beacons footer logo (page_settings.show_logo: false) needs Creator Plus or higher. Read get_link_in_bio first, then pass appearance, background, page_settings, or combine them in one atomic edit. Omitted fields stay unchanged; only documented nulls clear or inherit. Changes apply immediately, so keep foreground and background colors readable together. Does not edit blocks, visitor pop-ups or site marketing settings. After an uncertain write, read before retrying.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"appearance": {
"type": "object",
"required": [],
"properties": {
"theme": {
"enum": [
"square",
"round",
"fullWidth",
"custom"
],
"type": "string",
"description": "Block corner shape. custom_border_radius only renders when this is custom."
},
"opacity": {
"type": "string",
"description": "Block transparency as a two-digit hex alpha suffix — \"00\" is fully transparent, \"FF\" fully opaque, \"\" also means fully opaque."
},
"text_color": {
"type": "string",
"description": "Body text color: #RGB or #RRGGBB. There is no separate button or card text color — this one paints block labels, card text and the text typed into form inputs as well, and form placeholders draw it at 42% opacity."
},
"card_shadow": {
"type": "boolean",
"description": "Whether blocks cast a drop shadow. Link buttons ignore it: each Links block turns its own shadow on with box_shadow through update_link_in_bio_blocks."
},
"font_family": {
"type": "string",
"description": "Body font as a CSS font-family stack, e.g. \"Poppins, sans-serif\" or \"Merriweather, serif\"."
},
"card_outline": {
"type": "boolean",
"description": "Whether blocks draw an outline border."
},
"link_text_color": {
"type": [
"string",
"null"
],
"description": "Link label color, or null to inherit the body text color. When set it overrides text_color on link labels, and links sit on card and button fills, so contrast it against card_background_color and button_background_color in its own right."
},
"text_hover_color": {
"type": "string",
"description": "Label color on the inverted CTAs — email subscribe and submit, booking, request forms, community blocks, store buttons and popups — which paint it at rest on button_hover_background_color: #RGB or #RRGGBB. It doubles as the label color a link button takes while the visitor hovers it."
},
"card_shadow_color": {
"type": [
"string",
"null"
],
"description": "Block shadow color (Block ▸ Shadow in the editor): #RGB or #RRGGBB, or null to go back to a shadow derived from card_background_color. It only shows while card_shadow is true, so turn that on too when the creator wants to see it."
},
"header_text_color": {
"type": [
"string",
"null"
],
"description": "Header text color, or null to let each header block fall back to its own color. When set it overrides both, and headers sit directly on the page background, so contrast it against background_color1/background_color2 rather than against the cards."
},
"header_font_family": {
"type": [
"string",
"null"
],
"description": "Header font as a CSS font-family stack, or null so headers inherit the body font."
},
"button_shadow_color": {
"type": [
"string",
"null"
],
"description": "Link button shadow color (Link block ▸ Shadow in the editor): #RGB or #RRGGBB, or null to go back to a shadow derived from button_background_color. It only shows on Links blocks whose box_shadow is on — card_shadow does not affect link buttons — so turn box_shadow on with update_link_in_bio_blocks when the creator wants to see it."
},
"custom_border_radius": {
"type": "number",
"description": "Block corner radius in px, 0-25. Only renders when theme is custom."
},
"card_background_color": {
"type": "string",
"description": "Card/block fill color: #RGB or #RRGGBB. Card text and form inputs draw in text_color, and placeholders at 42% of it, so keep the two far apart."
},
"button_background_color": {
"type": "string",
"description": "Button fill color: #RGB or #RRGGBB. Button labels draw in text_color, so pick a fill that contrasts with it."
},
"button_hover_background_color": {
"type": "string",
"description": "Fill of the inverted CTAs at rest, under a text_hover_color label: #RGB or #RRGGBB. It doubles as the fill a link button takes while the visitor hovers it."
}
},
"description": "Text, link, header, button and card colors; fonts; block corners, transparency, shadow and outline; link shadow color (button_shadow_color) and block shadow color (card_shadow_color), which show only where shadows are on — card_shadow for blocks, box_shadow on each Links block via update_link_in_bio_blocks for link buttons. Omit fields to preserve them; documented nulls restore inheritance. Does not change content or page order. Change paired foreground/background colors together so labels stay readable.",
"minProperties": 1,
"additionalProperties": false
},
"background": {
"type": "object",
"required": [],
"properties": {
"filter": {
"enum": [
"dark",
"light",
"none",
null
],
"type": [
"string",
"null"
],
"description": "Tint laid over a background image: dark, light, or none. Only renders over an image background."
},
"background_type": {
"enum": [
"solid",
"gradientDown",
"gradientUp",
"linear",
"radial",
"diagonal"
],
"type": "string",
"description": "Background rendering type. Optional — omit to keep the current type when it already renders a color, else defaults to solid."
},
"background_color1": {
"type": "string",
"description": "Primary background color: #RGB or #RRGGBB. The creator name, headers and every block label outside a card sit directly on it, so it has to contrast with the text colors this tool does not own. Writing it over a photo, video or AI vibes background replaces that background with the color, which is how a video or vibes background is taken off the page."
},
"background_color2": {
"type": "string",
"description": "Secondary background color: #RGB or #RRGGBB. Optional, but gradient types (gradientDown, gradientUp, linear, radial, diagonal) render a color pair — pass it whenever background_type is a gradient. Text crosses the whole gradient, so both ends need to contrast with it, not just this one."
},
"background_image_url": {
"type": "string",
"description": "Absolute https link to a photo to use as the page background — the creator can hand over any public image link and it is re-hosted on Beacons, so a link that later expires cannot blank their page. Sets the background type to image and applies to phone and desktop alike. PNG, JPEG, GIF or WebP, up to 5MB. To go back to a color instead, pass background_color1 and leave this out."
},
"background_video_url": {
"type": "string",
"description": "Absolute https link to a video file to play as the page background — it is saved to the creator's Media on Beacons, so a link that later expires cannot blank their page. MP4 only, up to 25MB; a web page that plays a video is not a video file. Sets the background type to video. Pass only one of background_image_url, background_video_media_id or background_video_url."
},
"desktop_background_color": {
"type": "string",
"description": "Color shown around the page on desktop: #RGB or #RRGGBB. Only renders when colored_desktop_background is true."
},
"background_video_media_id": {
"type": "string",
"description": "media_id of a video in the creator's Media to play as the page background — a video they attached in chat is already there. MP4 only, up to 25MB. Sets the background type to video. Pass only one of background_image_url, background_video_media_id or background_video_url. To go back to a color instead, pass background_color1 and leave this out."
},
"colored_desktop_background": {
"type": "boolean",
"description": "Whether desktop visitors see a solid color around the page instead of the page background."
}
},
"description": "Background colors, gradient, photo, video, image tint and desktop surround. A photo is re-hosted on Beacons; a video is one already in their Media, such as a video attached in chat, named by media_id, or a public video link saved to their Media. Changing the primary color preserves an existing color-rendering type, otherwise switches to solid; second-color-only edits do not replace a photo or video.",
"minProperties": 1,
"additionalProperties": false
},
"page_settings": {
"type": "object",
"required": [],
"properties": {
"favicon": {
"type": [
"string",
"null"
],
"description": "Link to the image to use as the browser tab icon, or null to clear it. Any public https image link works. A square PNG, JPEG, GIF or WebP under 5MB is re-hosted on Beacons and the stored value is that copy; anything else, an .ico included, is stored as the link you gave."
},
"show_logo": {
"type": "boolean",
"description": "Whether the Beacons logo shows in the page footer. Turning it off needs Creator Plus or higher (the Creator plan does not include it); turning it back on is free on every plan."
},
"navigation": {
"enum": [
"webpage",
"toptabs",
"middletabs",
"bottomtabs",
"hamburger"
],
"type": "string",
"description": "Where the navigation bar sits when the creator has more than one page."
},
"show_share_button": {
"type": "boolean",
"description": "Whether the share button shows on the page."
},
"show_subscribe_button": {
"type": "boolean",
"description": "Whether the subscribe button shows on the page."
},
"show_add_to_contacts_button": {
"type": "boolean",
"description": "Whether the add-to-contacts button shows on the page."
},
"show_sticky_referral_footer": {
"type": "boolean",
"description": "Whether the sticky Beacons referral footer shows, which earns the creator referral credit."
}
},
"description": "Navigation location, favicon, the Beacons footer logo, and share, subscribe, add-to-contacts and referral-footer toggles across every page. Omit fields to preserve them; null clears the favicon. Hiding the Beacons logo needs Creator Plus or higher. Does not edit page titles, visibility, SEO or visitor pop-ups.",
"minProperties": 1,
"additionalProperties": false
}
},
"minProperties": 1,
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status"
],
"properties": {
"note": {
"type": "string"
},
"path": {
"type": "string"
},
"detail": {
"type": "string"
},
"status": {
"type": "string"
},
"changed": {
"anyOf": [
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
},
"warnings": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"background": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"previous_type": {
"type": "string"
}
},
"additionalProperties": true
},
"annotations": {
"title": "Set Link in Bio appearance",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Change or update your Link in Bio site settings, the ones under Disclaimers, SEO and Tracking Pixels in Settings. Disclaimers: turn the sensitive content warning on or off — an 18+, 21+ or 25+ age warning that asks visitors to confirm their age first, or one with no age (the age gate) — and turn the cookie notice banner on or off. SEO: the site title and site description that search results show (the meta title and description). Also the tracking pixel IDs for Meta, Google Analytics (GA4), TikTok and Pinterest, the default UTM source and medium, and the mature-content flag — or the visitor pop-up that promotes a Shop product or collects email sign-ups. Read get_link_in_bio first and pass exactly one of settings or popup. Both propose first: chat requires approval in a later user message; MCP repeats the unchanged arguments with the returned top-level confirmation_token within 10 minutes. Omitted fields stay unchanged; documented empty strings clear text. Does not change page appearance, blocks, navigation or visibility.
The description explains the capability, when to use it, and what to expect.
Inputs76/100
19 of 21 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
settings › meta_title
Search-result and browser-tab title for the page, up to 100 characters (aim for 60 — search engines truncate past that). Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
settings › meta_description
Search-result description for the page, up to 300 characters (aim for 155 — search engines truncate past that). Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
settings › facebook_pixel
Meta (Facebook) Pixel ID, numeric. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
settings › google_analytics
Universal Analytics tracking ID (UA-1234567-1). Deprecated by Google — prefer google_analytics_4. Empty string clears it.
Clear enough to supply this argument.
settings › google_analytics_4
GA4 Measurement ID (G-XXXXXXXXXX). Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
settings › tiktok_pixel
TikTok Pixel ID. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
settings › pinterest_pixel
Pinterest Tag ID, numeric. Empty string clears it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
settings › utm_source
Default utm_source appended to outbound links from the page. Empty string clears it.
Clear enough to supply this argument.
settings › utm_medium
Default utm_medium appended to outbound links from the page. Empty string clears it.
Clear enough to supply this argument.
settings › age_gate
Sensitive-content warning shown before the page loads. "off" removes it, "on" warns without naming an age, and 18 / 21 / 25 ask the visitor to confirm that age or older.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
settings › cookie_notice
Whether the GDPR-style cookie notice shows on the page.
Clear enough to supply this argument.
settings › mature_content
Whether Beacons treats the account as mature content. This also synchronizes the backend safety flag.
Clear enough to supply this argument.
popup › type
Which pop-up the page shows: "product" promotes one Shop product, "email" collects sign-ups, "none" turns the pop-up off and clears whatever was configured before.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
popup › product_id
For type "product": the Shop product to promote, by id from list_store_products. Required for that type and refused for every other one.
Clear enough to supply this argument.
popup › preheading
Small line above the main copy, up to 100 characters. Omit to keep the current line.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
popup › heading
Headline of an email-capture pop-up, up to 100 characters. Only type "email" has a headline; a product promo shows the product instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
popup › subheading
Body line under the heading, up to 300 characters. Omit to keep the current line.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
popup › button_text
Label on the pop-up's button, up to 100 characters. Omit to keep the current label.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmation_token
MCP token from a needs_confirmation result. After user approval, repeat the unchanged operation with this top-level token within 10 minutes. Chat uses approval in a later user message without a token.
Clear enough to supply this argument.
oneOf › 0 › settings
Not provided
Missing description. Explain what this value means and how to supply it.
oneOf › 1 › popup
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations100/100
All four behavior hints are declared.
{
"title": "Set Link in Bio site settings",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
Output schema38/100
Describe the returned fields so an agent can interpret the result.
{
"name": "set_link_in_bio_settings",
"description": "Change or update your Link in Bio site settings, the ones under Disclaimers, SEO and Tracking Pixels in Settings. Disclaimers: turn the sensitive content warning on or off — an 18+, 21+ or 25+ age warning that asks visitors to confirm their age first, or one with no age (the age gate) — and turn the cookie notice banner on or off. SEO: the site title and site description that search results show (the meta title and description). Also the tracking pixel IDs for Meta, Google Analytics (GA4), TikTok and Pinterest, the default UTM source and medium, and the mature-content flag — or the visitor pop-up that promotes a Shop product or collects email sign-ups. Read get_link_in_bio first and pass exactly one of settings or popup. Both propose first: chat requires approval in a later user message; MCP repeats the unchanged arguments with the returned top-level confirmation_token within 10 minutes. Omitted fields stay unchanged; documented empty strings clear text. Does not change page appearance, blocks, navigation or visibility.",
"inputSchema": {
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"settings"
],
"properties": {
"settings": {}
}
},
{
"type": "object",
"required": [
"popup"
],
"properties": {
"popup": {}
}
}
],
"required": [],
"properties": {
"popup": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"none",
"product",
"email"
],
"type": "string",
"description": "Which pop-up the page shows: \"product\" promotes one Shop product, \"email\" collects sign-ups, \"none\" turns the pop-up off and clears whatever was configured before."
},
"heading": {
"type": [
"string",
"null"
],
"description": "Headline of an email-capture pop-up, up to 100 characters. Only type \"email\" has a headline; a product promo shows the product instead."
},
"preheading": {
"type": [
"string",
"null"
],
"description": "Small line above the main copy, up to 100 characters. Omit to keep the current line."
},
"product_id": {
"type": [
"string",
"null"
],
"description": "For type \"product\": the Shop product to promote, by id from list_store_products. Required for that type and refused for every other one."
},
"subheading": {
"type": [
"string",
"null"
],
"description": "Body line under the heading, up to 300 characters. Omit to keep the current line."
},
"button_text": {
"type": [
"string",
"null"
],
"description": "Label on the pop-up's button, up to 100 characters. Omit to keep the current label."
}
},
"description": "Visitor pop-up: product promotes an owned Shop product; email collects sign-ups; none removes the entire previous pop-up. Omitted or null copy preserves existing text or uses editor defaults when switching type. Does not edit the product or an email-signup page block.",
"additionalProperties": false
},
"settings": {
"type": "object",
"required": [],
"properties": {
"age_gate": {
"enum": [
"off",
"on",
"18",
"21",
"25"
],
"type": "string",
"description": "Sensitive-content warning shown before the page loads. \"off\" removes it, \"on\" warns without naming an age, and 18 / 21 / 25 ask the visitor to confirm that age or older."
},
"meta_title": {
"type": "string",
"description": "Search-result and browser-tab title for the page, up to 100 characters (aim for 60 — search engines truncate past that). Empty string clears it."
},
"utm_medium": {
"type": "string",
"description": "Default utm_medium appended to outbound links from the page. Empty string clears it."
},
"utm_source": {
"type": "string",
"description": "Default utm_source appended to outbound links from the page. Empty string clears it."
},
"tiktok_pixel": {
"type": "string",
"description": "TikTok Pixel ID. Empty string clears it."
},
"cookie_notice": {
"type": "boolean",
"description": "Whether the GDPR-style cookie notice shows on the page."
},
"facebook_pixel": {
"type": "string",
"description": "Meta (Facebook) Pixel ID, numeric. Empty string clears it."
},
"mature_content": {
"type": "boolean",
"description": "Whether Beacons treats the account as mature content. This also synchronizes the backend safety flag."
},
"pinterest_pixel": {
"type": "string",
"description": "Pinterest Tag ID, numeric. Empty string clears it."
},
"google_analytics": {
"type": "string",
"description": "Universal Analytics tracking ID (UA-1234567-1). Deprecated by Google — prefer google_analytics_4. Empty string clears it."
},
"meta_description": {
"type": "string",
"description": "Search-result description for the page, up to 300 characters (aim for 155 — search engines truncate past that). Empty string clears it."
},
"google_analytics_4": {
"type": "string",
"description": "GA4 Measurement ID (G-XXXXXXXXXX). Empty string clears it."
}
},
"description": "Search-engine title/description, tracking pixel IDs, default UTM source/medium, age gate, cookie notice and mature-content flag. Omit fields to preserve them; empty strings clear text. SEO requires a paying plan. Pixel values are IDs, never installation snippets. Does not change appearance or the visitor pop-up.",
"minProperties": 1,
"additionalProperties": false
},
"confirmation_token": {
"type": "string",
"description": "MCP token from a needs_confirmation result. After user approval, repeat the unchanged operation with this top-level token within 10 minutes. Chat uses approval in a later user message without a token."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status"
],
"properties": {
"note": {
"type": "string"
},
"path": {
"type": "string"
},
"detail": {
"type": "string"
},
"status": {
"type": "string"
},
"changed": {
"anyOf": [
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
},
"product_id": {
"type": "string"
},
"sync_failures": {
"type": "array",
"items": {
"type": "string"
}
},
"confirmation_token": {
"type": "string"
}
},
"additionalProperties": true
},
"annotations": {
"title": "Set Link in Bio site settings",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Create a DRAFT Beacons invoice for this creator (the same payment_links row the Invoicing wizard saves). It never emails the payer and never sets time_submitted — sending is a separate step the creator confirms, so do not tell them it went out. Optional brand_deal_id prefills amount/currency/brand/title/message and deal-thread recipient emails. Pass amount_face_value as the face value the creator said (1500 for $1,500); conversion to minor units happens here. If the deal has more than one thread email and recipient_email is omitted, returns DATA with the candidates and writes nothing. Does not invent a recipient, does not add line items (the product has title + message + content_urls only), and does not write brand_deal_id onto the invoice row — it is returned so the send step can record the ledger link.
Describe the returned information so the agent knows whether it will answer the request.
Inputs95/100
Explain what happens when this optional value is omitted.
brand_deal_id
Optional deal id (base or creator entity) to prefill amount, currency, brand, deliverables, and recipient candidates.
Clear enough to supply this argument.
amount_face_value
Invoice total as face value (1500 for $1,500). Required unless brand_deal_id has a deal_amount.
Clear enough to supply this argument.
currency
ISO 4217 code (e.g. usd). Defaults to the deal currency or usd.
Clear enough to supply this argument.
recipient_email
Payer email. Required when the deal has zero or multiple thread emails. An explicit address is used as-is after a shape check.
Clear enough to supply this argument.
recipient_name
Payer name. Defaults to brand_name when omitted.
Clear enough to supply this argument.
brand_name
Brand shown on the invoice. Defaults to the deal brand name.
Clear enough to supply this argument.
title
Invoice title. Defaults from brand + deal deliverable counts.
Clear enough to supply this argument.
message
Memo / notes. Defaults from deal deliverable counts. Not a line-item table.
Clear enough to supply this argument.
due_date
Due date as YYYY-MM-DD. Optional.
Explain what happens when this optional value is omitted.
{
"name": "create_invoice",
"description": "Create a DRAFT Beacons invoice for this creator (the same payment_links row the Invoicing wizard saves). It never emails the payer and never sets time_submitted — sending is a separate step the creator confirms, so do not tell them it went out. Optional brand_deal_id prefills amount/currency/brand/title/message and deal-thread recipient emails. Pass amount_face_value as the face value the creator said (1500 for $1,500); conversion to minor units happens here. If the deal has more than one thread email and recipient_email is omitted, returns DATA with the candidates and writes nothing. Does not invent a recipient, does not add line items (the product has title + message + content_urls only), and does not write brand_deal_id onto the invoice row — it is returned so the send step can record the ledger link.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"title": {
"type": "string",
"description": "Invoice title. Defaults from brand + deal deliverable counts."
},
"message": {
"type": "string",
"description": "Memo / notes. Defaults from deal deliverable counts. Not a line-item table."
},
"currency": {
"type": "string",
"description": "ISO 4217 code (e.g. usd). Defaults to the deal currency or usd."
},
"due_date": {
"type": "string",
"description": "Due date as YYYY-MM-DD. Optional."
},
"brand_name": {
"type": "string",
"description": "Brand shown on the invoice. Defaults to the deal brand name."
},
"brand_deal_id": {
"type": "string",
"description": "Optional deal id (base or creator entity) to prefill amount, currency, brand, deliverables, and recipient candidates."
},
"recipient_name": {
"type": "string",
"description": "Payer name. Defaults to brand_name when omitted."
},
"recipient_email": {
"type": "string",
"description": "Payer email. Required when the deal has zero or multiple thread emails. An explicit address is used as-is after a shape check."
},
"amount_face_value": {
"type": "number",
"description": "Invoice total as face value (1500 for $1,500). Required unless brand_deal_id has a deal_amount."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"created",
"status"
],
"properties": {
"note": {
"type": "string"
},
"sent": {
"type": "boolean"
},
"status": {
"type": "string"
},
"created": {
"type": "boolean"
},
"candidates": {
"type": "array",
"items": {
"type": "string"
}
},
"brand_deal_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
},
"annotations": {
"title": "Create invoice draft",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List this creator's Beacons invoices (the same payment_links the Invoicing page uses). Filter by derived status (draft = not submitted, outstanding = submitted unpaid, paid = time_paid set, overdue = outstanding past due_date), optional brand_deal_id (resolved from ledger invoice_sent events or a unique amount+recipient match on that deal), and created_after/created_before on time_created. Returns status, amount as a minor-units + display pair, recipient, dates (created/submitted/last_emailed/due/paid/last_viewed — last_viewed is a timestamp, not a status), and brand_deal_id when resolvable. Does NOT read Stripe or PayPal balances, does not send, and does not invent a viewed status. For totals across every invoice call get_analytics with source invoices.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Derived invoice status. Omit to return every status.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brand_deal_id
Optional deal id (base or creator entity). Restricts to invoices linked via an invoice_sent ledger event or a unique amount+recipient match on that deal.
Clear enough to supply this argument.
created_after
Inclusive lower bound on time_created (YYYY-MM-DD or ISO timestamp).
Clear enough to supply this argument.
created_before
Inclusive upper bound on time_created (YYYY-MM-DD or ISO timestamp).
Clear enough to supply this argument.
limit
How many invoices to return (default 50, max 100).
{
"name": "list_invoices",
"description": "List this creator's Beacons invoices (the same payment_links the Invoicing page uses). Filter by derived status (draft = not submitted, outstanding = submitted unpaid, paid = time_paid set, overdue = outstanding past due_date), optional brand_deal_id (resolved from ledger invoice_sent events or a unique amount+recipient match on that deal), and created_after/created_before on time_created. Returns status, amount as a minor-units + display pair, recipient, dates (created/submitted/last_emailed/due/paid/last_viewed — last_viewed is a timestamp, not a status), and brand_deal_id when resolvable. Does NOT read Stripe or PayPal balances, does not send, and does not invent a viewed status. For totals across every invoice call get_analytics with source invoices.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "How many invoices to return (default 50, max 100)."
},
"status": {
"enum": [
"draft",
"outstanding",
"paid",
"overdue"
],
"type": "string",
"description": "Derived invoice status. Omit to return every status."
},
"brand_deal_id": {
"type": "string",
"description": "Optional deal id (base or creator entity). Restricts to invoices linked via an invoice_sent ledger event or a unique amount+recipient match on that deal."
},
"created_after": {
"type": "string",
"description": "Inclusive lower bound on time_created (YYYY-MM-DD or ISO timestamp)."
},
"created_before": {
"type": "string",
"description": "Inclusive upper bound on time_created (YYYY-MM-DD or ISO timestamp)."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"invoices",
"invoice_count",
"as_of_date",
"truncated",
"deal_links_unavailable"
],
"properties": {
"invoices": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"truncated": {
"type": "boolean"
},
"as_of_date": {
"type": "string"
},
"invoice_count": {
"type": "integer"
},
"deal_links_unavailable": {
"type": "boolean"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List invoices",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Detailed view of one welcome or post-purchase Email Marketing automation, such as their welcome email or welcome letter: sequence settings and each email's subject, preview line, body, recipient, open, click, bounce, spam, and drop counts and rates. Call list_email_marketing_automations first and pass its sequence_id. It also returns each email's preview line and body block by block, with each text block written in the syntax the body parameter of update_email_marketing_automation takes, so where that tool is available read an email here before adding to or changing it. It returns totals for each email, never who received it.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
sequence_id
Automation UUID from list_email_marketing_automations.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List this creator's Beacons Email Marketing welcome and post-purchase sequences, the funnels that send emails automatically, across active, paused, draft, and archived states. Use it to audit sequence settings and each email's recipient, open, and click performance; this is not list_automations, which reads Beam Settings automation toggles, and it does not list one-off broadcasts. Call it first when they ask whether their automated emails are working, turned on, or sending, which emails are not active, or whether new subscribers got the second email, and when they mention their welcome email or welcome letter; then pass its sequence_id to get_email_marketing_automation for that one sequence. Optional status accepts active or paused; active maps to the stored running status. Returns the newest 25 sequences by default, up to 100; a start-condition id of global means any list or product. The product stores status-change time, not the last time a recipient triggered a sequence.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Optional sequence status filter. active selects the stored running status; paused selects paused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "list_email_marketing_automations",
"description": "List this creator's Beacons Email Marketing welcome and post-purchase sequences, the funnels that send emails automatically, across active, paused, draft, and archived states. Use it to audit sequence settings and each email's recipient, open, and click performance; this is not list_automations, which reads Beam Settings automation toggles, and it does not list one-off broadcasts. Call it first when they ask whether their automated emails are working, turned on, or sending, which emails are not active, or whether new subscribers got the second email, and when they mention their welcome email or welcome letter; then pass its sequence_id to get_email_marketing_automation for that one sequence. Optional status accepts active or paused; active maps to the stored running status. Returns the newest 25 sequences by default, up to 100; a start-condition id of global means any list or product. The product stores status-change time, not the last time a recipient triggered a sequence.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "Automations to return (default 25, max 100)."
},
"status": {
"enum": [
"active",
"paused"
],
"type": "string",
"description": "Optional sequence status filter. active selects the stored running status; paused selects paused."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"automations",
"count",
"truncated",
"status_filter",
"note"
],
"properties": {
"note": {
"type": "string"
},
"count": {
"type": "number"
},
"status": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"automations": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"status_filter": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"annotations": {
"title": "List email marketing automations",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
List this creator's Beacons email broadcasts, the newsletters and one-off emails they send to subscribers, across sent, scheduled, draft, archived, processing, paused, and max-retries states. Call it first when they name a broadcast or newsletter by its title or date, mean a draft waiting for them to finish, or ask for their most recent one, and when they ask whether their email went out, why it is not sending, or why they did not get a test email or their customers did not get it; then pass its message_id to get_email_marketing_broadcast. Returns each broadcast's actual recipient-visible subject, status, dates, recipients, delivery, open, and click performance. Use get_analytics with source emails for account performance totals; do not call both for the same question. Optional status and query filters match the Broadcasts page. query searches titles only, never the subject or what the email says, so when they name a broadcast by its subject or copy, list without query and match their words against each title and subject yourself. Returns the newest 25 by default, up to 100, and never returns subscriber rows or email addresses.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Optional exact broadcast status.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Optional case-insensitive search of titles only, up to 100 characters. It does not search subjects or email copy.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Broadcasts to return (default 25, max 100).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "list_email_marketing_broadcasts",
"description": "List this creator's Beacons email broadcasts, the newsletters and one-off emails they send to subscribers, across sent, scheduled, draft, archived, processing, paused, and max-retries states. Call it first when they name a broadcast or newsletter by its title or date, mean a draft waiting for them to finish, or ask for their most recent one, and when they ask whether their email went out, why it is not sending, or why they did not get a test email or their customers did not get it; then pass its message_id to get_email_marketing_broadcast. Returns each broadcast's actual recipient-visible subject, status, dates, recipients, delivery, open, and click performance. Use get_analytics with source emails for account performance totals; do not call both for the same question. Optional status and query filters match the Broadcasts page. query searches titles only, never the subject or what the email says, so when they name a broadcast by its subject or copy, list without query and match their words against each title and subject yourself. Returns the newest 25 by default, up to 100, and never returns subscriber rows or email addresses.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "Broadcasts to return (default 25, max 100)."
},
"query": {
"type": "string",
"description": "Optional case-insensitive search of titles only, up to 100 characters. It does not search subjects or email copy."
},
"status": {
"enum": [
"draft",
"scheduled",
"processing",
"sent",
"paused",
"archived",
"max_retries"
],
"type": "string",
"description": "Optional exact broadcast status."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"broadcasts",
"count",
"truncated",
"subjects_unavailable",
"subjects_missing_count",
"status_filter",
"query",
"note"
],
"properties": {
"note": {
"type": "string"
},
"count": {
"type": "number"
},
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"broadcasts": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"status_filter": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"subjects_unavailable": {
"type": "boolean"
},
"subjects_missing_count": {
"type": "number"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List email marketing broadcasts",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
List this creator's Email Marketing audience groups and member counts: how many subscribers they have, or how many emails they have collected. Returns built-in dynamic groups, pending opt-ins, unsubscribed members, store-linked groups, and creator-named groups. Counts only: subscriber names, email addresses, phone numbers, and group membership rows are never returned. Use get_analytics with source subscribers for signup trends over time.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Suggest what the creator should send their email list: their Email Marketing readymades, newsletter and broadcast ideas Beacons already drafted from their own links, products, posts and tour dates, newest first. Call this first whenever they ask what to email or send their subscribers or audience, what to write about, or for email ideas, before suggesting or drafting anything yourself. Returns each readymade's id, title, description, kind (link promotion, social digest, tour promotion, product promotion), subject line and what it was built from — never the email body. Use list_email_marketing_templates for the generic starting layouts instead.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
past_n_days
Only readymades created in the last 7, 10, 30, 90 days (default 10, the window the Readymades page shows).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Readymades to return (default 10, max 25).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "list_email_marketing_readymades",
"description": "Suggest what the creator should send their email list: their Email Marketing readymades, newsletter and broadcast ideas Beacons already drafted from their own links, products, posts and tour dates, newest first. Call this first whenever they ask what to email or send their subscribers or audience, what to write about, or for email ideas, before suggesting or drafting anything yourself. Returns each readymade's id, title, description, kind (link promotion, social digest, tour promotion, product promotion), subject line and what it was built from — never the email body. Use list_email_marketing_templates for the generic starting layouts instead.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "Readymades to return (default 10, max 25)."
},
"past_n_days": {
"enum": [
7,
10,
30,
90
],
"type": "integer",
"description": "Only readymades created in the last 7, 10, 30, 90 days (default 10, the window the Readymades page shows)."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"readymades",
"count",
"truncated",
"past_n_days",
"note"
],
"properties": {
"note": {
"type": "string"
},
"count": {
"type": "number"
},
"status": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"readymades": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"past_n_days": {
"type": "number"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List email marketing readymades",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Call this when the creator asks to see, show, browse or list their email templates, and list them in chat rather than only linking a page. Returns the Beacons template gallery plus any templates they saved themselves: each template's id, title, description, category (share, promote, newsletter, welcome and so on), whether it starts a broadcast or an automation, and whether it is a Beacons template or their own — never the email content. For suggested emails written from the creator's own content, use list_email_marketing_readymades.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"name": "list_email_marketing_templates",
"description": "Call this when the creator asks to see, show, browse or list their email templates, and list them in chat rather than only linking a page. Returns the Beacons template gallery plus any templates they saved themselves: each template's id, title, description, category (share, promote, newsletter, welcome and so on), whether it starts a broadcast or an automation, and whether it is a Beacons template or their own — never the email content. For suggested emails written from the creator's own content, use list_email_marketing_readymades.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status",
"templates",
"count",
"global_count",
"truncated",
"note"
],
"properties": {
"note": {
"type": "string"
},
"count": {
"type": "number"
},
"status": {
"type": "string"
},
"templates": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"truncated": {
"type": "boolean"
},
"global_count": {
"type": "number"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List email marketing templates",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Use when someone asks what is on at an event, conference or summit: its agenda, schedule or lineup, how many sessions it has, which sessions to attend, or when and where a named session or someone's talk is. Finds the event in Beacons' event list by name and returns it with its listing description, how many sub-events it has of each sub_event_type (sessions, keynotes, panels, workshops, parties and networking) and its schedule in start order, each with its description, venue-local start and end (plus UTC when the event timezone is known), location, speakers, host, link, status and timing (upcoming, happening now or ended), along with today's date and the time now at the venue. Pass query with words from a session's name, speakers, hosts, description, type or room ("long game", "Zach King") to find it on any day, without knowing its day or time. start_date and end_date are venue-local days; sub_event_type narrows by kind. Who is going is search_event_people.
The description explains the capability, when to use it, and what to expect.
Inputs78/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
event
The event in the person's words: its name or part of it, its hosts, venue or a session, such as "VidSummit" or "the founders mixer", at most 200 characters. Required unless base_event_entity_id is set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
base_event_entity_id
Event id from search_events or the candidates of an earlier event lookup, once you know which event they mean. When set, event is ignored.
Clear enough to supply this argument.
query
Optional words from a session's name, speakers, hosts, description, type or room, such as "long game" or "Zach King", at most 200 characters. Every word must start a word there, case-insensitively, so leave out the time and words like talk or session. With no dates it searches the whole event.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
start_date
Earliest venue-local day to include, YYYY-MM-DD. Sub-events starting before it are left out.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end_date
Latest venue-local day to include, YYYY-MM-DD, inclusive. Must be on or after start_date.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sub_event_type
Only this kind of sub-event: keynote, session, panel, workshop, party, networking, registration, other.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Most sub-events to return, 1–1000; defaults to the whole schedule. A long schedule stops early with truncated and next_offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Matching sub-events to skip, 0–10000; pass next_offset to continue. Defaults to 0.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "list_event_sub_events",
"description": "Use when someone asks what is on at an event, conference or summit: its agenda, schedule or lineup, how many sessions it has, which sessions to attend, or when and where a named session or someone's talk is. Finds the event in Beacons' event list by name and returns it with its listing description, how many sub-events it has of each sub_event_type (sessions, keynotes, panels, workshops, parties and networking) and its schedule in start order, each with its description, venue-local start and end (plus UTC when the event timezone is known), location, speakers, host, link, status and timing (upcoming, happening now or ended), along with today's date and the time now at the venue. Pass query with words from a session's name, speakers, hosts, description, type or room (\"long game\", \"Zach King\") to find it on any day, without knowing its day or time. start_date and end_date are venue-local days; sub_event_type narrows by kind. Who is going is search_event_people.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"event": {
"type": "string",
"description": "The event in the person's words: its name or part of it, its hosts, venue or a session, such as \"VidSummit\" or \"the founders mixer\", at most 200 characters. Required unless base_event_entity_id is set."
},
"limit": {
"type": "integer",
"description": "Most sub-events to return, 1–1000; defaults to the whole schedule. A long schedule stops early with truncated and next_offset."
},
"query": {
"type": "string",
"description": "Optional words from a session's name, speakers, hosts, description, type or room, such as \"long game\" or \"Zach King\", at most 200 characters. Every word must start a word there, case-insensitively, so leave out the time and words like talk or session. With no dates it searches the whole event."
},
"offset": {
"type": "integer",
"description": "Matching sub-events to skip, 0–10000; pass next_offset to continue. Defaults to 0."
},
"end_date": {
"type": "string",
"description": "Latest venue-local day to include, YYYY-MM-DD, inclusive. Must be on or after start_date."
},
"start_date": {
"type": "string",
"description": "Earliest venue-local day to include, YYYY-MM-DD. Sub-events starting before it are left out."
},
"sub_event_type": {
"enum": [
"keynote",
"session",
"panel",
"workshop",
"party",
"networking",
"registration",
"other"
],
"type": "string",
"description": "Only this kind of sub-event: keynote, session, panel, workshop, party, networking, registration, other."
},
"base_event_entity_id": {
"type": "string",
"description": "Event id from search_events or the candidates of an earlier event lookup, once you know which event they mean. When set, event is ignored."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status"
],
"properties": {
"event": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"total": {
"type": "integer"
},
"status": {
"type": "string"
},
"has_more": {
"type": "boolean"
},
"cancelled": {
"type": "integer"
},
"truncated": {
"type": "boolean"
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"sub_events": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"next_offset": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"venue_today": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"counts_by_type": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"total_matching": {
"type": "integer"
},
"venue_now_local": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"candidates_truncated": {
"type": "boolean"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List event schedule",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Align the title with the capability actually described by this tool.
Description98/100
Use when someone asks how many people are going to an event, who the attendees or speakers are, who they should meet there, or whether anyone in their space will be there. Finds the event, conference, summit or convention in Beacons' event list by name and returns it with its listing description, how many people are on it and who they are: attendees, speakers, organizers, press and staff, including brand and agency people, with their roles, title, company names and their own LinkedIn, Instagram, TikTok and YouTube, and, for a Beacons creator, their display name, categories, and public Instagram, TikTok, YouTube and LinkedIn handles with follower counts. Narrow it with query (a name, company or handle), role, or sub_event_id from list_event_sub_events; it never returns email addresses, phone numbers or private notes. Creators who share the caller's platforms or categories come first, then speakers, hosts and organizers, and people listed only as a contact come last; people the caller recorded meeting there with create_event_contact are marked added_by_you.
The description explains the capability, when to use it, and what to expect.
Inputs82/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
event
The event in the person's words: its name or part of it, its hosts, venue or a session, such as "VidSummit" or "the founders mixer", at most 200 characters. Required unless base_event_entity_id is set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
base_event_entity_id
Event id from search_events or the candidates of an earlier event lookup, once you know which event they mean. When set, event is ignored.
Clear enough to supply this argument.
query
Optional text matched against each person's name, title, company names, own Instagram, TikTok and YouTube handles, and creator display name and handles (a leading @ is ignored), at most 200 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
role
Only people with this role at the event, or on the sub-event when sub_event_id is set: contact, attendee, speaker, organizer, staff, press, host.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sub_event_id
Only people on this sub-event, by sub_event_id from list_event_sub_events. Their roles are then their roles on that sub-event.
Clear enough to supply this argument.
limit
Most people to return, 1–10000, as many as the question needs; defaults to 25. A long list stops early with truncated and next_offset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Ranked people to skip, 0–10000; pass next_offset to continue. Defaults to 0.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "search_event_people",
"description": "Use when someone asks how many people are going to an event, who the attendees or speakers are, who they should meet there, or whether anyone in their space will be there. Finds the event, conference, summit or convention in Beacons' event list by name and returns it with its listing description, how many people are on it and who they are: attendees, speakers, organizers, press and staff, including brand and agency people, with their roles, title, company names and their own LinkedIn, Instagram, TikTok and YouTube, and, for a Beacons creator, their display name, categories, and public Instagram, TikTok, YouTube and LinkedIn handles with follower counts. Narrow it with query (a name, company or handle), role, or sub_event_id from list_event_sub_events; it never returns email addresses, phone numbers or private notes. Creators who share the caller's platforms or categories come first, then speakers, hosts and organizers, and people listed only as a contact come last; people the caller recorded meeting there with create_event_contact are marked added_by_you.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"role": {
"enum": [
"contact",
"attendee",
"speaker",
"organizer",
"staff",
"press",
"host"
],
"type": "string",
"description": "Only people with this role at the event, or on the sub-event when sub_event_id is set: contact, attendee, speaker, organizer, staff, press, host."
},
"event": {
"type": "string",
"description": "The event in the person's words: its name or part of it, its hosts, venue or a session, such as \"VidSummit\" or \"the founders mixer\", at most 200 characters. Required unless base_event_entity_id is set."
},
"limit": {
"type": "integer",
"description": "Most people to return, 1–10000, as many as the question needs; defaults to 25. A long list stops early with truncated and next_offset."
},
"query": {
"type": "string",
"description": "Optional text matched against each person's name, title, company names, own Instagram, TikTok and YouTube handles, and creator display name and handles (a leading @ is ignored), at most 200 characters."
},
"offset": {
"type": "integer",
"description": "Ranked people to skip, 0–10000; pass next_offset to continue. Defaults to 0."
},
"sub_event_id": {
"type": "string",
"description": "Only people on this sub-event, by sub_event_id from list_event_sub_events. Their roles are then their roles on that sub-event."
},
"base_event_entity_id": {
"type": "string",
"description": "Event id from search_events or the candidates of an earlier event lookup, once you know which event they mean. When set, event is ignored."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"status"
],
"properties": {
"event": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
},
"total": {
"type": "integer"
},
"people": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"ranked": {
"type": "boolean"
},
"status": {
"type": "string"
},
"degraded": {
"type": "boolean"
},
"has_more": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}
},
"next_offset": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"total_matching": {
"type": "integer"
},
"candidates_truncated": {
"type": "boolean"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Search event attendees",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01List event scheduleUse when someone asks what is on at an event, conference or summit: its agenda, schedule or lineup, how many sessions it has, which sessions to attend, or wh…
02Get analyticsCreator analytics for one source or several side by side: links (Link in Bio and short-link clicks and unique clicks by link, link type, country, device or r…
03List email marketing broadcastsList this creator's Beacons email broadcasts, the newsletters and one-off emails they send to subscribers, across sent, scheduled, draft, archived, processin…
04List email marketing templatesCall this when the creator asks to see, show, browse or list their email templates, and list them in chat rather than only linking a page.
05Search event peopleUse when someone asks how many people are going to an event, who the attendees or speakers are, who they should meet there, or whether anyone in their space…
Want to run these tasks against your MCP server with us?
add_media_kit_brand_partneradd_media_kit_case_studyadd_media_kit_rateadd_media_kit_social_platformgenerate_qr_codeget_creator_social_statsget_email_marketing_analyticsget_firestore_documentget_invoice_analyticsget_media_kit_analyticsget_organization_creator_infoget_organization_creator_link_analytics+16 more
Beacons setup, tools, quality score, publishing readiness, and alternatives.
How do I add Beacons to Claude, ChatGPT, or Cursor?
Add Beacons to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://beacons.ai/api/v001/creator/mcp. This server requires OAuth, so complete the login prompt after you connect.
Is Beacons MCP ready for ChatGPT and Claude?
As of October 21, 2026, Beacons scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Beacons's MCP tool documentation?
As of October 21, 2026, Beacons scores 87/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 64 of 64 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What tools does the Beacons MCP server provide?
Beacons lists 28 MCP tools, including add_media_kit_brand_partner, add_media_kit_case_study, add_media_kit_rate, add_media_kit_social_platform, generate_qr_code, get_creator_social_stats, get_email_marketing_analytics, get_firestore_document, get_invoice_analytics, get_media_kit_analytics, get_organization_creator_info, and get_organization_creator_link_analytics.
What are the best alternatives to Beacons?
As of November 10, 2026, alternatives to Beacons in marketing-seo on the Manufact MCP leaderboard include Refluenced, The Prompting Company MCP, Buzzfy, Indexing Dispatch, and Brave URL Submitter.
Does Beacons MCP require authentication?
Beacons requires authentication. Connect it in Claude, ChatGPT, or Cursor and complete the OAuth login prompt.
How can Beacons improve its MCP documentation?
get_pricing_estimate is the lowest-scoring reviewed tool at 67/100. 1 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Who develops Beacons?
Beacons is developed by Beacons. It is listed as community on the Claude connector directory.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.