{
  "version": 1,
  "updatedAt": "2026-04-28",
  "defaultLanguage": "ro",
  "platforms": [
    {
      "id": "facebook_pages",
      "label": "Facebook Page / Reels",
      "kind": "meta_graph",
      "publishMode": "api_after_oauth",
      "videoFit": ["9:16", "1:1", "4:5", "16:9"],
      "recommendedUse": "Publicare pe pagina brandului, inclusiv variante scurte tip Reels unde contul si permisiunile permit.",
      "requiredEnv": ["META_PAGE_ID", "META_PAGE_ACCESS_TOKEN"],
      "requiredScopes": ["pages_manage_posts", "pages_read_engagement"],
      "maxCaptionChars": 63206,
      "notes": [
        "Necesita aplicatie Meta configurata si Page access token valid.",
        "Pentru Instagram si Facebook se trateaza separat conturile, permisiunile si asset hosting-ul."
      ]
    },
    {
      "id": "instagram_reels",
      "label": "Instagram Reels",
      "kind": "meta_instagram_graph",
      "publishMode": "api_after_oauth",
      "videoFit": ["9:16"],
      "recommendedUse": "Publicare organica verticala pentru clipuri scurte cu caption si hashtaguri controlate.",
      "requiredEnv": ["IG_USER_ID", "META_PAGE_ACCESS_TOKEN", "PUBLIC_VIDEO_BASE_URL"],
      "requiredScopes": ["instagram_content_publish", "pages_read_engagement"],
      "maxCaptionChars": 2200,
      "notes": [
        "Necesita cont Instagram Professional conectat la o pagina Facebook.",
        "API-ul de content publishing cere de regula URL public pentru media, deci MP4-ul local trebuie uploadat intr-un bucket/CDN inainte de publish."
      ]
    },
    {
      "id": "tiktok",
      "label": "TikTok",
      "kind": "tiktok_content_posting",
      "publishMode": "api_after_oauth",
      "videoFit": ["9:16"],
      "recommendedUse": "Publicare short-form cu hook scurt, descriere compacta si hashtaguri putine.",
      "requiredEnv": ["TIKTOK_CLIENT_KEY", "TIKTOK_CLIENT_SECRET", "TIKTOK_ACCESS_TOKEN"],
      "requiredScopes": ["video.publish", "video.upload"],
      "maxCaptionChars": 2200,
      "notes": [
        "Necesita OAuth si acces la Content Posting API.",
        "Unele conturi/app-uri au flux direct post, altele doar upload/inbox in functie de aprobari."
      ]
    },
    {
      "id": "youtube_shorts",
      "label": "YouTube Shorts",
      "kind": "youtube_data_api",
      "publishMode": "api_after_oauth",
      "videoFit": ["9:16"],
      "recommendedUse": "Upload ca video vertical scurt, cu titlu puternic si descriere cu #Shorts.",
      "requiredEnv": ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "YOUTUBE_REFRESH_TOKEN"],
      "requiredScopes": ["https://www.googleapis.com/auth/youtube.upload"],
      "maxTitleChars": 100,
      "maxDescriptionChars": 5000,
      "notes": [
        "Necesita OAuth user consent si canal YouTube selectat.",
        "Shorts se determina din format/durata si semnale precum #Shorts, nu printr-un endpoint separat dedicat."
      ]
    },
    {
      "id": "linkedin",
      "label": "LinkedIn",
      "kind": "linkedin_video_post",
      "publishMode": "api_after_oauth",
      "videoFit": ["9:16", "1:1", "16:9"],
      "recommendedUse": "Postari business cu copy mai calm, orientate spre use-case si rezultate operationale.",
      "requiredEnv": ["LINKEDIN_ACCESS_TOKEN", "LINKEDIN_AUTHOR_URN"],
      "requiredScopes": ["w_member_social"],
      "maxCaptionChars": 3000,
      "notes": [
        "Pentru pagini de companie pot fi necesare permisiuni organization social si roluri administrative.",
        "Video upload-ul foloseste un flow separat de initializare, upload si creare post."
      ]
    },
    {
      "id": "x",
      "label": "X",
      "kind": "x_post_with_media",
      "publishMode": "api_after_oauth",
      "videoFit": ["9:16", "1:1", "16:9"],
      "recommendedUse": "Post scurt cu un singur unghi clar, eventual thread pentru context.",
      "requiredEnv": ["X_API_KEY", "X_API_SECRET", "X_ACCESS_TOKEN", "X_ACCESS_TOKEN_SECRET"],
      "requiredScopes": ["tweet.write", "media.write"],
      "maxCaptionChars": 280,
      "notes": [
        "Necesita acces API potrivit pentru media upload si creare post.",
        "Captionul trebuie scurtat agresiv fata de LinkedIn/Facebook."
      ]
    },
    {
      "id": "reddit",
      "label": "Reddit",
      "kind": "reddit_submit",
      "publishMode": "api_after_oauth_and_subreddit_rules",
      "videoFit": ["9:16", "1:1", "16:9"],
      "recommendedUse": "Doar comunitati unde self-promotion si video ads sunt permise explicit.",
      "requiredEnv": ["REDDIT_CLIENT_ID", "REDDIT_CLIENT_SECRET", "REDDIT_REFRESH_TOKEN", "REDDIT_USER_AGENT"],
      "requiredScopes": ["submit", "identity"],
      "maxTitleChars": 300,
      "notes": [
        "Fiecare subreddit are reguli proprii; automatizarea fara moderare poate fi blocata sau stearsa.",
        "Pentru continut video, un fallback practic este publicarea unui link catre pagina/MP4 gazduit."
      ]
    },
    {
      "id": "telegram",
      "label": "Telegram Channel / Group",
      "kind": "telegram_bot",
      "publishMode": "api_ready_now",
      "videoFit": ["9:16", "1:1", "16:9"],
      "recommendedUse": "Publicare rapida in canal/grup prin bot, cu caption si link demo.",
      "requiredEnv": ["TELEGRAM_BOT_TOKEN", "TELEGRAM_CHAT_ID"],
      "maxCaptionChars": 1024,
      "notes": [
        "Botul trebuie adaugat in canal/grup si sa aiba drept de postare.",
        "Acesta este primul conector care poate functiona imediat dupa completarea env vars."
      ]
    },
    {
      "id": "threads",
      "label": "Threads",
      "kind": "meta_threads",
      "publishMode": "api_after_oauth",
      "videoFit": ["9:16", "1:1"],
      "recommendedUse": "Postari scurte conversational-product, reutilizabile din captionurile pentru Instagram/X.",
      "requiredEnv": ["THREADS_USER_ID", "THREADS_ACCESS_TOKEN"],
      "requiredScopes": ["threads_basic", "threads_content_publish"],
      "maxCaptionChars": 500,
      "notes": [
        "Necesita flux Meta/Threads separat de Facebook Page si Instagram.",
        "Se foloseste doar dupa validarea accesului real al contului."
      ]
    }
  ]
}
