Files
gitroomhq__postiz-agent/PROVIDER_SETTINGS.md
T
Gilad Resisi 86cc3ed3b4 docs(tiktok): mark each setting's posting-method and media-type axes
A user ticked "Video made with AI" on an UPLOAD post and the label was
silently dropped: TikTok's inbox endpoint accepts no post_info, and
within DIRECT_POST duet/stitch/video_made_with_ai are video-only while
autoAddMusic is photo-only. postiz-app PR #1728 fixed the app side;
this catches the skill docs up.

- PROVIDER_SETTINGS.md: spell out the two axes and tag every TikTok
  setting (DIRECT_POST-only; video-only / photo-only / both); stop
  presenting autoAddMusic as generally required and drop it from the
  video example.
- SKILL.md: add generic Rule 4 — fetch integrations:settings before
  scheduling and honor the returned rules + per-field descriptions;
  fix the example's wrong "privacy" key to privacy_level.
- README.md: same key fix; complete the settings table row.
- PROVIDER_SETTINGS_SUMMARY.md: complete the TikTok row (was missing
  content_posting_method, video_made_with_ai, brand toggles); remove
  autoAddMusic from the video example.
- INTEGRATION_SETTINGS_DISCOVERY.md: one behavioral line per axis;
  autoAddMusic no longer listed as required.
- examples/tiktok-video.json: drop photo-only autoAddMusic from the
  video post.

Extends a557cd5 (UPLOAD never publishes) with the media-type axis.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 12:30:25 +07:00

12 KiB

Provider-Specific Settings

The Postiz CLI supports platform-specific settings for each integration. Different platforms have different options and requirements.

How to Use Provider Settings

Method 1: Command Line Flags

postiz posts:create \
  -c "Your content" \
  -p <provider-type> \
  --settings '<json-settings>' \
  -i "integration-id"

Method 2: JSON File

postiz posts:create --json post-with-settings.json

In the JSON file, specify settings per integration:

{
  "type": "now",
  "date": "2024-01-15T12:00:00Z",
  "shortLink": true,
  "tags": [],
  "posts": [{
    "integration": { "id": "reddit-123" },
    "value": [{ "content": "Post content", "image": [] }],
    "settings": {
      "__type": "reddit",
      "subreddit": [{
        "value": {
          "subreddit": "programming",
          "title": "My Post Title",
          "type": "text",
          "url": "",
          "is_flair_required": false
        }
      }]
    }
  }]
}

Supported Platforms & Settings

Reddit (reddit)

Settings:

  • subreddit (required): Subreddit name
  • title (required): Post title
  • type (required): "text" or "link"
  • url (required for links): URL if type is "link"
  • is_flair_required (boolean): Whether flair is required
  • flair (optional): Flair object with id and name

Example:

postiz posts:create \
  -c "Post content here" \
  -p reddit \
  --settings '{
    "subreddit": [{
      "value": {
        "subreddit": "programming",
        "title": "Check out this cool project",
        "type": "text",
        "url": "",
        "is_flair_required": false
      }
    }]
  }' \
  -i "reddit-123"

YouTube (youtube)

Settings:

  • title (required): Video title (2-100 characters)
  • type (required): "public", "private", or "unlisted"
  • selfDeclaredMadeForKids (optional): "yes" or "no"
  • thumbnail (optional): Thumbnail MediaDto object
  • tags (optional): Array of tag objects with value and label

Example:

postiz posts:create \
  -c "Video description here" \
  -p youtube \
  --settings '{
    "title": "My Awesome Video",
    "type": "public",
    "selfDeclaredMadeForKids": "no",
    "tags": [
      {"value": "tech", "label": "Tech"},
      {"value": "tutorial", "label": "Tutorial"}
    ]
  }' \
  -i "youtube-123"

X / Twitter (x)

Settings:

  • community (optional): X community URL (format: https://x.com/i/communities/1234567890)
  • who_can_reply_post (required): Who can reply
    • "everyone" - Anyone can reply
    • "following" - Only people you follow
    • "mentionedUsers" - Only mentioned users
    • "subscribers" - Only subscribers
    • "verified" - Only verified users

Example:

postiz posts:create \
  -c "Tweet content" \
  -p x \
  --settings '{
    "who_can_reply_post": "everyone"
  }' \
  -i "twitter-123"

With Community:

postiz posts:create \
  -c "Community tweet" \
  -p x \
  --settings '{
    "community": "https://x.com/i/communities/1493446837214187523",
    "who_can_reply_post": "everyone"
  }' \
  -i "twitter-123"

LinkedIn (linkedin)

Settings:

  • post_as_images_carousel (boolean): Post as image carousel
  • carousel_name (optional): Carousel name if posting as carousel

Example:

postiz posts:create \
  -c "LinkedIn post" \
  -m "img1.jpg,img2.jpg,img3.jpg" \
  -p linkedin \
  --settings '{
    "post_as_images_carousel": true,
    "carousel_name": "Product Showcase"
  }' \
  -i "linkedin-123"

Instagram (instagram)

Settings:

  • post_type (required): "post" or "story"
  • is_trial_reel (optional): Boolean
  • graduation_strategy (optional): "MANUAL" or "SS_PERFORMANCE"
  • collaborators (optional): Array of collaborator objects with label

Example:

postiz posts:create \
  -c "Instagram post" \
  -m "photo.jpg" \
  -p instagram \
  --settings '{
    "post_type": "post",
    "is_trial_reel": false
  }' \
  -i "instagram-123"

Story Example:

postiz posts:create \
  -c "Story content" \
  -m "story-image.jpg" \
  -p instagram \
  --settings '{
    "post_type": "story"
  }' \
  -i "instagram-123"

TikTok (tiktok)

Settings:

Two independent axes decide whether a TikTok setting applies. A setting sent on the wrong axis is silently discarded — the API still reports success:

  1. Posting method — every setting below except title requires content_posting_method: "DIRECT_POST". With "UPLOAD", TikTok keeps only the title/content and discards everything else.
  2. Media typeduet, stitch, and video_made_with_ai apply to video posts only; autoAddMusic applies to photo posts only; the rest apply to both.
  • title (optional): Video title (max 90 characters) — the only setting that survives "UPLOAD"
  • privacy_level (required, DIRECT_POST only, video + photo): Privacy level
    • "PUBLIC_TO_EVERYONE"
    • "MUTUAL_FOLLOW_FRIENDS"
    • "FOLLOWER_OF_CREATOR"
    • "SELF_ONLY"
  • duet (boolean, DIRECT_POST only, video posts only): Allow duets
  • stitch (boolean, DIRECT_POST only, video posts only): Allow stitch
  • comment (boolean, DIRECT_POST only, video + photo): Allow comments
  • autoAddMusic (DIRECT_POST only, photo posts only): "yes" or "no" — automatically adds music to photo posts; ignored on video posts, so don't set it there
  • brand_content_toggle (boolean, DIRECT_POST only, video + photo): Brand content toggle
  • brand_organic_toggle (boolean, DIRECT_POST only, video + photo): Brand organic toggle
  • video_made_with_ai (optional boolean, DIRECT_POST only, video posts only): Label the video as AI-generated
  • content_posting_method (required): "DIRECT_POST" or "UPLOAD"
    • Use "DIRECT_POST". It publishes the post to TikTok.
    • "UPLOAD" does not publish. It sends the media to the account's TikTok app inbox, where the user must manually finish and publish it within 24 hours or it is discarded. The Postiz API still reports the post as successfully published.
    • "UPLOAD" also discards every other setting in this list except title — TikTok's inbox endpoint accepts no post info.
    • Only use "UPLOAD" when the user has explicitly asked to review or edit the post inside the TikTok app before publishing. Never infer it from the user saying "upload this video" — that means "DIRECT_POST".

Example:

postiz posts:create \
  -c "TikTok video description" \
  -m "video.mp4" \
  -p tiktok \
  --settings '{
    "title": "Check this out!",
    "privacy_level": "PUBLIC_TO_EVERYONE",
    "duet": true,
    "stitch": true,
    "comment": true,
    "brand_content_toggle": false,
    "brand_organic_toggle": false,
    "video_made_with_ai": false,
    "content_posting_method": "DIRECT_POST"
  }' \
  -i "tiktok-123"

Facebook (facebook)

Settings available - check the DTO for specifics.

Pinterest (pinterest)

Settings available - check the DTO for specifics.

Discord (discord)

Settings available - check the DTO for specifics.

Slack (slack)

Settings available - check the DTO for specifics.

Medium (medium)

Settings available - check the DTO for specifics.

Dev.to (devto)

Settings available - check the DTO for specifics.

Hashnode (hashnode)

Settings available - check the DTO for specifics.

WordPress (wordpress)

Settings available - check the DTO for specifics.

Platforms Without Specific Settings

These platforms use the default EmptySettings:

  • threads
  • mastodon
  • bluesky
  • telegram
  • nostr
  • vk

For these, you don't need to specify settings or can use:

-p threads  # or any of the above

Using JSON Files for Complex Settings

For complex settings, it's easier to use JSON files:

Reddit Example

reddit-post.json:

{
  "type": "now",
  "date": "2024-01-15T12:00:00Z",
  "shortLink": true,
  "tags": [],
  "posts": [{
    "integration": { "id": "reddit-123" },
    "value": [{
      "content": "Check out this cool project!",
      "image": []
    }],
    "settings": {
      "__type": "reddit",
      "subreddit": [{
        "value": {
          "subreddit": "programming",
          "title": "My Cool Project - Built with TypeScript",
          "type": "text",
          "url": "",
          "is_flair_required": true,
          "flair": {
            "id": "flair-123",
            "name": "Project"
          }
        }
      }]
    }
  }]
}
postiz posts:create --json reddit-post.json

YouTube Example

youtube-video.json:

{
  "type": "schedule",
  "date": "2024-12-25T12:00:00Z",
  "shortLink": true,
  "tags": [],
  "posts": [{
    "integration": { "id": "youtube-123" },
    "value": [{
      "content": "Full video description with timestamps...",
      "image": [{
        "id": "thumb1",
        "path": "https://cdn.example.com/thumbnail.jpg"
      }]
    }],
    "settings": {
      "__type": "youtube",
      "title": "How to Build a CLI Tool",
      "type": "public",
      "selfDeclaredMadeForKids": "no",
      "tags": [
        { "value": "programming", "label": "Programming" },
        { "value": "typescript", "label": "TypeScript" },
        { "value": "tutorial", "label": "Tutorial" }
      ]
    }
  }]
}
postiz posts:create --json youtube-video.json

Multi-Platform with Different Settings

multi-platform-campaign.json:

{
  "type": "now",
  "date": "2024-01-15T12:00:00Z",
  "shortLink": true,
  "tags": [],
  "posts": [
    {
      "integration": { "id": "reddit-123" },
      "value": [{ "content": "Reddit-specific content", "image": [] }],
      "settings": {
        "__type": "reddit",
        "subreddit": [{
          "value": {
            "subreddit": "programming",
            "title": "Post Title",
            "type": "text",
            "url": "",
            "is_flair_required": false
          }
        }]
      }
    },
    {
      "integration": { "id": "twitter-123" },
      "value": [{ "content": "Twitter-specific content", "image": [] }],
      "settings": {
        "__type": "x",
        "who_can_reply_post": "everyone"
      }
    },
    {
      "integration": { "id": "linkedin-123" },
      "value": [
        {
          "content": "LinkedIn post",
          "image": [
            { "id": "1", "path": "img1.jpg" },
            { "id": "2", "path": "img2.jpg" }
          ]
        }
      ],
      "settings": {
        "__type": "linkedin",
        "post_as_images_carousel": true,
        "carousel_name": "Product Launch"
      }
    }
  ]
}

Tips

  1. Use JSON files for complex settings - Command-line JSON strings get messy fast
  2. Validate your settings - The API will return errors if settings are invalid
  3. Check required fields - Each platform has different required fields
  4. Platform-specific content - Different platforms may need different content/media
  5. Test with drafts first - Use "type": "draft" to test without posting

Finding Your Provider Type

To find the correct provider type for your integration:

postiz integrations:list

This will show the provider field for each integration, which corresponds to the __type in settings.

Common Errors

Missing __type

{
  "settings": {
    "title": "My Video"  // ❌ Missing __type
  }
}

Fix:

{
  "settings": {
    "__type": "youtube",  // ✅ Add __type
    "title": "My Video"
  }
}

Wrong Provider Type

# ❌ Wrong
-p twitter  # Should be "x"

# ✅ Correct
-p x

Invalid Settings for Platform

Each platform validates its own settings. Check the error message and refer to the platform's required fields above.

See Also

  • EXAMPLES.md - General usage examples
  • COMMAND_LINE_GUIDE.md - Command-line syntax
  • SKILL.md - AI agent patterns
  • Source DTOs in libraries/nestjs-libraries/src/dtos/posts/providers-settings/