PealCast API
Version 1.0.0
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— Productionhttps://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.
/app/channel-viewersList 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
| slug | string | required | The 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
/app/viewerGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
| slug | string | required | The channel slug. |
| id | integer | required | The 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
/app/channel-archiveList 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
| slug | string | required | The 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
/app/subscriberUpdate 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| id | integer | required | The subscriber (audience member) id. |
| first_name | string | optional | The member's first name. Empty string clears it. |
| last_name | string | optional | The member's last name. Empty string clears it. |
| string | optional | The 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
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.
/app/channel-analyticsGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
| slug | string | required | The channel slug. |
| range | 7 | 30 | 90 | 365 | optional | The 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
/app/send-reportSend 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The 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
Channels
A church's streaming channels — **broadcast** (one-to-many service) or **conference** (two-way prayer line) — and their encoder/ingest configuration.
/app/channelsList the church's channels
Returns the church's channels as a lightweight navigation list (slug, name, type, live status).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The 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
/app/channelsCreate 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | required | Display name for the channel. |
| type | broadcast | conference | optional | `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
/app/channelGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
| slug | string | required | The 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
/app/channel-settingsUpdate 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| slug | string | required | The channel slug (identifies which channel to update). |
| name | string | optional | Display name for the channel. |
| description | string | optional | A short public description of the channel. |
| timezone | string | optional | IANA timezone name. |
| gate_enabled | boolean | optional | Whether the capture gate is active for this channel. |
| gate_free_watch_seconds | integer | optional | Seconds a viewer may watch before the gate prompts. |
| recording_retention_days | integer | optional | Recording 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
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.
/app/channel-notificationsGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
| slug | string | required | The 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
/app/channel-integrationsGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
| slug | string | required | The 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
Account
Your church's plan, trial/billing state, and Shepherd's Report scheduling preferences.
/app/accountGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The 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
/app/report-settingsGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The 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
/app/report-settingsUpdate 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| enabled | boolean | optional | Whether the weekly report is sent at all. |
| wday | integer | optional | Day of week (0 = Sunday … 6 = Saturday). |
| hour | integer | optional | Hour of day (local to `timezone`). |
| timezone | string | optional | IANA 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
/app/organizationUpdate 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
| Name | Type | Required | Description |
|---|---|---|---|
| org | string | optional | The church (organization) id or slug. Optional — the token is already pinned to one church; supply this only to disambiguate. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | optional | The church's display name. |
| timezone | string | optional | IANA 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
Player (public)
Public, unauthenticated endpoints that power the watch page — live status, playback URL, and the church's public channel list.
/player/channel-playbackpublicGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| c | string | required | The channel slug or id. |
| t | string | optional | A signed watch token that pre-identifies the viewer (from a notification link). |
| host | string | optional | The watch host (used to resolve a custom domain). |
| org | string | optional | The 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
/player/orgpublicGet 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
| Name | Type | Required | Description |
|---|---|---|---|
| host | string | optional | The watch host (used to resolve a custom domain). |
| slug | string | optional | The 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
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.