add_media_from_url
ChatGPTPull an image or video from a public URL into this account's media library and get back a media id for schedule_post.
approve_suggestion
ChatGPTApprove an autopilot draft. Returns its caption and intended platform so you can then schedule it with schedule_post — approving does NOT publish on its own.
bulk_schedule
ChatGPTSchedule many posts in one call — a content calendar, a thread split across days, a week of promos. Each item is scheduled independently; if one fails the rest still go through and the failures are reported per item.
cancel_post
ChatGPTCancel a scheduled post before it goes out. Stops every pending platform job; platforms it already published to are untouched. Reversible in the sense that the post row survives — use delete_post to remove it entirely.
configure_autopilot
ChatGPTTurn autopilot on/off and set its cadence, batch size, target platforms, topic and voice. Autopilot drafts posts for you on a schedule; nothing publishes without approval.
configure_recycle
ChatGPTSet the auto-recycle rule: re-post anything that earned at least min_revenue, no more often than every cadence_days. Turns proven winners into a repeating stream instead of one-offs.
create_experiment
ChatGPTCreate a caption A/B test: give one idea and a platform, and seenpaid writes N variants. Nothing goes live until launch_experiment. The winner is decided on revenue earned, not engagement.
create_media_upload
ChatGPTStep 1 of 2 for uploading a file you already have (rather than one at a public URL — for that use add_media_from_url). Returns a URL to HTTP PUT the bytes to, then call finish_media_upload with the same r2_key to get a media id. Use this for large videos: the bytes go straight to storage, so there is no size ceiling.
create_tracked_link
ChatGPTMint a tracked short link for a post. Clicks on it are attributed to that post, and any Stripe sale that follows is traced back to it. Use this when publishing somewhere seenpaid doesn't post to directly (a newsletter, a video description, a manual post) so the revenue still lands on the right post.
delete_post
ChatGPTPermanently delete a post and cancel any pending publishes. This cannot be undone — prefer cancel_post unless the user explicitly asked to delete.
disconnect_account
ChatGPTDisconnect a social account. Scheduled posts targeting only that account will stop publishing, so check list_posts first.
dismiss_suggestion
ChatGPTReject an autopilot draft so it stops appearing in the queue.
finish_media_upload
ChatGPTStep 2 of 2 after create_media_upload: confirms the bytes arrived and returns a media id for schedule_post. Verifies the file against storage rather than trusting what you report, so call it only after the PUT succeeded.
forecast_post
ChatGPTPredict what a draft would earn, based on this account's own history — returns a low/high range and the factors driving it. Use BEFORE scheduling to compare two versions of a caption.
generate_carousel
ChatGPTRender 2-10 branded carousel slides (1080×1080 PNGs — dark brand background, title slide + numbered content slides) from text YOU write, and get back ordered media ids for schedule_post. Each slide can also take an image_prompt for an AI-generated background, drawn under a scrim so the copy stays readable. This tool only renders; it does not generate copy. Platforms cap attached images: LinkedIn 9, X/Bluesky/Mastodon 4. Instagram is not supported for these.
generate_image
ChatGPTGenerate an image from a text prompt and store it in this account's media library. Returns a media id you can pass to schedule_post — the fastest way to go from an idea to a post with visuals.
generate_suggestions
ChatGPTRun autopilot immediately instead of waiting for its next scheduled batch. Returns how many drafts were created.
get_account_health
ChatGPTWhich connected accounts are healthy and which stopped working. An account that needs reconnecting will silently fail to publish, so check this when a post didn't go out or before scheduling a big batch.
get_analytics
ChatGPTThe account's revenue attribution over a window — clicks, sales, revenue — with per-platform, per-country and per-device breakdowns, plus the change vs the previous equal-length period.
get_analytics_breakdown
ChatGPTSlice attribution by one dimension — where the traffic and money actually came from. Use this to answer "which referrer converts best" or "which UTM campaign earned the most".
get_analytics_timeseries
ChatGPTDay-by-day clicks, sales and revenue across a window, plus the change from the previous day. Use for trend questions — "is this growing", "which day spiked" — rather than a single total.
get_attribution_health
ChatGPTHow much of this account's real Stripe revenue seenpaid can trace back to a post. A low match rate means the tracking setup is incomplete, not that the posts failed — check this before trusting a low revenue number.
get_autopilot_status
ChatGPTWhether autopilot is on, how often it generates drafts, which platforms it targets, and how many suggestions are waiting for approval.
get_channel_roi
ChatGPTRank connected platforms by what they actually return — revenue, revenue per click, and revenue per post. Answers 'where should I spend my effort' with money instead of follower counts.
get_connect_url
ChatGPTGet the URL a human needs to open to connect a new social account. The agent can't complete OAuth itself — hand this link to the user.
get_dead_posts
ChatGPTPosts that got clicks but earned nothing — the content that looks like it worked and didn't. The single most actionable list in seenpaid: it tells you what to stop making.
get_experiment
ChatGPTOne A/B test in full — every variant with its clicks, sales and revenue.
get_experiment_winner
ChatGPTThe winning caption of a finished A/B test, ready to reuse or scale up.
get_money_dna
ChatGPTThe patterns behind this account's earning posts — best platform, best caption length, whether links help, best posting time. Derived from posts that actually earned, so it needs a few earning posts before it reports anything.
get_money_feed
ChatGPTThe live activity stream — recent clicks, sales and refunds newest-first, each with the platform and country it came from. Use to answer "what just happened" or "did that post land".
get_next_slot
ChatGPTSuggest when to schedule the next post. Uses the workspace's own posting times when it has any — picking the soonest one that is free, and preferring the weekday that has actually earned the most money when one of those slots falls on it. With no posting times configured, falls back to guessing from revenue history alone.
get_plan_limits
ChatGPTThis account's plan and its caps: how many workspaces the subscription covers and how many exist. Social accounts inside a workspace are not capped. Check before creating a workspace.
get_platform_requirements
ChatGPTWhat each platform will and won't accept: caption character limit, whether media is mandatory, whether links in the post body can be tracked, and any platform-specific catch. Check this before writing captions for several platforms at once.
get_post
ChatGPTGet one post in full, including per-platform publish results — which platforms succeeded, the live URL of each published copy, and the exact error for any that failed.
get_post_revenue
ChatGPTRevenue, clicks and sales for one specific post.
get_recycle_status
ChatGPTThe rule for automatically re-posting content that already earned money, and which posts currently qualify.
get_top_posts
ChatGPTPosts ranked by revenue earned. Answers "which post made the most money" and "what should I do more of".
launch_experiment
ChatGPTPublish every variant of an A/B test. Each goes out as a real post with its own tracked link, so revenue can be attributed per variant.
list_accounts
ChatGPTThe connected social accounts — platform, handle, id and status. Use these ids or platforms when scheduling.
list_experiments
ChatGPTAll caption A/B tests with their variants, status and which variant is winning on revenue.
list_media
ChatGPTThe account's media library, newest first — images and videos already uploaded or generated. Returns ids you can pass straight to schedule_post instead of regenerating something that already exists.
list_notifications
ChatGPTThis account's alerts — sales that landed, publish failures, milestones. Use to catch problems the user hasn't seen yet.
list_posts
ChatGPTList posts with status, schedule time, target platforms and any publish errors. Filter by status to answer questions like "what is scheduled this week" or "did anything fail". Use from/to to bound the window: "what goes out tomorrow" is from=<tomorrow>T00:00:00Z, to=<tomorrow>T23:59:59Z. SCHEDULED posts come back soonest-first; everything else newest-first.
list_suggestions
ChatGPTThe autopilot-generated drafts waiting for a decision. Each has an id to pass to approve_suggestion or dismiss_suggestion.
list_workspaces
ChatGPTThe workspaces (brands or clients) this account belongs to. Each has its own posts, channels and revenue — an API key is scoped to exactly one, so this is how an agent knows which set of numbers it is looking at.
repost
ChatGPTRe-publish a post that already worked, as a brand-new post with fresh tracking. The classic use: call get_top_posts, then repost the top earner. Optionally override the caption or the platforms — the original post is left untouched.
schedule_post
ChatGPTSchedule or immediately publish a post. Give a caption plus either platforms or account_ids; omit both to post to every active account. Omit schedule_for to publish now. Use per_account_captions to tailor the text per platform (e.g. shorter for X).
summarize_performance
ChatGPTA single briefing an agent can read aloud: what went out, what earned, what died, what's broken and what to do next. Use this for 'how are we doing' rather than calling five tools and stitching them together.
update_post
ChatGPTEdit a draft or scheduled post — change its caption, its time, or both. Published posts cannot be edited (the platforms already have them).
validate_post
ChatGPTDry-run a caption against the platforms you plan to send it to, WITHOUT publishing. Reports per platform whether it would publish, and exactly why not — too long by N characters, media required and none attached, account disconnected. Call this before schedule_post whenever one caption goes to several platforms.