Ayrshare is a trademark of its respective owner, used here for identification and migration comparison only. No endorsement, partnership, or affiliation is implied.
/post call. It does
multi-network publishing well — a broad platform matrix, per-platform options, comments, DMs, RSS
auto-posting, and (on the Business plan) User Profiles so you can act on behalf of many end-users.
But when the thing doing the posting is an agent that also holds cards, an inbox, a phone number,
and a KYC’d identity, an Ayrshare account is a disconnected vendor account:
- Publishing lives behind an Ayrshare API key, and per-end-user separation is an Ayrshare Profile Key (Business plan) — an identity that exists only inside Ayrshare, unrelated to where the same agent’s cards, email, and KYC live.
- Whether the agent may post, and how much it may spend doing so, is not something Ayrshare governs — it is a key you hold. There is no execution-time “can this agent post right now?” check tied to the agent’s broader permission set.
- “Which agent posted this, for which end-user, and who let it?” is answered in Ayrshare’s post history for social, and in unrelated systems for the agent’s spend, comms, and identity.
social primitive gives the agent the same capability —
connect accounts over OAuth, then create/schedule/publish across the major networks and read
analytics back — but posting is one primitive on one governed account:
- The Account Kit that decides whether the agent may
issue a card, send email, or buy a
domain also decides whether it may use
socialat all — checked at execution time, not in a separate dashboard. - Publishing spend is metered in the same credit balance and budget ceiling as every other primitive, so a runaway agent hits one cap, not a separate Ayrshare bill.
- Every post records the acting agent and lands in the same per-user activity log as its card spend, email sends, and KYC events.
social is
workspace-scoped today, not per-end-user isolated the way Ayrshare Profile Keys are.
Tested against: the Ayrshare Node SDK
social-media-api v1.3.0 (against the Ayrshare
REST API, base https://api.ayrshare.com/api, /post, /profiles, /analytics, /history
endpoints, docs snapshot July 2026), and the Naive Node SDK @usenaive-sdk/server
against the Naive API (base https://api.usenaive.ai/v1, /social/* endpoints, docs snapshot July
2026).Version notes:- Scope model differs. Ayrshare authenticates with an account-wide API key and (Business plan)
scopes an end-user with a Profile Key header. Naive authenticates per workspace and scopes an
end-user with
naive.forUser(id)— the same handle that reaches every other primitive. See what doesn’t map yet for the isolation caveat. - Publish shape is close. Ayrshare
social.post({ post, platforms, mediaUrls })→ Naiveclient.social.createPost({ content, platforms, media_urls, publish_now: true }). The core publish/schedule/list/analytics path is a near one-to-one swap. - Platform names differ in case and coverage. Ayrshare uses lowercase (
twitter,linkedin); Naive uses uppercase (TWITTER,LINKEDIN). Naive supports 11 networks and addsMASTODON; Ayrshare additionally coversgmb(Google Business Profile),snapchat, andtelegram, which Naive does not — see gaps. - X/Twitter BYO. As of March 31, 2026, Ayrshare requires your own X Developer App credentials
(
setTwitterByo(...)). Naive posts X through its provider without you supplying X app keys. - No equivalent yet for Ayrshare comments/DMs, RSS auto-posting, auto-schedule, auto-repost, the link shortener, or reviews — see what doesn’t map yet.
Concept map
| Ayrshare | Naive | Notes |
|---|---|---|
new SocialMediaAPI(apiKey) | new Naive({ apiKey }) then naive.forUser(id) | Server-side credential in both cases |
| Account API Key + (Business) Profile Key per end-user | tenant user via naive.forUser(id) — scopes every primitive | See the isolation caveat — Naive social data is workspace-scoped today |
Link accounts via POST /api/profiles/generateJWT → hosted linking URL | POST /v1/social/connect { platform, redirect_url } → OAuth URL, or POST /v1/social/portal for multi-platform | Both return a URL the user opens to authorize; Naive’s portal can hide “powered by” branding |
social.post({ post, platforms, mediaUrls }) → POST /api/post | client.social.createPost({ content, platforms, media_urls, publish_now: true }) → POST /v1/social/posts | Publish now to the listed networks |
scheduleDate: "2026-07-08T12:30:00Z" | createPost({ ..., scheduled_at: "2026-07-08T12:30:00Z" }) | ISO-8601 UTC on both sides |
| — (post is immediate or scheduled) | Omit publish_now/scheduled_at → draft, then POST /v1/social/posts/:id/publish | Draft/edit-then-publish is a Naive addition |
social.delete({ id }) → DELETE /api/post | DELETE /v1/social/posts/:id | Delete a post (subject to per-network limits) |
social.history() → GET /api/history | client.social.listPosts() → GET /v1/social/posts | List the agent’s posts |
social.analyticsPost({ id, platforms }) → POST /api/analytics/post | GET /v1/social/posts/:id/analytics | Per-post metrics |
Social-network analytics POST /api/analytics/social | GET /v1/social/accounts/:id/analytics | Account-level metrics |
mediaUrls: ["https://..."] | media_urls: ["https://..."] (auto-uploaded) or pre-uploaded upload_ids | Naive downloads + attaches to media-capable platforms |
| Profile Key gate (a key you hold) | Account Kit social primitive enabled: true/false per user | Permission is execution-time policy on the identity — see gain #2 |
| Account-wide Ayrshare billing | Same credit balance + budget ceiling as every primitive | Publishing costs 1 credit; drafts are free |
gmb, snapchat, telegram platforms | — | Not supported on Naive today |
| Comments / DMs, RSS auto-posting, auto-schedule, auto-repost, link shortener, reviews | — (posts have read-only comments) | See gaps |
Before / after: the core path
The path that matters for almost every agent is publish a post to a few networks, then read it back / pull analytics. Here it is on both platforms.- Platform names are uppercase.
twitter→TWITTER,linkedin→LINKEDIN, etc. Naive supportsTWITTER,LINKEDIN,INSTAGRAM,FACEBOOK,TIKTOK,YOUTUBE,THREADS,PINTEREST,REDDIT,BLUESKY, andMASTODON. post→content,mediaUrls→media_urls. Naive downloads each media URL and attaches it to media-capable platforms; text-only platforms are unaffected.- Publish is explicit. Set
publish_now: trueto post immediately,scheduled_atto schedule, or omit both to save a draft you can edit and publish later. - Accounts are connected first. Before the first post, connect accounts with
POST /v1/social/connect(or the multi-platformPOST /v1/social/portal) andPOST /v1/social/sync— the equivalent of linking accounts through Ayrshare’sgenerateJWTURL.
Minimal viable migration
The smallest swap that keeps a working agent running is connect + publish + list/delete.Install the SDK and set your key
NAIVE_API_KEY (a server-side key from the dashboard).Activate + connect the accounts
Replace Ayrshare’s
generateJWT linking flow with Naive’s connect flow: POST /v1/social/activate
once, then POST /v1/social/connect { platform, redirect_url } (or POST /v1/social/portal to
link several at once). Open the returned url for the user to authorize, then call
POST /v1/social/sync to pick up the connected accounts.Swap the publish call
Map
social.post({ post, platforms, mediaUrls }) → client.social.createPost({ content, platforms, media_urls, publish_now: true }). Uppercase the platform names and rename post →
content, mediaUrls → media_urls. For scheduling, pass scheduled_at instead of
scheduleDate.Swap list + delete
Map
social.history() → client.social.listPosts() (GET /v1/social/posts, filter with
?status=), and social.delete({ id }) → DELETE /v1/social/posts/:id. Note some networks
(Instagram, TikTok) don’t allow API deletes on either platform.Swap analytics (optional)
Map
social.analyticsPost({ id, platforms }) → GET /v1/social/posts/:id/analytics, and
account-level social.analyticsSocial(...) → GET /v1/social/accounts/:id/analytics.Consolidate further once you’re on Naive
This is where the migration pays for itself. In Ayrshare, posting is a self-contained account: an API key, optional Profile Keys, and its own billing — disconnected from the agent’s money, comms, and identity. On Naive,social is one primitive on the same account and Account Kit that governs
the agent’s cards, email, phone, and vault.
Gain #1 — one account across primitives
- With Ayrshare, social posting is an island behind its own key and billing. With Naive,
naive.forUser(acme.id)is a single handle to social and cards and email and phone and KYC — no second vendor account, no Profile Keys to provision and rotate, no separate invoice. - Third-party connections (OAuth grants like Slack or Notion) and the agent’s native primitives sit under one identity and one Account Kit — the SaaS the agent connected and the networks it posts to, governed the same way.
Gain #2 — execution-time permission enforcement
- Whether an agent may post at all is the
socialprimitive on the user’s Account Kit, decided at execution time — not a key you gate separately from everything else the agent can do.
- The agent’s code path stays the same for every tier —
client.social.createPost(...). Whether it runs is decided by policy: a user whose Account Kit does not enablesocialis refused withforbidden, with no code change on your side. - Publishing spends 1 credit against the same budget ceiling as the agent’s cards, phone, and LLM calls — so a misbehaving agent trips one combined cap, not a separate Ayrshare limit you monitor on its own.
Social publishing is gated by the primitive toggle and the budget, but it is not frozen for human
approval by default — unlike money-moving primitives (cards, trading, domains). If you need a human in
the loop before a post goes out, use the draft flow (create without
publish_now/scheduled_at,
review, then POST /v1/social/posts/:id/publish) or disable the social primitive for that tier.Gain #3 — unified accountability
- Every post records the acting agent and lands in one per-user activity log — alongside that customer’s card spend, email sends, and KYC events, not in a separate Ayrshare post history:
- That is the question that is hard to answer when posts live in Ayrshare, cards live in Stripe, and the inbox lives somewhere else. Under Naive it is a single query.
What does not map yet
A migration guide that hides gaps is worse than none. The core path (connect → publish → schedule → list → analytics → delete) maps cleanly, but the following Ayrshare capabilities have no direct equivalent on Naive’ssocial primitive today. Check this list against your app before you commit.
| Ayrshare feature | Status on Naive | Workaround |
|---|---|---|
| Per-end-user isolation (Profile Keys separate each user’s linked accounts + posts) | Partial — the social primitive is gated per user via Account Kits, but connected accounts and post data are workspace-scoped today (posts carry no per-user tenant id) | Use one Naive workspace per end-user if you need hard data isolation now; per-user isolation of social is on the roadmap |
gmb (Google Business Profile), snapchat, telegram platforms | Not supported (Naive covers 11 networks incl. MASTODON) | Keep Ayrshare for those specific networks, or post to the supported set |
| Comments + DMs (post/reply/get comments, direct messages) | Read-only — GET /v1/social/posts/:id/comments; no comment/DM posting | Use the platform’s own API for writing comments/DMs |
| RSS auto-posting, auto-schedule, auto-repost, auto-hashtag | Not provided | Drive scheduling from your own scheduler + scheduled_at |
Link shortener (shortenLinks, custom domains) + link analytics | Not provided | Shorten links in your own code before createPost |
| Reviews (get/reply/delete on connected accounts) | Not provided | Use the platform’s own API |
| First comment, disable comments, per-network advanced options | Partial — platform_data overrides per platform; not every Ayrshare option is surfaced | Pass supported fields via platform_data; otherwise not available |
X/Twitter BYO credentials (setTwitterByo) | Different model — Naive posts X via its provider; you don’t supply an X Developer App | No action needed on Naive; you can’t reuse your Ayrshare X app config |
| JWT white-label linking URL on your domain | Partial — POST /v1/social/portal returns a hosted OAuth URL (can hide “powered by”), not a JWT SSO URL on your domain | Use the connect/portal URL for account linking |
Where to go next
socialprimitive — full connect / post / schedule / analytics lifecycle, platform matrix, and platform defaultssocialSDK sub-client — typedlistPosts/createPostsocialCLI —naive social connect / postper user- Account Kits — enabling/disabling the
socialprimitive per user at execution time - Tenant users — the identity that owns social, cards, email, and phone
- Billing — the shared credit balance and budget ceiling publishing spends against
- Logs — the unified per-user activity trail every post lands in