As part of Geotab's ongoing commitment to service scalability and reliability, we are implementing a MyGeotab SDK update which will ensure future use of new or existing APIs results in minimized performance risk and improves overall API call efficiency.

Geotab will implement new API rate limits on MyGeotab, which will affect customers using the MyGeotab API. These API rate limits will apply to each unique combination of method, entity, username, and database. One User-Agent’s rate limiting will not affect another.

If you are an integrator or partner with an active integration it is extremely important that you review your code to ensure that you are aligned with Geotab’s best practice.

Understanding the base rate limits

You can see the details of the specific rate limits for each Method and Entity on the Geotab SDK site here.

While limits are in “Coming Soon”, the X-Rate-Limit-Limit, X-Rate-Limit-Remaining, X-Rate-Limit-Reset headers are set even though the server will not limit the request. This allows any consumer to observe the headers ahead of the limits being rolled out.

If using the .NET Geotab.Checkmate.Objectmodel nuget package, there is no access to the headers of the request. To facilitate testing of how your integration works with the new limits, a new optional parameter has been added to the API.cs constructor. Constructing with the optional ApiClientConfiguration with EnableRateLimitObservation set to true and run your integration The nuget package will throw an OverLimitException from the library when the returned result is over a given limit even though the server is not limiting the request.

This will give integrators the opportunity to test how their interactions will react before the limits are strictly imposed by the API.

OverLimitException

When a rate limit is exceeded, an OverLimitException error is returned. A header (Retry-After) is also set with time remaining for the limit to reset.

Header example

Retry-After: 58

Headers

If a rate limit is applied to an API, with a successful JSON-RPC response, headers are set with rate limit information:

  • X-Rate-Limit-Limit: the rate limit period (eg. 1s, 1m, 12h, 1d)
  • X-Rate-Limit-Remaining: number of request remaining
  • X-Rate-Limit-Reset: UTC date time (ISO 8601) when the limit resets
Understanding tiers

Tiers refers to the number of tracked assets managed by a database. This includes only devices that have hardware reporting active data into MyGeotab including the Go Device, Go Anywhere, and Custom Telematics devices.

Tracked Assets on a Database
TierLower BoundUpper BoundMultiplier
101,000x1
21,00110,000x5
310,00125,000x15
425,001x25

The following public endpoints are excluded from tiered rate limits, and will always have a fixed base limit:

  • Authenticate
  • CreateDatabase
  • SetUserPassword
  • DeviceShare
Avoiding API rate limits

Use the MyGeotab API Adapter

The MyGeotab API Adapter solution serves as both an example of proper integration via data feeds and the potential foundation for those seeking to develop new integrations with the Geotab platform. Essentially, it uses data feeds to pull the most common data sets from a MyGeotab database and stream the data into tables within a SQL Server, PostgreSQL or Oracle database.

Read more about it here.

Get vs GetFeed

It is preferred to use GetFeed instead of a Get call for an entity which supports it.

Wait logic between calls

A straightforward solution can be introducing wait times between subsequent calls. It is suggested that ensuring at least 1010 milliseconds has elapsed between calls.

Handling rate limits

The general strategy for handling rate limits requires the integrator or partner to implement an error handler in code that recognizes rate limit errors and pauses requests until the limit resets. This will prevent your app from continuously trying to make requests once the rate limit is hit.

Using exponential backoff

Exponential Backoff is an essential error-handling strategy in network applications. In this method, a client will retry a failed request after waiting for an increasing amount of time before each retry.

When a request fails due to rate limiting, the client waits for a predetermined period before retrying the request. If the request fails again, the client waits longer for the next attempt, and this process continues up to a maximum delay limit. This approach helps to prevent frequent hits to the rate limit and reduces the load on the server.

JavaScript example implementation

Below is an example of how you might currently be making API calls:

To handle rate limits effectively, you can wrap your base function with exponential backoff logic. The following steps outline this process:

  1. Set the Maximum Number of Attempts
  2. Calculate the Exponential Delay
  3. Try the Call
  4. Catch the OverLimitException
  5. Wait for the Delay
  6. Repeat steps 1-5 until either the maximum number of attempts is reached, any other error is thrown, or results are successfully returned.

Here is an example implementation:

This function could be used within a try-catch block to handle any resultant errors:

Rate limit rules: Add
EntityLimitPeriodStatus
AddIn201mNot specified
AddInData1001mInactive
AnnotationLog1001mInactive
AssetLink3501mActive
AssetLinkDetails1001mInactive
Audit2501mInactive
BinaryData1001mInactive
BinaryPayload1001mInactive
ChargeEvent1001mInactive
CoachingSessionState1001mInactive
Controller1001mInactive
CustomData1001mInactive
CustomDevice1001mInactive
CustomVehicleDevice1001mInactive
DataDiagnostic1001mInactive
DebugData1001mInactive
Defect1001mInactive
Device2501mInactive
DeviceLink3501mActive
DeviceShare2501mNot specified
DeviceStatusInfo1001mInactive
Diagnostic1001mInactive
DistributionList1001mInactive
Driver1501mInactive
DriverChange2501mInactive
DutyStatusLog2501mInactive
DVIRLog3501mInactive
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mInactive
ExceptionEvent1001mInactive
ExceptionEventState1001mInactive
FailureMode1001mInactive
FaultData1001mInactive
FaultStatus1001mInactive
FillUp1001mInactive
FlashCode1001mInactive
FuelAndEnergyUsed1001mInactive
FuelEvent1001mInactive
FuelTaxDetail1001mInactive
FuelTransaction10001mInactive
FuelUsed1001mInactive
Gemini1001mInactive
Go51001mInactive
Go61001mInactive
Go71001mInactive
Go81001mInactive
Go91001mInactive
GoAnywhere1001mInactive
GoAnywhereLite1001mInactive
GoCurve1001mInactive
GoCurveAuxiliary1001mInactive
GoDevice1001mInactive
GoDriveDevice1001mInactive
Group3501mInactive
GroupSecurity1001mInactive
IoxAddOn1001mInactive
IoxAddOnStatus1001mInactive
LogRecord1001mInactive
MediaFile601mNot specified
NameEntity1001mInactive
NameEntityWithVersion1001mInactive
ParameterGroup1001mInactive
Route2001mInactive
RoutePlanItem1001mInactive
Rule1501mInactive
SecurityClearance1001mInactive
ShipmentLog1001mInactive
Source1001mInactive
StatusData2501mInactive
TachographDataFile8001mActive
Tag1001mInactive
TextMessage999991sInactive
TrailerAttachment1501mInactive
Trip1001mInactive
UntrackedAsset1001mInactive
User2501mInactive
VehicleConfiguration1001mInactive
WifiHotspot601mActive
WorkHoliday1001mInactive
WorkTime1001mInactive
WorkTimeDetail1001mInactive
XDevice1001mInactive
Zone9001mInactive
ZoneType1001mInactive
Rate limit rules: Get
EntityLimitPeriodStatus
AddIn10001mNot specified
AddInData6501mInactive
AnnotationLog6501mInactive
AssetLink1001mActive
AssetLinkDetails1001mInactive
Audit3001mInactive
BatteryStateOfHealth1001mInactive
BinaryData5001mInactive
BinaryPayload1001mInactive
ChargeEvent3501mInactive
CoachingSessionState1001mInactive
Condition1001mInactive
Controller7501mInactive
CustomData3001mInactive
CustomDevice1001mInactive
CustomVehicleDevice1001mInactive
DataDiagnostic1001mInactive
DebugData3001mInactive
Defect3001mInactive
Device6501mInactive
DeviceLink2501mActive
DeviceShare8001mInactive
DeviceStatusInfo9001mInactive
Diagnostic6501mInactive
DistributionList2001mInactive
Driver1001mInactive
DriverChange10001mInactive
DriverRegulation5001mInactive
DutyStatusAvailability25001mInactive
DutyStatusLog4001mInactive
DutyStatusViolation7501mInactive
DVIRLog10001mInactive
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mInactive
EVStatusInfo1001mInactive
ExceptionEvent20001mInactive
ExceptionEventState1001mInactive
FailureMode2001mInactive
FaultData5001mInactive
FaultStatus1001mInactive
FillUp12001mInactive
FlashCode1001mInactive
FuelAndEnergyUsed15001mInactive
FuelEvent1001mInactive
FuelTaxDetail10001mInactive
FuelTransaction2501mInactive
FuelUsed15001mInactive
Gemini1001mInactive
Go51001mInactive
Go61001mInactive
Go71001mInactive
Go81001mInactive
Go91001mInactive
GoAnywhere1001mInactive
GoAnywhereLite1001mInactive
GoCurve1001mInactive
GoCurveAuxiliary1001mInactive
GoDevice1001mInactive
GoDriveDevice1001mInactive
Group3501mInactive
GroupSecurity1001mInactive
IoxAddOn5001mInactive
IoxAddOnStatus1001mInactive
LogRecord10001mInactive
MediaFile3501mInactive
NameEntity1001mInactive
NameEntityWithVersion1001mInactive
ParameterGroup1001mInactive
RangeEstimate1001mInactive
Recipient1001mInactive
Route2001mInactive
RoutePlanItem1001mInactive
Rule3001mInactive
SafetyDriverInsight601mActive
SafetyFleetBenchmark601mActive
SafetyFleetInsight601mActive
SafetyVehicleInsight601mActive
SecurityClearance1001mInactive
ShipmentLog3501mInactive
Source1001mInactive
StatusData10001mInactive
TachographDataFile10001mInactive
TachographDriverActivity1001mInactive
TachographDrivingTimeStatus601mActive
Tag1001mInactive
TextMessage999991sInactive
TrailerAttachment3001mInactive
Trip10001mInactive
UnitOfMeasure1001mInactive
UntrackedAsset1001mInactive
User5001mInactive
VehicleConfiguration1001mInactive
WifiHotspot601mNot specified
WorkHoliday1001mInactive
WorkTime1001mInactive
WorkTimeDetail1001mInactive
XDevice1001mInactive
Zone7501mInactive
ZoneType1501mInactive
Rate limit rules: GetCountOf
EntityLimitPeriodStatus
AddIn10001mNot specified
AddInData1001mInactive
AnnotationLog1001mInactive
AssetLink1001mInactive
AssetLinkDetails1001mInactive
Audit1001mInactive
BatteryStateOfHealth1001mInactive
BinaryData1001mInactive
ChargeEvent1001mInactive
CoachingSessionState1001mInactive
Condition1001mInactive
Controller1001mInactive
CustomData1001mInactive
CustomDevice1001mInactive
CustomVehicleDevice1001mInactive
DataDiagnostic1001mInactive
DebugData1001mInactive
Defect1001mInactive
Device2501mInactive
DeviceLink1001mActive
DeviceShare2501mNot specified
DeviceStatusInfo1001mInactive
Diagnostic1001mInactive
DistributionList1001mInactive
Driver1001mInactive
DriverChange2501mInactive
DutyStatusLog2501mInactive
DutyStatusViolation1001mInactive
DVIRLog3501mInactive
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mInactive
ExceptionEvent1001mInactive
ExceptionEventState1001mInactive
FailureMode1001mInactive
FaultData1001mInactive
FaultStatus1001mInactive
FillUp1001mInactive
FlashCode1001mInactive
FuelAndEnergyUsed1001mInactive
FuelEvent1001mInactive
FuelTaxDetail1001mInactive
FuelTransaction2001mInactive
FuelUsed1001mInactive
Gemini1001mInactive
Go51001mInactive
Go61001mInactive
Go71001mInactive
Go81001mInactive
Go91001mInactive
GoAnywhere1001mInactive
GoAnywhereLite1001mInactive
GoCurve1001mInactive
GoCurveAuxiliary1001mInactive
GoDevice1001mInactive
GoDriveDevice1001mInactive
Group3501mInactive
GroupSecurity1001mInactive
IoxAddOn1001mInactive
IoxAddOnStatus1001mInactive
LogRecord1001mInactive
MediaFile1001mInactive
NameEntity1001mInactive
NameEntityWithVersion1001mInactive
ParameterGroup1001mInactive
RangeEstimate1001mInactive
Recipient1001mInactive
Route2001mInactive
RoutePlanItem1001mInactive
Rule1501mInactive
SafetyDriverInsight601mActive
SafetyFleetBenchmark601mActive
SafetyFleetInsight601mActive
SafetyVehicleInsight601mActive
SecurityClearance1001mInactive
ShipmentLog1001mInactive
Source1001mInactive
StatusData1001mInactive
TachographDataFile10001mActive
TachographDriverActivity1001mInactive
TachographDrivingTimeStatus1001mInactive
Tag1001mInactive
TextMessage999991sInactive
TrailerAttachment1501mInactive
Trip1001mInactive
UnitOfMeasure1001mInactive
UntrackedAsset1001mInactive
User2501mInactive
VehicleConfiguration1001mInactive
WifiHotspot601mActive
WorkHoliday1001mInactive
WorkTime1001mInactive
WorkTimeDetail1001mInactive
XDevice1001mInactive
Zone2001mInactive
ZoneType1001mInactive
Rate limit rules: GetFeed
EntityLimitPeriodStatus
AnnotationLog601mActive
AssetLink601mActive
Audit601mActive
BinaryData601mActive
ChargeEvent601mActive
Controller601mActive
CustomData601mActive
CustomDevice601mActive
CustomVehicleDevice601mActive
DataDiagnostic601mActive
DebugData601mActive
Device2501mInactive
DeviceLink801mActive
DeviceShare2501mActive
DeviceStatusInfo601mActive
Diagnostic601mActive
Driver601mActive
DriverChange2501mInactive
DriverRegulation601mActive
DutyStatusAvailability601mActive
DutyStatusLog2501mInactive
DutyStatusViolation601mActive
DVIRLog3501mInactive
EmissionComplianceEvent2501mActive
EmissionVehicleEnrollment2501mActive
EntityWithVersion601mActive
ExceptionEvent601mActive
FailureMode601mActive
FaultData601mActive
FillUp601mActive
FuelAndEnergyUsed601mActive
FuelTaxDetail601mActive
FuelTransaction2501mActive
FuelUsed601mActive
Gemini601mActive
Go5601mActive
Go6601mActive
Go7601mActive
Go8601mActive
Go9601mActive
GoAnywhere601mActive
GoAnywhereLite601mActive
GoCurve601mActive
GoCurveAuxiliary601mActive
GoDevice601mActive
GoDriveDevice601mActive
IoxAddOn601mActive
IoxAddOnStatus601mActive
LogRecord601mActive
MediaFile601mActive
NameEntity601mActive
NameEntityWithVersion601mActive
Route2001mInactive
Rule1501mInactive
ShipmentLog601mActive
StatusData601mActive
TachographDataFile10001mActive
TextMessage999991sInactive
TrailerAttachment1501mInactive
Trip601mActive
UntrackedAsset601mActive
User2501mInactive
XDevice601mActive
Zone2001mInactive
Rate limit rules: Remove
EntityLimitPeriodStatus
AddIn101mNot specified
AddInData22501mInactive
AnnotationLog1001mInactive
AssetLink3501mActive
AssetLinkDetails1001mInactive
BinaryData1001mInactive
BinaryPayload1001mInactive
ChargeEvent1001mInactive
CoachingSessionState1001mInactive
Condition1001mInactive
Controller1001mInactive
CustomData1001mInactive
CustomDevice1001mInactive
CustomVehicleDevice1001mInactive
DataDiagnostic1001mInactive
DebugData1001mInactive
Defect1001mInactive
Device2501mInactive
DeviceLink3501mActive
DeviceShare2501mNot specified
DeviceStatusInfo1001mInactive
Diagnostic1001mInactive
DistributionList1001mInactive
Driver1001mInactive
DriverChange2501mInactive
DutyStatusLog2501mInactive
DVIRLog3501mInactive
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mInactive
ExceptionEvent1001mInactive
ExceptionEventState1001mInactive
FailureMode1001mInactive
FaultData1001mInactive
FaultStatus1001mInactive
FillUp1001mInactive
FlashCode1001mInactive
FuelAndEnergyUsed1001mInactive
FuelEvent1001mInactive
FuelTaxDetail1001mInactive
FuelTransaction2001mInactive
FuelUsed1001mInactive
Gemini1001mInactive
Go51001mInactive
Go61001mInactive
Go71001mInactive
Go81001mInactive
Go91001mInactive
GoAnywhere1001mInactive
GoAnywhereLite1001mInactive
GoCurve1001mInactive
GoCurveAuxiliary1001mInactive
GoDevice1001mInactive
GoDriveDevice1001mInactive
Group3501mInactive
GroupSecurity1001mInactive
IoxAddOn1001mInactive
IoxAddOnStatus1001mInactive
LogRecord1001mInactive
MediaFile601mNot specified
NameEntity1001mInactive
NameEntityWithVersion1001mInactive
ParameterGroup1001mInactive
Route2001mInactive
RoutePlanItem1001mInactive
Rule1501mInactive
SafetyFleetBenchmark1001mInactive
SecurityClearance1001mInactive
ShipmentLog1001mInactive
Source1001mInactive
StatusData1001mInactive
TachographDriverActivity1001mInactive
TachographDrivingTimeStatus1001mInactive
Tag1001mInactive
TextMessage999991sInactive
TrailerAttachment1501mInactive
Trip1001mInactive
UntrackedAsset1001mInactive
User2501mInactive
VehicleConfiguration1001mInactive
WifiHotspot601mNot specified
WorkHoliday1001mInactive
WorkTime1001mInactive
WorkTimeDetail1001mInactive
XDevice1001mInactive
Zone10001mInactive
ZoneType1001mInactive
Rate limit rules: Set
EntityLimitPeriodStatus
AddIn101mNot specified
AddInData17001mInactive
AnnotationLog1001mInactive
AssetLink3501mActive
AssetLinkDetails1001mInactive
BinaryPayload1001mInactive
ChargeEvent1001mInactive
CoachingSessionState1001mInactive
Controller1001mInactive
CustomData1001mInactive
CustomDevice1001mInactive
CustomVehicleDevice1001mInactive
DataDiagnostic1001mInactive
Defect1001mInactive
Device2501mInactive
DeviceLink3501mActive
DeviceShare2501mNot specified
DeviceStatusInfo1001mInactive
Diagnostic1001mInactive
DistributionList1001mInactive
Driver1001mInactive
DutyStatusLog2501mInactive
DVIRLog3501mInactive
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mInactive
ExceptionEvent1001mInactive
ExceptionEventState1001mInactive
FailureMode1001mInactive
FaultData12001mInactive
FaultStatus1001mInactive
FillUp1001mInactive
FlashCode1001mInactive
FuelAndEnergyUsed1001mInactive
FuelEvent1001mInactive
FuelTransaction2001mInactive
FuelUsed1001mInactive
Gemini1001mInactive
Go51001mInactive
Go61001mInactive
Go71001mInactive
Go81001mInactive
Go91001mInactive
GoAnywhere1001mInactive
GoAnywhereLite1001mInactive
GoCurve1001mInactive
GoCurveAuxiliary1001mInactive
GoDevice1001mInactive
GoDriveDevice1001mInactive
Group3501mInactive
GroupSecurity1001mInactive
IoxAddOn1001mInactive
IoxAddOnStatus1001mInactive
MediaFile601mNot specified
NameEntity1001mInactive
NameEntityWithVersion1001mInactive
ParameterGroup1001mInactive
Route2001mInactive
RoutePlanItem1001mInactive
Rule1501mInactive
SecurityClearance1001mInactive
ShipmentLog3501mInactive
Source1001mInactive
StatusData1001mInactive
TachographDataFile601mActive
Tag1001mInactive
TextMessage999991sInactive
TrailerAttachment1501mInactive
Trip1001mInactive
UntrackedAsset1001mInactive
User2501mInactive
VehicleConfiguration1001mInactive
WifiHotspot601mNot specified
WorkHoliday1001mInactive
WorkTime1001mInactive
WorkTimeDetail1001mInactive
XDevice1001mInactive
Zone2001mInactive
ZoneType1001mInactive
Rate limit rules: Web methods
MethodLimitPeriodStatus
Authenticate101mNot specified
CreateDatabase151mNot specified
DownloadMediaFile2401mNot specified
EmissionEnrollDevices101mNot specified
GenerateCaptcha101mNot specified
GetAddresses4501mInactive
GetCoordinates3001mInactive
GetDaylightSavingRules2501mInactive
GetDirections2001mInactive
GetEmissionComplianceDeadline5001mNot specified
GetLanguages601mNot specified
GetPostedRoadSpeedsForDevice3001mInactive
GetRegions601mNot specified
GetSystemTimeUtc5001mInactive
GetTimeZones1001mInactive
GetVersion40001mNot specified
GetVersionInformation110001mNot specified
OptimizeWaypoints1001mInactive
SetUserPassword21mNot specified
UploadMediaFile601mNot specified