Getting Started with the Senturo Reporting API
Connect Your Own Reporting Tools Directly to Your Senturo Device Data
Overview
The Senturo Reporting API lets you pull your device fleet data directly into your own tools. Instead of exporting from the dashboard, you can query your devices, their location history, network connections, notes, and geofence activity over HTTPS, and feed the results into a spreadsheet, a business intelligence tool, an asset management system, or a scheduled script.
This article covers everything you need to make your first successful request: how to obtain a token, how to authenticate, and the four conventions that govern every endpoint — pagination, date filtering, rate limits, and error handling. Once you are comfortable with these, the Senturo Reporting API Endpoint Reference documents each endpoint in full.
The API is read-only. Every request uses GET, and no endpoint creates, modifies, or deletes anything in your Senturo account. It is a reporting surface, not a management interface, so device actions and configuration changes are still performed in the Senturo dashboard.
You do not need to be a developer to use it. Any tool that can make an HTTP request with a header — including Microsoft Excel's Power Query, Power BI, Google Sheets with a script, or a command-line tool such as curl — can retrieve data from the Reporting API.
What the Reporting API Covers
| Data | Available | Notes |
|---|---|---|
| Device inventory | Yes | Serial, name, platform, status, assignee, enrollment date, last check-in, last known location |
| Location history | Yes | Full recorded location history per device, with coordinates and timestamps |
| Network history | Yes | Recorded network connections and external IP addresses per device |
| Device notes | Yes | Notes and their type, author, and timestamps, per device or across the fleet |
| Geofence evaluation | Yes | Whether devices were inside or outside their geofences during a period |
| Security Policy Automations | No | Configure and review in the Senturo dashboard |
| Broadcasts | No | Configure and review in the Senturo dashboard |
| Users, roles, and permissions | No | Manage in Account Settings |
| Groups and tags | No | Manage in the Senturo dashboard |
| Creating or editing geofences | No | The API evaluates existing geofences but cannot create or change them |
| Screenshots | No | Available in the device details panel |
| Remote actions | No | Lock, wipe, and status changes are performed in the Senturo dashboard |
Requesting Your ReportToken
Access to the Reporting API is controlled by a ReportToken, which Senturo issues for your organization.
To request a token, contact support@senturo.com from an email address associated with your Senturo account. Include your organization name and let the team know you are requesting Reporting API access.
Your token identifies your organization and grants read access to your data, so treat it like a password:
- Store it in a secrets manager, an environment variable, or your reporting tool's credential store.
- Do not commit it to a code repository, paste it into a shared document, or include it in a screenshot.
If your token is exposed, contact support@senturo.com and request a replacement. Senturo will regenerate the token for your organization. The previous token stops working once it has been regenerated, so update any systems that use it.
Making Your First Request
All requests share the same base URL:
https://api.senturo.com/api/report/v1
Your token goes in the Authorization header, prefixed with ReportToken and a single space:
Authorization: ReportToken your_token_here
The following request returns the first device in your organization. Replace your_token_here with your own token:
curl -H "Authorization: ReportToken your_token_here" "https://api.senturo.com/api/report/v1/devices/?page_size=1"
A successful response looks like this:
json{ "count": 248, "next": "https://api.senturo.com/api/report/v1/devices/?page=2&page_size=1", "previous": null, "record_exists": true, "results": [ { "serial": "ABC1234XYZ", "name": "LIBRARY-07", "platform": "windows", "device_status": "monitored", "assignee_name": "Jane Doe", "assignee_email": "jdoe@example.com", "created_on": "2026-03-01T10:34:34.164748-04:00", "last_seen": "2026-09-08T15:22:17.844800-04:00", "postal_code": "05401-1234", "geofence_status": [ { "name": "Main Campus", "inside": true } ], "last_location": 1053972397, "location_link": "https://www.google.com/maps/search/?api=1&query=44.47,-73.21", "os_version": "10.0.19045.0" } ] }
The count field tells you how many devices are in your organization in total. The results array holds the records for this page.
The trailing slash is required.
/devices/works;/devicesreturns a404and is not redirected. Every path in this API ends with a slash, including paths that end in an identifier.
Prefer to explore interactively? The live API specification at https://api.senturo.com/api/report/swagger/ lists every endpoint and includes a Try it out panel. Click on Authorize, enter
ReportToken your_token_here, and you can run requests directly from your browser.
Authentication
Every request requires the Authorization header. If authentication fails, the API returns a 401 with a message describing what went wrong:
| What you sent | Response |
|---|---|
No Authorization header |
{"detail":"Authentication credentials were not provided."} |
ReportToken with no token after it |
{"detail":"Invalid token header. No credentials provided."} |
The token with no ReportToken prefix |
{"detail":"Authentication credentials were not provided."} |
A different prefix, such as Bearer |
{"detail":"Authentication credentials were not provided."} |
ReportToken with an incorrect token |
{"detail":"Invalid token."} |
Check your prefix first. Sending the token with the wrong prefix, or with no prefix at all, produces the same message as sending no credentials whatsoever. If you are certain your token is correct but still receive "Authentication credentials were not provided", the prefix is the most likely cause.
Working With Dates
Every date parameter accepts ISO 8601 values. Always include the UTC offset for your account's timezone:
2026-09-01T00:00:00-04:00
Values without an offset are accepted, and so is a date on its own such as 2026-09-01, but a value without an offset may be interpreted in a different timezone than you intend. This shifts your results by several hours without any error being returned. Including the offset removes the ambiguity.
Default Date Ranges
Two endpoints apply a default date range when you do not supply one:
| Endpoint | Default range when no dates are supplied |
|---|---|
| Location history | The most recent 30 days |
| Geofence evaluation | The most recent 7 days |
This is the most important behaviour to understand before you build anything. A request without dates returns a
200and acountthat looks perfectly reasonable, with no indication that older records exist. A device that has not reported a location in the last 30 days returns zero location records, even when months of history are available. Supplying any date filter removes the default and gives you access to the device's full history.
On the geofence endpoint, timestamp_start and timestamp_end are honoured only as a pair. Supplying one without the other has no effect and the 7-day default applies instead.
Pagination
Endpoints that return lists wrap their results in a consistent structure:
| Field | Description |
|---|---|
count |
Total number of records matching your request, across all pages |
next |
Absolute URL of the next page, or null on the last page |
previous |
Absolute URL of the previous page, or null on the first page |
record_exists |
false when no records matched your request |
results |
The records for the current page |
Control paging with page and page_size:
page_sizedefaults to 20 and is capped at 100. Requesting more returns 100 records.- An invalid
page_sizesuch as0or a non-numeric value falls back to 20 rather than returning an error. - Requesting a page past the end of the results returns a
404with the messageInvalid page.
The reliable way to retrieve a complete set is to request the first page and follow next until it returns null. Each next value is a complete URL you can request as-is.
import urllib.request, json url = "https://api.senturo.com/api/report/v1/devices/?page_size=100" headers = {"Authorization": "ReportToken your_token_here"} devices = [] while url: request = urllib.request.Request(url, headers=headers) with urllib.request.urlopen(request, timeout=60) as response: page = json.load(response) devices.extend(page["results"]) url = page["next"] print(f"Retrieved {len(devices)} devices")
A fleet of 1,000 devices takes ten requests using this approach, comfortably within the rate limit.
Rate Limits
The API allows 120 requests per minute per token, measured on a rolling window and applied across all endpoints combined. Requests beyond that limit return a 429:
{"detail":"Request was throttled. Expected available in 60 seconds."}
A 429 response includes a Retry-After header giving the number of seconds to wait. Pause for that period and retry rather than continuing to send requests, since further requests during the window are also rejected.
For scheduled reports, spacing requests slightly keeps you well clear of the limit. Retrieving a 1,000-device fleet along with location history for each device is a few hundred requests, which is comfortable if spread over a few minutes.
Response Codes
| Code | Meaning |
|---|---|
200 |
Success |
400 |
A parameter value was rejected. The response body names the parameter and the valid options |
401 |
Authentication failed. See the authentication table above |
404 |
The record was not found, the page is beyond the end of the results, or the path is missing its trailing slash |
429 |
Rate limit exceeded. Wait for the period given in Retry-After |
Unrecognised parameters are ignored, not rejected. A misspelled filter name returns a
200with unfiltered results rather than an error, which can look like a filter that is not working. Check spelling against the endpoint reference if a filter appears to have no effect.
Troubleshooting
"Authentication credentials were not provided" but the token is correct: The Authorization header must read ReportToken followed by a space and then the token. A missing prefix, or a different prefix such as Bearer, produces this message. If the prefix is right and the message is Invalid token. instead, the token itself is not being recognised — contact support at support@senturo.com to confirm it is still active.
A device returns no location history, but Senturo shows location data for it: Location history returns only the most recent 30 days unless you supply a date filter. Add received_after with the date you want to start from, and the device's full history becomes available.
A request returns a 404 that should succeed: Confirm the path ends with a trailing slash. Paths without one return a 404 and are not redirected.
A filter appears to have no effect: Unrecognised query parameters are ignored rather than rejected, so a misspelled parameter name returns unfiltered results with a 200. Check the spelling against the endpoint reference.
A geofence request covers a shorter period than requested: Check that both timestamp_start and timestamp_end are present. If only one is supplied it is ignored and the default 7-day window applies.
The first request to an endpoint times out: The first location history request for a device with extensive history can take up to a minute while the total record count is calculated. Later requests are fast. Set your client timeout to at least 60 seconds.
Results are shifted by several hours: Date values without a UTC offset may be interpreted in a different timezone than intended. Add the offset for your account's timezone to every date parameter.
Conclusion
With a ReportToken and the conventions above, you can retrieve any of your fleet data programmatically and keep your own reporting up to date without manual exports. The two behaviours worth committing to memory are the trailing slash on every path and the default date ranges on location history and geofence evaluation — between them they account for most unexpected results.
For the full detail of every endpoint and field, see the Senturo Reporting API Endpoint Reference. For ready-made reports covering device audits, recovery workflows, and geofence activity, see Senturo Reporting API: Example Reports and Use Cases. To request a token, have one regenerated, or ask about behaviour not covered here, contact support at support@senturo.com.
FAQs
Q: Can I use the API to lock a device, change its status, or send a broadcast? A: No. The Reporting API is read-only and every endpoint uses GET. Device actions and configuration changes are performed in the Senturo dashboard.
Q: Do I need a developer to use this? A: Not necessarily. Any tool that can make an HTTP request with a header can retrieve data, including Power BI, Excel's Power Query, and Google Sheets with a script. The examples in these articles use curl and Python because they are the clearest to read, but the requests themselves are simple.
Q: How many tokens can my organization have? A: Tokens are issued per organization. If you need access for more than one system, use the same token in each rather than requesting several, and store it separately in each system's credential store.
Q: Does the API count against any dashboard limits, or affect my devices? A: No. Requests only read data that Senturo has already collected. Nothing is sent to your devices, and device behaviour is unaffected.
Q: Why does a device show a recent check-in but return no location records? A: Checking in and reporting location are separate. A device can be connected and reporting its status while location services are unavailable on it. Also confirm you are supplying a date filter, since location history returns only the most recent 30 days by default.
Q: Which timezone should I use in date filters? A: Always include an explicit UTC offset, such as 2026-09-01T00:00:00-04:00. Values without an offset are accepted but may be interpreted differently than you expect, silently shifting your results.