Working with Rate Limits

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
AddInData1001mNot specified
AnnotationLog1001mNot specified
AssetLink3501mNot specified
AssetLinkDetails1001mNot specified
Audit2501mNot specified
BinaryData1001mNot specified
BinaryPayload1001mNot specified
ChargeEvent1001mNot specified
Controller1001mNot specified
CustomData1001mNot specified
CustomDevice1001mNot specified
CustomVehicleDevice1001mNot specified
DataDiagnostic1001mNot specified
DebugData1001mNot specified
Defect1001mNot specified
Device2501mNot specified
DeviceLink1501mNot specified
DeviceShare2501mNot specified
DeviceStatusInfo1001mNot specified
Diagnostic1001mNot specified
DistributionList1001mNot specified
Driver1501mNot specified
DriverChange2501mNot specified
DutyStatusLog2501mNot specified
DVIRLog3501mNot specified
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mNot specified
ExceptionEvent1001mNot specified
ExceptionEventState1001mNot specified
FailureMode1001mNot specified
FaultData1001mNot specified
FaultStatus1001mNot specified
FillUp1001mNot specified
FlashCode1001mNot specified
FuelAndEnergyUsed1001mNot specified
FuelEvent1001mNot specified
FuelTaxDetail1001mNot specified
FuelTransaction10001mNot specified
FuelUsed1001mNot specified
Gemini1001mNot specified
Go51001mNot specified
Go61001mNot specified
Go71001mNot specified
Go81001mNot specified
Go91001mNot specified
GoAnywhere1001mNot specified
GoAnywhereLite1001mNot specified
GoCurve1001mNot specified
GoCurveAuxiliary1001mNot specified
GoDevice1001mNot specified
GoDriveDevice1001mNot specified
Group3501mNot specified
IoxAddOn1001mNot specified
IoxAddOnStatus1001mNot specified
LogRecord1001mNot specified
MediaFile601mNot specified
NameEntity1001mNot specified
NameEntityWithVersion1001mNot specified
ParameterGroup1001mNot specified
Route2001mNot specified
RoutePlanItem1001mNot specified
Rule1501mNot specified
SecurityClearance1001mNot specified
ShipmentLog1001mNot specified
Source1001mNot specified
StatusData2501mNot specified
TachographDataFile8001mNot specified
Tag1001mNot specified
TextMessage999991sNot specified
TrailerAttachment1501mNot specified
Trip1001mNot specified
UntrackedAsset1001mNot specified
User2501mNot specified
WifiHotspot601mNot specified
WorkHoliday1001mNot specified
WorkTime1001mNot specified
WorkTimeDetail1001mNot specified
XDevice1001mNot specified
Zone9001mNot specified
ZoneType1001mNot specified
Rate limit rules: Get
EntityLimitPeriodStatus
AddIn10001mNot specified
AddInData6501mNot specified
AnnotationLog6501mNot specified
AssetLink1001mNot specified
AssetLinkDetails1001mNot specified
Audit3001mNot specified
BatteryStateOfHealth1001mNot specified
BinaryData5001mNot specified
BinaryPayload1001mNot specified
ChargeEvent3501mNot specified
Condition1001mNot specified
Controller7501mNot specified
CustomData3001mNot specified
CustomDevice1001mNot specified
CustomVehicleDevice1001mNot specified
DataDiagnostic1001mNot specified
DebugData3001mNot specified
Defect3001mNot specified
Device6501mNot specified
DeviceLink3001mNot specified
DeviceShare8001mNot specified
DeviceStatusInfo9001mNot specified
Diagnostic6501mNot specified
DistributionList2001mNot specified
Driver1001mNot specified
DriverChange10001mNot specified
DriverRegulation5001mNot specified
DutyStatusAvailability25001mNot specified
DutyStatusLog4001mNot specified
DutyStatusViolation7501mNot specified
DVIRLog10001mNot specified
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mNot specified
EVStatusInfo1001mNot specified
ExceptionEvent20001mNot specified
ExceptionEventState1001mNot specified
FailureMode2001mNot specified
FaultData5001mNot specified
FaultStatus1001mNot specified
FillUp12001mNot specified
FlashCode1001mNot specified
FuelAndEnergyUsed15001mNot specified
FuelEvent1001mNot specified
FuelTaxDetail10001mNot specified
FuelTransaction2501mNot specified
FuelUsed15001mNot specified
Gemini1001mNot specified
Go51001mNot specified
Go61001mNot specified
Go71001mNot specified
Go81001mNot specified
Go91001mNot specified
GoAnywhere1001mNot specified
GoAnywhereLite1001mNot specified
GoCurve1001mNot specified
GoCurveAuxiliary1001mNot specified
GoDevice1001mNot specified
GoDriveDevice1001mNot specified
Group3501mNot specified
IoxAddOn5001mNot specified
IoxAddOnStatus1001mNot specified
LogRecord10001mNot specified
MediaFile3501mNot specified
NameEntity1001mNot specified
NameEntityWithVersion1001mNot specified
ParameterGroup1001mNot specified
RangeEstimate1001mNot specified
Recipient1001mNot specified
Route2001mNot specified
RoutePlanItem1001mNot specified
Rule3001mNot specified
SafetyDriverInsight601mNot specified
SafetyFleetBenchmark601mNot specified
SafetyFleetInsight601mNot specified
SafetyVehicleInsight601mNot specified
SecurityClearance1001mNot specified
ShipmentLog3501mNot specified
Source1001mNot specified
StatusData10001mNot specified
TachographDataFile10001mNot specified
TachographDriverActivity1001mNot specified
TachographDrivingTimeStatus601mNot specified
Tag1001mNot specified
TextMessage999991sNot specified
TrailerAttachment3001mNot specified
Trip10001mNot specified
UnitOfMeasure1001mNot specified
UntrackedAsset1001mNot specified
User5001mNot specified
WifiHotspot601mNot specified
WorkHoliday1001mNot specified
WorkTime1001mNot specified
WorkTimeDetail1001mNot specified
XDevice1001mNot specified
Zone7501mNot specified
ZoneType1501mNot specified
Rate limit rules: GetCountOf
EntityLimitPeriodStatus
AddIn10001mNot specified
AddInData1001mNot specified
AnnotationLog1001mNot specified
AssetLink1001mNot specified
AssetLinkDetails1001mNot specified
Audit1001mNot specified
BatteryStateOfHealth1001mNot specified
BinaryData1001mNot specified
ChargeEvent1001mNot specified
Condition1001mNot specified
Controller1001mNot specified
CustomData1001mNot specified
CustomDevice1001mNot specified
CustomVehicleDevice1001mNot specified
DataDiagnostic1001mNot specified
DebugData1001mNot specified
Defect1001mNot specified
Device2501mNot specified
DeviceLink1501mNot specified
DeviceShare2501mNot specified
DeviceStatusInfo1001mNot specified
Diagnostic1001mNot specified
DistributionList1001mNot specified
DriverChange2501mNot specified
DutyStatusLog2501mNot specified
DutyStatusViolation1001mNot specified
DVIRLog3501mNot specified
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mNot specified
ExceptionEvent1001mNot specified
ExceptionEventState1001mNot specified
FailureMode1001mNot specified
FaultData1001mNot specified
FaultStatus1001mNot specified
FillUp1001mNot specified
FlashCode1001mNot specified
FuelAndEnergyUsed1001mNot specified
FuelEvent1001mNot specified
FuelTaxDetail1001mNot specified
FuelTransaction2001mNot specified
FuelUsed1001mNot specified
Gemini1001mNot specified
Go51001mNot specified
Go61001mNot specified
Go71001mNot specified
Go81001mNot specified
Go91001mNot specified
GoAnywhere1001mNot specified
GoAnywhereLite1001mNot specified
GoCurve1001mNot specified
GoCurveAuxiliary1001mNot specified
GoDevice1001mNot specified
GoDriveDevice1001mNot specified
Group3501mNot specified
IoxAddOn1001mNot specified
IoxAddOnStatus1001mNot specified
LogRecord1001mNot specified
MediaFile1001mNot specified
NameEntity1001mNot specified
NameEntityWithVersion1001mNot specified
ParameterGroup1001mNot specified
RangeEstimate1001mNot specified
Recipient1001mNot specified
Route2001mNot specified
RoutePlanItem1001mNot specified
Rule1501mNot specified
SafetyDriverInsight601mNot specified
SafetyFleetBenchmark601mNot specified
SafetyFleetInsight601mNot specified
SafetyVehicleInsight601mNot specified
SecurityClearance1001mNot specified
ShipmentLog1001mNot specified
Source1001mNot specified
StatusData1001mNot specified
TachographDataFile10001mNot specified
TachographDriverActivity1001mNot specified
TachographDrivingTimeStatus1001mNot specified
Tag1001mNot specified
TextMessage999991sNot specified
TrailerAttachment1501mNot specified
Trip1001mNot specified
UnitOfMeasure1001mNot specified
UntrackedAsset1001mNot specified
User2501mNot specified
WifiHotspot601mNot specified
WorkHoliday1001mNot specified
WorkTime1001mNot specified
WorkTimeDetail1001mNot specified
XDevice1001mNot specified
Zone2001mNot specified
ZoneType1001mNot specified
Rate limit rules: GetFeed
EntityLimitPeriodStatus
AnnotationLog601mNot specified
AssetLink601mNot specified
Audit601mNot specified
BinaryData601mNot specified
ChargeEvent601mNot specified
Controller601mNot specified
CustomData601mNot specified
CustomDevice601mNot specified
CustomVehicleDevice601mNot specified
DataDiagnostic601mNot specified
DebugData601mNot specified
Device2501mNot specified
DeviceLink1501mNot specified
DeviceShare2501mNot specified
DeviceStatusInfo601mNot specified
Diagnostic601mNot specified
Driver601mNot specified
DriverChange2501mNot specified
DriverRegulation601mNot specified
DutyStatusAvailability601mNot specified
DutyStatusLog2501mNot specified
DutyStatusViolation601mNot specified
DVIRLog3501mNot specified
EmissionComplianceEvent2501mNot specified
EmissionVehicleEnrollment2501mNot specified
EntityWithVersion601mNot specified
ExceptionEvent601mNot specified
FailureMode601mNot specified
FaultData601mNot specified
FillUp601mNot specified
FuelAndEnergyUsed601mNot specified
FuelTaxDetail601mNot specified
FuelTransaction2501mNot specified
FuelUsed601mNot specified
Gemini601mNot specified
Go5601mNot specified
Go6601mNot specified
Go7601mNot specified
Go8601mNot specified
Go9601mNot specified
GoAnywhere601mNot specified
GoAnywhereLite601mNot specified
GoCurve601mNot specified
GoCurveAuxiliary601mNot specified
GoDevice601mNot specified
GoDriveDevice601mNot specified
IoxAddOn601mNot specified
IoxAddOnStatus601mNot specified
LogRecord601mNot specified
MediaFile601mNot specified
NameEntity601mNot specified
NameEntityWithVersion601mNot specified
Route2001mNot specified
Rule1501mNot specified
ShipmentLog601mNot specified
StatusData601mNot specified
TachographDataFile10001mNot specified
TextMessage999991sNot specified
TrailerAttachment1501mNot specified
Trip601mNot specified
UntrackedAsset601mNot specified
User2501mNot specified
XDevice601mNot specified
Zone2001mNot specified
Rate limit rules: Remove
EntityLimitPeriodStatus
AddIn101mNot specified
AddInData22501mNot specified
AnnotationLog1001mNot specified
AssetLink3501mNot specified
AssetLinkDetails1001mNot specified
BinaryData1001mNot specified
BinaryPayload1001mNot specified
ChargeEvent1001mNot specified
Condition1001mNot specified
Controller1001mNot specified
CustomData1001mNot specified
CustomDevice1001mNot specified
CustomVehicleDevice1001mNot specified
DataDiagnostic1001mNot specified
DebugData1001mNot specified
Defect1001mNot specified
Device2501mNot specified
DeviceLink1501mNot specified
DeviceShare2501mNot specified
DeviceStatusInfo1001mNot specified
Diagnostic1001mNot specified
DistributionList1001mNot specified
Driver1001mNot specified
DriverChange2501mNot specified
DutyStatusLog2501mNot specified
DVIRLog3501mNot specified
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mNot specified
ExceptionEvent1001mNot specified
ExceptionEventState1001mNot specified
FailureMode1001mNot specified
FaultData1001mNot specified
FaultStatus1001mNot specified
FillUp1001mNot specified
FlashCode1001mNot specified
FuelAndEnergyUsed1001mNot specified
FuelEvent1001mNot specified
FuelTaxDetail1001mNot specified
FuelTransaction2001mNot specified
FuelUsed1001mNot specified
Gemini1001mNot specified
Go51001mNot specified
Go61001mNot specified
Go71001mNot specified
Go81001mNot specified
Go91001mNot specified
GoAnywhere1001mNot specified
GoAnywhereLite1001mNot specified
GoCurve1001mNot specified
GoCurveAuxiliary1001mNot specified
GoDevice1001mNot specified
GoDriveDevice1001mNot specified
Group3501mNot specified
IoxAddOn1001mNot specified
IoxAddOnStatus1001mNot specified
LogRecord1001mNot specified
MediaFile601mNot specified
NameEntity1001mNot specified
NameEntityWithVersion1001mNot specified
ParameterGroup1001mNot specified
Route2001mNot specified
RoutePlanItem1001mNot specified
Rule1501mNot specified
SafetyFleetBenchmark1001mNot specified
SecurityClearance1001mNot specified
ShipmentLog1001mNot specified
Source1001mNot specified
StatusData1001mNot specified
TachographDriverActivity1001mNot specified
TachographDrivingTimeStatus1001mNot specified
Tag1001mNot specified
TextMessage999991sNot specified
TrailerAttachment1501mNot specified
Trip1001mNot specified
UntrackedAsset1001mNot specified
User2501mNot specified
WifiHotspot601mNot specified
WorkHoliday1001mNot specified
WorkTime1001mNot specified
WorkTimeDetail1001mNot specified
XDevice1001mNot specified
Zone10001mNot specified
ZoneType1001mNot specified
Rate limit rules: Set
EntityLimitPeriodStatus
AddIn101mNot specified
AddInData17001mNot specified
AnnotationLog1001mNot specified
AssetLink3501mNot specified
AssetLinkDetails1001mNot specified
BinaryPayload1001mNot specified
ChargeEvent1001mNot specified
Controller1001mNot specified
CustomData1001mNot specified
CustomDevice1001mNot specified
CustomVehicleDevice1001mNot specified
DataDiagnostic1001mNot specified
Defect1001mNot specified
Device2501mNot specified
DeviceLink1501mNot specified
DeviceShare2501mNot specified
DeviceStatusInfo1001mNot specified
Diagnostic1001mNot specified
DistributionList1001mNot specified
Driver1001mNot specified
DutyStatusLog2501mNot specified
DVIRLog3501mNot specified
EmissionComplianceEvent5001mNot specified
EmissionVehicleEnrollment5001mNot specified
EntityWithVersion1001mNot specified
ExceptionEvent1001mNot specified
ExceptionEventState1001mNot specified
FailureMode1001mNot specified
FaultData12001mNot specified
FaultStatus1001mNot specified
FillUp1001mNot specified
FlashCode1001mNot specified
FuelAndEnergyUsed1001mNot specified
FuelEvent1001mNot specified
FuelTransaction2001mNot specified
FuelUsed1001mNot specified
Gemini1001mNot specified
Go51001mNot specified
Go61001mNot specified
Go71001mNot specified
Go81001mNot specified
Go91001mNot specified
GoAnywhere1001mNot specified
GoAnywhereLite1001mNot specified
GoCurve1001mNot specified
GoCurveAuxiliary1001mNot specified
GoDevice1001mNot specified
GoDriveDevice1001mNot specified
Group3501mNot specified
IoxAddOn1001mNot specified
IoxAddOnStatus1001mNot specified
MediaFile601mNot specified
NameEntity1001mNot specified
NameEntityWithVersion1001mNot specified
ParameterGroup1001mNot specified
Route2001mNot specified
RoutePlanItem1001mNot specified
Rule1501mNot specified
SecurityClearance1001mNot specified
ShipmentLog3501mNot specified
Source1001mNot specified
StatusData1001mNot specified
TachographDataFile601mNot specified
Tag1001mNot specified
TextMessage999991sNot specified
TrailerAttachment1501mNot specified
Trip1001mNot specified
UntrackedAsset1001mNot specified
User2501mNot specified
WifiHotspot601mNot specified
WorkHoliday1001mNot specified
WorkTime1001mNot specified
WorkTimeDetail1001mNot specified
XDevice1001mNot specified
Zone2001mNot specified
ZoneType1001mNot specified
Rate limit rules: Web methods
MethodLimitPeriodStatus
Add1001mNot specified
Authenticate101mNot specified
CreateDatabase151mNot specified
DownloadMediaFile2401mNot specified
EmissionEnrollDevices101mNot specified
GenerateCaptcha101mNot specified
Get1001mNot specified
GetAddresses4501mNot specified
GetCoordinates3001mNot specified
GetCoordinatesDetailed3001mNot specified
GetCountOf1001mNot specified
GetDaylightSavingRules2501mNot specified
GetDeviceCommandHistory1001mNot specified
GetDeviceCommandStatus5001mNot specified
GetDirections2001mNot specified
GetEmissionComplianceDeadline5001mNot specified
GetFeed601mNot specified
GetLanguages601mNot specified
GetPostedRoadSpeedsForDevice3001mNot specified
GetRegions601mNot specified
GetSystemTimeUtc5001mNot specified
GetTimeZones1001mNot specified
GetVersion40001mNot specified
GetVersionInformation110001mNot specified
OptimizeWaypoints1001mNot specified
Remove1001mNot specified
Set1001mNot specified
SetUserPassword21mNot specified
UploadMediaFile601mNot specified