Hello @SFlee-2132 ,
Thank you for asking your question in our community. I appreciate your detailed description of your current setup this is a really common pain point and the good news is there is a purpose-built solution for exactly this. I did use an AI tool to put these references together. I am not a developer so if anything doesn't make sense I apologize for that and will be happy to bring in one of our developers to clear anything up.
The Root Cause
Your current approach — querying by date range with a rolling 48-hour overlap— pulls data based on event datetime (when the device recorded the data). The problem is that a device that was offline for hours or days will upload its backlog when it reconnects, and that data arrives at the server after your query window has already moved on. A wider overlap helps but can never fully close this gap.
The Right Approach: GetFeed with Persisted Version Tokens
GetFeed is designed to solve this exactly. Instead of asking "give me everything between date A and date B," it asks "give me everything the server received after this point in the stream." The key distinction: the version token tracks server-receipt order, not event datetime. When a device reconnects and uploads a backlog, that data gets a new version number and will appear in your next GetFeed call — no matter how old the event timestamps are.
How it works:
1. On your first call, pass fromVersion: "0" for a full historical backfill, or omit fromVersion to start from now.
2. The response includes a toVersion token.
3. Persist that token to durable storage immediately — before processing the data.
4. On every subsequent call, pass that toVersion as fromVersion. You receive only records that arrived since your last call.
5. Repeat indefinitely.
// First call
{ "method": "GetFeed", "params": { "typeName": "Trip", "fromVersion": "0",
"resultsLimit": 50000 } }
// Response includes toVersion — save it, then next call:
{ "method": "GetFeed", "params": { "typeName": "Trip", "fromVersion":
"<saved_toVersion>", "resultsLimit": 50000 } }
This covers all your data types: Trip, LogRecord, StatusData, FaultData, ExceptionEvent, DriverChange, and more.
Important Notes on Calculated Data
Trips and ExceptionEvents are calculated records — the server can update or regenerate them as late device data arrives. If a trip is revised (e.g., a driver ID is resolved after the fact), the updated record gets a new version number and will re-appear in your feed with the changes. Your pipeline should be prepared to upsert on record ID rather than insert-only.
One Caveat: fromDate vs fromVersion
The docs note that using fromDate is computationally expensive and is only intended as a one-time seed when you first set up the feed. After that, always use fromVersion. Do not mix the two approaches in steady state.
Polling Cadence
For near-real-time completeness, run your GetFeed calls continuously (or at short intervals). When a response returns a full page of results (resultsLimit records), call again immediately— there is more data. When a response returns fewer records than the limit, the feed is caught up and you can back off.
Summary
┌─────────────────────────────┬────────────────────────────────────────────┐
│ Current approach │ GetFeed approach │
├─────────────────────────────┼────────────────────────────────────────────┤
│ Date-range query, event │ Version-token query, server-receipt order │
│ datetime │ │
├─────────────────────────────┼────────────────────────────────────────────┤
│ Misses late-arriving │ Catches all data regardless of when device │
│ backlog data │ reconnected │
├─────────────────────────────┼────────────────────────────────────────────┤
│ Requires overlap heuristic │ No overlap needed — the token is the │
│ │ bookmark │
├─────────────────────────────┼────────────────────────────────────────────┤
│ Gap risk at month-end │ No gaps as long as token is persisted │
└─────────────────────────────┴────────────────────────────────────────────┘
The official data feed guide at developers.geotab.com (https://developers.geotab.com/myGeotab/guides/dataFeed/index.html) walks through the full pattern with code examples — worth bookmarking.
Please let us know if you have any other questions. We are here to help.
Have a great day!
Eishi FUN
Sources:
- Data Feed Guide — Geotab Developers (https://developers.geotab.com/myGeotab/guides/dataFeed/index.html)
- GetFeed API Reference — Geotab Developers(https://developers.geotab.com/myGeotab/apiReference/methods/GetFeed/)
- Result and Rate Limits — Geotab Blog (https://www.geotab.com/blog/result-and-rate-limits/)