{identity} accepts an idn_… id or the identity’s name.
Activate
POST /v1/identities/{identity}/social/activate — scope billing:write
Creates the identity’s social workspace. The operation is idempotent: a later call returns the
existing workspace.
Read status
GET /v1/identities/{identity}/social — scope agents:read
Returns activated and the provider’s current connected accounts. Before activation it returns
activated: false and an empty account list.
Open the account portal
POST /v1/identities/{identity}/social/portal — scope billing:write
redirect_url defaults to the persona’s own studio screen on deployments
that configure one. The response contains a hosted url the account owner visits to authorize
one or more networks. The URL is short-lived provider state; do not store it as an account.
List accounts
GET /v1/identities/{identity}/social/accounts — scope agents:read
Returns a paginated list. This is a live reconciliation read, not a mirror of an
OAuth token or cached account table.
Upload media
POST /v1/identities/{identity}/social/uploads — scope sessions:write
Pass { "url": "https://…" }. The provider fetches the public image, video, or document and
returns a social_upload. Naive Managed Agents stores neither the source bytes nor a second upload record.
Create or schedule a post
POST /v1/identities/{identity}/social/posts — scope sessions:write
scheduled_at to queue the post immediately. title is optional and defaults to the first 100
characters. media_urls accepts up to ten public URLs, and file_ids up to ten stored fil_
ids — each resolves to a short-lived signed URL fetched once, so a stored file posts
without ever needing a public address.
Which targets are legal depends on whether the post carries media. bluesky, facebook,
linkedin, mastodon, threads, and x take a post either way. instagram, tiktok, and
youtube publish media, not text, so naming one requires at least one media_urls or file_ids
entry — a text-only post to them is refused validation_failed on platforms, and the message
says which platform and what is missing. pinterest and reddit are connectable but not yet
postable: each needs a per-post destination (a board, a subreddit) this body has no field for, and
a post naming one is refused with that reason rather than accepted and ignored.
visibility is optional and says who may see the published post: public, unlisted, or
private. Only mastodon and youtube accept it — they are the two networks whose contract
carries all three — and naming any other platform alongside a visibility is refused
validation_failed on visibility, with the network named. Omit the field and nothing is sent
upstream: the post publishes at the connected account’s own default, which on a video channel is
normally public. Managed Agents chooses no default of its own, so no existing integration changes behaviour.
AI-generated posts
Setai_generated: true when the post’s media was made with AI. The post then carries the network’s
own AI-content label where the network has one — TikTok, YouTube, Instagram, X and Pinterest — and
its caption ends with an #AIgenerated line on every network, kept inside the network’s length limit
(a caption that already carries the #AIgenerated tag is left as written; a phrase such as
“AI-generated” in the text does not count). A post that
attaches a file rendered as a character is labelled whatever the body says, and
so is every post from an agent whose social.post config sets "ai_generated": true — the AI
Influencer template sets it.
social component.
Read a post
GET /v1/identities/{identity}/social/posts/{post} — scope agents:read
The response reports scheduled, processing, posted, failed, or deleted state. A post id
owned by another identity returns not_found.
Analytics, comments, and deletion
GET /v1/identities/{identity}/social/accounts/{account}/analyticsGET /v1/identities/{identity}/social/posts/{post}/analyticsGET /v1/identities/{identity}/social/posts/{post}/commentsDELETE /v1/identities/{identity}/social/posts/{post}
data; comments use Managed Agents’ ordinary
pagination envelope.
List the company’s posts
GET /v1/posts — scope sessions:read
Every post the company files, across personas and sessions, in one list. A post an agent filed is
held for a person to allow before it goes out; it is listed here as pending until someone decides.
scheduled lists the soonest first; everything else lists newest first. Before a list that can show
sent posts, up to five posts that are due and not yet confirmed are checked with the network first,
each at most once every five minutes.
- A
pendingpost has no network id yet: itsidis the session and the approval it waits on. Allow or deny it withPOST /v1/sessions/{session_id}/tool_confirmationsand itstool_call_id. What an agent filed is exactly what goes out — to change it, deny with a reason and the agent files it again. postedcarries the permalink inurland, once an agent has read them, the latest numbers inmetrics(views,likes,comments, …) with the time they were read inmeasured_at. Numbers are read at most once a day per post.failedcarries the network’s reason inerror. A post that reached some networks before it failed keeps its link and its network ids for those. If the network later sends it after all, it readsposted.duplicate_ofis set on apendingpost that would publish a stored file the persona already has on the same network, or that an earlier approval is waiting to publish, in this session or another:{ id, status, platform, at, agent_id, session_id }. An agent’s post of a file that is already out, scheduled or being sent on that network is refused rather than published twice — even when two approvals land at the same moment. Another persona posting the same file is not a repeat.