The imbrr API provides access to the latest device reading and flow event data. All endpoints require authentication via PHP session cookies.
https://www.imbrr.com/api/v1/
Returns the latest depth-to-water reading for a specific device.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Device ID (format: AABBCCDDEEFF) |
Returns JSON with the following structure:
{
"status": "success",
"id": "AABBCCDDEEFF",
"depth_to_water": 577.366,
"timestamp": "2025-06-27 14:30:25",
"reading_id": 628381,
"unique_id": 1751058571,
"flow_event_status": "completed",
"accumulated_gallons": 1.57
}
GET /api/v1/latest_depth/AABBCCDDEEFF
{
"status": "success",
"id": "AABBCCDDEEFF",
"depth_to_water": 45.2,
"timestamp": "2024-01-15 14:30:25",
"reading_id": 12345,
"unique_id": 67890,
"flow_event_status": "completed",
"accumulated_gallons": 125.5
}
The flow_event_status field indicates whether a flow event is currently in progress or has completed:
The accumulated_gallons field sums all gallons for the current unique_id:
{
"status": "failed",
"message": "User not authenticated"
}
{
"status": "failed",
"message": "id parameter is required"
}
{
"status": "failed",
"message": "Device not found"
}
{
"status": "failed",
"message": "You do not have access to this device"
}
Returns the latest flow event data for a specific device in CSV format. Downloads a CSV file with all readings from the most recent flow event.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Device ID (format: AABBCCDDEEFF) |
Returns CSV data with the following columns:
reading_id,pk_to_pk,psi,gain,flow,gallons,temp,depth_to_water,unique_id,hide_from_graph,atof_ups,atof_dns,dtof,timestamp,created
GET /api/v1/latest_flow_event/AABBCCDDEEFF
Error: User not authenticated
Error: id parameter is required
Error: Device not found
Error: You do not have access to this device
Returns comprehensive cistern statistics for a specific cistern device, including storage capacity, usage statistics, and sensor readings.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Device ID or MAC address (format: AABBCCDDEEFF or numeric device_id) |
Returns JSON with the following structure:
{
"status": "success",
"id": "AABBCCDDEEFF",
"storage_gallons": 1250.5,
"storage_percent": 75,
"24_hour_usage": 45.2,
"31_day_usage": 1250.8,
"last_temp": 68.5,
"last_pressure": 45.2,
"last_connected": "2024-01-15 14:30:25"
}
GET /api/v1/cistern_stats/AABBCCDDEEFF
{
"status": "success",
"id": "AABBCCDDEEFF",
"storage_gallons": 1250.5,
"storage_percent": 75,
"24_hour_usage": 45.2,
"31_day_usage": 1250.8,
"last_temp": 68.5,
"last_pressure": 45.2,
"last_connected": "2024-01-15 14:30:25"
}
{
"status": "failed",
"message": "User not authenticated"
}
{
"status": "failed",
"message": "id parameter is required"
}
{
"status": "failed",
"message": "This endpoint is only available for cistern devices"
}
{
"status": "failed",
"message": "Device not found"
}
{
"status": "failed",
"message": "You do not have access to this device"
}
All API endpoints require authentication. Users must be logged in through the login page before accessing the API.
API access is restricted to authenticated users only. Make sure you have a valid session before making API requests.
import requests
import json
import argparse
import sys
def main():
# Set up command line argument parsing
parser = argparse.ArgumentParser(description='imbrr API Client')
parser.add_argument('--email', required=True, help='Your email address')
parser.add_argument('--password', required=True, help='Your password')
parser.add_argument('--id', required=True, help='Device ID (format: AABBCCDDEEFF)')
parser.add_argument('--base-url', default='https://www.imbrr.com', help='Base URL (default: https://www.imbrr.com)')
args = parser.parse_args()
# Configuration
BASE_URL = args.base_url
LOGIN_URL = f"{BASE_URL}/login"
API_BASE = f"{BASE_URL}/api/v1"
# Create a session to maintain cookies
session = requests.Session()
# Login credentials from command line arguments
login_data = {
'email': args.email,
'password': args.password
}
# Step 1: Authenticate by logging in
print("Logging in...")
login_response = session.post(LOGIN_URL, data=login_data, allow_redirects=True)
# Check if login was successful (should redirect to dashboard)
if login_response.status_code == 200 and 'dashboard' in login_response.url:
print("Login successful! Redirected to dashboard.")
# Step 2: Get latest depth reading
device_id = args.id
depth_url = f"{API_BASE}/latest_depth/{device_id}"
print(f"Fetching latest depth for device {device_id}...")
depth_response = session.get(depth_url)
print(f"Depth response content: {depth_response.text[:500]}...") # First 500 chars
if depth_response.status_code == 200:
try:
depth_data = depth_response.json()
print("Latest Depth Reading:")
print(f" Depth to water: {depth_data['depth_to_water']}")
print(f" Timestamp: {depth_data['timestamp']}")
print(f" Flow event status: {depth_data['flow_event_status']}")
print(f" Accumulated gallons: {depth_data['accumulated_gallons']}")
except json.JSONDecodeError as e:
print(f"Error parsing JSON response: {e}")
print(f"Raw response: {depth_response.text}")
else:
print(f"Error getting depth data: {depth_response.status_code}")
print(depth_response.text)
# Step 3: Get latest flow event (CSV download)
flow_url = f"{API_BASE}/latest_flow_event/{device_id}"
print(f"Downloading latest flow event for device {device_id}...")
flow_response = session.get(flow_url)
print(f"Flow response status: {flow_response.status_code}")
if flow_response.status_code == 200:
# Save CSV to file
filename = f"flow_event_{device_id}.csv"
with open(filename, 'wb') as f:
f.write(flow_response.content)
print(f"Flow event data saved to {filename}")
else:
print(f"Error getting flow event data: {flow_response.status_code}")
print(flow_response.text)
else:
print(f"Login failed or unexpected redirect: {login_response.status_code}")
print(f"Final URL: {login_response.url}")
print(f"Response content: {login_response.text[:500]}...")
sys.exit(1)
if __name__ == "__main__":
main()
Usage:
python3 api_client.py --email your_email@example.com --password your_password --id AABBCCDDEEFF
import requests
import json
import argparse
import sys
def main():
# Set up command line argument parsing
parser = argparse.ArgumentParser(description='imbrr API Client - Cistern Stats')
parser.add_argument('--email', required=True, help='Your email address')
parser.add_argument('--password', required=True, help='Your password')
parser.add_argument('--id', required=True, help='Cistern Device ID (format: AABBCCDDEEFF)')
parser.add_argument('--base-url', default='https://www.imbrr.com', help='Base URL (default: https://www.imbrr.com)')
args = parser.parse_args()
# Configuration
BASE_URL = args.base_url
LOGIN_URL = f"{BASE_URL}/login"
API_BASE = f"{BASE_URL}/api/v1"
# Create a session to maintain cookies
session = requests.Session()
# Login credentials from command line arguments
login_data = {
'email': args.email,
'password': args.password
}
# Step 1: Authenticate by logging in
print("Logging in...")
login_response = session.post(LOGIN_URL, data=login_data, allow_redirects=True)
# Check if login was successful (should redirect to dashboard)
if login_response.status_code == 200 and 'dashboard' in login_response.url:
print("Login successful! Redirected to dashboard.")
# Step 2: Get cistern statistics
device_id = args.id
cistern_url = f"{API_BASE}/cistern_stats/{device_id}"
print(f"Fetching cistern statistics for device {device_id}...")
cistern_response = session.get(cistern_url)
if cistern_response.status_code == 200:
try:
cistern_data = cistern_response.json()
if cistern_data.get('status') == 'success':
print("\nCistern Statistics:")
print(f" Device ID: {cistern_data['id']}")
print(f" Storage: {cistern_data['storage_gallons']:.1f} gallons ({cistern_data['storage_percent']}% full)")
print(f" 24 Hour Usage: {cistern_data['24_hour_usage']:.1f} gallons")
print(f" 31 Day Usage: {cistern_data['31_day_usage']:.1f} gallons")
if cistern_data.get('last_temp'):
print(f" Last Temperature: {cistern_data['last_temp']:.1f}°F")
if cistern_data.get('last_pressure'):
print(f" Last Pressure: {cistern_data['last_pressure']:.1f} psi")
if cistern_data.get('last_connected'):
print(f" Last Connected: {cistern_data['last_connected']}")
else:
print(f"Error: {cistern_data.get('message', 'Unknown error')}")
except json.JSONDecodeError as e:
print(f"Error parsing JSON response: {e}")
print(f"Raw response: {cistern_response.text}")
else:
print(f"Error getting cistern stats: {cistern_response.status_code}")
try:
error_data = cistern_response.json()
print(f"Error message: {error_data.get('message', 'Unknown error')}")
except:
print(cistern_response.text)
else:
print(f"Login failed or unexpected redirect: {login_response.status_code}")
print(f"Final URL: {login_response.url}")
print(f"Response content: {login_response.text[:500]}...")
sys.exit(1)
if __name__ == "__main__":
main()
Usage:
python3 cistern_stats_client.py --email your_email@example.com --password your_password --id AABBCCDDEEFF
# Get latest depth reading
curl -X GET "https://www.imbrr.com/api/v1/latest_depth/AABBCCDDEEFF" \
-H "Cookie: PHPSESSID=your_session_id" \
-H "Content-Type: application/json"
# Get cistern statistics (for cistern devices only)
curl -X GET "https://www.imbrr.com/api/v1/cistern_stats/AABBCCDDEEFF" \
-H "Cookie: PHPSESSID=your_session_id" \
-H "Content-Type: application/json"