---
title: "Start a connect flow"
method: POST
path: "/v1/accounts/connect/{platform}"
tags: ["Accounts"]
---

# Start a connect flow

`POST /v1/accounts/connect/{platform}`

## Request

- Base URL: `https://api.letmepost.dev`
- URL: `https://api.letmepost.dev/v1/accounts/connect/{platform}`
- Auth: none required

Dashboard session only. Returns a `ConnectDescriptor` describing how to finish the connect — an OAuth authorization URL for OAuth platforms, or a credentials form schema for Bluesky. Programmatic API keys cannot mint OAuth state.

## Path parameters

- `platform` 'bluesky' | 'facebook' | 'instagram' | 'linkedin' | 'pinterest' | 'threads' | 'tiktok' | 'twitter', required: Supported platforms. `tiktok` posts upload to the creator's TikTok inbox as a draft that the creator confirms in the TikTok app; Direct Post is not implemented yet.

## Request body

- object
  - `profileId` string, uuid: Land the resulting account in this profile. Falls back to the org's default profile when omitted.

## Response `200`

Connect descriptor.

- ConnectDescriptorResponse: Describes how to finish a connect for `:platform`. OAuth platforms return an `authorizationUrl`; Bluesky returns a form schema for the credentials surface.
  - `platform` 'bluesky' | 'facebook' | 'instagram' | 'linkedin' | 'pinterest' | 'threads' | 'tiktok' | 'twitter', required: Supported platforms. `tiktok` posts upload to the creator's TikTok inbox as a draft that the creator confirms in the TikTok app; Direct Post is not implemented yet.
  - `state` 'live' | 'trial' | 'pending', required: Platform enablement state. `live` is production-ready; `trial` connects but the upstream is sandboxed or rate-capped; `pending` rejects `connect` with `platform_not_enabled`.
  - `descriptor` object, required: Provider-specific connect descriptor — OAuth URL for OAuth platforms, form schema for credential platforms.

## Other responses

- `400`: `validation_failed` — request body or query parameters didn't match the schema. Rules surfaced include `body.json`, `targets.required`, `targets.max`, `mode_conflict`, `targets.options.platform_mismatch`, `targets.account.platform_mismatch`, `target.account.not_connected`, `target.account.ambiguous`, `scheduledAt.future`, `scheduledAt.no_first_comment`, `scheduledAt.no_bluesky_reply`.
- `401`: `unauthenticated` — missing or invalid Bearer key.
- `403`: `platform_auth_failed`, `platform_rejected`, `platform_unavailable`, or `platform_not_enabled` — the upstream platform refused the call. `platformResponse` carries the raw upstream payload when available.
- `404`: `not_found` — the resource does not exist in the caller's organization (or, for profile-scoped keys, in the caller's profile).
- `429`: `rate_limited` — too many requests. Inspect `X-RateLimit-Limit` (static ceiling) and the IETF-draft `RateLimit-*` headers (sliding-window remaining/reset) before retrying.

---

[API](https://skmtc.dev/letmepost/apis/letmepost-dev-api.md) · [All operations](https://skmtc.dev/letmepost/apis/letmepost-dev-api/llms.txt) · [OpenAPI document](https://skmtc.dev/letmepost/apis/letmepost-dev-api/revisions/f6659001f96b?raw)
