---
title: Social Accounts
description: List the social accounts connected to your login, so a script or an agent can point a Social Publish node at them without opening the app.
updated: 2026-10-03
---

A [Social Publish](/docs/nodes/action--social_publish) node posts to accounts by id, in `config.accounts`. This endpoint lists those ids, so a script or an agent holding an API key can target an account without opening the app.

## List connected accounts

`GET /api/v1/social/accounts`

Scope: `social:read`. A full-access (`*`) key has it. None of the workflow scopes (`workflows:read`, `workflows:write`, `workflows:execute`, `templates:execute`) include it, so a key that builds or runs workflows needs `social:read` added to list accounts. A key without it gets `401`, like every other endpoint. There are no parameters.

```bash
curl https://www.wireflow.ai/api/v1/social/accounts \
  -H "Authorization: Bearer $WIREFLOW_API_KEY"
```

```json
{
  "data": {
    "count": 2,
    "accounts": [
      {
        "id": "native:cm1yt4k2",
        "platform": "youtube",
        "handle": "@mychannel",
        "displayName": "My Channel",
        "publishable": true,
        "analytics": "unsupported",
        "options": [
          {
            "name": "caption",
            "kind": "longtext",
            "description": "Caption for this platform instead of the default one."
          },
          {
            "name": "title",
            "kind": "text",
            "description": "Video title, up to 100 characters. Defaults to the caption."
          },
          {
            "name": "privacy",
            "kind": "enum",
            "description": "public, unlisted or private.",
            "values": ["private", "unlisted", "public"]
          },
          {
            "name": "scheduledPublishAt",
            "kind": "datetime",
            "description": "ISO 8601 time the platform makes the post public. Private until then; a time already past means public now."
          },
          {
            "name": "tags",
            "kind": "csv",
            "description": "Tags as ONE comma-separated string, e.g. \"ai, video\", or a list of strings, e.g. [\"ai\", \"video\"]. YouTube keeps 500 characters of tags in total (commas count, and a tag with a space counts two more): the first tags that fit are kept and the rest are dropped."
          },
          {
            "name": "thumbnailUrl",
            "kind": "url",
            "description": "Public https URL of a custom thumbnail. Needs a verified channel."
          }
        ]
      },
      {
        "id": "native:cm1th9x7",
        "platform": "threads",
        "handle": "@me",
        "displayName": "Me",
        "publishable": true,
        "analytics": "unsupported",
        "options": [
          {
            "name": "caption",
            "kind": "longtext",
            "description": "Caption for this platform instead of the default one."
          },
          {
            "name": "altText",
            "kind": "longtext",
            "description": "Image description for screen readers, used for every image."
          }
        ]
      }
    ]
  }
}
```

This is the same payload the MCP `list_social_accounts` tool returns, under `data`. The permission differs: the MCP tool needs the opt-in `social:publish` grant (off by default, and only the account owner can tick it), while this endpoint needs the `social:read` API key scope.

| Field                   | Meaning                                                                                                                                       |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                    | What goes in a node's `config.accounts`, or in the MCP `publish_post` tool's `accountIds`. Always starts with `native:`.                      |
| `platform`              | `youtube`, `threads`, `instagram`, `tiktok`, `linkedin`, `bluesky` or `mastodon`.                                                             |
| `handle`, `displayName` | As the platform shows them.                                                                                                                   |
| `publishable`           | `false` means the connection has to be re-authorized in the Wireflow app before it can post.                                                  |
| `analytics`             | `enabled`, `unsupported` on that platform, or `reconnect_required`, in which case an `analyticsNote` says what to do.                         |
| `options`               | The options you can set for this account under `config.perPlatformOverrides.<platform>`, each with its `kind` and, for an enum, its `values`. |

With nothing connected you get `count: 0`, an empty `accounts` list and a `note`, not an error.

## What it covers

- Only your own accounts. A connection belongs to one login, so there is no team scope and no parameter that picks one.
- Its own scope on purpose. The ids are what a Social Publish node posts to, so `workflows:read`, the default for a new key, does not list them.
- No tokens. A token, a refresh token or any other secret is never part of the response.
- Listing only. The account owner connects or reconnects an account, in a Social Publish node or from a connect link an agent asks for (the [Social Publish page](/docs/nodes/action--social_publish) says how), and it shows up here on the next call. Posting is the Social Publish node, or the MCP `publish_post` tool, which needs its own `social:publish` permission.

## Point a node at an account

```json
{
  "config": {
    "accounts": ["native:cm1yt4k2"],
    "perPlatformOverrides": {
      "youtube": { "title": "How it was made", "privacy": "unlisted" }
    }
  }
}
```

The keys each platform reads are on the [Social Publish page](/docs/nodes/action--social_publish).

---

Documentation index: fetch https://www.wireflow.ai/llms.txt for the full list of Wireflow docs.
