Skip to main content
Glama

Server Details

Create, schedule and publish social posts to 13 platforms for your brands.

Ownership verified
Status
Healthy
Uptime
100.0% over the last 24 hours
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

B3.3/5.0

Scored across 134 tools

Disambiguation3/5

Most tools target a distinct resource and action, but there are overlapping clusters: decide_approval, decide_approval_group, decide_review, decide_campaign_review_section and act_on_publish_action all sit near approval/publishing decisions. Likewise publish, reschedule_post, update_scheduled_post and move_reviews are adjacent scheduling operations, and analytics is split across get_analytics, query_insights, compare_post_instances and compare_labels. Descriptions help separate them, but an agent must navigate many near-neighbors.

Naming Consistency3/5

Names are readable and mostly snake_case, but conventions are mixed: verb_noun (create_content, list_brands, update_queue), noun_verb (account_refresh, brand_profile_get), namespaced ads_ tools (ads_campaign_get), and plural-led groups (ctas_generate, hooks_list). There is a discernible style, but it is not a single predictable pattern.

Tool Count1/5

134 tools is an extreme mismatch for a coherent toolset, far beyond the typical 3-15 range. Even with broad product scope, the surface is so large that discovery and reliable selection become difficult.

Completeness4/5

The surface is very broad, covering content creation, publishing, queues, reviews, approvals, experiments, analytics, ads, hook studio, media upload, music and pronunciation. Minor gaps remain, such as no explicit ads deep-dive listing tool and sparse delete operations for several resources, but most workflows have a workable path.

Available Tools

134 tools
account_refreshRefresh a connected account's profileAInspect

[writes flayr data · write scope] Re-reads a connected account's handle, display name and avatar from the network (use after the user renames the account) and returns the stored values. Changes nothing else: no connect, disconnect or post. If the status is not updated, tell the user to reconnect the account at the returned reconnectUrl. (Wraps POST /api/v2/accounts/{id}/refresh.)

Inputs: id (required), brandId.

act_on_publish_actionApprove, reject, retry or cancel a reshare / commentA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] approve lets a rule's reshare / comment go out at its time; retry re-sends a failed one (same idempotency key); reject / cancel stop it. Confirm with the user before approving. Needs the publish scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/automations/actions/{id}.)

Inputs: id (required), op (required).

ad_cut_lintLint an ad cut (joins, captions, audio, ending, length)AInspect

[writes flayr data · write scope] Checks an ad's cut against the ad-cut rules: too many joins (warning), joins only at a rest point, no cut inside a caption or its fade, one caption layer, no audio dip at a join, exactly one ending, and the network's length / aspect / ad-text window (TikTok 9:16, 12-25 s, ad text up to 100 by default). Each finding names its fix. It reads the cut you describe (segments, captions, signals), not a rendered file; a rule with nothing to check is reported unchecked. With contentId the result is kept for that draft: a format:ad video draft is booked or filed as an ad only once its latest lint for the network passes. (Wraps POST /api/v2/video-studio/ad-cut/lint.)

Inputs: network (required), segments (required), joins, adText, +5 more.

add_post_commentsAdd comments after publish to a postA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] Schedules comments on a post, sent once after it is live on that platform and its tokens resolve ({{postUrl}}, {{parentPostUrl:}}, {{youtubeUrl:}}), optionally at sendAt. Confirm with the user first. Needs the publish scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/posts/{id}/comments.)

Inputs: id (required), comments (required).

add_queue_itemsAdd drafts to a queueA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] Appends drafts (content ids) to the end of a queue — they will be BOOKED AND POSTED on the queue's schedule. Use contentIds, or items for a per-item YouTube title or platforms. Drafts of another brand, duplicates, archived drafts and drafts without a video for a video platform come back in rejected. Needs the publish scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/queues/{id}/items.)

Inputs: id (required), items, brandId, contentIds.

ads_accounts_listList ad accountsB
Read-onlyIdempotent
Inspect

[read-only] The brand's ad account with its currency, spend limit, balance (minor units) and readiness. (Wraps GET /api/v2/ads/accounts.)

Inputs: brandId.

ads_account_spend_limit_setSet the ad account spending limitAInspect

[writes · ads:spend scope] Sets the Meta ad account spending limit, in the account currency (e.g. 800 = $800). Removing the limit (null) always needs the owner. Inside the owner's agent ceiling it is applied at once; above it the result is approval_requested: tell the user the owner has an approval request in Ads > Agent activity, and repeat the same call once they approve. Pass agentName and reason; both are shown to the owner. (Wraps POST /api/v2/ads/accounts/spend-limit.)

Inputs: reason (required), spendCap (required), agentName (required), brandId.

ads_ad_set_datasetAttach a dataset to an ad setAInspect

[writes · ads:manage scope] Attaches a Meta dataset (pixel) to an existing ad set, optionally with the conversion event (e.g. PURCHASE). Pass agentName and reason. Audited in Ads > Agent activity. It cannot be undone from there: to change it back, call this tool again with the earlier settings. (Wraps POST /api/v2/ads/ad-sets/{id}/dataset.)

Inputs: id (required), reason (required), pixelId (required), agentName (required), +2 more.

ads_ad_set_placementsEdit ad set placementsAInspect

[writes · ads:manage scope] Changes where an existing ad set runs. excludeAudienceNetwork: true keeps Facebook, Instagram and Messenger and drops Audience Network; or pass an explicit publisherPlatforms list. id is the ad set id from ads_campaign_get. Pass agentName and reason. Audited in Ads > Agent activity. It cannot be undone from there: to change it back, call this tool again with the earlier settings. (Wraps POST /api/v2/ads/ad-sets/{id}/placements.)

Inputs: id (required), reason (required), agentName (required), brandId, +2 more.

ads_agent_activityAgent ads activityA
Read-onlyIdempotent
Inspect

[read-only] Recent agent actions on ads (agent name, reason, outcome), owner approval requests still pending, and the owner's agent ceilings. Use it to see whether an approval request was decided. (Wraps GET /api/v2/ads/agent/activity.)

Inputs: brandId.

ads_boost_candidatesPosts worth boostingA
Read-onlyIdempotent
Inspect

[read-only] The brand's published posts ranked for a boost (reach, engagement rate, link clicks, recency), with score parts, the call-to-action link found, and whether an ad account is connected for the network. Removed posts, posts with no call to action and networks a boost can't run on are left out. Read-only: nothing is boosted or charged. (Wraps GET /api/v2/ads/boost-candidates.)

Inputs: days, limit, brandId, include.

ads_campaign_approveApprove (and activate) a campaignAInspect

[writes · ads:manage scope] Approves a proposed ad campaign. With activate: true it also switches it on (needs ads:spend too), through the normal activation checks, when its daily budget is within the owner's agent activation ceiling. Inside the owner's agent ceiling it is applied at once; above it the result is approval_requested: tell the user the owner has an approval request in Ads > Agent activity, and repeat the same call once they approve. Pass agentName and reason; both are shown to the owner. Confirm with the user before activating. (Wraps POST /api/v2/ads/campaigns/{id}/approve.)

Inputs: id (required), reason (required), agentName (required), brandId, +2 more.

ads_campaign_createCreate a paused lead campaignAInspect

[writes · ads:manage scope] Creates a Meta Instant Form lead campaign (goal lead_generation, the ad set's leadGenFormId from ads_lead_forms_list, placements without Audience Network, the age range and countries in targeting) with one image ad, created PAUSED. It lands in the owner's Proposed campaigns and never runs or spends until the owner approves it (ads_campaign_approve). headline, body, imageUrl or creativeId and budget (dollars; budgetType daily or lifetime) are required; promotedObject.pageId picks the Facebook Page. Pass agentName and reason. Audited in Ads > Agent activity. (Wraps POST /api/v2/ads/campaigns.)

Inputs: body (required), goal (required), budget (required), reason (required), +16 more.

ads_campaign_getGet an ad campaignA
Read-onlyIdempotent
Inspect

[read-only] One ad campaign by its Flayr id, with its ad sets and ads, including each ad's network review status, reason when available, and last sync time. Do not invent a rejection reason when the network supplies none. (Wraps GET /api/v2/ads/campaigns/{id}.)

Inputs: id (required), brandId.

ads_campaign_pausePause or stop an ad campaignAInspect

[writes flayr data · write scope] Pauses a live ad campaign on its ad network so it stops spending (action: "pause" or "stop"; both leave it paused). To approve and switch on a proposed campaign use ads_campaign_approve. Confirm with the user first. (Wraps POST /api/v2/ads/campaigns/{id}/pause.)

Inputs: id (required), action, brandId, idempotencyKey.

ads_campaigns_listList ad campaignsB
Read-onlyIdempotent
Inspect

[read-only] The brand's ad campaigns with status, budget, start/end dates, max spend, spend to date, ad sets and ads. Filter by status or platform. (Wraps GET /api/v2/ads/campaigns.)

Inputs: status, brandId, platform.

ads_caps_setSet ad spend capsAInspect

[writes · ads:spend scope] Sets the brand's monthly and/or per-campaign activation caps, in cents (e.g. 50000 = $500). Inside the owner's agent ceiling it is applied at once; above it the result is approval_requested: tell the user the owner has an approval request in Ads > Agent activity, and repeat the same call once they approve. Pass agentName and reason; both are shown to the owner. (Wraps POST /api/v2/ads/caps.)

Inputs: reason (required), agentName (required), brandId, monthlyMaxMinor, +1 more.

ads_deep_dive_compareCompare two ads deep divesA
Read-onlyIdempotent
Inspect

[read-only] Compare an older and a newer saved run: each finding is new, resolved, worse, better or unchanged, with metric deltas. (Wraps GET /api/v2/ads/deep-dives/compare.)

Inputs: after (required), before (required), brandId.

ads_deep_dive_getRead ads deep divesB
Read-onlyIdempotent
Inspect

[read-only] One saved deep dive by id, as json or an export (markdown, csv, pdf) of the stored report. List recent runs with GET /api/v2/ads/deep-dives. (Wraps GET /api/v2/ads/deep-dives/{id}.)

Inputs: id (required), format, brandId.

ads_deep_dive_quoteQuote an ads deep diveA
Read-onlyIdempotent
Inspect

[read-only] The Embers price of a deep dive on a saved snapshot, and whether a recent run makes it free. Charges nothing. Ask the owner before running. (Wraps GET /api/v2/ads/deep-dives/quote.)

Inputs: snapshotId (required), brandId.

ads_deep_dive_runRun an ads deep diveAInspect

[writes flayr data · write scope] Run a deep dive on a saved snapshot and save the report. Charges Embers only when confirmEmbers equals the current quote total; a failed run is refunded. Changes no ad, budget or campaign. (Wraps POST /api/v2/ads/deep-dives.)

Inputs: snapshotId (required), confirmEmbers (required), brandId.

ads_insightsAd insightsA
Read-onlyIdempotent
Inspect

[read-only] Impressions, clicks, spend, link clicks and leads per campaign for a date range (default the last 30 days, at most 93), with totals per currency. Pass level: "ad" for daily per-ad results summed per ad (spend, impressions, clicks, CTR, video views), each with the Library contentId the ad was built from (null when unlinked; unlinked counts those). (Wraps GET /api/v2/ads/insights.)

Inputs: to, from, level, brandId.

ads_lead_form_createCreate an Instant Form (lead form)AInspect

[writes · ads:manage scope] Creates a Meta Instant Form on the brand's selected ad account: name, privacyPolicyUrl (https), questions (Meta question objects, e.g. { type: "EMAIL" }, { type: "FULL_NAME" }, or a CUSTOM question with label and options), optional contextCard, thankYou* fields and followUpActionUrl (same fields as the dashboard form). Same builder and limits as the dashboard. One vendor call, never retried; pass idempotencyKey to make repeats safe. Pass agentName and reason. Audited in Ads > Agent activity. (Wraps POST /api/v2/ads/lead-forms.)

Inputs: name (required), reason (required), agentName (required), questions (required), +14 more.

ads_lead_forms_listList Instant Forms (lead forms)A
Read-onlyIdempotent
Inspect

[read-only] The Meta Instant Forms (lead forms) on the brand's selected ad account: id, name, status. Use a form id as leadGenFormId in ads_campaign_create. (Wraps GET /api/v2/ads/lead-forms.)

Inputs: cursor, brandId.

ads_offers_listList ad platform offersA
Read-onlyIdempotent
Inspect

[read-only] The brand's new-advertiser offers per ad network, one row per ad account (or a network not connected yet): status, spend so far, what is left to spend, the daily pace and the deadline, and how to claim. Read-only. (Wraps GET /api/v2/ads/offers.)

Inputs: brandId.

ads_offer_updateRecord an ad platform offer claimA
Idempotent
Inspect

[writes flayr data · write scope] Records the claim of one offer row (claimId = a row id from ads_offers_list): status, the date it was claimed, and notes. Owners and admins of the brand only. A record only: it never creates, turns on or funds an ad. (Wraps PATCH /api/v2/ads/offers/{claimId}.)

Inputs: claimId (required), notes, status, brandId, +1 more.

ads_readinessAds readinessB
Read-onlyIdempotent
Inspect

[read-only] Whether each connected network and ad account can run ads, and what to fix first. (Wraps GET /api/v2/ads/readiness.)

Inputs: brandId.

ads_snapshot_collectCollect ads data snapshotAInspect

[writes flayr data · write scope] Save an immutable, org and brand scoped snapshot for selected ad accounts and an inclusive 1–30 day window. Reads vendors only; no charge, analysis, ad writes or spend. Each source reports availability. (Wraps POST /api/v2/ads/snapshots.)

Inputs: toDate (required), fromDate (required), adAccountIds (required), brandId.

ads_snapshots_getRead ads data snapshotsB
Read-onlyIdempotent
Inspect

[read-only] Read one saved ads data snapshot by id, or recent snapshot headers for the active brand. No cross-org access. (Wraps GET /api/v2/ads/snapshots.)

Inputs: id, brandId.

apply_frameFrame an imageAInspect

[writes flayr data · write scope] Draws a frame over an image and returns a new image URL (the original is untouched). Use the URL in create_content, or pass contentId + platform so that post publishes the framed image on that platform. Free by default; the same inputs again are free. (Wraps POST /api/v2/frames/apply.)

Inputs: frameRef (required), sourceUrl (required), fit, zoom, +8 more.

bodies_mapMap bodies (Hook Studio step 3)AInspect

[writes flayr data · write scope] Maps library clips, Shopify products, features or texts to draft bodies (what each shows and proves) so hooks can lead into them. Charges Embers once per call (refunded when nothing usable comes back). Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/bodies/map.)

Inputs: texts, brandId, features, productGids, +2 more.

brand_business_details_getGet a brand's business detailsA
Read-onlyIdempotent
Inspect

[read-only] A brand's legal name, registered address, website, currency and timezone: what ad networks ask for when you open an ads account. hasTaxId says whether a tax id is on file; the tax id itself is never returned. Use an id from list_brands. (Wraps GET /api/v2/brands/{id}/business-details.)

Inputs: id (required).

brand_business_details_updateUpdate a brand's business detailsA
Idempotent
Inspect

[writes flayr data · write scope] Sets a brand's legal name, registered address, currency (ISO, like USD) and/or timezone (IANA, like America/New_York). Only the fields sent change; a brand with no details yet needs all four. Do not send a tax id: it is refused. A brand owner or admin adds it in flayr (Brand › Overview). (Wraps PATCH /api/v2/brands/{id}/business-details.)

Inputs: id (required), currency, timezone, legalName, +1 more.

brand_profile_getGet a brand profileA
Read-onlyIdempotent
Inspect

[read-only] A brand's profile (website, companyName, tagline, industry, audience, values, pillars, hashtag sets), its default voice, colors and fonts. brandId comes from list_brands; a brand-bound connection may omit it. (Wraps GET /api/v2/brand/intelligence.)

Inputs: brandId.

brand_profile_updateUpdate a brand profileA
Idempotent
Inspect

[writes flayr data · write scope] Fills in a brand's profile — e.g. { brandId, profile: { website: "https://…" } }. Changes only the fields you send; the voice, colors and fonts stay as they are unless you pass them. Use it to clear list_brands setup items such as hasWebsite. Owners, admins and editors only; every change is audited against this connection. (Wraps PATCH /api/v2/brand/intelligence.)

Inputs: fonts, voice, colors, brandId, +1 more.

cancel_scheduled_postCancel a scheduled postA
DestructiveIdempotent
Inspect

[PUBLISHES to social accounts · publish scope] Takes a SCHEDULED post off the platform schedule and marks it cancelled (the draft stays, so it can be published again). Safe to repeat. Refused within 5 minutes of the slot, and when the platform will not remove it (some YouTube uploads). Needs the publish scope (or admin) and the Pro plan or higher; each publish counts against the plan's direct posts for the month. Confirm with the user first. (Wraps DELETE /api/v2/posts/{id}.)

Inputs: id (required).

claims_checkCheck copy for claimsA
Read-onlyIdempotent
Inspect

[read-only] Checks a hook, CTA, caption or ad against the brand's claims sources (verified prices, banned phrases, competitors, destinations). No model call, nothing stored, free. Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/claims/check.)

Inputs: text (required), context (required), brandId, platforms, +1 more.

close_experiment_roundClose a test roundAInspect

[writes flayr data · write scope] Freezes the open round's numbers and keeps the best arms for the next round. A winner is recorded only when the readout says likely_winner, or when pick names an arm the user chose. Ask the user before passing pick. (Wraps POST /api/v2/experiments/{id}/close-round.)

Inputs: id (required), pick.

combine_clipsCombine clips into a finished videoAInspect

[writes flayr data · write scope] Extends a video draft (id) with more clips and image cards into ONE finished video, rendered by flayr and saved as a NEW linked draft (same brand, caption copied, credits merged, labelled variant:combined). Nothing is posted and the original is unchanged. Use it to show a finished print with painting/assembly clips before or after it. segments (2-8, in order) must include the video itself as { kind: "clip", contentId: id }; clips are Library videos (contentId) or uploads (storageId from upload_media) with inMs/outMs (or durationMs = the clip's full length); cards are images (contentId of a Library image or video thumbnail, or imageStorageId) with durationMs and optional text. transition cut|crossfade, audio keep|mute_extras|main_across. Max 60 min by default (long-form: cold open + trimmed recording + bumpers). Costs 25 Embers per started minute of output for the first 3 min, then 5 per further started minute by default (refunded on failure). Returns a jobId — poll get_job_status. (Wraps POST /api/v2/content/{id}/combine.)

Inputs: id (required), segments (required), audio, transition, +1 more.

compare_labelsCompare posts by a label (A/B)A
Read-onlyIdempotent
Inspect

[read-only] Splits every labelled post by the values of one label key (e.g. key "cut" → cut:opus vs cut:raw) and reports medians with n per group at the 48h / 7d snapshot. Descriptive, not a significance test. Pro plan or higher. (Wraps GET /api/v2/analytics/experiments.)

Inputs: key, metric, window, brandId, +1 more.

compare_post_instancesCompare post instances and rerunsA
Read-onlyIdempotent
Inspect

[read-only] Per-account metrics and tag, campaign, experiment and series roll-ups. Omit postId for scope-wide roll-ups (up to 100 posts). Include reruns to compare bookings of the same content over time. Historical data stays platform-attributed. Pro plan or higher. (Wraps GET /api/v2/analytics/instances.)

Inputs: postId, brandId, includeReruns.

create_contentCreate a draftAInspect

[writes flayr data · write scope] Creates a DRAFT content item. Nothing is posted. Give text plus optional media (videoUrl / imageUrl, or videoStorageId / imageStorageId from upload_media), target platforms, brandId (from list_brands; omitted → the brand last active in the dashboard), per-platform captions (platformText), creator credits, labels and YouTube options. Returns the new id — pass it as contentId to publish or add_queue_items. (Wraps POST /api/v2/content.)

Inputs: text, labels, brandId, credits, +12 more.

create_experimentCreate an experimentAInspect

[writes flayr data · write scope] Creates an A/B experiment. Then tag drafts with its label (experiment:) and <compareKey>:<variant> via update_content labels, publish them, and read get_experiment_results. (Wraps POST /api/v2/experiments.)

Inputs: name (required), endAt, notes, status, +6 more.

create_frameAdd a frame to the libraryAInspect

[writes flayr data · write scope] Copy a flayr frame into the brand library (defaultKey, optional colors/texts), or add uploaded PNG/SVG art (upload_media first; variants of storageIds, the content area is detected from transparency). (Wraps POST /api/v2/frames.)

Inputs: kind, name, tags, texts, +4 more.

create_growth_triggerCreate a comment-to-get trigger (inactive)AInspect

[writes flayr data · write scope] Creates a keyword trigger, always INACTIVE: nothing is sent until a person turns it on. DMs work on Instagram and Facebook only; the reply text must not contain a keyword. (Wraps POST /api/v2/growth-triggers.)

Inputs: name (required), keywords (required), link, dmText, +12 more.

create_queueCreate a posting queueA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] Creates a posting queue. Once items are added it BOOKS REAL POSTS on the given platforms on its cadence (default daily 19:00 America/Chicago, 2 booked ahead). Use startsAt to hold everything until a date. Needs the publish scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/queues.)

Inputs: name (required), platforms (required), brandId, youtube, +5 more.

create_share_ruleCreate a share ruleA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] Creates a rule that reshares (or comments on) every new post of the source accounts. Defaults to needs_approval: each fire waits for approve in act_on_publish_action. Only LinkedIn (native reshare) and X (quote own / retweet) really repost; other platforms get a link share. Confirm with the user first. Needs the publish scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/automations/reshare-rules.)

Inputs: name (required), sourceAccountIds (required), kind, brandId, +6 more.

create_text_templateCreate a formatCInspect

[writes flayr data · write scope] Creates a reusable format (text template) in a brand. (Wraps POST /api/v2/text-templates.)

Inputs: name (required), format (required), length (required), source, +10 more.

cta_checkCheck a CTA before an adA
Read-onlyIdempotent
Inspect

[read-only] Checks whether a draft, post or link points at the brand's goal page (the same check the ad and boost routes run in paid mode; a block there refuses the ad). Run it before every boost or ad and paste the result. Nothing stored, free. Needs the Pro plan or higher. (Wraps POST /api/v2/cta-check.)

Inputs: mode, postId, brandId, caption, +5 more.

ctas_createAdd a CTAAInspect

[writes flayr data · write scope] Adds a call to action written by the person, claims-checked, optionally tagged as a goal (goalKey; isPrimary makes it the brand's primary goal and demotes the previous one). Nothing here creates or runs an ad. Free. Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/ctas.)

Inputs: card (required), line (required), platforms (required), destination (required), +7 more.

cta_settings_getGet goals and CTA check settingsA
Read-onlyIdempotent
Inspect

[read-only] The brand's goals (source tagged, implicit from the website, or none; the primary goal) and its CTA check settings (ctaLevel, ctaPaidLevel, organicSupportingHosts, autoApplyPrimaryCta). Free. Needs the Pro plan or higher. (Wraps GET /api/v2/hook-studio/cta-settings.)

Inputs: brandId.

cta_settings_updateUpdate CTA check settingsA
Idempotent
Inspect

[writes flayr data · write scope] Changes only the CTA check settings sent: ctaLevel (off, warn, block), ctaPaidLevel (warn or block), organicSupportingHosts and autoApplyPrimaryCta. Only the brand's owners and admins can change them. Confirm changes with the person first. Free. Needs the Pro plan or higher. (Wraps PATCH /api/v2/hook-studio/cta-settings.)

Inputs: brandId, ctaLevel, ctaPaidLevel, autoApplyPrimaryCta, +1 more.

ctas_generateGenerate CTAs (Hook Studio step 4)AInspect

[writes flayr data · write scope] Writes a batch of draft calls to action for the confirmed offers, claims-checked against where they point. Charges Embers once per call (refunded when nothing usable comes back). Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/ctas/generate.)

Inputs: count, brandId, offerIds, platforms, +1 more.

ctas_listList CTAsA
Read-onlyIdempotent
Inspect

[read-only] The brand's CTA bank (filter by status: draft, approved, retired), with each CTA's goal (goalKey, isPrimary, paidEligible, adButton) and claims result. Free. Needs the Pro plan or higher. (Wraps GET /api/v2/hook-studio/ctas.)

Inputs: status, brandId.

ctas_updateUpdate a CTAA
Idempotent
Inspect

[writes flayr data · write scope] Edits a CTA, its status or its goal fields (goalKey, isPrimary, paidEligible, adButton). New copy or a new destination is claims-checked again; a CTA whose claims block cannot be approved. Free. Needs the Pro plan or higher. (Wraps PATCH /api/v2/hook-studio/ctas.)

Inputs: id (required), card, line, status, +8 more.

decide_approvalApprove or reject held contentA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] Same rules as the dashboard: the assigned approver, or an owner/admin of the org, may decide. On a "workflow" approval, decision "approve" resumes the parked run, whose next steps may publish (GOES LIVE); "reject" cancels it. On a "manual" approval, "approve" only marks the content approved — nothing is posted until you call publish with its contentId — and "reject" returns it to draft. On "reject", pass the reviewer's reason as note (the submitter is told it); it is optional unless the org requires one (then 422 without it). Needs the explicit approve scope (admin does not include it). Agency plan. Repeating the same decision is safe (alreadyDecided: true). Confirm with the user before approving a workflow approval. (Wraps POST /api/v2/approvals/{id}.)

Inputs: id (required), decision (required), note.

decide_approval_groupApprove, redo or drop variants of one pieceA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] Decides several variants of a group from list_approval_groups at once, each as decide_approval would: members "all" (open variants), an array of approvalIds, or {axis: value} (e.g. {"audio":"voice"}). "approve" marks them approved (a manual approval is NOT posted; a workflow approval resumes its run, which may publish — GOES LIVE); "redo" rejects with the Redo reason; "drop" rejects (note = reason). Already-decided variants are skipped. Needs the explicit approve scope (admin does not include it). Agency plan. Confirm the count with the user first. (Wraps POST /api/v2/approval-groups/{groupId}/decide.)

Inputs: groupId (required), decision (required), note, members.

decide_campaign_review_sectionApprove, fix or drop a campaign review sectionA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] action "approve" approves the section's pending pieces (or pieceIds) and their held posts GO LIVE at their slots — needs the explicit review scope (admin does not include it); QA-failed pieces are skipped unless overrideQa. "fix" sends the pieces back with a note (required): their posts are taken off the schedule and the section opens a new round; other sections are untouched. "drop" takes the posts off the schedule and drops the pieces. "ready" puts fixed pieces back up for review. fix/drop/ready need review or publish. Agency plan. Confirm with the user first. (Wraps POST /api/v2/campaigns/{id}/review/sections/{sectionId}.)

Inputs: id (required), action (required), sectionId (required), note, +2 more.

decide_reviewApprove or hold a scheduled postA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] decision "approve" sends a held post to the platform for its slot (GOES LIVE) — needs the explicit review scope (admin does not include it) and never works on a post the same connection created. decision "hold" takes a scheduled post off the platform schedule — needs review or publish. Agency plan. id is a reviewId or a convexPostId. (Wraps POST /api/v2/reviews/{id}.)

Inputs: id (required), decision (required), note, pastSlot, +1 more.

delete_contentDelete a content itemA
DestructiveIdempotent
Inspect

[DESTRUCTIVE] DESTRUCTIVE: permanently deletes a content item from the library. Posts already live on a platform are not removed. Needs the write scope. Ask the user before calling. (Wraps DELETE /api/v2/content/{id}.)

Inputs: id (required).

delete_experimentDelete an experimentA
DestructiveIdempotent
Inspect

[DESTRUCTIVE] DESTRUCTIVE: deletes the experiment record (content keeps its labels). Ask the user before calling. (Wraps DELETE /api/v2/experiments/{id}.)

Inputs: id (required).

delete_growth_triggerDelete a comment-to-get triggerB
DestructiveIdempotent
Inspect

[DESTRUCTIVE] DESTRUCTIVE: deletes a trigger (its logs stay). Ask the user before calling. (Wraps DELETE /api/v2/growth-triggers/{id}.)

Inputs: id (required), brandId.

delete_queueDelete a posting queueA
DestructiveIdempotent
Inspect

[DESTRUCTIVE] DESTRUCTIVE: deletes the queue (its drafts stay in the library). With posts booked at the platform it is refused (409) unless unschedule: true, which first deletes those platform posts. Needs the publish scope (or admin) on the Agency plan or higher. Ask the user before calling. (Wraps DELETE /api/v2/queues/{id}.)

Inputs: id (required), brandId, unschedule.

delete_text_templateDelete a formatA
DestructiveIdempotent
Inspect

[DESTRUCTIVE] DESTRUCTIVE: deletes a format (drafts started from it keep their text). Ask the user before calling. (Wraps DELETE /api/v2/text-templates/{id}.)

Inputs: id (required).

edit_post_labelsSet or add internal post and instance labelsA
Idempotent
Inspect

[writes flayr data · write scope] Sets internal post labels and per-platform/account instanceLabels. Omitted sets stay unchanged; [] clears a set; labelMode set replaces both sets, add appends atomically. Use get_post to list both. Works after booking and publishing, and never contacts social networks. Labels are key:value (campaign, experiment, variant, repost, series, source-run, or free keys). Needs publish scope and the publishing plan. (Wraps PATCH /api/v2/posts/{id}.)

Inputs: id (required), labels, labelMode, instanceLabels.

get_analyticsAnalytics overviewB
Read-onlyIdempotent
Inspect

[read-only] Engagement overview for the last 7, 30 or 90 days. Pro plan or higher. (Wraps GET /api/v2/analytics.)

Inputs: range, groupBy, labelKey, experimentId.

get_campaign_reviewGet a campaign's review sectionsA
Read-onlyIdempotent
Inspect

[read-only] A campaign's pieces grouped into review sections (episode, week, channel set, variant group or the creator's own). Each piece has preview URLs (video / images / audio), caption, labels, its bookings (channels, time, review state) and QA checks; each section has its status, round and every previous fix note. Share reviewUrl so a person can preview and decide in flayr. (Wraps GET /api/v2/campaigns/{id}/review.)

Inputs: id (required), pieces, sectionId.

get_contentGet a content item and its post statusA
Read-onlyIdempotent
Inspect

[read-only] One content item plus its live posting status: postState and posts[] (up to 20, newest first) with each post's status (scheduled · publishing · published · partial · failed · review_held · held), scheduledAt, and per-platform status, live URL and error. The item's own status stays "draft" after publishing — read posts to know whether it is live. Use this to confirm a publish landed. (Wraps GET /api/v2/content/{id}.)

Inputs: id (required).

get_experimentGet an experimentB
Read-onlyIdempotent
Inspect

[read-only] One experiment: hypothesis, variants, compareKey, window and status. (Wraps GET /api/v2/experiments/{id}.)

Inputs: id (required).

get_experiment_readoutExperiment readoutB
Read-onlyIdempotent
Inspect

[read-only] n per arm, pooled reach engagement rate (or average percentage watched when selected), a 90% interval and a hedged verdict (likely_winner, no_clear_winner or not_enough_data). Missing numbers are "not reported" (null), never 0. Say "likely", never "proven". (Wraps GET /api/v2/experiments/{id}/readout.)

Inputs: id (required), window.

get_experiment_resultsExperiment resultsB
Read-onlyIdempotent
Inspect

[read-only] The experiment's posts split by its compareKey, with the leading variant by its primary metric and n per arm. Small samples: read medians with their n. (Wraps GET /api/v2/experiments/{id}/results.)

Inputs: id (required), window, include.

get_experiment_roundsVariant test roundsA
Read-onlyIdempotent
Inspect

[read-only] A version test's rounds: each closed round's frozen snapshot, the open round's live numbers (null = not reported), the winner if one was recorded, and any repeat-winner proposal. (Wraps GET /api/v2/experiments/{id}/rounds.)

Inputs: id (required).

get_frameGet a frameB
Read-onlyIdempotent
Inspect

[read-only] One library frame with its sizes and content areas. (Wraps GET /api/v2/frames/{id}.)

Inputs: id (required).

get_frame_settingsGet auto-frame settingsA
Read-onlyIdempotent
Inspect

[read-only] Which frame each platform's images get automatically when a post is published or scheduled. (Wraps GET /api/v2/frames/settings.)

Inputs: no named parameters.

get_growth_triggerGet a comment-to-get triggerB
Read-onlyIdempotent
Inspect

[read-only] One trigger with its keywords, texts, link, cap and counts. (Wraps GET /api/v2/growth-triggers/{id}.)

Inputs: id (required), brandId.

get_growth_trigger_statsComment-to-get trigger statsB
Read-onlyIdempotent
Inspect

[read-only] Matched comments, unique commenters, replies, DMs and failures, in total and per day. (Wraps GET /api/v2/growth-triggers/{id}/stats.)

Inputs: id (required), brandId.

get_job_statusGet a render/generation job statusA
Read-onlyIdempotent
Inspect

[read-only] Status of an async job (combine_clips, render_motion_ad, or an API video generation): pending, processing, completed or failed. For a combine or a motion ad, resultContentId is the new draft once completed; a failed combine is refunded automatically. Poll every 10-30 s — renders take about a minute. (Wraps GET /api/v2/generate/status/{jobId}.)

Inputs: jobId (required).

get_postGet a scheduled post's first commentsA
Read-onlyIdempotent
Inspect

[read-only] A post (id = convexPostId from publish, or posts[].id from get_content): status, slot, platforms, its internal labels and per-platform/account instanceLabels, and while it is scheduled the first comment each platform will publish and whether it can be changed now. (Wraps GET /api/v2/posts/{id}.)

Inputs: id (required).

get_queueGet a posting queueA
Read-onlyIdempotent
Inspect

[read-only] A queue and its items in order, with each item's state (queued · publishing · scheduled · posted · failed · skipped), booked or projected slot, and attribution status. (Wraps GET /api/v2/queues/{id}.)

Inputs: id (required), brandId.

get_text_templateGet a formatA
Read-onlyIdempotent
Inspect

[read-only] One format (text template) with its full structure and example. (Wraps GET /api/v2/text-templates/{id}.)

Inputs: id (required).

group_campaign_reviewGroup a campaign into review sectionsAInspect

[writes flayr data · write scope] Puts the campaign's not-yet-sectioned pieces into review sections (groupBy: week, channel_set, variant_group, episode or phase; default the brand's setting). Existing sections and decisions are kept. (Wraps POST /api/v2/campaigns/{id}/review.)

Inputs: id (required), groupBy.

hooks_generateGenerate hooks (Hook Studio step 2)AInspect

[writes flayr data · write scope] Writes a batch of draft hooks (on-screen card + spoken line) from the confirmed offers, claims-checked; blocked ones come back in dropped, unsaved. Charges Embers once per call (refunded when nothing usable comes back). Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/hooks/generate.)

Inputs: count, angles, topics, bodyIds, +2 more.

hooks_listList hooksA
Read-onlyIdempotent
Inspect

[read-only] The brand's hook bank (filter by status: draft, approved, retired), with each hook's claims result. Free. Needs the Pro plan or higher. (Wraps GET /api/v2/hook-studio/hooks.)

Inputs: status, brandId.

hooks_updateUpdate a hookB
Idempotent
Inspect

[writes flayr data · write scope] Edits a hook or sets its status. New copy is claims-checked again; a hook whose claims block cannot be approved. Free. Needs the Pro plan or higher. (Wraps PATCH /api/v2/hook-studio/hooks.)

Inputs: id (required), fit, card, line, +6 more.

labels_bulk_editAdd or remove labels on many itemsAInspect

[writes flayr data · write scope] Adds and/or removes labels on up to 100 content items in one call: each item becomes (labels − remove) + add. Published items are fine (labels are metadata). Each item succeeds or fails on its own; read results. Removing source:ai-generated does not turn a post's AI label off: with no explicit toggle it follows how the media was made, and the result carries a warning. For real footage also call update_content with aiGenerated: false on each item. (Wraps POST /api/v2/content/labels.)

Inputs: ids (required), add, remove.

list_approval_groupsList held content as one group per pieceA
Read-onlyIdempotent
Inspect

[read-only] The same held content as list_approvals, grouped by piece: the variants of one draft (or sharing a group:<id> label), with the axes they vary on (theme, hook, audio …), a tally (approved / redo / dropped / open) and each variant's state and slot time. status open (default) / redo / approved / dropped / all. Needs the explicit approve scope. Agency plan. (Wraps GET /api/v2/approval-groups.)

Inputs: brand, status.

list_approvalsList content waiting for your approvalA
Read-onlyIdempotent
Inspect

[read-only] Content held for approval that waits on the account owner's decision, newest first: posts filed with publish requiresApproval: true, drafts submitted for review, and workflow runs parked at an approval gate. kind is "manual" or "workflow". With status "rejected" it lists rejected content instead, with the reviewer's reason (note, reasonChips), who rejected it and when. Needs the explicit approve scope (admin does not include it). Agency plan. (Wraps GET /api/v2/approvals.)

Inputs: status, brandId.

list_attribution_rulesList creator-credit rulesA
Read-onlyIdempotent
Inspect

[read-only] The brand's "posts like this must carry a credit" rules and its mode (flag / push_down). In push_down mode publish refuses or holds a post missing a required credit — add credits with update_content first. (Wraps GET /api/v2/attribution-rules.)

Inputs: brandId.

list_brandsList brandsA
Read-onlyIdempotent
Inspect

[read-only] Lists the brands this connection can file content into and publish through. Use an id as brandId on create_content, publish, queues and analytics tools; "personal" means the account owner's personal accounts. A connection bound to one brand sees only that brand (and personal is null). Each brand has its website and a setup checklist (hasBrandKey, hasWebsite, hasCtaGoal, adsConnected): set a missing website with brand_profile_update; a brand API key is created by the owner in Settings, never by an agent. (Wraps GET /api/v2/brands.)

Inputs: no named parameters.

list_connected_accountsList connected social accountsA
Read-onlyIdempotent
Inspect

[read-only] The social accounts a brand can post to — the same set publish would use for that brandId: platform, handle, display name, health (healthy, needs_reauth, disconnected) and whether flayr can post there right now (postable; Reddit is paused because Reddit closed its API to third-party apps). Call this before publish to pick platforms, and tell the user to reconnect any account that is not healthy at flayr.social/connect. (Wraps GET /api/v2/accounts.)

Inputs: brandId.

list_contentList contentB
Read-onlyIdempotent
Inspect

[read-only] Lists content items (drafts), newest first. Each carries postState ("posted" / "scheduled" / null) and posts[] (up to 5): where it went out, per platform, with status, live URL and failure reason. (Wraps GET /api/v2/content.)

Inputs: limit, brandId, includeArchived.

list_experimentsList experimentsC
Read-onlyIdempotent
Inspect

[read-only] A/B experiments. Content joins one by carrying the label experiment:<id> plus <compareKey>:<variant>. (Wraps GET /api/v2/experiments.)

Inputs: brandId, allBrands.

list_framesList framesA
Read-onlyIdempotent
Inspect

[read-only] The brand's frames (borders, overlays, lower thirds, corner tags, quote-card frames, ribbons) plus the built-in flayr frames in the brand colors. Each has a ref to pass to apply_frame. (Wraps GET /api/v2/frames.)

Inputs: kind, aspect, includeArchived.

list_growth_triggersList comment-to-get triggersB
Read-onlyIdempotent
Inspect

[read-only] The brand's keyword triggers: a comment matching a keyword gets a public reply and/or a DM. Shows whether each is active and its counts. (Wraps GET /api/v2/growth-triggers.)

Inputs: brandId.

list_pinterest_boardsList Pinterest boardsA
Read-onlyIdempotent
Inspect

[read-only] Boards of the Pinterest account(s) a brand publishes to. Use a board id as pinterest.boardId on publish. A board is required; the one you pick is remembered as the brand's default for next time, and a publish that uses the default says so (defaultBoardApplied). (Wraps GET /api/v2/pinterest/boards.)

Inputs: brandId.

list_post_commentsList a post's comments after publishB
Read-onlyIdempotent
Inspect

[read-only] A post's comments-after-publish and reshares, with status (waiting, needs_approval, sent, failed) and the resolved text. (Wraps GET /api/v2/posts/{id}/comments.)

Inputs: id (required).

list_publish_actionsList comments after publish and resharesA
Read-onlyIdempotent
Inspect

[read-only] Pending, sent and failed comments-after-publish and reshares of the brand (filter by status, e.g. needs_approval or failed), with what each waits on. (Wraps GET /api/v2/automations/actions.)

Inputs: status, brandId.

list_queuesList posting queuesA
Read-onlyIdempotent
Inspect

[read-only] Posting (drip) queues of one brand. A queue posts one item every cadenceHours at timeOfDay in its timezone, keeping lookahead items booked at the platform. (Wraps GET /api/v2/queues.)

Inputs: brandId.

list_reviewsList scheduled-post reviewsB
Read-onlyIdempotent
Inspect

[read-only] Scheduled posts waiting for (or given) a human sign-off, oldest slot first. canApprove tells whether THIS connection may approve each one. (Wraps GET /api/v2/reviews.)

Inputs: status, window, brandId.

list_share_rulesList share rulesB
Read-onlyIdempotent
Inspect

[read-only] The brand's share rules: "when publishes, reshare to (or comment on it) after N minutes with text T", each with its approval mode. (Wraps GET /api/v2/automations/reshare-rules.)

Inputs: brandId.

list_text_templatesList formats (text templates)A
Read-onlyIdempotent
Inspect

[read-only] Reusable text shapes per brand: sections, length targets, hook patterns, CTA slots and guardrails. Use one to shape a draft's text before create_content. (Wraps GET /api/v2/text-templates.)

Inputs: brandId, includeArchived.

list_youtube_playlistsList YouTube playlistsA
Read-onlyIdempotent
Inspect

[read-only] Playlists of the YouTube channel(s) a brand publishes to. Use a playlist id as youtube.playlistId on create_content or publish. (Wraps GET /api/v2/youtube/playlists.)

Inputs: brandId.

media_qa_getRead media QAA
Read-onlyIdempotent
Inspect

[read-only] Reads the cached video/audio QA report, timestamped findings and approval/booking gate. Missing or failed QA blocks. API keys cannot override. (Wraps GET /api/v2/content/{id}/qa.)

Inputs: id (required).

media_qa_rerunRe-run media QAAInspect

[writes flayr data · write scope] Queues a free media QA run using the existing per-minute cap. Poll media_qa_get. Does not approve, book or override. (Wraps POST /api/v2/content/{id}/qa/rerun.)

Inputs: id (required).

move_approvalsMove held content to another timeAInspect

[writes flayr data · write scope] Moves the planned time of one or many items waiting for approval. Moving never approves and books nothing. Needs the explicit approve scope (admin does not include it). Agency plan. (Wraps POST /api/v2/approvals/move.)

Inputs: to (required), ids (required).

move_reviewsMove held posts to another timeAInspect

[writes flayr data · write scope] Moves one or many posts held for review ("move to Tuesday 10:00", "+1 day"). Moving never approves and nothing goes live. A post already booked at the platform answers vendor_booked; use update_scheduled_post. Needs review or publish. Agency plan. (Wraps POST /api/v2/reviews/move.)

Inputs: to (required), ids (required).

music_tracks_createAdd music tracksAInspect

[writes flayr data · write scope] Add 1–50 uploaded audio tracks to a brand library atomically. First use upload_media for each file, POST its raw bytes to uploadUrl with Content-Type audio/mpeg (or the actual audio type), then pass the returned storageId and track metadata here. Include source, licenseCode and attribution; madeOn records the generation date for Suno music. No music generation or Ember charge. All tracks save or none do. Use stable externalIds from the manifest; list and compare them before retrying an uncertain result. Duplicates reject the whole batch. (Wraps POST /api/v2/music/tracks.)

Inputs: tracks (required), brandId.

music_tracks_listList music tracksA
Read-onlyIdempotent
Inspect

[read-only] List the brand’s uploaded music with audio URLs, source, license, attribution, duration, mood/tags and ad-use guidance. A bound key only accesses its brand; brandId can select a brand for an account-wide key. includeArchived also returns archived tracks. (Wraps GET /api/v2/music/tracks.)

Inputs: brandId, includeArchived.

offers_captureCapture offers (Hook Studio step 1)AInspect

[writes flayr data · write scope] Turns what the brand sells (pasted text, or answers to the offer interview) into draft offers in its offer bank, with prices from the plan catalog, Shopify or the text. Charges Embers once per call (refunded when nothing usable comes back). Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/offers.)

Inputs: text, source, answers, brandId.

offers_listList offersA
Read-onlyIdempotent
Inspect

[read-only] The brand's offer bank (filter by status: draft, confirmed, retired). Free. Needs the Pro plan or higher. (Wraps GET /api/v2/hook-studio/offers.)

Inputs: status, brandId.

offers_updateUpdate an offerA
Idempotent
Inspect

[writes flayr data · write scope] Edits an offer's fields or status; "confirmed" makes it usable for hooks and CTAs. Confirm changes with the person first. Free. Needs the Pro plan or higher. (Wraps PATCH /api/v2/hook-studio/offers.)

Inputs: id (required), name, pains, proof, +10 more.

plan_teardownPlan a teardown film from a 3D modelA
Read-onlyIdempotent
Inspect

[read-only] Teardown Studio: send a 3D model (model, base64 STL, 3MF or GLB, up to 3 MB inline) and get its parts list, a default teardown/1 plan (hold, explode, label the biggest parts, slow-motion, reassemble, reveal, brand end card; 16:9 and 9:16) built from part count and bounding boxes, and the render estimate (frames, worker time; free). Rename parts with names ({ p0: "Lid" }). Or send an edited plan instead of a model to check it against the limits and re-estimate. Nothing is stored, rendered or charged. A model that is not a physical object (status render or prototype) is labelled "3D render" in the film. (Wraps POST /api/v2/video-studio/templates/teardown/plan.)

Inputs: plan, model, names, title, +5 more.

pronunciations_listList pronunciationsA
Read-onlyIdempotent
Inspect

[read-only] How every flayr voice (chat voice, voiceovers, character VO) says a brand's words: pronunciations (term → sayAs respelling, with verified when a Verify passed), suggested (learned suggestions, inert until accepted) and builtIn entries. Captions and transcripts keep the written word. brandId from list_brands, or personal. (Wraps GET /api/v2/pronunciations.)

Inputs: brandId.

pronunciations_upsertSet a pronunciationAInspect

[writes flayr data · write scope] Sets how voices say term for a brand: sayAs is a plain respelling (e.g. "Dahss-tuhl"). Updates the entry with that term (case-insensitive; accepts a waiting suggestion) or creates one; fields left out keep their values. acceptedHearings are transcriptions Verify also counts as a pass. Applies to every voice from the next render, with no per-call setup. (Wraps POST /api/v2/pronunciations/upsert.)

Inputs: term (required), sayAs (required), note, brandId, +3 more.

pronunciations_verifyVerify a pronunciationAInspect

[writes flayr data · write scope] Speaks a carrier sentence with the entry in a voice (default Gemini Puck), transcribes it, and passes when the transcript has the term or an accepted hearing. CHARGES EMBERS per check: only call it when the user asks, after telling them the price (GET /api/v2/pronunciations/{id}/verify quotes it; nothing is charged for a quote). Never refunded, even when the check fails or cannot run. id from pronunciations_list. (Wraps POST /api/v2/pronunciations/{id}/verify.)

Inputs: id (required), model, voice, brandId.

propose_repeat_winnerPropose repeating the winnerAInspect

[writes flayr data · write scope] Proposes slots to post the winning version again (default 3 over 2 weeks). Only a proposal: nothing is booked or posted until the user confirms it in flayr, and then each post still goes through approval. (Wraps POST /api/v2/experiments/{id}/repeat-winner.)

Inputs: id (required), startAt, platforms.

publishPublish or schedule a post (goes live)A
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] PUBLISHES TO REAL SOCIAL ACCOUNTS. Posts now, or at scheduledAt (ISO-8601, future). Prefer contentId (a draft from create_content: its text and media become the post) over inline content. The post goes out through the target brand's own connected accounts. Always pass an idempotencyKey so a retry never double-posts. platformText ({ twitter: "…", linkedin: "…" }) gives each platform its own caption, as update_scheduled_post takes it (saved on the draft with contentId); unknown arguments are refused (422 unknown_fields). The same safety gates as the dashboard apply: platform readiness/media rules are checked up front (422); if the brand requires scheduled-post review nothing is sent and you get { status: "pending-review", reviewId }; a missing required creator credit in a push-down brand is refused (422 attribution_missing) or held; the "Posted with flayr.social" caption watermark and video watermark follow the plan (409 watermark_pending means the watermarked video is still rendering — retry after retryAfterSeconds); 409 duplicate_content means the same content already went to that account in the last 24 hours (existingPostId names it; nothing new was posted). facebook: { contentType: "reel" } posts a Facebook Reel (exactly one video), "story" a Story, "feed" a regular post; instagram.contentType works the same; omitted → the draft's saved post type. instagram.trialReel: { enabled: true, graduation: "manual" | "auto" } posts a Reel to non-followers first (Instagram Trial Reel; omitted graduation → admin default; ignored with a warning when not a Reel). pinterest: { boardId, title, link } picks the board (ids from list_pinterest_boards; required: omitted → the brand's last-picked board for that account, flagged as defaultBoardApplied, else 422 pinterest_board_required), pin title and destination link. requiresApproval: true files it for human approval instead of posting. A draft that is already scheduled on one of the platforms is refused (409 already_booked): change the booked post instead, or pass allowDuplicateBooking: true only when the user asked to post it again. Needs the publish scope (or admin) and the Pro plan or higher; each publish counts against the plan's direct posts for the month. Confirm with the user before posting now. Then call get_content to see the live URLs. (Wraps POST /api/v2/publish.)

Inputs: platforms (required), memo, poll, labels, +24 more.

query_insightsRun a custom insight queryA
Read-onlyIdempotent
Inspect

[read-only] Read-only analytics query: one metric aggregated (median by default) over posts, broken down by up to a few dimensions (platform, weekday, hour, brand, campaign, postType, label:, arm), at a fixed post age window (48h / 7d / 30d / lifetime) so posts are compared fairly. Every row carries its sample size n; platforms that do not report the metric are listed in availability, never counted as 0. Pro plan or higher. (Wraps POST /api/v2/insights/query.)

Inputs: dateTo, format, metric, window, +8 more.

queue_item_actionSkip, retry, unschedule, retitle or move a queue itemA
DestructiveIdempotent
Inspect

[PUBLISHES to social accounts · publish scope] action: "skip" passes over a queued item; "retry" puts a failed/skipped item back in line; "unschedule" deletes a booked platform post and puts the item back in line. Also youtubeTitle, per-item platforms, and position (0-based among waiting items). Needs the publish scope (or admin) on the Agency plan or higher. (Wraps PATCH /api/v2/queues/{id}/items/{itemId}.)

Inputs: id (required), itemId (required), action, brandId, +3 more.

remove_queue_itemRemove an item from a queueA
DestructiveIdempotent
Inspect

[DESTRUCTIVE] DESTRUCTIVE: removes an item (the draft stays in the library). A booked (scheduled) item is refused (409) unless unschedule: true, which deletes its platform post first. Needs the publish scope (or admin) on the Agency plan or higher. (Wraps DELETE /api/v2/queues/{id}/items/{itemId}.)

Inputs: id (required), itemId (required), brandId, unschedule.

render_motion_adRender a motion ad from a Library cardAInspect

[writes flayr data · write scope] Turns one Library image (the card) into a 6-15 s motion ad: hook (push-in on the card), up to 3 body beats (pans with the text), then a CTA end card in the brand color with the CTA and the link host. 9:16 unless aspect is 1:1 or 16:9. The text is used exactly as given; it is not rewritten. Saves a new draft in the card's brand (labels format:motion-ad, source:template); nothing is posted and the card is unchanged. Free. Returns a jobId: poll get_job_status. (Wraps POST /api/v2/video-studio/templates/motion-ad-from-card/render.)

Inputs: cta (required), hook (required), ctaUrl (required), contentId (required), +4 more.

reorder_queue_itemsReorder waiting queue itemsA
Destructive
Inspect

[PUBLISHES to social accounts · publish scope] Send every waiting (queued) item id exactly once, in the new order. Booked, posted, failed and skipped items keep their places. Needs the publish scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/queues/{id}/items/reorder.)

Inputs: id (required), itemIds (required), brandId.

reschedule_postMove a scheduled post to a new timeA
DestructiveIdempotent
Inspect

[PUBLISHES to social accounts · publish scope] MOVES A SCHEDULED POST to scheduledAt (ISO 8601 with a timezone, e.g. "2026-11-19T15:00:00Z"; more than 5 minutes ahead). The booking keeps its id, caption, media, accounts and options; its posting-queue slot follows. Returns { status: "rescheduled", scheduledAt }. Refused within 5 minutes of the current slot, while it is posting or posted, and in a brand whose scheduled posts require review. Needs the publish scope (or admin) and the Pro plan or higher; each publish counts against the plan's direct posts for the month. Confirm the new time (and its timezone) with the user first. (Wraps PATCH /api/v2/posts/{id}.)

Inputs: id (required), scheduledAt (required).

start_experiment_roundStart a test roundAInspect

[writes flayr data · write scope] Files the round's versions into the approval queue on the given platforms, in spaced slots with UTM links. Nothing posts until a person approves each one. Round 2 re-tests the arms kept from round 1. (Wraps POST /api/v2/experiments/{id}/rounds.)

Inputs: id (required), platforms (required), startAt.

suggest_tagsSuggest hashtags and @mentionsA
Read-onlyIdempotent
Inspect

[read-only] Hashtag and @mention suggestions for each platform, from the brand's own config: hashtags from its brand profile's hashtag sets (within each platform's limit, skipping ones already in text), mentions from its mention contacts written the way each network receives them (@handle; on LinkedIn @[Name](urn:li:organization:…)). A contact with no account on a platform is not suggested there. Suggestions only: nothing is added to any caption; offer them to the user. Instagram allows 30 hashtags and YouTube 15; publish removes extra ones. (Wraps POST /api/v2/content/suggest-tags.)

Inputs: platforms (required), text.

update_contentEdit a draftA
Idempotent
Inspect

[writes flayr data · write scope] Edits a draft in place; only the fields you pass change. Any media field replaces the draft's media as a set (keeps the id, so queue items still point at it). Refused (409) for archived or already-published items, and a media swap is refused once a queue booked it. labels, opus, videoWatermarked, library and aiGenerated may be changed on published items too. aiGenerated is the post's AI label: false for real footage, null back to automatic. A video draft's custom thumbnail/cover: thumbnailStorageId (an image from upload_media) or thumbnailUrl, or thumbnailFrameOffsetMs for a frame of the video; thumbnailUrl: null clears it. It is sent to YouTube (long-form), Facebook, LinkedIn, Instagram Reels, TikTok and Pinterest at publish. (Wraps PATCH /api/v2/content/{id}.)

Inputs: id (required), opus, text, title, +16 more.

update_experimentUpdate an experimentB
Idempotent
Inspect

[writes flayr data · write scope] Changes an experiment's fields (e.g. status "running" / "done", endAt, notes). Only the fields you pass change. (Wraps PATCH /api/v2/experiments/{id}.)

Inputs: id (required), name, endAt, notes, +6 more.

update_frame_settingsSet auto-frame for a platformAInspect

[writes flayr data · write scope] Frame every image posted to a platform automatically (frameRef), or stop (frameRef null). Applies to posts published or scheduled from now on. Confirm with the user first. (Wraps POST /api/v2/frames/settings.)

Inputs: frameRef (required), platform (required), aspect.

update_growth_triggerUpdate or turn on a comment-to-get triggerA
DestructiveIdempotent
Inspect

[PUBLISHES to social accounts · publish scope] Changes a trigger; only the fields you pass change. active: true makes it reply to and DM real people from then on and needs the publish scope: confirm with the user first. active: false pauses it. (Wraps PATCH /api/v2/growth-triggers/{id}.)

Inputs: id (required), link, name, active, +14 more.

update_queueUpdate, pause or resume a queueA
DestructiveIdempotent
Inspect

[PUBLISHES to social accounts · publish scope] status: "paused" stops new bookings (already-booked posts stay booked); "active" resumes. Other fields (platforms, cadenceHours, timeOfDay, lookahead, startsAt, name) apply from the next booking. Needs the publish scope (or admin) on the Agency plan or higher. (Wraps PATCH /api/v2/queues/{id}.)

Inputs: id (required), name, status, brandId, +5 more.

update_scheduled_postEdit a scheduled post (caption, first comments, platforms)A
DestructiveIdempotent
Inspect

[PUBLISHES to social accounts · publish scope] CHANGES WHAT A SCHEDULED POST WILL PUBLISH on real accounts, keeping its slot, accounts, options, labels and draft. firstComment sets per-platform first comments (linkedin, facebook, instagram, threads, youtube; null removes; X/Bluesky have none); text / platformText change the caption; applyAutoFirstComment: true adds the brand's auto first comment where none is set; removePlatforms drops platforms from this booking (e.g. a duplicate TikTok); labels replaces the post's own labels (e.g. ["repost:evergreen"]; alone it never touches the booking, status "labeled"). Updated in place when the platform scheduler allows it, otherwise re-booked at the same slot (status "rebooked", new postId). Refused within 5 minutes of the slot. Repeating the same edit returns "unchanged". Needs the publish scope (or admin) and the Pro plan or higher; each publish counts against the plan's direct posts for the month. Confirm the new text with the user first. (Wraps PATCH /api/v2/posts/{id}.)

Inputs: id (required), text, labels, labelMode, +6 more.

update_text_templateUpdate a formatA
Idempotent
Inspect

[writes flayr data · write scope] Changes a format; only the fields you pass change. archived: true hides it. (Wraps PATCH /api/v2/text-templates/{id}.)

Inputs: id (required), name, format, length, +11 more.

upload_mediaGet a media upload URLAInspect

[writes flayr data · write scope] Step 1 of attaching a LOCAL file (video, image or audio) to a draft. Returns a single-use, short-lived uploadUrl. Step 2: POST the raw file bytes to it with the file's Content-Type, e.g. curl -X POST -H "Content-Type: video/mp4" --data-binary @clip.mp4 "<uploadUrl>" — the JSON response has a storageId. Step 3: pass it as videoStorageId or imageStorageId on create_content or update_content. For music-library audio, pass storageId to music_tracks_create instead. For media already on the web, skip this and pass videoUrl / imageUrl instead. Returns 413 when the account's storage is full. (Wraps POST /api/v2/media/upload-url.)

Inputs: no named parameters.

whoamiCheck this connectionA
Read-onlyIdempotent
Inspect

[read-only] Returns who this connection (an OAuth sign-in or an API key) belongs to: userId, the account's current plan tier, and brandId/brandName when the connection is bound to one brand (null = account-wide). Call this first to learn what the connection can reach. (Wraps GET /api/v2/ping.)

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Schedule, publish, and measure social posts on Facebook, Instagram, TikTok, LinkedIn, Threads, Pinterest, and X for one brand or many.
      34
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      AI-powered social media posting across 14 platforms. Post to Twitter, Instagram, TikTok, Facebook, LinkedIn, YouTube and more with one command. AI adapts content per platform, schedules posts, and generates 30-day content calendars.
      6
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Enables scheduling and publishing social posts across 18 platforms from MCP clients, with media uploads, analytics, comment replies, and Google Business review management.
      73
      1,351 npm
      MIT
    Try in Browser

    Glama MCP Gateway

    Add one secure layer between your agents and this server.

    Resources