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.
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.
AgenticEye supports event-driven integration with the following Ring camera families through the Ring Cloud API.
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.
Follow these steps to connect your Ring cameras to AgenticEye through the Ring Cloud API.
Install the unofficial Ring client library that provides access to Ring's cloud API. This library handles authentication, token refresh, and device communication.
# Install the ring-client-api package
npm install ring-client-api
# Or using Python (ring-doorbell library)
pip install ring-doorbell
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.
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
}
);
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()
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.
// 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}%`);
});
{
"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
}
}
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.
// 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'
});
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.
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
});
Key API endpoints used during integration. All requests require a valid OAuth token in the Authorization header.
# 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.
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.
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.
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.
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 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.
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.
Our integration team can help you set up cloud-based Ring camera connections and optimize event-driven monitoring.
Contact Our Integration Team