Founding offer: 50% off for life — first 100 churches. See pricing →

PealCast API

Version 1.0.0

OpenAPI spec

The **PealCast** church-facing developer API — the follow-up engine for online church. PealCast turns your live stream's anonymous crowd into named people with a verified phone number, then hands your team a weekly **Shepherd's Report** of who to welcome (**New Faces**) and who to quietly check on (**Missed You**). This API lets you read that same data programmatically and manage your channels, audience, and go-live notifications. ## Authentication Every request is authenticated with an opaque **bearer token** and every token is pinned to exactly **ONE church** (organization). You create tokens in the app dashboard under **Developer / API tokens**: - `pc_live_…` — a **production** token (talks to `https://api.pealcast.io`). - `pc_test_…` — a **non-production** token (talks to `https://api.dev.pealcast.io`). Access is set **per token**: a **read** token can only call `GET` endpoints, while a **read/write** token may also create and update. A read-only token that calls a write endpoint receives `403 READ_ONLY_TOKEN`. ## Player endpoints are public The **Player (public)** endpoints power the watch page and take **no authentication** — they return only what a viewer's browser is allowed to see. ## AI assistants (MCP) An **MCP server** is available at **`mcp.pealcast.io`** so AI assistants (Claude and others) can read your Shepherd's Report and audience with the same church-scoped token.

Base URLs

  • https://api.pealcast.io — Production
  • https://api.dev.pealcast.io — Development

Authentication

A PealCast API token (pc_live_… / pc_test_…). Create one in the app dashboard under Developer / API tokens. Every token is pinned to one church.

Authorization: Bearer pc_live_your_token_here

Audience

Your **owned, verified audience** — the real people (watchers/viewers) who have watched a stream, deduped by verified mobile number. A "watcher" (or "viewer") is a person who watched at least one broadcast.

get/app/channel-viewers

List a channel's viewers

Lists every known watcher for the channel — your owned, verified audience — with their first/last watch and total watch minutes.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.
slugstringrequiredThe channel slug.

Example request

curl -X GET "https://api.pealcast.io/app/channel-viewers?slug=sunday&org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "viewers": [
    {
      "subscriber_id": 123,
      "name": "Jordan Rivera",
      "mobile": "+15551234567",
      "first_watch_at": "2026-07-11T14:30:00Z",
      "last_watch_at": "2026-07-11T14:30:00Z",
      "watch_minutes": 128
    }
  ]
}

Responses

200 · The channel's viewers.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).404 · No such channel for this church (`NO_CHANNEL`).
get/app/viewer

Get one viewer's full profile

Returns a single watcher's complete profile: their identity, lifetime totals, every watch session, any prayer/connect submissions, and the go-live notifications they've received.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.
slugstringrequiredThe channel slug.
idintegerrequiredThe subscriber (viewer) id.

Example request

curl -X GET "https://api.pealcast.io/app/viewer?slug=sunday&id=123&org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "subscriber": {
    "id": 123,
    "name": "Jordan Rivera",
    "mobile": "+15551234567",
    "email": "jordan@example.com",
    "first_seen_at": "2026-07-11T14:30:00Z",
    "last_seen_at": "2026-07-11T14:30:00Z"
  },
  "totals": {
    "sessions": 42,
    "watch_minutes": 128,
    "avg_qoe": 91
  },
  "sessions": [
    {
      "broadcast_id": 123,
      "date": "2026-07-11T14:30:00Z",
      "watch_minutes": 128,
      "completion": 0.82,
      "qoe": 91,
      "platform": "web"
    }
  ],
  "submissions": [
    {
      "type": "prayer",
      "fields": {
        "brand_color": "#0c1a2e"
      },
      "at": "2026-07-11T14:30:00Z"
    }
  ],
  "notifications": [
    {
      "integration_key": "native.sms",
      "status": "sent",
      "provider": "signalwire",
      "sent_at": "2026-07-11T14:30:00Z"
    }
  ]
}

Responses

200 · The viewer's full profile.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).404 · No such channel or viewer (`NO_CHANNEL` / `NO_VIEWER`).
get/app/channel-archive

List a channel's recorded broadcasts

Lists the channel's recorded past broadcasts (VOD) within the plan's archive-retention window, with each recording's duration, playback URL, and watch stats.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.
slugstringrequiredThe channel slug.

Example request

curl -X GET "https://api.pealcast.io/app/channel-archive?slug=sunday&org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "retention_days": 90,
  "recordings": [
    {
      "id": 123,
      "date": "2026-07-11T14:30:00Z",
      "ended_at": "2026-07-11T14:30:00Z",
      "duration_minutes": 62.5,
      "recording_status": "ready",
      "cf_video_uid": "string",
      "playback_hls_url": "https://…",
      "watchers": 42,
      "watch_minutes": 128,
      "peak_concurrent": 42
    }
  ]
}

Responses

200 · The channel's archived recordings.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).404 · No such channel for this church (`NO_CHANNEL`).
post/app/subscriber

Update an audience member

Updates an audience member's (subscriber's) editable details. The person's **verified mobile number cannot be changed** here — it is the dedupe key for your owned audience. Pass an empty string to clear a field. **Requires a read/write token** (a read-only token receives `403 READ_ONLY_TOKEN`).

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Request body

FieldTypeRequiredDescription
idintegerrequiredThe subscriber (audience member) id.
first_namestringoptionalThe member's first name. Empty string clears it.
last_namestringoptionalThe member's last name. Empty string clears it.
emailstringoptionalThe member's email. Empty string clears it.

Example request

curl -X POST "https://api.pealcast.io/app/subscriber?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "id": 123
}'

Example response

{
  "ok": true,
  "subscriber": {
    "id": 123,
    "first_name": "Jordan",
    "last_name": "Rivera",
    "full_name": "Jordan Rivera",
    "mobile": "+15551234567",
    "mobile_verified": true,
    "email": "jordan@example.com",
    "email_verified": true,
    "source": "watch_gate",
    "created_at": "2026-07-11T14:30:00Z"
  }
}

Responses

200 · The updated audience member.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · A read-only token attempted a write (`READ_ONLY_TOKEN`); may also be `FORBIDDEN_ORG`/`FORBIDDEN`.404 · No such audience member for this church (`NO_SUBSCRIBER`).422 · Invalid field value (`INVALID`).

Shepherd's Report

The weekly follow-up engine: **New Faces** (new watchers to welcome) and **Missed You** (drifting watchers to check on), each with a name and a verified phone number, plus the controls to send it on demand.

get/app/channel-analytics

Get a channel's Shepherd's Report and analytics

Returns the channel's rollup for the requested window: a summary (unique viewers, watch minutes, average QoE, broadcasts) plus the two Shepherd's Report queues — **`new_watchers`** (New Faces, people to welcome) and **`drifting_watchers`** (Missed You, regulars who have gone quiet).

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.
slugstringrequiredThe channel slug.
range7 | 30 | 90 | 365optionalThe report window, in days.

Example request

curl -X GET "https://api.pealcast.io/app/channel-analytics?slug=sunday&org=your-church&range=30" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "range_days": 30,
  "summary": {
    "unique_viewers": 42,
    "anon_sessions": 42,
    "watch_minutes": 128,
    "avg_qoe": 91,
    "broadcasts": 42,
    "subscriber_count": 42
  },
  "new_watchers": [
    {
      "subscriber_id": 123,
      "name": "Jordan Rivera",
      "mobile": "+15551234567",
      "first_watch_at": "2026-07-11T14:30:00Z",
      "last_watch_at": "2026-07-11T14:30:00Z",
      "watch_minutes": 128
    }
  ],
  "drifting_watchers": [
    {
      "subscriber_id": 123,
      "name": "Jordan Rivera",
      "mobile": "+15551234567",
      "first_watch_at": "2026-07-11T14:30:00Z",
      "last_watch_at": "2026-07-11T14:30:00Z",
      "watch_minutes": 128
    }
  ]
}

Responses

200 · The channel's analytics and Shepherd's Report queues.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).404 · No such channel for this church (`NO_CHANNEL`).
post/app/send-report

Send the Shepherd's Report now

Sends the church's Shepherd's Report immediately (out of cadence) to the online-ministry team. **Requires a read/write token** (a read-only token receives `403 READ_ONLY_TOKEN`).

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Example request

curl -X POST "https://api.pealcast.io/app/send-report?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "ok": true,
  "message": "Your Shepherd's Report is on its way."
}

Responses

200 · The report was queued/sent.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · A read-only token attempted a write (`READ_ONLY_TOKEN`); may also be `FORBIDDEN_ORG`/`FORBIDDEN`.

Channels

A church's streaming channels — **broadcast** (one-to-many service) or **conference** (two-way prayer line) — and their encoder/ingest configuration.

get/app/channels

List the church's channels

Returns the church's channels as a lightweight navigation list (slug, name, type, live status).

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Example request

curl -X GET "https://api.pealcast.io/app/channels?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "channels": [
    {
      "slug": "main-service",
      "id": 123,
      "name": "Main Service",
      "type": "broadcast",
      "is_live": true
    }
  ]
}

Responses

200 · The church's channels.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).
post/app/channels

Create a channel

Creates a new channel for the church and provisions its Cloudflare Stream live input. **Requires a read/write token** (a read-only token receives `403 READ_ONLY_TOKEN`). Fails with `402 CHANNEL_LIMIT` when the church's plan channel allotment is already used.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Request body

FieldTypeRequiredDescription
namestringrequiredDisplay name for the channel.
typebroadcast | conferenceoptional`broadcast` = one-to-many service stream; `conference` = two-way prayer line.

Example request

curl -X POST "https://api.pealcast.io/app/channels?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Main Service"
}'

Example response

{
  "slug": "main-service",
  "id": 123,
  "name": "Jordan Rivera",
  "type": "broadcast",
  "description": "string",
  "timezone": "America/New_York",
  "is_live": true,
  "gate_enabled": true,
  "gate_free_watch_seconds": 30,
  "recording_retention_days": 60,
  "retention_min_days": 30,
  "retention_max_days": 90,
  "subscriber_count": 42,
  "created_at": "2026-07-11T14:30:00Z",
  "stream_info": {
    "cf_status": "ready",
    "provisioned": true,
    "rtmps_url": "rtmps://live.cloudflare.com:443/live/",
    "rtmps_stream_key": "string",
    "srt_url": "srt://live.cloudflare.com:778",
    "srt_stream_key": "string",
    "hls_playback_url": "https://…",
    "sms_from_number": "+15551234567"
  }
}

Responses

200 · The newly created channel.400 · Invalid or missing name (`BAD_NAME`).401 · Missing or invalid token (`UNAUTHENTICATED`).402 · The plan's channel allotment is used up (`CHANNEL_LIMIT`).403 · A read-only token attempted a write (`READ_ONLY_TOKEN`); may also be `FORBIDDEN_ORG`/`FORBIDDEN`.
get/app/channel

Get one channel

Returns a single channel's full configuration, including its **stream_info** — the encoder/ingest settings (RTMPS/SRT URLs and keys, HLS playback URL) your church uses to go live.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.
slugstringrequiredThe channel slug.

Example request

curl -X GET "https://api.pealcast.io/app/channel?slug=sunday&org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "slug": "main-service",
  "id": 123,
  "name": "Jordan Rivera",
  "type": "broadcast",
  "description": "string",
  "timezone": "America/New_York",
  "is_live": true,
  "gate_enabled": true,
  "gate_free_watch_seconds": 30,
  "recording_retention_days": 60,
  "retention_min_days": 30,
  "retention_max_days": 90,
  "subscriber_count": 42,
  "created_at": "2026-07-11T14:30:00Z",
  "stream_info": {
    "cf_status": "ready",
    "provisioned": true,
    "rtmps_url": "rtmps://live.cloudflare.com:443/live/",
    "rtmps_stream_key": "string",
    "srt_url": "srt://live.cloudflare.com:778",
    "srt_stream_key": "string",
    "hls_playback_url": "https://…",
    "sms_from_number": "+15551234567"
  }
}

Responses

200 · The channel.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).404 · No such channel for this church (`NO_CHANNEL`).
post/app/channel-settings

Update a channel's settings

Updates a channel's editable settings. The channel's **slug and type are structural and are not editable here**. Any omitted field is left unchanged. **Requires a read/write token** (a read-only token receives `403 READ_ONLY_TOKEN`).

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Request body

FieldTypeRequiredDescription
slugstringrequiredThe channel slug (identifies which channel to update).
namestringoptionalDisplay name for the channel.
descriptionstringoptionalA short public description of the channel.
timezonestringoptionalIANA timezone name.
gate_enabledbooleanoptionalWhether the capture gate is active for this channel.
gate_free_watch_secondsintegeroptionalSeconds a viewer may watch before the gate prompts.
recording_retention_daysintegeroptionalRecording auto-delete window (days). Clamped to [30, the plan's archive cap]; the change is pushed to Cloudflare as deleteRecordingAfterDays.

Example request

curl -X POST "https://api.pealcast.io/app/channel-settings?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "slug": "main-service"
}'

Example response

{
  "ok": true,
  "channel": {
    "slug": "main-service",
    "id": 123,
    "name": "Jordan Rivera",
    "type": "broadcast",
    "description": "string",
    "timezone": "America/New_York",
    "is_live": true,
    "gate_enabled": true,
    "gate_free_watch_seconds": 30,
    "recording_retention_days": 60,
    "retention_min_days": 30,
    "retention_max_days": 90,
    "subscriber_count": 42,
    "created_at": "2026-07-11T14:30:00Z",
    "stream_info": {
      "cf_status": "ready",
      "provisioned": true,
      "rtmps_url": "rtmps://live.cloudflare.com:443/live/",
      "rtmps_stream_key": "string",
      "srt_url": "srt://live.cloudflare.com:778",
      "srt_stream_key": "string",
      "hls_playback_url": "https://…",
      "sms_from_number": "+15551234567"
    }
  }
}

Responses

200 · The updated channel.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · A read-only token attempted a write (`READ_ONLY_TOKEN`); may also be `FORBIDDEN_ORG`/`FORBIDDEN`.404 · No such channel for this church (`NO_CHANNEL`).422 · Invalid field value (`INVALID`).

Notifications

Go-live notifications and the delivery integrations behind them (our SMS/email, Planning Center, custom domain) — who is subscribed and what has been sent.

get/app/channel-notifications

Get a channel's notifications overview

Returns who is subscribed to go-live notifications for the channel, broken down by delivery integration, plus recently sent notifications and recent unsubscribes.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.
slugstringrequiredThe channel slug.

Example request

curl -X GET "https://api.pealcast.io/app/channel-notifications?slug=sunday&org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "totals": {
    "subscribers": 42,
    "subscriptions": 42,
    "unsubscribes": 42
  },
  "by_integration": [
    {
      "key": "native.sms",
      "label": "Text message",
      "count": 42
    }
  ],
  "people": [
    {
      "subscriber_id": 123,
      "name": "Jordan Rivera",
      "mobile": "+15551234567",
      "integrations": [
        "native.sms",
        "native.email"
      ]
    }
  ],
  "recent": [
    {
      "integration_key": "native.sms",
      "status": "ready",
      "provider": "signalwire",
      "subscriber_id": 123,
      "sent_at": "2026-07-11T14:30:00Z",
      "created_at": "2026-07-11T14:30:00Z"
    }
  ],
  "unsubscribes": [
    {
      "subscriber_id": 123,
      "name": "Jordan Rivera",
      "mobile": "+15551234567",
      "integration_key": "native.sms",
      "unsubscribed_at": "2026-07-11T14:30:00Z"
    }
  ]
}

Responses

200 · The channel's notifications overview.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).404 · No such channel for this church (`NO_CHANNEL`).
get/app/channel-integrations

Get a channel's connected integrations

Returns the channel's connected systems — Planning Center status, custom-domain entitlement/hostname, and the list of notification-delivery integrations available to this church.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.
slugstringrequiredThe channel slug.

Example request

curl -X GET "https://api.pealcast.io/app/channel-integrations?slug=sunday&org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "planning_center": {
    "connected": true,
    "status": "connected",
    "display_name": "First Baptist (Planning Center)",
    "last_synced_at": "2026-07-11T14:30:00Z"
  },
  "custom_domain": {
    "entitled": true,
    "hostname": "watch.firstbaptist.org",
    "cname_target": "player.pealcast.io"
  },
  "available_notification_integrations": [
    {
      "key": "native.sms",
      "label": "Text message",
      "medium": "sms",
      "available": true
    }
  ]
}

Responses

200 · The channel's integration status.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).404 · No such channel for this church (`NO_CHANNEL`).

Account

Your church's plan, trial/billing state, and Shepherd's Report scheduling preferences.

get/app/account

Get the church's account and plans

Returns the church's billing/trial state, the catalog of plans, and the Stripe publishable key used by the dashboard to collect a card.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Example request

curl -X GET "https://api.pealcast.io/app/account?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "account": {
    "state": "active",
    "status": "Trial — 9 days left",
    "trial_ends_at": "2026-07-11T14:30:00Z",
    "trial_days_left": 9,
    "has_payment_method": true,
    "is_founding_member": true,
    "plan": {
      "code": "medium",
      "name": "Medium"
    },
    "next_bill_at": "2026-07-11T14:30:00Z"
  },
  "plans": [
    {
      "code": "medium",
      "name": "Medium",
      "tagline": "For a growing online congregation",
      "founding": true,
      "is_custom": true,
      "price_cents": 9900,
      "price_cents_annual": 99000,
      "setup_fee_cents": 4900,
      "trial_days": 14,
      "watchers": 30,
      "watchers_label": "~30 watchers",
      "included_minutes": 8000,
      "channels_included": 2,
      "overage_block_minutes": 500,
      "overage_block_cents": 2000,
      "minutes_note": "One watcher ≈ 60 minutes a week × 4 weeks = about 240 minutes a month, pooled across your whole church.",
      "overage_note": "$20 per 500 extra minutes or archive",
      "archive_retention_days": 60,
      "archive_label": "About 2 months",
      "support_tier": "email+phone",
      "dedicated_sms": true,
      "dedicated_email": true,
      "dedicated_domain": true
    }
  ],
  "publishable_key": "pk_live_51ABC…"
}

Responses

200 · The account state, plan catalog, and Stripe publishable key.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).
get/app/report-settings

Get Shepherd's Report schedule settings

Returns when the church's weekly Shepherd's Report is delivered (day, hour, timezone) plus the list of selectable timezones.

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Example request

curl -X GET "https://api.pealcast.io/app/report-settings?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here"

Example response

{
  "enabled": true,
  "wday": 0,
  "hour": 9,
  "timezone": "America/New_York",
  "last_sent_at": "2026-07-11T14:30:00Z",
  "timezones": [
    "America/New_York",
    "America/Chicago"
  ]
}

Responses

200 · The current report schedule and available timezones.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · The token has no church, or is not permitted for this church (`NO_ORG` / `FORBIDDEN_ORG` / `FORBIDDEN`).
post/app/report-settings

Update Shepherd's Report schedule settings

Updates when the weekly Shepherd's Report is delivered. Any omitted field is left unchanged. **Requires a read/write token** (a read-only token receives `403 READ_ONLY_TOKEN`).

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Request body

FieldTypeRequiredDescription
enabledbooleanoptionalWhether the weekly report is sent at all.
wdayintegeroptionalDay of week (0 = Sunday … 6 = Saturday).
hourintegeroptionalHour of day (local to `timezone`).
timezonestringoptionalIANA timezone name.

Example request

curl -X POST "https://api.pealcast.io/app/report-settings?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "enabled": true,
  "wday": 0,
  "hour": 9,
  "timezone": "America/New_York"
}'

Example response

{
  "enabled": true,
  "wday": 0,
  "hour": 9,
  "timezone": "America/New_York",
  "last_sent_at": "2026-07-11T14:30:00Z"
}

Responses

200 · The updated report settings.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · A read-only token attempted a write (`READ_ONLY_TOKEN`); may also be `FORBIDDEN_ORG`/`FORBIDDEN`.
post/app/organization

Update the church's details

Updates the church's (organization's) editable details. **Billing, status, plan, and slug are not editable here.** Any omitted field is left unchanged. **Requires a read/write token** (a read-only token receives `403 READ_ONLY_TOKEN`).

Query parameters

NameTypeRequiredDescription
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Request body

FieldTypeRequiredDescription
namestringoptionalThe church's display name.
timezonestringoptionalIANA timezone name.

Example request

curl -X POST "https://api.pealcast.io/app/organization?org=your-church" \
  -H "Authorization: Bearer pc_live_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "First Baptist",
  "timezone": "America/New_York"
}'

Example response

{
  "ok": true,
  "organization": {
    "id": 123,
    "name": "Jordan Rivera",
    "slug": "main-service",
    "role": "string",
    "status": "ready",
    "timezone": "America/New_York"
  }
}

Responses

200 · The updated church.401 · Missing or invalid token (`UNAUTHENTICATED`).403 · A read-only token attempted a write (`READ_ONLY_TOKEN`); may also be `FORBIDDEN_ORG`/`FORBIDDEN`.422 · Invalid field value (`INVALID`).

Player (public)

Public, unauthenticated endpoints that power the watch page — live status, playback URL, and the church's public channel list.

get/player/channel-playbackpublic

Get a channel's live playback state

**Public (no auth).** Returns the current live state and playback URL for a channel, plus the gate configuration and the notification methods a viewer can opt into. This is what the watch page calls to render the player.

Query parameters

NameTypeRequiredDescription
cstringrequiredThe channel slug or id.
tstringoptionalA signed watch token that pre-identifies the viewer (from a notification link).
hoststringoptionalThe watch host (used to resolve a custom domain).
orgstringoptionalThe church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate.

Example request

curl -X GET "https://api.pealcast.io/player/channel-playback?c=sunday&t=signed-watch-token&host=watch.firstbaptist.org"

Example response

{
  "is_live": true,
  "broadcast_id": 123,
  "hls_url": "https://…",
  "gate_enabled": true,
  "gate_free_watch_seconds": 30,
  "notification_methods": [
    {
      "key": "native.sms",
      "label": "Text message",
      "medium": "sms"
    }
  ],
  "theme": {
    "brand_color": "#0c1a2e"
  }
}

Responses

200 · The channel's playback state.404 · No such channel for this church (`NO_CHANNEL`).
get/player/orgpublic

Get a church's public player profile

**Public (no auth).** Resolves a church by custom-domain host or slug and returns its public profile plus the list of channels a viewer can watch.

Query parameters

NameTypeRequiredDescription
hoststringoptionalThe watch host (used to resolve a custom domain).
slugstringoptionalThe church (organization) slug.

Example request

curl -X GET "https://api.pealcast.io/player/org?host=watch.firstbaptist.org&slug=sunday"

Example response

{
  "org": {
    "name": "Jordan Rivera",
    "slug": "main-service",
    "custom_domain": "string",
    "theme": {
      "brand_color": "#0c1a2e"
    }
  },
  "channels": [
    {
      "slug": "main-service",
      "name": "Jordan Rivera",
      "type": "broadcast",
      "is_live": true,
      "theme": {
        "brand_color": "#0c1a2e"
      }
    }
  ]
}

Responses

200 · The church's public player profile and channels.404 · No such church (`NO_ORG`).

Get your API token

Create a free account, open Developer / API tokens, and start building in minutes.

Free 14-day trial · no credit card · cancel anytime.