Features Verticals Cameras Conferences Pricing Contact Log In Get Started
Integration Guide

Connect Ring Cameras to AgenticEye

Integrate Ring Video Doorbell, Stick Up Cam, Floodlight Cam, and Spotlight Cam through the Ring Cloud API for intelligent AI-powered monitoring and event analysis.

Cloud API REST API RTSP ONVIF

Important: Ring does not offer official local RTSP streaming or ONVIF support. All integration works through cloud-based snapshots, event clips, and the unofficial Ring API. Live streaming is limited to cloud relay. Your Ring account credentials and 2FA token are required for authentication.

Compatible Ring Cameras

AgenticEye supports event-driven integration with the following Ring camera families through the Ring Cloud API.

Ring Video Doorbell
Doorbell 4, Doorbell Pro 2, Doorbell Wired
Ring Stick Up Cam
Battery, Plug-In, Solar, Elite
Ring Floodlight Cam
Wired Plus, Wired Pro
Ring Spotlight Cam
Battery, Plus, Pro

Prerequisites

Requirements

  • Active Ring account with a Ring Protect subscription (Basic or Plus)
  • Ring cameras set up and online via the Ring app
  • Two-factor authentication (2FA) enabled on your Ring account
  • AgenticEye platform account with API integration tier or higher
  • Python 3.8+ or Node.js 16+ for running the integration scripts
  • Network access to Ring cloud services (no local network access required)

Ring Protect Plan Required: Without an active Ring Protect subscription, event history and video clips are not stored and cannot be retrieved via the API. Ensure your plan is active before proceeding.

Step-by-Step Integration Guide

Follow these steps to connect your Ring cameras to AgenticEye through the Ring Cloud API.

Install the Ring API Client

Install the unofficial Ring client library that provides access to Ring's cloud API. This library handles authentication, token refresh, and device communication.

Terminal — Install via npm # Install the ring-client-api package npm install ring-client-api # Or using Python (ring-doorbell library) pip install ring-doorbell

Authenticate with Ring (2FA Required)

Ring requires two-factor authentication for all API access. You will need to generate a refresh token by completing the 2FA challenge once. This token can then be reused for subsequent requests.

JavaScript — Initial Authentication import { RingApi } from 'ring-client-api'; // First-time auth: this will prompt for 2FA code const ringApi = new RingApi({ email: '[email protected]', password: 'your-ring-password', }); // After 2FA verification, save the refresh token ringApi.onRefreshTokenUpdated.subscribe( ({ newRefreshToken }) => { console.log('Refresh Token:', newRefreshToken); // Store this securely — use it for all future auth } );
Python — Authentication with ring-doorbell from ring_doorbell import Ring, Auth from oauthlib.oauth2 import MobileApplicationClient def otp_callback(): return input("Enter 2FA code: ") auth = Auth( "YourUserAgent/1.0", json.loads(token_cache), # Load cached token if available token_updated ) auth.fetch_token(username, password, otp_callback) ring = Ring(auth) ring.update_data()

Retrieve Devices and Camera List

Once authenticated, query the Ring API to get a list of all cameras and doorbells associated with your account. Each device has a unique ID used for subsequent API calls.

JavaScript — List All Cameras // Use refresh token for subsequent connections const ringApi = new RingApi({ refreshToken: 'your-saved-refresh-token', cameraStatusPollingSeconds: 20, }); const cameras = await ringApi.getCameras(); cameras.forEach(camera => { console.log(`Device: ${camera.name}`); console.log(` ID: ${camera.id}`); console.log(` Model: ${camera.model}`); console.log(` Battery: ${camera.batteryLevel}%`); });
API Response — Device Object { "id": 123456789, "description": "Front Door", "device_id": "abcdef1234", "kind": "doorbell_v5", "firmware_version": "1.18.82", "ring_net_id": null, "features": { "motions_enabled": true, "show_recordings": true }, "health": { "firmware": "Up to Date", "rssi": -48 } }

Configure Snapshot and Event Capture

Set up periodic snapshot retrieval and event-based clip downloads. Ring cameras generate events for motion detection and doorbell presses, each with an associated video clip.

JavaScript — Capture Snapshots and Events // Get latest snapshot from a camera const camera = cameras[0]; const snapshot = await camera.getSnapshot(); fs.writeFileSync('snapshot.jpg', snapshot); // Subscribe to motion and doorbell events camera.onMotionDetected.subscribe(motion => { console.log(`Motion detected on ${camera.name}`); // Fetch the event recording fetchEventRecording(camera); }); camera.onDoorbellPressed.subscribe(() => { console.log(`Doorbell pressed on ${camera.name}`); }); // Get event history (last 50 events) const events = await camera.getEvents({ limit: 50, kind: 'motion' // 'motion' | 'ding' | 'on_demand' });

Connect to AgenticEye

Forward the captured snapshots and event clips to AgenticEye for AI analysis. Use the AgenticEye ingestion API to push images and video clips with metadata.

JavaScript — Push to AgenticEye const AGENTICEYE_API = 'https://api.agenticeye.com/v1'; const API_KEY = 'your-agenticeye-api-key'; // Register Ring camera as a source const source = await fetch(`${AGENTICEYE_API}/sources`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ name: camera.name, type: 'ring_cloud', device_id: camera.id, capabilities: ['snapshot', 'event_clip', 'motion'] }) }); // Send snapshot for analysis const formData = new FormData(); formData.append('image', snapshot, 'snapshot.jpg'); formData.append('source_id', sourceId); formData.append('timestamp', new Date().toISOString()); await fetch(`${AGENTICEYE_API}/ingest/snapshot`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}` }, body: formData });

Ring API Endpoints

Key API endpoints used during integration. All requests require a valid OAuth token in the Authorization header.

Ring REST API — Key Endpoints # Base URL https://api.ring.com/clients_api/ # Get all devices (doorbells, cameras, chimes) GET /ring_devices Authorization: Bearer {oauth_token} # Get device health info GET /doorbots/{device_id}/health Authorization: Bearer {oauth_token} # Get event history for a device GET /doorbots/{device_id}/history?limit=50 Authorization: Bearer {oauth_token} # Get video recording URL for an event GET /dings/{ding_id}/recording Authorization: Bearer {oauth_token} # Request a new snapshot PUT /doorbots/{device_id}/snapshot Authorization: Bearer {oauth_token} # Get latest snapshot image GET /snapshots/image/{device_id} Authorization: Bearer {oauth_token}

Rate Limiting: The Ring API enforces rate limits. Excessive polling can temporarily lock your account. We recommend polling no more frequently than once every 20 seconds for snapshots and using event-based triggers rather than continuous polling.

Common Issues

2FA Authentication Failure

Ring requires two-factor authentication for all API sessions. If authentication fails, ensure 2FA is enabled in your Ring app under Account > Two-Step Verification. The 2FA code must be entered within 10 minutes of being sent. If using a saved refresh token and receiving 401 errors, your token has likely expired — re-authenticate with email and password to generate a new one.

API Rate Limits and Account Lockout

Aggressive polling triggers Ring's rate limiter, resulting in 429 Too Many Requests responses or temporary account suspension. Set snapshot polling to a minimum interval of 20 seconds. Use event subscriptions instead of polling where possible. If your account is locked, wait 15 minutes before retrying.

Cloud-Only Limitation — No Local Streaming

Ring cameras do not support RTSP or ONVIF. All video access goes through Ring's cloud servers, which means there is inherent latency (typically 2-5 seconds). Live view sessions are limited to approximately 10 minutes and must be reinitiated. For real-time monitoring, configure AgenticEye to use frequent snapshot polling combined with motion event triggers.

Snapshots Returning Stale Images

Ring caches the last snapshot on their servers. To get a fresh image, first send a PUT /doorbots/{id}/snapshot request, wait 2-3 seconds, then fetch the image with GET /snapshots/image/{id}. Battery-powered cameras may take longer to wake up and capture a new snapshot.

Event History Not Available

Event recordings require an active Ring Protect subscription. Without it, only live view is available (no stored clips or event history). Verify your subscription status in the Ring app. Also check that the camera has Video Recording enabled under device settings.

Refresh Token Invalidated

Ring periodically invalidates refresh tokens, especially after password changes or when logging in from a new device. Store the latest refresh token each time onRefreshTokenUpdated fires. Implement automatic re-authentication as a fallback in your integration script.

Need Help with Your Ring Integration?

Our integration team can help you set up cloud-based Ring camera connections and optimize event-driven monitoring.

Contact Our Integration Team