Integrate Arlo Pro 4, Pro 5, Ultra 2, and Essential series cameras through the Arlo Cloud API for intelligent event-based monitoring and AI-powered analytics.
Important: Arlo cameras do not support RTSP or ONVIF protocols. All integration is performed through Arlo's cloud API. An active Arlo Secure subscription is required to access video recordings and cloud features. Battery-powered models may have intermittent connectivity during sleep cycles.
AgenticEye supports event-driven integration with the following Arlo camera families through the Arlo Cloud API.
Battery Camera Considerations: Arlo's battery-powered cameras enter a sleep state between events to preserve battery life. They only wake and transmit when motion is detected. This means continuous streaming is not available — integration is event-driven by design. Wired power adapters are recommended for cameras requiring frequent monitoring.
Follow these steps to connect your Arlo cameras to AgenticEye through the Arlo Cloud API.
Install the Python library for accessing the Arlo cloud API. This handles authentication, session management, and device communication.
# Install the pyaarlo library for Arlo API access
pip install pyaarlo
# Alternative: install the arlo-connector package
pip install arlo-connector
# Required dependency for 2FA email-based tokens
pip install imapclient
Arlo requires 2FA for API access. You can use email-based or app-based 2FA. The library handles IMAP-based email token retrieval automatically if configured.
import pyaarlo
# Initialize with email-based 2FA
arlo = pyaarlo.PyArlo(
username="[email protected]",
password="your-arlo-password",
tfa_type="email",
tfa_source="imap",
tfa_host="imap.gmail.com",
tfa_username="[email protected]",
tfa_password="your-email-app-password",
synchronous_mode=True,
save_state=True,
state_file="/config/aarlo-state.json"
)
print(f"Connected. Found {len(arlo.cameras)} cameras")
Gmail Users: If using Gmail for email-based 2FA, you need to create an App Password in your Google Account settings. Standard passwords will not work due to Google's security policies.
Once authenticated, enumerate all cameras on your account and retrieve their current status, capabilities, and last known snapshot URL.
# List all cameras with their properties
for camera in arlo.cameras:
print(f"Camera: {camera.name}")
print(f" Device ID: {camera.device_id}")
print(f" Model: {camera.model_id}")
print(f" Battery: {camera.battery_level}%")
print(f" Signal: {camera.signal_strength}")
print(f" State: {camera.state}")
print(f" Last Image: {camera.last_image}")
# Get base station info
for base in arlo.base_stations:
print(f"Base Station: {base.name}")
print(f" Model: {base.model_id}")
print(f" Mode: {base.mode}")
{
"deviceId": "48B02D1A12345",
"deviceName": "Backyard Camera",
"deviceType": "camera",
"modelId": "VMC4060P",
"state": "provisioned",
"properties": {
"hwVersion": "H19",
"swVersion": "1.300.28.4",
"batteryLevel": 87,
"signalStrength": 4,
"brightness": 0,
"motionSensitivity": 80
}
}
Set up event listeners that capture snapshots when motion is detected. Arlo generates events that include a pre-signed URL for the video clip and a snapshot image.
import requests
import time
# Request a fresh snapshot from a specific camera
camera = arlo.cameras[0]
snapshot_url = camera.last_image
# Force a new snapshot (wakes battery cameras)
camera.request_snapshot()
time.sleep(5) # Allow time for camera to wake and capture
snapshot_url = camera.last_image
# Download the snapshot
if snapshot_url:
response = requests.get(snapshot_url)
with open("arlo_snapshot.jpg", "wb") as f:
f.write(response.content)
# Get recent recordings (requires Arlo Secure plan)
recordings = camera.last_n_videos(count=10)
for recording in recordings:
print(f"Recording: {recording.created_at}")
print(f" URL: {recording.video_url}")
print(f" Duration: {recording.duration}s")
Configure a persistent event listener that forwards motion events and snapshots to AgenticEye in real-time as they occur.
import json
import requests
AGENTICEYE_API = "https://api.agenticeye.com/v1"
API_KEY = "your-agenticeye-api-key"
def on_motion(camera, event):
"""Handle motion event from Arlo camera"""
print(f"Motion on {camera.name} at {event.timestamp}")
# Get snapshot from the event
snapshot_url = camera.last_image
# Forward to AgenticEye
payload = {
"source_id": camera.device_id,
"source_type": "arlo_cloud",
"event_type": "motion",
"timestamp": event.timestamp,
"snapshot_url": snapshot_url,
"metadata": {
"camera_name": camera.name,
"battery_level": camera.battery_level,
"model": camera.model_id
}
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(
f"{AGENTICEYE_API}/ingest/event",
headers=headers,
data=json.dumps(payload)
)
print(f"Sent to AgenticEye: {response.status_code}")
# Register event callbacks for all cameras
for camera in arlo.cameras:
camera.add_motion_callback(on_motion)
# Keep the event loop running
print("Listening for Arlo events... Press Ctrl+C to stop.")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Stopped.")
Key API endpoints used by the integration. These are called internally by the pyaarlo library but are documented here for reference.
# Base URL
https://myapi.arlo.com/hmsweb
# Authenticate and get session token
POST /login/v2
Content-Type: application/json
Body: {"email": "...", "password": "..."}
# Complete 2FA verification
POST /users/device/auth/validate
Authorization: {auth_token}
Body: {"code": "123456"}
# Get all devices
GET /users/devices
Authorization: {auth_token}
# Get library (recordings) for date range
POST /users/library
Authorization: {auth_token}
Body: {"dateFrom": "20260101", "dateTo": "20260312"}
# Get last snapshot URL for a camera
GET /users/devices/{deviceId}/snapshot
Authorization: {auth_token}
# Start stream (returns pre-signed streaming URL)
POST /users/devices/startStream
Authorization: {auth_token}
Body: {"deviceId": "...", "parentId": "..."}
# Set camera motion sensitivity
PUT /users/devices/{deviceId}/settings
Authorization: {auth_token}
Body: {"motionSensitivity": 80}
Arlo's battery-powered cameras sleep between events to conserve power. Snapshot requests may fail if the camera is in deep sleep. The wake-up process can take 3-8 seconds. For more reliable integration, use a wired power adapter or solar panel to keep cameras always-on. You can also reduce the camera's motionSensitivity to reduce false wakes while keeping it responsive.
All Arlo data flows through their cloud servers. Expect 2-8 seconds of latency between a motion event occurring and the snapshot becoming available via the API. This is inherent to the cloud-based architecture and cannot be eliminated. Configure AgenticEye's event processing pipeline with appropriate timeout values (minimum 10 seconds).
Without an active Arlo Secure subscription, recorded video clips are not available through the API. Only live snapshots will work. The last_n_videos() method will return empty results. Verify your subscription status at my.arlo.com under Plan settings.
Arlo sessions expire after extended periods of inactivity. If you receive 401 Unauthorized errors, the session token has expired. Enable save_state=True in the pyaarlo configuration to persist session state. Implement automatic re-authentication in your integration script to handle token expiration gracefully.
Older Arlo cameras (Pro 2, Pro 3) require a SmartHub or base station. If the base station goes offline, all connected cameras become unreachable. Check the base station's Ethernet connection and power supply. Newer models (Pro 4, Pro 5, Essential) connect directly to Wi-Fi and do not require a base station.
The Arlo API limits library (recording history) requests. Avoid querying large date ranges or making requests more frequently than once per minute. Use pagination and cache results locally. If you receive 429 errors, implement exponential backoff starting at 30 seconds.
Our integration team can help you set up cloud-based Arlo camera connections and optimize event-driven monitoring for battery-powered devices.
Contact Our Integration Team