API Reference

StreamForge exposes a REST API used by the dashboard itself and by external automations. Most endpoints accept either session authentication or API key authentication.

Authentication

You can authenticate in two ways:

  • Session auth (dashboard/browser): cookie-based authentication from a signed-in user session.
  • API key auth (automation/server): generate keys in Settings → API and send them in the Authorization header.

API key example:

Authorization: Bearer sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Notes:

  • API keys are tenant-scoped
  • Maximum 5 active API keys per tenant
  • API key management requires Pro tier
  • For session-authenticated mutation requests, valid browser origin/CSRF requirements apply

Base URL

https://streamforge.bifrostlive.com

Endpoints below are shown as absolute API paths (for example: /api/events).

Request & Response Conventions

  • JSON request/response bodies with Content-Type: application/json
  • ISO-8601 timestamps (UTC)
  • UUID identifiers for most entities
  • Validation errors return status 400 with field details

HTTP Status Codes

Status CodeMeaning
200OK — Request succeeded
201Created — Resource created successfully
204No Content — Request succeeded, no body returned
400Bad Request — Invalid request body or parameters
401Unauthorized — Missing or invalid API key
403Forbidden — Insufficient permissions or tier limit reached
404Not Found — Resource does not exist
409Conflict — Resource state conflict (e.g., event already active)
422Unprocessable Entity — Validation failed
429Too Many Requests — Rate limit exceeded
500Internal Server Error — Unexpected server error

Rate Limiting

Some endpoints use route-level rate limiting. On limit hit, expect 429 and respect Retry-After when present.


Endpoints

Endpoints are grouped by feature area. Paths below are current API routes.

API Keys

MethodPathDescription
GET/api/keysList active API keys
POST/api/keysGenerate a new API key
DELETE/api/keys/:idRevoke an API key

Viewers

MethodPathDescription
GET/api/viewers/search?q=...&limit=20Search viewers by username (min 2 chars)
GET/api/viewers/:viewerId/profileGet viewer details with stats
POST/api/viewers/resolveResolve viewer IDs to display names. Body: { "viewer_ids": ["uuid", ...] }

Example — Search Viewers

GET /api/viewers/search?q=ninja&limit=5
Authorization: Bearer sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Response:

{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "twitch_username": "ninja",
      "twitch_display_name": "Ninja",
      "total_points": 15200,
      "message_count": 342,
      "watch_minutes": 18400
    }
  ]
}

Viewer Interactions

MethodPathDescription
POST/api/viewers/interactionsAdd a manual interaction for a viewer
DELETE/api/viewers/interactions/:idRemove a manual interaction (source=manual only)

Example — Add Interaction

POST /api/viewers/interactions
Authorization: Bearer sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json

{
  "username": "viewer123",
  "type": "donation",
  "quantity": 1,
  "date": "2026-04-09",
  "mode": "add"
}

Point Rules

MethodPathDescription
GET/api/point-rulesList all point rules for your workspace
PUT/api/point-rulesUpdate point rules (bulk). Body: { "rules": [...] }

VIP Rules

MethodPathDescription
GET/api/vip-rulesList all VIP rules
POST/api/vip-rulesCreate a new VIP rule
GET/api/vip-rules/:idGet VIP rule details
PATCH/api/vip-rules/:idUpdate a VIP rule
DELETE/api/vip-rules/:idDelete a VIP rule
POST/api/vip-rules/:id/evaluateManually trigger rule evaluation

Example — Create VIP Rule

POST /api/vip-rules
Authorization: Bearer sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json

{
  "name": "Top Monthly Supporters",
  "metric": "total_points",
  "threshold": 5000,
  "period": "monthly",
  "max_winners": 3,
  "auto_grant": true
}

VIP Awards

MethodPathDescription
GET/api/vip-awardsList VIP award history. Query: ?page=1&limit=50&status=active&viewer_id=uuid&rule_id=uuid
POST/api/vip-awards/:id/revokeRevoke a VIP award

Permanent VIPs

MethodPathDescription
GET/api/vip/permanentList all permanent VIPs
POST/api/vip/permanentAdd permanent VIP. Body: { "twitch_username": "name", "reason": "..." }
POST/api/vip/permanent/bulkBulk add permanent VIPs. Body: { "usernames": [...], "reason": "..." }
DELETE/api/vip/permanent/:viewerIdRemove permanent VIP status

Ignore Lists

MethodPathDescription
GET/api/ignore-listsList all ignore list entries
POST/api/ignore-listsAdd a user to the ignore list
DELETE/api/ignore-lists/:idRemove an entry from the ignore list

Events

MethodPathDescription
GET/api/eventsList all events. Query: ?status=active|draft|paused|ended
POST/api/eventsCreate a new event
GET/api/events/:idGet event details
PATCH/api/events/:idUpdate event configuration
POST/api/events/:id/startStart an event
POST/api/events/:id/pausePause a running event
POST/api/events/:id/resumeResume a paused event
POST/api/events/:id/endEnd an event
POST/api/events/:id/recalculateRecalculate event data and contributions

Event Power Hours

MethodPathDescription
GET/api/events/:id/power-hoursList power hours for an event
POST/api/events/:id/power-hoursCreate a power hour for an event
POST/api/events/:id/power-hours/:phId/activateActivate a scheduled power hour
POST/api/events/:id/power-hours/:phId/deactivateDeactivate a power hour

Event Goals

MethodPathDescription
GET/api/events/:id/goalsList goals for an event
POST/api/events/:id/goalsCreate a goal for an event
PATCH/api/events/:id/goals/:goalIdUpdate an event goal
DELETE/api/events/:id/goals/:goalIdDelete an event goal

Event Contributions

MethodPathDescription
GET/api/events/:id/contributionsList contributions for an event (paginated). Query: ?page=1&limit=50
POST/api/events/:id/contributionsAdd a manual contribution to an event

Challenges

MethodPathDescription
GET/api/challengesList community challenges. Query: ?status=active|draft|completed|expired
POST/api/challengesCreate a new challenge
PATCH/api/challenges/:idUpdate a challenge
DELETE/api/challenges/:idDelete a challenge

Achievements

MethodPathDescription
GET/api/achievementsList achievements for your workspace
POST/api/achievementsCreate an achievement
PATCH/api/achievementsUpdate an achievement
DELETE/api/achievementsDelete an achievement

Data Import

MethodPathDescription
POST/api/import/csvImport viewer data from parsed CSV rows. Body: { "rows": [...] }
GET/api/import/templateDownload CSV import template

Community Wheel

MethodPathDescription
GET/api/community-wheel/sessionsList wheel sessions
POST/api/community-wheel/sessionsCreate a wheel session
GET/api/community-wheel/historyList wheel history
POST/api/community-wheel/sessions/:id/spinTrigger a spin
POST/api/community-wheel/sessions/:id/grant-prizeGrant selected prize outcome

Recaps

MethodPathDescription
GET/api/recapsList recap records for your workspace
GET/api/recaps/:idGet recap details with stats and narrative

Settings

MethodPathDescription
GET/api/settingsGet all tenant settings
PATCH/api/settingsUpdate settings. Body: { "settings": [{ "key": "...", "value": "..." }] }

Team

MethodPathDescription
GET/api/teamList team members
POST/api/team/inviteSend a team invitation. Body: { "email": "...", "role": "admin|moderator|viewer" }
DELETE/api/team/:userIdRemove a team member
PATCH/api/team/:userId/roleChange a team member's role (owner only). Body: { "role": "admin|moderator|viewer" }

Tips

  • Use pagination parameters (page, limit) on list endpoints to avoid large payloads.
  • Store your API key securely — never expose it in client-side code or public repositories.
  • Use the search endpoints for viewer lookups instead of listing all viewers.
  • When automating event management, check the event status field before issuing start/pause/resume/end commands.
  • If you need help or encounter issues, contact support from your dashboard.