Connect social accounts in the dashboard (Social → Connect), then schedule posts, work the inbox of comments and DMs, and run comment-to-DM automations from here. Connecting an account needs a person at a browser — the networks' sign-in screens are theirs, not ours — so there is no endpoint that connects one.
Every id below is a uuid we issued. A network's own ids for your posts appear
where you need them (post_external_ids on an automation); the network ids of
other people — the person who commented, the person who messaged you —
never do. You get their public handle and display name, which is what the
network shows anyone.
Needs social:read to read and social:write to change anything. Leads need
leads:read.
Accounts
{
"id": "a3d9f1c4-7b2e-4c60-9e85-1f4b6d2a0c73",
"network": "instagram",
"handle": "acme",
"display_name": "Acme Supply Co.",
"avatar_url": "https://example.com/avatar.jpg",
"status": "active",
"last_error": null,
"connected_at": "2026-09-30T10:02:11.004211+00:00",
"capabilities": {
"publish": true,
"comments": true,
"hide_comment": true,
"dms": true,
"private_reply": true,
"webhooks": true,
"max_body_length": 2200,
"max_media": 10,
"text_only": false,
"video": true
}
}
network is one of instagram, facebook, threads, bluesky, x,
tiktok, linkedin, youtube, pinterest. status is active,
needs_reauth (the network ended our access — reconnect it in the dashboard;
last_error says why) or disconnected. capabilities says what this
account can do on its network: a Threads account has no DMs, an Instagram
account cannot post text alone.
Operations
GET /v1/accounts
List connected accounts
Scope social:read.
Every connected account and what its network supports. Never paged (next_cursor is always null).
Answers
| Status | Body | |
|---|---|---|
| 200 | AccountList |
The accounts. |
| 401 | ErrorEnvelope |
UNAUTHORIZED: no key, or one that is malformed, unknown or revoked. It never says which. |
| 403 | ErrorEnvelope |
INSUFFICIENT_SCOPE: the key lacks this operation's scope. Or ORGANISATION_SUSPENDED: the key's organisation is suspended. Never about another workspace's object, which is 404. |
| 429 | ErrorEnvelope |
RATE_LIMITED: too many requests. Wait for Retry-After seconds. |
| 500 | ErrorEnvelope |
INTERNAL_ERROR: ours. Safe to retry; send the same Idempotency-Key on a POST. |
The connected accounts — answers 200
capabilities says what each account's network allows, so a client can hide what would be refused rather than discovering it on publish.
curl https://api.boltclaw.ai/v1/accounts \
-H "Authorization: Bearer bc_live_EXAMPLExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
const res = await fetch("https://api.boltclaw.ai/v1/accounts", {
headers: {
Authorization: `Bearer ${process.env.BOLTCLAW_KEY}`,
},
});
// 200
const data = await res.json();
Shapes
The objects these operations send and answer.
Account
| Field | Type | |
|---|---|---|
id |
uuid |
(required) |
network |
Network |
(required; one of instagram, facebook, threads, bluesky, x, tiktok, linkedin, youtube, pinterest) |
handle |
string | null |
(required) |
display_name |
string | null |
(required) |
avatar_url |
string | null |
(required) |
status |
string |
(required; one of active, needs_reauth, disconnected) |
last_error |
string | null |
(required) |
connected_at |
date-time |
(required) |
capabilities |
Capabilities |
(required) |
AccountList
| Field | Type | |
|---|---|---|
data |
Account[] |
(required) |
next_cursor |
NullCursor |
Always null; this list is never paged. (required) |
Capabilities
| Field | Type | |
|---|---|---|
publish |
boolean |
(required) |
comments |
boolean |
(required) |
hide_comment |
boolean |
(required) |
dms |
boolean |
(required) |
private_reply |
boolean |
(required) |
webhooks |
boolean |
(required) |
max_body_length |
integer |
(required) |
max_media |
integer |
(required) |
text_only |
boolean |
(required) |
video |
boolean |
(required) |
Network
One of: instagram, facebook, threads, bluesky, x, tiktok, linkedin, youtube, pinterest.
NullCursor
Always null; this list is never paged.
any | null.