The Samsara Python library provides convenient access to the Samsara API from Python.
- Requirements
- Documentation
- Installation
- Quick Start
- Features
- Usage
- Webhook Signature Verification
- Advanced
- AWS Lambda / Serverless
- Examples
- Troubleshooting
- Contributing
- Python 3.7+
- A Samsara account with API access
- An API token (available from your Samsara Dashboard > Settings > Developer > API Tokens)
API reference documentation is available here.
pip install samsara-apiGet started with the Samsara SDK in just a few lines of code:
from samsara import Samsara
# Initialize the client with your API token
client = Samsara(
token="YOUR_TOKEN", # Get your token at https://cloud.samsara.com/settings/api-tokens
)
# Get your organization information
org_info = client.organization_info.get_organization_info()
print(f"Organization: {org_info.data.name}")
# List all vehicles in your fleet
vehicles = client.vehicles.list()
for vehicle in vehicles:
print(f"Vehicle: {vehicle.name} (ID: {vehicle.id})")
# Get specific vehicle details
vehicle = client.vehicles.get(id="YOUR_VEHICLE_ID")
print(f"Vehicle VIN: {vehicle.data.vin}")For more detailed examples, see the Examples section.
The Samsara Python SDK provides:
- Type Safety: Full type hints for better IDE support and autocomplete
- Automatic Pagination: Seamlessly iterate through large result sets
- Async Support: Both synchronous and asynchronous clients
- Smart Retries: Automatic retry logic with exponential backoff
- Error Handling: Comprehensive exception handling for all API errors
- Webhook Verification: Built-in utilities for webhook signature validation
- Raw Response Access: Get headers and raw response data when needed
- Flexible Configuration: Customize timeouts, retries, and HTTP clients
A full reference for this library is available here.
Instantiate and use the client with the following:
from samsara import Samsara
client = Samsara(
token="YOUR_TOKEN",
)
# The SDK handles pagination automatically - just iterate through results
response = client.vehicles.list()
for item in response:
print(item) # Process each vehicle stat
# Alternatively, you can paginate page-by-page for more control
for page in response.iter_pages():
print(f"Processing page with {len(page.items)} items")
for item in page.items:
print(item)The SDK also exports an async client so that you can make non-blocking calls to our API.
import asyncio
from samsara import AsyncSamsara
client = AsyncSamsara(
token="YOUR_TOKEN",
)
async def main() -> None:
# The SDK handles pagination automatically - just iterate through results
response = await client.vehicles.list()
async for item in response:
print(item) # Process each vehicle stat
# Alternatively, you can paginate page-by-page for more control
async for page in response.iter_pages():
print(f"Processing page with {len(page.items)} items")
for item in page.items:
print(item)
asyncio.run(main())When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error will be thrown.
from samsara.core.api_error import ApiError
try:
client.vehicles.list()
except ApiError as e:
print(f"API Error: {e.status_code}")
print(f"Response: {e.body}")Paginated requests will return a SyncPager or AsyncPager, which can be used as iterators for the underlying objects.
from samsara import Samsara
client = Samsara(
token="YOUR_TOKEN",
)
# Automatic pagination - SDK fetches pages as needed
response = client.addresses.list()
for address in response:
print(f"Address: {address.formatted_address}")
# Manual page-by-page iteration for more control
response = client.addresses.list()
for page in response.iter_pages():
print(f"Page contains {len(page.items)} addresses")
for address in page.items:
print(f" - {address.formatted_address}")The SDK provides utility methods that allow you to verify webhook signatures and ensure that all webhook events originate from Samsara. This is a critical security measure to validate that incoming webhook requests are authentic.
- Configure webhooks in your Samsara Dashboard > Settings > Developer > Webhooks
- Note your webhook signature key (used for verification)
- Specify the notification URL where Samsara will send events
from samsara.utils.webhooks_helper import verify_signature
# In your webhook endpoint handler (e.g., Flask, FastAPI)
def webhook_handler(request):
# Verify the webhook signature
is_valid = verify_signature(
request_body=request.body, # Raw request body as string
signature_header=request.headers['x-samsara-signature'],
signature_key="YOUR_SIGNATURE_KEY", # From Samsara Dashboard
notification_url="https://example.com/webhook", # Your webhook URL
)
if not is_valid:
return {"error": "Invalid signature"}, 401
# Process the webhook event
event_data = request.json()
print(f"Received event: {event_data['eventType']}")
return {"status": "success"}, 200from flask import Flask, request, jsonify
from samsara.utils.webhooks_helper import verify_signature
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def samsara_webhook():
# Verify signature
is_valid = verify_signature(
request_body=request.get_data(as_text=True),
signature_header=request.headers.get('x-samsara-signature'),
signature_key="YOUR_SIGNATURE_KEY",
notification_url="https://yourdomain.com/webhook",
)
if not is_valid:
return jsonify({"error": "Invalid signature"}), 401
# Handle the event
event = request.get_json()
print(f"Event type: {event.get('eventType')}")
return jsonify({"status": "received"}), 200The SDK provides access to raw response data, including headers, through the .with_raw_response property.
The .with_raw_response property returns a "raw" client that can be used to access the .headers and .data attributes.
from samsara import Samsara
client = Samsara(
...,
)
response = client.vehicles.with_raw_response.list(...)
print(response.headers) # access the response headers
print(response.data) # access the underlying object
pager = client.addresses.list(...)
print(pager.response.headers) # access the response headers for the first page
for item in pager:
print(item) # access the underlying object(s)
for page in pager.iter_pages():
print(page.response.headers) # access the response headers for each page
for item in page:
print(item) # access the underlying object(s)The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long as the request is deemed retryable and the number of retry attempts has not grown larger than the configured retry limit (default: 2).
A request is deemed retryable when any of the following HTTP status codes is returned:
Use the max_retries request option to configure this behavior.
client.vehicles.list(..., request_options={
"max_retries": 1
})The SDK defaults to a 60 second timeout. You can configure this with a timeout option at the client or request level.
from samsara import Samsara
client = Samsara(
...,
timeout=20.0,
)
# Override timeout for a specific method
client.vehicles.list(..., request_options={
"timeout_in_seconds": 1
})You can override the httpx client to customize it for your use-case. Some common use-cases include support for proxies
and transports.
import httpx
from samsara import Samsara
client = Samsara(
...,
httpx_client=httpx.Client(
proxies="http://my.test.proxy.example.com",
transport=httpx.HTTPTransport(local_address="0.0.0.0"),
),
)Track your fleet in real-time by fetching current vehicle locations:
from samsara import Samsara
from datetime import datetime, timedelta
client = Samsara(token="YOUR_TOKEN")
# Get current locations for all vehicles
locations = client.vehicle_locations.get_vehicle_locations()
for vehicle_data in locations.data:
print(f"Vehicle {vehicle_data.name}: {vehicle_data.location.latitude}, {vehicle_data.location.longitude}")
print(f" Speed: {vehicle_data.location.speed} mph")
print(f" Time: {vehicle_data.location.time}")Check driver HOS status to ensure compliance:
from samsara import Samsara
client = Samsara(token="YOUR_TOKEN")
# List all drivers
drivers = client.drivers.list()
for driver in drivers:
print(f"Driver: {driver.name}")
# Get HOS logs for a specific driver
hos_logs = client.hours_of_service.get_hos_logs(driver_ids=[driver.id])
for hos_log in hos_logs.data:
for log in hos_log.hos_logs:
print(f" Status: {log.hos_status_type} at {log.log_start_time}")Track vehicle health and maintenance schedules:
from samsara import Samsara
client = Samsara(token="YOUR_TOKEN")
# Get vehicle stats including engine hours and odometer
stats = client.vehicles.list()
for stat in stats:
print(f"Vehicle: {stat.name}")
print(f" Engine Hours: {stat.engine_hours}")
print(f" Odometer: {stat.odometer_meters / 1609.34:.1f} miles")
# List maintenance issues
issues = client.issues.list()
for issue in issues:
print(f"Issue: {issue.type} - {issue.description}")
print(f" Vehicle: {issue.vehicle.name}")
print(f" Severity: {issue.severity}")Analyze past trips for reporting and optimization:
from samsara import Samsara
from datetime import datetime, timedelta
client = Samsara(token="YOUR_TOKEN")
# Get trips from the last 7 days
end_time = datetime.now()
start_time = end_time - timedelta(days=7)
trips = client.trips.list(
start_time=start_time.isoformat(),
end_time=end_time.isoformat()
)
total_distance = 0
for trip in trips:
print(f"Trip: {trip.start_location} -> {trip.end_location}")
print(f" Distance: {trip.distance_meters / 1609.34:.1f} miles")
print(f" Duration: {trip.duration_ms / 60000:.1f} minutes")
total_distance += trip.distance_meters
print(f"\nTotal distance traveled: {total_distance / 1609.34:.1f} miles")Organize and filter your fleet using tags:
from samsara import Samsara
client = Samsara(token="YOUR_TOKEN")
# List all tags (vehicle groups)
tags = client.tags.list()
for tag in tags:
print(f"Tag: {tag.name}")
print(f" Vehicles: {len(tag.vehicles)}")
# Get vehicles with a specific tag
tag_id = "YOUR_TAG_ID"
vehicles = client.vehicles.list(tag_ids=[tag_id])
for vehicle in vehicles:
print(f" - {vehicle.name}")Process multiple API calls concurrently for better performance:
import asyncio
from samsara import AsyncSamsara
async def get_fleet_summary():
client = AsyncSamsara(token="YOUR_TOKEN")
# Fetch multiple resources concurrently
vehicles_task = client.vehicles.list()
drivers_task = client.drivers.list()
assets_task = client.assets.list()
# Wait for all requests to complete
vehicles = []
async for vehicle in vehicles_task:
vehicles.append(vehicle)
drivers = []
async for driver in drivers_task:
drivers.append(driver)
assets = []
async for asset in assets_task:
assets.append(asset)
print(f"Fleet Summary:")
print(f" Vehicles: {len(vehicles)}")
print(f" Drivers: {len(drivers)}")
print(f" Assets: {len(assets)}")
asyncio.run(get_fleet_summary())The Samsara SDK works seamlessly in serverless environments like AWS Lambda. Here's how to set it up:
The SDK can be packaged as a Lambda Layer for reuse across multiple functions:
# Create a directory for the layer
mkdir -p python/lib/python3.9/site-packages
# Install the SDK and dependencies
pip install samsara-api -t python/lib/python3.9/site-packages
# Create a zip file
zip -r samsara-layer.zip pythonimport json
from samsara import Samsara
def lambda_handler(event, context):
# Initialize client (API token from environment variable)
import os
client = Samsara(token=os.environ['SAMSARA_API_TOKEN'])
# Get vehicle locations
locations = client.vehicle_locations.list()
result = []
for location in locations:
result.append({
'name': location.name,
'latitude': location.latitude,
'longitude': location.longitude,
'speed': location.speed_miles_per_hour
})
return {
'statusCode': 200,
'body': json.dumps(result)
}- Memory: Allocate at least 256 MB for optimal performance
- Timeout: Set timeout to 30+ seconds for API calls with pagination
- Environment Variables: Store your API token in
SAMSARA_API_TOKEN - VPC: Not required unless you need to access private resources
- Cold Starts: The SDK initializes quickly, but consider using provisioned concurrency for time-sensitive applications
Problem: 401 Unauthorized errors
Solution:
- Verify your API token is correct
- Check that the token hasn't expired
- Ensure the token has the necessary permissions for the endpoints you're accessing
- Get your token from Samsara Dashboard → API Tokens
Problem: 429 Too Many Requests errors
Solution:
- The SDK automatically retries with exponential backoff
- Reduce request frequency or implement batching
- Contact Samsara support to increase your rate limits
- Use pagination to fetch data in smaller chunks
Problem: Requests timing out
Solution:
# Increase timeout at client level
client = Samsara(token="YOUR_TOKEN", timeout=120.0)
# Or per request
client.vehicles.list(request_options={"timeout_in_seconds": 60})Problem: SSL verification failures
Solution:
import httpx
from samsara import Samsara
# For corporate proxies or custom certificates
client = Samsara(
token="YOUR_TOKEN",
httpx_client=httpx.Client(verify=False) # Not recommended for production
)Problem: ModuleNotFoundError: No module named 'samsara'
Solution:
# Ensure the package is installed
pip install samsara-api
# Verify installation
pip show samsara-api
# Check Python version (requires 3.7+)
python --versionProblem: Not all results are returned
Solution:
# Always iterate through the pager object
response = client.vehicles.list()
all_vehicles = []
for vehicle in response: # This automatically handles pagination
all_vehicles.append(vehicle)
print(f"Total vehicles: {len(all_vehicles)}")Problem: IDE not showing autocomplete
Solution:
- Ensure you're using Python 3.7+
- Update your IDE's Python language server
- The SDK includes full type hints via
py.typed - Try restarting your IDE or Python language server
While we value open-source contributions to this SDK, this library is generated programmatically. Additions made directly to this library would have to be moved over to our generation code, otherwise they would be overwritten upon the next generated release. Feel free to open a PR as a proof of concept, but know that we will not be able to merge it as-is. We suggest opening an issue first to discuss with us!
On the other hand, contributions to the README are always very welcome!