API reference · v1.3.0

API reference

Every endpoint of the Publishing Studio API, generated from its OpenAPI spec.

API access follows the issuing member's current organization and ecosystem permissions, narrowed to the key's account groups when it has them. Social access tokens never leave Publishing Studio. Every response carries X-Request-Id; API-key responses also carry X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and X-RateLimit-Bucket (read or write). GET requests spend a separate read budget (default 1800/min) from writes (default 600/min).

Base URL
https://dashboard.lifebliss.app/api/v1
Auth
Authorization: Bearer ps_… · scopes
Endpoints
33 · Download openapi.json

Accounts

Who you are, and the accounts and groups your key may publish to.

GET /identity
curl "https://dashboard.lifebliss.app/api/v1/identity" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

List permitted accounts

GET/accounts
Scope accounts:read

Parameters

  • groupIdquery · string, uuid
GET /accounts
curl "https://dashboard.lifebliss.app/api/v1/accounts" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

List permitted account groups

GET/account-groups
Scope accounts:read
GET /account-groups
curl "https://dashboard.lifebliss.app/api/v1/account-groups" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

List Pinterest boards

GET/org/accounts/{id}/boards
Scope accounts:read

Parameters

  • idpath · string, uuidrequired
GET /org/accounts/{id}/boards
curl "https://dashboard.lifebliss.app/api/v1/org/accounts/ID/boards" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

Posts

Create, publish, schedule, read, cancel and retry posts. Read the guide →

List latest 50 accessible posts, or the status of up to 100 posts by ID

GET/posts
Scope posts:read

Without ids: the latest 50 posts with progress counts. With ids (1–100 comma-separated UUIDs): each post's status, progress and every target's status, platformPostUrl and error, in request order; IDs the key cannot see are returned in notFound.

Parameters

  • idsquery · string

    Comma-separated post IDs (max 100) for batch status.

GET /posts
curl "https://dashboard.lifebliss.app/api/v1/posts" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

Create, publish or schedule a post

POST/posts
Scope posts:write

Parameters

  • Idempotency-Keyheader · stringrequired
  • Preferheader · "respond-async"

Body CreatePost

At least one target or group is required. Scheduling and queue allocation are mutually exclusive.

  • contentstring
  • mediaItemsarray of MediaItem
  • targetsarray of object
  • groupIdsarray of string, uuid
  • publishNowboolean

    default false

  • scheduledForstring, date-time
  • timezonestring

    default "UTC"

  • useQueueboolean
  • queueIdstring, uuid
POST /posts
curl -X POST "https://dashboard.lifebliss.app/api/v1/posts" \
  -H "Authorization: Bearer $PS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "The full session is live.",
    "mediaItems": [
      {
        "type": "video",
        "url": "https://cdn.example.org/talk.mp4"
      }
    ],
    "targets": [
      {
        "accountId": "FACEBOOK_ACCOUNT_ID"
      },
      {
        "accountId": "YOUTUBE_ACCOUNT_ID",
        "customContent": "Full session ↓"
      }
    ],
    "scheduledFor": "2026-11-01T18:30:00Z",
    "timezone": "Asia/Kolkata"
  }'

Responses

  • 200Synchronous publishing completed
  • 201Draft or scheduled post created
  • 202Queued for publishing
  • 207Partial synchronous result
  • 400Invalid request
  • 401Unauthorized
  • 403Forbidden
  • 409Duplicate content or request in flight
  • 422Validation error or idempotency key reused
  • 429Rate limited

Read post and paginated target results

GET/posts/{id}
Scope posts:read

Parameters

  • idpath · string, uuidrequired
  • pagequery · integer
  • statusquery · "pending" | "publishing" | "published" | "failed"
GET /posts/{id}
curl "https://dashboard.lifebliss.app/api/v1/posts/ID" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

Cancel an unpublished draft or scheduled post

DEL/posts/{id}
Scope posts:write

Parameters

  • idpath · string, uuidrequired
DELETE /posts/{id}
curl -X DELETE "https://dashboard.lifebliss.app/api/v1/posts/ID" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

Enqueue failed targets only

POST/posts/{id}/retry
Scope posts:write

Parameters

  • idpath · string, uuidrequired
POST /posts/{id}/retry
curl -X POST "https://dashboard.lifebliss.app/api/v1/posts/ID/retry" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 202Failed targets enqueued
  • 404Post unavailable or retry failed

Media

Signed upload URLs for images and video. Read the guide →

Request a signed media upload URL

POST/media/presign
Scope media:write

Body

  • filenamestringrequired
  • contentTypestringrequired
  • sizeintegerrequired

    min 1

POST /media/presign
curl -X POST "https://dashboard.lifebliss.app/api/v1/media/presign" \
  -H "Authorization: Bearer $PS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "talk.mp4",
    "contentType": "video/mp4",
    "size": 48213004
  }'

Responses

  • 200Success
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

Validation

Network limits, and checking a post against them. No key needed. Read the guide →

Read platform capabilities

GET/validate
No API key needed
GET /validate
curl "https://dashboard.lifebliss.app/api/v1/validate"

Responses

  • 200Capabilities

Validate content without publishing

POST/validate
No API key needed

Body

  • contentstring
  • platformsarray of stringrequired
  • mediaItemsarray of MediaItem
POST /validate
curl -X POST "https://dashboard.lifebliss.app/api/v1/validate" \
  -H "Content-Type: application/json" \
  -d '{
    "platforms": [
      "platform"
    ],
    "content": "The full session is live.",
    "mediaItems": [
      {
        "type": "image",
        "url": "https://cdn.example.org/talk.mp4"
      }
    ]
  }'

Responses

  • 200Validation result

Connect

Headless OAuth: let your users connect accounts from your product. Read the guide →

Start a white-label OAuth connection

POST/connect/{platform}/headless
Scope accounts:connect

After consent the user lands on redirectUrl with connect_token. Only this API key can use that token.

Parameters

  • platformpath · stringrequired

    An OAuth platform, e.g. facebook, instagram, youtube, linkedin, tiktok, mastodon.

Body HeadlessConnectStart

  • redirectUrlstring, urirequired

    https:// (http only for localhost). Receives connect_token, platform and step, or error.

  • ecosystemIdstring, uuid
  • profileIdstring, uuid
  • instancestring

    Mastodon-family platforms: the user's server.

POST /connect/{platform}/headless
curl -X POST "https://dashboard.lifebliss.app/api/v1/connect/PLATFORM/headless" \
  -H "Authorization: Bearer $PS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "redirectUrl": "https://app.example.org/connected",
    "ecosystemId": "ECOSYSTEM_ID",
    "profileId": "PROFILE_ID"
  }'

Responses

  • 201Send the user to authUrl within 15 minutes
  • 400Invalid redirect URL, instance, or a platform that does not use OAuth
  • 401Invalid or expired credential
  • 402Plan required
  • 403Insufficient permission
  • 424The user's server refused registration
  • 429Rate limit exceeded

List what a headless connection can publish to

GET/connect/select
Scope accounts:connect

Must use the API key that started the flow.

Parameters

  • tokenquery · stringrequired
  • searchquery · string
  • pagequery · integer
GET /connect/select
curl "https://dashboard.lifebliss.app/api/v1/connect/select?token=TOKEN" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Choices
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 410Token expired
  • 429Rate limit exceeded

Finish a headless connection

POST/connect/select
Scope accounts:connect

Must use the API key that started the flow.

Body FinishConnect

  • tokenstringrequired
  • platformAccountIdstring
  • platformAccountIdsarray of string

    max 500 items

  • groupIdstring, uuid

    Required for a key limited to account groups; must be one of its groups.

  • newGroupNamestring

    max 80 chars

POST /connect/select
curl -X POST "https://dashboard.lifebliss.app/api/v1/connect/select" \
  -H "Authorization: Bearer $PS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "CONNECT_TOKEN",
    "platformAccountId": "PLATFORM_ACCOUNT_ID",
    "platformAccountIds": [
      "PLATFORM_ACCOUNT_ID"
    ]
  }'

Responses

  • 201Connected
  • 400Invalid request, or a group-limited key without groupId
  • 401Invalid or expired credential
  • 402Plan limit
  • 403Insufficient permission
  • 409Accounts no longer offered
  • 410Token expired
  • 429Rate limit exceeded

List webhook endpoints

GET/webhook-endpoints
Scope webhooks:manage

Org admins only. Not available to keys limited to account groups.

GET /webhook-endpoints
curl "https://dashboard.lifebliss.app/api/v1/webhook-endpoints" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Endpoints and subscribable events
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

Create a webhook endpoint

POST/webhook-endpoints
Scope webhooks:manage

Org admins only. Not available to keys limited to account groups.

Body CreateWebhookEndpoint

  • urlstring, urirequired

    Public https:// URL.

  • eventsarray of "post.published" | "post.partial" | "post.failed" | "account.connected" | "account.needs_reauth" | "account.disconnected"required
  • descriptionstring

    max 200 chars

POST /webhook-endpoints
curl -X POST "https://dashboard.lifebliss.app/api/v1/webhook-endpoints" \
  -H "Authorization: Bearer $PS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://cdn.example.org/talk.mp4",
    "events": [
      "post.published"
    ],
    "description": "Production listener"
  }'

Responses

  • 201Created; the secret is shown only now
  • 400Invalid URL or event
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 409Organization already has 10 endpoints
  • 429Rate limit exceeded

Get a webhook endpoint

GET/webhook-endpoints/{id}
Scope webhooks:manage

Org admins only. Not available to keys limited to account groups.

Parameters

  • idpath · string, uuidrequired
GET /webhook-endpoints/{id}
curl "https://dashboard.lifebliss.app/api/v1/webhook-endpoints/ID" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Endpoint
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 404Not found
  • 429Rate limit exceeded

Update, enable, disable or rotate a webhook endpoint

PATCH/webhook-endpoints/{id}
Scope webhooks:manage

Org admins only. Not available to keys limited to account groups.

Parameters

  • idpath · string, uuidrequired

Body UpdateWebhookEndpoint

  • urlstring, uri
  • eventsarray of "post.published" | "post.partial" | "post.failed" | "account.connected" | "account.needs_reauth" | "account.disconnected"
  • descriptionstring

    max 200 chars

  • enabledboolean

    Enabling clears disabledReason and resumes queued deliveries.

  • rotateSecretboolean

    Issue a new secret; the old one stops working immediately.

PATCH /webhook-endpoints/{id}
curl -X PATCH "https://dashboard.lifebliss.app/api/v1/webhook-endpoints/ID" \
  -H "Authorization: Bearer $PS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://cdn.example.org/talk.mp4",
    "events": [
      "post.published"
    ],
    "description": "Production listener"
  }'

Responses

  • 200Updated; includes secret when rotated
  • 400Invalid change
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 404Not found
  • 429Rate limit exceeded

Delete a webhook endpoint and its delivery log

DEL/webhook-endpoints/{id}
Scope webhooks:manage

Org admins only. Not available to keys limited to account groups.

Parameters

  • idpath · string, uuidrequired
DELETE /webhook-endpoints/{id}
curl -X DELETE "https://dashboard.lifebliss.app/api/v1/webhook-endpoints/ID" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Deleted
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 404Not found
  • 429Rate limit exceeded

Send a webhook.test event now

POST/webhook-endpoints/{id}/test
Scope webhooks:manage

Sent whether or not the endpoint is enabled. Never retried and never counts toward auto-disable.

Parameters

  • idpath · string, uuidrequired
POST /webhook-endpoints/{id}/test
curl -X POST "https://dashboard.lifebliss.app/api/v1/webhook-endpoints/ID/test" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Result of the attempt; ok is false when the receiver rejected it
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 404Not found
  • 429Rate limit exceeded

List deliveries, newest first

GET/webhook-endpoints/{id}/deliveries
Scope webhooks:manage

Org admins only. Not available to keys limited to account groups.

Parameters

  • idpath · string, uuidrequired
  • statusquery · "pending" | "sending" | "succeeded" | "dead"
  • beforequery · string, date-time

    createdAt of the last row of the previous page.

GET /webhook-endpoints/{id}/deliveries
curl "https://dashboard.lifebliss.app/api/v1/webhook-endpoints/ID/deliveries" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 20050 per page; kept 30 days
  • 400Invalid filter
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 404Not found
  • 429Rate limit exceeded

Queue a delivery again with a fresh set of attempts

POST/webhook-endpoints/{id}/deliveries/{deliveryId}/retry
Scope webhooks:manage

Org admins only. Not available to keys limited to account groups.

Parameters

  • idpath · string, uuidrequired
  • deliveryIdpath · string, uuidrequired
POST /webhook-endpoints/{id}/deliveries/{deliveryId}/retry
curl -X POST "https://dashboard.lifebliss.app/api/v1/webhook-endpoints/ID/deliveries/DELIVERY_ID/retry" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 202Queued
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 404Not found
  • 409In flight, a test event, or missing
  • 429Rate limit exceeded

Social media analytics report

GET/analytics/report
Scope analytics:read

The connected accounts' analytics, as on the Analytics page: followers and follower growth per account, metric totals (reach, impressions, views, likes, comments, shares, saves, quotes, clicks), engagement grouped by day, post type, account, campaign and topic, best times to post, and the posts themselves with their metrics, paged. Only accounts the key's owner can reach are included; a key limited to account groups sees only those groups' accounts. Metrics a network doesn't report are null, not zero.

Parameters

  • rangequery · "24h" | "7" | "30" | "90"

    Days ending today, or the last 24 hours. Ignored when from/to are given.

  • fromquery · string, date

    First day (YYYY-MM-DD), with to.

  • toquery · string, date

    Last day (YYYY-MM-DD), with from.

  • timezonequery · string

    IANA timezone for days and the window, e.g. Asia/Kolkata.

  • platformquery · string

    Only this network, e.g. youtube, instagram, facebook.

  • accountquery · string, uuid

    Only this account id.

  • ecosystemquery · string, uuid

    Only accounts in this ecosystem id.

  • groupquery · string, uuid

    Only accounts in this account group id.

  • sourcequery · "all" | "tool" | "native"

    Posts published through the studio (tool), directly on the network (native), or both.

  • modequery · "lifetime" | "period" | "age7"

    lifetime: each post's latest totals. period: activity inside the window, on any post. age7: each post's totals at 7 days old.

  • campaignquery · string

    Only posts tagged with this campaign.

  • topicquery · string

    Only posts tagged with this topic.

  • sortquery · "published" | "engagement" | "views" | "likes" | "comments" | "reach"

    Order of posts.items, highest first (published: newest first).

  • limitquery · integer

    Posts per page.

  • offsetquery · integer

    Posts to skip.

GET /analytics/report
curl "https://dashboard.lifebliss.app/api/v1/analytics/report" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

Website visit analytics

GET/site/visits
Scope site:read

Visits to the public website: people (each counted once a month, with no cookies and no IP addresses stored), visits, page views, bounce rate and time on site; by day (by hour for 24h), page, source, campaign, country and device; where visits end; page-by-page journeys; the visit-to-account funnel; and answers to the "what stopped you today?" question. Platform staff, signed-in studio users and scanners are left out of the people numbers. Staff keys only.

Parameters

  • rangequery · "24h" | "7d" | "30d" | "90d"

    Time window ending now.

GET /site/visits
curl "https://dashboard.lifebliss.app/api/v1/site/visits" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

Sign-up and sign-in analytics

GET/site/signins
Scope site:read

People who opened the sign-up and log-in pages, sign-up and sign-in attempts with failures and their reasons, the latest attempts, and the newest accounts with whether they confirmed their email. Includes email addresses. Staff keys only.

Parameters

  • rangequery · "24h" | "7d" | "30d" | "90d"

    Time window ending now.

GET /site/signins
curl "https://dashboard.lifebliss.app/api/v1/site/signins" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 403Insufficient permission
  • 429Rate limit exceeded

YouTube Live channels and their stream keys

GET/live/channels
Scope live:read

The org's connected YouTube channels, each with the stream (RTMP server and key) its broadcasts use. Org admins' keys only.

Parameters

  • rangequery · "24h" | "7" | "30" | "90"

    Days ending today, or the last 24 hours. Ignored when from/to are given.

  • fromquery · string, date

    First day (YYYY-MM-DD), with to.

  • toquery · string, date

    Last day (YYYY-MM-DD), with from.

  • timezonequery · string

    IANA timezone for days and the window, e.g. Asia/Kolkata.

  • platformquery · string

    Only this network, e.g. youtube, instagram, facebook.

  • accountquery · string, uuid

    Only this account id.

  • ecosystemquery · string, uuid

    Only accounts in this ecosystem id.

  • groupquery · string, uuid

    Only accounts in this account group id.

  • sourcequery · "all" | "tool" | "native"

    Posts published through the studio (tool), directly on the network (native), or both.

  • modequery · "lifetime" | "period" | "age7"

    lifetime: each post's latest totals. period: activity inside the window, on any post. age7: each post's totals at 7 days old.

  • campaignquery · string

    Only posts tagged with this campaign.

  • topicquery · string

    Only posts tagged with this topic.

  • sortquery · "published" | "engagement" | "views" | "likes" | "comments" | "reach"

    Order of posts.items, highest first (published: newest first).

  • limitquery · integer

    Posts per page.

  • offsetquery · integer

    Posts to skip.

GET /live/channels
curl "https://dashboard.lifebliss.app/api/v1/live/channels" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 402The plan doesn't include Live
  • 403Insufficient permission
  • 429Rate limit exceeded

Stream keys available on a channel

GET/live/streams
Scope live:read

Every live stream on the channel in YouTube, for choosing which one it uses. Costs YouTube API quota.

Parameters

  • accountIdquery · string, uuidrequired
GET /live/streams
curl "https://dashboard.lifebliss.app/api/v1/live/streams?accountId=ACCOUNTID" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 402The plan doesn't include Live
  • 403Insufficient permission
  • 429Rate limit exceeded

Set a channel's stream key

POST/live/map
Scope live:write

Choose which of the channel's streams its broadcasts bind to. Sends the live.key_set webhook.

Parameters

  • rangequery · "24h" | "7" | "30" | "90"

    Days ending today, or the last 24 hours. Ignored when from/to are given.

  • fromquery · string, date

    First day (YYYY-MM-DD), with to.

  • toquery · string, date

    Last day (YYYY-MM-DD), with from.

  • timezonequery · string

    IANA timezone for days and the window, e.g. Asia/Kolkata.

  • platformquery · string

    Only this network, e.g. youtube, instagram, facebook.

  • accountquery · string, uuid

    Only this account id.

  • ecosystemquery · string, uuid

    Only accounts in this ecosystem id.

  • groupquery · string, uuid

    Only accounts in this account group id.

  • sourcequery · "all" | "tool" | "native"

    Posts published through the studio (tool), directly on the network (native), or both.

  • modequery · "lifetime" | "period" | "age7"

    lifetime: each post's latest totals. period: activity inside the window, on any post. age7: each post's totals at 7 days old.

  • campaignquery · string

    Only posts tagged with this campaign.

  • topicquery · string

    Only posts tagged with this topic.

  • sortquery · "published" | "engagement" | "views" | "likes" | "comments" | "reach"

    Order of posts.items, highest first (published: newest first).

  • limitquery · integer

    Posts per page.

  • offsetquery · integer

    Posts to skip.

Body

  • accountIdstring, uuidrequired
  • streamIdstringrequired
POST /live/map
curl -X POST "https://dashboard.lifebliss.app/api/v1/live/map" \
  -H "Authorization: Bearer $PS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "ACCOUNT_ID",
    "streamId": "streamId"
  }'

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 402The plan doesn't include Live
  • 403Insufficient permission
  • 429Rate limit exceeded
  • 502YouTube refused, or the stream no longer exists

Recent live broadcasts

GET/live
Scope live:read

The 20 latest scheduled broadcasts with per-channel counts.

Parameters

  • rangequery · "24h" | "7" | "30" | "90"

    Days ending today, or the last 24 hours. Ignored when from/to are given.

  • fromquery · string, date

    First day (YYYY-MM-DD), with to.

  • toquery · string, date

    Last day (YYYY-MM-DD), with from.

  • timezonequery · string

    IANA timezone for days and the window, e.g. Asia/Kolkata.

  • platformquery · string

    Only this network, e.g. youtube, instagram, facebook.

  • accountquery · string, uuid

    Only this account id.

  • ecosystemquery · string, uuid

    Only accounts in this ecosystem id.

  • groupquery · string, uuid

    Only accounts in this account group id.

  • sourcequery · "all" | "tool" | "native"

    Posts published through the studio (tool), directly on the network (native), or both.

  • modequery · "lifetime" | "period" | "age7"

    lifetime: each post's latest totals. period: activity inside the window, on any post. age7: each post's totals at 7 days old.

  • campaignquery · string

    Only posts tagged with this campaign.

  • topicquery · string

    Only posts tagged with this topic.

  • sortquery · "published" | "engagement" | "views" | "likes" | "comments" | "reach"

    Order of posts.items, highest first (published: newest first).

  • limitquery · integer

    Posts per page.

  • offsetquery · integer

    Posts to skip.

GET /live
curl "https://dashboard.lifebliss.app/api/v1/live" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 402The plan doesn't include Live
  • 403Insufficient permission
  • 429Rate limit exceeded

Schedule a live broadcast on many channels

POST/live
Scope live:write

Creates one YouTube broadcast per channel, each bound to that channel's mapped stream key. Channels are created in the background; each sends live.broadcast_scheduled when ready.

Parameters

  • rangequery · "24h" | "7" | "30" | "90"

    Days ending today, or the last 24 hours. Ignored when from/to are given.

  • fromquery · string, date

    First day (YYYY-MM-DD), with to.

  • toquery · string, date

    Last day (YYYY-MM-DD), with from.

  • timezonequery · string

    IANA timezone for days and the window, e.g. Asia/Kolkata.

  • platformquery · string

    Only this network, e.g. youtube, instagram, facebook.

  • accountquery · string, uuid

    Only this account id.

  • ecosystemquery · string, uuid

    Only accounts in this ecosystem id.

  • groupquery · string, uuid

    Only accounts in this account group id.

  • sourcequery · "all" | "tool" | "native"

    Posts published through the studio (tool), directly on the network (native), or both.

  • modequery · "lifetime" | "period" | "age7"

    lifetime: each post's latest totals. period: activity inside the window, on any post. age7: each post's totals at 7 days old.

  • campaignquery · string

    Only posts tagged with this campaign.

  • topicquery · string

    Only posts tagged with this topic.

  • sortquery · "published" | "engagement" | "views" | "likes" | "comments" | "reach"

    Order of posts.items, highest first (published: newest first).

  • limitquery · integer

    Posts per page.

  • offsetquery · integer

    Posts to skip.

Body ScheduleLive

Give groupId or accountIds.

  • groupIdstring, uuid, nullable
  • accountIdsarray of string, uuid
  • titlestringrequired

    max 100 chars

  • descriptionstring

    max 5000 chars

  • scheduledStartTimestring, date-timerequired
  • privacy"public" | "unlisted" | "private"

    default "public"

  • thumbnailUrlstring, uri, nullable
  • autoStartboolean

    default true

  • autoStopboolean

    default true

POST /live
curl -X POST "https://dashboard.lifebliss.app/api/v1/live" \
  -H "Authorization: Bearer $PS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "title",
    "scheduledStartTime": "2026-11-01T18:30:00Z",
    "groupId": "GROUP_ID",
    "accountIds": [
      "ACCOUNT_ID"
    ]
  }'

Responses

  • 202Accepted
  • 400Invalid request
  • 401Invalid or expired credential
  • 402The plan doesn't include Live
  • 403Insufficient permission
  • 429Rate limit exceeded

A broadcast's channels, keys and status

GET/live/{id}
Scope live:read

Each channel's status, stream key, RTMP server and watch URL.

Parameters

  • idpath · string, uuidrequired

    Broadcast id

GET /live/{id}
curl "https://dashboard.lifebliss.app/api/v1/live/ID" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 402The plan doesn't include Live
  • 403Insufficient permission
  • 404Not found
  • 429Rate limit exceeded

Cancel or end one channel's broadcast

POST/live/targets/{id}/cancel
Scope live:write

Deletes a scheduled broadcast, or ends a live one.

Parameters

  • idpath · string, uuidrequired

    Target id from GET /live/{id}

POST /live/targets/{id}/cancel
curl -X POST "https://dashboard.lifebliss.app/api/v1/live/targets/ID/cancel" \
  -H "Authorization: Bearer $PS_API_KEY"

Responses

  • 200Success
  • 400Invalid filter
  • 401Invalid or expired credential
  • 402The plan doesn't include Live
  • 403Insufficient permission
  • 429Rate limit exceeded

Schemas

Objects used in requests and responses.

Error
  • errorstringrequired
  • codestring
  • requestIdstring

    Same value as the X-Request-Id header, on errors raised before the handler runs.

MediaItem
  • type"image" | "video" | "gif" | "document"required
  • urlstring, urirequired
  • thumbnailUrlstring, uri
  • altTextstring
  • filenamestring
  • mimeTypestring
  • sizeinteger

    min 1

  • widthinteger

    min 1

  • heightinteger

    min 1

  • durationMsnumber
CreatePostAt least one target or group is required. Scheduling and queue allocation are mutually exclusive.
  • contentstring
  • mediaItemsarray of MediaItem
  • targetsarray of object
  • groupIdsarray of string, uuid
  • publishNowboolean

    default false

  • scheduledForstring, date-time
  • timezonestring

    default "UTC"

  • useQueueboolean
  • queueIdstring, uuid
AcceptedPost
  • idstring, uuidrequired
  • statusstringrequired
  • queuedinteger
  • targetCountinteger
Identity
  • tenantIdstring, uuid
  • userIdstring, uuid
  • role"admin" | "member" | "viewer"
  • keyobject
WebhookEndpoint
  • idstring, uuid
  • urlstring, uri
  • descriptionstring
  • eventsarray of "post.published" | "post.partial" | "post.failed" | "account.connected" | "account.needs_reauth" | "account.disconnected"
  • enabledboolean
  • disabledReasonstring, nullable

    Set when Studio disabled the endpoint after repeated dead-lettered deliveries.

  • lastSuccessAtstring, date-time, nullable
  • lastFailureAtstring, date-time, nullable
  • createdAtstring, date-time
  • updatedAtstring, date-time
WebhookEndpointWithSecret
  • secretstring

    whsec_ signing secret. Returned only on creation and rotation.

CreateWebhookEndpoint
  • urlstring, urirequired

    Public https:// URL.

  • eventsarray of "post.published" | "post.partial" | "post.failed" | "account.connected" | "account.needs_reauth" | "account.disconnected"required
  • descriptionstring

    max 200 chars

UpdateWebhookEndpoint
  • urlstring, uri
  • eventsarray of "post.published" | "post.partial" | "post.failed" | "account.connected" | "account.needs_reauth" | "account.disconnected"
  • descriptionstring

    max 200 chars

  • enabledboolean

    Enabling clears disabledReason and resumes queued deliveries.

  • rotateSecretboolean

    Issue a new secret; the old one stops working immediately.

WebhookDelivery
  • idstring, uuid
  • eventIdstring
  • eventTypestring
  • status"pending" | "sending" | "succeeded" | "dead"
  • attemptsinteger
  • nextAttemptAtstring, date-time
  • lastAttemptAtstring, date-time, nullable
  • lastStatusCodeinteger, nullable
  • lastErrorstring, nullable
  • lastResponsestring, nullable

    First 500 characters of the response body.

  • lastDurationMsinteger, nullable
  • deliveredAtstring, date-time, nullable
  • createdAtstring, date-time
  • bodystring

    The exact JSON that was signed and sent.

WebhookEventBody of every webhook request. Signed per Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature).
  • idstring

    evt_... Same on every retry; deduplicate on it.

  • type"post.published" | "post.partial" | "post.failed" | "account.connected" | "account.needs_reauth" | "account.disconnected" | "live.key_set" | "live.broadcast_scheduled" | "webhook.test"
  • createdAtstring, date-time
  • dataobject

    post.*: {post, progress, targets (first 100), targetsTruncated}. account.*: {account: {id, platform, displayName, username}}. live.key_set: {channel: LiveChannel, previousStreamId}. live.broadcast_scheduled: {broadcast: {id, title, scheduledStartTime, privacy, youtubeBroadcastId, watchUrl}, channel: LiveChannel, stream: {id, server, key}, usesChannelKey}. live.* bodies carry stream keys: they are stored encrypted and masked in the delivery log.

TestDeliveryResult
  • deliveryIdstring, uuid
  • eventIdstring
  • okboolean
  • statusstring
  • statusCodeinteger, nullable
  • errorstring, nullable
  • durationMsinteger
HeadlessConnectStart
  • redirectUrlstring, urirequired

    https:// (http only for localhost). Receives connect_token, platform and step, or error.

  • ecosystemIdstring, uuid
  • profileIdstring, uuid
  • instancestring

    Mastodon-family platforms: the user's server.

HeadlessConnectStarted
  • authUrlstring, uri
  • statestring
  • expiresInSecondsinteger
ConnectChoices
  • platformstring
  • totalinteger
  • matchedinteger
  • pageinteger
  • pageSizeinteger
  • hasMoreboolean
  • accountsarray of object
  • matchedIdsarray of string

    Every platformAccountId matching the search, across pages.

  • redirectUrlstring, nullable
FinishConnect
  • tokenstringrequired
  • platformAccountIdstring
  • platformAccountIdsarray of string

    max 500 items

  • groupIdstring, uuid

    Required for a key limited to account groups; must be one of its groups.

  • newGroupNamestring

    max 80 chars

ConnectResult
  • accountsarray of object
  • connectedinteger
  • unavailablearray of string
  • groupobject, nullable
  • warningsarray of string
LiveStreamA reusable YouTube stream: what an encoder (or Stream Desk) pushes to.
  • idstring
  • titlestring
  • serverstring

    RTMP ingest, e.g. rtmp://a.rtmp.youtube.com/live2

  • rtmpsServerstring, nullable
  • keystring

    The stream key. Secret: anyone holding it can broadcast to the channel.

LiveChannel
  • accountIdstring, uuid
  • namestring
  • usernamestring, nullable
  • youtubeChannelIdstring

    YouTube's channel id (UC…)

  • ecosystemobject, nullable
  • streamany, nullable

    The key broadcasts bind to; null until one is mapped.

ScheduleLiveGive groupId or accountIds.
  • groupIdstring, uuid, nullable
  • accountIdsarray of string, uuid
  • titlestringrequired

    max 100 chars

  • descriptionstring

    max 5000 chars

  • scheduledStartTimestring, date-timerequired
  • privacy"public" | "unlisted" | "private"

    default "public"

  • thumbnailUrlstring, uri, nullable
  • autoStartboolean

    default true

  • autoStopboolean

    default true