DocumentationPlatform guides

Platform guides

v1

What you can publish, which accounts qualify, and the permissions needed for live access.

Live publishing depends on each platform’s account eligibility, granted permissions, and app review. Castrook’s test mode is available independently of those approvals.

Current access status

Platform availability depends on both Castrook’s app access and each account’s granted permissions. Test mode works on every platform. Status as of October 7, 2026:

  • TikTok

    Direct Post publishing is live following app review and audit approval. Videos and photo posts use video.publish. Performance analytics require additional Display API access and a fresh video.list grant; photo statistics may be unavailable.

  • Instagram, Facebook

    Meta business verification is in review, followed by app review for advanced access. Until then, live connections work only for accounts that hold a role on Castrook’s Meta app.

  • YouTube

    Google verification and the separate YouTube API audit are pending. Uploads may remain private until the upload audit completes. Unverified OAuth access is limited to approved test users and Google’s user cap.

  • Pinterest

    Business-account image/video Pin support is implemented. Provider access remains a separate gate: Trial creates owner-only Sandbox image Pins and does not support video Pins. Standard access is required for public image/video Pins and broader account use.

  • LinkedIn

    Member text, article, image, multi-image and video publishing is implemented. Live access requires an active sharing product and the connected owner’s grant. Administered Pages, comments and analytics additionally require the relevant Community Management permissions.

New permissions can require a separate review and reconnection. TikTok comment management stays unavailable after approval, because TikTok’s public posting API doesn’t include it.

Capabilities

PlatformPublishingCommentsAccount
TikTokVideo, photo carouselsNot availableEligible TikTok creator
InstagramFeed images, mixed carousels, Reels, eligible StoriesRead and replyBusiness or Creator
FacebookText, multi-photo feed, video, Reels, StoriesRead and replyPage
YouTubeVideo / ShortsRead and replyChannel
PinterestImage/video Pins; Trial images in SandboxNot availableBusiness
LinkedInText, articles, images, videoWith granted accessProfile or permitted Page

TikTok

VIDEOS & PHOTOS

Connect through TikTok and select each post’s visibility explicitly. Call GET /accounts/{id}/publishing-options with the accounts:read scope to fetch current creator settings. In the SDK, use castrook.accounts.publishingOptions(id). Castrook loads the creator’s available privacy choices and interaction restrictions. Show these choices to the creator with no default visibility and interactions off initially. For commercial posts, show a disclosure toggle followed by Your brand and Branded content choices. Branded content cannot use private visibility.

JSON · platform_options
{
  "tiktok": {
    "privacy_level": "SELF_ONLY",
    "consent": true,
    "video_duration_sec": 24,
    "disable_comment": true,
    "disable_duet": true,
    "disable_stitch": true,
    "brand_content_toggle": false,
    "brand_organic_toggle": false,
    "is_aigc": false
  }
}

The example privacy value is not a default. Choose from the creator’s current options. Send consent: true only after the creator has reviewed and approved this exact post: account, caption, ordered media, visibility, interactions, disclosures, and schedule. The confirmation must link TikTok’s Music Usage Confirmation and, for third-party branded content, its Branded Content Policy. OAuth authorization is not blanket consent for future posts.

The dashboard reads video length from the loaded preview. Castrook independently measures every TikTok video from its downloaded bytes, then stages those same bytes at an immutable temporary URL before delivery, including videos already hosted on a verified domain. Invalid or unreadable duration metadata fails before submission to TikTok. The optional video_duration_sec field is a compatibility hint; the measured duration determines whether the creator’s limit is met.

MP4, MOV, and WebM videos up to 128 MiB are supported. Temporary copies expire after 48 hours, and storage capacity scales with your plan. Temporary preparation pressure queues a retry before publication. You do not need to verify your own media domain. TikTok may take a few minutes to process a post; poll its status or handle the final webhook event.

Unaudited apps have restricted private posting. General comment management is not provided by the public posting API. TikTok content-sharing requirements ↗

Instagram

PROFESSIONAL ACCOUNTS

Use an Instagram Business or Creator account. The Instagram Login flow does not require a linked Facebook Page. Videos default to Reels; single images use a feed media item. Feed carousels support 2–10 ordered image/video items. Stories use one asset and require a Business account, with no caption overlays. Personal accounts and DMs are unavailable.

Content publishing, comment management and insights permissions each control the corresponding capability. A connected account may have only a subset of capabilities. Instagram Login documentation ↗

JSON · platform_options
{ "instagram": { "format": "reel", "share_to_feed": true } }

Facebook Pages

Select the Pages you want to connect during Facebook authorization. Your Page role must allow the requested action. Personal profiles and Groups are not supported. Videos default to Reel format; specify video for a regular Page video. Use feed for up to 10 photos, or story for one image/video without caption overlays.

JSON · platform_options
{ "facebook": { "format": "reel" } }

Page posting, engagement, user-content and read_insights permissions control publishing, comments and performance capabilities. Facebook Pages documentation ↗

YouTube Shorts

YouTube uses its regular upload API and classifies qualifying square or vertical videos up to three minutes as Shorts. Castrook does not guarantee Shorts classification from an upload receipt. Verify the result in YouTube Studio.

JSON · platform_options
{
  "youtube": {
    "title": "Your video title",
    "privacy_status": "private",
    "made_for_kids": false,
    "contains_synthetic_media": false
  }
}

A made_for_kids choice is required. Visibility defaults to private. This release supports YouTube media up to 128 MiB. Applicable unverified API projects can be restricted to private uploads even when public visibility is requested.

Disconnecting YouTube

DELETE /accounts/{id} disables the connection, requests Google authorization revocation, and removes associated stored YouTube data. Google can revoke other Castrook connections under the same authorization. Pending work stops; an upload already accepted by YouTube may still finish. Videos and comments already on YouTube remain there.

Revocation is retried if Google is temporarily unavailable. New connections may be temporarily blocked while a disconnect completes. Follow the returned retry guidance and start a fresh connection; do not repeatedly reuse an old authorization callback. You can also revoke access through Google account permissions.

Shorts eligibility ↗ · YouTube audit requirements ↗

Pinterest

Connect a Pinterest Business account. Each Pin uses one image or one video and an explicitly selected board; sections are optional. Image Pins use feed, video Pins use video. Set the description in text (up to 800 characters), a title up to 100 characters, an optional destination link and alt_text up to 500 characters.

Discover boards and sections

Use accounts:read for GET /accounts/{id}/boards and GET /accounts/{id}/boards/{board_id}/sections. Both return { data, meta: { next_cursor, has_more } }. Preserve board IDs as strings and follow the opaque cursor while has_more is true, including through empty pages. Cursors belong to the selected account, board, workspace and mode.

TypeScript
const boards = await castrook.accounts.listBoards(pinterestAccountId, { limit: 50 });
const sections = await castrook.accounts.listBoardSections(
  pinterestAccountId, chosenBoardId, { limit: 50 }
);
// Let the owner choose the board and optional section from these results.
JSON · platform_options
{
  "pinterest": {
    "format": "feed",
    "board_id": "123456789012345678",
    "title": "Inside the collection",
    "link": "https://example.com/collection",
    "alt_text": "A terracotta vase beside the matching glazed bowl."
  }
}

Use the discovered board_id and, if selected, board_section_id. For video Pins, optionally supply cover_image_url or cover_image_key_frame_time (0–3,600 seconds), using only one. Omit both for the platform’s default cover; image Pins reject cover controls. Upload and processing can continue after queue acceptance; inspect the final target state.

Pinterest Trial access uses Sandbox. Its image Pins are visible only to the owner and aren’t public publications; Sandbox doesn’t support video Pins. Standard access and permission to serve additional accounts are separate external gates. The Pinterest connection requests user_accounts:read, boards:read, boards:write, pins:read and pins:write; Pinterest requires board write permission when creating a Pin. Pinterest has no supported public organic comment API. Pinterest Sandbox requirements ↗

LinkedIn

Connect a personal profile for member publishing. Administered Pages can connect when Castrook has the required Community Management access and the owner’s Page permissions. Each connection records account_type; profile and Page posts remain separate destinations.

Choose personal or advanced access

The default connection uses Sign In with LinkedIn and Share on LinkedIn, requesting openid, profile and w_member_social. It enables personal publishing. Advanced access uses a separate Community Management app with r_basicprofile and only its configured, approved permissions for profile/Page publishing, comments and performance. Approval and the member’s consent determine each capability.

Browser connection URLs
/api/connect/linkedin?connection_type=member
/api/connect/linkedin?connection_type=community

// Hosted customer URL: append these to the returned session.url
?start=linkedin&connection_type=community

Dashboard connection URLs require the owner’s Castrook session. Hosted customers use their private connection URL and choose access in the portal. The choice is bound to the authorization request. LinkedIn member IDs are app-scoped: personal and advanced connections can have different IDs for the same person. Use the account ID returned by the chosen flow; never reuse a member ID or token between the two apps.

Publish text up to 3,000 characters, one image, up to 20 ordered images, one video, or a link article with an optional single-image thumbnail. Video files must contain at least 75 KB (75,000 bytes). Send ordinary text; Castrook handles LinkedIn’s reserved-character escaping. Structured mentions aren’t supported in this release. Use feed for text/images/articles and video for video. visibility defaults to PUBLIC; CONNECTIONS is available only for personal profiles.

JSON · platform_options
{
  "linkedin": {
    "format": "feed",
    "visibility": "PUBLIC",
    "article_url": "https://example.com/collection",
    "article_title": "Inside the collection",
    "article_description": "How the studio developed its latest pieces."
  }
}

article_url requires a nonblank article_title up to 200 characters; article_description is optional, up to 4,000. For a single image, use alt_text up to 4,086 characters. For multiple images, alt_texts preserves image order and must match the image count. Alt text controls apply to image posts and are rejected for article thumbnails. Media title is optional, up to 200 characters, for single-image and video posts; it is rejected for text-only, article and multi-image posts.

The article URL can supply the post’s content with an empty caption and no media:

TypeScript
await castrook.posts.create({
  text: '',
  account_ids: [linkedinAccountId],
  platform_options: { linkedin: {
    article_url: 'https://example.com/collection',
    article_title: 'Inside the collection',
    visibility: 'PUBLIC',
  } },
}, { idempotencyKey: 'collection-linkedin-article-v1' });

Sharing permission allows posting; it doesn’t imply comment reads, analytics or Page access. Those capabilities depend on granted official permissions and remain unavailable when access is missing. Upload receipt and media processing are intermediate states; follow the existing post ID until every target finishes. Documents/PDFs, ads, paid carousels, messages and scraping are outside this release.

Share on LinkedIn ↗ · LinkedIn Posts API ↗

App access and approvals

If you operate your own platform application, apply through the official developer programs. Approval of one product or scope does not imply approval of every capability.

PlatformApplyReview requirements
TikTokDeveloper apps ↗Login Kit, Direct Post, video.publish approval, posting audit, verified media domain
Instagram / FacebookMeta developer apps ↗Relevant login product, advanced permission access, app review and applicable business verification
YouTubeGoogle Cloud ↗YouTube Data API, OAuth consent verification and a separate YouTube API audit
PinterestPinterest Developers ↗Business-account OAuth, boards/pins scopes, Trial/Standard access and account-access approval
LinkedInLinkedIn developer apps ↗OpenID Connect and Share on LinkedIn for member posts; Community Management access for Pages, comments and analytics