SocialClaw API documentation
Every supported SocialClaw HTTP surface in one place: API-key routes, dashboard browser routes, media delivery URLs, provider callbacks, webhooks, OpenAPI, and JSON schemas.
Authentication and request shape
Public integration routes use bearer API keys. Dashboard routes use the signed browser session cookie and are documented separately so browser behavior is explicit.
1. Create or copy an API key
Create a workspace key from the dashboard, then send it as Authorization: Bearer $SOCIALCLAW_API_KEY.
2. Validate before applying
Use /v1/posts/validate before /v1/posts/apply. This catches provider requirements, media limits, publish times, and account issues.
3. Use idempotency keys
Send idempotencyKey for generated schedules so retries do not create duplicate runs.
export SOCIALCLAW_API_KEY="sc_live_..."
curl -sS https://getsocialclaw.com/v1/keys/validate \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
curl -sS https://getsocialclaw.com/v1/posts/apply \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"timezone": "UTC",
"idempotencyKey": "launch-001",
"posts": [
{
"account": "linkedin:person:123",
"name": "Launch update",
"description": "Shipping today.",
"publish_at": "2026-06-01T18:00:00Z"
}
]
}'
Status and Authentication
Health checks, API key validation, and workspace key management.
/health
Service health
Returns service, database, storage, worker, billing, and public URL health.
- Use this route for uptime checks. It does not require a workspace or API key.
- The response includes deployment configuration, not tenant-specific account health.
curl -sS https://getsocialclaw.com/health
const response = await fetch("https://getsocialclaw.com/health", {
method: "GET",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"service": "socialclaw-api",
"now": "2026-05-23T10:00:00.000Z",
"publicBaseUrl": "https://getsocialclaw.com"
}
none
Response: HealthResponse
/v1/keys/validate
Validate API key
Checks the bearer token, returns the workspace, and updates last-used metadata.
curl -sS https://getsocialclaw.com/v1/keys/validate \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{}'
const response = await fetch("https://getsocialclaw.com/v1/keys/validate", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({})
});
const data = await response.json();
No JSON body.
{
"ok": true,
"tenant": {
"id": "tenant_123",
"name": "Acme Studio",
"plan": "pro"
},
"apiKey": {
"id": "key_123",
"prefix": "sc_live_abcd",
"label": "Production scheduler"
}
}
none
Response: KeyValidationResponse
/v1/keys
List API keys
Lists API key metadata for the authenticated workspace. Secrets are not returned from the public key API.
curl -sS https://getsocialclaw.com/v1/keys \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/keys", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"keys": [
{
"id": "key_123",
"prefix": "sc_live_abcd",
"label": "Production scheduler",
"lastUsedAt": "2026-05-23T10:00:00.000Z"
}
]
}
none
Response: KeysResponse
/v1/keys
Create API key
Creates an additional API key for the authenticated workspace.
curl -sS https://getsocialclaw.com/v1/keys \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"label": "Production scheduler"
}'
const response = await fetch("https://getsocialclaw.com/v1/keys", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"label": "Production scheduler"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/KeyCreateRequest"
}
{
"ok": true,
"key": {
"id": "key_456",
"prefix": "sc_live_wxyz",
"label": "Agent key",
"secret": "sc_live_wxyz..."
}
}
KeyCreateRequest
Response: KeyCreateResponse
/v1/keys/{keyId}
Revoke API key
Revokes an API key. The current key cannot revoke itself through this public route.
Path parameters
| Name | Required | Description |
|---|---|---|
keyId |
Yes | API key id to revoke. |
curl -sS https://getsocialclaw.com/v1/keys/key_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X DELETE
const response = await fetch("https://getsocialclaw.com/v1/keys/key_123", {
method: "DELETE",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"key": {
"id": "key_456",
"prefix": "sc_live_wxyz",
"label": "Agent key",
"secret": "sc_live_wxyz..."
}
}
none
Response: KeyCreateResponse
/v1/me/usage
Workspace usage
Returns workspace usage counters and entitlement consumption.
curl -sS https://getsocialclaw.com/v1/me/usage \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/me/usage", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"usage": {
"postsThisPeriod": 42,
"connectedAccounts": 6
}
}
none
Response: UsageResponse
/v1/workspace/health
Workspace health
Returns tenant-specific account, scheduling, and workspace health.
curl -sS https://getsocialclaw.com/v1/workspace/health \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/workspace/health", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"health": {
"connectedAccounts": 6,
"failingAccounts": 0
}
}
none
Response: WorkspaceHealthResponse
/v1/jobs
List jobs
Lists worker jobs for the workspace.
Query parameters
| Name | Required | Description |
|---|---|---|
status |
No | Filter by job status. |
provider |
No | Filter by provider. |
account |
No | Filter by account handle. |
runId |
No | Filter by run id. Also accepted as run_id. |
limit |
No | Maximum jobs to return. |
curl -sS https://getsocialclaw.com/v1/jobs \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/jobs", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"jobs": [],
"total": 0
}
none
Response: JobsResponse
Connections and Accounts
Start OAuth or manual connections, inspect connected accounts, capabilities, settings, and provider discovery actions.
/v1/connections/start
Start connection
Starts a provider connection. OAuth providers return an authorize URL; Telegram and Discord create manual connections.
- Supported providers: x, facebook, instagram_business, instagram, snapchat, tiktok, linkedin, linkedin_page, pinterest, youtube, reddit, discord, telegram, wordpress.
- For Telegram, include botToken and chatId. For Discord, include webhookUrl.
curl -sS https://getsocialclaw.com/v1/connections/start \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"provider": "linkedin"
}'
const response = await fetch("https://getsocialclaw.com/v1/connections/start", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"provider": "linkedin"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/ConnectionStartRequest"
}
{
"ok": true,
"connection": {
"id": "conn_123",
"provider": "linkedin",
"status": "pending",
"authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
}
}
ConnectionStartRequest
Response: ConnectionResponse
/v1/connections
List connections
Lists OAuth and manual connection handshakes for the workspace.
curl -sS https://getsocialclaw.com/v1/connections \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/connections", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"connections": [
{
"id": "conn_123",
"provider": "linkedin",
"status": "connected"
}
]
}
none
Response: ConnectionsResponse
/v1/connections/health
Connections health
Checks connected account health and provider readiness.
Query parameters
| Name | Required | Description |
|---|---|---|
provider |
No | Optional provider filter. |
curl -sS https://getsocialclaw.com/v1/connections/health \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/connections/health", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"health": {
"connectedAccounts": 6,
"failingAccounts": 0
}
}
none
Response: WorkspaceHealthResponse
/v1/connections/{connectionId}
Connection status
Returns the status of one connection handshake.
Path parameters
| Name | Required | Description |
|---|---|---|
connectionId |
Yes | Connection id. |
curl -sS https://getsocialclaw.com/v1/connections/conn_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/connections/conn_123", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"connection": {
"id": "conn_123",
"provider": "linkedin",
"status": "pending",
"authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
}
}
none
Response: ConnectionResponse
/v1/accounts
List connected accounts
Lists connected social accounts and destinations in the workspace.
Query parameters
| Name | Required | Description |
|---|---|---|
provider |
No | Optional provider filter. |
curl -sS https://getsocialclaw.com/v1/accounts \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/accounts", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"accounts": [
{
"id": "acct_123",
"provider": "linkedin",
"handle": "linkedin:person:123",
"displayName": "Acme Founder"
}
]
}
none
Response: AccountsResponse
/v1/accounts/capabilities
List account capabilities
Lists publishing capabilities across connected accounts.
Query parameters
| Name | Required | Description |
|---|---|---|
provider |
No | Optional provider filter. |
curl -sS https://getsocialclaw.com/v1/accounts/capabilities \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/accounts/capabilities", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"capabilities": [
{
"provider": "linkedin",
"accountId": "acct_123",
"canPublish": true
}
]
}
none
Response: CapabilitiesResponse
/v1/accounts/{accountId}/capabilities
Get account capabilities
Returns publishing capabilities for one connected account.
Path parameters
| Name | Required | Description |
|---|---|---|
accountId |
Yes | Connected account id. |
curl -sS https://getsocialclaw.com/v1/accounts/acct_123/capabilities \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/accounts/acct_123/capabilities", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"capabilities": [
{
"provider": "linkedin",
"accountId": "acct_123",
"canPublish": true
}
]
}
none
Response: CapabilitiesResponse
/v1/accounts/{accountId}/settings
Get publish settings
Returns provider-specific settings fields for one account, such as privacy, reply controls, or media modes.
Path parameters
| Name | Required | Description |
|---|---|---|
accountId |
Yes | Connected account id. |
curl -sS https://getsocialclaw.com/v1/accounts/acct_123/settings \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/accounts/acct_123/settings", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"publishSettings": {
"supported": true,
"fields": [
{
"id": "visibility",
"type": "enum",
"options": [
"PUBLIC",
"CONNECTIONS"
]
}
]
}
}
none
Response: PublishSettingsResponse
/v1/accounts/{accountId}/actions
List discovery actions
Lists provider discovery actions available for one connected account.
Path parameters
| Name | Required | Description |
|---|---|---|
accountId |
Yes | Connected account id. |
curl -sS https://getsocialclaw.com/v1/accounts/acct_123/actions \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/accounts/acct_123/actions", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"actions": [
{
"id": "sync_boards",
"label": "Sync boards"
}
]
}
none
Response: DiscoveryActionsResponse
/v1/accounts/{accountId}/actions/{actionId}
Run discovery action
Runs a provider discovery action such as syncing boards, pages, or remote channel metadata.
Path parameters
| Name | Required | Description |
|---|---|---|
accountId |
Yes | Connected account id. |
actionId |
Yes | Discovery action id. |
curl -sS https://getsocialclaw.com/v1/accounts/acct_123/actions/sync_boards \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{}'
const response = await fetch("https://getsocialclaw.com/v1/accounts/acct_123/actions/sync_boards", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true,
"result": {
"synced": true
}
}
OkResponse
Response: ActionResultResponse
/v1/accounts/{accountId}
Disconnect account
Disconnects a social account from the workspace.
Path parameters
| Name | Required | Description |
|---|---|---|
accountId |
Yes | Connected account id. |
curl -sS https://getsocialclaw.com/v1/accounts/acct_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X DELETE
const response = await fetch("https://getsocialclaw.com/v1/accounts/acct_123", {
method: "DELETE",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"connection": {
"id": "conn_123",
"provider": "linkedin",
"status": "pending",
"authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
}
}
none
Response: ConnectionResponse
/oauth/{provider}/callback
OAuth provider callback
Completes provider OAuth. This route is called by providers after the user authorizes SocialClaw.
- Human users are redirected back to the dashboard or mobile app.
- Do not call this directly unless you are testing a provider OAuth redirect.
Path parameters
| Name | Required | Description |
|---|---|---|
provider |
Yes | Provider id. |
curl -sS https://getsocialclaw.com/oauth/linkedin/callback
const response = await fetch("https://getsocialclaw.com/oauth/linkedin/callback", {
method: "GET",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true
}
none
Response: redirect
Publishing Runs and Posts
Validate schedule payloads, preview campaign graphs, create runs, publish drafts, and manage post lifecycle.
/v1/posts
List posts
Lists timeline posts in the workspace.
Query parameters
| Name | Required | Description |
|---|---|---|
runId |
No | Filter by run id. Also accepted as run_id. |
status |
No | Filter by post status. |
account |
No | Filter by account handle. |
provider |
No | Filter by provider. |
campaignId |
No | Filter by campaign id. Also accepted as campaign_id. |
from |
No | Publish time lower bound. Also accepted as publishFrom or publish_from. |
to |
No | Publish time upper bound. Also accepted as publishTo or publish_to. |
limit |
No | Maximum posts to return. |
offset |
No | Pagination offset. |
curl -sS https://getsocialclaw.com/v1/posts \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/posts", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"total": 1,
"limit": 100,
"offset": 0,
"posts": [
{
"id": "post_123",
"runId": "run_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled",
"publishAtUtc": "2026-06-01T18:00:00.000Z"
}
]
}
none
Response: PostsResponse
/v1/posts/{postId}
Get post detail
Returns one post with provider, attempt, and preview details.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/posts/post_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/posts/post_123", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"post": {
"id": "post_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled"
}
}
none
Response: PostResponse
/v1/posts/{postId}/attempts
List post attempts
Returns publish attempts for one post.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/posts/post_123/attempts \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/posts/post_123/attempts", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"attempts": []
}
none
Response: AttemptsResponse
/v1/posts/{postId}/reconcile
Reconcile post
Asks SocialClaw to refresh provider-side post status and metadata.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/posts/post_123/reconcile \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST
const response = await fetch("https://getsocialclaw.com/v1/posts/post_123/reconcile", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"post": {
"id": "post_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled"
}
}
none
Response: PostResponse
/v1/posts/validate
Validate schedule
Validates and normalizes a posts[] or campaigns[] schedule without creating a run.
- Use this before handing a generated schedule to /v1/posts/apply.
- The route accepts either the schedule object directly or { schedule: ... }.
curl -sS https://getsocialclaw.com/v1/posts/validate \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"timezone": "America/New_York",
"mode": "scheduled",
"idempotencyKey": "launch-week-001",
"posts": [
{
"account": "linkedin:person:123",
"provider": "linkedin",
"name": "Launch update",
"description": "We shipped the new SocialClaw workflow.",
"publish_at": "2026-06-01T14:00:00-04:00",
"assets": [
{
"url": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png",
"managed": true,
"kind": "image",
"mime": "image/png"
}
]
}
]
}'
const response = await fetch("https://getsocialclaw.com/v1/posts/validate", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"timezone": "America/New_York",
"mode": "scheduled",
"idempotencyKey": "launch-week-001",
"posts": [
{
"account": "linkedin:person:123",
"provider": "linkedin",
"name": "Launch update",
"description": "We shipped the new SocialClaw workflow.",
"publish_at": "2026-06-01T14:00:00-04:00",
"assets": [
{
"url": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png",
"managed": true,
"kind": "image",
"mime": "image/png"
}
]
}
]
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/ScheduleEnvelope"
}
{
"ok": true,
"tenantId": "tenant_123",
"timezone": "America/New_York",
"mode": "scheduled",
"sourceModel": "posts_v1",
"totalCampaigns": 0,
"totalPosts": 1,
"posts": [
{
"account": "linkedin:person:123",
"provider": "linkedin",
"publishAtUtc": "2026-06-01T18:00:00.000Z"
}
]
}
ScheduleEnvelope
Response: ValidateResponse
/v1/campaigns/preview
Preview campaign
Builds a campaign graph from campaigns[] and preflights connected accounts.
- Requires a campaigns[] schedule. Flat posts[] schedules return a conflict.
curl -sS https://getsocialclaw.com/v1/campaigns/preview \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"timezone": "UTC",
"campaigns": [
{
"name": "Launch thread",
"targets": [
{
"account": "x:@socialclaw",
"publish_at": "2026-06-01T15:00:00Z",
"steps": [
{
"name": "Announcement",
"description": "Shipping today."
}
]
}
]
}
]
}'
const response = await fetch("https://getsocialclaw.com/v1/campaigns/preview", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"timezone": "UTC",
"campaigns": [
{
"name": "Launch thread",
"targets": [
{
"account": "x:@socialclaw",
"publish_at": "2026-06-01T15:00:00Z",
"steps": [
{
"name": "Announcement",
"description": "Shipping today."
}
]
}
]
}
]
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/ScheduleEnvelope"
}
{
"ok": true,
"tenantId": "tenant_123",
"timezone": "America/New_York",
"mode": "scheduled",
"sourceModel": "posts_v1",
"totalCampaigns": 0,
"totalPosts": 1,
"posts": [
{
"account": "linkedin:person:123",
"provider": "linkedin",
"publishAtUtc": "2026-06-01T18:00:00.000Z"
}
]
}
ScheduleEnvelope
Response: ValidateResponse
/v1/posts/apply
Create run
Creates a scheduled or draft run from a validated schedule.
- Use idempotencyKey for generated schedules and retry-safe clients.
- The route preflights connected accounts and plan entitlements before creating posts.
curl -sS https://getsocialclaw.com/v1/posts/apply \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"timezone": "America/New_York",
"mode": "scheduled",
"idempotencyKey": "launch-week-001",
"posts": [
{
"account": "linkedin:person:123",
"provider": "linkedin",
"name": "Launch update",
"description": "We shipped the new SocialClaw workflow.",
"publish_at": "2026-06-01T14:00:00-04:00",
"assets": [
{
"url": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png",
"managed": true,
"kind": "image",
"mime": "image/png"
}
]
}
]
}'
const response = await fetch("https://getsocialclaw.com/v1/posts/apply", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"timezone": "America/New_York",
"mode": "scheduled",
"idempotencyKey": "launch-week-001",
"posts": [
{
"account": "linkedin:person:123",
"provider": "linkedin",
"name": "Launch update",
"description": "We shipped the new SocialClaw workflow.",
"publish_at": "2026-06-01T14:00:00-04:00",
"assets": [
{
"url": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png",
"managed": true,
"kind": "image",
"mime": "image/png"
}
]
}
]
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/ScheduleEnvelope"
}
{
"ok": true,
"duplicate": false,
"run": {
"id": "run_123",
"status": "created",
"totalPosts": 1
},
"posts": [
{
"id": "post_123",
"status": "scheduled"
}
]
}
ScheduleEnvelope
Response: RunResponse
/v1/runs/{runId}/status
Run status
Returns run status, posts, and summary.
Path parameters
| Name | Required | Description |
|---|---|---|
runId |
Yes | Run id. |
curl -sS https://getsocialclaw.com/v1/runs/run_123/status \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/runs/run_123/status", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"run": {
"id": "run_123",
"status": "created"
},
"posts": [
{
"id": "post_123",
"status": "scheduled"
}
],
"summary": {
"scheduled": 1
}
}
none
Response: RunStatusResponse
/v1/runs/{runId}/campaign
Run campaign graph
Returns the campaign graph associated with a run.
Path parameters
| Name | Required | Description |
|---|---|---|
runId |
Yes | Run id. |
curl -sS https://getsocialclaw.com/v1/runs/run_123/campaign \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/runs/run_123/campaign", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"duplicate": false,
"run": {
"id": "run_123",
"status": "created",
"totalPosts": 1
},
"posts": [
{
"id": "post_123",
"status": "scheduled"
}
]
}
none
Response: RunResponse
/v1/runs/{runId}
Run detail
Returns run, posts, attempts, and provider details.
Path parameters
| Name | Required | Description |
|---|---|---|
runId |
Yes | Run id. |
curl -sS https://getsocialclaw.com/v1/runs/run_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/runs/run_123", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"duplicate": false,
"run": {
"id": "run_123",
"status": "created",
"totalPosts": 1
},
"posts": [
{
"id": "post_123",
"status": "scheduled"
}
]
}
none
Response: RunResponse
/v1/runs/{runId}/publish
Publish draft run
Turns a draft run into scheduled posts, optionally shifting the start time.
Path parameters
| Name | Required | Description |
|---|---|---|
runId |
Yes | Run id. |
curl -sS https://getsocialclaw.com/v1/runs/run_123/publish \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"startAt": "2026-06-01T15:00:00Z"
}'
const response = await fetch("https://getsocialclaw.com/v1/runs/run_123/publish", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"startAt": "2026-06-01T15:00:00Z"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true,
"duplicate": false,
"run": {
"id": "run_123",
"status": "created",
"totalPosts": 1
},
"posts": [
{
"id": "post_123",
"status": "scheduled"
}
]
}
OkResponse
Response: RunResponse
/v1/runs/{runId}/table
Run table
Returns a compact table projection for a run.
Path parameters
| Name | Required | Description |
|---|---|---|
runId |
Yes | Run id. |
curl -sS https://getsocialclaw.com/v1/runs/run_123/table \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/runs/run_123/table", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"rows": [
{
"time": "2026-06-01T18:00:00.000Z",
"account": "linkedin:person:123",
"status": "scheduled",
"postId": "post_123"
}
]
}
none
Response: RunTableResponse
/v1/posts/{postId}/retry
Retry post
Queues a failed post for another publishing attempt.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/posts/post_123/retry \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST
const response = await fetch("https://getsocialclaw.com/v1/posts/post_123/retry", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"post": {
"id": "post_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled"
}
}
none
Response: PostResponse
/v1/posts/{postId}/delete
Delete provider post
Deletes a published provider-side post where the provider supports deletion.
- This does not just cancel the SocialClaw post. It attempts provider-side deletion.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/posts/post_123/delete \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST
const response = await fetch("https://getsocialclaw.com/v1/posts/post_123/delete", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"post": {
"id": "post_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled"
}
}
none
Response: PostResponse
/v1/posts/{postId}
Cancel post
Cancels a draft or scheduled SocialClaw post before publish.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/posts/post_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X DELETE
const response = await fetch("https://getsocialclaw.com/v1/posts/post_123", {
method: "DELETE",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"post": {
"id": "post_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled"
}
}
none
Response: PostResponse
Assets and Media Delivery
Upload, register, delete, and deliver SocialClaw-managed media.
/v1/assets/upload
Upload asset
Uploads a small media file as base64 and returns a SocialClaw delivery URL.
- Use dashboard multipart upload routes for large browser uploads when S3 storage is enabled.
curl -sS https://getsocialclaw.com/v1/assets/upload \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"filename": "launch.png",
"mime": "image/png",
"contentBase64": "iVBORw0KGgoAAAANSUhEUg..."
}'
const response = await fetch("https://getsocialclaw.com/v1/assets/upload", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"filename": "launch.png",
"mime": "image/png",
"contentBase64": "iVBORw0KGgoAAAANSUhEUg..."
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/AssetUploadRequest"
}
{
"ok": true,
"asset": {
"id": "asset_123",
"mime": "image/png",
"kind": "image",
"publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
}
}
AssetUploadRequest
Response: AssetResponse
/v1/assets
Register asset
Registers an existing object or externally managed asset in the workspace.
curl -sS https://getsocialclaw.com/v1/assets \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"objectKey": "tenant_123/assets/manual/launch.png",
"originalFilename": "launch.png",
"mime": "image/png",
"kind": "image",
"status": "ready"
}'
const response = await fetch("https://getsocialclaw.com/v1/assets", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"objectKey": "tenant_123/assets/manual/launch.png",
"originalFilename": "launch.png",
"mime": "image/png",
"kind": "image",
"status": "ready"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/AssetRegistrationRequest"
}
{
"ok": true,
"asset": {
"id": "asset_123",
"mime": "image/png",
"kind": "image",
"publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
}
}
AssetRegistrationRequest
Response: AssetResponse
/v1/assets/{assetId}
Delete asset
Marks an asset for deletion after the retention window.
Path parameters
| Name | Required | Description |
|---|---|---|
assetId |
Yes | Asset id. |
curl -sS https://getsocialclaw.com/v1/assets/asset_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X DELETE \
--data '{
"retentionDays": 7
}'
const response = await fetch("https://getsocialclaw.com/v1/assets/asset_123", {
method: "DELETE",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"retentionDays": 7
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true,
"asset": {
"id": "asset_123",
"mime": "image/png",
"kind": "image",
"publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
}
}
OkResponse
Response: AssetResponse
/media/{assetId}/{deliveryToken}/{filename}
Fetch media asset
Streams a public media asset by delivery URL.
- HEAD is also supported for metadata checks.
Path parameters
| Name | Required | Description |
|---|---|---|
assetId |
Yes | Asset id. |
deliveryToken |
Yes | Delivery token. |
filename |
Yes | File name. |
curl -sS https://getsocialclaw.com/media/asset_123/dlv_123/launch.png
const response = await fetch("https://getsocialclaw.com/media/asset_123/dlv_123/launch.png", {
method: "GET",
headers: {},
});
const data = await response.json();
No JSON body.
application/octet-stream stream
none
Response: application/octet-stream
/media/{assetId}/{deliveryToken}/previews/{filename}
Fetch media preview
Streams a generated thumbnail, poster, or preview asset.
- HEAD is also supported for metadata checks.
Path parameters
| Name | Required | Description |
|---|---|---|
assetId |
Yes | Asset id. |
deliveryToken |
Yes | Delivery token. |
filename |
Yes | Preview file name. |
curl -sS https://getsocialclaw.com/media/asset_123/dlv_123/previews/launch.png
const response = await fetch("https://getsocialclaw.com/media/asset_123/dlv_123/previews/launch.png", {
method: "GET",
headers: {},
});
const data = await response.json();
No JSON body.
application/octet-stream stream
none
Response: application/octet-stream
Analytics
Read and refresh post, account, and run analytics.
/v1/analytics/posts/{postId}
Post analytics
Returns metrics for one published post.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
Query parameters
| Name | Required | Description |
|---|---|---|
window |
No | Metric window. Defaults to lifetime. |
curl -sS https://getsocialclaw.com/v1/analytics/posts/post_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/analytics/posts/post_123", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"window": "lifetime",
"metrics": {
"impressions": 1200,
"clicks": 43
}
}
none
Response: AnalyticsResponse
/v1/analytics/accounts/{accountId}
Account analytics
Returns account-level metrics when provider support is available.
Path parameters
| Name | Required | Description |
|---|---|---|
accountId |
Yes | Connected account id. |
Query parameters
| Name | Required | Description |
|---|---|---|
window |
No | Metric window. Defaults to lifetime. |
curl -sS https://getsocialclaw.com/v1/analytics/accounts/acct_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/analytics/accounts/acct_123", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"window": "lifetime",
"metrics": {
"impressions": 1200,
"clicks": 43
}
}
none
Response: AnalyticsResponse
/v1/analytics/runs/{runId}
Run analytics
Returns aggregate metrics for a run.
Path parameters
| Name | Required | Description |
|---|---|---|
runId |
Yes | Run id. |
Query parameters
| Name | Required | Description |
|---|---|---|
window |
No | Metric window. Defaults to lifetime. |
curl -sS https://getsocialclaw.com/v1/analytics/runs/run_123 \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY"
const response = await fetch("https://getsocialclaw.com/v1/analytics/runs/run_123", {
method: "GET",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"window": "lifetime",
"metrics": {
"impressions": 1200,
"clicks": 43
}
}
none
Response: AnalyticsResponse
/v1/analytics/refresh
Refresh post analytics
Fetches fresh provider analytics for a post.
curl -sS https://getsocialclaw.com/v1/analytics/refresh \
-H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"postId": "post_123",
"window": "lifetime"
}'
const response = await fetch("https://getsocialclaw.com/v1/analytics/refresh", {
method: "POST",
headers: {
"Authorization": "Bearer ${SOCIALCLAW_API_KEY}",
"Content-Type": "application/json"
},
body: JSON.stringify({
"postId": "post_123",
"window": "lifetime"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/AnalyticsRefreshRequest"
}
{
"ok": true,
"window": "lifetime",
"metrics": {
"impressions": 1200,
"clicks": 43
}
}
AnalyticsRefreshRequest
Response: AnalyticsResponse
Dashboard Browser API
Cookie-authenticated routes used by the SocialClaw dashboard. These are documented for completeness, but API-key clients should use the public /v1 routes above.
/v1/dashboard/session
Dashboard session
Returns the current signed-in dashboard user, workspace, and membership.
curl -sS https://getsocialclaw.com/v1/dashboard/session
const response = await fetch("https://getsocialclaw.com/v1/dashboard/session", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"authenticated": true,
"user": {
"id": "user_123",
"email": "operator@example.com"
},
"tenant": {
"id": "tenant_123",
"name": "Acme Studio"
}
}
none
Response: DashboardSessionResponse
/v1/support/request
Create support request
Submits a support request from the site or dashboard.
curl -sS https://getsocialclaw.com/v1/support/request \
-H "Content-Type: application/json" \
-X POST \
--data '{
"email": "operator@example.com",
"message": "Can you review our LinkedIn connection?",
"pageUrl": "https://getsocialclaw.com/dashboard"
}'
const response = await fetch("https://getsocialclaw.com/v1/support/request", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"email": "operator@example.com",
"message": "Can you review our LinkedIn connection?",
"pageUrl": "https://getsocialclaw.com/dashboard"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/SupportRequest"
}
{
"ok": true,
"request": {
"id": "support_123"
},
"message": "Message received. We will reply by email as soon as possible."
}
SupportRequest
Response: SupportResponse
/v1/billing/state
Billing state
Returns workspace billing state for the dashboard.
curl -sS https://getsocialclaw.com/v1/billing/state
const response = await fetch("https://getsocialclaw.com/v1/billing/state", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"billing": {
"plan": "pro",
"status": "active"
}
}
none
Response: BillingStateResponse
/v1/billing/checkout
Create checkout
Creates a billing checkout session for a dashboard billing admin.
curl -sS https://getsocialclaw.com/v1/billing/checkout \
-H "Content-Type: application/json" \
-X POST \
--data '{
"plan": "pro",
"billingInterval": "monthly"
}'
const response = await fetch("https://getsocialclaw.com/v1/billing/checkout", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"plan": "pro",
"billingInterval": "monthly"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/BillingCheckoutRequest"
}
{
"ok": true,
"url": "https://billing.example.com/session/abc"
}
BillingCheckoutRequest
Response: UrlResponse
/v1/billing/manage
Create billing portal
Creates a customer billing management URL for a dashboard billing admin.
curl -sS https://getsocialclaw.com/v1/billing/manage \
-H "Content-Type: application/json" \
-X POST
const response = await fetch("https://getsocialclaw.com/v1/billing/manage", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"url": "https://billing.example.com/session/abc"
}
none
Response: UrlResponse
/v1/billing/app-store/account-token
App Store account token
Returns or creates an App Store account token for the dashboard workspace.
curl -sS https://getsocialclaw.com/v1/billing/app-store/account-token
const response = await fetch("https://getsocialclaw.com/v1/billing/app-store/account-token", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true
}
none
Response: OkResponse
/v1/billing/app-store/products
App Store products
Lists App Store product mappings.
curl -sS https://getsocialclaw.com/v1/billing/app-store/products
const response = await fetch("https://getsocialclaw.com/v1/billing/app-store/products", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"provider": "app-store",
"enabled": true,
"products": []
}
none
Response: ProductsResponse
/v1/billing/app-store/transactions/claim
Claim App Store transaction
Claims a signed App Store transaction for the dashboard workspace.
curl -sS https://getsocialclaw.com/v1/billing/app-store/transactions/claim \
-H "Content-Type: application/json" \
-X POST \
--data '{
"signedTransactionInfo": "eyJhbGciOiJFUzI1NiJ9..."
}'
const response = await fetch("https://getsocialclaw.com/v1/billing/app-store/transactions/claim", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"signedTransactionInfo": "eyJhbGciOiJFUzI1NiJ9..."
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/AppStoreClaimRequest"
}
{
"ok": true,
"billing": {
"plan": "pro",
"status": "active"
}
}
AppStoreClaimRequest
Response: BillingStateResponse
/v1/dashboard/accounts
Dashboard accounts
Lists connected accounts for the dashboard.
Query parameters
| Name | Required | Description |
|---|---|---|
provider |
No | Optional provider filter. |
curl -sS https://getsocialclaw.com/v1/dashboard/accounts
const response = await fetch("https://getsocialclaw.com/v1/dashboard/accounts", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"accounts": [
{
"id": "acct_123",
"provider": "linkedin",
"handle": "linkedin:person:123",
"displayName": "Acme Founder"
}
]
}
none
Response: AccountsResponse
/v1/dashboard/accounts/{accountId}
Dashboard disconnect account
Disconnects an account from the dashboard.
Path parameters
| Name | Required | Description |
|---|---|---|
accountId |
Yes | Connected account id. |
curl -sS https://getsocialclaw.com/v1/dashboard/accounts/acct_123 \
-H "Content-Type: application/json" \
-X DELETE
const response = await fetch("https://getsocialclaw.com/v1/dashboard/accounts/acct_123", {
method: "DELETE",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"connection": {
"id": "conn_123",
"provider": "linkedin",
"status": "pending",
"authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
}
}
none
Response: ConnectionResponse
/v1/dashboard/accounts/{accountId}/publish-settings
Dashboard publish settings
Returns provider-specific settings for dashboard compose.
Path parameters
| Name | Required | Description |
|---|---|---|
accountId |
Yes | Connected account id. |
curl -sS https://getsocialclaw.com/v1/dashboard/accounts/acct_123/publish-settings
const response = await fetch("https://getsocialclaw.com/v1/dashboard/accounts/acct_123/publish-settings", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"publishSettings": {
"supported": true,
"fields": [
{
"id": "visibility",
"type": "enum",
"options": [
"PUBLIC",
"CONNECTIONS"
]
}
]
}
}
none
Response: PublishSettingsResponse
/v1/dashboard/connections/start
Dashboard start connection
Starts an OAuth or manual connection from the dashboard.
curl -sS https://getsocialclaw.com/v1/dashboard/connections/start \
-H "Content-Type: application/json" \
-X POST \
--data '{
"provider": "instagram_business"
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/connections/start", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"provider": "instagram_business"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/ConnectionStartRequest"
}
{
"ok": true,
"connection": {
"id": "conn_123",
"provider": "linkedin",
"status": "pending",
"authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
}
}
ConnectionStartRequest
Response: ConnectionResponse
/v1/dashboard/connections/{connectionId}
Dashboard connection status
Returns dashboard connection status.
Path parameters
| Name | Required | Description |
|---|---|---|
connectionId |
Yes | Connection id. |
curl -sS https://getsocialclaw.com/v1/dashboard/connections/conn_123
const response = await fetch("https://getsocialclaw.com/v1/dashboard/connections/conn_123", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"connection": {
"id": "conn_123",
"provider": "linkedin",
"status": "pending",
"authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
}
}
none
Response: ConnectionResponse
/v1/dashboard/posts
Dashboard posts
Lists dashboard timeline posts.
Query parameters
| Name | Required | Description |
|---|---|---|
status |
No | Filter by post status. |
provider |
No | Filter by provider. |
account |
No | Filter by account handle. |
from |
No | Publish time lower bound. |
to |
No | Publish time upper bound. |
limit |
No | Maximum posts to return. |
offset |
No | Pagination offset. |
curl -sS https://getsocialclaw.com/v1/dashboard/posts
const response = await fetch("https://getsocialclaw.com/v1/dashboard/posts", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"total": 1,
"limit": 100,
"offset": 0,
"posts": [
{
"id": "post_123",
"runId": "run_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled",
"publishAtUtc": "2026-06-01T18:00:00.000Z"
}
]
}
none
Response: PostsResponse
/v1/dashboard/posts/{postId}/reconcile
Dashboard reconcile post
Refreshes provider-side status for a dashboard post.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/dashboard/posts/post_123/reconcile \
-H "Content-Type: application/json" \
-X POST
const response = await fetch("https://getsocialclaw.com/v1/dashboard/posts/post_123/reconcile", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"post": {
"id": "post_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled"
}
}
none
Response: PostResponse
/v1/dashboard/posts/{postId}
Dashboard update post
Updates an editable dashboard timeline post.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/dashboard/posts/post_123 \
-H "Content-Type: application/json" \
-X PATCH \
--data '{
"account": "linkedin:person:123",
"title": "Updated launch update",
"text": "Updated copy.",
"publishAt": "2026-06-01T18:00:00Z"
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/posts/post_123", {
method: "PATCH",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"account": "linkedin:person:123",
"title": "Updated launch update",
"text": "Updated copy.",
"publishAt": "2026-06-01T18:00:00Z"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/DashboardPostUpdateRequest"
}
{
"ok": true,
"post": {
"id": "post_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled"
}
}
DashboardPostUpdateRequest
Response: PostResponse
/v1/dashboard/posts/{postId}
Dashboard delete post
Deletes an editable timeline post from the dashboard.
Path parameters
| Name | Required | Description |
|---|---|---|
postId |
Yes | Post id. |
curl -sS https://getsocialclaw.com/v1/dashboard/posts/post_123 \
-H "Content-Type: application/json" \
-X DELETE
const response = await fetch("https://getsocialclaw.com/v1/dashboard/posts/post_123", {
method: "DELETE",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"post": {
"id": "post_123",
"provider": "linkedin",
"account": "linkedin:person:123",
"status": "scheduled"
}
}
none
Response: PostResponse
/v1/dashboard/assets
Dashboard assets
Lists ready assets for the dashboard media picker.
Query parameters
| Name | Required | Description |
|---|---|---|
limit |
No | Maximum assets to return. |
offset |
No | Pagination offset. |
curl -sS https://getsocialclaw.com/v1/dashboard/assets
const response = await fetch("https://getsocialclaw.com/v1/dashboard/assets", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"total": 1,
"limit": 24,
"offset": 0,
"assets": [
{
"id": "asset_123",
"mime": "image/png",
"kind": "image"
}
]
}
none
Response: AssetsResponse
/v1/dashboard/assets/{assetId}
Dashboard delete asset
Marks a dashboard asset for deletion.
Path parameters
| Name | Required | Description |
|---|---|---|
assetId |
Yes | Asset id. |
curl -sS https://getsocialclaw.com/v1/dashboard/assets/asset_123 \
-H "Content-Type: application/json" \
-X DELETE \
--data '{
"retentionDays": 7
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/assets/asset_123", {
method: "DELETE",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"retentionDays": 7
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true,
"asset": {
"id": "asset_123",
"mime": "image/png",
"kind": "image",
"publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
}
}
OkResponse
Response: AssetResponse
/v1/dashboard/assets/upload
Dashboard base64 asset upload
Uploads a small dashboard asset as base64.
curl -sS https://getsocialclaw.com/v1/dashboard/assets/upload \
-H "Content-Type: application/json" \
-X POST \
--data '{
"filename": "clip.mp4",
"mime": "video/mp4",
"contentBase64": "AAAAIGZ0eXBpc29t..."
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/assets/upload", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"filename": "clip.mp4",
"mime": "video/mp4",
"contentBase64": "AAAAIGZ0eXBpc29t..."
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/AssetUploadRequest"
}
{
"ok": true,
"asset": {
"id": "asset_123",
"mime": "image/png",
"kind": "image",
"publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
}
}
AssetUploadRequest
Response: AssetResponse
/v1/dashboard/assets/upload/initiate
Dashboard multipart initiate
Starts a multipart asset upload when S3 storage is available.
curl -sS https://getsocialclaw.com/v1/dashboard/assets/upload/initiate \
-H "Content-Type: application/json" \
-X POST \
--data '{
"filename": "launch-video.mp4",
"size": 52428800,
"mime": "video/mp4"
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/assets/upload/initiate", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"filename": "launch-video.mp4",
"size": 52428800,
"mime": "video/mp4"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/MultipartUploadInitiateRequest"
}
{
"ok": true,
"mode": "multipart",
"asset": {
"id": "asset_123",
"status": "uploading"
},
"upload": {
"uploadId": "upload_123",
"partSize": 8388608,
"totalParts": 7
}
}
MultipartUploadInitiateRequest
Response: MultipartInitiateResponse
/v1/dashboard/assets/upload/{assetId}/part
Dashboard multipart sign part
Signs one multipart upload part for direct browser upload.
Path parameters
| Name | Required | Description |
|---|---|---|
assetId |
Yes | Uploading asset id. |
curl -sS https://getsocialclaw.com/v1/dashboard/assets/upload/asset_123/part \
-H "Content-Type: application/json" \
-X POST \
--data '{
"uploadId": "upload_123",
"partNumber": 1
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/assets/upload/asset_123/part", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"uploadId": "upload_123",
"partNumber": 1
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/MultipartPartRequest"
}
{
"ok": true,
"assetId": "asset_123",
"uploadId": "upload_123",
"partNumber": 1,
"url": "https://s3.amazonaws.com/...",
"expiresIn": 900
}
MultipartPartRequest
Response: MultipartPartResponse
/v1/dashboard/assets/upload/{assetId}/complete
Dashboard multipart complete
Completes a multipart dashboard upload and marks the asset ready.
Path parameters
| Name | Required | Description |
|---|---|---|
assetId |
Yes | Uploading asset id. |
curl -sS https://getsocialclaw.com/v1/dashboard/assets/upload/asset_123/complete \
-H "Content-Type: application/json" \
-X POST \
--data '{
"uploadId": "upload_123",
"parts": [
{
"ETag": "\"abc123\"",
"PartNumber": 1
}
],
"duration": 24.5,
"width": 1080,
"height": 1920
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/assets/upload/asset_123/complete", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"uploadId": "upload_123",
"parts": [
{
"ETag": "\"abc123\"",
"PartNumber": 1
}
],
"duration": 24.5,
"width": 1080,
"height": 1920
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/MultipartCompleteRequest"
}
{
"ok": true,
"asset": {
"id": "asset_123",
"mime": "image/png",
"kind": "image",
"publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
}
}
MultipartCompleteRequest
Response: AssetResponse
/v1/dashboard/assets/upload/{assetId}/abort
Dashboard multipart abort
Aborts a multipart dashboard upload.
Path parameters
| Name | Required | Description |
|---|---|---|
assetId |
Yes | Uploading asset id. |
curl -sS https://getsocialclaw.com/v1/dashboard/assets/upload/asset_123/abort \
-H "Content-Type: application/json" \
-X POST \
--data '{
"uploadId": "upload_123"
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/assets/upload/asset_123/abort", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"uploadId": "upload_123"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true
}
OkResponse
Response: OkResponse
/v1/dashboard/compose
Dashboard compose
Creates a scheduled run from dashboard compose state and can publish immediately.
curl -sS https://getsocialclaw.com/v1/dashboard/compose \
-H "Content-Type: application/json" \
-X POST \
--data '{
"title": "Launch update",
"text": "Shipping today.",
"account": "linkedin:person:123",
"publishAt": "2026-06-01T14:00:00Z",
"timezone": "UTC"
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/compose", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"title": "Launch update",
"text": "Shipping today.",
"account": "linkedin:person:123",
"publishAt": "2026-06-01T14:00:00Z",
"timezone": "UTC"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/DashboardComposeRequest"
}
{
"ok": true,
"duplicate": false,
"run": {
"id": "run_123",
"status": "created",
"totalPosts": 1
},
"posts": [
{
"id": "post_123",
"status": "scheduled"
}
]
}
DashboardComposeRequest
Response: RunResponse
/v1/dashboard/keys
Dashboard list keys
Lists dashboard API keys, including secrets for dashboard display.
curl -sS https://getsocialclaw.com/v1/dashboard/keys
const response = await fetch("https://getsocialclaw.com/v1/dashboard/keys", {
method: "GET",
credentials: "include",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"keys": [
{
"id": "key_123",
"prefix": "sc_live_abcd",
"label": "Production scheduler",
"lastUsedAt": "2026-05-23T10:00:00.000Z"
}
]
}
none
Response: KeysResponse
/v1/dashboard/keys
Dashboard create key
Creates a workspace API key from the dashboard.
curl -sS https://getsocialclaw.com/v1/dashboard/keys \
-H "Content-Type: application/json" \
-X POST \
--data '{
"label": "Agent key",
"kind": "personal"
}'
const response = await fetch("https://getsocialclaw.com/v1/dashboard/keys", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"label": "Agent key",
"kind": "personal"
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/KeyCreateRequest"
}
{
"ok": true,
"key": {
"id": "key_456",
"prefix": "sc_live_wxyz",
"label": "Agent key",
"secret": "sc_live_wxyz..."
}
}
KeyCreateRequest
Response: KeyCreateResponse
/v1/dashboard/keys/{keyId}
Dashboard revoke key
Revokes a workspace API key from the dashboard.
Path parameters
| Name | Required | Description |
|---|---|---|
keyId |
Yes | API key id. |
curl -sS https://getsocialclaw.com/v1/dashboard/keys/key_123 \
-H "Content-Type: application/json" \
-X DELETE
const response = await fetch("https://getsocialclaw.com/v1/dashboard/keys/key_123", {
method: "DELETE",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"key": {
"id": "key_456",
"prefix": "sc_live_wxyz",
"label": "Agent key",
"secret": "sc_live_wxyz..."
}
}
none
Response: KeyCreateResponse
/v1/dashboard/keys/{keyId}/rotate
Dashboard rotate key
Rotates a workspace API key and returns the new secret.
Path parameters
| Name | Required | Description |
|---|---|---|
keyId |
Yes | API key id. |
curl -sS https://getsocialclaw.com/v1/dashboard/keys/key_123/rotate \
-H "Content-Type: application/json" \
-X POST
const response = await fetch("https://getsocialclaw.com/v1/dashboard/keys/key_123/rotate", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
});
const data = await response.json();
No JSON body.
{
"ok": true,
"key": {
"id": "key_456",
"prefix": "sc_live_wxyz",
"label": "Agent key",
"secret": "sc_live_wxyz..."
}
}
none
Response: KeyCreateResponse
Auth, Billing, and Provider Callbacks
Routes called by identity providers, billing systems, app stores, and Meta webhooks.
/auth/mobile/google/start
Mobile Google auth start
Starts native/mobile dashboard authentication with Google.
Query parameters
| Name | Required | Description |
|---|---|---|
callbackScheme |
No | Optional mobile callback scheme. |
curl -sS https://getsocialclaw.com/auth/mobile/google/start
const response = await fetch("https://getsocialclaw.com/auth/mobile/google/start", {
method: "GET",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true
}
none
Response: redirect
/auth/mobile/apple/start
Mobile Apple auth start
Starts native/mobile dashboard authentication with Apple.
Query parameters
| Name | Required | Description |
|---|---|---|
callbackScheme |
No | Optional mobile callback scheme. |
curl -sS https://getsocialclaw.com/auth/mobile/apple/start
const response = await fetch("https://getsocialclaw.com/auth/mobile/apple/start", {
method: "GET",
headers: {},
});
const data = await response.json();
No JSON body.
{
"ok": true
}
none
Response: redirect
/auth/mobile/apple/native
Native Apple token exchange
Exchanges a native Apple identity token for a SocialClaw dashboard session payload.
curl -sS https://getsocialclaw.com/auth/mobile/apple/native \
-H "Content-Type: application/json" \
-X POST \
--data '{
"identityToken": "eyJraWQiOiJhcHBsZSJ9..."
}'
const response = await fetch("https://getsocialclaw.com/auth/mobile/apple/native", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"identityToken": "eyJraWQiOiJhcHBsZSJ9..."
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/AppleNativeAuthRequest"
}
{
"ok": true,
"authenticated": true,
"user": {
"id": "user_123",
"email": "operator@example.com"
},
"tenant": {
"id": "tenant_123",
"name": "Acme Studio"
}
}
AppleNativeAuthRequest
Response: DashboardSessionResponse
/v1/billing/webhook
Billing webhook
Processes Lemon Squeezy billing events.
- Requests must include the expected billing signature header.
curl -sS https://getsocialclaw.com/v1/billing/webhook \
-H "x-signature: $SOCIALCLAW_WEBHOOK_SIGNATURE" \
-H "Content-Type: application/json" \
-X POST \
--data '{}'
const response = await fetch("https://getsocialclaw.com/v1/billing/webhook", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true
}
OkResponse
Response: WebhookResponse
/v1/billing/app-store/notifications
App Store server notification
Processes signed App Store server notifications.
curl -sS https://getsocialclaw.com/v1/billing/app-store/notifications \
-H "x-signature: $SOCIALCLAW_WEBHOOK_SIGNATURE" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"signedPayload": "eyJhbGciOiJFUzI1NiJ9..."
}'
const response = await fetch("https://getsocialclaw.com/v1/billing/app-store/notifications", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"signedPayload": "eyJhbGciOiJFUzI1NiJ9..."
})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true
}
OkResponse
Response: WebhookResponse
/webhooks/meta/deauthorize
Meta deauthorize webhook
Receives Meta deauthorization callbacks.
curl -sS https://getsocialclaw.com/webhooks/meta/deauthorize \
-H "x-signature: $SOCIALCLAW_WEBHOOK_SIGNATURE" \
-H "Content-Type: application/json" \
-X POST \
--data '{}'
const response = await fetch("https://getsocialclaw.com/webhooks/meta/deauthorize", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true
}
OkResponse
Response: WebhookResponse
/webhooks/meta/data-deletion
Meta data deletion webhook
Receives Meta data deletion requests and returns a deletion status URL/code.
curl -sS https://getsocialclaw.com/webhooks/meta/data-deletion \
-H "x-signature: $SOCIALCLAW_WEBHOOK_SIGNATURE" \
-H "Content-Type: application/json" \
-X POST \
--data '{}'
const response = await fetch("https://getsocialclaw.com/webhooks/meta/data-deletion", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({})
});
const data = await response.json();
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$ref": "#/components/schemas/OkResponse"
}
{
"ok": true
}
OkResponse
Response: WebhookResponse
JSON Schema components
The OpenAPI document uses these JSON Schema 2020-12 components for request and response contracts.
AccountsResponse
Connected accounts response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Connected accounts response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"accounts": {
"type": "array",
"description": "Connected accounts.",
"items": {
"$ref": "#/components/schemas/ConnectedAccount"
}
}
},
"required": [
"ok",
"accounts"
]
}
ActionResultResponse
Discovery action result response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Discovery action result response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"result": {
"type": "object",
"additionalProperties": true
}
},
"required": [
"ok",
"result"
]
}
AnalyticsRefreshRequest
Requests a fresh analytics fetch for a published post.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Requests a fresh analytics fetch for a published post.",
"additionalProperties": false,
"properties": {
"postId": {
"type": "string",
"description": "Post id. Also accepted as post_id."
},
"window": {
"type": [
"string",
"null"
],
"description": "Metric window, for example lifetime."
},
"metricWindow": {
"type": [
"string",
"null"
],
"description": "Alias for window."
}
},
"required": [
"postId"
]
}
AnalyticsResponse
Analytics response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Analytics response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"analytics": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"metrics": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"window": {
"type": [
"string",
"null"
],
"description": "Metric window."
}
},
"required": [
"ok"
]
}
ApiKey
API key metadata. Secret values are only returned when a key is created or shown in the dashboard key API.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "API key metadata. Secret values are only returned when a key is created or shown in the dashboard key API.",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"description": "API key id, for example key_abc123."
},
"prefix": {
"type": [
"string",
"null"
],
"description": "Public prefix used to identify the key without exposing the secret."
},
"label": {
"type": [
"string",
"null"
],
"description": "Optional human label."
},
"kind": {
"type": [
"string",
"null"
],
"description": "Key kind, such as personal or agent."
},
"secret": {
"type": [
"string",
"null"
],
"description": "Raw key secret. Only present at creation or in dashboard key listings."
},
"createdAt": {
"type": [
"string",
"null"
],
"description": "Creation time.",
"format": "date-time"
},
"revokedAt": {
"type": [
"string",
"null"
],
"description": "Revocation time.",
"format": "date-time"
},
"lastUsedAt": {
"type": [
"string",
"null"
],
"description": "Last successful API authentication time.",
"format": "date-time"
}
},
"required": [
"id"
]
}
AppleNativeAuthRequest
Native iOS Sign in with Apple identity token exchange.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Native iOS Sign in with Apple identity token exchange.",
"additionalProperties": true,
"properties": {
"identityToken": {
"type": "string",
"description": "Apple identity token. Also accepted as identity_token."
},
"nonceSha256": {
"type": [
"string",
"null"
],
"description": "SHA-256 nonce. Also accepted as nonce."
},
"email": {
"type": [
"string",
"null"
],
"description": "Email supplied by Apple on first sign-in."
},
"givenName": {
"type": [
"string",
"null"
],
"description": "Given name."
},
"familyName": {
"type": [
"string",
"null"
],
"description": "Family name."
},
"name": {
"type": [
"string",
"null"
],
"description": "Display name."
}
},
"required": [
"identityToken"
]
}
AppStoreClaimRequest
Claims an App Store transaction for the current dashboard workspace.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Claims an App Store transaction for the current dashboard workspace.",
"additionalProperties": false,
"properties": {
"signedTransactionInfo": {
"type": "string",
"description": "App Store signed transaction JWS. Also accepted as signed_transaction_info or transactionJws."
}
},
"required": [
"signedTransactionInfo"
]
}
Asset
SocialClaw-managed media asset.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "SocialClaw-managed media asset.",
"additionalProperties": true,
"properties": {
"id": {
"type": "string",
"description": "Asset id."
},
"tenantId": {
"type": [
"string",
"null"
],
"description": "Workspace id."
},
"storage": {
"type": [
"string",
"null"
],
"description": "Storage driver."
},
"objectKey": {
"type": [
"string",
"null"
],
"description": "Internal object key."
},
"originalFilename": {
"type": [
"string",
"null"
],
"description": "Original file name."
},
"mime": {
"type": "string",
"description": "MIME type."
},
"kind": {
"type": "string",
"enum": [
"image",
"video",
"audio",
"other"
]
},
"size": {
"type": "integer",
"description": "Size in bytes."
},
"status": {
"type": [
"string",
"null"
],
"description": "ready, uploading, draft, pending_delete, or provider-specific state."
},
"publicUrl": {
"type": [
"string",
"null"
],
"description": "Public delivery URL.",
"format": "uri"
},
"preview": {
"type": [
"object",
"null"
],
"description": "Thumbnail, poster, or preview URLs."
},
"createdAt": {
"type": [
"string",
"null"
],
"description": "Creation time.",
"format": "date-time"
}
},
"required": [
"id",
"mime",
"kind"
]
}
AssetInput
Media asset referenced by a post.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Media asset referenced by a post.",
"additionalProperties": true,
"properties": {
"id": {
"type": [
"string",
"null"
],
"description": "Client-side or SocialClaw asset id."
},
"url": {
"type": "string",
"description": "Publicly reachable media URL."
},
"managed": {
"type": "boolean",
"description": "True when this is a SocialClaw-managed asset."
},
"originalFilename": {
"type": [
"string",
"null"
],
"description": "Original file name."
},
"mime": {
"type": [
"string",
"null"
],
"description": "MIME type."
},
"kind": {
"type": [
"string",
"null"
],
"enum": [
"image",
"video",
"audio",
"other",
null
]
},
"size": {
"type": [
"integer",
"null"
],
"description": "File size in bytes."
},
"duration": {
"type": [
"number",
"null"
],
"description": "Duration in seconds for video/audio."
},
"width": {
"type": [
"integer",
"null"
],
"description": "Media width in pixels."
},
"height": {
"type": [
"integer",
"null"
],
"description": "Media height in pixels."
},
"altText": {
"type": [
"string",
"null"
],
"description": "Alt text where the provider supports it."
}
},
"required": [
"url"
]
}
AssetRegistrationRequest
Registers an already-stored asset or externally managed object for the workspace.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Registers an already-stored asset or externally managed object for the workspace.",
"additionalProperties": true,
"properties": {
"objectKey": {
"type": "string",
"description": "Storage object key."
},
"originalFilename": {
"type": [
"string",
"null"
],
"description": "Original filename. Also accepted as filename."
},
"publicUrl": {
"type": [
"string",
"null"
],
"description": "Public URL if already available."
},
"mime": {
"type": [
"string",
"null"
],
"description": "MIME type."
},
"kind": {
"type": [
"string",
"null"
],
"enum": [
"image",
"video",
"audio",
"other",
null
]
},
"size": {
"type": [
"integer",
"null"
]
},
"status": {
"type": [
"string",
"null"
],
"description": "Asset status. Defaults to draft."
}
},
"required": [
"objectKey"
]
}
AssetResponse
Single asset response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Single asset response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"asset": {
"$ref": "#/components/schemas/Asset"
}
},
"required": [
"ok",
"asset"
]
}
AssetsResponse
Asset list response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Asset list response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"total": {
"type": "integer",
"description": "Total matching assets."
},
"limit": {
"type": "integer",
"description": "Page limit."
},
"offset": {
"type": "integer",
"description": "Page offset."
},
"assets": {
"type": "array",
"description": "Assets.",
"items": {
"$ref": "#/components/schemas/Asset"
}
}
},
"required": [
"ok",
"assets"
]
}
AssetUploadRequest
Base64 upload request for small media files.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Base64 upload request for small media files.",
"additionalProperties": true,
"properties": {
"filename": {
"type": "string",
"description": "Original file name."
},
"name": {
"type": [
"string",
"null"
],
"description": "Alias for filename."
},
"mime": {
"type": [
"string",
"null"
],
"description": "MIME type. Inferred from filename when omitted."
},
"contentBase64": {
"type": "string",
"description": "Base64-encoded file content."
},
"content_base64": {
"type": [
"string",
"null"
],
"description": "Snake-case alias for contentBase64."
},
"duration": {
"type": [
"number",
"null"
]
},
"width": {
"type": [
"integer",
"null"
]
},
"height": {
"type": [
"integer",
"null"
]
},
"deleteAfter": {
"type": [
"string",
"null"
],
"description": "Optional retention timestamp.",
"format": "date-time"
}
},
"required": [
"filename",
"contentBase64"
]
}
AttemptsResponse
Post attempts response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Post attempts response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"post": {
"$ref": "#/components/schemas/Post"
},
"attempts": {
"type": "array",
"description": "Publish attempts.",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"required": [
"ok"
]
}
BillingCheckoutRequest
Starts a billing checkout session.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Starts a billing checkout session.",
"additionalProperties": false,
"properties": {
"plan": {
"type": "string",
"description": "Plan id."
},
"billingInterval": {
"type": "string",
"description": "monthly or yearly."
}
},
"required": [
"plan",
"billingInterval"
]
}
BillingStateResponse
Workspace billing state.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Workspace billing state.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"billing": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"plans": {
"type": "array",
"description": "Available plans.",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"required": [
"ok"
]
}
CampaignInput
Campaign graph with targets and steps.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Campaign graph with targets and steps.",
"additionalProperties": true,
"properties": {
"id": {
"type": [
"string",
"null"
],
"description": "Campaign id."
},
"name": {
"type": "string",
"description": "Campaign name."
},
"targets": {
"type": "array",
"description": "Publishing targets.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"account": {
"type": "string",
"description": "Connected account handle."
},
"publish_at": {
"type": [
"string",
"null"
],
"description": "Base publish time.",
"format": "date-time"
},
"steps": {
"type": "array",
"description": "Campaign steps.",
"items": {
"$ref": "#/components/schemas/PostInput"
}
}
}
}
}
},
"required": [
"name",
"targets"
]
}
CapabilitiesResponse
Capability response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Capability response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"capabilities": {
"type": "array",
"description": "Capabilities.",
"items": {
"$ref": "#/components/schemas/Capability"
}
}
},
"required": [
"ok",
"capabilities"
]
}
Capability
Publishing capabilities for a connected account or provider.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Publishing capabilities for a connected account or provider.",
"additionalProperties": true,
"properties": {
"provider": {
"type": "string",
"enum": [
"x",
"meta",
"facebook",
"instagram_business",
"instagram",
"snapchat",
"tiktok",
"linkedin",
"linkedin_page",
"pinterest",
"youtube",
"reddit",
"discord",
"telegram",
"wordpress"
]
},
"accountId": {
"type": [
"string",
"null"
],
"description": "Connected account id."
},
"canPublish": {
"type": "boolean",
"description": "Whether SocialClaw can publish to this account."
},
"media": {
"type": [
"object",
"null"
],
"description": "Media limits and supported shapes."
},
"settings": {
"type": [
"array",
"null"
],
"items": {
"type": "object"
},
"description": "Provider settings fields."
}
}
}
ConnectedAccount
Social account or destination connected to a SocialClaw workspace.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Social account or destination connected to a SocialClaw workspace.",
"additionalProperties": true,
"properties": {
"id": {
"type": "string",
"description": "Connected account id."
},
"provider": {
"type": "string",
"enum": [
"x",
"meta",
"facebook",
"instagram_business",
"instagram",
"snapchat",
"tiktok",
"linkedin",
"linkedin_page",
"pinterest",
"youtube",
"reddit",
"discord",
"telegram",
"wordpress"
],
"description": "Canonical provider id."
},
"handle": {
"type": "string",
"description": "Stable account handle used in schedules."
},
"displayName": {
"type": [
"string",
"null"
],
"description": "Display name."
},
"accountType": {
"type": [
"string",
"null"
],
"description": "Provider-specific account type."
},
"externalId": {
"type": [
"string",
"null"
],
"description": "Provider account id."
},
"status": {
"type": [
"string",
"null"
],
"description": "Connection status."
},
"createdAt": {
"type": [
"string",
"null"
],
"description": "Creation time.",
"format": "date-time"
},
"updatedAt": {
"type": [
"string",
"null"
],
"description": "Last update time.",
"format": "date-time"
}
},
"required": [
"id",
"provider",
"handle"
]
}
Connection
Connection handshake status.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Connection handshake status.",
"additionalProperties": true,
"properties": {
"id": {
"type": "string",
"description": "Connection id."
},
"provider": {
"type": "string",
"enum": [
"x",
"meta",
"facebook",
"instagram_business",
"instagram",
"snapchat",
"tiktok",
"linkedin",
"linkedin_page",
"pinterest",
"youtube",
"reddit",
"discord",
"telegram",
"wordpress"
],
"description": "Provider being connected."
},
"status": {
"type": [
"string",
"null"
],
"description": "pending, connected, failed, or provider-specific state."
},
"authorizeUrl": {
"type": [
"string",
"null"
],
"description": "OAuth authorize URL when OAuth is required."
},
"account": {
"anyOf": [
{
"$ref": "#/components/schemas/ConnectedAccount"
},
{
"type": "null"
}
]
},
"error": {
"type": [
"string",
"null"
],
"description": "Connection error message, when failed."
},
"createdAt": {
"type": [
"string",
"null"
],
"description": "Creation time.",
"format": "date-time"
}
},
"required": [
"id",
"provider"
]
}
ConnectionResponse
Connection response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Connection response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"connection": {
"$ref": "#/components/schemas/Connection"
},
"account": {
"$ref": "#/components/schemas/ConnectedAccount"
}
},
"required": [
"ok"
]
}
ConnectionsResponse
Connection list response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Connection list response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"connections": {
"type": "array",
"description": "Connections.",
"items": {
"$ref": "#/components/schemas/Connection"
}
}
},
"required": [
"ok",
"connections"
]
}
ConnectionStartRequest
Request to start an OAuth or manual connection. Telegram and Discord use manual credentials; other providers return an OAuth URL.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Request to start an OAuth or manual connection. Telegram and Discord use manual credentials; other providers return an OAuth URL.",
"additionalProperties": true,
"properties": {
"provider": {
"type": "string",
"enum": [
"x",
"meta",
"facebook",
"instagram_business",
"instagram",
"snapchat",
"tiktok",
"linkedin",
"linkedin_page",
"pinterest",
"youtube",
"reddit",
"discord",
"telegram",
"wordpress"
],
"description": "Provider to connect."
},
"botToken": {
"type": [
"string",
"null"
],
"description": "Telegram bot token. Also accepted as bot_token."
},
"chatId": {
"type": [
"string",
"null"
],
"description": "Telegram chat id. Also accepted as chat_id."
},
"webhookUrl": {
"type": [
"string",
"null"
],
"description": "Discord webhook URL. Also accepted as webhook_url."
},
"client": {
"type": [
"string",
"null"
],
"description": "Optional client hint, for example ios."
},
"callbackScheme": {
"type": [
"string",
"null"
],
"description": "Optional mobile callback scheme. Also accepted as callback_scheme."
}
},
"required": [
"provider"
]
}
DashboardComposeRequest
Dashboard compose request. Supports one account or a targets array.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Dashboard compose request. Supports one account or a targets array.",
"additionalProperties": true,
"properties": {
"title": {
"type": [
"string",
"null"
],
"description": "Post title. Also accepted as name."
},
"text": {
"type": [
"string",
"null"
],
"description": "Post body. Also accepted as description."
},
"account": {
"type": [
"string",
"null"
],
"description": "Single account handle."
},
"accountHandle": {
"type": [
"string",
"null"
],
"description": "Alias for account."
},
"targets": {
"type": "array",
"description": "Multi-channel targets.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"account": {
"type": "string",
"description": "Account handle."
},
"accountHandle": {
"type": [
"string",
"null"
],
"description": "Alias for account."
},
"settings": {
"type": "object"
}
}
}
},
"assets": {
"type": "array",
"description": "Assets for the post.",
"items": {
"$ref": "#/components/schemas/AssetInput"
}
},
"timezone": {
"type": [
"string",
"null"
],
"description": "IANA timezone. Defaults to UTC."
},
"publishAt": {
"type": [
"string",
"null"
],
"description": "Scheduled publish time.",
"format": "date-time"
},
"publishNow": {
"type": "boolean",
"description": "Publish immediately when true."
},
"campaignName": {
"type": [
"string",
"null"
],
"description": "Campaign name for multi-target posts."
}
}
}
DashboardPostUpdateRequest
Updates an editable dashboard timeline post.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Updates an editable dashboard timeline post.",
"additionalProperties": true,
"properties": {
"title": {
"type": [
"string",
"null"
],
"description": "Updated title."
},
"text": {
"type": [
"string",
"null"
],
"description": "Updated text."
},
"account": {
"type": "string",
"description": "Account handle."
},
"assets": {
"type": "array",
"description": "Updated media assets.",
"items": {
"$ref": "#/components/schemas/AssetInput"
}
},
"settings": {
"type": "object"
},
"timezone": {
"type": [
"string",
"null"
],
"description": "IANA timezone."
},
"publishAt": {
"type": "string",
"description": "Updated publish time.",
"format": "date-time"
}
},
"required": [
"account",
"publishAt"
]
}
DashboardSessionResponse
Current dashboard session response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Current dashboard session response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"authenticated": {
"type": "boolean",
"description": "Whether a dashboard session exists."
},
"user": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"tenant": {
"anyOf": [
{
"$ref": "#/components/schemas/Tenant"
},
{
"type": "null"
}
]
},
"membership": {
"type": [
"object",
"null"
],
"additionalProperties": true
}
},
"required": [
"ok"
]
}
DiscoveryAction
Provider discovery action such as syncing boards, pages, or channels.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Provider discovery action such as syncing boards, pages, or channels.",
"additionalProperties": true,
"properties": {
"id": {
"type": "string",
"description": "Action id."
},
"label": {
"type": "string",
"description": "Display label."
},
"description": {
"type": [
"string",
"null"
],
"description": "What the action does."
},
"provider": {
"type": [
"string",
"null"
],
"enum": [
"x",
"meta",
"facebook",
"instagram_business",
"instagram",
"snapchat",
"tiktok",
"linkedin",
"linkedin_page",
"pinterest",
"youtube",
"reddit",
"discord",
"telegram",
"wordpress",
null
]
},
"inputSchema": {
"type": [
"object",
"null"
],
"description": "Optional JSON Schema for action input."
}
},
"required": [
"id",
"label"
]
}
DiscoveryActionsResponse
Discovery actions response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Discovery actions response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"actions": {
"type": "array",
"description": "Available actions.",
"items": {
"$ref": "#/components/schemas/DiscoveryAction"
}
}
},
"required": [
"ok",
"actions"
]
}
ErrorResponse
Standard error response returned by JSON API routes.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Standard error response returned by JSON API routes.",
"additionalProperties": false,
"properties": {
"ok": {
"const": false,
"description": "Always false for errors."
},
"code": {
"type": [
"string",
"null"
],
"description": "Stable machine-readable error code."
},
"message": {
"type": "string",
"description": "Human-readable error message."
},
"details": {
"type": [
"object",
"array",
"string",
"number",
"boolean",
"null"
],
"description": "Optional route-specific details."
}
},
"required": [
"ok",
"message"
]
}
HealthResponse
Service health response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Service health response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"service": {
"type": "string",
"description": "Service name."
},
"now": {
"type": "string",
"description": "Server time.",
"format": "date-time"
},
"db": {
"type": "object",
"additionalProperties": true
},
"assetStorage": {
"type": "object",
"additionalProperties": true
},
"maxAssetBytes": {
"type": "integer",
"description": "Maximum base64 upload size."
},
"publicBaseUrl": {
"type": "string",
"description": "Configured public base URL.",
"format": "uri"
}
},
"required": [
"ok",
"service",
"now"
]
}
JobsResponse
Job list response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Job list response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"jobs": {
"type": "array",
"description": "Jobs.",
"items": {
"type": "object",
"additionalProperties": true
}
},
"total": {
"type": "integer",
"description": "Total matching jobs."
}
},
"required": [
"ok"
]
}
KeyCreateRequest
Creates an API key.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Creates an API key.",
"additionalProperties": true,
"properties": {
"label": {
"type": [
"string",
"null"
],
"description": "Optional label."
},
"kind": {
"type": [
"string",
"null"
],
"description": "Dashboard-only key kind."
}
}
}
KeyCreateResponse
API key creation response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "API key creation response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"key": {
"$ref": "#/components/schemas/ApiKey"
},
"apiKey": {
"$ref": "#/components/schemas/ApiKey"
},
"secret": {
"type": [
"string",
"null"
],
"description": "Raw secret when returned as a top-level value."
}
},
"required": [
"ok"
]
}
KeysResponse
API key list response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "API key list response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"keys": {
"type": "array",
"description": "Keys in the workspace.",
"items": {
"$ref": "#/components/schemas/ApiKey"
}
}
},
"required": [
"ok",
"keys"
]
}
KeyValidationResponse
Valid API key response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Valid API key response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"tenant": {
"$ref": "#/components/schemas/Tenant"
},
"apiKey": {
"$ref": "#/components/schemas/ApiKey"
}
},
"required": [
"ok",
"tenant",
"apiKey"
]
}
MultipartCompleteRequest
Completes a multipart upload after the client sends every signed part.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Completes a multipart upload after the client sends every signed part.",
"additionalProperties": true,
"properties": {
"uploadId": {
"type": "string",
"description": "Multipart upload id."
},
"parts": {
"type": "array",
"description": "Uploaded parts with ETag and partNumber.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"ETag": {
"type": "string",
"description": "Part ETag."
},
"PartNumber": {
"type": "integer",
"description": "Part number."
}
}
}
},
"duration": {
"type": [
"number",
"null"
]
},
"width": {
"type": [
"integer",
"null"
]
},
"height": {
"type": [
"integer",
"null"
]
}
},
"required": [
"uploadId",
"parts"
]
}
MultipartInitiateResponse
Multipart initiation response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Multipart initiation response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"mode": {
"type": "string",
"description": "multipart when S3 upload is used, otherwise base64."
},
"maxAssetBytes": {
"type": "integer",
"description": "Base64 fallback max bytes."
},
"asset": {
"$ref": "#/components/schemas/Asset"
},
"upload": {
"type": "object",
"additionalProperties": true,
"properties": {
"uploadId": {
"type": "string",
"description": "Multipart upload id."
},
"partSize": {
"type": "integer",
"description": "Recommended part size."
},
"totalParts": {
"type": "integer",
"description": "Total expected parts."
}
}
}
},
"required": [
"ok",
"mode"
]
}
MultipartPartRequest
Signs one multipart upload part.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Signs one multipart upload part.",
"additionalProperties": false,
"properties": {
"uploadId": {
"type": "string",
"description": "Multipart upload id returned by initiate."
},
"partNumber": {
"type": "integer",
"description": "1-based part number.",
"minimum": 1
}
},
"required": [
"uploadId",
"partNumber"
]
}
MultipartPartResponse
Signed multipart part response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Signed multipart part response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"assetId": {
"type": "string",
"description": "Asset id."
},
"uploadId": {
"type": "string",
"description": "Multipart upload id."
},
"partNumber": {
"type": "integer",
"description": "Part number."
},
"url": {
"type": "string",
"description": "Signed upload URL.",
"format": "uri"
},
"expiresIn": {
"type": "integer",
"description": "Signed URL lifetime in seconds."
}
},
"required": [
"ok",
"assetId",
"uploadId",
"partNumber",
"url"
]
}
MultipartUploadInitiateRequest
Starts a multipart upload session for dashboard uploads when S3 storage is enabled.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Starts a multipart upload session for dashboard uploads when S3 storage is enabled.",
"additionalProperties": false,
"properties": {
"filename": {
"type": "string",
"description": "File name. Also accepted as name."
},
"size": {
"type": "integer",
"description": "Expected file size in bytes."
},
"mime": {
"type": [
"string",
"null"
],
"description": "MIME type."
}
},
"required": [
"filename",
"size"
]
}
OkResponse
Generic successful response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Generic successful response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true,
"description": "Always true for successful JSON API responses."
}
},
"required": [
"ok"
]
}
Post
Scheduled or published post record.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Scheduled or published post record.",
"additionalProperties": true,
"properties": {
"id": {
"type": "string",
"description": "Post id."
},
"runId": {
"type": [
"string",
"null"
],
"description": "Run id."
},
"provider": {
"type": "string",
"enum": [
"x",
"meta",
"facebook",
"instagram_business",
"instagram",
"snapchat",
"tiktok",
"linkedin",
"linkedin_page",
"pinterest",
"youtube",
"reddit",
"discord",
"telegram",
"wordpress"
]
},
"account": {
"type": "string",
"description": "Connected account handle."
},
"accountId": {
"type": [
"string",
"null"
],
"description": "Connected account id."
},
"status": {
"type": "string",
"enum": [
"draft",
"scheduled",
"publishing",
"published",
"retry_pending",
"failed",
"canceled"
]
},
"name": {
"type": [
"string",
"null"
],
"description": "Post name or title."
},
"description": {
"type": [
"string",
"null"
],
"description": "Post body text."
},
"publishAtUtc": {
"type": [
"string",
"null"
],
"description": "UTC publish time.",
"format": "date-time"
},
"providerPostId": {
"type": [
"string",
"null"
],
"description": "Provider-side post id after publish."
},
"providerUrl": {
"type": [
"string",
"null"
],
"description": "Provider-side URL when available.",
"format": "uri"
},
"error": {
"type": [
"string",
"null"
],
"description": "Last error message."
},
"attempts": {
"type": "integer",
"description": "Publish attempt count."
}
},
"required": [
"id",
"provider",
"account",
"status"
]
}
PostInput
Post to validate, schedule, or publish.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Post to validate, schedule, or publish.",
"additionalProperties": true,
"properties": {
"provider": {
"type": [
"string",
"null"
],
"enum": [
"x",
"meta",
"facebook",
"instagram_business",
"instagram",
"snapchat",
"tiktok",
"linkedin",
"linkedin_page",
"pinterest",
"youtube",
"reddit",
"discord",
"telegram",
"wordpress",
null
],
"description": "Provider. Optional when account handle identifies the provider."
},
"account": {
"type": "string",
"description": "Connected account handle or id."
},
"name": {
"type": [
"string",
"null"
],
"description": "Post title, campaign step title, or provider title."
},
"title": {
"type": [
"string",
"null"
],
"description": "Alias for name on providers requiring titles."
},
"description": {
"type": [
"string",
"null"
],
"description": "Primary post text."
},
"text": {
"type": [
"string",
"null"
],
"description": "Alias for description."
},
"publish_at": {
"type": [
"string",
"null"
],
"description": "Scheduled publish time.",
"format": "date-time"
},
"publishAt": {
"type": [
"string",
"null"
],
"description": "Camel-case alias for publish_at.",
"format": "date-time"
},
"media_link": {
"type": [
"string",
"null"
],
"description": "Single public media URL."
},
"mediaLink": {
"type": [
"string",
"null"
],
"description": "Camel-case alias for media_link."
},
"assets": {
"type": "array",
"description": "One or more asset objects or URL strings.",
"items": {
"anyOf": [
{
"$ref": "#/components/schemas/AssetInput"
},
{
"type": "string",
"format": "uri"
}
]
}
},
"settings": {
"type": "object",
"description": "Provider-specific settings from the publish settings API."
},
"interaction_type": {
"type": [
"string",
"null"
],
"enum": [
"post",
"reply",
"comment",
null
]
},
"parent_step_id": {
"type": [
"string",
"null"
],
"description": "Parent step id for reply/thread workflows."
}
},
"required": [
"account"
]
}
PostResponse
Single post response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Single post response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"post": {
"$ref": "#/components/schemas/Post"
}
},
"required": [
"ok",
"post"
]
}
PostsResponse
Post list response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Post list response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"posts": {
"type": "array",
"description": "Posts.",
"items": {
"$ref": "#/components/schemas/Post"
}
},
"total": {
"type": "integer",
"description": "Total matching posts."
},
"limit": {
"type": "integer",
"description": "Page limit."
},
"offset": {
"type": "integer",
"description": "Page offset."
}
},
"required": [
"ok",
"posts"
]
}
ProductsResponse
App Store products response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "App Store products response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"provider": {
"type": "string",
"description": "Billing provider."
},
"enabled": {
"type": "boolean",
"description": "Whether App Store billing is enabled."
},
"bundleId": {
"type": [
"string",
"null"
],
"description": "iOS bundle id."
},
"environment": {
"type": [
"string",
"null"
],
"description": "App Store environment."
},
"products": {
"type": "array",
"description": "Product mappings.",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"required": [
"ok",
"products"
]
}
PublishSettings
Provider-specific publish settings. Returned fields are authoritative for UI generation.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Provider-specific publish settings. Returned fields are authoritative for UI generation.",
"additionalProperties": true,
"properties": {
"supported": {
"type": "boolean",
"description": "Whether settings are available for this account."
},
"target": {
"type": [
"object",
"null"
],
"description": "Provider and account type target."
},
"fields": {
"type": "array",
"description": "Field descriptors.",
"items": {
"type": "object"
}
},
"discovery": {
"type": [
"object",
"null"
],
"description": "Provider media delivery and publish-shape notes."
}
}
}
PublishSettingsResponse
Publish settings response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Publish settings response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"publishSettings": {
"$ref": "#/components/schemas/PublishSettings"
}
},
"required": [
"ok",
"publishSettings"
]
}
Run
Publishing run.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Publishing run.",
"additionalProperties": true,
"properties": {
"id": {
"type": "string",
"description": "Run id."
},
"status": {
"type": "string",
"enum": [
"draft",
"created",
"processing",
"completed",
"partial_failed"
]
},
"mode": {
"type": [
"string",
"null"
],
"description": "draft or scheduled."
},
"source": {
"type": [
"string",
"null"
],
"description": "api, dashboard, or system source."
},
"totalPosts": {
"type": "integer",
"description": "Number of posts in the run."
},
"createdAt": {
"type": [
"string",
"null"
],
"description": "Creation time.",
"format": "date-time"
},
"updatedAt": {
"type": [
"string",
"null"
],
"description": "Last update time.",
"format": "date-time"
}
},
"required": [
"id",
"status"
]
}
RunResponse
Run creation or detail response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Run creation or detail response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"duplicate": {
"type": "boolean",
"description": "True when idempotency reused an existing run."
},
"mode": {
"type": [
"string",
"null"
],
"description": "draft or scheduled."
},
"sourceModel": {
"type": [
"string",
"null"
],
"description": "posts_v1 or campaigns_v2."
},
"run": {
"$ref": "#/components/schemas/Run"
},
"posts": {
"type": "array",
"description": "Posts in the run.",
"items": {
"$ref": "#/components/schemas/Post"
}
},
"summary": {
"type": [
"object",
"null"
],
"additionalProperties": true
}
},
"required": [
"ok"
]
}
RunStatusResponse
Run status response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Run status response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"run": {
"$ref": "#/components/schemas/Run"
},
"posts": {
"type": "array",
"description": "Posts in the run.",
"items": {
"$ref": "#/components/schemas/Post"
}
},
"summary": {
"type": [
"object",
"null"
],
"additionalProperties": true
}
},
"required": [
"ok",
"run",
"posts"
]
}
RunTableResponse
Run table response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Run table response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"run": {
"$ref": "#/components/schemas/Run"
},
"rows": {
"type": "array",
"description": "Rows sorted by publish time.",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"required": [
"ok",
"rows"
]
}
ScheduleEnvelope
Schedule document accepted by validation, preview, apply, and dashboard compose workflows.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Schedule document accepted by validation, preview, apply, and dashboard compose workflows.",
"additionalProperties": true,
"properties": {
"timezone": {
"type": "string",
"description": "IANA timezone. Defaults to UTC."
},
"mode": {
"type": "string",
"enum": [
"scheduled",
"draft"
],
"description": "scheduled creates runnable posts; draft creates an editable draft run."
},
"idempotencyKey": {
"type": [
"string",
"null"
],
"description": "Optional idempotency key. Also accepted as idempotency_key."
},
"posts": {
"type": "array",
"description": "Flat list of posts.",
"items": {
"$ref": "#/components/schemas/PostInput"
}
},
"campaigns": {
"type": "array",
"description": "Campaign graph model.",
"items": {
"$ref": "#/components/schemas/CampaignInput"
}
},
"schedule": {
"type": "object",
"description": "Optional wrapper. Routes accept either the envelope directly or { schedule: envelope }.",
"additionalProperties": true
}
}
}
SupportRequest
Support message submitted from the website or dashboard.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Support message submitted from the website or dashboard.",
"additionalProperties": true,
"properties": {
"email": {
"type": [
"string",
"null"
],
"description": "Reply-to email when no dashboard session exists."
},
"message": {
"type": "string",
"description": "Support message."
},
"pageUrl": {
"type": [
"string",
"null"
],
"description": "Page URL."
},
"pageTitle": {
"type": [
"string",
"null"
],
"description": "Page title."
},
"source": {
"type": [
"string",
"null"
],
"description": "site or dashboard."
}
},
"required": [
"message"
]
}
SupportResponse
Support request response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Support request response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"request": {
"type": "object",
"additionalProperties": true
},
"message": {
"type": "string",
"description": "Confirmation message."
}
},
"required": [
"ok",
"request",
"message"
]
}
Tenant
Workspace visible to the authenticated API key or dashboard session.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Workspace visible to the authenticated API key or dashboard session.",
"additionalProperties": true,
"properties": {
"id": {
"type": "string",
"description": "Workspace id."
},
"name": {
"type": [
"string",
"null"
],
"description": "Workspace name."
},
"plan": {
"type": [
"string",
"null"
],
"description": "Workspace plan."
},
"subscriptionStatus": {
"type": [
"string",
"null"
],
"description": "Billing subscription status."
},
"entitlements": {
"type": [
"object",
"null"
],
"description": "Plan capabilities and limits."
}
},
"required": [
"id"
]
}
UrlResponse
URL response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "URL response.",
"additionalProperties": false,
"properties": {
"ok": {
"const": true
},
"url": {
"type": "string",
"description": "Redirect URL.",
"format": "uri"
}
},
"required": [
"ok",
"url"
]
}
UsageResponse
Workspace usage response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Workspace usage response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"usage": {
"type": "object",
"additionalProperties": true
}
},
"required": [
"ok",
"usage"
]
}
ValidateResponse
Schedule validation response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Schedule validation response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"tenantId": {
"type": "string",
"description": "Workspace id."
},
"timezone": {
"type": "string",
"description": "Resolved timezone."
},
"mode": {
"type": "string",
"description": "Resolved mode."
},
"sourceModel": {
"type": "string",
"description": "posts_v1 or campaigns_v2."
},
"totalCampaigns": {
"type": "integer",
"description": "Campaign count."
},
"totalPosts": {
"type": "integer",
"description": "Post count."
},
"posts": {
"type": "array",
"description": "Prepared posts.",
"items": {
"$ref": "#/components/schemas/PostInput"
}
},
"campaign": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
},
"schedule": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"ok",
"tenantId",
"timezone",
"mode",
"totalPosts",
"posts"
]
}
WebhookResponse
Webhook acknowledgement.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Webhook acknowledgement.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
}
},
"required": [
"ok"
]
}
WorkspaceHealthResponse
Workspace health response.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"description": "Workspace health response.",
"additionalProperties": true,
"properties": {
"ok": {
"const": true
},
"health": {
"type": "object",
"additionalProperties": true
}
},
"required": [
"ok",
"health"
]
}