# Platform Support (/docs/platforms/overview)



Supported platforms [#supported-platforms]

| Platform                               | API id      | Text  | Files per post              | File types               | Max file size | Status |
| -------------------------------------- | ----------- | ----- | --------------------------- | ------------------------ | ------------- | ------ |
| [X (Twitter)](/docs/platforms/twitter) | `twitter`   | 280   | up to 4 files, or none      | JPEG, PNG, GIF; MP4      | —             | Live   |
| [LinkedIn](/docs/platforms/linkedin)   | `linkedin`  | 3,000 | 1 file, or none             | JPEG, PNG, GIF; MP4; PDF | —             | Live   |
| [Instagram](/docs/platforms/instagram) | `instagram` | 2,200 | 1 to 10 files, required     | JPEG, PNG; MP4           | —             | Live   |
| [Bluesky](/docs/platforms/bluesky)     | `bluesky`   | 300   | up to 4 files, or none      | JPEG, PNG, WebP, GIF     | 1 MB          | Live   |
| [Pinterest](/docs/platforms/pinterest) | `pinterest` | 500   | 1 to 5 files, required      | JPEG, PNG, WebP          | 20 MB         | Live   |
| [TikTok](/docs/platforms/tiktok)       | `tiktok`    | 2,200 | 1 file, a video is required | MP4, MOV, WebM           | —             | Beta   |

**Planned:** Facebook, YouTube, Threads.

LinkedIn posts go to personal profiles; company pages are planned. TikTok is in beta: until TikTok has approved FeedHorizon, videos can only be posted as private (`SELF_ONLY`). Facebook, Threads and YouTube already show up in `GET /api/v1/platforms` with `available: false` until they launch.

`GET /api/v1/platforms` returns the same limits as JSON, straight from the rules the API checks posts against. This table is generated from them too.

How multi-platform posting works [#how-multi-platform-posting-works]

When you create a post for several accounts, FeedHorizon:

1. Checks the content against each platform's rules before storing anything
2. Publishes to each account independently
3. Tracks success and failure per account
4. Returns one entry in `targets` per account, with its own status, native post id and URL

```json
{
    "data": {
        "id": "post_9b2f4c1e6a3d4e8b9f0a1c2d3e4f5a6b",
        "status": "published",
        "targets": [
            {
                "platform": "linkedin",
                "status": "published",
                "platformPostId": "urn:li:share:7654321",
                "platformUrl": "https://www.linkedin.com/feed/update/urn:li:share:7654321"
            }
        ]
    }
}
```

Connecting accounts [#connecting-accounts]

Accounts are connected by the account owner, never with a password through the API:

* **In the dashboard:** open [Connections](/dashboard/connections), pick a profile and click **Connect** for the platform.
* **With a connect link:** create one with `POST /api/v1/platform-invites` (or the MCP tool `create_connect_link`) and send it to your client. See [Connect links](/docs/guides/connect-links).

Bluesky uses an app password instead of an OAuth redirect; everything else uses the platform's own sign-in. Once connected, the account appears in `GET /api/v1/accounts`.

Disconnecting accounts [#disconnecting-accounts]

```bash
curl -X DELETE https://feedhorizon.com/api/v1/accounts/ACCOUNT_ID \
  -H "Authorization: Bearer fh_YOUR_API_KEY"
```

This removes the account and its stored tokens from FeedHorizon. **Its scheduled posts on this account are deleted with it.** Posts already published stay on the platform. FeedHorizon's access is not revoked at the platform; the user can remove FeedHorizon in the platform's app settings.
