SocialClaw
Developer reference

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.

Coverage 80 endpoints Public API, dashboard API, webhooks, callbacks, and delivery URLs.
Contracts 62 schemas OpenAPI 3.1 with JSON Schema 2020-12 component schemas.
Start here

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.

Validate key
export SOCIALCLAW_API_KEY="sc_live_..."

curl -sS https://getsocialclaw.com/v1/keys/validate \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
Create a scheduled run
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"
    }
  ]
}'
API group

Status and Authentication

Health checks, API key validation, and workspace key management.

GET /health

Service health

No auth public 200

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
curl -sS https://getsocialclaw.com/health
JavaScript
const response = await fetch("https://getsocialclaw.com/health", {
  method: "GET",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "service": "socialclaw-api",
  "now": "2026-05-23T10:00:00.000Z",
  "publicBaseUrl": "https://getsocialclaw.com"
}
Request: none Response: HealthResponse
POST /v1/keys/validate

Validate API key

Bearer API key public 200

Checks the bearer token, returns the workspace, and updates last-used metadata.

curl
curl -sS https://getsocialclaw.com/v1/keys/validate \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{}'
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "tenant": {
    "id": "tenant_123",
    "name": "Acme Studio",
    "plan": "pro"
  },
  "apiKey": {
    "id": "key_123",
    "prefix": "sc_live_abcd",
    "label": "Production scheduler"
  }
}
Request: none Response: KeyValidationResponse
GET /v1/keys

List API keys

Bearer API key public 200

Lists API key metadata for the authenticated workspace. Secrets are not returned from the public key API.

curl
curl -sS https://getsocialclaw.com/v1/keys \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/keys", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "keys": [
    {
      "id": "key_123",
      "prefix": "sc_live_abcd",
      "label": "Production scheduler",
      "lastUsedAt": "2026-05-23T10:00:00.000Z"
    }
  ]
}
Request: none Response: KeysResponse
POST /v1/keys

Create API key

Bearer API key public 201

Creates an additional API key for the authenticated workspace.

curl
curl -sS https://getsocialclaw.com/v1/keys \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{
  "label": "Production scheduler"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/KeyCreateRequest"
}
Response example
{
  "ok": true,
  "key": {
    "id": "key_456",
    "prefix": "sc_live_wxyz",
    "label": "Agent key",
    "secret": "sc_live_wxyz..."
  }
}
Request: KeyCreateRequest Response: KeyCreateResponse
DELETE /v1/keys/{keyId}

Revoke API key

Bearer API key public 200

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
curl -sS https://getsocialclaw.com/v1/keys/key_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X DELETE
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "key": {
    "id": "key_456",
    "prefix": "sc_live_wxyz",
    "label": "Agent key",
    "secret": "sc_live_wxyz..."
  }
}
Request: none Response: KeyCreateResponse
GET /v1/me/usage

Workspace usage

Bearer API key public 200

Returns workspace usage counters and entitlement consumption.

curl
curl -sS https://getsocialclaw.com/v1/me/usage \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/me/usage", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "usage": {
    "postsThisPeriod": 42,
    "connectedAccounts": 6
  }
}
Request: none Response: UsageResponse
GET /v1/workspace/health

Workspace health

Bearer API key public 200

Returns tenant-specific account, scheduling, and workspace health.

curl
curl -sS https://getsocialclaw.com/v1/workspace/health \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/workspace/health", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "health": {
    "connectedAccounts": 6,
    "failingAccounts": 0
  }
}
Request: none Response: WorkspaceHealthResponse
GET /v1/jobs

List jobs

Bearer API key public 200

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
curl -sS https://getsocialclaw.com/v1/jobs \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/jobs", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "jobs": [],
  "total": 0
}
Request: none Response: JobsResponse
API group

Connections and Accounts

Start OAuth or manual connections, inspect connected accounts, capabilities, settings, and provider discovery actions.

POST /v1/connections/start

Start connection

Bearer API key public 201

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
curl -sS https://getsocialclaw.com/v1/connections/start \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{
  "provider": "linkedin"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/ConnectionStartRequest"
}
Response example
{
  "ok": true,
  "connection": {
    "id": "conn_123",
    "provider": "linkedin",
    "status": "pending",
    "authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
  }
}
Request: ConnectionStartRequest Response: ConnectionResponse
GET /v1/connections

List connections

Bearer API key public 200

Lists OAuth and manual connection handshakes for the workspace.

curl
curl -sS https://getsocialclaw.com/v1/connections \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/connections", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "connections": [
    {
      "id": "conn_123",
      "provider": "linkedin",
      "status": "connected"
    }
  ]
}
Request: none Response: ConnectionsResponse
GET /v1/connections/health

Connections health

Bearer API key public 200

Checks connected account health and provider readiness.

Query parameters

Name Required Description
provider No Optional provider filter.
curl
curl -sS https://getsocialclaw.com/v1/connections/health \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/connections/health", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "health": {
    "connectedAccounts": 6,
    "failingAccounts": 0
  }
}
Request: none Response: WorkspaceHealthResponse
GET /v1/connections/{connectionId}

Connection status

Bearer API key public 200

Returns the status of one connection handshake.

Path parameters

Name Required Description
connectionId Yes Connection id.
curl
curl -sS https://getsocialclaw.com/v1/connections/conn_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/connections/conn_123", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "connection": {
    "id": "conn_123",
    "provider": "linkedin",
    "status": "pending",
    "authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
  }
}
Request: none Response: ConnectionResponse
GET /v1/accounts

List connected accounts

Bearer API key public 200

Lists connected social accounts and destinations in the workspace.

Query parameters

Name Required Description
provider No Optional provider filter.
curl
curl -sS https://getsocialclaw.com/v1/accounts \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/accounts", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "accounts": [
    {
      "id": "acct_123",
      "provider": "linkedin",
      "handle": "linkedin:person:123",
      "displayName": "Acme Founder"
    }
  ]
}
Request: none Response: AccountsResponse
GET /v1/accounts/capabilities

List account capabilities

Bearer API key public 200

Lists publishing capabilities across connected accounts.

Query parameters

Name Required Description
provider No Optional provider filter.
curl
curl -sS https://getsocialclaw.com/v1/accounts/capabilities \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/accounts/capabilities", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "capabilities": [
    {
      "provider": "linkedin",
      "accountId": "acct_123",
      "canPublish": true
    }
  ]
}
Request: none Response: CapabilitiesResponse
GET /v1/accounts/{accountId}/capabilities

Get account capabilities

Bearer API key public 200

Returns publishing capabilities for one connected account.

Path parameters

Name Required Description
accountId Yes Connected account id.
curl
curl -sS https://getsocialclaw.com/v1/accounts/acct_123/capabilities \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "capabilities": [
    {
      "provider": "linkedin",
      "accountId": "acct_123",
      "canPublish": true
    }
  ]
}
Request: none Response: CapabilitiesResponse
GET /v1/accounts/{accountId}/settings

Get publish settings

Bearer API key public 200

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
curl -sS https://getsocialclaw.com/v1/accounts/acct_123/settings \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "publishSettings": {
    "supported": true,
    "fields": [
      {
        "id": "visibility",
        "type": "enum",
        "options": [
          "PUBLIC",
          "CONNECTIONS"
        ]
      }
    ]
  }
}
Request: none Response: PublishSettingsResponse
GET /v1/accounts/{accountId}/actions

List discovery actions

Bearer API key public 200

Lists provider discovery actions available for one connected account.

Path parameters

Name Required Description
accountId Yes Connected account id.
curl
curl -sS https://getsocialclaw.com/v1/accounts/acct_123/actions \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "actions": [
    {
      "id": "sync_boards",
      "label": "Sync boards"
    }
  ]
}
Request: none Response: DiscoveryActionsResponse
POST /v1/accounts/{accountId}/actions/{actionId}

Run discovery action

Bearer API key public 200

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
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 '{}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true,
  "result": {
    "synced": true
  }
}
Request: OkResponse Response: ActionResultResponse
DELETE /v1/accounts/{accountId}

Disconnect account

Bearer API key public 200

Disconnects a social account from the workspace.

Path parameters

Name Required Description
accountId Yes Connected account id.
curl
curl -sS https://getsocialclaw.com/v1/accounts/acct_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X DELETE
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "connection": {
    "id": "conn_123",
    "provider": "linkedin",
    "status": "pending",
    "authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
  }
}
Request: none Response: ConnectionResponse
GET /oauth/{provider}/callback

OAuth provider callback

OAuth callback callback 200

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
curl -sS https://getsocialclaw.com/oauth/linkedin/callback
JavaScript
const response = await fetch("https://getsocialclaw.com/oauth/linkedin/callback", {
  method: "GET",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true
}
Request: none Response: redirect
API group

Publishing Runs and Posts

Validate schedule payloads, preview campaign graphs, create runs, publish drafts, and manage post lifecycle.

GET /v1/posts

List posts

Bearer API key public 200

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
curl -sS https://getsocialclaw.com/v1/posts \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/posts", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "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"
    }
  ]
}
Request: none Response: PostsResponse
GET /v1/posts/{postId}

Get post detail

Bearer API key public 200

Returns one post with provider, attempt, and preview details.

Path parameters

Name Required Description
postId Yes Post id.
curl
curl -sS https://getsocialclaw.com/v1/posts/post_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/posts/post_123", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "post": {
    "id": "post_123",
    "provider": "linkedin",
    "account": "linkedin:person:123",
    "status": "scheduled"
  }
}
Request: none Response: PostResponse
GET /v1/posts/{postId}/attempts

List post attempts

Bearer API key public 200

Returns publish attempts for one post.

Path parameters

Name Required Description
postId Yes Post id.
curl
curl -sS https://getsocialclaw.com/v1/posts/post_123/attempts \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "attempts": []
}
Request: none Response: AttemptsResponse
POST /v1/posts/{postId}/reconcile

Reconcile post

Bearer API key public 200

Asks SocialClaw to refresh provider-side post status and metadata.

Path parameters

Name Required Description
postId Yes Post id.
curl
curl -sS https://getsocialclaw.com/v1/posts/post_123/reconcile \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "post": {
    "id": "post_123",
    "provider": "linkedin",
    "account": "linkedin:person:123",
    "status": "scheduled"
  }
}
Request: none Response: PostResponse
POST /v1/posts/validate

Validate schedule

Bearer API key public 200

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
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"
        }
      ]
    }
  ]
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/ScheduleEnvelope"
}
Response example
{
  "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"
    }
  ]
}
Request: ScheduleEnvelope Response: ValidateResponse
POST /v1/campaigns/preview

Preview campaign

Bearer API key public 200

Builds a campaign graph from campaigns[] and preflights connected accounts.

  • Requires a campaigns[] schedule. Flat posts[] schedules return a conflict.
curl
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."
            }
          ]
        }
      ]
    }
  ]
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/ScheduleEnvelope"
}
Response example
{
  "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"
    }
  ]
}
Request: ScheduleEnvelope Response: ValidateResponse
POST /v1/posts/apply

Create run

Bearer API key public 201

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
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"
        }
      ]
    }
  ]
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/ScheduleEnvelope"
}
Response example
{
  "ok": true,
  "duplicate": false,
  "run": {
    "id": "run_123",
    "status": "created",
    "totalPosts": 1
  },
  "posts": [
    {
      "id": "post_123",
      "status": "scheduled"
    }
  ]
}
Request: ScheduleEnvelope Response: RunResponse
GET /v1/runs/{runId}/status

Run status

Bearer API key public 200

Returns run status, posts, and summary.

Path parameters

Name Required Description
runId Yes Run id.
curl
curl -sS https://getsocialclaw.com/v1/runs/run_123/status \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "run": {
    "id": "run_123",
    "status": "created"
  },
  "posts": [
    {
      "id": "post_123",
      "status": "scheduled"
    }
  ],
  "summary": {
    "scheduled": 1
  }
}
Request: none Response: RunStatusResponse
GET /v1/runs/{runId}/campaign

Run campaign graph

Bearer API key public 200

Returns the campaign graph associated with a run.

Path parameters

Name Required Description
runId Yes Run id.
curl
curl -sS https://getsocialclaw.com/v1/runs/run_123/campaign \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "duplicate": false,
  "run": {
    "id": "run_123",
    "status": "created",
    "totalPosts": 1
  },
  "posts": [
    {
      "id": "post_123",
      "status": "scheduled"
    }
  ]
}
Request: none Response: RunResponse
GET /v1/runs/{runId}

Run detail

Bearer API key public 200

Returns run, posts, attempts, and provider details.

Path parameters

Name Required Description
runId Yes Run id.
curl
curl -sS https://getsocialclaw.com/v1/runs/run_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/runs/run_123", {
  method: "GET",
  headers: {
    "Authorization": "Bearer ${SOCIALCLAW_API_KEY}"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "duplicate": false,
  "run": {
    "id": "run_123",
    "status": "created",
    "totalPosts": 1
  },
  "posts": [
    {
      "id": "post_123",
      "status": "scheduled"
    }
  ]
}
Request: none Response: RunResponse
POST /v1/runs/{runId}/publish

Publish draft run

Bearer API key public 200

Turns a draft run into scheduled posts, optionally shifting the start time.

Path parameters

Name Required Description
runId Yes Run id.
curl
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"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true,
  "duplicate": false,
  "run": {
    "id": "run_123",
    "status": "created",
    "totalPosts": 1
  },
  "posts": [
    {
      "id": "post_123",
      "status": "scheduled"
    }
  ]
}
Request: OkResponse Response: RunResponse
GET /v1/runs/{runId}/table

Run table

Bearer API key public 200

Returns a compact table projection for a run.

Path parameters

Name Required Description
runId Yes Run id.
curl
curl -sS https://getsocialclaw.com/v1/runs/run_123/table \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "rows": [
    {
      "time": "2026-06-01T18:00:00.000Z",
      "account": "linkedin:person:123",
      "status": "scheduled",
      "postId": "post_123"
    }
  ]
}
Request: none Response: RunTableResponse
POST /v1/posts/{postId}/retry

Retry post

Bearer API key public 200

Queues a failed post for another publishing attempt.

Path parameters

Name Required Description
postId Yes Post id.
curl
curl -sS https://getsocialclaw.com/v1/posts/post_123/retry \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "post": {
    "id": "post_123",
    "provider": "linkedin",
    "account": "linkedin:person:123",
    "status": "scheduled"
  }
}
Request: none Response: PostResponse
POST /v1/posts/{postId}/delete

Delete provider post

Bearer API key public 200

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
curl -sS https://getsocialclaw.com/v1/posts/post_123/delete \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "post": {
    "id": "post_123",
    "provider": "linkedin",
    "account": "linkedin:person:123",
    "status": "scheduled"
  }
}
Request: none Response: PostResponse
DELETE /v1/posts/{postId}

Cancel post

Bearer API key public 200

Cancels a draft or scheduled SocialClaw post before publish.

Path parameters

Name Required Description
postId Yes Post id.
curl
curl -sS https://getsocialclaw.com/v1/posts/post_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -X DELETE
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "post": {
    "id": "post_123",
    "provider": "linkedin",
    "account": "linkedin:person:123",
    "status": "scheduled"
  }
}
Request: none Response: PostResponse
API group

Assets and Media Delivery

Upload, register, delete, and deliver SocialClaw-managed media.

POST /v1/assets/upload

Upload asset

Bearer API key public 201

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
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..."
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/AssetUploadRequest"
}
Response example
{
  "ok": true,
  "asset": {
    "id": "asset_123",
    "mime": "image/png",
    "kind": "image",
    "publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
  }
}
Request: AssetUploadRequest Response: AssetResponse
POST /v1/assets

Register asset

Bearer API key public 201

Registers an existing object or externally managed asset in the workspace.

curl
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"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/AssetRegistrationRequest"
}
Response example
{
  "ok": true,
  "asset": {
    "id": "asset_123",
    "mime": "image/png",
    "kind": "image",
    "publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
  }
}
Request: AssetRegistrationRequest Response: AssetResponse
DELETE /v1/assets/{assetId}

Delete asset

Bearer API key public 200

Marks an asset for deletion after the retention window.

Path parameters

Name Required Description
assetId Yes Asset id.
curl
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
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true,
  "asset": {
    "id": "asset_123",
    "mime": "image/png",
    "kind": "image",
    "publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
  }
}
Request: OkResponse Response: AssetResponse
GET /media/{assetId}/{deliveryToken}/{filename}

Fetch media asset

Delivery token media 200

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
curl -sS https://getsocialclaw.com/media/asset_123/dlv_123/launch.png
JavaScript
const response = await fetch("https://getsocialclaw.com/media/asset_123/dlv_123/launch.png", {
  method: "GET",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
application/octet-stream stream
Request: none Response: application/octet-stream
GET /media/{assetId}/{deliveryToken}/previews/{filename}

Fetch media preview

Delivery token media 200

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
curl -sS https://getsocialclaw.com/media/asset_123/dlv_123/previews/launch.png
JavaScript
const response = await fetch("https://getsocialclaw.com/media/asset_123/dlv_123/previews/launch.png", {
  method: "GET",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
application/octet-stream stream
Request: none Response: application/octet-stream
API group

Analytics

Read and refresh post, account, and run analytics.

GET /v1/analytics/posts/{postId}

Post analytics

Bearer API key public 200

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
curl -sS https://getsocialclaw.com/v1/analytics/posts/post_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "window": "lifetime",
  "metrics": {
    "impressions": 1200,
    "clicks": 43
  }
}
Request: none Response: AnalyticsResponse
GET /v1/analytics/accounts/{accountId}

Account analytics

Bearer API key public 200

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
curl -sS https://getsocialclaw.com/v1/analytics/accounts/acct_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "window": "lifetime",
  "metrics": {
    "impressions": 1200,
    "clicks": 43
  }
}
Request: none Response: AnalyticsResponse
GET /v1/analytics/runs/{runId}

Run analytics

Bearer API key public 200

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
curl -sS https://getsocialclaw.com/v1/analytics/runs/run_123 \
  -H "Authorization: Bearer $SOCIALCLAW_API_KEY"
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "window": "lifetime",
  "metrics": {
    "impressions": 1200,
    "clicks": 43
  }
}
Request: none Response: AnalyticsResponse
POST /v1/analytics/refresh

Refresh post analytics

Bearer API key public 200

Fetches fresh provider analytics for a post.

curl
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"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/AnalyticsRefreshRequest"
}
Response example
{
  "ok": true,
  "window": "lifetime",
  "metrics": {
    "impressions": 1200,
    "clicks": 43
  }
}
Request: AnalyticsRefreshRequest Response: AnalyticsResponse
API group

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.

GET /v1/dashboard/session

Dashboard session

Dashboard session dashboard 200

Returns the current signed-in dashboard user, workspace, and membership.

curl
curl -sS https://getsocialclaw.com/v1/dashboard/session
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/dashboard/session", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "authenticated": true,
  "user": {
    "id": "user_123",
    "email": "operator@example.com"
  },
  "tenant": {
    "id": "tenant_123",
    "name": "Acme Studio"
  }
}
Request: none Response: DashboardSessionResponse
POST /v1/support/request

Create support request

No auth site 201

Submits a support request from the site or dashboard.

curl
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"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/SupportRequest"
}
Response example
{
  "ok": true,
  "request": {
    "id": "support_123"
  },
  "message": "Message received. We will reply by email as soon as possible."
}
Request: SupportRequest Response: SupportResponse
GET /v1/billing/state

Billing state

Dashboard session dashboard 200

Returns workspace billing state for the dashboard.

curl
curl -sS https://getsocialclaw.com/v1/billing/state
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/billing/state", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "billing": {
    "plan": "pro",
    "status": "active"
  }
}
Request: none Response: BillingStateResponse
POST /v1/billing/checkout

Create checkout

Dashboard session dashboard 200

Creates a billing checkout session for a dashboard billing admin.

curl
curl -sS https://getsocialclaw.com/v1/billing/checkout \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{
  "plan": "pro",
  "billingInterval": "monthly"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/BillingCheckoutRequest"
}
Response example
{
  "ok": true,
  "url": "https://billing.example.com/session/abc"
}
Request: BillingCheckoutRequest Response: UrlResponse
POST /v1/billing/manage

Create billing portal

Dashboard session dashboard 200

Creates a customer billing management URL for a dashboard billing admin.

curl
curl -sS https://getsocialclaw.com/v1/billing/manage \
  -H "Content-Type: application/json" \
  -X POST
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/billing/manage", {
  method: "POST",
  credentials: "include",
  headers: {
    "Content-Type": "application/json"
  },
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "url": "https://billing.example.com/session/abc"
}
Request: none Response: UrlResponse
GET /v1/billing/app-store/account-token

App Store account token

Dashboard session dashboard 200

Returns or creates an App Store account token for the dashboard workspace.

curl
curl -sS https://getsocialclaw.com/v1/billing/app-store/account-token
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/billing/app-store/account-token", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true
}
Request: none Response: OkResponse
GET /v1/billing/app-store/products

App Store products

Dashboard session dashboard 200

Lists App Store product mappings.

curl
curl -sS https://getsocialclaw.com/v1/billing/app-store/products
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/billing/app-store/products", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "provider": "app-store",
  "enabled": true,
  "products": []
}
Request: none Response: ProductsResponse
POST /v1/billing/app-store/transactions/claim

Claim App Store transaction

Dashboard session dashboard 200

Claims a signed App Store transaction for the dashboard workspace.

curl
curl -sS https://getsocialclaw.com/v1/billing/app-store/transactions/claim \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{
  "signedTransactionInfo": "eyJhbGciOiJFUzI1NiJ9..."
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/AppStoreClaimRequest"
}
Response example
{
  "ok": true,
  "billing": {
    "plan": "pro",
    "status": "active"
  }
}
Request: AppStoreClaimRequest Response: BillingStateResponse
GET /v1/dashboard/accounts

Dashboard accounts

Dashboard session dashboard 200

Lists connected accounts for the dashboard.

Query parameters

Name Required Description
provider No Optional provider filter.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/accounts
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/dashboard/accounts", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "accounts": [
    {
      "id": "acct_123",
      "provider": "linkedin",
      "handle": "linkedin:person:123",
      "displayName": "Acme Founder"
    }
  ]
}
Request: none Response: AccountsResponse
DELETE /v1/dashboard/accounts/{accountId}

Dashboard disconnect account

Dashboard session dashboard 200

Disconnects an account from the dashboard.

Path parameters

Name Required Description
accountId Yes Connected account id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/accounts/acct_123 \
  -H "Content-Type: application/json" \
  -X DELETE
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "connection": {
    "id": "conn_123",
    "provider": "linkedin",
    "status": "pending",
    "authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
  }
}
Request: none Response: ConnectionResponse
GET /v1/dashboard/accounts/{accountId}/publish-settings

Dashboard publish settings

Dashboard session dashboard 200

Returns provider-specific settings for dashboard compose.

Path parameters

Name Required Description
accountId Yes Connected account id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/accounts/acct_123/publish-settings
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/dashboard/accounts/acct_123/publish-settings", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "publishSettings": {
    "supported": true,
    "fields": [
      {
        "id": "visibility",
        "type": "enum",
        "options": [
          "PUBLIC",
          "CONNECTIONS"
        ]
      }
    ]
  }
}
Request: none Response: PublishSettingsResponse
POST /v1/dashboard/connections/start

Dashboard start connection

Dashboard session dashboard 201

Starts an OAuth or manual connection from the dashboard.

curl
curl -sS https://getsocialclaw.com/v1/dashboard/connections/start \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{
  "provider": "instagram_business"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/ConnectionStartRequest"
}
Response example
{
  "ok": true,
  "connection": {
    "id": "conn_123",
    "provider": "linkedin",
    "status": "pending",
    "authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
  }
}
Request: ConnectionStartRequest Response: ConnectionResponse
GET /v1/dashboard/connections/{connectionId}

Dashboard connection status

Dashboard session dashboard 200

Returns dashboard connection status.

Path parameters

Name Required Description
connectionId Yes Connection id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/connections/conn_123
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/dashboard/connections/conn_123", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "connection": {
    "id": "conn_123",
    "provider": "linkedin",
    "status": "pending",
    "authorizeUrl": "https://www.linkedin.com/oauth/v2/authorization?..."
  }
}
Request: none Response: ConnectionResponse
GET /v1/dashboard/posts

Dashboard posts

Dashboard session dashboard 200

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
curl -sS https://getsocialclaw.com/v1/dashboard/posts
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/dashboard/posts", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "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"
    }
  ]
}
Request: none Response: PostsResponse
POST /v1/dashboard/posts/{postId}/reconcile

Dashboard reconcile post

Dashboard session dashboard 200

Refreshes provider-side status for a dashboard post.

Path parameters

Name Required Description
postId Yes Post id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/posts/post_123/reconcile \
  -H "Content-Type: application/json" \
  -X POST
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "post": {
    "id": "post_123",
    "provider": "linkedin",
    "account": "linkedin:person:123",
    "status": "scheduled"
  }
}
Request: none Response: PostResponse
PATCH /v1/dashboard/posts/{postId}

Dashboard update post

Dashboard session dashboard 200

Updates an editable dashboard timeline post.

Path parameters

Name Required Description
postId Yes Post id.
curl
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"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/DashboardPostUpdateRequest"
}
Response example
{
  "ok": true,
  "post": {
    "id": "post_123",
    "provider": "linkedin",
    "account": "linkedin:person:123",
    "status": "scheduled"
  }
}
Request: DashboardPostUpdateRequest Response: PostResponse
DELETE /v1/dashboard/posts/{postId}

Dashboard delete post

Dashboard session dashboard 200

Deletes an editable timeline post from the dashboard.

Path parameters

Name Required Description
postId Yes Post id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/posts/post_123 \
  -H "Content-Type: application/json" \
  -X DELETE
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "post": {
    "id": "post_123",
    "provider": "linkedin",
    "account": "linkedin:person:123",
    "status": "scheduled"
  }
}
Request: none Response: PostResponse
GET /v1/dashboard/assets

Dashboard assets

Dashboard session dashboard 200

Lists ready assets for the dashboard media picker.

Query parameters

Name Required Description
limit No Maximum assets to return.
offset No Pagination offset.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/assets
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/dashboard/assets", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "total": 1,
  "limit": 24,
  "offset": 0,
  "assets": [
    {
      "id": "asset_123",
      "mime": "image/png",
      "kind": "image"
    }
  ]
}
Request: none Response: AssetsResponse
DELETE /v1/dashboard/assets/{assetId}

Dashboard delete asset

Dashboard session dashboard 200

Marks a dashboard asset for deletion.

Path parameters

Name Required Description
assetId Yes Asset id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/assets/asset_123 \
  -H "Content-Type: application/json" \
  -X DELETE \
  --data '{
  "retentionDays": 7
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true,
  "asset": {
    "id": "asset_123",
    "mime": "image/png",
    "kind": "image",
    "publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
  }
}
Request: OkResponse Response: AssetResponse
POST /v1/dashboard/assets/upload

Dashboard base64 asset upload

Dashboard session dashboard 201

Uploads a small dashboard asset as base64.

curl
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..."
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/AssetUploadRequest"
}
Response example
{
  "ok": true,
  "asset": {
    "id": "asset_123",
    "mime": "image/png",
    "kind": "image",
    "publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
  }
}
Request: AssetUploadRequest Response: AssetResponse
POST /v1/dashboard/assets/upload/initiate

Dashboard multipart initiate

Dashboard session dashboard 201

Starts a multipart asset upload when S3 storage is available.

curl
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"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/MultipartUploadInitiateRequest"
}
Response example
{
  "ok": true,
  "mode": "multipart",
  "asset": {
    "id": "asset_123",
    "status": "uploading"
  },
  "upload": {
    "uploadId": "upload_123",
    "partSize": 8388608,
    "totalParts": 7
  }
}
Request: MultipartUploadInitiateRequest Response: MultipartInitiateResponse
POST /v1/dashboard/assets/upload/{assetId}/part

Dashboard multipart sign part

Dashboard session dashboard 200

Signs one multipart upload part for direct browser upload.

Path parameters

Name Required Description
assetId Yes Uploading asset id.
curl
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
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/MultipartPartRequest"
}
Response example
{
  "ok": true,
  "assetId": "asset_123",
  "uploadId": "upload_123",
  "partNumber": 1,
  "url": "https://s3.amazonaws.com/...",
  "expiresIn": 900
}
Request: MultipartPartRequest Response: MultipartPartResponse
POST /v1/dashboard/assets/upload/{assetId}/complete

Dashboard multipart complete

Dashboard session dashboard 200

Completes a multipart dashboard upload and marks the asset ready.

Path parameters

Name Required Description
assetId Yes Uploading asset id.
curl
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
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/MultipartCompleteRequest"
}
Response example
{
  "ok": true,
  "asset": {
    "id": "asset_123",
    "mime": "image/png",
    "kind": "image",
    "publicUrl": "https://getsocialclaw.com/media/asset_123/dlv_123/launch.png"
  }
}
Request: MultipartCompleteRequest Response: AssetResponse
POST /v1/dashboard/assets/upload/{assetId}/abort

Dashboard multipart abort

Dashboard session dashboard 200

Aborts a multipart dashboard upload.

Path parameters

Name Required Description
assetId Yes Uploading asset id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/assets/upload/asset_123/abort \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{
  "uploadId": "upload_123"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true
}
Request: OkResponse Response: OkResponse
POST /v1/dashboard/compose

Dashboard compose

Dashboard session dashboard 201

Creates a scheduled run from dashboard compose state and can publish immediately.

curl
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"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/DashboardComposeRequest"
}
Response example
{
  "ok": true,
  "duplicate": false,
  "run": {
    "id": "run_123",
    "status": "created",
    "totalPosts": 1
  },
  "posts": [
    {
      "id": "post_123",
      "status": "scheduled"
    }
  ]
}
Request: DashboardComposeRequest Response: RunResponse
GET /v1/dashboard/keys

Dashboard list keys

Dashboard session dashboard 200

Lists dashboard API keys, including secrets for dashboard display.

curl
curl -sS https://getsocialclaw.com/v1/dashboard/keys
JavaScript
const response = await fetch("https://getsocialclaw.com/v1/dashboard/keys", {
  method: "GET",
  credentials: "include",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "keys": [
    {
      "id": "key_123",
      "prefix": "sc_live_abcd",
      "label": "Production scheduler",
      "lastUsedAt": "2026-05-23T10:00:00.000Z"
    }
  ]
}
Request: none Response: KeysResponse
POST /v1/dashboard/keys

Dashboard create key

Dashboard session dashboard 201

Creates a workspace API key from the dashboard.

curl
curl -sS https://getsocialclaw.com/v1/dashboard/keys \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{
  "label": "Agent key",
  "kind": "personal"
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/KeyCreateRequest"
}
Response example
{
  "ok": true,
  "key": {
    "id": "key_456",
    "prefix": "sc_live_wxyz",
    "label": "Agent key",
    "secret": "sc_live_wxyz..."
  }
}
Request: KeyCreateRequest Response: KeyCreateResponse
DELETE /v1/dashboard/keys/{keyId}

Dashboard revoke key

Dashboard session dashboard 200

Revokes a workspace API key from the dashboard.

Path parameters

Name Required Description
keyId Yes API key id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/keys/key_123 \
  -H "Content-Type: application/json" \
  -X DELETE
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "key": {
    "id": "key_456",
    "prefix": "sc_live_wxyz",
    "label": "Agent key",
    "secret": "sc_live_wxyz..."
  }
}
Request: none Response: KeyCreateResponse
POST /v1/dashboard/keys/{keyId}/rotate

Dashboard rotate key

Dashboard session dashboard 200

Rotates a workspace API key and returns the new secret.

Path parameters

Name Required Description
keyId Yes API key id.
curl
curl -sS https://getsocialclaw.com/v1/dashboard/keys/key_123/rotate \
  -H "Content-Type: application/json" \
  -X POST
JavaScript
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();
Request schema
No JSON body.
Response example
{
  "ok": true,
  "key": {
    "id": "key_456",
    "prefix": "sc_live_wxyz",
    "label": "Agent key",
    "secret": "sc_live_wxyz..."
  }
}
Request: none Response: KeyCreateResponse
API group

Auth, Billing, and Provider Callbacks

Routes called by identity providers, billing systems, app stores, and Meta webhooks.

GET /auth/mobile/google/start

Mobile Google auth start

OAuth callback auth 200

Starts native/mobile dashboard authentication with Google.

Query parameters

Name Required Description
callbackScheme No Optional mobile callback scheme.
curl
curl -sS https://getsocialclaw.com/auth/mobile/google/start
JavaScript
const response = await fetch("https://getsocialclaw.com/auth/mobile/google/start", {
  method: "GET",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true
}
Request: none Response: redirect
GET /auth/mobile/apple/start

Mobile Apple auth start

OAuth callback auth 200

Starts native/mobile dashboard authentication with Apple.

Query parameters

Name Required Description
callbackScheme No Optional mobile callback scheme.
curl
curl -sS https://getsocialclaw.com/auth/mobile/apple/start
JavaScript
const response = await fetch("https://getsocialclaw.com/auth/mobile/apple/start", {
  method: "GET",
  headers: {},
});

const data = await response.json();
Request schema
No JSON body.
Response example
{
  "ok": true
}
Request: none Response: redirect
POST /auth/mobile/apple/native

Native Apple token exchange

OAuth callback auth 200

Exchanges a native Apple identity token for a SocialClaw dashboard session payload.

curl
curl -sS https://getsocialclaw.com/auth/mobile/apple/native \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{
  "identityToken": "eyJraWQiOiJhcHBsZSJ9..."
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/AppleNativeAuthRequest"
}
Response example
{
  "ok": true,
  "authenticated": true,
  "user": {
    "id": "user_123",
    "email": "operator@example.com"
  },
  "tenant": {
    "id": "tenant_123",
    "name": "Acme Studio"
  }
}
Request: AppleNativeAuthRequest Response: DashboardSessionResponse
POST /v1/billing/webhook

Billing webhook

Provider webhook webhook 200

Processes Lemon Squeezy billing events.

  • Requests must include the expected billing signature header.
curl
curl -sS https://getsocialclaw.com/v1/billing/webhook \
  -H "x-signature: $SOCIALCLAW_WEBHOOK_SIGNATURE" \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true
}
Request: OkResponse Response: WebhookResponse
POST /v1/billing/app-store/notifications

App Store server notification

Provider webhook webhook 200

Processes signed App Store server notifications.

curl
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..."
}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true
}
Request: OkResponse Response: WebhookResponse
POST /webhooks/meta/deauthorize

Meta deauthorize webhook

Provider webhook webhook 200

Receives Meta deauthorization callbacks.

curl
curl -sS https://getsocialclaw.com/webhooks/meta/deauthorize \
  -H "x-signature: $SOCIALCLAW_WEBHOOK_SIGNATURE" \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true
}
Request: OkResponse Response: WebhookResponse
POST /webhooks/meta/data-deletion

Meta data deletion webhook

Provider webhook webhook 200

Receives Meta data deletion requests and returns a deletion status URL/code.

curl
curl -sS https://getsocialclaw.com/webhooks/meta/data-deletion \
  -H "x-signature: $SOCIALCLAW_WEBHOOK_SIGNATURE" \
  -H "Content-Type: application/json" \
  -X POST \
  --data '{}'
JavaScript
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();
Request schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/components/schemas/OkResponse"
}
Response example
{
  "ok": true
}
Request: OkResponse Response: WebhookResponse
Contracts

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"
  ]
}