Skip to main content
Social is the distribution primitive. Naive wraps social infrastructure behind a consistent API so agents can connect social media accounts, create and publish posts across multiple platforms, schedule content, and retrieve analytics — all without custom OAuth flows or frontend components.

CLI First

# Activate and connect a platform
naive social activate
naive social connect --platform twitter --redirect-url https://your-app.com/callback

# Create and publish a post
naive social post "Launching our new product today" --platforms twitter,linkedin --publish

Tools

ToolTypeDescriptionCost
naive_social_activateSetupActivate social media for the companyFree
naive_social_connectSetupGet OAuth URL for a single platformFree
naive_social_portalSetupGet portal URL for multi-platform connectFree
naive_social_statusInfoCheck activation + connected accountsFree
naive_social_accountsInfoList connected accountsFree
naive_social_syncInfoSync connected accountsFree
naive_social_labelSetupSet a label on a connected accountFree
naive_social_create_postCoreCreate and optionally publish a post1 credit (if publishing)
naive_social_publish_postCorePublish a draft1 credit
naive_social_uploadCoreUpload media from URLFree
naive_social_list_postsInfoList posts with status filterFree
naive_social_get_postInfoGet post detailsFree
naive_social_edit_postCoreEdit a draft postFree
naive_social_delete_postCoreDelete a postFree
naive_social_post_analyticsInfoGet post performance metricsFree
naive_social_post_commentsInfoGet post commentsFree
naive_social_account_analyticsInfoGet account-level analyticsFree
naive_social_disconnectSetupDisconnect an accountFree

Studio Connection UI

In the Naive Studio, navigate to Primitives > Social to connect accounts visually. The page:
  • Auto-activates social media on first visit
  • Shows a grid of connected accounts with platform icons and status
  • Provides per-platform “Connect” buttons that open OAuth in a new tab
  • Allows disconnecting accounts directly from the UI
  • Syncs accounts automatically to pick up new connections

Activation

Before posting, social media must be activated for the company.
curl -X POST https://api.usenaive.ai/v1/social/activate \
  -H "Authorization: Bearer nv_sk_your_key"
Response:
{
  "activated": true,
  "team_count": 1,
  "team_id": "team-uuid"
}

Connecting Accounts

The API returns an OAuth URL. The user or agent opens this URL in a browser to authorize the social account. No custom frontend is needed.

Single Platform

curl -X POST https://api.usenaive.ai/v1/social/connect \
  -H "Authorization: Bearer nv_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"platform": "TWITTER", "redirect_url": "https://your-app.com/callback"}'
Response:
{
  "url": "https://social.usenaive.ai/connect/twitter?..."
}

Multi-Platform Portal

For connecting several platforms at once, use the portal endpoint:
curl -X POST https://api.usenaive.ai/v1/social/portal \
  -H "Authorization: Bearer nv_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"redirect_url": "https://your-app.com/callback"}'
After the user connects accounts, call POST /v1/social/sync to refresh the local account list.

Creating Posts

curl -X POST https://api.usenaive.ai/v1/social/posts \
  -H "Authorization: Bearer nv_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Check out our latest product update!",
    "platforms": ["TWITTER", "LINKEDIN"],
    "publish_now": true
  }'
Response (202):
{
  "id": "post-uuid",
  "post_id": "post-uuid",
  "status": "publishing",
  "platforms": ["TWITTER", "LINKEDIN"],
  "scheduled_at": null,
  "hint": "Post queued for immediate publishing. Check status with GET /v1/social/posts/post-uuid"
}

Parameters

ParamTypeRequiredDefaultDescription
contentstringYesPost text content
titlestringNoAuto from contentPost title (auto-generated if omitted)
platformsstring[]YesPlatforms to post to
platform_dataobjectNoAuto-generatedPer-platform overrides (see Platform Defaults below)
media_urlsstring[]NoMedia URLs — auto-uploaded and attached to video/image platforms
youtube_typestringNo"SHORT"YouTube type: "SHORT" (vertical, under 3min) or "VIDEO" (landscape)
publish_nowbooleanNofalsePublish immediately
scheduled_atstringNoISO 8601 datetime to schedule
account_idsstring[]NoAll activeSpecific account UUIDs to post from
If neither publish_now nor scheduled_at is set, the post is created as a draft. Drafts can be edited and published later with POST /v1/social/posts/:id/publish.

Video Post Example (YouTube + TikTok)

curl -X POST https://api.usenaive.ai/v1/social/posts \
  -H "Authorization: Bearer nv_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Our product demo",
    "platforms": ["YOUTUBE", "TIKTOK", "INSTAGRAM"],
    "media_urls": ["https://example.com/demo-video.mp4"],
    "youtube_type": "SHORT",
    "publish_now": true
  }'

Platform Defaults

When you omit platform_data, the API applies sensible defaults per platform. You can override any field by passing platform_data.
PlatformAuto-applied defaultsNotes
TWITTERtext truncated to 280 charsText-only platform
BLUESKYtext truncated to 300 charsText-only platform
YOUTUBEtext (100 char title), type (SHORT/VIDEO), privacy: "PUBLIC", madeForKids: falseRequires media. youtube_type controls SHORT vs VIDEO
TIKTOKtext, privacy: "PUBLIC_TO_EVERYONE"Requires media for video posts
INSTAGRAMtext, type: "REEL"Defaults to Reel for video
REDDITtext, title (100 char limit)Pass "sr" in platform_data for subreddit
PINTERESTtitle (100 char limit), textMedia recommended
LINKEDINtext (full content)No truncation
FACEBOOKtext (full content)No truncation
THREADStext (full content)No truncation
MASTODONtext (full content)No truncation

Overriding Defaults

Pass platform_data to customize per-platform behavior:
{
  "content": "Check out our launch",
  "platforms": ["TWITTER", "REDDIT", "YOUTUBE"],
  "platform_data": {
    "REDDIT": { "sr": "startups", "title": "We just launched!" },
    "YOUTUBE": { "text": "Product Launch Demo", "type": "VIDEO", "privacy": "PUBLIC" }
  },
  "media_urls": ["https://example.com/launch.mp4"],
  "publish_now": true
}
Overrides are merged on top of defaults — you only need to specify the fields you want to change.

Media Handling

There are two ways to attach media to a post:

Option 1: media_urls (auto-upload)

When media_urls are provided, the server downloads and uploads each URL to the social media service, then attaches them to media-capable platforms (YouTube, Instagram, TikTok, Facebook, Pinterest). Text-only platforms are unaffected.

Option 2: upload_ids (pre-uploaded media)

If you’ve already uploaded media via POST /v1/social/upload or have assets in the Media Asset Manager, pass their Bundle upload IDs directly using upload_ids. This avoids re-uploading and prevents duplicate assets.
{
  "content": "Check out this clip!",
  "platforms": ["YOUTUBE"],
  "upload_ids": ["upload-id-from-asset"],
  "publish_now": true
}
The Media Asset Manager returns upload_id on each asset — use this value in upload_ids when creating posts from assets in your library.

Scheduling & Drafts

Omit both publish_now and scheduled_at to create a draft:
{
  "content": "Working on this post...",
  "platforms": ["TWITTER"]
}
Edit with PATCH /v1/social/posts/:id, then publish with POST /v1/social/posts/:id/publish.

Analytics

Retrieve performance metrics for published posts:
curl https://api.usenaive.ai/v1/social/posts/post-uuid/analytics \
  -H "Authorization: Bearer nv_sk_your_key"
Response:
{
  "post_id": "post-uuid",
  "analytics": { ... }
}
Analytics data varies by platform. The shape depends on which platforms the post was published to.
Account-level analytics:
curl https://api.usenaive.ai/v1/social/accounts/account-uuid/analytics \
  -H "Authorization: Bearer nv_sk_your_key"

Supported Platforms

PlatformKeyTypeCharacter Limit
Twitter/XTWITTERText + media280
LinkedInLINKEDINText + media
InstagramINSTAGRAMMedia (Reel default)
FacebookFACEBOOKText + media
TikTokTIKTOKVideo
YouTubeYOUTUBEVideo (SHORT/VIDEO)100 (title)
ThreadsTHREADSText
PinterestPINTERESTMedia + title100 (title)
RedditREDDITText + title100 (title)
BlueskyBLUESKYText300
MastodonMASTODONText

Error Handling

ErrorCauseRecovery
feature_not_configuredSocial provider credentials not setConfigure the API key
invalid_inputSocial not activatedCall POST /v1/social/activate
invalid_inputMissing required fieldsCheck content, platforms params
resource_not_foundPost or account not foundVerify UUID
insufficient_creditsNot enough credits to publishTop up with POST /v1/billing/topup
provider_errorSocial media service errorRetry or check platform requirements

Typical Workflow

Agent receives task: "Post about our product launch on Twitter and LinkedIn"

    ├─ GET /v1/social/status                     → Check activation
    │   → activated: true, 3 accounts

    ├─ GET /v1/social/accounts                   → List connected accounts
    │   → Twitter, LinkedIn, Instagram connected

    ├─ POST /v1/social/posts                     → Create + publish
    │   { content: "We just launched...",
    │     platforms: ["TWITTER", "LINKEDIN"],
    │     publish_now: true }
    │   → id: post-uuid, status: scheduled

    ├─ GET /v1/social/posts/post-uuid            → Check status
    │   → status: publishing → posted (via webhook)

    └─ GET /v1/social/posts/post-uuid/analytics  → Track performance
        → { impressions: 1200, likes: 45, ... }