Skip to main content
POST
/
live-monitor
curl -X POST https://vibestream-production-64f3.up.railway.app/live-monitor \
  -H "Content-Type: application/json" \
  -d '{
    "youtube_url": "https://youtube.com/watch?v=abc123",
    "condition": "Is there a traffic accident?",
    "webhook_url": "https://example.com/webhook",
    "interval_seconds": 15,
    "model": "gemini-2.0-flash"
  }'
{
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "running",
  "job_type": "live-monitor",
  "created_at": "2024-01-26T10:30:00Z",
  "youtube_url": "https://youtube.com/watch?v=abc123",
  "details": {
    "condition": "Is there a traffic accident?",
    "interval_seconds": 15,
    "model": "gemini-2.0-flash"
  }
}

Request

youtube_url
string
required
Live stream URL to monitor. Supports YouTube (youtube.com/watch?v=, youtu.be/) and Twitch (twitch.tv/channel) formats.
condition
string
required
Natural language condition to watch for. Be specific for better accuracy.Good: “Is it snowing? Look for falling snowflakes or white accumulation on surfaces.”Bad: “Snow?”
webhook_url
string
required
URL to receive webhook notifications when the condition is triggered.
interval_seconds
integer
default:"10"
How often to check the stream (5-300 seconds).
model
string
default:"gemini-2.5-flash"
VLM model to use. Options: gemini-2.5-flash, gemini-2.0-flash, gpt-4o-mini, gpt-4o
enable_prefilter
boolean
default:"true"
Enable motion + YOLO pre-filtering to reduce API costs.
skip_validation
boolean
default:"false"
Skip livestream validation if already validated by /validate-url. Use this to avoid redundant validation calls when pre-validating URLs in the frontend.

Response

job_id
string
Unique identifier for the job. Use this to check status or cancel.
status
string
Job status: pending, running, stopped, completed, failed
job_type
string
Always live-monitor for this endpoint.
created_at
string
ISO 8601 timestamp when the job was created.
youtube_url
string
The YouTube URL being monitored.
details
object
Job configuration and statistics.
curl -X POST https://vibestream-production-64f3.up.railway.app/live-monitor \
  -H "Content-Type: application/json" \
  -d '{
    "youtube_url": "https://youtube.com/watch?v=abc123",
    "condition": "Is there a traffic accident?",
    "webhook_url": "https://example.com/webhook",
    "interval_seconds": 15,
    "model": "gemini-2.0-flash"
  }'
{
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "running",
  "job_type": "live-monitor",
  "created_at": "2024-01-26T10:30:00Z",
  "youtube_url": "https://youtube.com/watch?v=abc123",
  "details": {
    "condition": "Is there a traffic accident?",
    "interval_seconds": 15,
    "model": "gemini-2.0-flash"
  }
}

Webhook Payload

When the condition is triggered, VibeStream sends a POST request to your webhook URL:
{
  "type": "live_monitor_triggered",
  "timestamp": "2024-01-26T10:35:00Z",
  "source_url": "https://youtube.com/watch?v=abc123",
  "data": {
    "condition": "Is there a traffic accident?",
    "triggered": true,
    "explanation": "A multi-car collision is visible on the highway. Emergency vehicles are responding.",
    "frame_b64": "base64-encoded-jpeg..."
  }
}
The frame_b64 field contains the actual frame that triggered the condition, useful for verification or logging.

Job Statistics

After running, check the job to see performance metrics:
curl https://vibestream-production-64f3.up.railway.app/jobs/YOUR_JOB_ID
{
  "job_id": "a1b2c3d4...",
  "status": "running",
  "details": {
    "checks_performed": 45,
    "triggers_fired": 3,
    "frames_skipped": 112
  }
}
  • checks_performed: Frames that hit the VLM
  • triggers_fired: Times the condition was true
  • frames_skipped: Frames filtered by pre-filter (cost savings!)