Reader Radius MCP docs

Connect Claude, ChatGPT or another AI assistant to your social media and ad accounts. This page covers setup and the ready-made prompts, then lists every tool your assistant can use.

Quickstart

  1. 1

    Sign in and connect your accounts

    Sign in at mcp.readerradius.com and connect the social and ad accounts you post to on the Connections page.

    Open Connections
  2. 2

    Add Reader Radius to your AI

    Follow the setup for your assistant below. The AI setup page has a copy button for every value.

    Go to setup
  3. 3

    Check it works, then ask for a plan

    Paste the first prompt to check the connection, then the second to start planning.

    Check the connection
    List my connected accounts.
    Starter prompt
    Use the Reader Radius playbook to plan my next two weeks of book marketing. Ask me about my book first, then show me the plan before you schedule anything.

Setup by client

Claude Cowork — web connector

In Claude or Cowork, adding Reader Radius as a custom connector requires no install, no terminal, no Node.js. You generate a credential pair on our side, paste it into Cowork's connector form, and Claude can read your accounts and schedule posts on your behalf.

Two-step walkthrough — generate credentials, then add the connector. ~3 minutes.

1. Generate your connector credentials

Sign in to AI setup and find the Use Reader Radius inside Claude or ChatGPT card. It walks you through three numbered steps: connect your social accounts, generate a credential pair, then pick where you use Claude (a Claude.ai connector tab for the browser/desktop app and a Claude Code plugin tab for the terminal). In step 2, name the credential, choose which pen names it can act on, and click Generate credential pair. We'll give you three things — keep all three handy:

MCP server URLhttps://readerradius.com/api/mcp
Client IDstarts with aacw_ — looks like a username
Client Secretstarts with aacs_ — like a password. Shown once. Copy now or you'll need to regenerate.

We hash the secret on save and never store the plaintext. If you close the dialog before copying it, you'll need to revoke and regenerate.

2. Add the custom connector in Cowork

  1. In Cowork, open Settings → Connectors → Add custom connector.
  2. Name it Reader Radius.
  3. Paste the MCP server URL into the “Remote MCP server URL” field.
  4. Open Advanced settings. Paste the Client ID and Client Secret into their fields.
  5. Click Add. If Cowork initially shows “Connection has expired”, click Connect, sign in if prompted, click Approve, and the connector finishes authenticating within a few seconds.

3. Install the plugin for skills

The connector you just added gives Claude the tools. This step adds the skills (pen-name switching, Trial Reels, Threads chains, YouTube Shorts, Reddit, campaign builder) and the /aa-post + /aa-campaign slash commands. One marketplace, two paths to install — pick whichever Claude you're using.

In Cowork

  1. Settings → Plugins → click the + next to Personal.
  2. Add a marketplace from URL — paste:
https://github.com/chellehoniker/claude-code-author-automations
  1. Click Sync, then click the + next to Reader Radius to install. Older clients may show author-automations-social; the internal identifier is unchanged.
  2. Recommended: three-dot menu on the marketplace → Sync automatically: ON so future skill updates flow without re-adding.

In Claude Code (CLI)

/plugin marketplace add https://github.com/chellehoniker/claude-code-author-automations
/plugin install author-automations-social@author-automations

4. Try it

Open a new chat in Cowork and ask:

List my connected social accounts.

Cowork should show the accounts within the selected credential's allowed pen names. From there, try “write me an Instagram post about my new book and schedule it for Friday at 9am.”

Public directory approval is pending. You can connect the hosted MCP server manually now, where your ChatGPT account and workspace allow custom connections. You do not need to run a server on your computer.

Two separate parts: the MCP connection gives ChatGPT Reader Radius tools. The optional plugin adds guided skills. Installing the skills alone does not connect your account.

1. Prepare your Reader Radius credential pair

In AI setup, generate a credential pair or reuse an existing one. Give it a recognizable name and choose the pen names it may access. Connect your social accounts in Reader Radius before attempting to post.

ChatGPT asks you to select this pair on the Reader Radius consent page. You do not paste its Client Secret, a Reader Radius API key, or an AI-provider key into ChatGPT chat or the MCP headers.

2. Add the MCP connection

ChatGPT desktop / Codex: custom MCP form
  1. Open the MCPs area in plugin settings and choose to add a custom MCP server. Name it Reader Radius.
  2. Choose Streamable HTTP, not STDIO. Paste the URL above. There is no launch command, working directory, or environment variable to configure.
  3. Leave bearer-token and header fields empty, then save.
  4. Choose Automatic or Client ID metadata document (CIMD), then click Authenticate. Do not select Dynamic client registration (DCR).
  5. Sign in on readerradius.com, select the credential pair from step 1, review its access, and choose Connect ChatGPT. Return to the app after authorization finishes.
ChatGPT web: developer-mode connection
  1. Enable Developer mode in ChatGPT settings. Current OpenAI instructions place this under Security and login; older layouts may show it under Apps → Advanced settings.
  2. Open ChatGPT Plugins and use the plus button to add a connection (called Create in some layouts).
  3. Name it Reader Radius, enter the MCP URL above, and choose OAuth if asked. Use automatic discovery/CIMD if a registration method is offered; do not use DCR or someone else's client credentials.
  4. Complete the Reader Radius sign-in and credential-pair consent. Review the discovered tools, then start a new chat and select the connection from the tools menu.

If Developer mode or custom connections are unavailable, your plan or workspace policy may restrict them. Ask your workspace administrator; the desktop setup does not bypass workspace restrictions. OpenAI connection instructions.

3. Install the optional skills plugin

In desktop plugin settings, use the option to add a marketplace from a URL, when available. Paste the repository URL below, sync/refresh it, and install Reader Radius. Older clients may display author-automations-social; that stable internal name is intentional.

Terminal alternative for users with Codex CLI installed

Run these in your terminal, not in a chat message. Then restart the desktop app and start a new chat.

Desktop/CLI installation does not automatically install the skills in ChatGPT web. For web workspaces, an administrator can import the GitHub marketplace if that feature is enabled. Otherwise, use the manual MCP connection without the optional skills while public approval is pending. OpenAI workspace plugin instructions.

Already installed? Refresh/update the existing marketplace plugin rather than creating another connection. No new credential pair is needed for a display-name or skills update.

4. Check the connection without posting

Start a new chat with Reader Radius enabled and ask: “Show the pen names I can access. Do not create, schedule, or publish anything.” Only the pen names allowed by the selected pair should appear. A working MCP connection can answer this even without the skills plugin.

The OAuth connection is stored and refreshed; users do not repeat setup for each tool call. Editing the pair's pen-name permissions changes its connected access. Revoking the pair disconnects linked ChatGPT access and any Claude connector using that pair.

Manual setup troubleshooting
  • DCR not supported: choose CIMD/Automatic and retry Authenticate. Use the full URL ending in /api/mcp/chatgpt.
  • Skills installed but no tools: complete step 2 separately, enable the connection, and start a new chat.
  • No pen names available: sign in to the correct Reader Radius account and check the selected pair's permissions. Do not revoke a working pair just to change permissions.
  • Enterprise domain restrictions unavailable: this optional OIDC capability is separate from OAuth. It does not by itself mean the connection failed; a workspace that requires it may still block installation.
  • Connection fails: remove accidental bearer/header overrides, check for whitespace in the URL, and authenticate again. If it persists, send support the error and client name—but never your secret, password, or token.

Claude Code — terminal plugin

Claude Code is the developer-oriented CLI version of Claude. Our plugin contains skills and slash commands, not a bundled MCP connection. Add the hosted server separately; the skills teach Claude how to write platform-specific captions, run multi-day campaigns, switch pen names, and route to the right post type (Reel vs. Story vs. carousel) based on what you say.

1. Add the marketplace and install

Paste these in any Claude Code session:

One-time install
/plugin marketplace add https://github.com/chellehoniker/claude-code-author-automations
/plugin install author-automations-social@author-automations

These commands install skills only. Keep the existing plugin ID shown above even though its display name is Reader Radius.

2. Add the MCP connection and sign in

Generate or reuse a credential pair in AI setup and choose its pen-name access. Replace YOUR_CLIENT_ID below, then run this in your terminal. The Client Secret is requested interactively rather than included in your shell history. Do not paste credentials into chat.

Terminal: connect the hosted MCP server
claude mcp add --transport http --scope user --client-id YOUR_CLIENT_ID --client-secret reader-radius https://readerradius.com/api/mcp

In Claude Code, run /mcp, select reader-radius, and authenticate. Complete the browser sign-in and approval. Start a new session and ask to list your accessible pen names before trying a write action. Already connected? Skip adding another server and retain the existing connection.

3. Try a slash command

Single post
/aa-post post a Trial Reel about my new cover, schedule for Friday 6pm
Multi-day campaign
/aa-campaign 14-day launch campaign for Curses and Currents on Instagram, Threads, and TikTok

Or skip the slash commands entirely — just describe what you want in plain English. The plugin's skills tell Claude when to switch pen names, how to route a 9:16 video to YouTube Shorts vs. Instagram Reels, when to call the Threads chain feature, etc.

Clients that can't sign in with a client ID and secret can use your API key instead. Create it on the AI setup page and send it as a Bearer token in the Authorization header. Your account has one API key, shared by every app that uses it, so replacing it means updating each of them.

MCP server URL
https://readerradius.com/api/mcp
Header
Authorization: Bearer aa_sk_...

Call the MCP endpoint over HTTP with your API key. Start with initialize, then tools/list to see every tool and its input schema.

1. initialize
curl -X POST https://readerradius.com/api/mcp \
  -H "Authorization: Bearer aa_sk_..." \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"my-agent","version":"1.0.0"}}}'
2. tools/list
curl -X POST https://readerradius.com/api/mcp \
  -H "Authorization: Bearer aa_sk_..." \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

Authentication

OAuth or API key
Claude and ChatGPT sign in with OAuth: you create a client ID and secret on the AI setup page, and your assistant asks you to approve access once. Other clients and your own code use an API key.
One client ID per assistant
Give each assistant its own client ID and secret, so revoking one doesn't disconnect the rest. Revoke any of them on the AI setup page. The API key is one per account: replacing it disconnects every app that uses it until you update them.
Pen names
The $19 plan includes one pen name. With several pen names on the $29 plan, send X-Profile-Id with the pen name's id, or pass profileId to a tool. aa_list_profiles lists the ids.

Prompts and the playbook

Five ready-made prompts run the Reader Radius publisher playbook in your assistant. Each one hands your assistant the playbook first.

  • plan_my_launch

    Plan 30 days of book marketing for a launch, then schedule week one once you approve.

    Arguments: title, launch_date (optional)

  • plan_my_week

    Review the last seven days and what's scheduled, then plan and schedule next week.

  • monday_review

    Last week's results in under 200 words, with up to three suggested changes.

  • set_up_lead_magnet

    Readers comment a keyword and get your free download by DM. The rule starts paused.

    Arguments: magnet_name, download_link

  • amazon_ads_checkup

    Keep, watch or pause each Amazon campaign, based on the last 14 days.

The playbook itself is the resource readerradius://playbook, and aa_get_playbook returns the same text for assistants that don't load resources. aa_whats_next checks your account and suggests what to do next.

ChatGPT may not show these prompts. If you don't see them, paste the starter prompt instead.

Plan differences

The $19 MCP plan includes every tool except the 11 Reader Radius AI tools that write captions and make images for you. On the $19 plan, your own assistant does the writing and the images. The $29 plan adds Reader Radius AI and the full dashboard.

Troubleshooting

My assistant says it isn't authorized, or the connection expired

Reconnect Reader Radius in your assistant's connector settings and approve access again. If you use an API key, check it hasn't been revoked on the AI setup page.

It says an account isn't connected

Connect that account on the Connections page, then ask again.

It says my own AI does the writing and the images

That tool is part of Reader Radius AI on the $29 plan. Ask your assistant to write the caption or make the image itself, then post it with Reader Radius.

I can't add a custom connector

Some Claude and ChatGPT plans, and many workplace accounts, turn custom connectors off. Check with your workspace admin, or use a personal account.

A post doesn't appear

Check its scheduled time in your time zone, and whether it went into a queue slot. Ask your assistant: “Show me what's scheduled this week and when each post goes out.”

Tools reference

Every tool your assistant can call, generated from the live server: 388 tools in 18 groups.

ReadsAddsChanges or removes$29 plan

388 tools.

Core tools

Ask your assistant: “What should I do next with my book marketing?”

The author's next steps in Reader Radius, worked out from their account: no connected accounts, no Instagram for trial reels, nothing scheduled in the next 7 days, nothing posted in the last 7, every ad paused, no comment-to-DM rule. Each step says how to fix it, with the page link when the fix is on the website. Use it when the user asks what to do next or seems stuck, and at the start of a planning session. `unchecked` lists checks that couldn't run. Pass profileId for a non-primary pen name.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Ask your assistant: “Read the Reader Radius playbook, then plan my launch.”

The Reader Radius publisher playbook as markdown: how to plan and run book marketing here (trial reels, vertical shorts, 30 days of posts, lead magnets by DM), with example prompts. Read it before planning anyone's marketing, and whenever the user mentions the Reader Radius playbook. Also available as the resource readerradius://playbook.

Ask your assistant: “List my connected accounts.”

List the user's connected social media accounts for a given pen-name profile. Returns account IDs (needed for creating posts), platform names, and usernames. Pass profileId to target a non-primary pen name (call aa_list_profiles first to discover). For large account sets, pass page (1-based) to page through results; the response includes a `pagination` object ({ page, limit, total, pages }) so you can tell when more accounts exist beyond the current page. Omit page to get all accounts.

Parameters (4)
NameTypeRequiredDescription
platformstringNo
pageintegerNo
limitintegerNo
profileIdstringNo

aa_create_post

Changes or removes

Ask your assistant: “Post this image to Instagram and Facebook tomorrow at 9am with a caption about my new release.”

Create and schedule a social media post. Use accountIds from aa_list_accounts. Set publishNow:true to post immediately, or scheduledAt for a specific time. ═══ PER-PLATFORM OPTIONS — TWO LAYERS ═══ 1) TYPED options (instagramOptions, tiktokOptions, threadsOptions, etc). Validated locally → fast 422 with a clear suggestion when something's off. 2) RAW platformOptions: { instagram: {...}, threads: {...}, twitter: {...}, ... }. Forwarded directly to the upstream platformSpecificData payload. Use this for anything not in the typed list, OR for platforms we haven't typed yet (twitter, bluesky, telegram, snapchat, googlebusiness, discord, whatsapp). Typed options take precedence; raw fills the rest. Both merge per platform. ═══ INSTAGRAM ═══ Aspect ratios: Feed = 0.75:1 to 1.91:1 (use 1080×1080, 1080×1350, or 1080×566). Stories/Reels = 9:16 single media only (use 1080×1920). If user has 4 vertical (9:16) images for IG, post 4 separate Stories — NOT one carousel. Carousels: up to 10 items, all same media type (no mixing image+video). instagramOptions: contentType: 'story' | 'reel' — omit for Feed (default) coverImage: URL of a 9:16 image — Reel cover coverFromTimestamp: ms into video — Reel cover from a video frame trialParams: { graduationStrategy: 'MANUAL' | 'SS_PERFORMANCE' } — Trial Reel: shown to non-followers first shareToFeed, collaborators, firstComment, audioName, userTags ═══ TIKTOK ═══ tiktokOptions: draft (save to TikTok Inbox to review before publish), privacyLevel (PUBLIC_TO_EVERYONE | MUTUAL_FOLLOW_FRIENDS | FOLLOWER_OF_CREATOR | SELF_ONLY), allowComment, allowDuet, allowStitch (videos only), autoAddMusic (TikTok adds trending music to photo carousels), videoCoverTimestampMs / videoCoverImageUrl, photoCoverIndex, commercialContentType: 'none' | 'brand_organic' | 'brand_content' — when set to anything other than 'none', TikTok REQUIRES the paired flag: brand_organic → isBrandOrganicPost=true; brand_content → brandPartnerPromote=true. Forgetting the pair rejects the post. contentPreviewConfirmed + expressConsentGiven — TikTok policy attestations. Default both to true for any non-draft publish; the user agreed by submitting via the tool. videoMadeWithAi — AI-generated content disclosure (REQUIRED if the video is AI-generated or significantly AI-edited). description — long-form caption for photo carousels (up to 4000 chars; separate from the main caption). ASK THE USER: if they're posting AI-generated video → set videoMadeWithAi=true. If the post promotes a brand or is a paid partnership → set commercialContentType. If they want to review before publishing → draft=true. ═══ THREADS ═══ threadsOptions.topicTag (1–50 chars, NO '.' or '&'). Use platformOptions.threads.threadItems for chains. ═══ YOUTUBE ═══ youtubeOptions.title is REQUIRED for video posts. visibility, madeForKids, containsSyntheticMedia, firstComment, categoryId, playlistId. ═══ REDDIT ═══ redditOptions.subreddit + title both REQUIRED. url, forceSelf, flairId, nsfw, spoiler, nativeVideo (upload to Reddit's video player; default true), videogif (post video as a looping GIF), videoPosterUrl (thumbnail URL for the native video). ═══ FACEBOOK ═══ facebookOptions: contentType ('story' | 'reel'; omit for Feed default), title (Reel title, only honored when contentType=reel), firstComment (Feed-post only; auto-posted as comment 1 below the post). On Pages Meta has limited, it still counts as one of the 2 free link posts a month. draft (true → stages the post as an unpublished draft in Facebook Publishing Tools; expires in ~30 days). ASK THE USER: if they want to review or get sign-off before publishing → draft=true. ═══ LINKEDIN ═══ linkedinOptions: firstComment (LinkedIn DOWN-RANKS posts with external links by 40-50% — put URLs in the first comment, NOT the main caption), disableLinkPreview (suppresses LinkedIn's auto-generated URL card), documentTitle (REQUIRED when posting a PDF/document — headline above the preview). ═══ TWITTER / X ═══ Use platformOptions.twitter for threadItems / poll / replyToTweetId (mutually exclusive with replySettings). replySettings: 'following' | 'mentionedUsers' | 'subscribers' | 'verified' — restricts who can reply. longVideo: true → upload up to ~10 min via amplify_video (requires X Premium + API allowlisting). ═══ PINTEREST ═══ Use platformOptions.pinterest: link (destination URL for each pin), boardId, title, coverImageUrl, coverImageKeyFrameTime. ASK: what URL should the pin send clicks to? (often a book sales link) ═══ EVERYTHING ELSE ═══ Use raw platformOptions: bluesky, telegram, snapchat, googlebusiness, discord, whatsapp. Field names match the platform's verbatim docs. Discord: tts (text-to-speech), webhookUsername (display name override, max 80 chars), webhookAvatarUrl, crosspost (publish to following servers — announcement channels only). Pass width/height on each image mediaItem when known — server skips a probe-fetch and validates IG faster. tags: root-level array of YouTube video tags (≤500 chars total including commas). The network puts this at the post ROOT, not inside youtubeOptions.

Parameters (17)
NameTypeRequiredDescription
contentstringNo
accountIdsstring[]Yes
publishNowbooleanNo
scheduledAtstringNo
timezonestringNo
mediaItemsobject[]No
instagramOptionsobjectNo
tiktokOptionsobjectNo
threadsOptionsobjectNo
youtubeOptionsobjectNo
redditOptionsobjectNo
facebookOptionsobjectNo
pinterestOptionsobjectNo
linkedinOptionsobjectNo
platformOptionsobjectNo
tagsstring[]NoRoot-level YouTube tags (≤500 chars joined). NOT inside youtubeOptions.
profileIdstringNoPen-name profile to post under. Required when the user has multiple pen names and the post should NOT go to the primary. Get IDs from aa_list_profiles.

aa_update_post

Changes or removes

Ask your assistant: “Move Friday's post to Saturday at 10am.”

Update a scheduled post's content or time. Pass profileId for posts that belong to a non-primary pen name (the same id you used when creating the post or campaign) — without it, the server scopes to the user's primary profile and returns 404.

Parameters (4)
NameTypeRequiredDescription
postIdstringYes
contentstringNo
scheduledAtstringNo
profileIdstringNo

Ask your assistant: “Show me everything scheduled for next week.”

List the user's posts with optional filters. Two read sources: 'mirror' (DEFAULT — local 15-min-synced snapshot, fast, matches what the dashboard shows, survives upstream outages) and 'live' (read-through to the network, always current, costs an upstream API call). Use mirror for general 'what's my week look like?' / 'show me scheduled Threads posts' / 'what published last month?' questions — that's the conversational default. Use live ONLY when (a) the user explicitly says 'check directly' / 'are you sure?' / 'right now', (b) the user just made a change in the dashboard and wants you to see it before the next 15-min sync, or (c) the mirror response shows _oldest_synced_at older than ~1 hour (means the cron lagged). Pass profileId to scope to a specific pen name (default is primary). dateFrom/dateTo accept YYYY-MM-DD or ISO. Status filter accepts scheduled / published / failed / publishing / draft / cancelled / partial. 'partial' (some platform legs published, others failed) is an upstream rollup only — ask for it with source='live', because the mirror stores a per-leg status and never holds 'partial' itself. For a failed or partial post, follow up with aa_get_post_logs to read why.

Parameters (7)
NameTypeRequiredDescription
status"scheduled" | "published" | "failed" | "publishing" | "draft" | "cancelled" | "partial"No
limitintegerNo
pageintegerNo
dateFromstringNo
dateTostringNo
source"mirror" | "live"No
profileIdstringNo

Ask your assistant: “What posting slots do I have set up?”

List the user's posting queues (queue definitions, not next-slot previews — use aa_queue_preview for that). Each queue has optional per-platform decoration (the `platforms[]` field — e.g., a queue with ["instagram", "tiktok"] populates the next IG slot AND the next TikTok slot independently when a multi-platform post is added). Each queue also has optional persona scope (the `tag` field — NULL means the queue is shared across every persona under this pen name; a tag string scopes the queue to that persona only). Personas come from the user's content guides; see aa_list_guide_sets.

Parameters (3)
NameTypeRequiredDescription
queueIdstringNo
allbooleanNo
profileIdstringNo

Ask your assistant: “When will my next three queued posts go out?”

Preview upcoming queue slots for a pen-name profile. Pass profileId to inspect a non-primary pen name's queue.

Parameters (2)
NameTypeRequiredDescription
countintegerNo
profileIdstringNo

Ask your assistant: “How did my posts do last week? Show reach and engagement by platform.”

Cross-platform post analytics for a pen-name profile (impressions, reach, engagement, etc., per post). Optional fromDate / toDate (YYYY-MM-DD or ISO), platform, accountId filters. Start here for any 'how did my posts perform?' question; drill down with aa_get_daily_metrics or aa_get_facebook_page_insights if needed. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (5)
NameTypeRequiredDescription
fromDatestringNo
toDatestringNo
platformstringNo
accountIdstringNo
profileIdstringNo

Ask your assistant: “Show me new comments on my last three posts.”

List comments on published posts across connected accounts (e.g., people commenting on your Instagram, Facebook or TikTok posts). Optional accountId / platform filters. Use aa_reply_inbox_comment, aa_hide_comment, aa_like_inbox_comment or aa_pin_inbox_comment (TikTok) to act on entries.

Parameters (3)
NameTypeRequiredDescription
accountIdstringNo
platformstringNo
profileIdstringNo

aa_reply_inbox_comment

Changes or removes

Ask your assistant: “Reply to that comment and thank them for reading.”

Reply to a comment on one of the user's published posts. postId + commentId from aa_list_inbox_comments; accountId is the social account that owns the post.

Parameters (5)
NameTypeRequiredDescription
postIdstringYes
commentIdstringYes
accountIdstringYes
messagestringYes
profileIdstringNo

Ask your assistant: “Do I have any unanswered DMs?”

List DM / messaging conversations across connected accounts. Optional accountId scopes to one social account; optional platform filters by network (instagram, facebook, tiktok, telegram, whatsapp, etc.). TikTok DMs are reply-only (the business can never open a conversation) and need an account connected through TikTok for Business. Returns conversation summaries (id, participants, latest message, unread count) — use aa_get_inbox_thread to load full message history.

Parameters (3)
NameTypeRequiredDescription
accountIdstringNo
platformstringNo
profileIdstringNo

Ask your assistant: “When someone comments READ, DM them my free chapter.”

Create a comment-automation rule (comment or Instagram story-reply keyword → automatic DM). accountId + name + dmMessage required. Omit platformPostId to watch EVERY post/story on the account. Supports word/contains/exact matching with typoTolerance and excludeKeywords, DM buttons (1-3) or a generic template card carousel, audience targeting with follow gates, message variations, link tracking, and delivery delays.

Parameters (24)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo
namestringNo
trigger"comment" | "story_reply"No
platformPostIdstringNoPlatform media/post id (story media id for story_reply). OMIT for an account-wide any-post/any-story rule.
postTitlestringNo
keywordsstring[]No
matchMode"exact" | "contains" | "word"No
excludeKeywordsstring[]No
typoTolerancebooleanNo
dmMessagestringNo
buttonsobject[]No
templateobjectNoProduct card carousel sent INSTEAD of dmMessage; mutually exclusive with buttons.
commentReplystringNo
dmMessageVariationsstring[]No
commentReplyVariationsstring[]No
linkTrackingbooleanNo
clickTagstringNo
dmDelaySecondsintegerNo
commentReplyDelaySecondsintegerNo
alsoMatchInDmsbooleanNo
audienceobjectNo
followGateobjectNo
isActivebooleanNo

Ask your assistant: “Which comment-to-DM rules are running?”

List the user's comment-automation rules (e.g., 'auto-DM anyone who comments BOOK on this post'). Returns the active rule set.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Ask your assistant: “Plan a 30-day launch campaign for my new book.”

Create a new campaign for a pen-name profile. After creating, use aa_save_campaign_plan to add the content plan. Pass profileId to attach the campaign to a non-primary pen name. Pass guideTag to use a specific persona for this campaign's AI generations — call aa_list_guide_sets first if the user mentioned a series, sub-brand, or specific voice. Omitting guideTag uses the user's default persona. The choice persists on the campaign row so regenerations stay on the same voice.

Parameters (15)
NameTypeRequiredDescription
namestringYes
objectivestringYes
post_countintegerNo
platformsstring[]No
content_mix"images_only" | "mostly_images" | "mixed" | "videos_only" | "user_decides"No
media_kind"image" | "video" | "carousel"NoWhat the batch produces. Overrides content_mix.
objective_kind"prelaunch" | "launch" | "sale" | "backlist" | "reader_list" | "meet_author" | "characters_world" | "sell_book" | "teach_concept" | "establish_authority" | "lead_magnet" | "promote_course_service" | "speaking_events" | "other"NoWhat the campaign is FOR — shapes caption arc, tone, and CTA style.
variety"signature" | "balanced" | "wide"NoScene-variety dial: signature = tight on-brand scenes, wide = maximum range.
image_size_keystringNoImage size preset key; omit for platform-derived sizes.
book_idstringNoAnchor the campaign to a book: pulls cover, blurb, reviews, and the book's reference library (labeled quotes/scenes/character docs) into generation automatically.
carousel_slide_countintegerNo
carousel_image_strategy"single_repeated" | "per_slide"Nosingle_repeated = one background image, panel text changes (typography-led BookTok default); per_slide = a fresh image every panel (character reveals).
carousel_recipes("quote_dialogue" | "pov_hook" | "trope_card" | "character_reveals")[]NoCarousel formats to build the batch around; omit/empty = mix all four. Every carousel ends on a CTA panel — the book's real cover when a book is attached.
guideTagstringNo
profileIdstringNo

Ask your assistant: “How are all my ads doing this month?”

Normalized campaign list across EVERY connected ad network in one call — Meta, Google, TikTok, LinkedIn, Pinterest, X, ChatGPT, and Amazon — each row with status, spend, results, and any book-title mapping attached (see aa_get_ad_title_map). Optional accounts[] (connected-account ids from aa_list_accounts) narrows the sweep; from/to (YYYY-MM-DD) sets the window, default last 30 days. Partial network failures come back in `errors` rather than failing the whole call. Start here for any 'how are all my ads doing?' question. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountsstring[]NoConnected-account ids to include; omit for all.
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

aa_create_standalone_ad

Changes or removes

Ask your assistant: “Create a $10 a day Meta ad for my book, paused, so I can check it first.”

REAL MONEY — create a brand-new ad (not boosting an existing post). accountId + adAccountId required. Never pass postId or platformPostId: those make it a boost (postId is stripped here; use aa_boost_post for existing posts). The body is forwarded as-is, so ad fields go FLAT inside `extra` — nested creative/budget objects are not translated. A typical ad: extra: { name, goal: 'traffic', status: 'PAUSED', headline, body, imageUrl, linkUrl, callToAction: 'LEARN_MORE', budgetAmount: 20, budgetType: 'daily'|'lifetime', startDate, endDate } (lifetime budgets need endDate) Always pass status 'PAUSED' (it works on every network) unless the user explicitly says launch live; PAUSED holds the new campaign with its ad set and ad switched on. Start it in-app with aa_update_ad_campaign_status, never in a network's own ads manager. Google Performance Max and Demand Gen are always created paused and need their nested `assetGroup` / `demandGen` payloads in extra. Lead ads: aa_create_lead_form first, then extra: { goal: 'lead_generation', leadGenFormId }. Catalog ads (Meta only, goal 'catalog_sales'): Meta builds one ad per product from a catalog, with each product's own image. Pick a set first: aa_list_ad_catalogs → aa_list_ad_catalog_product_sets (a Shopify store fills a catalog via aa_create_catalog_sync). extra: { goal: 'catalog_sales', promotedObject: { productSetId, pixelId, customEventType: 'PURCHASE', productCatalogId? }, headline, body, linkUrl, callToAction: 'SHOP_NOW', budget fields }. Copy may use tags like {{product.name}}. One template only: no imageUrl, video, creatives, carouselCards, adSetId, dynamicCreative or placementAssets (refused with a 400 naming them). targeting (forwarded as-is): countries, regions, cities, zips, metros, ageMin/ageMax, gender ('all'|'male'|'female'), languages, interests (ids from aa_search_ad_interests), excludedLocations: { countries, regions, cities, zips }. Age and gender apply on Meta, TikTok, Pinterest, LinkedIn, X and Google Search/Display; languages everywhere but ChatGPT; Google interests only on Search/Display. ChatGPT takes none of age, gender, languages or interests, and Google Performance Max / Demand Gen refuse age, gender and interests. A field a network can't use is refused with an error naming it, not ignored. rawTargeting: raw Meta targeting JSON (places, neighborhoods, custom audiences). It is the base layer and `targeting` merges on top; usually pass one or the other. Networks: Meta (full fields incl. creatives/bid/lead forms), TikTok (imageUrl may be a video URL; min budget $20), LinkedIn (LinkedIn conversions run as a boost), Google (campaignType search|display, also pmax|demand_gen; goals engagement/traffic/awareness; keywords, businessName, longHeadline; headline max 30 / body max 90), Pinterest (boardId optional; headline max 100 / body max 500; $5 min), ChatGPT (openaiads account; goals traffic/awareness/conversions), X. Goals differ by network (Pinterest: engagement/traffic/awareness/video_views); an unsupported goal is refused. adAccountId comes from aa_list_ad_accounts; if a connection lists none, connect that network's ads with aa_connect_ads_account first (ChatGPT: aa_connect_openai_ads). Amazon: use aa_create_amazon_campaign. ALWAYS confirm budget + duration with the user before calling. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (9)
NameTypeRequiredDescription
accountIdstringYes
adAccountIdstringYes
budgetobjectNo
targetingobjectNo
rawTargetingobjectNo
creativeobjectNo
leadFormIdstringNo
extraobjectNoAny other createStandaloneAd fields not covered above (e.g. objective, duration, name) — forwarded verbatim.
profileIdstringNo

Ask your assistant: “Pause the ads that aren't getting clicks.”

Pause or resume a paid ad campaign. This flips the campaign's own switch only: pausing stops all delivery under it, resuming restarts the ad sets and ads that are switched on (any paused on their own stay paused), except on Google, where resuming a campaign also switches its ad groups and ads back on. id is the platform campaign id; accountId is the connected social account (tenant boundary); platform names the network. REAL MONEY — confirm with the user before resuming a paused campaign. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
idstringYes
accountIdstringYes
platformstringYes
status"active" | "paused"Yes
profileIdstringNo

Ask your assistant: “Show my Amazon campaigns with spend and ACOS for the last 14 days.”

Per-campaign Amazon Ads rollups (spend, sales, clicks, impressions, ACOS) over a date window. Optional from/to (YYYY-MM-DD); default last 30 days. Covers every synced Amazon advertiser profile on the connection. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

Ask your assistant: “Are my Amazon ads profitable once page reads are counted?”

Ad-attributed Amazon P&L over a date window — spend vs attributed sales/royalties rolled up from the synced Amazon reports. Optional from/to (YYYY-MM-DD); default last 30 days. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

Ask your assistant: “Create a $10 a day Sponsored Products campaign for my paperback with automatic targeting, and leave it paused for me to check.”

Create an Amazon Sponsored Products campaign for a book: campaign, ad group, product ad (the book's ASIN), optional manual keywords, and optional negative keywords (exact/phrase terms the ad must NOT show for) in one chain. REAL MONEY: always created PAUSED — the author starts it from the dashboard's "Start these ads" button (or aa_amazon_ads_campaign_state) after review. The ASIN must come from the book's listing (never guessed). For the other two Amazon products use aa_amazon_ads_create_sb (Sponsored Brands, live) or aa_amazon_ads_create_sd (Sponsored Display) instead — Sponsored Brands is also accepted here as campaignType "sb" and creates the image ad. Requires an enrolled Amazon advertiser profile (aa_amazon_ads_status lists them). Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (15)
NameTypeRequiredDescription
amazonProfileIdstringYesAmazon advertiser profile id (from aa_amazon_ads_status).
namestringYesCampaign name.
campaignType"sp" | "sb"NoWhich Amazon campaign type. "sp" (Sponsored Products) is the default; "sb" (Sponsored Brands) creates the image ad, and aa_amazon_ads_create_sb is the clearer way to ask for it.
asinstringNo10-character ASIN of the advertised book (Sponsored Products).
brandIdstringNoSponsored Brands only: registered brand from aa_amazon_ads_brands.
headlinestringNoSponsored Brands only: headline shown above search results, 50 characters max.
brandLogoAssetIdstringNoSponsored Brands only: logo image id from aa_amazon_ads_brands.
asinsstring[]NoSponsored Brands only: the books the ad showcases. An image ad needs at least three of the pen name's books under its author brand (up to ten); a video ad takes one.
customImageUrlstringNoSponsored Brands only: landscape image (1.91:1) from the creative library to register and show with the headline.
dailyBudgetnumberYesDaily budget in the profile currency; $1 minimum.
targetingType"auto" | "manual"No
keywordsobject[]NoManual targeting only; up to 100.
negativeKeywordsobject[]NoSearches to exclude (works with auto and manual targeting); up to 100.
bidnumberNoDefault CPC bid for the ad group.
profileIdstringNo

Ask your assistant: “Is my Shopify store connected, and what can Reader Radius do with it?”

Show a connected Shopify store (name, domain, currency) and its permissions. When `permissions.complete` is false, tell the user what to do: `fix: grant` means open `grantPermissionsUrl` and approve in Shopify; `fix: custom_app_scopes` means add the missing Admin API scopes to their own custom app and reconnect. Call this first when a product call answers STORE_PERMISSIONS_MISSING. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
profileIdstringNo

Strategy and playbook (2)

The Reader Radius publisher playbook as markdown: how to plan and run book marketing here (trial reels, vertical shorts, 30 days of posts, lead magnets by DM), with example prompts. Read it before planning anyone's marketing, and whenever the user mentions the Reader Radius playbook. Also available as the resource readerradius://playbook.

The author's next steps in Reader Radius, worked out from their account: no connected accounts, no Instagram for trial reels, nothing scheduled in the next 7 days, nothing posted in the last 7, every ad paused, no comment-to-DM rule. Each step says how to fix it, with the page link when the fix is on the website. Use it when the user asks what to do next or seems stuck, and at the start of a planning session. `unchecked` lists checks that couldn't run. Pass profileId for a non-primary pen name.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Accounts and pen names (23)

Create an account group. accountIds are connected-account ids from aa_list_accounts (they must belong to the active pen name). Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
namestringYes
accountIdsstring[]Yes
profileIdstringNo

aa_delete_account_group

Changes or removes

Delete an account group. The member accounts themselves are unaffected — only the grouping is removed. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
groupIdstringYes
profileIdstringNo

aa_delete_guide_set

Changes or removes

Delete a persona entirely (all four guide texts disappear). The server refuses to delete the default persona — every fallback lookup resolves to it, so removing it would leave generations with empty guides. To delete the current default, mark a different persona as the default first via the dashboard, then retry. Returns 404 if the tag doesn't exist on this pen name.

Parameters (2)
NameTypeRequiredDescription
tagstringYes
profileIdstringNo

Live health check for ONE account — token validity, needsReconnect, canPost. Single-account equivalent of aa_get_accounts_health; use when you already know which account to check.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

Per-account diagnostic health: token validity, granted vs missing OAuth scopes, canFetchAnalytics, and recommendations[]. Use this to explain why a platform (e.g. TikTok Personal) is returning no analytics, or to nudge the user to reconnect. Optional platform / status filters.

Parameters (2)
NameTypeRequiredDescription
platformstringNo
statusstringNo

Get AI provider connection flags and account defaults for text, images, video, and music. Never returns plaintext keys.

Get the Facebook Page IDs currently attached to the active pen name (these are the pages the user has opted in for posting / insights). Returns { attachedPageIds: string[] }.

Get a persona — the brand voice the AI uses when writing for a given pen-name profile. A persona has four guides (prose, brand, copywriting, social-media) plus a user-defined name. Read this before drafting captions or campaign content to match the user's voice. One pen name can have many personas — e.g. fiction vs. nonfiction, different genres, different series. Pass `tag` to pick a specific persona by name. Without a tag, returns the user's default persona (the one marked as the fallback for unspecified generations). If you don't know which persona to pick and the user has multiple, call aa_list_guide_sets first to see the options. Persona names are user-defined — the user may have renamed their default to something like 'Cozy Mystery' or 'Author Brand', so don't assume a tag of 'primary' exists.

Parameters (2)
NameTypeRequiredDescription
profileIdstringNo
tagstringNo

List the pen name's account groups — named sets of connected social accounts (e.g. 'Fiction brand', 'All video platforms') used to target several accounts at once. Returns each group's id, name, and member accountIds. Pass profileId for a non-primary pen name.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

List the user's connected social media accounts for a given pen-name profile. Returns account IDs (needed for creating posts), platform names, and usernames. Pass profileId to target a non-primary pen name (call aa_list_profiles first to discover). For large account sets, pass page (1-based) to page through results; the response includes a `pagination` object ({ page, limit, total, pages }) so you can tell when more accounts exist beyond the current page. Omit page to get all accounts.

Parameters (4)
NameTypeRequiredDescription
platformstringNo
pageintegerNo
limitintegerNo
profileIdstringNo

List the Facebook Pages a connected Facebook account can publish to. accountId required (a Facebook account from aa_list_accounts). Returns [{ id, name, username, category, fanCount }]. Call this BEFORE aa_set_attached_facebook_pages to discover available pageIds.

Parameters (1)
NameTypeRequiredDescription
accountIdstringYes

List every persona configured for a pen-name profile. A persona is a distinct brand voice — fiction author, nonfiction coach, cozy mystery series, spicy romance, etc. — each with its own prose / brand / copywriting / social-media guides. Returns [{ tag, is_default, prose_guide, brand_guide, copywriting_guide, social_media_guide, updated_at }]. Exactly one persona has is_default=true; that's the fallback for any aa_get_guides call without an explicit tag. Call this BEFORE aa_get_guides when the user mentions a specific voice / series / sub-brand and you need to pick the right tag (e.g. 'use my Cozy Mystery voice' → list personas, match the tag case-insensitively, then aa_get_guides with that tag). If the user has multiple personas and gave no signal, ASK which to use rather than guessing.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

List LinkedIn organizations (Company Pages) the connected LinkedIn user administers. Use before aa_set_linkedin_organization to pick a valid organization.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

List every pen-name profile the user has access to. Returns each profile's ID, name, and which one is the user's primary. USE THIS FIRST when: - The user mentions a pen name by name (e.g., 'post to my Indie Author Magazine account', 'schedule under chelle') - The user might have multiple pen names — call this once to find out - A previous tool returned an empty result and you suspect you're querying the wrong profile Then pass the chosen profile's ID as the `profileId` argument on subsequent tools (aa_list_accounts, aa_create_post, aa_list_posts, aa_list_campaigns, aa_create_campaign, aa_queue_preview, aa_get_guides). The default behavior (no profileId) targets the user's primary profile.

aa_move_account

Changes or removes

Move a connected social account to another pen-name profile. Pass the account's ID (from aa_list_accounts) and the destination profile's ID (from aa_list_profiles). The account must belong to the current pen name (pass profileId if it lives under a non-primary pen name) and the destination must be a pen name the user can access. Fails with a 409 conflict if the destination pen name already has an account connected on the same platform — each pen name can hold one account per platform; relay that message to the user as-is.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
targetProfileIdstringYes
profileIdstringNo

aa_rename_guide_set

Changes or removes

Rename a persona in-place. Both from_tag and to_tag are required. The persona's is_default flag and all four guide texts travel with the rename — fallback lookups continue to resolve correctly. Returns 404 if from_tag doesn't exist on this pen name; 409 if to_tag already exists (each persona name must be unique per pen name).

Parameters (3)
NameTypeRequiredDescription
from_tagstringYes
to_tagstringYes
profileIdstringNo

Replace the Facebook Page attachment set for the active pen name. pageIds from aa_list_facebook_pages. Pass [] to detach all pages.

Parameters (1)
NameTypeRequiredDescription
pageIdsstring[]Yes

aa_set_facebook_page

Changes or removes

Change which Facebook Page a connected Facebook account publishes to. Call aa_list_facebook_pages first to get valid pageIds.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
selectedPageIdstringYes
profileIdstringNo

Switch a connected LinkedIn account between posting as the personal profile or as an organization (Company Page). accountType 'organization' requires selectedOrganization (from aa_list_linkedin_organizations).

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
accountType"personal" | "organization"Yes
selectedOrganizationobjectNo
profileIdstringNo

aa_update_account

Changes or removes

Rename a connected social account (username and/or display name — whatever the platform allows to be changed via API). To move an account to a different pen name, use aa_move_account instead.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
usernamestringNo
displayNamestringNo
profileIdstringNo

aa_update_account_group

Changes or removes

Rename an account group and/or replace its member accountIds (the array you pass REPLACES the membership — send the full desired set). Only the fields you pass change. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
groupIdstringYes
namestringNo
accountIdsstring[]No
profileIdstringNo

aa_update_ai_settings

Changes or removes

Configure the shared Pollinations account and AI defaults. The key is encrypted and synchronized with StorytellerOS. Omit pollinationsKey to retain it or pass null to clear it.

Parameters (6)
NameTypeRequiredDescription
pollinationsKeystring | nullNo
aiEnabledbooleanNo
preferredTextProvider"pollinations" | "anthropic" | "openai" | "gemini"No
imageProvider"pollinations" | "magnific" | "fal" | "gemini"No
videoProvider"pollinations" | "magnific" | "fal" | "gemini"No
musicProvider"pollinations" | "magnific" | "fal" | "gemini"No

aa_update_guide

Changes or removes

Upsert one or more guide texts under a persona tag. Use to: - Edit an existing guide for a persona (read with aa_get_guides → modify → write back). - Create a new persona by writing initial guide content under a never-before-seen tag. Body is { tag?, prose_guide?, brand_guide?, copywriting_guide?, social_media_guide?, image_style_prompt? } with at least one guide field. Omitting `tag` targets the user's default persona. image_style_prompt is the persona's IMAGE STYLE GUIDE — the visual brand-look document that grounds every AI image for campaigns using this persona (it gets distilled into a short style capsule at generation time). There is deliberately NO account-level image style doc. Empty string clears that field (stored as NULL). When the persona is brand new AND it's the user's first persona on the pen name, the server marks it as the default automatically. Subsequent personas don't change the default. EDITING UX HINT: read the current guide with aa_get_guides, show the user a SHORT diff (what's changing), confirm, THEN write. Don't silently rewrite hundreds of lines.

Parameters (7)
NameTypeRequiredDescription
tagstringNo
prose_guidestringNo
brand_guidestringNo
copywriting_guidestringNo
social_media_guidestringNo
image_style_promptstringNoThe persona's image style guide (visual brand look). Empty string clears it — a cleared persona generates with NO style suffix.
profileIdstringNo

Posts and scheduling (50)

aa_archive_post

Changes or removes

Archive a post — snapshots it into archived_posts (recoverable history) and removes it from the active calendar. For published posts, best-effort calls unpublishPost first (Instagram and TikTok stay live publicly even after archive — surface that caveat to the user). Use when the user says 'archive that post' / 'move this off my calendar' / 'soft-delete'. Pass profileId for posts on a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

aa_batch_update_posts

Changes or removes

Bulk operate on multiple scheduled posts in one call. Three actions: 'delete' (archives + removes from platform — snapshots into archived_posts first, best-effort unpublish for already-published), 'retry' (re-queues failed posts), or 'reschedule' (moves all listed posts to a new scheduledFor time). Cap of 200 deliveryIds per request. Returns per-row { id, ok, error?, status? } so partial failures are visible — the call always returns 200 with a summary, never aborts the whole batch on one bad row.

Parameters (4)
NameTypeRequiredDescription
action"delete" | "retry" | "reschedule"Yes
deliveryIdsstring[]Yes
scheduledForstringNo
profileIdstringNo

Bookmark a tweet via a connected Twitter/X account.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
tweetIdstringYes
profileIdstringNo

Check a list of hashtags for Instagram restrictions (banned, shadowbanned, or otherwise flagged) before using them in a post.

Parameters (1)
NameTypeRequiredDescription
hashtagsstring[]Yes

Create a calendar note. scheduledFor (ISO datetime) is required; title / body / color (hex like #1f6feb) are optional.

Parameters (5)
NameTypeRequiredDescription
scheduledForstringYes
titlestringNo
bodystringNo
colorstringNo
profileIdstringNo

Create a new post label. Both name (1–60 chars) and color (hex like #1f6feb) are required.

Parameters (3)
NameTypeRequiredDescription
namestringYes
colorstringYes
profileIdstringNo

aa_create_post

Changes or removes

Create and schedule a social media post. Use accountIds from aa_list_accounts. Set publishNow:true to post immediately, or scheduledAt for a specific time. ═══ PER-PLATFORM OPTIONS — TWO LAYERS ═══ 1) TYPED options (instagramOptions, tiktokOptions, threadsOptions, etc). Validated locally → fast 422 with a clear suggestion when something's off. 2) RAW platformOptions: { instagram: {...}, threads: {...}, twitter: {...}, ... }. Forwarded directly to the upstream platformSpecificData payload. Use this for anything not in the typed list, OR for platforms we haven't typed yet (twitter, bluesky, telegram, snapchat, googlebusiness, discord, whatsapp). Typed options take precedence; raw fills the rest. Both merge per platform. ═══ INSTAGRAM ═══ Aspect ratios: Feed = 0.75:1 to 1.91:1 (use 1080×1080, 1080×1350, or 1080×566). Stories/Reels = 9:16 single media only (use 1080×1920). If user has 4 vertical (9:16) images for IG, post 4 separate Stories — NOT one carousel. Carousels: up to 10 items, all same media type (no mixing image+video). instagramOptions: contentType: 'story' | 'reel' — omit for Feed (default) coverImage: URL of a 9:16 image — Reel cover coverFromTimestamp: ms into video — Reel cover from a video frame trialParams: { graduationStrategy: 'MANUAL' | 'SS_PERFORMANCE' } — Trial Reel: shown to non-followers first shareToFeed, collaborators, firstComment, audioName, userTags ═══ TIKTOK ═══ tiktokOptions: draft (save to TikTok Inbox to review before publish), privacyLevel (PUBLIC_TO_EVERYONE | MUTUAL_FOLLOW_FRIENDS | FOLLOWER_OF_CREATOR | SELF_ONLY), allowComment, allowDuet, allowStitch (videos only), autoAddMusic (TikTok adds trending music to photo carousels), videoCoverTimestampMs / videoCoverImageUrl, photoCoverIndex, commercialContentType: 'none' | 'brand_organic' | 'brand_content' — when set to anything other than 'none', TikTok REQUIRES the paired flag: brand_organic → isBrandOrganicPost=true; brand_content → brandPartnerPromote=true. Forgetting the pair rejects the post. contentPreviewConfirmed + expressConsentGiven — TikTok policy attestations. Default both to true for any non-draft publish; the user agreed by submitting via the tool. videoMadeWithAi — AI-generated content disclosure (REQUIRED if the video is AI-generated or significantly AI-edited). description — long-form caption for photo carousels (up to 4000 chars; separate from the main caption). ASK THE USER: if they're posting AI-generated video → set videoMadeWithAi=true. If the post promotes a brand or is a paid partnership → set commercialContentType. If they want to review before publishing → draft=true. ═══ THREADS ═══ threadsOptions.topicTag (1–50 chars, NO '.' or '&'). Use platformOptions.threads.threadItems for chains. ═══ YOUTUBE ═══ youtubeOptions.title is REQUIRED for video posts. visibility, madeForKids, containsSyntheticMedia, firstComment, categoryId, playlistId. ═══ REDDIT ═══ redditOptions.subreddit + title both REQUIRED. url, forceSelf, flairId, nsfw, spoiler, nativeVideo (upload to Reddit's video player; default true), videogif (post video as a looping GIF), videoPosterUrl (thumbnail URL for the native video). ═══ FACEBOOK ═══ facebookOptions: contentType ('story' | 'reel'; omit for Feed default), title (Reel title, only honored when contentType=reel), firstComment (Feed-post only; auto-posted as comment 1 below the post). On Pages Meta has limited, it still counts as one of the 2 free link posts a month. draft (true → stages the post as an unpublished draft in Facebook Publishing Tools; expires in ~30 days). ASK THE USER: if they want to review or get sign-off before publishing → draft=true. ═══ LINKEDIN ═══ linkedinOptions: firstComment (LinkedIn DOWN-RANKS posts with external links by 40-50% — put URLs in the first comment, NOT the main caption), disableLinkPreview (suppresses LinkedIn's auto-generated URL card), documentTitle (REQUIRED when posting a PDF/document — headline above the preview). ═══ TWITTER / X ═══ Use platformOptions.twitter for threadItems / poll / replyToTweetId (mutually exclusive with replySettings). replySettings: 'following' | 'mentionedUsers' | 'subscribers' | 'verified' — restricts who can reply. longVideo: true → upload up to ~10 min via amplify_video (requires X Premium + API allowlisting). ═══ PINTEREST ═══ Use platformOptions.pinterest: link (destination URL for each pin), boardId, title, coverImageUrl, coverImageKeyFrameTime. ASK: what URL should the pin send clicks to? (often a book sales link) ═══ EVERYTHING ELSE ═══ Use raw platformOptions: bluesky, telegram, snapchat, googlebusiness, discord, whatsapp. Field names match the platform's verbatim docs. Discord: tts (text-to-speech), webhookUsername (display name override, max 80 chars), webhookAvatarUrl, crosspost (publish to following servers — announcement channels only). Pass width/height on each image mediaItem when known — server skips a probe-fetch and validates IG faster. tags: root-level array of YouTube video tags (≤500 chars total including commas). The network puts this at the post ROOT, not inside youtubeOptions.

Parameters (17)
NameTypeRequiredDescription
contentstringNo
accountIdsstring[]Yes
publishNowbooleanNo
scheduledAtstringNo
timezonestringNo
mediaItemsobject[]No
instagramOptionsobjectNo
tiktokOptionsobjectNo
threadsOptionsobjectNo
youtubeOptionsobjectNo
redditOptionsobjectNo
facebookOptionsobjectNo
pinterestOptionsobjectNo
linkedinOptionsobjectNo
platformOptionsobjectNo
tagsstring[]NoRoot-level YouTube tags (≤500 chars joined). NOT inside youtubeOptions.
profileIdstringNoPen-name profile to post under. Required when the user has multiple pen names and the post should NOT go to the primary. Get IDs from aa_list_profiles.

aa_delete_archived_post

Changes or removes

Permanently delete an archived post snapshot. No undo — this removes the row from archived_posts entirely. Use only when the user explicitly confirms they want to throw away the history (e.g. 'delete that archive permanently' / 'clear out my archive'). For normal soft-delete from the calendar, use aa_archive_post instead. The id is the archived_posts row id from aa_list_archived_posts. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

aa_delete_calendar_note

Changes or removes

Delete a calendar note.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_delete_label

Changes or removes

Delete a label. Removes the label from any posts it was attached to.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_delete_post

Changes or removes

Delete a SCHEDULED post. Already-published posts cannot be deleted via the API — they're already live on the platform. If the user asks to delete a published post, tell them the post is already live and they need to delete it on the platform itself (Facebook, Instagram, etc.) — there's no in-app shortcut. For scheduled posts, this tool removes them cleanly so they don't publish. Pass profileId for posts on a non-primary pen name (same id you used when creating it) — otherwise the server scopes to the primary profile and returns 404.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

Duplicate a post: creates an unscheduled draft copy of an existing scheduled or published post, so the user can change it and then schedule or post it. The copy keeps the caption exactly as written, the media, each account's own caption and media, and every platform option (Pinterest board, Instagram trial reel, privacy, first comment, alt text); it does not copy the schedule, published links, results, labels or campaign membership. It never publishes or schedules anything and never changes the original. Each call makes another draft, so call it once per copy the user asks for. Every account on the original must belong to the pen name; a 422 ACCOUNTS_UNAVAILABLE means one is no longer connected (the user reconnects it at /dashboard/accounts). To schedule the draft afterwards use aa_update_post with the new post id. Pass profileId if the post belongs to a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

Search the user's books and ingested RSS items for content to repurpose into posts. source: 'books' | 'feeds' | 'all' (default all). q is a substring filter.

Parameters (3)
NameTypeRequiredDescription
qstringNo
source"books" | "feeds" | "all"No
profileIdstringNo

Follow a Twitter/X user via a connected account. targetUserId is the target's NUMERIC Twitter user id (not @handle). Protected accounts return pending_follow:true instead of an immediate follow.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
targetUserIdstringYes
profileIdstringNo

Fetch one archived post snapshot by id. The id here is the archived_posts row id (returned by aa_list_archived_posts as _id), NOT the original post id. Use when the user references a specific archived post and you need its full content/media/platforms before deciding whether to restore or permanently delete. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

List posts that the reconciler flagged as 'deleted on the platform' — rows AA knew about that disappeared from the upstream network. Use to explain to the user that posts they're looking for were removed elsewhere (deleted directly on Facebook/Instagram/etc.), or to surface a conflict banner when STOS calendar / dashboard renders. Read-only; resolution (dismiss/restore) happens in the dashboard UI.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Get the labels attached to one post. postId from aa_list_posts.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

Per-platform publish-attempt history for one post — why it failed, retries, HTTP status, timestamps. Use when a post shows failed/partial status and the user asks why. Every row that carries an error also carries `explanation` with `kind` (policy_link, policy, disconnect, rate_limit, media, content, capacity, provider, unknown), `headline` (one sentence naming what happened), `detail`, `fix` (what the author does next) and `retryable`. Read the explanation rather than the raw provider string, and tell the user the `fix`. `explanation.retryable` false means aa_retry_post cannot help until the author changes something.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

Day-by-day engagement (impressions, reach, likes, comments, shares, saves, clicks, views) for ONE post across its platform legs. postId is an upstream post id (from aa_list_posts). Optional fromDate/toDate (YYYY-MM-DD). If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (4)
NameTypeRequiredDescription
postIdstringYes
fromDatestringNo
toDatestringNo
profileIdstringNo

Fetch a subreddit's feed (or the connected account's home feed if subreddit is omitted) via a connected Reddit account.

Parameters (7)
NameTypeRequiredDescription
accountIdstringYes
subredditstringNo
sort"hot" | "new" | "top" | "rising"No
t"hour" | "day" | "week" | "month" | "year" | "all"No
limitintegerNo
afterstringNo
profileIdstringNo

TikTok creator settings (privacy-level options, duet/stitch/comment defaults, max video duration). Fetch before TikTok posting so you can pick a valid privacyLevel for aa_create_post. Optional mediaType (video|photo).

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
mediaType"video" | "photo"No
profileIdstringNo

Fetch a timestamped transcript for a public YouTube video — useful for summarizing or repurposing video content into other posts.

Parameters (1)
NameTypeRequiredDescription
urlstringYes

List archived post snapshots for the active pen name, newest first. Archived posts were soft-deleted via aa_archive_post (or the dashboard's archive action) — they're recoverable history, not live posts. Use when the user asks 'what did I archive' / 'show me my archive' / 'find that post I deleted last week', or before calling aa_restore_archived_post so the user can pick which one to bring back. Optional campaignId filter. Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
limitintegerNo
campaignIdstringNo
profileIdstringNo

List the user's calendar notes — non-publishing annotations (campaign milestones, launch reminders, content themes) that appear on the calendar view. Optional from / to (ISO datetime) window filter.

Parameters (3)
NameTypeRequiredDescription
fromstringNo
tostringNo
profileIdstringNo

List the user's post labels (color-coded tags they attach to posts for organization / filtering). Returns [{ id, name, color }]. Results are paginated (50 per page); the response includes a `pagination` object ({ page, limit, total, pages }). If `total` exceeds the labels returned, page through with page=2, page=3, … before concluding a named label doesn't exist.

Parameters (3)
NameTypeRequiredDescription
pageintegerNo
limitintegerNo
profileIdstringNo

List the user's posts with optional filters. Two read sources: 'mirror' (DEFAULT — local 15-min-synced snapshot, fast, matches what the dashboard shows, survives upstream outages) and 'live' (read-through to the network, always current, costs an upstream API call). Use mirror for general 'what's my week look like?' / 'show me scheduled Threads posts' / 'what published last month?' questions — that's the conversational default. Use live ONLY when (a) the user explicitly says 'check directly' / 'are you sure?' / 'right now', (b) the user just made a change in the dashboard and wants you to see it before the next 15-min sync, or (c) the mirror response shows _oldest_synced_at older than ~1 hour (means the cron lagged). Pass profileId to scope to a specific pen name (default is primary). dateFrom/dateTo accept YYYY-MM-DD or ISO. Status filter accepts scheduled / published / failed / publishing / draft / cancelled / partial. 'partial' (some platform legs published, others failed) is an upstream rollup only — ask for it with source='live', because the mirror stores a per-leg status and never holds 'partial' itself. For a failed or partial post, follow up with aa_get_post_logs to read why.

Parameters (7)
NameTypeRequiredDescription
status"scheduled" | "published" | "failed" | "publishing" | "draft" | "cancelled" | "partial"No
limitintegerNo
pageintegerNo
dateFromstringNo
dateTostringNo
source"mirror" | "live"No
profileIdstringNo

List playlists on a connected YouTube channel. Use to find a valid playlistId for youtubeOptions.playlistId on aa_create_post.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

aa_refresh_post

Changes or removes

Reconcile ONE post against the upstream network — single-post equivalent of aa_refresh_posts. Use when the user is asking about a specific post and you want to make sure your read is current before answering, or when STOS opens an edit dialog and needs fresh state. If upstream returns 404 the post is flagged as deleted-on-platform; response sets deletedOnPlatform=true so the caller can react.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

aa_refresh_posts

Changes or removes

Force an on-demand reconcile of the active pen name's posts from the upstream network into the local mirror. Use this BEFORE a follow-up aa_list_posts (mirror) when the user just made a change in the dashboard, says 'right now' / 'are you sure?', or reports that something looks stale. The mirror normally syncs every 15 min; this triggers a fresh pull immediately. Cost: one upstream listPosts call, ~1-2s. Returns { success, upserted, markedDeleted, syncedAt }.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

aa_remove_bookmark

Changes or removes

Remove a bookmarked tweet via a connected Twitter/X account.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
tweetIdstringYes
profileIdstringNo

Resolve a LinkedIn person or organization profile URL into the URN + ready-to-use mention format for embedding an @mention in a LinkedIn post. displayName is required to get a clickable person mention.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
urlstringYes
displayNamestringNo
profileIdstringNo

aa_restore_archived_post

Changes or removes

Restore an archived post — recreates it as a DRAFT (publishNow=false, no scheduledFor) so the user can edit and reschedule before it goes live. On success the snapshot is deleted from the archive so it doesn't appear in both places. Returns the NEW post id (different from the original — the original was removed when it was archived). Includes a cross-tenant defense: if any account id on the snapshot no longer belongs to this pen name (disconnected/reconnected since archive), the restore fails with a 403 instructing the user to reconnect. The id is the archived_posts row id from aa_list_archived_posts. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

aa_retry_post

Changes or removes

Retry a failed post. Use after the user fixes whatever caused the failure (e.g. reconnected the account, took the link out of the caption, changed an image that violated platform specs). The post must already exist in AA — this re-queues it for publish rather than creating a new post. A 409 with `reason`, `fix` and `kind` means the cause is still present right now, checked against the post as it stands: `kind` policy_link means a non-Meta link is still in the caption or the Facebook first comment (edit the post with aa_update_post to take it out), and `kind` disconnect means the account is still unhealthy (the user reconnects it at /dashboard/accounts). Change that one thing, then retry; retrying unchanged returns the same 409. Any other failure goes through to the publisher, so a media or caption failure the user has already edited is worth one retry. Pass profileId if the post belongs to a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
postIdstringYes
profileIdstringNo

aa_retweet

Changes or removes

Retweet a tweet via a connected Twitter/X account.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
tweetIdstringYes
profileIdstringNo

Search Reddit posts via a connected Reddit account's read access. Optionally scope to one subreddit. Useful for finding content to react to, or research before composing a post.

Parameters (8)
NameTypeRequiredDescription
accountIdstringYes
qstringYes
subredditstringNo
restrict_sr"0" | "1"No
sort"relevance" | "hot" | "top" | "new" | "comments"No
limitintegerNo
afterstringNo
profileIdstringNo

Set the default Pinterest board a connected account posts to when no boardId is specified on a post.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
defaultBoardIdstringYes
defaultBoardNamestringNo
profileIdstringNo

aa_set_default_subreddit

Changes or removes

Set the default subreddit a connected Reddit account posts to when no subreddit is specified.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
defaultSubredditstringYes
profileIdstringNo

aa_set_post_labels

Changes or removes

Replace the labels attached to a post. labelIds must come from aa_list_labels — ids from other pen names are silently dropped. Pass [] to clear all labels.

Parameters (3)
NameTypeRequiredDescription
postIdstringYes
labelIdsstring[]Yes
profileIdstringNo

aa_undo_retweet

Changes or removes

Undo a previous retweet via a connected Twitter/X account.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
tweetIdstringYes
profileIdstringNo

aa_unfollow_twitter_user

Changes or removes

Unfollow a Twitter/X user via a connected account. targetUserId is the target's NUMERIC Twitter user id (not @handle).

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
targetUserIdstringYes
profileIdstringNo

aa_unpublish_post

Changes or removes

Unpublish a post that has already gone live — removes it from the platform while keeping the AA record. Instagram and TikTok don't support unpublish via their APIs; for those, tell the user to delete on the platform itself. Use when the user says 'take that post down' / 'unpublish that' about a post that's already published. With no platform every published copy is unpublished and `results` reports each one. Pass platform (and accountId when the post went to several accounts on it — the call answers ambiguous_account with the choices otherwise) to take down one copy. Pass profileId for posts on a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
postIdstringYes
platformstringNo
accountIdstringNo
profileIdstringNo

aa_update_calendar_note

Changes or removes

Patch a calendar note. Provide at least one of scheduledFor / title / body / color. Pass null for title / body / color to clear that field.

Parameters (6)
NameTypeRequiredDescription
idstringYes
scheduledForstringNo
titlestring | nullNo
bodystring | nullNo
colorstring | nullNo
profileIdstringNo

aa_update_label

Changes or removes

Rename or recolor a label. Provide at least one of name / color.

Parameters (4)
NameTypeRequiredDescription
idstringYes
namestringNo
colorstringNo
profileIdstringNo

aa_update_post

Changes or removes

Update a scheduled post's content or time. Pass profileId for posts that belong to a non-primary pen name (the same id you used when creating the post or campaign) — without it, the server scopes to the user's primary profile and returns 404.

Parameters (4)
NameTypeRequiredDescription
postIdstringYes
contentstringNo
scheduledAtstringNo
profileIdstringNo

aa_update_post_metadata

Changes or removes

Update a PUBLISHED post's platform metadata without republishing — currently YouTube only (title, description, tags, visibility on the live video). postId from aa_list_posts; platform names the leg to update; all other fields forward verbatim. When the post went to several YouTube accounts, include accountId in fields (the call answers ambiguous_account with the choices otherwise). For scheduled (not yet published) posts use aa_update_post instead. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
postIdstringYes
platformstringYesCurrently only 'youtube' is supported upstream.
fieldsobjectYesMetadata fields to update — forwarded verbatim (title, description, tags, …).
profileIdstringNo

Pre-flight a post BEFORE calling aa_create_post. Returns { ok, blockers[], warnings[] } where each entry has { rule, platform, accountLabel, severity, title, fix, message, detail } — surface the `title` + `fix` to the user as guidance, not as 'validation failed'. Catches: account-needs-reconnect / account-disabled / account-disconnected (highest priority — fix before anything else), caption-too-long per platform (Threads 500, X 280, Bluesky 300, IG 2200, etc.), carousel-over-max / carousel-under-min (IG 2-10, X 1-4, Threads 1-20), image/video aspect-ratio mismatches, image-too-large / video-too-large, video-too-long, missing required fields (YouTube title, Reddit subreddit+title), Threads topic-tag rules, empty posts, facebook-link-slot (warn: a non-Meta link in a Facebook caption or first comment spends one of the 2 organic link posts a month a Page without Meta One gets — facebook.com/help/1929252614431792; skipped for Stories and drafts), and instagram-caption-link (warn: an Instagram caption link is never tappable). Pass mediaItems' optional width/height/durationSec/sizeBytes when known so media-spec rules can run; without them only caption + count rules fire. Call proactively when (a) any platform with strict caps is in the target list, (b) media count > 1, (c) you uploaded media with known dimensions, or (d) the user reported recent connection issues.

Parameters (12)
NameTypeRequiredDescription
contentstringNo
accountIdsstring[]Yes
mediaItemsobject[]No
youtubeTitlestringNo
redditSubredditstringNo
redditTitlestringNo
threadsTopicTagstringNo
firstCommentstringNoThe first comment this post would carry. Pass it whenever the post has one: Meta counts a link in a Facebook Page's first comment against the same monthly cap as a link in the caption, so facebook-link-slot cannot see it otherwise. Applies to the Facebook and Instagram accounts in accountIds.
facebookContentTypestringNoPass 'story' when the Facebook legs are Stories. A Story posts no first comment and spends no link slot, so facebook-link-slot stays quiet.
facebookDraftbooleanNoTrue when the Facebook legs are staged as unpublished drafts, which have not counted against the monthly link cap yet.
deepbooleanNoDeep mode: additionally cross-check media URLs and Reddit subreddits against the live platform validators; findings merge in as EXTRA WARNINGS (never blockers — the deep pass fails open). Costs upstream validator calls, so use it for one-off pre-checks, not inside bulk loops.
profileIdstringNo

Full pre-publish dry-run validation against the network's live Tools API — checks content + media + per-platform requirements WITHOUT scheduling anything. platforms is required: array of { platform, accountId, customContent?, platformSpecificData? } (same shape as aa_create_post's internal platforms[]). Any accountId inside platforms[] is ownership-checked. For the app's own local pre-flight checks (used internally by aa_create_post), no separate tool call is needed — that runs automatically.

Parameters (4)
NameTypeRequiredDescription
contentstringNo
platformsobject[]Yes
mediaItemsobject[]No
profileIdstringNo

Character count for a piece of text against every platform's caption limit — quick check before deciding whether to trim. Optional mediaType: "photo" (TikTok photo/carousel post) adds a tiktokPhoto block with separate results for the title (90 chars; a longer caption is shortened on send — sentAs shows the title — and the full caption goes in the description) and the description (4,000 chars; tiktokPhoto.ok is false only when this is over). Optional description measures an explicit TikTok photo description instead of the caption. Without mediaType the response is unchanged.

Parameters (3)
NameTypeRequiredDescription
textstringYes
mediaType"photo" | "video"No
descriptionstringNo

Check whether a subreddit accepts a given post type, requires a flair, or has other posting restrictions. Optional accountId scopes the check to a connected Reddit account.

Parameters (3)
NameTypeRequiredDescription
subredditstringYes
accountIdstringNo
profileIdstringNo

Queues (6)

Create a posting queue. Slots fire on the given timezone at the given days/times. Optional `platforms` scopes the queue to specific networks (multi-platform queue: the next slot fires per-platform independently). Optional `tag` scopes the queue to a specific persona under this pen name (use a value from aa_list_guide_sets). Omit `tag` for a queue shared across personas.

Parameters (7)
NameTypeRequiredDescription
namestringYes
timezonestringYes
slotsobject[]No
activebooleanNo
platformsstring[]No
tagstring | nullNoPersona scope. Omit/null = shared across personas; tag string = scoped to that persona.
profileIdstringNo

aa_delete_queue

Changes or removes

Delete a queue. The queueId must belong to the resolved pen name; the server rejects cross-tenant attempts. Drops the local platforms[] + persona_tag decoration too.

Parameters (2)
NameTypeRequiredDescription
queueIdstringYes
profileIdstringNo

Resolve the NEXT open queue slot without scheduling anything — use it to tell the user exactly when 'add to queue' would publish. Three modes: platforms[] → per-platform slot resolution ({ perPlatform, unresolved }); queueId → that queue's next slot; neither → the pen name's default queue's next slot. Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
platformsstring[]No
queueIdstringNo
profileIdstringNo

List the user's posting queues (queue definitions, not next-slot previews — use aa_queue_preview for that). Each queue has optional per-platform decoration (the `platforms[]` field — e.g., a queue with ["instagram", "tiktok"] populates the next IG slot AND the next TikTok slot independently when a multi-platform post is added). Each queue also has optional persona scope (the `tag` field — NULL means the queue is shared across every persona under this pen name; a tag string scopes the queue to that persona only). Personas come from the user's content guides; see aa_list_guide_sets.

Parameters (3)
NameTypeRequiredDescription
queueIdstringNo
allbooleanNo
profileIdstringNo

Preview upcoming queue slots for a pen-name profile. Pass profileId to inspect a non-primary pen name's queue.

Parameters (2)
NameTypeRequiredDescription
countintegerNo
profileIdstringNo

aa_update_queue

Changes or removes

Update an existing queue. queueId is required; every other field is optional. Tristate semantics on the locally-owned fields: - `platforms`: omit to leave existing platforms untouched; pass [] to clear (= serves any). - `tag`: omit to leave persona scope untouched; pass null to move to shared; pass a string to set.

Parameters (9)
NameTypeRequiredDescription
queueIdstringYes
namestringNo
timezonestringNo
slotsobject[]No
activebooleanNo
setAsDefaultbooleanNo
platformsstring[]No
tagstring | nullNo
profileIdstringNo

Campaigns (8)

Create a new campaign for a pen-name profile. After creating, use aa_save_campaign_plan to add the content plan. Pass profileId to attach the campaign to a non-primary pen name. Pass guideTag to use a specific persona for this campaign's AI generations — call aa_list_guide_sets first if the user mentioned a series, sub-brand, or specific voice. Omitting guideTag uses the user's default persona. The choice persists on the campaign row so regenerations stay on the same voice.

Parameters (15)
NameTypeRequiredDescription
namestringYes
objectivestringYes
post_countintegerNo
platformsstring[]No
content_mix"images_only" | "mostly_images" | "mixed" | "videos_only" | "user_decides"No
media_kind"image" | "video" | "carousel"NoWhat the batch produces. Overrides content_mix.
objective_kind"prelaunch" | "launch" | "sale" | "backlist" | "reader_list" | "meet_author" | "characters_world" | "sell_book" | "teach_concept" | "establish_authority" | "lead_magnet" | "promote_course_service" | "speaking_events" | "other"NoWhat the campaign is FOR — shapes caption arc, tone, and CTA style.
variety"signature" | "balanced" | "wide"NoScene-variety dial: signature = tight on-brand scenes, wide = maximum range.
image_size_keystringNoImage size preset key; omit for platform-derived sizes.
book_idstringNoAnchor the campaign to a book: pulls cover, blurb, reviews, and the book's reference library (labeled quotes/scenes/character docs) into generation automatically.
carousel_slide_countintegerNo
carousel_image_strategy"single_repeated" | "per_slide"Nosingle_repeated = one background image, panel text changes (typography-led BookTok default); per_slide = a fresh image every panel (character reveals).
carousel_recipes("quote_dialogue" | "pov_hook" | "trope_card" | "character_reveals")[]NoCarousel formats to build the batch around; omit/empty = mix all four. Every carousel ends on a CTA panel — the book's real cover when a book is attached.
guideTagstringNo
profileIdstringNo

Write (or rewrite) the captions for a campaign's posts, keyed by post id then platform, using the campaign's themes, the images' visual direction, the pen name's guides and the book. Fills only posts that have no captions unless overwrite is true. Use after a plan exists and the look is approved. Runs in the background: waits up to ~90 s by default (wait: false answers at once; call again to read progress). Returns { status: generating|ready|failed, written, total, error } — written counts posts whose captions are complete for every platform. A partial finish may also carry code: captions_incomplete or captions_write_failed and missing[], the post/platform pairs still needing captions. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
campaignIdstringYes
postIdsstring[]No
overwritebooleanNo
waitbooleanNo
profileIdstringNo

Paint the campaign's ONE look-check sample image before any plan exists: built from the batch's working look (image_style_capsule), the book (title, synopsis, genre; the cover for product_mockups) and the head of the source material. No text model runs. This is the first thing to do after aa_create_campaign; approve the look by setting look_locked_at via aa_update_campaign, then generate the plan and the media. Waits up to ~90 s for the image by default (wait: false returns at once; call again to read the state). Returns { status: generating|ready|failed, url, prompt, error }. Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
campaignIdstringYes
waitbooleanNo
profileIdstringNo

List campaign posts that are still unscheduled — draft / ready / failed campaign posts joined to their parent campaign. Use to resume an unfinished campaign ('you have 6 unscheduled posts in Launch Week — want me to schedule them?') before creating a new one. Pass profileId for a non-primary pen name.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

List the user's campaigns. Pass profileId to scope to a non-primary pen name. Results are paginated (50 per page); the response includes a `pagination` object ({ page, limit, total, pages }). If `total` exceeds the number of campaigns returned, request the next page with page=2, page=3, … before concluding a named campaign doesn't exist.

Parameters (3)
NameTypeRequiredDescription
pageintegerNo
limitintegerNo
profileIdstringNo

aa_save_campaign_plan

Changes or removes

Save the content plan to a campaign. Each plan item should have index, theme, captions per platform, imagePrompt, contentType. index is 1-based (first post = 1); the server renumbers every item to its array position 1..N and returns the saved plan, so read item numbers from the response. Pass profileId for campaigns on a non-primary pen name (same id you used in aa_create_campaign) — without it, the server scopes to the user's primary profile and returns 404 'Campaign not found'.

Parameters (3)
NameTypeRequiredDescription
campaignIdstringYes
planobject[]Yes
profileIdstringNo

aa_schedule_campaign

Changes or removes

Schedule all the campaign's ready posts. Timing is governed entirely by the user's per-platform queues (each platform's queue decides its own cadence) — there is no campaign-level start date or per-post time. Pass profileId for campaigns on a non-primary pen name (same id you used in aa_create_campaign) — without it, the server scopes to the primary profile and returns 404. Pass queueMap ({ platform: queueId }) to pick each platform's queue; when it's omitted and the pen name has more than one queue that posts to every platform, the call fails with AMBIGUOUS_QUEUE (listing queueIds) rather than guessing — retry with queueMap. The response includes warnings[] (day = post number, platform, accountId, rule, title, message, fix): non-blocking notes on posts that were scheduled, e.g. a link in a Facebook first comment using one of the Page's monthly link slots. Relay them to the user.

Parameters (5)
NameTypeRequiredDescription
campaignIdstringYes
timezonestringNo
accountMapobjectNo
queueMapobjectNo
profileIdstringNo

aa_update_campaign

Changes or removes

Update fields on an existing campaign (name, objective, platforms, media_kind, objective_kind, variety, carousel settings incl. carousel_recipes + carousel_image_strategy, book reference selection via reference_doc_ids, guide_tag persona, reference_text). reference_doc_ids: null = use the book's WHOLE reference library (default — future uploads ride along), [] = none, else the explicit doc-id list from aa_list_book_reference_docs. Pass profileId for campaigns on a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
campaignIdstringYes
fieldsobjectYesField → value map. Editable: name, objective, post_count, platforms, status, post_plan, campaign_type, media_kind, media_source, image_style_prompt_override, custom_type_prompt, guide_tag, reference_text, image_size_key, variety, objective_kind, carousel_slide_count, carousel_image_strategy, carousel_recipes, reference_doc_ids, image_style_capsule (the batch's working look, plain words), look_locked_at (ISO timestamp = the author approved the look).
profileIdstringNo

Media library (24)

Save a labeled reference document to a book's library. Pass the TEXT directly (no file upload) — e.g. paste the user's best quotes, a scene excerpt, or character sketches. kind controls HOW generation uses it: 'quotes' are used VERBATIM in captions/slide text and outrank invention; 'scenes' ground image prompts; 'characters' keep names/traits accurate; 'world' drives settings + atmosphere; 'voice' is absorbed into caption voice but never quoted; 'other' is supporting context.

Parameters (5)
NameTypeRequiredDescription
bookIdstringYes
labelstringYesHuman label shown in the app, e.g. 'Best quotes — Book 1'.
kind"quotes" | "scenes" | "characters" | "world" | "voice" | "other"YesWhat this document is — decides when generation uses it.
contentstringYesThe document text (up to ~100K characters).
profileIdstringNo

aa_batch_studio_assets

Changes or removes

Bulk operate on multiple Media Studio assets in one call. Five actions: 'delete' (removes the assets, cleans up any ad carousels that referenced them, and reaps the underlying storage object once nothing else references it), 'move_folder' (files them into folderId, or unfiles them when folderId is null), 'add_tags' (merges tags onto each asset's existing list), 'remove_tags' (removes exact-case matching tags), 'set_tags' (replaces each asset's tag list outright). Cap of 200 assetIds per request. Returns per-row { id, ok, error?, status? } so partial failures are visible — the call always returns 200 with a summary, never aborts the whole batch on one bad row. Use aa_transfer_studio_assets to copy or move assets to a different pen name. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
action"delete" | "move_folder" | "add_tags" | "remove_tags" | "set_tags"Yes
assetIdsstring[]Yes
folderIdstring | nullNomove_folder only; null unfiles.
tagsstring[]NoRequired for add_tags/remove_tags/set_tags.
profileIdstringNo

aa_check_media_status

Changes or removes$29 plan

Check the progress of media generation for a campaign. Pass profileId for campaigns on a non-primary pen name (same id you used in aa_create_campaign) — without it, the server scopes to the primary profile and returns 404.

Parameters (2)
NameTypeRequiredDescription
campaignIdstringYes
profileIdstringNo

Create a folder in the pen name's shared Media Studio library. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
namestringYes
profileIdstringNo

Remove one document from a book's reference library (ids from aa_list_book_reference_docs). Campaigns using the default 'whole library' selection simply stop receiving it.

Parameters (3)
NameTypeRequiredDescription
bookIdstringYes
docIdstringYes
profileIdstringNo

aa_delete_media_folder

Changes or removes

Delete a Media Studio folder. Assets remain in the library and become unfiled. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_delete_studio_asset

Changes or removes

Delete one Media Studio asset from the library (does not touch posts that already used its URL). id from aa_list_studio_assets. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

Download a public post's media (video/images) from another creator's post via the network's Tools API — useful for repurposing/reacting to content. platform is the SOURCE platform of the url (not your posting account).

Parameters (2)
NameTypeRequiredDescription
platform"instagram" | "tiktok" | "twitter" | "youtube" | "linkedin" | "facebook" | "bluesky"Yes
urlstringYes

aa_edit_post_media

Changes or removes

Replace the media (and optionally caption / scheduledAt) on a SCHEDULED or DRAFT post. Under the hood: deletes the original upstream post and creates a new one with the updated payload, because the upstream update path can't swap media on a scheduled container. Returns the NEW post id (different from the original) — route navigation / future updates must use the new id. Published posts cannot be edited this way; tell the user to delete on the platform and create fresh. mediaItems is required (this tool exists to change media).

Parameters (5)
NameTypeRequiredDescription
postIdstringYes
mediaItemsobject[]Yes
contentstringNo
scheduledAtstringNo
profileIdstringNo

aa_generate_media

Changes or removes$29 plan

Kick off image/video generation for a campaign's posts. Poll aa_check_media_status until done. Returns { status: 'started', total } — or { status: 'skipped', reason, message } when there is nothing to do (every post already has its media, or none is eligible), which is a normal answer, not a failure. Pass postIds to (re)generate specific posts — an explicit postIds list processes those posts regardless of status, so regenerating an already-READY post works. Narrow further with slideIndices (0-based slide numbers on a per_slide carousel — regenerate just slide 2 and 5 instead of the whole deck) and retryMissing (fill only the slots a partial run left empty, leaving everything already generated untouched). Both apply to EVERY post the run touches, so pair either one with postIds scoping the single post you mean — that is what the dashboard does. Generated images are normalized to their exact requested dimensions (cover-cropped) so no model's native size ever fails platform validation. Pass profileId for campaigns on a non-primary pen name (same id you used in aa_create_campaign) — without it, the server scopes to the primary profile and returns 404. Provider defaults from Settings are preferences only — pass imageProvider: 'pollinations' to use the included 12-images/day tier (no API key needed) or any provider the user has a key for.

Parameters (11)
NameTypeRequiredDescription
campaignIdstringYes
postIdsstring[]NoRestrict this run to specific campaign posts. Explicitly named posts regenerate even when already ready. Omit for the whole campaign — an empty list is refused rather than quietly meaning 'everything'.
slideIndicesinteger[]NoRestrict a per_slide carousel run to these 0-based slide numbers. Pair with postIds; without it this applies to EVERY post in the run, so a batch would have all its posts cut down to these slides. Omit to do every slide.
retryMissingbooleanNoGenerate only what is still missing, leaving already-generated media alone — the way to finish a run that partly failed rather than paying to redo the whole batch. Pair with postIds; without it this applies to EVERY post in the run.
profileIdstringNo
imageProvider"magnific" | "fal" | "gemini" | "pollinations"NoOverride the image provider for this run only. 'pollinations' with no key on file uses the included 12/day tier.
imageModelstringNoModel id for imageProvider, if you want a specific one.
videoProvider"magnific" | "fal" | "gemini" | "pollinations"NoOverride the video provider for this run only. Pollinations video always requires the user's own Pollinations key.
videoModelstringNoModel id for videoProvider, if you want a specific one.
musicProvider"magnific" | "fal" | "gemini" | "pollinations"NoOverride the music provider for this run only. Pollinations music always requires the user's own Pollinations key.
musicModelstringNoModel id for musicProvider, if you want a specific one.

Register an already-uploaded file in the Media Studio library so it sits beside generations and can be offered as a reference image or video start frame. url must be a file uploaded via aa_upload_media (this app's own storage — arbitrary external hosts are rejected). Image or video only. Pass profileId for a non-primary pen name.

Parameters (8)
NameTypeRequiredDescription
urlstringYes
filenamestringYes
contentTypestringNoDefault image/jpeg.
widthintegerNo
heightintegerNo
folderIdstring | nullNo
tagsstring[]No
profileIdstringNo

List a book's reference library — labeled supplemental documents (quotes, scenes, character sketches, world notes, voice samples) saved to the book and reused by campaign generation to ground captions and image prompts. Find book ids with aa_find_content (source: 'books'). Campaigns attached to the book use the WHOLE library by default; scope a campaign with aa_update_campaign's reference_doc_ids.

Parameters (2)
NameTypeRequiredDescription
bookIdstringYes
profileIdstringNo

List folders in the pen name's shared Media Studio library. Folder ids can be passed to aa_update_studio_asset. Pass profileId for a non-primary pen name.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

aa_list_studio_assets

Changes or removes

List the pen name's Media Studio library — generations AND imported uploads, newest first, 120 per page; pass nextCursor from the previous result to page. Each row has status (generating / completed / failed), storage URL, prompt, and dimensions. Filter with folderId ('none' lists unfiled), tag (exact match), type, q (search prompt/reference name), references (saved references only), provider. Also returns the included-images allowance ({ used, limit } for today — counted per USER across all their pen names). Pass profileId for a non-primary pen name.

Parameters (9)
NameTypeRequiredDescription
cursorstringNo
limitintegerNoDefault 120, max 200.
folderIdstringNoFolder id, or "none" for unfiled assets.
tagstringNo
type"image" | "video" | "audio"No
qstringNo
referencesbooleanNo
providerstringNo
profileIdstringNo

List the tags in use on the pen name's Media Studio library with usage counts, most-used first — use for autocomplete before aa_update_studio_asset or aa_batch_studio_assets. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
qstringNo
profileIdstringNo

aa_set_studio_reference

Changes or removes

Mark or unmark a Media Studio asset as a saved REFERENCE — named references are offered as style anchors (referenceUrls) in future generations. id from aa_list_studio_assets; name labels the reference (max 60 chars). Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
idstringYes
saveAsReferencebooleanYes
namestringNo
profileIdstringNo

Generate standalone media in the Media Studio — images, video, or audio NOT tied to a campaign (for that use aa_generate_media). The result lands in the shared media library (aa_list_studio_assets) and can be used in any post. Images: pick platform size keys (instagram_feed, instagram_story, tiktok, facebook_feed, linkedin, twitter, pinterest, youtube_thumb, bluesky, threads, googlebusiness, reddit, telegram, snapchat, whatsapp), count 1–4 per size, optional referenceUrls (up to 3 library/rehosted image URLs to steer style). Images can run on the INCLUDED tier — 12 generations/day — when no image-provider key is on file. Video/audio are USER-KEY-ONLY (per-second pricing; no included tier): duration, aspectRatio, startImageUrl (opening frame), voice + voiceoverScript (spoken verbatim and muxed). enhance (default true) runs the creative-director prompt rewrite. Pass profileId for a non-primary pen name.

Parameters (14)
NameTypeRequiredDescription
taskType"image" | "video" | "audio"NoDefault image.
promptstringYes
provider"pollinations" | "magnific" | "fal" | "gemini"No
modelstringNo
sizesstring[]NoImage-only: platform size keys (see tool description).
countintegerNo
referenceUrlsstring[]No
durationintegerNo
aspectRatio"9:16" | "16:9"No
startImageUrlstringNo
voicestringNo
voiceoverScriptstringNo
enhancebooleanNo
profileIdstringNo

aa_transfer_studio_assets

Changes or removes

Copy or move assets between the user's pen names. Copy leaves two independent assets (tags travel; folder resets to targetFolderId or unfiled); move re-homes the asset and removes it from the source pen name's carousels. Assets synced from StorytellerOS can be copied, not moved. Both pen names must be accessible to this credential. Get ids from aa_list_profiles and aa_list_studio_assets. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
mode"copy" | "move"Yes
assetIdsstring[]Yes
targetProfileIdstringYes
targetFolderIdstring | nullNo
profileIdstringNo

aa_update_studio_asset

Changes or removes

Update a Media Studio asset's organization metadata. tags replaces the complete tag list; folderId moves the asset to a folder, and null removes it from its folder. Use aa_list_studio_assets and aa_list_media_folders for ids. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
idstringYes
tagsstring[]No
folderIdstring | nullNo
profileIdstringNo

Get a signed URL for uploading media to durable storage. Three-step pattern: 1) Call this tool → returns { uploadUrl, publicUrl }. 2) PUT the file bytes to uploadUrl. YOU do this step. 3) Use publicUrl in a post's mediaItems. publicUrl is PERMANENT — it never expires. Upload each file ONCE, then reuse its publicUrl freely. If a LATER step fails (e.g. aa_create_post errors), retry only that step with the SAME publicUrl — do NOT re-upload the media. Re-uploading on every retry wastes time and tokens and fixes nothing. If step 2 fails with a network error, the user's environment is blocking outbound traffic to storage. In Claude Cowork: Settings → Capabilities → Allow Network Egress should be ON, set to 'All Domains'.

Parameters (3)
NameTypeRequiredDescription
filenamestringYes
contentTypestringYes
sizeintegerNo

Check a media URL's dimensions/codec/size against a platform's requirements before posting. platform and contentType are optional hints.

Parameters (3)
NameTypeRequiredDescription
urlstringYes
platformstringNo
contentTypestringNo

Analytics (16)

Fetch a single activity-log entry by id (from aa_list_activity_logs).

Parameters (2)
NameTypeRequiredDescription
logIdstringYes
profileIdstringNo

Cross-platform post analytics for a pen-name profile (impressions, reach, engagement, etc., per post). Optional fromDate / toDate (YYYY-MM-DD or ISO), platform, accountId filters. Start here for any 'how did my posts perform?' question; drill down with aa_get_daily_metrics or aa_get_facebook_page_insights if needed. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (5)
NameTypeRequiredDescription
fromDatestringNo
toDatestringNo
platformstringNo
accountIdstringNo
profileIdstringNo

Recommended posting times derived from historical engagement. Optional platform narrows the recommendation to one network. Useful when the user asks 'when should I post?' or wants to seed a queue.

Parameters (2)
NameTypeRequiredDescription
platformstringNo
profileIdstringNo

Content-decay analysis — how quickly the pen name's posts stop earning engagement after publishing, useful for deciding repost/recycle cadence. Optional accountId narrows to one connected account; other upstream filter params via `extra`. Pass profileId for a non-primary pen name. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (3)
NameTypeRequiredDescription
accountIdstringNo
extraobjectNoAdditional query params forwarded verbatim to the upstream analytics API.
profileIdstringNo

Daily time-series metrics across platforms — useful for charting follower / engagement growth. Same optional filters as aa_get_analytics.

Parameters (5)
NameTypeRequiredDescription
fromDatestringNo
toDatestringNo
platformstringNo
accountIdstringNo
profileIdstringNo

Facebook Page-level insights (page reach, impressions, engaged users, fan adds, etc.) for ONE Facebook account. accountId is required (connected social account id). Optional since / until (Unix seconds or ISO) and metricType narrow the window. For per-post analytics use aa_get_analytics instead.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
sincestringNo
untilstringNo
metricTypestringNo
profileIdstringNo

Follower counts and growth across the pen name's connected accounts. Optional accountId narrows to one account; other upstream filter params can be forwarded via `extra`. Pass profileId for a non-primary pen name. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (3)
NameTypeRequiredDescription
accountIdstringNo
extraobjectNoAdditional query params forwarded verbatim to the upstream analytics API.
profileIdstringNo

Instagram account-level reach/views/engagement insights for a connected account. Optional metrics (comma list), metricType (total_value|time_series), breakdown, since/until. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (7)
NameTypeRequiredDescription
accountIdstringYes
metricsstringNo
metricType"total_value" | "time_series"No
breakdownstringNo
sincestringNo
untilstringNo
profileIdstringNo

Instagram follower demographics (age / gender / location split) for a connected Instagram account. accountId required (from aa_list_accounts). Optional upstream params (breakdown, timeframe, …) via `extra`. Complements aa_get_instagram_account_insights, which covers reach/engagement. Pass profileId for a non-primary pen name. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
extraobjectNoAdditional query params forwarded verbatim (breakdown, timeframe, …).
profileIdstringNo

LinkedIn analytics for a connected account. WITHOUT `urn`: aggregate account analytics — optional aggregation TOTAL | DAILY, startDate/endDate (YYYY-MM-DD), metrics (comma list). WITH `urn` (a LinkedIn post/share URN): that single post's analytics instead (the other filters don't apply). accountId from aa_list_accounts. Pass profileId for a non-primary pen name. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (7)
NameTypeRequiredDescription
accountIdstringYes
urnstringNoLinkedIn post URN — switches the call to single-post analytics.
aggregation"TOTAL" | "DAILY"No
startDatestringNo
endDatestringNo
metricsstringNoComma-separated metric list.
profileIdstringNo

Reactions breakdown (like/celebrate/support/etc.) for a LinkedIn organization post. urn is the LinkedIn post URN (from analytics or the post record).

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
urnstringYes
cursorstringNo
limitintegerNo
profileIdstringNo

Posting-frequency analysis for the pen name's connected accounts — how often posts go out per platform over time, for spotting gaps versus the intended cadence. Optional accountId narrows to one account; other upstream filter params via `extra`. Pass profileId for a non-primary pen name. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (3)
NameTypeRequiredDescription
accountIdstringNo
extraobjectNoAdditional query params forwarded verbatim to the upstream analytics API.
profileIdstringNo

Plan name, uploads/profiles used vs. limit, and next billing-anchor reset day. NOTE: this reflects the whole shared workspace API key, not just the active pen name — every pen name routed to the same key sees the same numbers.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Day-by-day view counts for a connected YouTube channel. accountId required. If the account is missing the yt-analytics.readonly scope, the response includes scopeStatus.reauthorizeUrl — tell the user to reconnect YouTube via that URL. Optional upstream params (startDate, endDate, …) via `extra`. Pass profileId for a non-primary pen name. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
extraobjectNoAdditional query params forwarded verbatim (startDate, endDate, …).
profileIdstringNo

YouTube viewer age/gender/country demographic split for a connected channel. If the account is missing the yt-analytics.readonly scope, the response includes scopeStatus.reauthorizeUrl — tell the user to reconnect YouTube via that URL. Optional breakdown, startDate, endDate. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
breakdownstringNo
startDatestringNo
endDatestringNo
profileIdstringNo

Unified activity log across your accounts — publishing, connections, webhooks, messaging events. Filtered to accounts you own. Optional filters: action, days, platform, search, status, type (publishing|connections|webhooks|messaging).

Parameters (9)
NameTypeRequiredDescription
actionstringNo
daysintegerNo
limitintegerNo
platformstringNo
searchstringNo
skipintegerNo
statusstringNo
type"publishing" | "connections" | "webhooks" | "messaging"No
profileIdstringNo

Inbox and comments (21)

aa_archive_conversation

Changes or removes

Archive or reactivate an inbox DM conversation thread. status 'archived' hides it from the active inbox; 'active' brings it back.

Parameters (4)
NameTypeRequiredDescription
conversationIdstringYes
accountIdstringYes
status"active" | "archived"Yes
profileIdstringNo

aa_delete_inbox_message

Changes or removes

Delete a sent DM message from a conversation. Supported on Telegram, X, Bluesky, and Reddit. conversationId + messageId from aa_get_inbox_thread; accountId is the connected account that sent it. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
conversationIdstringYes
messageIdstringYes
accountIdstringYes
profileIdstringNo

Remove all Instagram DM ice-breaker prompts from a connected Instagram account.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

aa_delete_messenger_menu

Changes or removes

Remove the Messenger persistent menu from an account.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_edit_inbox_message

Changes or removes

Edit an already-sent DM message — TELEGRAM ONLY (other platforms don't allow edits). conversationId + messageId from aa_get_inbox_thread; accountId is the connected Telegram account. Pass new text and/or replyMarkup (forwarded verbatim). Pass profileId for a non-primary pen name.

Parameters (6)
NameTypeRequiredDescription
conversationIdstringYes
messageIdstringYes
accountIdstringYes
textstringNo
replyMarkupobjectNo
profileIdstringNo

Load full message history for one DM thread. conversationId is required; accountId is optional — the server auto-resolves it from the conversation when omitted. Returns the chronological message list. Pair with aa_send_inbox_message to reply.

Parameters (3)
NameTypeRequiredDescription
conversationIdstringYes
accountIdstringNo
profileIdstringNo

Get the Instagram DM ice-breaker prompts (up to 4 quick-reply questions shown to new DM conversations) on a connected Instagram account.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

Get the Facebook Messenger persistent menu configured for one connected account. id is the connected social account id.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_hide_comment

Changes or removes

Hide (or unhide) a comment on one of the user's published posts. Pass unhide=true to reverse a previous hide. postId + commentId from aa_list_inbox_comments; accountId required (owner of the post).

Parameters (5)
NameTypeRequiredDescription
postIdstringYes
commentIdstringYes
accountIdstringYes
unhidebooleanNo
profileIdstringNo

aa_like_inbox_comment

Changes or removes

Like (or unlike) a comment from the inbox. Supported on Facebook, X, Bluesky, Reddit (where it upvotes), and TikTok. postId + commentId from aa_list_inbox_comments; accountId is the connected account acting. Bluesky quirks: pass the comment's `cid` when liking, and pass `likeUri` (returned by the like) when unliking. Set unlike:true to remove the like. Pass profileId for a non-primary pen name.

Parameters (7)
NameTypeRequiredDescription
postIdstringYes
commentIdstringYes
accountIdstringYes
unlikebooleanNotrue = remove the like instead.
cidstringNoBluesky only, when liking.
likeUristringNoBluesky only, when unliking.
profileIdstringNo

List comments on published posts across connected accounts (e.g., people commenting on your Instagram, Facebook or TikTok posts). Optional accountId / platform filters. Use aa_reply_inbox_comment, aa_hide_comment, aa_like_inbox_comment or aa_pin_inbox_comment (TikTok) to act on entries.

Parameters (3)
NameTypeRequiredDescription
accountIdstringNo
platformstringNo
profileIdstringNo

List DM / messaging conversations across connected accounts. Optional accountId scopes to one social account; optional platform filters by network (instagram, facebook, tiktok, telegram, whatsapp, etc.). TikTok DMs are reply-only (the business can never open a conversation) and need an account connected through TikTok for Business. Returns conversation summaries (id, participants, latest message, unread count) — use aa_get_inbox_thread to load full message history.

Parameters (3)
NameTypeRequiredDescription
accountIdstringNo
platformstringNo
profileIdstringNo

List incoming reviews / ratings on connected accounts (e.g., Facebook Page reviews, Google Business reviews). Optional accountId scopes to one account. Pair with aa_reply_inbox_review to respond.

Parameters (2)
NameTypeRequiredDescription
accountIdstringNo
profileIdstringNo

Pin (or unpin) a top-level comment to the top of a post's comment thread. TikTok only today. postId is the TikTok video id and commentId comes from aa_list_inbox_comments; accountId is the connected TikTok account. Pass unpin=true to remove the pin. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
postIdstringYes
commentIdstringYes
accountIdstringYes
unpinbooleanNo
profileIdstringNo

Reply to a PUBLIC comment with a PRIVATE DM (Facebook / Instagram only — TikTok has no private reply; reply publicly or pin instead) — the classic 'comment X and I'll DM you' move. One private reply per comment, within 7 days of the comment, text message required. postId + commentId from aa_list_inbox_comments; accountId is the account sending the DM. Optional rich-reply fields (buttons, quickReplies, template, messageTag) forward verbatim. Pass profileId for a non-primary pen name.

Parameters (6)
NameTypeRequiredDescription
postIdstringYes
commentIdstringYes
accountIdstringYes
messagestringYes
extraobjectNoRich-reply fields (buttons, quickReplies, template, messageTag) — forwarded verbatim.
profileIdstringNo

aa_react_inbox_message

Changes or removes

Add (or remove) an emoji reaction on a DM message — Telegram and WhatsApp. conversationId + messageId from aa_get_inbox_thread; accountId is the connected account reacting; emoji is the literal emoji character. Set remove:true to clear the reaction. Pass profileId for a non-primary pen name.

Parameters (6)
NameTypeRequiredDescription
conversationIdstringYes
messageIdstringYes
accountIdstringYes
emojistringNoRequired when adding a reaction.
removebooleanNotrue = remove the reaction instead.
profileIdstringNo

aa_reply_inbox_comment

Changes or removes

Reply to a comment on one of the user's published posts. postId + commentId from aa_list_inbox_comments; accountId is the social account that owns the post.

Parameters (5)
NameTypeRequiredDescription
postIdstringYes
commentIdstringYes
accountIdstringYes
messagestringYes
profileIdstringNo

aa_reply_inbox_review

Changes or removes

Reply to a review left on the user's account. id from aa_list_inbox_reviews; accountId is the social account that received the review.

Parameters (4)
NameTypeRequiredDescription
idstringYes
accountIdstringYes
commentstringYes
profileIdstringNo

aa_send_inbox_message

Changes or removes

Send a reply in a DM conversation. Body is forwarded to the upstream messaging API so optional rich-reply fields (buttons, quickReplies, template, messageTag) pass straight through on Meta platforms. TikTok: reply-only, up to 10 messages within 48 hours of the user's last message, text up to 6,000 characters OR one JPG/PNG image (never both); Meta rich-reply fields are dropped. accountId required (the social account that owns the conversation).

Parameters (8)
NameTypeRequiredDescription
conversationIdstringYes
accountIdstringYes
messagestringYes
buttonsobject[]No
quickRepliesobject[]No
templateobjectNo
messageTagstringNo
profileIdstringNo

Set the Instagram DM ice-breaker prompts on a connected Instagram account. Max 4 entries, each { question (≤80 chars), payload }.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
ice_breakersobject[]Yes
profileIdstringNo

aa_set_messenger_menu

Changes or removes

Set / replace the Messenger persistent menu for one account. Body forwarded verbatim to upstream (menu items, locales, composer-input-disabled, etc.).

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

Automations and flows (26)

aa_activate_flow

Changes or removes

Activate or pause an inbox automation flow. active = the flow triggers on live comment/DM events; paused = it stops (parked delayed runs are skipped when they come due). Activation validates the graph first.

Parameters (3)
NameTypeRequiredDescription
flowIdstringYes
activebooleanYestrue to activate, false to pause.
profileIdstringNo

aa_activate_sequence

Changes or removes

Activate a draft or paused sequence — enrolled contacts start/resume moving through its steps.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

Create a comment-automation rule (comment or Instagram story-reply keyword → automatic DM). accountId + name + dmMessage required. Omit platformPostId to watch EVERY post/story on the account. Supports word/contains/exact matching with typoTolerance and excludeKeywords, DM buttons (1-3) or a generic template card carousel, audience targeting with follow gates, message variations, link tracking, and delivery delays.

Parameters (24)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo
namestringNo
trigger"comment" | "story_reply"No
platformPostIdstringNoPlatform media/post id (story media id for story_reply). OMIT for an account-wide any-post/any-story rule.
postTitlestringNo
keywordsstring[]No
matchMode"exact" | "contains" | "word"No
excludeKeywordsstring[]No
typoTolerancebooleanNo
dmMessagestringNo
buttonsobject[]No
templateobjectNoProduct card carousel sent INSTEAD of dmMessage; mutually exclusive with buttons.
commentReplystringNo
dmMessageVariationsstring[]No
commentReplyVariationsstring[]No
linkTrackingbooleanNo
clickTagstringNo
dmDelaySecondsintegerNo
commentReplyDelaySecondsintegerNo
alsoMatchInDmsbooleanNo
audienceobjectNo
followGateobjectNo
isActivebooleanNo

aa_create_flow

Changes or removes

Create an inbox automation flow (free on every plan). Flows start as drafts unless status is set; activate with aa_activate_flow once the graph is right. Example: trigger { kind: 'comment_keyword', keywords: ['guide'] } with a graph replying to the comment then sending a private reply. Any step whose namespace the workspace key doesn't support is skipped at run time with a log entry — no need to pre-check.

Parameters (6)
NameTypeRequiredDescription
namestringYes
triggerobjectYesWhat starts the flow. comment_keyword / dm_keyword need keywords[]; dm_any fires on every inbound DM; new_conversation fires on the first message of a conversation. platforms[] narrows to specific platforms (empty = all; X comments no longer arrive, so comment_keyword never fires on X — X DMs still do); accountIds[] narrows to specific connected accounts (empty = all) — the way to watch every post on one account for comment keywords.
graphobjectYesThe step graph. Node config by type: reply_comment/send_dm/private_reply { message, quickReplies?, buttons? } ({{name}} and {{handle}} personalize), add_tag { tags: string[] }, delay { minutes }, condition { check: 'keyword'|'platform', keywords?, matchMode?, platforms? } (condition nodes take two edges, branch 'yes' and 'no'), handoff_to_human {}. Messages support the rich options the target platform allows.
status"draft" | "active" | "paused"No
settingsobjectNoreentry 'once' (default) runs a flow at most once per conversation/commenter; 'always' re-triggers on every match.
profileIdstringNo

Create a new RSS feed subscription. url is required and must be a valid absolute URL. Optional: title (display label), accountIds (which social accounts get drafts), postTemplate (caption template with placeholders), schedule (cron-like or interval), autoPost (true → publish automatically, false/omitted → leave as draft), enabled.

Parameters (8)
NameTypeRequiredDescription
urlstringYes
titlestringNo
accountIdsstring[]No
postTemplatestringNo
schedulestringNo
autoPostbooleanNo
enabledbooleanNo
profileIdstringNo

Create a multi-step drip sequence (accountId, platform, name, steps[] required). Each step: { order, delayMinutes, message: {text} OR template: {name, language, variableMapping?} }. delayMinutes counts from enrollment for step 1, or from the previous step for later steps. template is WhatsApp-only; variableMapping keys are positional strings ('1','2',...) mapping to { field: 'name'|'phone'|'email'|'company'|'custom', customValue? (required when field is 'custom') }. exitOnReply / exitOnUnsubscribe default true. Activate with aa_activate_sequence once created (it starts in draft).

Parameters (7)
NameTypeRequiredDescription
accountIdstringYes
platformstringYes
namestringYes
stepsobject[]Yes
exitOnReplybooleanNo
exitOnUnsubscribebooleanNo
profileIdstringNo

Delete a comment-automation rule.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_delete_rss_feed

Changes or removes

Delete an RSS feed subscription.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_delete_sequence

Changes or removes

Delete a sequence — stops all active enrollments. No undo.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

Duplicate an inbox automation flow into a new DRAFT named 'Copy of <name>' on the same pen name. The trigger (including any account/post restrictions), every step and the settings are copied exactly; run history and the list of people already handled are not, so once activated the copy can respond to someone the original already answered. The copy never goes live on its own — review it, then use aa_activate_flow. Returns the new flow (its id and status 'draft'). Fails if 'Copy of ' plus the name would exceed 200 characters; rename the source first. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
flowIdstringYesThe flow to copy.
profileIdstringNo

aa_enroll_sequence_contacts

Changes or removes

Enroll one or more contacts into a sequence. Already-enrolled contacts (or ones with no channel matching the sequence's platform) are skipped, not errored. Returns { enrolled, skipped }.

Parameters (3)
NameTypeRequiredDescription
idstringYes
contactIdsstring[]Yes
profileIdstringNo

Recent executions of an inbox automation flow — per-run status (running/waiting/completed/failed/skipped) and the step-by-step walk log, including any steps skipped because the workspace key doesn't support that namespace. Use this to debug why a flow did or did not fire.

Parameters (3)
NameTypeRequiredDescription
flowIdstringYes
limitintegerNo
profileIdstringNo

Get a sequence's full details including its steps.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

List the user's comment-automation rules (e.g., 'auto-DM anyone who comments BOOK on this post'). Returns the active rule set.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

List the active pen name's inbox automation flows (trigger → condition → action graphs that auto-respond to comments and DMs). Free on every plan. Returns each flow's id, name, status (draft/active/paused), trigger, and graph. Pass profileId for a non-primary pen name.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

List the items the feed has ingested (history of headlines + linked posts).

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

List the user's configured RSS feeds. Each feed is polled on a schedule and (when auto_post is on) drafts posts from new items. Health fields: last_error (latest poll error), failing_since (start of a failing streak; null = healthy), failure_kind (payment = the feed service needs payment, gone = 404/410, blocked = 401/403, invalid = not an RSS feed, unreachable = timeouts/5xx), paused_at + pause_reason (set after 14 days failing; a paused feed is not polled or drafted until resumed with aa_update_rss_feed resume=true).

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

List a sequence's enrollments with per-contact progress (currentStepIndex, nextStepAt, stepsSent, exitReason). Optional status filter (active|completed|exited|paused).

Parameters (5)
NameTypeRequiredDescription
idstringYes
statusstringNo
limitintegerNo
skipintegerNo
profileIdstringNo

List drip sequences with enrollment stats. Optional status filter (draft|active|paused).

Parameters (4)
NameTypeRequiredDescription
statusstringNo
limitintegerNo
skipintegerNo
profileIdstringNo

aa_pause_sequence

Changes or removes

Pause an active sequence — enrollments stop advancing and resume where they left off on reactivation.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_poll_rss_feed

Changes or removes

Manually refresh an RSS feed now (don't wait for the next scheduled poll). Returns the new items found.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

Remove one contact from a sequence's active enrollment.

Parameters (3)
NameTypeRequiredDescription
idstringYes
contactIdstringYes
profileIdstringNo

Patch a comment-automation rule — only the fields you pass change. Supports switching trigger between comment and story_reply (Instagram), and every field from aa_create_comment_automation.

Parameters (24)
NameTypeRequiredDescription
idstringYes
profileIdstringNo
namestringNo
trigger"comment" | "story_reply"No
platformPostIdstringNoPlatform media/post id (story media id for story_reply). OMIT for an account-wide any-post/any-story rule.
postTitlestringNo
keywordsstring[]No
matchMode"exact" | "contains" | "word"No
excludeKeywordsstring[]No
typoTolerancebooleanNo
dmMessagestringNo
buttonsobject[]No
templateobjectNoProduct card carousel sent INSTEAD of dmMessage; mutually exclusive with buttons.
commentReplystringNo
dmMessageVariationsstring[]No
commentReplyVariationsstring[]No
linkTrackingbooleanNo
clickTagstringNo
dmDelaySecondsintegerNo
commentReplyDelaySecondsintegerNo
alsoMatchInDmsbooleanNo
audienceobjectNo
followGateobjectNo
isActivebooleanNo

aa_update_flow

Changes or removes

Update an inbox automation flow — rename, replace the trigger or graph, or change settings. Only the fields you pass change. Setting status to 'active' re-validates the graph and fails with a clear message if it is not executable.

Parameters (7)
NameTypeRequiredDescription
flowIdstringYes
namestringNo
triggerobjectNoWhat starts the flow. comment_keyword / dm_keyword need keywords[]; dm_any fires on every inbound DM; new_conversation fires on the first message of a conversation. platforms[] narrows to specific platforms (empty = all; X comments no longer arrive, so comment_keyword never fires on X — X DMs still do); accountIds[] narrows to specific connected accounts (empty = all) — the way to watch every post on one account for comment keywords.
graphobjectNoThe step graph. Node config by type: reply_comment/send_dm/private_reply { message, quickReplies?, buttons? } ({{name}} and {{handle}} personalize), add_tag { tags: string[] }, delay { minutes }, condition { check: 'keyword'|'platform', keywords?, matchMode?, platforms? } (condition nodes take two edges, branch 'yes' and 'no'), handoff_to_human {}. Messages support the rich options the target platform allows.
status"draft" | "active" | "paused"No
settingsobjectNo
profileIdstringNo

aa_update_rss_feed

Changes or removes

Patch an RSS feed. Any subset of the create fields can be updated. resume=true turns a paused feed back on and clears its failure state (so does enabled=true on a paused or disabled feed, or a new url).

Parameters (10)
NameTypeRequiredDescription
idstringYes
resumebooleanNo
urlstringNo
titlestringNo
accountIdsstring[]No
postTemplatestringNo
schedulestringNo
autoPostbooleanNo
enabledbooleanNo
profileIdstringNo

aa_update_sequence

Changes or removes

Update a sequence (name, steps, exit conditions). Can edit an active sequence without pausing it.

Parameters (6)
NameTypeRequiredDescription
idstringYes
namestringNo
stepsobject[]No
exitOnReplybooleanNo
exitOnUnsubscribebooleanNo
profileIdstringNo

Contacts and broadcasts (23)

Add recipients to a DRAFT broadcast. Combine any of: contactIds[] (existing contacts), phones[] (raw numbers for WhatsApp/Telegram — auto-creates contacts), useSegment:true (auto-populate from the broadcast's own segmentFilters). Returns { added, skipped }.

Parameters (5)
NameTypeRequiredDescription
idstringYes
contactIdsstring[]No
phonesstring[]No
useSegmentbooleanNo
profileIdstringNo

Import up to 1,000 contacts at once on a single accountId + platform. Each item in contacts[] needs name + platformIdentifier (and may include email, tags). Duplicates are skipped, not errored. Returns { created, skipped, errors, total }.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
platformstringYes
contactsobject[]Yes
profileIdstringNo

aa_cancel_broadcast

Changes or removes

Cancel a scheduled or in-progress broadcast.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_clear_contact_field

Changes or removes

Clear a custom field's value on a contact (does not delete the field definition).

Parameters (3)
NameTypeRequiredDescription
contactIdstringYes
slugstringYes
profileIdstringNo

Create a broadcast DRAFT (accountId, platform, name required). Add recipients next (aa_add_broadcast_recipients), then aa_send_broadcast or aa_schedule_broadcast. message: { text } for non-WhatsApp platforms. template: WhatsApp only — pre-approved template { name, language, components? }. Create templates via aa_create_whatsapp_template first. segmentFilters: { tags?, isSubscribed? } — used later by aa_add_broadcast_recipients when useSegment:true.

Parameters (7)
NameTypeRequiredDescription
accountIdstringYes
platformstringYes
namestringYes
messageobjectNo
templateobjectNo
segmentFiltersobjectNo
profileIdstringNo

Create a CRM contact. name is required. Pass accountId + platform + platformIdentifier together to also create a messaging channel in the same call (e.g. a WhatsApp number) — omit all three to create a contact with no channel yet (it won't be reachable by any by-id lookup until it gains a channel). Returns 409 on a duplicate identifier.

Parameters (9)
NameTypeRequiredDescription
namestringYes
emailstringNo
tagsstring[]No
accountIdstringNo
platformstringNo
platformIdentifierstringNo
isSubscribedbooleanNo
extraobjectNoAny other contact fields not covered above — forwarded verbatim.
profileIdstringNo

Create a custom-field definition. type 'select' requires options[] (the dropdown choices). slug auto-generates from name if omitted (e.g. 'Job Title' → job_title); 409 if it collides.

Parameters (4)
NameTypeRequiredDescription
namestringYes
type"text" | "number" | "date" | "boolean" | "select"Yes
optionsstring[]No
profileIdstringNo

aa_delete_broadcast

Changes or removes

Delete a DRAFT broadcast. Fails once it's left draft.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_delete_contact

Changes or removes

Permanently delete a contact and all its channels. No undo.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_delete_custom_field

Changes or removes

Delete a custom-field definition — also clears its value on every contact that had it set. No undo.

Parameters (2)
NameTypeRequiredDescription
fieldIdstringYes
profileIdstringNo

Get a broadcast's full config + delivery stats.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

Fetch one contact and all its messaging channels by id.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

List a broadcast's recipients with per-recipient delivery status (pending/sent/delivered/read/failed). Optional status filter.

Parameters (5)
NameTypeRequiredDescription
idstringYes
statusstringNo
limitintegerNo
skipintegerNo
profileIdstringNo

List broadcasts (one-to-many messages sent to a contact segment) with delivery stats. Optional platform/status filters.

Parameters (5)
NameTypeRequiredDescription
platformstringNo
statusstringNo
limitintegerNo
skipintegerNo
profileIdstringNo

List the messaging channels (platform + identifier) on one contact.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

List CRM contacts (people you can DM on Instagram, Facebook, Telegram, Twitter, Bluesky, Reddit, or WhatsApp). Optional filters: search (full text), tag, platform, isSubscribed.

Parameters (7)
NameTypeRequiredDescription
searchstringNo
tagstringNo
platformstringNo
isSubscribed"true" | "false"No
limitintegerNo
skipintegerNo
profileIdstringNo

List custom-field definitions (typed fields you can attach to contacts: text, number, date, boolean, select).

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

aa_schedule_broadcast

Changes or removes

Schedule a broadcast to send at a future scheduledAt (ISO datetime).

Parameters (3)
NameTypeRequiredDescription
idstringYes
scheduledAtstringYes
profileIdstringNo

aa_send_broadcast

Changes or removes

Start sending a broadcast immediately. REAL MESSAGES to real contacts — confirm with the user first.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

aa_set_contact_field

Changes or removes

Set a custom field's value on a contact. slug comes from aa_list_custom_fields (or the auto-slugified field name). value's type must match the field's type (string/number/ISO date/boolean/one of the select options).

Parameters (4)
NameTypeRequiredDescription
contactIdstringYes
slugstringYes
valueanyYes
profileIdstringNo

aa_update_broadcast

Changes or removes

Update a DRAFT broadcast (name/message/template/segmentFilters). Fails once it's left draft.

Parameters (6)
NameTypeRequiredDescription
idstringYes
namestringNo
messageobjectNo
templateobjectNo
segmentFiltersobjectNo
profileIdstringNo

aa_update_contact

Changes or removes

Partially update a contact (name, email, tags, isSubscribed, etc — send only what's changing).

Parameters (7)
NameTypeRequiredDescription
idstringYes
namestringNo
emailstringNo
tagsstring[]No
isSubscribedbooleanNo
extraobjectNo
profileIdstringNo

aa_update_custom_field

Changes or removes

Update a custom field's name and/or options (its type is immutable once created).

Parameters (4)
NameTypeRequiredDescription
fieldIdstringYes
namestringNo
optionsstring[]No
profileIdstringNo

Ads (all networks) (67)

Share one connected ad account with another of the user's pen names: { destination, accountId, sharedWithProfileId, ownerProfileId? (defaults to the active pen name) }. Both pen names must be the user's and the account must be connected on the owner. Reads and launches from the sharee then go upstream as the owner while every campaign row keeps the sharee's pen name. Amazon accounts cannot be shared yet. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
destination"meta" | "tiktok" | "linkedin" | "pinterest" | "x" | "google" | "chatgpt" | "amazon"Yes
accountIdstringYes
sharedWithProfileIdstringYes
ownerProfileIdstringNo
profileIdstringNo

aa_ads_account_share_delete

Changes or removes

End an ad-account share (either the owner or the receiving pen name may). id from aa_ads_account_shares_list. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

List ad-account shares touching the active pen name: accounts other pen names shared with it (receiving) and accounts it shared out (giving). Ad accounts connect under one pen name; a publisher with one Meta ad account and several pen names shares it here. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

What the active pen name can do with ads right now: whether the ads upgrade is active (and the checkout path if not), every destination (Meta, Amazon, TikTok, ChatGPT, LinkedIn, Google, Pinterest, X) with its connection state, ad accounts (own and shared from other pen names), pixel state and setup facts (destinations connected, tracking ready, first ad created). Call this before connecting, tracking or creating anything. Pass profileId for a non-primary pen name.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

aa_ads_groups_assign

Changes or removes

Assign campaigns to a campaign group and/or remove campaigns from it, in one batch (up to 200 refs). A campaign belongs to ONE group at a time so spend is never counted twice — assigning a campaign that already sits in another group answers 409; unassign it there first. Refs are { network, campaignId } from aa_list_all_ads. addedBy defaults to manual. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
idstringYesGroup id from aa_ads_groups_list.
assignobject[]No
unassignobject[]No
addedBy"wizard" | "manual" | "suggestion"No
profileIdstringNo

Create a campaign group (a human label that rolls ads up across networks). Optional author target drives the winner/loser verdict: targetMetric roas | acos | cpc with a positive targetValue (both or neither). Optional breakEvenRoas ('I need 1.8× to break even') is the fallback verdict rule when no target is set; startedOn (YYYY-MM-DD) overrides the 7-day 'too early' clock. Names are unique per pen name (case-insensitive) — a duplicate answers 409. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (6)
NameTypeRequiredDescription
namestringYes
targetMetric"roas" | "acos" | "cpc"No
targetValuenumberNo
breakEvenRoasnumberNo
startedOnstringNoYYYY-MM-DD
profileIdstringNo

List the active pen name's campaign groups — human labels like 'Curses launch Sep 26' that roll ads up across every network — with each group's optional author target (roas | acos | cpc), break-even ROAS, start date and member count. Use aa_ads_groups_rollup for spend, ROAS and the winner/loser verdict. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

The goal-to-result view: every campaign group with cross-network spend, reported revenue, ROAS, clicks, CPC, /day budget, per-platform chips, mapped books, member campaigns and a verdict (winning | watch | losing | too_early | no_data with the reason), plus the Ungrouped bucket with name-match suggestions and the pen-name summary strip. The response also carries `campaigns` and `accounts` for the same window — every unified campaign and connected account, so callers don't need a separate campaigns fetch just to cross-reference a group member. Verdicts wait 7 days and judge against the author's target first, then the group's break-even ROAS, else say no_data honestly. window: 7d | 30d (default) | 90d | lifetime (capped at the 90 days the networks report). Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
window"7d" | "30d" | "90d" | "lifetime"No
profileIdstringNo

aa_ads_groups_update

Changes or removes

Rename a campaign group or change its verdict rules — targetMetric/targetValue (set both, or pass both as null to clear), breakEvenRoas, startedOn. Only the fields you pass change. id from aa_ads_groups_list. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (7)
NameTypeRequiredDescription
idstringYes
namestringNo
targetMetric"roas" | "acos" | "cpc" | nullNo
targetValuenumber | nullNo
breakEvenRoasnumber | nullNo
startedOnstring | nullNoYYYY-MM-DD or null
profileIdstringNo

The generative prompt the look panel will paint this ad draft's sample from — the look in plain words turned into the scene the image model receives. Read-only: nothing is painted and nothing is saved, so an agent can show the author the prompt before they approve the look. Edit it by saving the draft, then paint. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
draftIdstringYesAd draft id (from aa_list_campaign_drafts).
profileIdstringNo

Search Meta's or LinkedIn's public ad archive to see what similar authors are running. Meta (no account needed): query = keywords (write them in the ads' language), or pageIds for specific Facebook Pages. Returns per ad: advertiser (Page name), pageId, body text variants, link titles, start/stop dates, publisher platforms (Facebook, Instagram, …), languages and libraryUrl (the ad's public Ad Library page, which shows the creative). countries defaults to GB,IE and status to ACTIVE. Meta's archive only includes ordinary ads that ran in the EU or UK (for a year after they ran); ads that ran only in the US never appear, so don't claim US-only results. Optional: platforms (FACEBOOK,INSTAGRAM,…), mediaType (IMAGE|VIDEO|…), searchType (KEYWORD_EXACT_PHRASE for a phrase). LinkedIn: query = the advertiser's Page name; needs a connected LinkedIn ads account (accountId). limit up to 50 (LinkedIn 25); pass the result's nextCursor as after for the next page. Degrades to available:false with a reason instead of failing.

Parameters (13)
NameTypeRequiredDescription
querystringNoKeywords (Meta) or the advertiser's Page name (LinkedIn). Required unless pageIds is given.
platform"meta" | "linkedin"No
countriesstringNoComma-separated ISO country codes the ads reached. Meta default GB,IE; ordinary ads are only archived for the EU and UK.
status"ACTIVE" | "INACTIVE" | "ALL"NoMeta only. Default ACTIVE.
platformsstringNoMeta only. Comma-separated: FACEBOOK, INSTAGRAM, AUDIENCE_NETWORK, MESSENGER, THREADS.
mediaType"ALL" | "IMAGE" | "MEME" | "VIDEO" | "NONE"No
searchType"KEYWORD_UNORDERED" | "KEYWORD_EXACT_PHRASE"No
pageIdsstringNoMeta only. Comma-separated Facebook Page ids (max 10), e.g. a pageId from an earlier result.
limitintegerNo
afterstringNonextCursor from the previous page.
accountIdstringNo
bookIdstringNo
profileIdstringNo

Google Ads keyword ideas expanded from seed terms. Requires a connected Google Ads account; returns available:false with a reason otherwise.

Parameters (4)
NameTypeRequiredDescription
seedKeywordsstring[]Yes
accountIdstringNo
bookIdstringNo
profileIdstringNo

Adopts a specific version of a plan: stamps it adopted and points the plan at it. Prior versions stay immutable — adopting never edits them.

Parameters (3)
NameTypeRequiredDescription
planIdstringYes
versionIdstringYes
profileIdstringNo

Creates a draft ads strategy plan from a situation brief (workType, genre, catalogDepth, distribution, budgetPosture, compliance flags, and nonFictionPurpose for non-fiction). Optionally scoped to a book. Does not generate a version yet — call aa_ads_strategy_plan_generate next.

Parameters (3)
NameTypeRequiredDescription
situationobjectYes
bookIdstringNo
profileIdstringNo

Generates a new version of a plan: runs the deterministic house playbook always, and — unless includeCreative is set to false for a power user who wants to review the numbers first — also generates stage-4 creative (personas, messaging angles, hooks) grounded on the book's real reviews. Never mutates an existing version; always inserts a new one. The version's contract also carries `testPlan`: six sequential single-variable click tests (hook, headline, proof, image, primary text, stress), 12 ideas each as four angles by three versions, $30 a day for 24–36 hours until each idea has been seen by about 400 people, winners carried forward. Hooks carry angleIndex and the creative carries a visual look for the image test.

Parameters (6)
NameTypeRequiredDescription
planIdstringYes
includeCreativebooleanNo
bookTitlestringNo
synopsisstringNo
asinstringNo
profileIdstringNo

Gets one ads strategy plan with all of its versions, each carrying the assembled contract (playbook decisions + creative + provenance).

Parameters (2)
NameTypeRequiredDescription
planIdstringYes
profileIdstringNo

Lists this pen name's ads strategy plans (draft, adopted, archived) with their situation brief and current version id.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Validates a proposed targeting spec against the live catalog before it's shown to the author — call this AFTER a targeting spec has been proposed, not to browse targeting blind. Returns available:false on platforms without a pre-flight estimate (Google, TikTok).

Parameters (6)
NameTypeRequiredDescription
accountIdstringYes
adAccountIdstringYes
specobjectYes
optimizationGoalstringNo
bookIdstringNo
profileIdstringNo

Buckets a book's real reader reviews into pain points, trigger moments, objections, transformations and ad-ready phrases, plus a 1-5 quality score. Flags when there are fewer than 20 reviews. Grounded on the book's actual reviews — never fabricates a quote. Requires an ASIN on the book.

Parameters (3)
NameTypeRequiredDescription
bookIdstringYes
asinstringNo
profileIdstringNo

Judge a click test. Without confirm it only READS the run's results (per-idea impressions, clicks, CTR, which ideas are still under the 400-people floor, and the suggested winners — the top share by CTR) so the author can decide. With confirm: true it records the winners you pass (creative ids from the results), marks the run judged, and returns `nextTest` (the next test's order and wizard link) with `held` updated. Judging is refused with 409 while any idea is under 400 people unless override: true, which is recorded on the run. Winners are never chosen automatically — always show the author the results and get their confirmation before calling with confirm. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
runIdstringYes
winnersstring[]NoCreative ids to record as winners (from the run's results). Required with confirm.
overridebooleanNoJudge anyway while some ideas are under the 400-people floor. Recorded on the run.
confirmbooleanNofalse/omitted: read results only. true: record the winners.
profileIdstringNo

Lists this pen name's click-test runs — one per test launched from a strategy plan (which test, its ideas' ads, the values held constant, status draft/running/judged/superseded, and the judged winners) — plus `held`, the winner values the next test carries forward. Pass planId to scope to one plan, or runId to read ONE run's live results: impressions, clicks and CTR per idea, which ideas have reached the 400-people floor, and the suggested winners. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
planIdstringNo
runIdstringNo
profileIdstringNo

aa_boost_post

Changes or removes

REAL MONEY — boost an already-published post as a paid ad. accountId (connected social account) and adAccountId (platform act_*) are required, plus ONE of: postId (a post published through this app) or platformPostId (the native post id — required for Meta business-login connections). status: PAUSED (default to this unless the user explicitly asks to launch live) or ACTIVE. name and goal are optional (defaults: an auto name, goal 'engagement'). goal is one of engagement, traffic, awareness, video_views, lead_generation, conversions, app_promotion. budget: { type: 'daily'|'lifetime', amount }. schedule: { startDate, endDate } (endDate required for lifetime). callToAction only together with linkUrl — a callToAction without a link is dropped. targeting: structured object — ageMin/ageMax, gender ('all'|'male'|'female'), countries, regions/cities/zips/metros ([{ key }] from aa_search_ad_targeting), interests, advantage_audience (0|1). Meta extras places, neighborhoods, excludedLocations and customAudienceIds are also accepted. rawTargeting: paste raw Meta targeting JSON instead of building it with `targeting`. MUTUALLY EXCLUSIVE with targeting — pass one or the other, never both (the server 422s). Networks: Meta, TikTok, LinkedIn, Google, Pinterest (goals vary per network; budget minimums TikTok $20 / Pinterest $5). adAccountId comes from aa_list_ad_accounts — Google/LinkedIn/ Pinterest connections may return none, in which case boosting is not possible for that account. ChatGPT and Amazon ads are reporting-only (no boost). ALWAYS confirm budget + duration with the user before calling. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (13)
NameTypeRequiredDescription
postIdstringNo
platformPostIdstringNo
accountIdstringYes
adAccountIdstringYes
namestringNo
goal"engagement" | "traffic" | "awareness" | "video_views" | "lead_generation" | "conversions" | "app_promotion"No
status"PAUSED" | "ACTIVE"No
budgetobjectNo
scheduleobjectNo
targetingobjectNo
rawTargetingobjectNo
extraobjectNoAny other boostPost fields not covered above (e.g. linkUrl + callToAction, adSetId, destinationType) — forwarded verbatim.
profileIdstringNo

Start an OAuth flow to connect an AD account (Meta / TikTok / LinkedIn / Pinterest / Google Ads) to the active pen name. Use when the user asks to 'connect Facebook Ads' / 'add my TikTok ad account' / 'hook up Google Ads' — distinct from aa_list_accounts which lists organic social accounts. platform takes the underlying OAuth platform (facebook / instagram / linkedin / tiktok / twitter / pinterest / googleads); the resulting connected account-platform is metaads / googleads / etc. Returns either `{authUrl}` for a fresh OAuth (open in browser, complete consent), or `{alreadyConnected:true, accountId}` when ads scopes are already on the underlying social account. Separate-token platforms (tiktok, twitter) require the parent social account to already be connected — connect organic first via aa_list_accounts → reconnect flow. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on. Optional redirect_url for a custom callback target. When the pen name has several accounts on that platform (two Facebook Pages, say) the call returns code ACCOUNT_CHOICE_REQUIRED with `accounts` — ask the user which one and call again with that accountId. A `reconnect_required` refusal carries an `authUrl` that repairs the connection. Meta only: loginMode 'business' connects for ads with no posting account; force starts a fresh OAuth.

Parameters (6)
NameTypeRequiredDescription
platform"facebook" | "instagram" | "tiktok" | "linkedin" | "googleads" | "pinterest" | "twitter"Yes
redirect_urlstringNo
accountIdstringNo
loginMode"classic" | "business"No
forcebooleanNo
profileIdstringNo

aa_connect_openai_ads

Changes or removes

Store OpenAI/ChatGPT ads credentials for the active pen name — plumbing connection, not a full OAuth flow. Pass the OpenAI Ads API key. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
apiKeystringYes
profileIdstringNo

Create an empty Meta product catalog (commerce) under the ad account's business. Only when aa_list_ad_catalogs shows none to reuse: catalogs are not cheap to clean up. Fill it from the author's Shopify store with aa_create_catalog_sync. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYesThe connected Meta account id from aa_list_accounts (facebook, instagram or metaads).
namestringYes
adAccountIdstringNo
businessIdstringNo
profileIdstringNo

aa_create_catalog_sync

Changes or removes

Keep a connected Shopify store synced into a Meta product catalog, so catalog ads show the store's books with their own covers and prices. accountId is the Shopify store (aa_list_accounts, platform shopify); catalogAccountId the Meta account whose login writes to the catalog (usually the same Meta account used for ads); catalogId from aa_list_ad_catalogs. Then start it with aa_run_catalog_sync. Confirm with the user first. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
catalogAccountIdstringYesThe connected Meta account id from aa_list_accounts (facebook, instagram or metaads).
catalogIdstringYes
profileIdstringNo

aa_create_ctwa_ad

Changes or removes

REAL MONEY — create a Click-to-WhatsApp ad (an ad whose CTA opens a WhatsApp conversation with the user's business number). accountId is the connected social account; all other fields (creative, budget, targeting, WhatsApp number binding) forward verbatim to the upstream CTWA API. Default to paused unless the user explicitly says launch live, and ALWAYS confirm budget + duration first. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
extraobjectNoAll CTWA fields (creative, budget, targeting, …) — forwarded verbatim.
profileIdstringNo

aa_create_lead_form

Changes or removes

Create a Meta lead-generation form. accountId (connected social account) + adAccountId (platform act_*) + formType + questions[] + privacyPolicy are required. Optional contextCard, thankYouPage, block/organic toggles. Upstream also requires the form's name and privacyPolicyUrl; pass them in extra. contextCard and thankYouPage are passed through untranslated; for the intro card and thank-you screen prefer extra.platformSpecificData.contextCard and the thankYouTitle / thankYouBody / thankYouButtonText / thankYouWebsiteUrl fields in extra. If you send extra.platformSpecificData at all, it must also carry the questions (extra.platformSpecificData.questions) besides the top-level questions. Returns the new form's id: pass it to aa_create_standalone_ad as extra.leadGenFormId with extra.goal 'lead_generation'. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (9)
NameTypeRequiredDescription
accountIdstringYes
adAccountIdstringYes
formTypestringYes
questionsobject[]Yes
privacyPolicyobjectYes
contextCardobjectNo
thankYouPageobjectNo
extraobjectNoAny other lead-form fields (headline, block/organic toggles, etc) — forwarded verbatim.
profileIdstringNo

aa_create_standalone_ad

Changes or removes

REAL MONEY — create a brand-new ad (not boosting an existing post). accountId + adAccountId required. Never pass postId or platformPostId: those make it a boost (postId is stripped here; use aa_boost_post for existing posts). The body is forwarded as-is, so ad fields go FLAT inside `extra` — nested creative/budget objects are not translated. A typical ad: extra: { name, goal: 'traffic', status: 'PAUSED', headline, body, imageUrl, linkUrl, callToAction: 'LEARN_MORE', budgetAmount: 20, budgetType: 'daily'|'lifetime', startDate, endDate } (lifetime budgets need endDate) Always pass status 'PAUSED' (it works on every network) unless the user explicitly says launch live; PAUSED holds the new campaign with its ad set and ad switched on. Start it in-app with aa_update_ad_campaign_status, never in a network's own ads manager. Google Performance Max and Demand Gen are always created paused and need their nested `assetGroup` / `demandGen` payloads in extra. Lead ads: aa_create_lead_form first, then extra: { goal: 'lead_generation', leadGenFormId }. Catalog ads (Meta only, goal 'catalog_sales'): Meta builds one ad per product from a catalog, with each product's own image. Pick a set first: aa_list_ad_catalogs → aa_list_ad_catalog_product_sets (a Shopify store fills a catalog via aa_create_catalog_sync). extra: { goal: 'catalog_sales', promotedObject: { productSetId, pixelId, customEventType: 'PURCHASE', productCatalogId? }, headline, body, linkUrl, callToAction: 'SHOP_NOW', budget fields }. Copy may use tags like {{product.name}}. One template only: no imageUrl, video, creatives, carouselCards, adSetId, dynamicCreative or placementAssets (refused with a 400 naming them). targeting (forwarded as-is): countries, regions, cities, zips, metros, ageMin/ageMax, gender ('all'|'male'|'female'), languages, interests (ids from aa_search_ad_interests), excludedLocations: { countries, regions, cities, zips }. Age and gender apply on Meta, TikTok, Pinterest, LinkedIn, X and Google Search/Display; languages everywhere but ChatGPT; Google interests only on Search/Display. ChatGPT takes none of age, gender, languages or interests, and Google Performance Max / Demand Gen refuse age, gender and interests. A field a network can't use is refused with an error naming it, not ignored. rawTargeting: raw Meta targeting JSON (places, neighborhoods, custom audiences). It is the base layer and `targeting` merges on top; usually pass one or the other. Networks: Meta (full fields incl. creatives/bid/lead forms), TikTok (imageUrl may be a video URL; min budget $20), LinkedIn (LinkedIn conversions run as a boost), Google (campaignType search|display, also pmax|demand_gen; goals engagement/traffic/awareness; keywords, businessName, longHeadline; headline max 30 / body max 90), Pinterest (boardId optional; headline max 100 / body max 500; $5 min), ChatGPT (openaiads account; goals traffic/awareness/conversions), X. Goals differ by network (Pinterest: engagement/traffic/awareness/video_views); an unsupported goal is refused. adAccountId comes from aa_list_ad_accounts; if a connection lists none, connect that network's ads with aa_connect_ads_account first (ChatGPT: aa_connect_openai_ads). Amazon: use aa_create_amazon_campaign. ALWAYS confirm budget + duration with the user before calling. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (9)
NameTypeRequiredDescription
accountIdstringYes
adAccountIdstringYes
budgetobjectNo
targetingobjectNo
rawTargetingobjectNo
creativeobjectNo
leadFormIdstringNo
extraobjectNoAny other createStandaloneAd fields not covered above (e.g. objective, duration, name) — forwarded verbatim.
profileIdstringNo

aa_delete_ad_set

Changes or removes

Delete an ad set (cancels its ads; returns { deleted, adCount }). The ad set must contain at least one ad owned by the pen name — empty ad sets are refused and should be removed in the platform's own ads manager. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
adSetIdstringYes
profileIdstringNo

aa_delete_ad_video

Changes or removes

Delete a video from the Meta ad account library (numeric Meta video id). accountId + adAccountId required. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
videoIdstringYes
accountIdstringYes
adAccountIdstringYes
profileIdstringNo

aa_delete_catalog_sync

Changes or removes

Stop syncing a Shopify store into a Meta catalog. This removes the sync, not the catalog itself. Confirm with the user first. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
syncIdstringYes
profileIdstringNo

Draft a full ad campaign for a book — validated audiences (interests checked against the ad platform's live catalog), hooks, a conservative budget suggestion, and an objective — as a REVIEWABLE DRAFT. Never creates an ad and never spends anything; hand the draft to the user, then build for real with aa_create_standalone_ad once approved. Provide bookId OR the inline `book` object, plus accountId (the connected social account whose ad platform to validate against, from aa_list_accounts). audienceCount 2–3, hookCount 3–5. Runs on the user's own text-LLM key (code ai_settings_required when unset). Each hook now carries tactic, awarenessStage and angle alongside headline, copy, imagePrompt and style — the same shape the ad wizard's creatives use, so a draft can seed a click test directly. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (6)
NameTypeRequiredDescription
bookIdstringNo
bookobjectNoInline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library.
accountIdstringYes
audienceCountintegerNo
hookCountintegerNo
profileIdstringNo

aa_generate_ad_copy

Reads$29 plan

Generate ad hooks + body copy for a book (the Creative Studio copy pass). Provide bookId OR the inline `book` object, a style angle, and count (variations, 1–6, default 3). Optional directive (campaign goal) and hooks (pre-approved headlines the copy must use). Runs on the user's OWN text-LLM key (missing/disabled AI settings return code ai_settings_required / ai_key_missing — point them at Settings → AI Providers). Feed the returned hook/adBody/imagePrompt into aa_generate_ad_creative or aa_generate_ad_video. With perHook: true (and hooks), writes one complete ad per hook — its own headline, primary text, description and CTA, no two ads sharing an opening — returning `copy` keyed by hook-1, hook-2, … and then by network; use this for a click test where every idea is a complete ad. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (9)
NameTypeRequiredDescription
bookIdstringNo
bookobjectNoInline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library.
style"clean" | "promotional" | "hook" | "hook-high-stakes" | "mockup" | "reviews"YesVisual/copy angle: clean (cover-forward), promotional (offer-led), hook (curiosity headline), hook-high-stakes (dramatic), mockup (device/scene mockup), reviews (social proof).
countintegerNo
directivestringNoCampaign objective — every variation must serve it.
hooksstring[]NoPre-approved hooks the copy must build on (one variation per hook, in order).
perHookbooleanNoWrite one complete ad per hook (own headline, primary text, description, CTA) instead of a shared copy pass. Requires hooks.
network"meta" | "google" | "tiktok" | "linkedin" | "pinterest" | "x" | "openai" | "amazon"NoNetwork whose copy limits apply when perHook is set; default meta.
profileIdstringNo

Generate ad IMAGES for a book in the Creative Studio. Provide bookId (a book in the user's library) OR the inline `book` object (title metadata from anywhere else). Pick a visual style, 1–3 ad formats (ad_square 1:1, ad_portrait 4:5, ad_story 9:16, ad_landscape 1.91:1, ad_pin 2:3), and count (variations per format, 1–6). Optional hook (headline for typography styles), adBody + scenePrompt from a prior aa_generate_ad_copy pass. Image generation can run on the INCLUDED tier — 12 generations/day shared across image features — when the user has no image-provider key on file; with a key it uses their provider. Results land in the shared creative library (aa_list_ad_creatives). Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (10)
NameTypeRequiredDescription
bookIdstringNoBook id from the user's library. Omit when passing `book`.
bookobjectNoInline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library.
style"clean" | "promotional" | "hook" | "hook-high-stakes" | "mockup" | "reviews"YesVisual/copy angle: clean (cover-forward), promotional (offer-led), hook (curiosity headline), hook-high-stakes (dramatic), mockup (device/scene mockup), reviews (social proof).
formats("ad_square" | "ad_portrait" | "ad_story" | "ad_landscape" | "ad_pin")[]Yes
countintegerNo
hookstringNo
adBodystringNo
scenePromptstringNo
enhancebooleanNoCreative-director scene rewrite before generation (default true).
profileIdstringNo

Write hook text for the ideas in one ad draft — the line each ad leads with, kept in that idea's own tactic and awareness stage. Provide bookId OR the inline `book` object, plus the ideas to write for (1–12, each with its own id and optionally tactic, awarenessStage and angle). Included in every plan, and never counted against the daily image allowance. Answers `hooks` keyed by idea id, plus `missing` for any idea the model skipped. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (6)
NameTypeRequiredDescription
bookIdstringNoBook id from the user's library. Omit when passing `book`.
bookobjectNoInline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library.
ideasobject[]YesThe ideas to write hooks for.
personaTagstringNoBrand-guide persona whose voice the hooks use.
directivestringNoCampaign objective every hook must serve.
profileIdstringNo

Generate a short ad VIDEO for a book. Provide bookId OR the inline `book` object. USER-KEY-ONLY: video models are priced per second, so there is NO included/shared tier — the user must have their own video-provider key configured or this returns a friendly add-a-key message. Options: style, aspectRatio 9:16 (default) or 16:9, duration seconds, hook (steers the emotional beat, never rendered as text), optional voiceoverScript (spoken VERBATIM and muxed over the clip), useCoverStartFrame (default true — opens on the book cover). Results land in the shared creative library. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (13)
NameTypeRequiredDescription
bookIdstringNo
bookobjectNoInline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library.
style"clean" | "promotional" | "hook" | "hook-high-stakes" | "mockup" | "reviews"NoVisual/copy angle: clean (cover-forward), promotional (offer-led), hook (curiosity headline), hook-high-stakes (dramatic), mockup (device/scene mockup), reviews (social proof).
aspectRatio"9:16" | "16:9"No
modelstringNoVideo model id; omit for the catalog default.
durationintegerNo
hookstringNo
adBodystringNo
scenePromptstringNo
useCoverStartFramebooleanNo
voiceoverScriptstringNo
enhancebooleanNo
profileIdstringNo

Get one ad by id. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

Performance metrics for one ad — impressions, clicks, spend, conversions over its run. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

List the campaign → book-title mappings for the active pen name (which book each ad campaign advertises). Returns [{ network, campaignId, titleId, titleLabel }]. Used to group unified-ads rows by book. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Hierarchical campaign → ad-set → ad view across the user's ad accounts. Use for navigating the structure before drilling into one ad. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

'Analyze my ads' — builds a compact cross-network performance summary over the window and runs it through the user's own text-LLM key, returning up to 5 recommendations tied to named campaigns. NOTHING is auto-applied — relay recommendations to the user and act only on their say-so via the pause/status tools. Requires the user's AI settings to be configured (missing key returns code ai_settings_required — point them at Settings → AI Providers). Optional accounts[]/from/to same as aa_list_all_ads. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountsstring[]No
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

Daily spend + results points per network across every connected ad account, merged into one flat series — the data behind the all-ads trend chart. Optional accounts[] filter and from/to window (YYYY-MM-DD, default last 30 days). Response includes `currencies` (more than one means mixed-currency totals — don't sum them blindly) and per-account `errors` for partial failures. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountsstring[]NoConnected-account ids to include; omit for all.
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

Read one Shopify → Meta catalog sync: runStatus, lastRunStartedAt/lastRunFinishedAt, lastError and item counts. Poll this after aa_run_catalog_sync. syncId from aa_list_catalog_syncs. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
syncIdstringYes
profileIdstringNo

List the platform ad accounts (act_*) reachable from one connected social account. accountId is the connected social-account id (from aa_list_accounts). Returns the platform ad-account ids needed for boost / audience / interest calls. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

List custom audiences for one ad account. All three of accountId (connected social account), adAccountId (platform act_*), and platform are required. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
adAccountIdstringYes
platformstringYes
profileIdstringNo

List the business centers reachable from a connected ad account (TikTok Business Center hierarchy). accountId is the connected social account from aa_list_accounts. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

List the user's ad campaigns across connected ad accounts. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

List the pen name's ad carousels — ordered sets of square (ad_square) creative-library images assembled for carousel ad placements — with hydrated card thumbnails. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

List the product sets in one Meta catalog (id, name, productCount). A catalog ad advertises one set: pass its id as promotedObject.productSetId to aa_create_standalone_ad with goal catalog_sales. catalogId from aa_list_ad_catalogs. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYesThe connected Meta account id from aa_list_accounts (facebook, instagram or metaads).
catalogIdstringYes
profileIdstringNo

List the Meta product catalogs a Meta ad account's business owns (id, name, productCount). Call this first for catalog ads or a Shopify catalog sync. Pass adAccountId (act_..., from aa_list_ad_accounts) so the right business portfolio is used; when the Meta login sees several portfolios and neither adAccountId nor businessId is given, the 400 carries details.businesses to pick from. Empty list: create one with aa_create_ad_catalog. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYesThe connected Meta account id from aa_list_accounts (facebook, instagram or metaads).
adAccountIdstringNo
businessIdstringNo
profileIdstringNo

aa_list_ad_creatives

Changes or removes

List generated ad creatives (images + videos) in the active pen name's creative library, newest first, including generation status and the shared included-tier allowance ({ used, limit } per day). Optional batchId narrows to one generation batch. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
batchIdstringNo
profileIdstringNo

List the Meta ad account's VIDEO LIBRARY (previously-uploaded ad videos). Each row's video id is reusable on ad creation (video.id / videoId) and `source` is a playable signed CDN preview URL. accountId + adAccountId required; `after` continues paging. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
adAccountIdstringYes
afterstringNo
limitintegerNo
profileIdstringNo

List ads across the user's connected ad accounts. Optional accountId / platform / status filters. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountIdstringNo
platformstringNo
statusstringNo
profileIdstringNo

Normalized campaign list across EVERY connected ad network in one call — Meta, Google, TikTok, LinkedIn, Pinterest, X, ChatGPT, and Amazon — each row with status, spend, results, and any book-title mapping attached (see aa_get_ad_title_map). Optional accounts[] (connected-account ids from aa_list_accounts) narrows the sweep; from/to (YYYY-MM-DD) sets the window, default last 30 days. Partial network failures come back in `errors` rather than failing the whole call. Start here for any 'how are all my ads doing?' question. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountsstring[]NoConnected-account ids to include; omit for all.
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

List a connected Shopify store's syncs into Meta product catalogs: runStatus (pending, running, succeeded, failed), last run times, lastError, and counts (itemsSent, itemsSkipped = not on the online store or no image, itemsDeleted). Check here before creating a sync. Shopify only; WooCommerce catalogs go through the StorytellerOS WordPress plugin. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
profileIdstringNo

List Meta lead-generation forms available on an ad account. Use before aa_create_standalone_ad for a LEADS-objective ad. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

Deterministic ads performance engine — scores every campaign in the window with a fixed profitability decision tree (no LLM, no key needed; same inputs always give the same verdicts) and flags creative fatigue (spend up, results down, last 7 days vs prior 7). Returns per-campaign verdicts + suggested actions. SUGGESTIONS ONLY — never applies anything; confirm with the user, then act via aa_update_ad_campaign_status. Optional accounts[]/from/to same as aa_list_all_ads. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountsstring[]No
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

aa_run_catalog_sync

Changes or removes

Start a full sync of the Shopify store into its Meta catalog now. Runs in the background: poll aa_get_catalog_sync for runStatus and counts. Products that are not published to the online store, or have no image, are skipped. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
syncIdstringYes
profileIdstringNo

Search the targeting-interests catalog (e.g., look up 'cozy mystery' to find Meta's interest id for ad targeting). accountId required (connected social account); q is the search term. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
qstringYes
profileIdstringNo

Search the ad platform's full targeting catalog — geo locations, and other targeting entities beyond plain interests (aa_search_ad_interests covers interests only). accountId is the connected social account; q the search term. Optional extra query params (e.g. type, geoType 'all', lat, lng) are forwarded verbatim. Use the returned ids inside the `targeting` object of aa_boost_post / aa_create_standalone_ad. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
qstringYes
extraobjectNoAdditional query params forwarded verbatim (type, geoType, lat, lng, …).
profileIdstringNo

aa_set_ad_title_map

Changes or removes

Map one ad campaign to a book title (or clear the mapping). network is the normalized network id (meta | google | tiktok | linkedin | pinterest | x | openai | amazon); campaignId from aa_list_all_ads. titleLabel is the display name; titleId optionally links a known book record. Omit BOTH titleId and titleLabel to clear the mapping. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
network"meta" | "google" | "tiktok" | "linkedin" | "pinterest" | "x" | "openai" | "amazon"Yes
campaignIdstringYes
titleIdstringNo
titleLabelstringNo
profileIdstringNo

Pause or resume a paid ad campaign. This flips the campaign's own switch only: pausing stops all delivery under it, resuming restarts the ad sets and ads that are switched on (any paused on their own stay paused), except on Google, where resuming a campaign also switches its ad groups and ads back on. id is the platform campaign id; accountId is the connected social account (tenant boundary); platform names the network. REAL MONEY — confirm with the user before resuming a paused campaign. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
idstringYes
accountIdstringYes
platformstringYes
status"active" | "paused"Yes
profileIdstringNo

Update the brand identity (custom display name and/or avatar) shown on a connected TikTok-ads account's ads. Field contract isn't published in our docs — pass fields the way the upstream TikTok-ads brand-identity API expects (e.g. displayName, avatarUrl); they forward verbatim. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
fieldsobjectYesBrand-identity fields to update, forwarded verbatim upstream.
profileIdstringNo

Upload a standalone video to the Meta ad account library for reuse across ads. Provide exactly one of videoUrl (public https, downloaded server-side) or videoBase64 (~4.5MB cap). Returns the reusable video id (+ thumbnailUrl when Meta has produced a poster). accountId + adAccountId required. Pass profileId for a non-primary pen name.

Parameters (6)
NameTypeRequiredDescription
accountIdstringYes
adAccountIdstringYes
videoUrlstringNo
videoBase64stringNo
filenamestringNo
profileIdstringNo

Amazon Ads (10)

Register an image or video with Amazon's creative assets so a Sponsored Brands or Sponsored Display ad can show it. The url must be a file in the author's own creative library (aa_list_studio_assets / aa_generate_ad_creative produce those) — an outside link is refused. Sub types the live API takes: LOGO for a brand logo, LIFESTYLE_IMAGE for a custom image, BACKGROUND_VIDEO for a video. Returns the assetId Amazon's create calls take. Nothing is launched and no money moves. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (7)
NameTypeRequiredDescription
amazonProfileIdstringYesAmazon advertiser profile id (from aa_amazon_ads_status).
urlstringYesCreative-library file URL for the image or video.
namestringYesName Amazon shows for the asset.
assetType"IMAGE" | "VIDEO"Yes
assetSubTypeListstring[]NoAmazon asset sub-types, e.g. ["LOGO"], ["LIFESTYLE_IMAGE"] or ["BACKGROUND_VIDEO"].
brandIdstringNoRegistered brand to file the asset under (from aa_amazon_ads_brands). Required for a Sponsored Brands logo or custom image.
profileIdstringNo

Registered Amazon brands an advertiser profile can advertise under, and that brand's logo images when brandId is given. An empty list means the profile isn't in Amazon Brand Registry. Read-only — nothing is created and no money moves. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
amazonProfileIdstringYesAmazon advertiser profile id (from aa_amazon_ads_status).
brandIdstringNoReturn this brand's logo images alongside the brand list.
profileIdstringNo

Enable (start) or pause one Amazon campaign from inside the app — the in-app twin of the Start/Pause button, no Amazon console needed. Works for Sponsored Products and Sponsored Brands; Sponsored Display is accepted and refused until it is verified. REAL MONEY: ENABLED starts spending the campaign's daily budget immediately; confirm with the user first. campaignId + amazonProfileId (from aa_amazon_ads_campaigns / aa_amazon_ads_status) required. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (6)
NameTypeRequiredDescription
campaignIdstringYesAmazon campaign id.
amazonProfileIdstringYesAmazon advertiser profile id that owns the campaign.
state"ENABLED" | "PAUSED"Yes
adProduct"sp" | "sb" | "sd"NoWhich Amazon campaign type this id belongs to: "sp" (Sponsored Products, the default), "sb" (Sponsored Brands) or "sd" (Sponsored Display). Sponsored Display answers "Sponsored Display isn't enabled yet." until it is verified.
namestringNoOptional campaign name to store locally.
profileIdstringNo

Per-campaign Amazon Ads rollups (spend, sales, clicks, impressions, ACOS) over a date window. Optional from/to (YYYY-MM-DD); default last 30 days. Covers every synced Amazon advertiser profile on the connection. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

aa_amazon_ads_create_sb

Changes or removes

Create an Amazon Sponsored Brands campaign for a pen name's books — the banner above search results carrying the author's brand logo, a headline and a row of book covers: campaign, ad group and the product-collection ad in one chain. Sponsored Brands is live. REAL MONEY: always created PAUSED — the author starts it from the dashboard's "Start these ads" button (or aa_amazon_ads_campaign_state) after review. Needs a brand-registered Amazon profile: take brandId and brandLogoAssetId from aa_amazon_ads_brands. This tool creates the image ad; the video ad is built by the ad wizard, which registers the video itself. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (11)
NameTypeRequiredDescription
amazonProfileIdstringYesAmazon advertiser profile id (from aa_amazon_ads_status).
namestringYesCampaign name.
dailyBudgetnumberYesDaily budget in the profile currency; $1 minimum.
brandIdstringYesRegistered brand this ad runs under (from aa_amazon_ads_brands).
headlinestringYesHeadline shown above search results, 50 characters max.
brandLogoAssetIdstringYesBrand logo image id (from aa_amazon_ads_brands).
asinsstring[]YesThe books the ad showcases. An image ad needs at least three of the pen name's books under its author brand (up to ten); a video ad takes one.
customImageUrlstringNoLandscape image (1.91:1) from the creative library to register and show with the headline.
keywordsobject[]NoSearch terms the banner should show for; up to 100.
bidnumberNoDefault CPC bid for the ad group.
profileIdstringNo

aa_amazon_ads_create_sd

Changes or removes

Create an Amazon Sponsored Display campaign for one book — the ad that follows readers around Amazon and off it, aimed at similar products, browse categories or shopper audiences rather than search terms. Sponsored Display is live. REAL MONEY: always created PAUSED — the author starts it from the dashboard's "Start these ads" button (or aa_amazon_ads_campaign_state) after review. Amazon requires the bid under HALF the daily budget. The ad shows the book's listing image with the headline over it; sending the author's own image needs two crops of one registered asset, which only the ads wizard can do. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (10)
NameTypeRequiredDescription
amazonProfileIdstringYesAmazon advertiser profile id (from aa_amazon_ads_status).
namestringYesCampaign name.
dailyBudgetnumberYesDaily budget in the profile currency; $1 minimum.
asinstringYes10-character ASIN of the advertised book.
targeting"similar_products" | "categories" | "audiences"YesWhat the ad chases: "similar_products" (books like this one), "categories" (browse categories, with categoryIds) or "audiences" (shoppers who viewed or bought in the genre).
categoryIdsstring[]NoAmazon browse-category ids; required when targeting is "categories".
customImageAssetIdstringNoIgnored for now, and the reply says so: Amazon takes a Sponsored Display image as two crops of one registered asset, which needs the asset's version and pixel size, so an asset id alone cannot be used. The ad runs on the book's listing image; the ads wizard sends the author's own image.
headlinestringNoHeadline over the ad's image. Always shown, image or no image.
bidnumberNoDefault CPC bid for the ad group. Amazon requires it under HALF the daily budget.
profileIdstringNo

Ad-attributed Amazon P&L over a date window — spend vs attributed sales/royalties rolled up from the synced Amazon reports. Optional from/to (YYYY-MM-DD); default last 30 days. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
fromstringNoYYYY-MM-DD; default 30 days ago.
tostringNoYYYY-MM-DD; default today.
profileIdstringNo

Amazon Ads connection status for the active pen name — whether an Amazon Ads account is connected, which advertiser profiles are synced, and the most recent report-sync jobs. Campaigns can be created (aa_create_amazon_campaign) and started/paused (aa_amazon_ads_campaign_state) from here. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

aa_amazon_ads_sync_now

Changes or removes

Trigger a fresh Amazon Ads report sync for the active pen name's connection. Report generation is asynchronous on Amazon's side — numbers can take minutes to land; re-check with aa_amazon_ads_status / aa_amazon_ads_campaigns afterwards. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Create an Amazon Sponsored Products campaign for a book: campaign, ad group, product ad (the book's ASIN), optional manual keywords, and optional negative keywords (exact/phrase terms the ad must NOT show for) in one chain. REAL MONEY: always created PAUSED — the author starts it from the dashboard's "Start these ads" button (or aa_amazon_ads_campaign_state) after review. The ASIN must come from the book's listing (never guessed). For the other two Amazon products use aa_amazon_ads_create_sb (Sponsored Brands, live) or aa_amazon_ads_create_sd (Sponsored Display) instead — Sponsored Brands is also accepted here as campaignType "sb" and creates the image ad. Requires an enrolled Amazon advertiser profile (aa_amazon_ads_status lists them). Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (15)
NameTypeRequiredDescription
amazonProfileIdstringYesAmazon advertiser profile id (from aa_amazon_ads_status).
namestringYesCampaign name.
campaignType"sp" | "sb"NoWhich Amazon campaign type. "sp" (Sponsored Products) is the default; "sb" (Sponsored Brands) creates the image ad, and aa_amazon_ads_create_sb is the clearer way to ask for it.
asinstringNo10-character ASIN of the advertised book (Sponsored Products).
brandIdstringNoSponsored Brands only: registered brand from aa_amazon_ads_brands.
headlinestringNoSponsored Brands only: headline shown above search results, 50 characters max.
brandLogoAssetIdstringNoSponsored Brands only: logo image id from aa_amazon_ads_brands.
asinsstring[]NoSponsored Brands only: the books the ad showcases. An image ad needs at least three of the pen name's books under its author brand (up to ten); a video ad takes one.
customImageUrlstringNoSponsored Brands only: landscape image (1.91:1) from the creative library to register and show with the headline.
dailyBudgetnumberYesDaily budget in the profile currency; $1 minimum.
targetingType"auto" | "manual"No
keywordsobject[]NoManual targeting only; up to 100.
negativeKeywordsobject[]NoSearches to exclude (works with auto and manual targeting); up to 100.
bidnumberNoDefault CPC bid for the ad group.
profileIdstringNo

Ads tracking (26)

Amazon Attribution for the pen name: whether any Amazon advertiser profile is enrolled, and the last 30 days of attributed purchases, sales, Kindle Unlimited pages read (KENP) and estimated KENP royalties from tagged off-Amazon clicks. Read-only: to record the enrollment on the tracking profile, pass amazon_attribution_status to aa_ads_tracking_update. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Fetch the author's bridge page (the link's bridge_url, or url) and report what it does: which pixels are on it (Meta, TikTok, Pinterest, LinkedIn, Tag Manager, Google, X), whether it forwards, how long it waits before forwarding, and whether it passes the query string through. Public https pages only. Marks the bridge live when a pixel is present and the forward waits at least 300 ms. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (3)
NameTypeRequiredDescription
idstringYes
urlstringNo
profileIdstringNo

Read the active pen name's tracking setup: wizard position, per-destination pixel/tag state (created / verified / skipped, server events, event match quality), and every link the ads send people to (own store, retailer, signup page) with its bridge page, short link, Amazon Attribution tag and Kindle Unlimited flag. Start here before creating ads that optimize for purchases. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Record one destination's tracking setup for the pen name: status (not_started | in_progress | ready | skipped), tag_id (the browser pixel code: the `id` from aa_ads_tracking_tags_list) / tag_name / tag_source (created | existing | manual), api_tag_id (the list's `apiId` when it differs from `id`, as on TikTok and X; the event and store-install tools take it), site_kind, install_method, capi_enabled + capi_source (server events), advanced_matching (Meta: also flips it on the pixel), custom_conversion_id, conversion_destination_id, skip_reason. account_id names the connected ads account when the pen name has several. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (16)
NameTypeRequiredDescription
network"meta" | "tiktok" | "linkedin" | "google" | "pinterest" | "x" | "openai" | "amazon"Yes
account_idstringNo
status"not_started" | "in_progress" | "ready" | "skipped"No
tag_idstring | nullNo
api_tag_idstring | nullNo
tag_namestring | nullNo
tag_source"created" | "existing" | "manual" | nullNo
site_kindstring | nullNo
install_methodstring | nullNo
capi_enabledbooleanNo
capi_sourcestring | nullNo
advanced_matchingboolean | nullNo
custom_conversion_idstring | nullNo
conversion_destination_idstring | nullNo
skip_reasonstring | nullNo
profileIdstringNo

Create a pixel on a connected Meta, ChatGPT, TikTok, LinkedIn, Pinterest or X ads account: { network, accountId, adAccountId, name }; Pinterest also takes automaticMatchingFields. NOT idempotent on Meta, ChatGPT, TikTok or Pinterest (and those pixels cannot be deleted): list first with aa_ads_tracking_tags_list and reuse an existing pixel; a second create within 30 seconds is refused. LinkedIn and X hold one tag per ad account. Records the pixel on the pen name's tracking setup; when TikTok or X don't report the pixel code, the answer says needsPixelCode: ask the author for the code (or pick it from aa_ads_tracking_tags_list) and save it with aa_ads_tracking_setup_update. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (6)
NameTypeRequiredDescription
network"meta" | "openai" | "tiktok" | "linkedin" | "pinterest" | "x"Yes
accountIdstringYes
adAccountIdstringYes
namestringYes
automaticMatchingFieldsstring[]No
profileIdstringNo

List the pixels / tracking tags on one connected ads account for Meta, ChatGPT, TikTok, LinkedIn, Pinterest or X (optionally scoped by adAccountId). Each tag's id is the browser pixel code to save as tag_id; apiId is the id the event and store-install tools take (they differ on TikTok and X; save apiId as api_tag_id). Google and Amazon answer manualOnly. accountId is the connected ads account id from aa_list_ad_accounts. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
network"meta" | "tiktok" | "linkedin" | "google" | "pinterest" | "x" | "openai" | "amazon"Yes
accountIdstringYes
adAccountIdstringNo
profileIdstringNo

Update the pen name's tracking profile: wizard_step (1-7), expected_daily_spend, primary_goal, completed_at / skipped_at, amazon_attribution_status. Only the fields you pass change. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (7)
NameTypeRequiredDescription
wizard_stepintegerNo
expected_daily_spendnumber | nullNo
primary_goalstring | nullNo
completed_atstring | nullNo
skipped_atstring | nullNo
amazon_attribution_status"unknown" | "enrolled" | "not_enrolled"No
profileIdstringNo

Is the pixel working? mode status (installed / last fired / broken, Meta), stats (event counts over `days`, Meta), quality (event match quality 0-10 per event, Meta; destinationId = pixel id), test_event (sends one PageView with your Events Manager testCode, Meta), manual (mark verified by hand, any destination). Writes the verdict onto the pen name's tracking setup. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (8)
NameTypeRequiredDescription
mode"status" | "stats" | "quality" | "test_event" | "manual"Yes
network"meta" | "tiktok" | "linkedin" | "google" | "pinterest" | "x" | "openai" | "amazon"Yes
accountIdstringYes
tagIdstringNo
destinationIdstringNo
testCodestringNo
daysintegerNo
profileIdstringNo

Create a pixel (tracking tag) on one connected ads account: Meta, ChatGPT, TikTok, LinkedIn, Pinterest or X. Body { adAccountId, name }; Pinterest also takes automaticMatchingFields (em, ph, fn, ln, ge, db, ct, st, zp, country, external_id). NOT idempotent on Meta, ChatGPT, TikTok or Pinterest and none of those pixels can be deleted: list first with aa_list_tracking_tags and reuse an existing pixel. LinkedIn and X hold one tag per ad account. TikTok names: at most 40 characters, unique. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
idstringYes
adAccountIdstringYes
namestringYes
automaticMatchingFieldsstring[]No
profileIdstringNo

Create a conversion event (purchase, lead, add to cart...) on one tracking tag so ads can measure and optimize toward it. Pass the platform's own type (e.g. PURCHASE) or a neutral siteEvent. Each platform stores a subset of the fields and answers 400 naming the ones it supports. NOT idempotent on most platforms: list first with aa_list_tracking_tag_events. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (16)
NameTypeRequiredDescription
idstringYes
tagIdstringYes
adAccountIdstringNo
namestringNo
typestringNo
siteEvent"page_view" | "view_content" | "add_to_cart" | "search" | "initiate_checkout" | "add_payment_info" | "purchase"No
enabledbooleanNo
defaultValuenumberNo
currencystringNo
clickWindowDaysintegerNo
viewWindowDaysintegerNo
urlContainsstringNo
primarybooleanNo
alwaysUseDefaultValuebooleanNo
countingType"one" | "every"No
profileIdstringNo

Remove a conversion event from a tracking tag. Platforms without a hard delete archive or disable it instead; the answer's state says which (deleted, archived, disabled). eventId from aa_list_tracking_tag_events. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
idstringYes
tagIdstringYes
eventIdstringYes
adAccountIdstringNo
profileIdstringNo

Is this pixel live on the author's Shopify store? install.installed is true when the store fires this tag; installedTagId names the tag of that platform the store fires now, and tags lists every pixel the store runs through the one-click install. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
idstringYes
tagIdstringYes
storeAccountIdstringYes
adAccountIdstringNo
profileIdstringNo

Install a pixel on the author's connected Shopify store in one click (storefront and checkout, no theme edits): the store then reports page views, product views, add to cart, checkout and purchases to it. Documented for Meta, ChatGPT, LinkedIn and Pinterest; other platforms answer 501. id is the pixel's ads account, tagId from aa_list_tracking_tags, storeAccountId a connected Shopify account (aa_list_accounts, platform shopify). Safe to repeat; installing another pixel of the same platform replaces the old one (replacedTagId). A store connected before pixel support answers 409 reconnect_required with details.authUrl: send the author there to re-approve, then retry. WordPress/WooCommerce is not handled here. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
idstringYes
tagIdstringYes
storeAccountIdstringYes
adAccountIdstringNo
profileIdstringNo

List the conversion destinations (pixels / datasets) available on a connected ad account — the ids needed before sending server-side conversion events with aa_send_ad_conversions. accountId from aa_list_accounts. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

List the conversion events on one tracking tag (Google conversion actions, LinkedIn conversion rules, Meta custom conversions, TikTok pixel events, Pinterest custom events, X web events, ChatGPT event settings). id is the ads account id, tagId from aa_list_tracking_tags. adAccountId picks the ad account on platforms that keep events per ad account. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (4)
NameTypeRequiredDescription
idstringYes
tagIdstringYes
adAccountIdstringNo
profileIdstringNo

List the pixels / tracking tags on one connected ads account (Meta, ChatGPT, TikTok, LinkedIn, Pinterest, X, Google). id is the connected ads account id. Each tag's id is what the per-tag tools (events, store install) take.

Parameters (2)
NameTypeRequiredDescription
idstringYes
profileIdstringNo

Take a pixel off the author's Shopify store. Other platforms' pixels stay. Safe to repeat (nothing installed answers installed: false); answers 409 when the store fires a different pixel of the same platform. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
idstringYes
tagIdstringYes
storeAccountIdstringYes
adAccountIdstringNo
profileIdstringNo

aa_send_ad_conversions

Changes or removes

Send server-side conversion events (purchases, sign-ups, …) to a connected ad account's conversion destination so its ads optimize on real outcomes. accountId from aa_list_accounts; destinationId from aa_list_conversion_destinations; events[] and any other fields are forwarded verbatim to the upstream conversions API. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
destinationIdstringNo
eventsobject[]No
extraobjectNoAny other conversion-payload fields — forwarded verbatim.
profileIdstringNo

aa_update_tracking_tag

Changes or removes

Update one tracking tag on an ads account: { tagId } plus any of name, enableAutomaticMatching, automaticMatchingFields, firstPartyCookieStatus, dataUseSetting. Other fields are refused. What each platform lets you change differs (Pinterest and ChatGPT pixels cannot be edited). Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (8)
NameTypeRequiredDescription
idstringYes
tagIdstringYes
namestringNo
enableAutomaticMatchingbooleanNo
automaticMatchingFieldsstring[]No
firstPartyCookieStatusstringNo
dataUseSettingstringNo
profileIdstringNo

Update one conversion event on a tracking tag (at least one field). What can change differs per platform (Meta: name and defaultValue only; Pinterest cannot rename; ChatGPT events cannot be edited). eventId from aa_list_tracking_tag_events. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.

Parameters (17)
NameTypeRequiredDescription
idstringYes
tagIdstringYes
eventIdstringYes
adAccountIdstringNo
namestringNo
typestringNo
siteEvent"page_view" | "view_content" | "add_to_cart" | "search" | "initiate_checkout" | "add_payment_info" | "purchase"No
enabledbooleanNo
defaultValuenumberNo
currencystringNo
clickWindowDaysintegerNo
viewWindowDaysintegerNo
urlContainsstringNo
primarybooleanNo
alwaysUseDefaultValuebooleanNo
countingType"one" | "every"No
profileIdstringNo

Shopify (24)

aa_connect_shopify_token

Changes or removes

Connect a Shopify store to the active pen name with a merchant-created custom-app Admin API token (shpat_…) — the no-OAuth path. The token is validated upstream before being saved. shop is the myshopify.com domain (bare prefix accepted). Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
shopstringYes
accessTokenstringYes
profileIdstringNo

aa_create_shopify_article

Changes or removes

Publish (or draft/schedule) an article on a Shopify blog — title required; bodyHtml carries the content; a future publishDate schedules natively; isPublished:false drafts. Pass profileId for a non-primary pen name.

Parameters (13)
NameTypeRequiredDescription
accountIdstringYes
blogIdstringYes
titlestringYes
bodyHtmlstringNoArticle body as HTML.
handlestringNoURL slug; generated from title when omitted.
tagsstring[]No
authorstringNo
excerptstringNo
imageobjectNoFeatured image — must be a publicly reachable URL.
seoobjectNo
isPublishedbooleanNofalse = create as draft.
publishDatestringNoISO 8601 with offset; a future date schedules natively on Shopify.
profileIdstringNo

Create a collection on the author's Shopify store, optionally with products already in it (product ids from aa_list_shopify_products). Writes to the live store, so confirm with the user first. Pass profileId for a non-primary pen name.

Parameters (8)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
titlestringYes
descriptionHtmlstringNo
handlestringNoURL slug; generated from the title when omitted.
sortOrder"manual" | "best_selling" | "alpha_asc" | "alpha_desc" | "price_asc" | "price_desc" | "created" | "created_desc" | "most_relevant"Nomanual keeps series reading order.
imageobjectNo
productIdsstring[]No
profileIdstringNo

Create a discount on the author's Shopify store. method code needs `code` (what shoppers type); method automatic applies at checkout with no code. type percentage needs `percentage` (15 = 15%); fixed_amount needs `amount` as a decimal string in the store currency; free_shipping needs neither. Limit it to products or collections with productIds/collectionIds, or leave both out for the whole store. Shoppers see it, so confirm the terms and dates with the user first. Pass profileId for a non-primary pen name.

Parameters (17)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
titlestringYes
method"code" | "automatic"Yes
type"percentage" | "fixed_amount" | "free_shipping"Yes
codestringNo
percentagenumberNo
amountstringNo
appliesOnEachItembooleanNo
minimumSubtotalstring | nullNo
minimumQuantityinteger | nullNo
usageLimitinteger | nullNo
oncePerCustomerbooleanNo
startsAtstringNoISO date; defaults to now.
endsAtstring | nullNoISO date; null or omitted means no end.
productIdsstring[]No
collectionIdsstring[]No
profileIdstringNo

aa_create_shopify_product

Changes or removes

Create a product on the author's Shopify store. This writes to their live store, so confirm the details with the user first. Defaults to status draft (not visible to shoppers); pass status active only when the user asks to publish. Each variant needs a price in the store currency; for a book, ISBN goes in sku. Images must be public URLs. Pass profileId for a non-primary pen name.

Parameters (13)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
titlestringYes
descriptionHtmlstringNoProduct description as HTML.
handlestringNoURL slug; generated from the title when omitted.
vendorstringNo
productTypestringNoe.g. Book, Ebook, Audiobook.
tagsstring[]NoReplaces the whole tag list.
seoobjectNo
status"draft" | "active"No
imagesobject[]No
optionsobject[]NoOption axes, e.g. [{ name: 'Format', values: ['Paperback','Hardcover'] }].
variantsobject[]Yes
profileIdstringNo

aa_delete_shopify_article

Changes or removes

Delete a Shopify blog article permanently.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
blogIdstringYes
articleIdstringYes
profileIdstringNo

Show on-hand stock for one Shopify product, per variant and location. Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
productIdstringYes
profileIdstringNo

Get one Shopify product with its variants (variant ids are needed for aa_update_shopify_product_prices), images, status and storefront URL. Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
productIdstringYes
profileIdstringNo

List articles on one Shopify blog (blogId from aa_list_shopify_blogs). Cursor-paged. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
blogIdstringYes
cursorstringNo
profileIdstringNo

List the blogs on a connected Shopify store (accountId from aa_list_accounts, platform shopify). Cursor-paged. Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
cursorstringNo
profileIdstringNo

List a Shopify store's sales channels (id, name), e.g. Online Store. Channel ids are needed for aa_publish_shopify_product. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
profileIdstringNo

List collections on a connected Shopify store (e.g. one per series). Cursor-paged (pass nextCursor back as cursor); limit 1-50; `query` takes Shopify collection search syntax. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
querystringNo
cursorstringNo
limitintegerNo
profileIdstringNo

List discounts on a connected Shopify store (codes and automatic). Cursor-paged; limit 1-50. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
querystringNo
cursorstringNo
limitintegerNo
profileIdstringNo

List a Shopify store's stock locations. Location ids are needed for aa_set_shopify_inventory. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
profileIdstringNo

List products on a connected Shopify store. Cursor-paged (pass nextCursor back as cursor); limit 1-50. `query` takes Shopify search syntax (title:, tag:, sku:, vendor:). Pass profileId for a non-primary pen name.

Parameters (7)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
status"active" | "draft" | "archived" | "inactive"No
querystringNo
collectionIdstringNo
cursorstringNo
limitintegerNo
profileIdstringNo

aa_publish_shopify_product

Changes or removes

Publish a Shopify product to sales channels, or take it off them (channel ids from aa_list_shopify_channels). Publishing an active product to the Online Store channel is what makes it visible to shoppers and gives it a storefront URL (onlineStoreUrl on aa_get_shopify_product). Confirm with the user before publishing. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
productIdstringYes
publishstring[]No
unpublishstring[]No
profileIdstringNo

Turn a Shopify discount on or off without deleting it. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
discountIdstringYes
activebooleanYes
profileIdstringNo

aa_set_shopify_inventory

Changes or removes

Change stock for a Shopify product's variants. mode set (default) writes the on-hand count; mode adjust adds to it (negative subtracts). Variant ids come from aa_get_shopify_product, location ids from aa_list_shopify_locations. Confirm the numbers with the user first. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
productIdstringYes
mode"set" | "adjust"No
changesobject[]Yes
profileIdstringNo

Activate, deactivate, archive or DELETE up to 50 Shopify products in one call; answers which succeeded and which failed. Activating does NOT put a product on the storefront: a product created here stays off the Online Store until aa_publish_shopify_product publishes it to that channel, so never tell the user it's live after activate alone. delete is permanent on Shopify and cannot be undone: only use it when the user explicitly asks to delete, and prefer archive. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
productIdsstring[]Yes
action"activate" | "deactivate" | "archive" | "delete"Yes
profileIdstringNo

Show a connected Shopify store (name, domain, currency) and its permissions. When `permissions.complete` is false, tell the user what to do: `fix: grant` means open `grantPermissionsUrl` and approve in Shopify; `fix: custom_app_scopes` means add the missing Admin API scopes to their own custom app and reconnect. Call this first when a product call answers STORE_PERMISSIONS_MISSING. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
profileIdstringNo

aa_update_shopify_article

Changes or removes

Update a Shopify blog article — only the fields you pass change. Pass profileId for a non-primary pen name.

Parameters (14)
NameTypeRequiredDescription
accountIdstringYes
blogIdstringYes
articleIdstringYes
titlestringNo
bodyHtmlstringNoArticle body as HTML.
handlestringNoURL slug; generated from title when omitted.
tagsstring[]No
authorstringNo
excerptstringNo
imageobjectNoFeatured image — must be a publicly reachable URL.
seoobjectNo
isPublishedbooleanNofalse = create as draft.
publishDatestringNoISO 8601 with offset; a future date schedules natively on Shopify.
profileIdstringNo

Add products to, or remove them from, a Shopify collection. Removing only takes a product out of the collection; the product stays on the store. Pass profileId for a non-primary pen name.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
collectionIdstringYes
addstring[]No
removestring[]No
profileIdstringNo

aa_update_shopify_product

Changes or removes

Update a Shopify product's details; only the fields you pass change (tags replaces the whole list). Prices: aa_update_shopify_product_prices. Publish/unpublish/archive: aa_set_shopify_product_status. Writes to the live store. Pass profileId for a non-primary pen name.

Parameters (10)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
productIdstringYes
titlestringNo
descriptionHtmlstringNoProduct description as HTML.
handlestringNoURL slug; generated from the title when omitted.
vendorstringNo
productTypestringNoe.g. Book, Ebook, Audiobook.
tagsstring[]NoReplaces the whole tag list.
seoobjectNo
profileIdstringNo

Set prices on a Shopify product's variants (variant ids from aa_get_shopify_product). compareAtPrice is the strike-through price; null removes a sale. Changes what shoppers pay, so confirm with the user first. Pass profileId for a non-primary pen name.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYesThe Shopify store's accountId from aa_list_accounts (platform shopify).
productIdstringYes
variantsobject[]Yes
profileIdstringNo

WhatsApp (34)

Add up to 8 phone numbers (E.164 format) to a WhatsApp group per call.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
groupIdstringYes
phoneNumbersstring[]Yes
profileIdstringNo

Approve pending join requests on a WhatsApp group.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
groupIdstringYes
phoneNumbersstring[]Yes
profileIdstringNo

Create a WhatsApp Flow (multi-screen native form) as a DRAFT. categories: SIGN_UP, SIGN_IN, APPOINTMENT_BOOKING, LEAD_GENERATION, CONTACT_US, CUSTOMER_SUPPORT, SURVEY, OTHER. Pass cloneFlowId to copy an existing flow's JSON. Next: aa_upload_whatsapp_flow_json, then aa_publish_whatsapp_flow.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
namestringYes
categoriesstring[]Yes
cloneFlowIdstringNo
profileIdstringNo

Create a WhatsApp group. subject ≤128 chars, description ≤2048 chars. Optionally generate an invite link in the same call.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
subjectstringYes
descriptionstringNo
createInviteLinkbooleanNo
profileIdstringNo

aa_create_whatsapp_template

Changes or removes

Create a WhatsApp message template — either CUSTOM (goes to Meta review, PENDING → APPROVED/REJECTED, up to 24h) or LIBRARY (pre-approved, no wait). Custom: name (must match ^[a-z][a-z0-9_]*$), category (AUTHENTICATION|MARKETING|UTILITY), language (e.g. en_US), components[] (body/header/footer/buttons — Meta's WhatsApp template component shape). Library: omit components, set library_template_name (from business.facebook.com/wa/manage/message-templates/) plus optional library_template_body_inputs / library_template_button_inputs.

Parameters (9)
NameTypeRequiredDescription
accountIdstringYes
namestringYes
category"AUTHENTICATION" | "MARKETING" | "UTILITY"Yes
languagestringYes
componentsobject[]No
library_template_namestringNo
library_template_body_inputsobjectNo
library_template_button_inputsobject[]No
profileIdstringNo

aa_delete_whatsapp_flow

Changes or removes

Delete a DRAFT WhatsApp Flow. Irreversible. Only works on drafts — published flows cannot be deleted (deprecate instead).

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
flowIdstringYes
profileIdstringNo

aa_delete_whatsapp_group

Changes or removes

Delete a WhatsApp group and remove all participants. No undo.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
groupIdstringYes
profileIdstringNo

aa_delete_whatsapp_template

Changes or removes

Permanently delete a WhatsApp message template. No undo.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
templateNamestringYes
profileIdstringNo

aa_deprecate_whatsapp_flow

Changes or removes

Deprecate a PUBLISHED WhatsApp Flow — stops new sends; in-flight conversations finish normally.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
flowIdstringYes
profileIdstringNo

Get a WhatsApp Business profile (about, address, description, email, websites, vertical, picture).

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

Get a WhatsApp Business account's current display name + Meta review status.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

Get a WhatsApp Flow's details + preview URL.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
flowIdstringYes
fieldsstringNo
profileIdstringNo

Fetch a WhatsApp Flow's JSON definition + a temporary download URL.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
flowIdstringYes
profileIdstringNo

Get a WhatsApp group's info — subject, description, participants, settings.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
groupIdstringYes
profileIdstringNo

Poll a WhatsApp phone number's provisioning status (pending_payment/provisioning/active/suspended/releasing/released).

Parameters (2)
NameTypeRequiredDescription
phoneNumberIdstringYes
profileIdstringNo

Get one WhatsApp message template by name.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
templateNamestringYes
profileIdstringNo

List WhatsApp Flows (DRAFT/PUBLISHED/DEPRECATED/BLOCKED/THROTTLED) on a connected account.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

List pending join requests on a WhatsApp group (only meaningful when joinApprovalMode is 'approval_required').

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
groupIdstringYes
profileIdstringNo

List active WhatsApp groups on a connected account. Optional after cursor, limit (≤1024).

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
afterstringNo
limitintegerNo
profileIdstringNo

List this pen name's WhatsApp phone numbers (workspace-level, workspace-provisioned). Excludes released numbers by default. Optional status filter.

Parameters (2)
NameTypeRequiredDescription
statusstringNo
profileIdstringNo

List WhatsApp message templates on a connected WhatsApp Business account.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

aa_publish_whatsapp_flow

Changes or removes

IRREVERSIBLE — publish a DRAFT WhatsApp Flow. Published flows are immutable forever (no more JSON edits, no un-publish); the only paths afterward are aa_deprecate_whatsapp_flow or cloning into a new flow. Confirm with the user before calling.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
flowIdstringYes
profileIdstringNo

REAL MONEY — buy a WhatsApp phone number (Telnyx + Meta pre-verification, payment-first, plan-dependent max count). The FIRST number on a workspace returns { checkoutUrl } — give the user that Stripe Checkout URL to complete payment (does NOT auto-provision). Subsequent numbers provision inline against the existing subscription and return { phoneNumber: { id, status: 'provisioning', ... } } — poll aa_get_whatsapp_phone_number until active. Confirm with the user before calling.

Parameters (1)
NameTypeRequiredDescription
profileIdstringNo

Reject pending join requests on a WhatsApp group.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
groupIdstringYes
phoneNumbersstring[]Yes
profileIdstringNo

Release a WhatsApp phone number — disconnects the WhatsApp account, decrements the subscription, and releases the number from Telnyx. No undo.

Parameters (2)
NameTypeRequiredDescription
phoneNumberIdstringYes
profileIdstringNo

Remove phone numbers (E.164 format) from a WhatsApp group.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
groupIdstringYes
phoneNumbersstring[]Yes
profileIdstringNo

Request a WhatsApp Business display-name change. Goes through Meta review (PENDING_REVIEW → APPROVED/DECLINED, 1–3 business days). Must be 3–512 chars and represent the actual business per WhatsApp naming guidelines.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
displayNamestringYes
profileIdstringNo

aa_send_whatsapp_flow

Changes or removes

Send a published (or draft, with draft:true) WhatsApp Flow as an interactive message. to: E.164 phone number. flow_id required. flow_cta: button label, max 20 chars. flow_action: 'navigate' (opens flow_action_payload.screen directly) or 'data_exchange' (posts to your Flow endpoint first). flow_token: auto-generated UUID if omitted — use it to correlate the reply webhook. Response comes back via the message.received webhook with metadata.interactiveType='nfm_reply'.

Parameters (10)
NameTypeRequiredDescription
accountIdstringYes
tostringYes
flow_idstringYes
flow_ctastringYes
flow_action"navigate" | "data_exchange"No
flow_action_payloadobjectNo
flow_tokenstringNo
bodystringNo
draftbooleanNo
profileIdstringNo

Partial update of a WhatsApp Business profile — only the fields you send change. Limits: about ≤139 chars, description ≤512 chars, max 2 websites.

Parameters (8)
NameTypeRequiredDescription
accountIdstringYes
aboutstringNo
addressstringNo
descriptionstringNo
emailstringNo
websitesstring[]No
verticalstringNo
profileIdstringNo

aa_update_whatsapp_flow

Changes or removes

Update a DRAFT WhatsApp Flow's name and/or categories. Fails on published flows.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
flowIdstringYes
namestringNo
categoriesstring[]No
profileIdstringNo

aa_update_whatsapp_group

Changes or removes

Update a WhatsApp group's subject, description, and/or joinApprovalMode ('approval_required' or 'auto_approve').

Parameters (6)
NameTypeRequiredDescription
accountIdstringYes
groupIdstringYes
subjectstringNo
descriptionstringNo
joinApprovalMode"approval_required" | "auto_approve"No
profileIdstringNo

aa_update_whatsapp_template

Changes or removes

Update an APPROVED WhatsApp template's components. name/category/language are immutable once created.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
templateNamestringYes
componentsobject[]Yes
profileIdstringNo

Upload/replace a DRAFT WhatsApp Flow's JSON (screens + components — see Meta's Flow JSON reference). flow_json can be an object or a JSON string. Meta validates on upload; a non-empty validation_errors[] in the response means it was rejected — surface each entry's message/line/column to the user verbatim.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
flowIdstringYes
flow_jsonobjectYes
profileIdstringNo

Telegram (4)

aa_connect_telegram

Changes or removes

Connect a Telegram channel/group to the active pen name via the bot-code flow — no token pasting needed. Call with NO args to mint a fresh connect code + instructions (the user adds the bot to their channel and sends the code); call again with `code` to poll (pending | connected | expired); or pass `chatId` to connect a known channel/group id directly. Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
codestringNoPoll a previously minted connect code.
chatIdstringNoConnect a known channel/group id directly.
profileIdstringNo

aa_delete_telegram_commands

Changes or removes

Remove the bot commands menu from a connected Telegram account.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

Get the bot commands (the / menu users see) configured on a connected Telegram account.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

aa_set_telegram_commands

Changes or removes

Set the bot commands menu on a connected Telegram account. Each entry: { command (no leading '/'), description }.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
commandsobject[]Yes
profileIdstringNo

Google Business (21)

aa_assign_gmb_location

Changes or removes

Assign which Google Business Profile location a connected Google Business account posts to. locationId from aa_list_gmb_locations. Pass profileId for a non-primary pen name.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
locationIdstringYes
profileIdstringNo

Fetch Google Business Profile reviews across multiple locations in one call. locationNames is required (Google location resource names, e.g. 'locations/12345').

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
locationNamesstring[]Yes
pageSizeintegerNo
pageTokenstringNo
profileIdstringNo

aa_create_gmb_place_action

Changes or removes

Add a place action (booking/ordering link) to a Google Business Profile location. placeActionType: APPOINTMENT, ONLINE_APPOINTMENT, DINING_RESERVATION, FOOD_ORDERING, FOOD_DELIVERY, FOOD_TAKEOUT, or SHOP_ONLINE. Optional locationId.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
uristringYes
placeActionType"APPOINTMENT" | "ONLINE_APPOINTMENT" | "DINING_RESERVATION" | "FOOD_ORDERING" | "FOOD_DELIVERY" | "FOOD_TAKEOUT" | "SHOP_ONLINE"Yes
locationIdstringNo
profileIdstringNo

aa_delete_gmb_media

Changes or removes

Delete a photo/video from a Google Business Profile location. mediaId from aa_list_gmb_media. Optional locationId.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
mediaIdstringYes
locationIdstringNo
profileIdstringNo

aa_delete_gmb_place_action

Changes or removes

Remove a place action from a Google Business Profile location by its resource name. Optional locationId.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
namestringYes
locationIdstringNo
profileIdstringNo

Get a Google Business Profile location's attributes (amenities, accessibility, etc). Optional locationId.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
locationIdstringNo
profileIdstringNo

Get a Google Business Profile location's food menu (labels, sections, items with price/dietary/allergen info). Optional locationId.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
locationIdstringNo
profileIdstringNo

Get a Google Business Profile location's details (name, address, hours, categories, phone, etc). Optional readMask (comma-separated Google field paths) to limit the response; optional locationId to override the account's default location.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
readMaskstringNo
locationIdstringNo
profileIdstringNo

Get a Google Business Profile location's service list. Optional locationId.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
locationIdstringNo
profileIdstringNo

Google Business Profile performance metrics (calls, direction requests, website clicks, impressions) by day for a connected GBP location. Optional metrics (comma list), startDate, endDate. If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
metricsstringNo
startDatestringNo
endDatestringNo
profileIdstringNo

Top search queries that surfaced a Google Business Profile listing. Optional startMonth/endMonth (YYYY-MM). If it returns ANALYTICS_ADDON_REQUIRED, analytics isn't switched on for this account yet: say so and point the user to support; never suggest buying anything.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
startMonthstringNo
endMonthstringNo
profileIdstringNo

List the Google Business Profile locations available on a connected Google Business account (a business can have many locations; posting targets exactly one). accountId from aa_list_accounts. Follow with aa_assign_gmb_location to pick one. Pass profileId for a non-primary pen name.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

List photos/videos on a Google Business Profile location. Optional pageSize (max 100), pageToken, locationId.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
pageSizeintegerNo
pageTokenstringNo
locationIdstringNo
profileIdstringNo

List place actions (booking/ordering links) on a Google Business Profile location. Optional locationId.

Parameters (3)
NameTypeRequiredDescription
accountIdstringYes
locationIdstringNo
profileIdstringNo

List Google Business Profile reviews (with any owner replies) for a connected GBP account. Optional locationId, pageSize, pageToken.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
locationIdstringNo
pageSizeintegerNo
pageTokenstringNo
profileIdstringNo

aa_replace_gmb_services

Changes or removes

REPLACE the ENTIRE service list on a Google Business Profile location — Google requires full-list replacement, not partial updates. Any existing service NOT included in serviceItems is DELETED. Each item is a structuredServiceItem or freeFormServiceItem, optionally with a price. Call aa_get_gmb_services first and include everything you want to keep. Optional locationId.

Parameters (4)
NameTypeRequiredDescription
accountIdstringYes
serviceItemsobject[]Yes
locationIdstringNo
profileIdstringNo

aa_update_gmb_attributes

Changes or removes

Update a Google Business Profile location's attributes. attributes[] and attributeMask are REQUIRED. Value types: BOOL, ENUM, URL, REPEATED_ENUM (repeatedEnumValue.setValues/unsetValues) — Google's shape, forwarded verbatim. Optional locationId.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
attributesobject[]Yes
attributeMaskstringYes
locationIdstringNo
profileIdstringNo

aa_update_gmb_food_menus

Changes or removes

Replace a Google Business Profile location's food menu. menus is Google's FoodMenu resource shape (labels[], sections[], nested items[]). updateMask is optional (unlike location-details, where it's required). Optional locationId.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
menusobjectYes
updateMaskstringNo
locationIdstringNo
profileIdstringNo

Update a Google Business Profile location's details. updateMask is REQUIRED (comma-separated Google field paths naming which fields to change) alongside the fields themselves — Google's locations.patch shape, forwarded verbatim. Optional locationId.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
updateMaskstringYes
locationobjectYesFields to update, matching Google's Location resource shape (e.g. { title, phoneNumbers, regularHours }).
locationIdstringNo
profileIdstringNo

aa_update_gmb_place_action

Changes or removes

Update a place action on a Google Business Profile location by its resource name (from aa_list_gmb_place_actions). Optional locationId.

Parameters (6)
NameTypeRequiredDescription
accountIdstringYes
namestringYes
uristringNo
placeActionTypestringNo
locationIdstringNo
profileIdstringNo

aa_upload_gmb_media

Changes or removes

Upload a photo/video to a Google Business Profile location from a public URL. category is required: COVER, PROFILE, LOGO, EXTERIOR, INTERIOR, FOOD_AND_DRINK, MENU, PRODUCT, TEAMS, or ADDITIONAL. Optional locationId.

Parameters (7)
NameTypeRequiredDescription
accountIdstringYes
sourceUrlstringYes
mediaFormat"PHOTO" | "VIDEO"Yes
category"COVER" | "PROFILE" | "LOGO" | "EXTERIOR" | "INTERIOR" | "FOOD_AND_DRINK" | "MENU" | "PRODUCT" | "TEAMS" | "ADDITIONAL"Yes
descriptionstringNo
locationIdstringNo
profileIdstringNo

Discord (3)

Get a connected Discord account's webhook identity (display name / avatar) and currently connected channel.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

List Discord channels available to a connected Discord account's webhook (text, announcement, and forum channels). Use before aa_update_discord_settings or aa_create_post's platformOptions.discord.channelId to pick a valid channelId. Forum channels (type 15) require a thread name when posting.

Parameters (2)
NameTypeRequiredDescription
accountIdstringYes
profileIdstringNo

aa_update_discord_settings

Changes or removes

Change a connected Discord account's webhook identity and/or switch which channel it posts to (same guild only). All fields optional — send only what's changing.

Parameters (5)
NameTypeRequiredDescription
accountIdstringYes
webhookUsernamestringNo
webhookAvatarUrlstringNo
channelIdstringNo
profileIdstringNo