This document describes how Owncast federates with other ActivityPub servers, following FEP-67ff.
- ActivityPub (Server-to-Server)
- WebFinger
- HTTP Signatures
- NodeInfo
Owncast servers present as a single Service actor (not Person). Each Owncast instance has one actor representing the live stream.
The actor profile includes:
icon: Server logo/avatarimage: Profile banner imagesummary: Server description (HTML)attachment: Array ofPropertyValueobjects containing social links and metadatatag: Hashtags describing the server contentmanuallyApprovesFollowers:trueif the server operates in private modediscoverable: Alwaystrue
Owncast actors do not follow other actors. The following collection endpoint returns 404.
| Activity | Object | Send | Receive | Notes |
|---|---|---|---|---|
Create |
Note |
Yes | No | Sent on go-live and manual fediverse posts. Incoming posts are ignored. |
Update |
Service |
Yes | No | Sent when server profile changes. |
Update |
Person |
No | Yes | Updates cached follower profile information. |
Follow |
- | No | Yes | Queued for approval if private mode is enabled. |
Accept |
Follow |
Yes | No | Sent automatically unless in private mode. |
Undo |
Follow |
No | Yes | Removes the follower. |
Like |
Note |
No | Yes | Optionally displayed in live chat. |
Announce |
Note |
No | Yes | Optionally displayed in live chat. |
Owncast is a broadcast-only service. It does not follow other actors or accept incoming posts.
Posts from Owncast are Note objects with:
content: HTML-formatted text with linked hashtagsattachment:Imageobject with stream thumbnail (for go-live posts)tag: Array containingHashtagandMentionobjectssensitive:trueif the stream is marked NSFW
When a stream starts, Owncast sends a Create(Note) containing:
- The configured go-live message (or default announcement)
- A thumbnail image of the stream
- Hashtags configured for the server
- A link to watch the stream
Hashtags use toot:Hashtag type and link to https://directory.owncast.online/tags/{tag} for discovery across Owncast instances.
Public posts are addressed to:
{
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"cc": ["{actor}/followers"]
}Owncast supports sending direct messages to specific actors (used for replying to engagement). These include the recipient in cc with a corresponding Mention tag for Mastodon compatibility.
Outbound: All POST requests are signed using RSA-SHA256. Signed headers: (request-target), host, date, digest.
Inbound: All POST requests to the inbox must have a valid signature. Unsigned requests are rejected.
GET requests to actor, outbox, and followers endpoints do not require signatures.
Actor discovery via /.well-known/webfinger?resource=acct:{username}@{domain}
Response links include:
self(application/activity+json): Actor documenthttp://webfinger.net/rel/profile-page: Web profilehttp://webfinger.net/rel/avatar: Profile imagealternate(application/x-mpegURL): HLS stream URL
The HLS stream link allows clients to discover the live stream URL directly from WebFinger.
Available at /.well-known/nodeinfo with NodeInfo 2.0 at /nodeinfo/2.0.
Additional endpoints:
/.well-known/x-nodeinfo2: Extended format/api/v1/instance: Mastodon-compatible instance information/.well-known/host-meta: WebFinger discovery
Owncast can operate in private mode where:
manuallyApprovesFollowersistrueon the actor- Follow requests are queued for admin approval
Acceptis only sent after manual approval
Owncast supports blocking at the domain and individual actor level. Blocked entities:
- Cannot deliver to the inbox (requests rejected)
- Do not receive activities from the server
- Owncast uses
Serviceactor type, notPerson - There is no
followingcollection (Owncast does not follow accounts) - Owncast does not accept incoming posts (
Createfrom remote actors is ignored) - Engagement (
Like,Announce) can be displayed in the live chat if enabled - The
sensitiveflag indicates NSFW content for the entire stream