API & MCP changelog

Every change to Pamba's REST API and MCP tools, newest first. Breaking changes say what to change on your side.

MCP server https://api.pamba.app/mcp · API docs · MCP tool reference

ChangedPosting & scheduling

Reading a long schedule page by page

list_scheduled_posts now says when a window holds more posts than it returned, and lets you read the rest page by page, so a 90-day window no longer looks like it ends early.

list_scheduled_posts returns at most 200 posts per call. When the window holds more, truncated is now true (it used to stay false until 2,000), and the answer carries next_offset. Call again with the same window and the new optional offset parameter set to next_offset until truncated is false. Every answer also echoes the offset it started from.

NewSlideshows

One-slide slideshows post to Instagram

A slideshow with a single slide can now go to Instagram, where it posts as a single photo. Two or more slides still post as a carousel, and a reel made from the slides still needs at least two.

schedule_slideshow_post and POST /slideshows/{slideshowId}/schedule now take a one-slide slideshow with platform instagram or both. One slide goes out on Instagram as a single photo, carrying the slideshow's Instagram sound like a carousel does. as_reel=true still needs at least 2 slides and is refused for a one-slide slideshow.

ChangedPosting & scheduling

TikTok sounds that aren't available

When TikTok says a post's sound isn't available, the post now fails with that reason instead of a generic sound error, so you know to pick another sound before you retry.

New error_code on a failed TikTok post: sound_unavailable. Nothing was posted, and Pamba does not retry it: pick another sound with set_slideshow_sound or set_video_tiktok_sound first, or the retry fails the same way.

ImprovedComments

Instagram automations message the newest comments first

On Instagram, comment-to-DM automations now answer each post's newest comment first, your posts taking turns, so on a post that keeps getting comments the DMs go out while the comments are fresh and your other posts' DMs still get their turn. A DM whose comment can't be found no longer uses one of the account's 20 DMs that day.

On Instagram, queued messages go out each post's newest comment first, the posts taking turns (TikTok keeps the oldest comment first). On both platforms, a message that ends not_sent with detail comment_not_found or video_not_found no longer counts toward daily_dm_limit.

Read the guide
ImprovedComments

Instagram automations skip private profiles

On Instagram, a comment-to-DM automation no longer tries to message someone whose profile is private, since Instagram gives no way to message them from it. Their comment gets your fallback reply instead, spread out with the account's comments within a week, and they don't use one of the account's 20 DMs that day, so the day's DMs go to people who can get them.

On Instagram, a message to a commenter whose profile is private ends skipped with detail private_profile: no message is tried, it doesn't count toward daily_dm_limit, and the comment gets the automation's fallback reply (reply_detail stays null while it waits for room in the account's comments, and is expired if the comment turns 7 days old first). TikTok is unchanged.

Read the guide
ChangedAccounts

The TikTok and Instagram pair price stays where you have it

If you sign up for Pamba from now on, every TikTok or Instagram account costs $100 a month. If you joined before this change, every workspace you own, a new one included, keeps the second account of each TikTok and Instagram pair at $50 a month.

Changed: bundle_eligible on GET /devices/accounts/seat-options is false for a workspace whose owner signed up after this change. Its unpaired_seats (and each card's) is then empty, and every seat bills price_cents. A workspace whose owner signed up before it reads as it did.

Added: purchase_account_seats returns bundle_eligible with its options.

ImprovedPosting & scheduling

Scheduled posts keep clear of new accounts being set up on the same phone

When a phone has a new account coming (a seat you bought or an account being recreated), the time its setup needs is booked on the phone's schedule from the start, so a post you schedule on that phone is placed around it and keeps the time you picked.

Changed: GET /devices/accounts/schedule (and get_account_schedule) lists a new account's setup booked on the phone as busy with kind task, at the time it is expected to reach the phone, and leaves it out of openings. An exact TikTok scheduled_at inside it is refused with the existing schedule_conflict, which names the next free time, and an exact Instagram one moves to the next free time that day; a date-only schedule picks a time around it.

NewAccounts· Updated Nov 7

Replace a suspended Instagram account for free

When Instagram suspends one of your accounts, or asks it for identity verification, after its first day, you can create a new account in its place for free (one a month per account slot), on a new phone, and admins get an email with a link to do it. Until then its warming stops and its scheduled posts wait for the new account, starting when you choose, or go back on schedule if the account turns out to work.

GET /devices/accounts/inventory rows and GET /devices/accounts/recreation carry replacement_offer (reason: suspended or identity_verification, since_epoch) when an Instagram account can be replaced for free: POST /devices/accounts/recreate then takes it with no cooldown and without phone_on_hold. The new health flag IDENTITY_VERIFICATION marks an account Instagram asks for a video selfie (its incident's error_code is ig_identity_verification). POST /devices/accounts/recreate and recreate_social_account take posts_start_after_days (0 to 14) to start the moved posts at least that many days after the new account is ready, each moved by whole days so it keeps its time of day and spacing; GET /devices/accounts/recreation and get_account_recreation add scheduled_post_count. POST /devices/accounts/username-suggestions takes replacing ({ platform, username }), and suggest_account_usernames takes replacing_platform and replacing_username, to suggest usernames for the new account. A pending Instagram post whose account is suspended or asked for identity verification carries awaiting_replacement: true (GET /devices/tiktok/posts/scheduled, GET /devices/tiktok/posts/{postId}, the project's scheduled_posts, GET /slideshows/{slideshowId}/scheduled-post, and the agent's scheduled-post tools) and is no longer failed with ig_account_suspended when it comes due: the replacement takes it, or it goes back on schedule when the incident closes, the queue resuming in order, each post at its own time of day, rather than all at once.

NewWarming

A warming niche for each account

Accounts in one workspace can now warm in different niches. Every account follows your workspace niche until you give it, or its avatar, a niche of its own on its page.

PUT /devices/accounts/warming takes niche, the account's own, and use_workspace_niche: true, back to the workspace's niche_description; it and GET /devices/accounts/warming answer niche and niche_source (own or workspace). PUT /avatars/projects/{projectId}/selected-avatar takes warming_niche and use_workspace_niche for every account the avatar links, and GET /devices/tiktok/warming/config/avatar-projects/{avatarProjectId} answers niche and niche_source. The new GET /devices/accounts/warming-niches lists the accounts and avatars with a niche of their own. PATCH /workspaces/{workspaceId} takes own_niches with a new niche_description: keep, the default, leaves those on theirs, replace moves them onto the new one, and the answer counts them in own_niches_replaced.

New tools: set_account_warming_niche and list_warming_niches. update_avatar_settings takes warming_niche and use_workspace_niche, update_workspace_settings takes own_niches and names the accounts and avatars that kept their own in own_niches_kept, and get_account_warming_config and get_warming_config return niche and niche_source.

Read the guide
BreakingChangedAccounts· Updated Nov 5

Suspended Instagram accounts are replaced by the Pamba team

When Instagram suspends one of your accounts in its first day, or bans one, the Pamba team replaces it for you. Until then, recreating it, or another Instagram account on its device, is refused because the device is held. An account suspended after its first day you can now replace yourself, for free.

POST /devices/accounts/recreate and the recreate_social_account tool refuse an Instagram account whose device held a suspended or banned account with phone_on_hold, and GET /devices/accounts/recreation and get_account_recreation report the same refusal.

What to change: treat phone_on_hold on such an account as final unless it carries replacement_offer, and contact support for its replacement.

Since 2026-11-05 an Instagram account suspended, or asked for identity verification, after its first day carries replacement_offer, and POST /devices/accounts/recreate replaces it for free on a new phone instead of answering phone_on_hold.

NewPosting & scheduling

TikTok stories, and videos on Instagram stories

Post a picture or a video to a TikTok account's story, seen by everyone, now or at a time you pick. Instagram stories take a video as well as a picture.

New routes: POST and GET /devices/tiktok/accounts/{username}/stories, for any TikTok account on your phones, linked to an avatar or not. A request takes image_url or video_url (exactly one) and an optional scheduled_at; a story has no link, song or highlight, and is seen by everyone. New tools: post_tiktok_story, list_tiktok_stories.

POST /devices/instagram/accounts/{username}/stories and post_instagram_story take video_url beside image_url, exactly one of the two: a Pamba video of at most 60 seconds (a rendered video, an uploaded one, or a media-library video). A video story plays its own sound, so it takes no instagram_audio_id or surprise_song. The story response carries video_url, and image_url is null for a video story.

New error_code values on a refused story request (400): invalid_media (both image_url and video_url, or neither) and invalid_video_url. invalid_song also answers a song sent with video_url.

BreakingChangedPosting & scheduling

Instagram reel drafts, and 10 drafts per account

only_create_draft now saves an Instagram reel as a draft in the app instead of sharing it, as it already did for TikTok posts, and one account gets at most 10 drafts.

only_create_draft: true on POST /projects/{projectId}/schedule now makes every leg a draft, the Instagram reel included: the phone prepares the reel as usual and saves it as a draft instead of sharing it. Before, only the TikTok leg was saved as a draft and the Instagram leg was shared. POST /devices/instagram/avatar-projects/{avatarProjectId}/posts and schedule_instagram_post take only_create_draft too, schedule_post now takes it for every platform it schedules, and PUT /devices/tiktok/posts/{postId} and update_scheduled_post turn it on or off for an Instagram post as well as a TikTok one.

A draft is never shared, so its post completes with nothing live and its project reads draft_created, or posted when another of its posts already went live. Pamba never publishes a draft later.

New error_code on a refused schedule or edit: instagram_draft_not_shareable (400). An Instagram draft takes no share_to_facebook: true and no trial_reel, and the automatic Facebook cross-post skips it.

Each draft takes room on the account's phone, so one TikTok or Instagram account gets at most 10 drafts in its life. A cancelled or failed draft is not counted, except an Instagram one whose outcome was lost. Past that, a draft is refused with the new code draft_limit_reached: as error_code on a schedule (409) and on an edit that would make a post a draft or move one to another account (400), and as code on a retry (409).

What to change: to share the Instagram reel while TikTok saves a draft, schedule TikTok alone with only_create_draft: true on POST /projects/{projectId}/schedule and the reel without it on POST /devices/instagram/avatar-projects/{avatarProjectId}/posts (or schedule_instagram_post). Leave share_to_facebook and trial_reel out of a draft, and once an account has its 10 drafts, schedule posts for it instead.

BreakingChangedAccounts

The high-demand notice on account seats no longer depends on your order

When you buy account seats, the notice that new accounts may take up to 3 days to be created now shows whenever new phones are short, whatever seats you pick.

Removed from GET /devices/accounts/seat-options: max_purchasable_seats, high_demand_from_seats and high_demand_from_seats_by_platform. purchase_account_seats no longer returns high_demand_platforms.

Changed: high_demand is true while Pamba's phones are short of room for new accounts, and while it is true every checkout purchase_account_seats creates carries high_demand_notice, whatever its seats.

What to change: show the notice when high_demand is true, and stop reading the removed fields.

ChangedPosting & scheduling

TikTok business accounts and sounds not cleared for commercial use

TikTok lets a business account post only with sounds cleared for commercial use, so a post with another sound now fails right away with that reason instead of a generic sound error. From then on, the sound searches for that account's avatar list only cleared sounds.

New error_code on a failed TikTok post: sound_not_licensed. Nothing was posted, and Pamba does not retry it: pick another sound with set_slideshow_sound or set_video_tiktok_sound first, or the retry fails the same way.

ImprovedAccounts

Accounts without an avatar count everywhere

Your accounts that no avatar is linked to now count wherever an avatar's would. Instagram and Facebook warnings about them reach your workspace, your weekly recap counts their views, and your Facebook ones show in Analytics and in your accounts list.

GET /facebook/analytics/dashboard and GET /facebook/analytics/accounts add unassigned_accounts: the workspace's Facebook accounts signed in on one of its phones that no avatar claims, directly or through their Instagram account, in the same shapes as Instagram's. scope_overview, the dashboard's video lists and GET /facebook/analytics/videos count them too.

GET /devices/accounts/inventory and list_accounts list those Facebook accounts with their avatar fields null; a Facebook account follows its Instagram account, so assign that one to an avatar. get_analytics_summary lists them for Facebook under the pseudo-avatar unassigned.

ImprovedComments

Automations wait while Instagram blocks an account's messages

When Instagram stops one of your Instagram accounts from sending messages, its comment-to-DM automations hold that account's messages until the block ends. The automation names the account, and the account picker says when its DMs resume.

New fields on each accounts item of GET /comments/automations: messaging_restriction (incident_id, restriction, added_on, ends_on; null when there is none) and messaging_resumes_on. list_comment_automations adds messaging_restriction per account, with resumes_on.

New detail value: messaging_restricted, on queued runs and on a not_sent run whose comment turned 7 days old while held, in GET /comments/automations/{automationId}/activity, the automations of GET /comments and list_comment_automation_activity.

Read the guide
BreakingChangedComments

Comment-to-DM automations send the link once they reply

An automation now sends two messages. The first asks the person to reply and has no link; when they reply yes, Pamba sends the second, with your link. Instagram doesn't let someone who doesn't follow you tap a link until they reply, and sending links only to people who asked for them keeps your accounts from being flagged as spam.

POST /comments/automations and create_comment_automation require follow_up_text, the message with the link, up to 1,000 characters. A save checks both messages: 400 link_in_first_message for a link in dm_text, 400 follow_up_required when follow_up_text is missing or only a link, 400 follow_up_too_long past 1,000 characters. Turning an automation on needs follow_up_text; one that is off without it can still be saved while it stays off.

Existing automations moved to two messages: a message with a link became follow_up_text, after a default first message in dm_text; one with no link, or only a link, kept its message and was turned off until it has a second one.

New fields: follow_up_text on an automation, and replied_yes and links_sent in its last_7_days; follow_up_status, follow_up_detail, follow_up_sent_at and replied_at on each run of GET /comments/automations/{automationId}/activity; follow_up_status, follow_up_detail and replied_at on each automations item of GET /comments.

What to change: move the link from dm_text to follow_up_text, and send follow_up_text when you create an automation or turn one on.

Read the guide
ChangedAccounts

A new Instagram account's name can arrive a few days after it is made

When a new Instagram account is made on a phone that already holds another Instagram account, Instagram asks for no name at signup, so Pamba now sets the name you gave the account, or its avatar's, about three days after it is made. If you change the name before then, the name you set is the one it keeps.

PUT /devices/accounts/seat-usernames and set_account_username: on a phone that already holds an Instagram account, first_name and last_name (the name POST /devices/accounts/username-suggestions, POST /devices/accounts/username-check, suggest_account_usernames and check_account_username offer included) or the linked avatar's name are set about three days after the account is made; with neither, the account has no name. A name changed before then is the one kept. Elsewhere the name goes on at signup, as before.

NewAgent & MCP

A changelog you can follow

Every change you would notice in Pamba is listed here, newest first, with an Atom feed to follow it. Ask Pamba in chat what changed and it tells you which changes touch your workspace.

New public route: GET /changelog (no key needed), with audience, area, since, before and breaking filters. Atom feeds at /changelog/feed.xml and /changelog/api/feed.xml.

New tool: get_recent_changes, the same entries for the agent and MCP clients.

NewPosting & scheduling· Updated Nov 3

Mention accounts in TikTok captions

Write @handle in a video's or a slideshow's caption and the post links that account, on TikTok as on Instagram. A TikTok caption can mention up to 5 accounts.

A TikTok video's caption on POST /projects/{projectId}/schedule, PUT /devices/tiktok/posts/{postId}, schedule_post and update_scheduled_post now takes @handle mentions, at most 5, which post as linked mentions. An @ that starts no handle (an email address, a link, a lone @), a handle run straight into other letters or a hyphen, a sixth mention or the posting account's own handle is refused, with a 400 from the routes and the same reason from the tools, on an edit that moves the post to that account too.

Since 2026-11-03 a slideshow's caption on POST /slideshows/{slideshowId}/schedule and schedule_slideshow_post, and its edit on PUT /devices/tiktok/posts/{postId} and update_scheduled_post, takes @handle mentions too: on its TikTok photo post under the same rules as a video's, and on its Instagram carousel or reel as written, Instagram linking the handle, as on a reel. Both used to refuse any @.

New error_code on a failed TikTok post: mention_not_offered. TikTok's mention list offered no account for a handle in the caption, so nothing was posted, and Pamba does not retry it: fix the caption first, or the retry fails the same way.

Read the guide
ChangedPosting & scheduling

Instagram posts with a flagged caption

When Instagram stops a post because its caption looks like captions others reported, the post fails with that reason. Change the caption and retry it.

New error_code on a failed post: ig_caption_flagged. Nothing was posted, and Pamba does not retry it: change the caption with PUT /devices/tiktok/posts/{postId} or update_scheduled_post first, or the retry fails the same way.

ChangedPosting & scheduling

A failure code for Instagram media that could not be prepared

An Instagram post whose video or pictures could not be prepared for posting fails with its own code, and Pamba retries it.

New error_code on a failed Instagram post: phone_media_failed. The post's video or pictures could not be made into the copy a phone receives, and nothing reached the phone; Pamba retries it like any failure before the phone.

BreakingChangedAccounts

High demand on account seats is read per platform

When you buy account seats, the notice that new accounts may take up to 3 days to be created now looks at each platform in your order, so an order only for platforms with room is not told to wait.

New field: high_demand_from_seats_by_platform on GET /devices/accounts/seat-options, per platform the smallest order, in seats across platforms, it has no room for; a platform absent has room for an order of any size. purchase_account_seats adds high_demand_platforms, the platforms with no room at all, and its checkout's high_demand_notice says when an order waits.

Changed: high_demand_from_seats is null until every platform is listed in the new field, then the largest of its values, and high_demand is true only when every value is 1.

Changed: linking an account by its password (POST /devices/instagram/avatar-projects/{avatarProjectId}/link-account, POST /devices/facebook/avatar-projects/{avatarProjectId}/link-account, link_social_account) answers 409 no_workspace_phone when the workspace holds the Instagram side of none of its phones; an Instagram seat brings one.

What to change: read high_demand_from_seats_by_platform with open_slots to tell whether an order waits (over MCP, the checkout's high_demand_notice): high_demand_from_seats and high_demand now speak only for an order every platform is short for.

BreakingChangedAccounts

Imports only you can move on come back to you

When an account import Pamba's team is finishing needs something only you can do, such as approving the sign-in on your own phone, it comes back to you with the reason, and you retry it once that's done.

An import in with_team can now move to needs_customer, with a failure. New failure.code: approve_on_device, a sign-in approval asked on the owner's own phone that never came; retry it once that phone is at hand. An import whose wait for that approval ends unanswered now reads approve_on_device, where it read code_timeout. On GET /devices/accounts/imports, GET /devices/accounts/imports/{importId} and get_account_import_status.

What to change: handle approve_on_device as a needs_customer failure the owner clears on their own phone before a retry, as you handled code_timeout.

BreakingRemovedWarming

Boost routes and tools removed

The routes and tools that put a temporary boost on an account's warming are gone. An account's warming settings are its search terms and its search and follow switches.

Removed, now 404: GET, PUT and DELETE /devices/accounts/warming/boost.

Removed tools: get_account_warming_boost, start_account_warming_boost, end_account_warming_boost.

Now refused (400, nothing applied): PUT /avatars/projects/{projectId}/selected-avatar with a warming_config that sets anything but the search terms and the search and follow switches.

Changed: a warming_config without search_terms leaves the terms as they are (it used to reset them).

What to change: drop the boost calls, and send only search terms and switches in warming_config.

NewComments

Comment-to-DM automations

Pick a word. When someone comments it on a TikTok or Instagram post, Pamba replies to the comment and sends them a DM with your link. An automation covers every post on the accounts you choose, and the Comments page shows each reply and message it sent.

Routes: GET and POST /comments/automations; GET, PATCH and DELETE /comments/automations/{automationId}; GET /comments/automations/{automationId}/activity.

Tools: create_comment_automation, list_comment_automations, get_comment_automation, update_comment_automation, delete_comment_automation, list_comment_automation_activity.

New field: automations on each GET /comments thread and in list_comments.

Read the guide
ImprovedComments

When comments were last checked

The Comments page says when Pamba last checked your accounts for new comments.

New fields: checked_at on GET /comments, GET /comments/videos, list_comments and list_comment_videos; automations_on on GET /comments/videos.

BreakingChangedAccounts

Archived accounts are read-only

An archived account keeps its posts and history in Analytics, and nothing runs on it: no posts, warming, comments or profile edits.

Every request that would run or change anything on an archived account, its status included, is refused with 409 account_archived, and the tools return status account_archived. Work still queued for it leaves the schedule with the same code, and a post on it fails as tiktok_account_archived (TikTok) or instagram_account_paused (Instagram).

What to change: treat account_archived as final. Only the Pamba team can bring an archived account back.

NewPosting & scheduling

Trial reels, and Professional accounts from Pamba

Post a reel as a trial. Instagram shows it first to people who don't follow you, and you choose whether it ever reaches your followers or only once it performs well. You can also switch an Instagram account to Professional and pick its category.

trial_reel (and instagram_trial_reel where a request schedules both platforms) on the Instagram schedule routes and tools: release_to_followers_never or release_to_followers_once_it_performs_well. remove_trial_reel on update_scheduled_post.

instagram_account_type, instagram_category and instagram_show_category on POST /devices/accounts/profile-edits and update_account_profile.

Read the guide
NewWorkspaces & API keys

Create and set up a workspace from an API key

One API key can create a workspace, set it up and make a key for it, with no sign-in.

POST /workspaces takes setup: "complete" with niche_description and what_they_do; its 201 adds setup_status and setup_message.

POST /api-keys takes workspace_id; create_api_key takes key_workspace_id and returns workspace_id.

NewPosting & scheduling

First-frame covers

A video post's cover can be its first frame.

first_frame_cover on POST /projects/{projectId}/schedule, POST /devices/instagram/avatar-projects/{avatarProjectId}/posts, PUT /devices/tiktok/posts/{postId}, schedule_post, schedule_instagram_post and update_scheduled_post, and on post payloads.

New failure codes, which Pamba retries: cover_not_set, ig_cover_not_set.

BreakingChangedPosting & scheduling

The same content goes out once per platform

The same video or slideshow can't be scheduled on two accounts of one platform. Posting it to a TikTok and an Instagram account still works.

POST /projects/{projectId}/schedule, POST /devices/instagram/avatar-projects/{avatarProjectId}/posts and POST /slideshows/{slideshowId}/schedule answer 409 duplicate_content; PUT /devices/tiktok/posts/{postId} answers 400 with the same code.

schedule_post, schedule_instagram_post, schedule_slideshow_post and update_scheduled_post return status duplicate_content.

What to change: give each account of a platform its own video or slideshow.

ImprovedSlideshows

One-slide TikTok slideshows

A TikTok slideshow can be a single slide. An Instagram one still needs two.

POST /slideshows/{slideshowId}/schedule and schedule_slideshow_post accept a one-slide TikTok post, which was a 400. An Instagram post still needs 2 slides.

NewPosting & scheduling

AI-generated labels

Label a video post as AI-generated, with TikTok's and Instagram's own labels.

ai_label on POST /projects/{projectId}/schedule, POST /devices/instagram/avatar-projects/{avatarProjectId}/posts and PUT /devices/tiktok/posts/{postId}, and on the tools that schedule or update a video post.

NewPosting & scheduling

Instagram stories

Post stories with an optional link sticker and a song, and add them to a highlight. An account's highlights are listed in Pamba, and you can delete them.

Routes: POST and GET /devices/instagram/accounts/{username}/stories, GET /devices/instagram/accounts/{username}/highlights, POST /devices/instagram/accounts/{username}/highlight-deletes.

Tools: post_instagram_story, list_instagram_stories, list_instagram_highlights, delete_instagram_highlight.

NewCreating videos

Replicate an Instagram reel from its link

Paste a reel's link on the Create page, or hand it to Pamba in chat, and get your own version of it, the way TikTok links already work.

instagram_url on POST /projects/replications; new GET /projects/replications/instagram-source.

New tool inspect_instagram_reel; replicate_project takes instagram_url; get_replication_status adds source_instagram_url.

Read the guide
Additive changes never need action. Breaking ones always say what to change.