com.uplika/uplika
name:com.uplika/uplika
Your AI agent publishes to Threads, Instagram, YouTube and the other social channels you connect.
- transport:
- remote
- credential class:
- gated
Owner verification
Not yet verified. Verifying proves you control this server and is free, permanently — it never changes a published score.
Start verification →Tools
- approve_replyshallow
Threads only: approve (or ignore) a reply held by reply approval on one of the account's posts. Approving makes it public. Read the queue with pending: true.
- bridge_statusshallow
Naver Blog only. Posts to Naver Blog are written by the uplika browser extension inside the user's own Chrome, so nothing goes out while that Chrome is closed. Call this before publishing to Naver Blog. If online is false, the response carries wake commands per OS that open Chrome on the user's computer in the profile that has the extension (found by extension id). If you have a shell on that computer, run the one for its OS, then call this again or get_post; the extension reconnects within about a minute and queued posts go out. publish also returns the same bridge object when the extension is offline.
- create_automationshallow
Create an automation from any template in list_automation_templates by passing its params. Creates a draft. For a flow no template covers, build the document yourself and call put_automation on the draft.
- create_comment_to_dmshallow
The most common automation: when someone comments on a post, DM them. **Creates a draft; nothing goes out until enable_automation.** How Meta works: a DM cannot be started by the account. The only automatic door is a private reply to a comment, one per comment, within 7 days of the comment, and once the person answers the 24-hour window opens for the rest. Instagram can check whether the person follows the account (requireFollow); Facebook cannot, so requireFollow is rejected there. Threads has no DMs at all; use create_automation with comment_public_reply. Files go through media_presign first and are passed as deliver.mediaId. post can be our post id, the post's own id on the platform, a link to the post, "any" for every post, or "next" for the next post you publish (or pass automation on publish to do both in one call). Only one enabled automation per account can wait for "next" (409 next_post_taken). Order when everything is on: opening DM (message + button) -> askEmail -> requireFollow -> deliver (text, up to three link buttons, file; clicks are tracked) -> followUp if no link was clicked. openingDm:false sends deliver as the private reply itself; then requireFollow, askEmail, followUp and files are rejected because the window never opens.
- delete_automationshallow
Delete an automation and its run history. Cannot be undone. A live automation is refused with automation_live: disable it first, or pass force: true after the person confirms, because deleting it stops what is going out to people.
- delete_postshallow
Delete a post from the channel for good. This is not reversible, so confirm with the person first. Daily delete limits differ per channel: Threads 100 a day, YouTube 20 a day. Works on posts written in the channel's own app as well, given the link.
- delete_replyshallow
Delete a comment for good. This is not hide_reply: it cannot be undone. What it reaches differs by channel and list_platforms says which ones support it at all. On Instagram and Facebook it removes anyone's comment on your post; on Threads and Bluesky a reply is itself a post, so it only removes replies the connected account wrote. Prefer hide_reply when the person just wants it out of sight.
- describe_grammarshallow
How to write the body for a channel that has its own markup. Naver Blog has one; every other platform returns not_supported, which is not an error to work around. Call this before writing a Naver Blog body for the first time, or whenever you want something the basics do not cover: highlighting a phrase, a styled table, a collage, an event block, a map with several places. Without a topic you get an overview and the list of topics; with one you get that section in full, including the mistakes that fail silently. The values come from the same grammar the publisher validates against, so what this returns is what publish accepts.
- diagnose_naver_blogshallow
Naver Blog only. Reads a blog's public RSS feed (its latest posts, at most 50) and says whether the titles are written for search: the share of titles carrying a search intent word (price, how to, review), how many start with a date or episode label, posts per month, the categories, and the words the blog repeats in titles (seedCandidates: candidates to research, not proven keywords). summary.oldest and summary.newest say which dates it read, so a quiet blog's 50 posts are not everything; summary.capped is true at 50. flags and thresholds carry the judgement (lowIntent when the intent share is under thresholds.lowIntentPct). Works for any public blog, not only connected ones, and needs no Naver keys. Cached 24 hours; a cache miss spends one of 20 diagnoses per person per day (quota in the response).
- disable_automationshallow
Stop an automation. Runs already waiting for a button stay waiting but nothing new starts.
- duplicate_automationshallow
Copy an automation as a new draft with the same triggers and settings, optionally with a new name. Runs and versions are not copied; a copy bound to a specific post keeps that post, a copy of a next-post flow waits for the next post again when enabled.
- enable_automationshallow
Turn an automation live. **This is the moment messages start going to real people.** Confirm with the person first. Only one automation per account can wait for the next post: enabling a second one is refused with next_post_taken until the first binds to a post. Refuses with reconsent_required if the account was connected before DM permissions, and warns if the account is not subscribed to webhooks.
- expand_naver_keywordsshallow
Naver Blog only. Expands seed keywords one level through Naver autocomplete on the server and returns every word found with the seed it came from (found[].from is seed or L1:<seed>). These are candidates to measure with research_naver_keywords, not proven keywords. Up to 10 seeds. Cached seven days; a call with at least one uncached seed spends one of 20 expansions per person per day. Server-side autocomplete is off by default: when the server answers naver_autocomplete_unavailable, pass your own keyword list to research_naver_keywords instead. naver_autocomplete_paused and naver_autocomplete_busy carry retryAfterSeconds.
- followshallow
Follow an account on the channel. Naver Blog only today: adds the blog as a neighbor. mutual: true sends a mutual-neighbor request that the other blog has to accept, so the result is pending until they do; without it the blog is added as a plain neighbor right away. Already a neighbor comes back as already. There is no unfollow. If the response carries `bridge`, follow `bridge.nextStep`: `run_wake` means run `bridge.wake` for the user's OS if you have a shell on their computer, wait about a minute, call bridge_status, then retry once, otherwise tell the user `bridge.userMessage` as it is; `ask_user_login` / `ask_user_update` mean tell the user `bridge.userMessage`. Do not retry more than twice.
- get_automationshallow
One automation as a document: triggers, nodes, start. Also returns version, which put_automation needs, and templateParams when the flow still has its template shape.
- get_contactshallow
One contact: name, username, whether they follow the account and whether it follows them (Instagram only, and only for people who have messaged), follower count, tags, opt-out, and when the messaging window closes. Follower lists do not exist on any channel; this is the closest thing.
- get_helpshallow
Uplika's troubleshooting answers: why something did not work and what the person can do about it. Call it with the error code you got (code), or with a short question in any language (query), when a call fails, when an automation did not react or a DM did not arrive, or when the person asks why something happened. Without arguments it lists every question with its id; pass id for one answer in full. Each answer has the steps, links and a url to the same answer on uplika.com that you can give the person.
- get_insightsshallow
Views, likes, replies, reposts, quotes and shares for one publish. Views and shares can be null when the platform does not report them yet — null is not zero.
- get_naver_keyword_historyshallow
The measurement history of one keyword: one point per day it was actually measured, newest first, with search volume, document count and posts per month. Shows whether a keyword is rising or cooling. An empty list means nobody has measured it here yet.
- get_postshallow
One publish: per-target status and the reason any target failed. For a post link you probably want open_post instead.
- get_publish_optionsshallow
What a channel needs to know before you publish to it. Only TikTok has this today; every other channel returns not_supported, which is not an error to work around. For TikTok it returns the creator nickname the post will go out as, the privacy levels this account may use right now, whether it can post at all, and its video length limit. Call it before every TikTok publish: the values are per account and change when the person edits their TikTok settings. options.tiktok.privacyLevel is required and has no default, so this is where you get the value to pass.
- get_quotashallow
How much of the 24 hour allowance is already used for posts, replies and deletes. Check this before a burst of publishing. This is live usage from the platform, not the static limits in list_platforms. We also cap how fast one account can publish, so publish can return rate_limited even when the platform allowance still has room.
- hide_replyshallow
Hide a reply on the channel, or show it again with hide: false. The reply id comes from list_replies, and postId is the publish it belongs to.
- likeshallow
Like a post — or a comment: pass replyTo (a reply id from list_replies) to like that comment instead of the post. Idempotent: if it is already liked the call succeeds with already: true and nothing is toggled. There is no unlike. Works on Naver Blog and on Instagram accounts connected through Facebook; other channels answer not_supported. On Naver Blog the post can belong to another blog: pass its link and we act as the connected account. Naver ignores liking your own post, and that comes back as naver_not_allowed rather than a fake success. If the response carries `bridge`, follow `bridge.nextStep`: `run_wake` means run `bridge.wake` for the user's OS if you have a shell on their computer, wait about a minute, call bridge_status, then retry once, otherwise tell the user `bridge.userMessage` as it is; `ask_user_login` / `ask_user_update` mean tell the user `bridge.userMessage`. Do not retry more than twice.
- list_accountsshallow
Connected social accounts. **Call this before publishing anything.** Each item has id, platform (threads etc.), handle and status. The accountIds you pass to publish are these ids, and only "active" ones publish. If the person did not name a channel, target every active account. If the list is empty, no channel is connected yet. Send the person to https://uplika.com/dashboard/connections.
- list_automation_runsshallow
Runs of one automation with their status and a step log. Status names why a run stopped: blocked_window (24-hour window closed), blocked_opt_out, blocked_paused (a person is handling that conversation), blocked_burst, failed_channel, expired, superseded, waiting, done.
- list_automation_templatesshallow
Ready-made automation templates with the params each one takes. Read this before create_automation. Every template lists the channels it works on. The most used one is comment_to_dm: a comment on a post gets one private reply with a button, and tapping it delivers a link or file inside the messaging window.
- list_automation_versionsshallow
Saved versions of one automation (every put_automation or update_automation adds one). Read one with get_automation and version.
- list_automationsshallow
Automations on the connected accounts: name, channel, whether it is live or a draft, triggers, run count. Use get_automation to read one flow's document.
- list_channel_postsshallow
What is actually on the channel right now, including posts written in the channel's own app. Use this to find a post when you do not have its link. Each item carries a permalink you can pass straight to open_post, reply or delete_post.
- list_conversationsshallow
The inbox: DM conversations on Instagram and Facebook and mention threads on Threads. Each item says whether the 24-hour window is open and how long is left. state: open (default) or closed. kind: dm or mention.
- list_mentionsshallow
Threads posts that mention the connected account, delivered by webhook. Same shape as list_conversations with kind mention. Reply with send_dm, which posts publicly.
- list_naver_draftsshallow
Naver Blog only. Lists the drafts (temp-saved posts) sitting in the blog's draft box: logNo, title and the last-saved time, newest first. A post you published with options.naver_blog.draftOnly is one of them, and so is anything the person saved by hand in the Naver editor. Pass a logNo from here to publish_naver_draft. Needs the extension 0.7.2 or later in the person's Chrome; otherwise you get extension_outdated. If the response carries `bridge`, follow `bridge.nextStep`: `run_wake` means run `bridge.wake` for the user's OS if you have a shell on their computer, wait about a minute, call bridge_status, then retry once, otherwise tell the user `bridge.userMessage` as it is; `ask_user_login` / `ask_user_update` mean tell the user `bridge.userMessage`. Do not retry more than twice.
- list_naver_keyword_reportsshallow
Lists the person's saved keyword research (from research_naver_keywords or the dashboard), newest first: when, what they typed, the first set's main and sub keywords, and every set with its prompt. Reports belong to the person, not a workspace.
- list_platformsshallow
Every channel and its rules: character limit, whether media is required, image and video limits, and what state the channel is in. Read this instead of guessing a platform's limits. status is one of three: live means anyone can connect; beta means the channel is in platform review and only accounts registered as testers on our app can connect yet, though publishing works normally for those accounts; soon means it is not connectable at all. charCount tells you how that channel counts a character, so you can check the length before calling publish instead of after it fails.
- list_postsshallow
Recent publishes made through us and the per-target status of each. Newest first, 20 by default. Pass limit for more or fewer, up to 100. hasMore means the list was cut short; pass the returned nextBefore as before to keep going. Posts that already existed on the channel are not here. Use list_channel_posts for those.
- list_repliesshallow
The whole reply thread under a post, nested replies included. `truncated` tells you we stopped before the end. The count here can differ from the replies metric in get_insights, which is normal.
- media_completeshallow
Step 2 of attaching an image. Call it after the upload finishes. We check the file really landed before marking it ready. Only a ready media id can be passed to publish.
- media_from_urlshallow
Attach an image or video that is already on the public web. We download it, copy it into our storage and give you a media id you can pass to publish. One step, no upload needed. https only. Google Drive and Dropbox **share** links do not work: they return an HTML preview page, not the file. Use a direct file URL that ends in the file itself. If you can see the image, write altText describing it.
- media_presignshallow
Step 1 of attaching an image or video. Returns a media id and a one-time uploadUrl. PUT the file bytes to uploadUrl with the same contentType, then call media_complete. Images: image/jpeg, image/png, up to 8MB. Video: video/mp4, video/quicktime, up to 1GB, 300 seconds, 1920px wide. Aspect ratio up to 10:1. Any image pixel width is fine. If you can see the image, write altText describing it. The response has mediaExpiresAt: this media id disappears after that time if it was never published, and publish will then fail with media_expired.
- media_upload_linkshallow
Ask the person to upload files from their own device. Returns a short-lived link. **Give the link to the person, then wait.** Poll media_upload_status with the token until it returns ready, and only then call publish with the media ids it gives you. Do not publish before the status is ready. Use this when the file is on their computer or phone; use media_from_url when the file already has a public https address.
- media_upload_statusshallow
Has the person uploaded yet? Returns waiting, ready or expired, plus every media id uploaded through that link. Pass those ids to publish as mediaIds.
- naver_layoutshallow
Naver Blog only. Shows how publish will lay the body out before anything goes out. By default (layout: template) publish reshapes the markdown into the blog's house form: #/## titles become underlined quote headings, a thin rule sits between sections, photos you did not place with media: references go one per section and the rest pair up at the end. Text never changes. Call this with the same content and mediaIds you will publish, show the person the result if they care about structure, then publish (it applies the same layout) or pass options.naver_blog.layout: "as-is" to publish exactly what you wrote. To let the person choose a form, pass forms: "all" (or a list of ids): you get every preset laid out side by side with its name, when to use it and a summary (sections, photos). Show them, let the person pick, then publish with options.naver_blog.form set to the chosen id. The server never picks for you.
- open_postshallow
Everything about one post in a single call: the text, the whole reply thread, and its metrics. This is the right tool when someone hands you a post link. Replies or metrics can come back null if the platform refused just that part.
- publishshallow
Post to social channels. Channels open today: threads, youtube. Get accountIds from select_channels — do not guess which channel the person meant. Text limits differ per channel: Threads 500 characters, YouTube 5000 UTF-8 bytes. Over the limit nothing goes out to any channel, so shorten it before calling. Images and video both work on the channels that take them, and a carousel can mix them. YouTube is different: it takes exactly one video, no images, and it needs options.youtube.title. Its description is measured in UTF-8 bytes, so Korean and Japanese cost three per character. There are three ways to get a media id, pick by where the file is: media_from_url when it already has a public https address, media_upload_link when it is on the person's own device, media_presign plus media_complete when you can PUT the bytes yourself. Then pass the media ids here. This publishes immediately on every channel except YouTube, which can be scheduled with options.youtube.publishAt while privacyStatus is private. If the user asks to schedule anywhere else, tell them uplika cannot do that yet. A YouTube video published before Google finishes reviewing this app is locked to private viewing, so say that when you report a YouTube post as done. Returns while the post is still publishing. The permalink is null at that moment. Call get_post with the returned id to see the final status and link. Pass wait: true to hold the response until it is really out — then you can tell the person it is posted instead of guessing. For a long post use threadItems instead of publish-then-reply: we keep the order and wait for each piece to land before sending the next one.
- publish_naver_draftshallow
Naver Blog only. Publishes a draft from the blog's draft box exactly as it is in Naver: the extension loads that draft in the editor and presses publish, so edits the person made by hand in Naver are kept. Do not send content. Category, tags and openType are taken from the draft unless you pass them. Returns the same shape as publish (202 with a target that resolves to published, or the bridge object when the extension is offline; wait: true holds until it settles). If that draft was made through uplika (a target whose externalId starts with draft:), the same post record flips to published instead of a second one appearing. To publish uplika's own copy of the text rather than what is in Naver, use update_post on that post instead. If the response carries `bridge`, follow `bridge.nextStep`: `run_wake` means run `bridge.wake` for the user's OS if you have a shell on their computer, wait about a minute, call bridge_status, then retry once, otherwise tell the user `bridge.userMessage` as it is; `ask_user_login` / `ask_user_update` mean tell the user `bridge.userMessage`. Do not retry more than twice.
- publish_nowshallow
Send a scheduled or draft post right now instead of waiting. Returns while it is still publishing, like publish; pass wait: true to hold for the result. A draft needs at least one target account first. Posts that already went out return post_not_editable.
- put_automationshallow
Replace an automation's whole document. Pass the version you got from get_automation; a stale version is refused with version_conflict so a concurrent edit is not overwritten. Node types: send (mode window | private_reply | public_reply), condition, action, delay, random, goto, ai. Waiting is a send node with buttons and next: null; the tapped button's next continues. A loop must pass through such a wait. Validation problems come back with paths. Changing a live flow changes what goes out to people.
- read_conversationshallow
One conversation with its recent messages and the contact: name, whether they follow the account (Instagram only), tags, opt-out. AI drafts waiting for approval show as status draft.
- refresh_accountshallow
Re-read one connected channel's metadata. On Naver Blog this re-reads the blog's categories through the user's browser extension and waits up to a minute for it; list_accounts then shows the new list under naverBlog.categories. Call this when a category the person mentions is not in list_accounts yet. If the extension is offline you get 202 and the refresh runs when that browser comes back. Other channels return refresh_unsupported because their metadata is live on every call.
- replyshallow
Reply to a post or to a reply. Leave replyTo empty to reply to the post itself; pass a reply id from list_replies to nest a reply under that reply.Like publish, this returns before the reply is live. Call get_post with the returned id to see the final status and link.
- research_naver_keywordsshallow
Naver Blog only. Measures keywords (monthly searches from Search Ad, blog document count and posts per month from API HUB), judges each one (best, possible, hard, wall, hot, saturated, phantom and so on, with why), and groups them into sets for one post: a main keyword plus two to five subs with the same search intent. Every set carries prompt, a ready-to-paste Korean brief for writing the skeleton of that post. Up to 60 keywords. Measurements are cached seven days across users; new ones run against a time budget, so partial: true with unmeasured[] means the budget ran out and calling again with the same keywords finishes the rest from cache. Each call is saved as a report (reportId) unless the same keyword set was saved in the last ten minutes, which returns that report's id instead.
- retry_postshallow
Retry the targets that failed on a publish. Targets that already went out are left alone, so this never double-posts. If nothing failed you get nothing_to_retry. Only applies to posts published through us.
- search_youtube_videosshallow
Searches YouTube for a keyword and returns the top videos with views, subscribers, the views-to-subscribers ratio (above 1 means the title and topic pulled more people than the channel has), Shorts or long-form (60 seconds or less counts as a Short), duration and publish date. order is viewCount, date or relevance; period 7d, 1m, 3m, 6m or 1y; format all, shorts or long; max 1-50 (default 25). The same search is cached 24 hours and does not count; a new one spends one of the person's daily searches (quota in the response) and shared YouTube Data API units (youtube_quota_exhausted when today's are gone). Carries prompt, a Korean brief that turns the table into title and hook ideas; pass topic to fill it in. Saved to the person's search history (reportId). Returns 403 research_tool_disabled with enableUrl if the person has not turned this tool on for connectors. Tell them once and do not call it again until they say it is on.
- select_channelsshallow
Pick which connected channels to post to. **Call this before publish and show the result to the person.** Leave scope empty to get the candidate list and let them choose. Use scope: "all" for every active channel, or an array mixing platform names ("threads"), handles ("@vibe.trender") and account ids. Duplicates are folded, expired and not-yet-live channels are dropped into `skipped` with a reason, a sentence you can read to the person, and a link to reconnect. Pass the returned accountIds to publish unchanged. `limits` is the tightest rule across the chosen channels, so write to that. If both accountIds and candidates come back empty, nothing is connected yet. Send the person to https://uplika.com/dashboard/connections to connect a channel, then call this again.
- send_dmshallow
Send a message in a conversation as the account. **Only inside the 24-hour window** after the person's last message; outside it the call is refused with window_closed and nothing can be done until they write again. On a mention thread (Threads) this posts a public reply. Pass draftId to send an AI draft that was waiting for approval. Sending pauses automations on that conversation for 30 minutes.
- send_to_past_commentsshallow
Run a live comment automation on comments that are **already on the post**: the ones it missed because they came before it was enabled, during an outage, or while another tool handled the account. An automation normally reacts only to new comments. How Meta works: a comment can get one private reply, and only within 7 days. Older comments cannot be reached, and a comment another app already answered by DM is refused by Meta (counted as alreadyReplied, not as a failure). Instagram and Facebook only; top-level comments only. mode preview sends nothing: it reads the newest comments and answers eligible (how many would get the automation now) and skipped by reason (mine, tooOld, keyword, alreadyRan, answered, sameAuthor). One person gets it once: when someone commented several times, only their newest comment is answered (sameAuthor counts the rest). **Always preview first, show the person the numbers, and start only after they confirm**, because a sent message cannot be recalled. mode start queues the job: comments are answered a few at a time (Meta allows 750 private replies per hour per account, shared with the live automation), so a large post takes hours. Read progress in get_automation (pastComments), and see each answered comment in list_automation_runs. mode stop halts a running job; disabling the automation stops it too. By default a comment that already has a reply from the account is skipped (answered) and the trigger's public reply is not posted; includeAnswered and publicReply change that. The automation must be live (automation_not_live); one job per automation at a time (past_comments_running); a next-post automation that has not bound to a post yet has nothing to read (past_comments_no_post).
- update_automationshallow
Edit an automation that still has its template shape, without rebuilding the whole document: pass only the template params you want to change (the same params as create_automation / create_comment_to_dm). Top-level fields are replaced, object fields such as deliver merge one level deep (deliver.text alone keeps deliver.links), null removes a field, arrays are replaced whole. Read it first with get_automation and pass its version; a stale version answers version_conflict. Also renames (name) and turns it on or off (enabled, with the same checks as enable_automation). Instagram follow check: requireFollow, notFollowingMessage, recheckTitle. A flow that was edited on the canvas has no template shape and answers automation_not_template: use put_automation for it. Changing a live flow changes what goes out to people right away.
- update_mediashallow
Mark or unmark an uploaded image or video as AI-made (aiGenerated). Applies to posts published or edited after this call; posts already out do not change (use update_post to rewrite a Naver Blog post). Every copy of the same file in your workspaces follows.
- update_postshallow
Change a scheduled or draft post before it goes out: content, mediaIds, accountIds, options, scheduledAt or draft. Fields you leave out keep their current value; options you pass replace the whole options object. scheduledAt moves the send time (same rules as publish), null turns it into a draft, and draft: true does the same. A thread only takes schedule changes. Posts that already went out return post_not_editable: publish a new one instead.
- validate_automationshallow
Check a flow document against the rules for one account without saving it: node shapes, references, the 24-hour window, and features still in Meta review. Answers problems with paths; an empty list means put_automation would accept it.
Embed this server’s score
Tool count and median score across every tool in this server’s corpus — honest in a way a single cherry-picked tool’s badge wouldn’t be.
[](https://vouch.tools/servers/b6c8b879-0188-456c-baa8-546b1fa14104)