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
AddIn201mActive
AddInData1001mActive
AnnotationLog1001mActive
Audit2501mActive
BinaryData1001mActive
BinaryPayload1001mActive
ChargeEvent1001mActive
Controller1001mActive
CustomData1001mActive
CustomDevice1001mActive
CustomVehicleDevice1001mActive
DataDiagnostic1001mActive
DebugData1001mActive
Defect1001mActive
Device2501mActive
DeviceShare2501mActive
DeviceStatusInfo1001mActive
Diagnostic1001mActive
DistributionList1001mActive
Driver1501mActive
DriverChange2501mActive
DutyStatusLog2501mActive
DVIRLog3501mActive
EmissionVehicleEnrollment5001mActive
EntityWithVersion1001mActive
ExceptionEvent1001mActive
ExceptionEventState1001mActive
FailureMode1001mActive
FaultData1001mActive
FaultStatus1001mActive
FillUp1001mActive
FlashCode1001mActive
FuelAndEnergyUsed1001mActive
FuelEvent1001mActive
FuelTaxDetail1001mActive
FuelTransaction10001mActive
FuelUsed1001mActive
Go51001mActive
Go61001mActive
Go71001mActive
Go81001mActive
Go91001mActive
GoAnywhere1001mActive
GoAnywhereLite1001mActive
GoCurve1001mActive
GoCurveAuxiliary1001mActive
GoDevice1001mActive
GoDriveDevice1001mActive
Group3501mActive
GroupSecurity1001mActive
IoxAddOn1001mActive
IoxAddOnStatus1001mActive
LogRecord1001mActive
MediaFile601mActive
NameEntity1001mActive
NameEntityWithVersion1001mActive
ParameterGroup1001mActive
Route2001mActive
RoutePlanItem1001mActive
Rule1501mActive
SecurityClearance1001mActive
ShipmentLog1001mActive
Source1001mActive
StatusData2501mActive
TachographDataFile8001mActive
Tag1001mActive
TextMessage999991sActive
Trailer3001mActive
TrailerAttachment1501mActive
Trip1001mActive
UntrackedAsset1001mActive
User2501mActive
VehicleConfiguration1001mActive
WifiHotspot601mActive
WorkHoliday1001mActive
WorkTime1001mActive
WorkTimeDetail1001mActive
XDevice1001mActive
Zone9001mActive
ZoneType1001mActive
Rate limit rules: Get
EntityLimitPeriodStatus
AddIn10001mActive
AddInData6501mActive
AnnotationLog6501mActive
Audit3001mActive
BatteryStateOfHealth1001mActive
BinaryData5001mActive
BinaryPayload1001mActive
ChargeEvent3501mActive
Condition1001mActive
Controller7501mActive
CustomData3001mActive
CustomDevice1001mActive
CustomVehicleDevice1001mActive
DataDiagnostic1001mActive
DebugData3001mActive
Defect3001mActive
Device6501mActive
DeviceShare8001mActive
DeviceStatusInfo9001mActive
Diagnostic6501mActive
DistributionList2001mActive
Driver1001mActive
DriverChange10001mActive
DriverRegulation5001mActive
DutyStatusAvailability25001mActive
DutyStatusLog4001mActive
DutyStatusViolation7501mActive
DVIRLog10001mActive
EmissionVehicleEnrollment5001mActive
EntityWithVersion1001mActive
EVStatusInfo1001mActive
ExceptionEvent20001mActive
ExceptionEventState1001mActive
FailureMode2001mActive
FaultData5001mActive
FaultStatus1001mActive
FillUp12001mActive
FlashCode1001mActive
FuelAndEnergyUsed15001mActive
FuelEvent1001mActive
FuelTaxDetail10001mActive
FuelTransaction2501mActive
FuelUsed15001mActive
Go51001mActive
Go61001mActive
Go71001mActive
Go81001mActive
Go91001mActive
GoAnywhere1001mActive
GoAnywhereLite1001mActive
GoCurve1001mActive
GoCurveAuxiliary1001mActive
GoDevice1001mActive
GoDriveDevice1001mActive
Group3501mActive
GroupSecurity1001mActive
IoxAddOn5001mActive
IoxAddOnStatus1001mActive
LogRecord10001mActive
MediaFile3501mActive
NameEntity1001mActive
NameEntityWithVersion1001mActive
ParameterGroup1001mActive
RangeEstimate1001mActive
Recipient1001mActive
Route2001mActive
RoutePlanItem1001mActive
Rule3001mActive
SecurityClearance1001mActive
ShipmentLog3501mActive
Source1001mActive
StatusData10001mActive
TachographDataFile10001mActive
TachographDriverActivity1001mActive
TachographDrivingTimeStatus601mActive
Tag1001mActive
TextMessage999991sActive
Trailer3001mActive
TrailerAttachment3001mActive
Trip10001mActive
UnitOfMeasure1001mActive
UntrackedAsset1001mActive
User5001mActive
VehicleConfiguration1001mActive
WifiHotspot601mActive
WorkHoliday1001mActive
WorkTime1001mActive
WorkTimeDetail1001mActive
XDevice1001mActive
Zone7501mActive
ZoneType1501mActive
Rate limit rules: GetCountOf
EntityLimitPeriodStatus
AddIn10001mActive
AddInData1001mActive
AnnotationLog1001mActive
Audit1001mActive
BatteryStateOfHealth1001mActive
BinaryData1001mActive
ChargeEvent1001mActive
Condition1001mActive
Controller1001mActive
CustomData1001mActive
CustomDevice1001mActive
CustomVehicleDevice1001mActive
DataDiagnostic1001mActive
DebugData1001mActive
Defect1001mActive
Device2501mActive
DeviceShare2501mActive
DeviceStatusInfo1001mActive
Diagnostic1001mActive
DistributionList1001mActive
Driver1001mActive
DriverChange2501mActive
DutyStatusLog2501mActive
DutyStatusViolation1001mActive
DVIRLog3501mActive
EmissionVehicleEnrollment5001mActive
EntityWithVersion1001mActive
ExceptionEvent1001mActive
ExceptionEventState1001mActive
FailureMode1001mActive
FaultData1001mActive
FaultStatus1001mActive
FillUp1001mActive
FlashCode1001mActive
FuelAndEnergyUsed1001mActive
FuelEvent1001mActive
FuelTaxDetail1001mActive
FuelTransaction2001mActive
FuelUsed1001mActive
Go51001mActive
Go61001mActive
Go71001mActive
Go81001mActive
Go91001mActive
GoAnywhere1001mActive
GoAnywhereLite1001mActive
GoCurve1001mActive
GoCurveAuxiliary1001mActive
GoDevice1001mActive
GoDriveDevice1001mActive
Group3501mActive
GroupSecurity1001mActive
IoxAddOn1001mActive
IoxAddOnStatus1001mActive
LogRecord1001mActive
MediaFile1001mActive
NameEntity1001mActive
NameEntityWithVersion1001mActive
ParameterGroup1001mActive
RangeEstimate1001mActive
Recipient1001mActive
Route2001mActive
RoutePlanItem1001mActive
Rule1501mActive
SecurityClearance1001mActive
ShipmentLog1001mActive
Source1001mActive
StatusData1001mActive
TachographDataFile10001mActive
TachographDriverActivity1001mActive
TachographDrivingTimeStatus1001mActive
Tag1001mActive
TextMessage999991sActive
Trailer3001mActive
TrailerAttachment1501mActive
Trip1001mActive
UnitOfMeasure1001mActive
UntrackedAsset1001mActive
User2501mActive
VehicleConfiguration1001mActive
WifiHotspot601mActive
WorkHoliday1001mActive
WorkTime1001mActive
WorkTimeDetail1001mActive
XDevice1001mActive
Zone2001mActive
ZoneType1001mActive
Rate limit rules: GetFeed
EntityLimitPeriodStatus
AnnotationLog601mActive
Audit601mActive
BinaryData601mActive
ChargeEvent601mActive
Controller601mActive
CustomData601mActive
CustomDevice601mActive
CustomVehicleDevice601mActive
DataDiagnostic601mActive
DebugData601mActive
Device2501mActive
DeviceShare2501mActive
DeviceStatusInfo601mActive
Diagnostic601mActive
Driver601mActive
DriverChange2501mActive
DriverRegulation601mActive
DutyStatusAvailability601mActive
DutyStatusLog2501mActive
DutyStatusViolation601mActive
DVIRLog3501mActive
EmissionVehicleEnrollment2501mActive
EntityWithVersion601mActive
ExceptionEvent601mActive
FailureMode601mActive
FaultData601mActive
FillUp601mActive
FuelAndEnergyUsed601mActive
FuelTaxDetail601mActive
FuelTransaction2501mActive
FuelUsed601mActive
Go5601mActive
Go6601mActive
Go7601mActive
Go8601mActive
Go9601mActive
GoAnywhere601mActive
GoAnywhereLite601mActive
GoCurve601mActive
GoCurveAuxiliary601mActive
GoDevice601mActive
GoDriveDevice601mActive
IoxAddOn601mActive
IoxAddOnStatus601mActive
LogRecord601mActive
MediaFile601mActive
NameEntity601mActive
NameEntityWithVersion601mActive
Route2001mActive
Rule1501mActive
ShipmentLog601mActive
StatusData601mActive
TachographDataFile10001mActive
TextMessage999991sActive
Trailer3001mActive
TrailerAttachment1501mActive
Trip601mActive
UntrackedAsset601mActive
User2501mActive
XDevice601mActive
Zone2001mActive
Rate limit rules: Remove
EntityLimitPeriodStatus
AddIn101mActive
AddInData22501mActive
AnnotationLog1001mActive
BinaryData1001mActive
BinaryPayload1001mActive
ChargeEvent1001mActive
Condition1001mActive
Controller1001mActive
CustomData1001mActive
CustomDevice1001mActive
CustomVehicleDevice1001mActive
DataDiagnostic1001mActive
DebugData1001mActive
Defect1001mActive
Device2501mActive
DeviceShare2501mActive
DeviceStatusInfo1001mActive
Diagnostic1001mActive
DistributionList1001mActive
DriverChange2501mActive
DutyStatusLog2501mActive
DVIRLog3501mActive
EmissionVehicleEnrollment5001mActive
EntityWithVersion1001mActive
ExceptionEvent1001mActive
ExceptionEventState1001mActive
FailureMode1001mActive
FaultData1001mActive
FaultStatus1001mActive
FillUp1001mActive
FlashCode1001mActive
FuelAndEnergyUsed1001mActive
FuelEvent1001mActive
FuelTaxDetail1001mActive
FuelTransaction2001mActive
FuelUsed1001mActive
Go51001mActive
Go61001mActive
Go71001mActive
Go81001mActive
Go91001mActive
GoAnywhere1001mActive
GoAnywhereLite1001mActive
GoCurve1001mActive
GoCurveAuxiliary1001mActive
GoDevice1001mActive
GoDriveDevice1001mActive
Group3501mActive
GroupSecurity1001mActive
IoxAddOn1001mActive
IoxAddOnStatus1001mActive
LogRecord1001mActive
MediaFile601mActive
NameEntity1001mActive
NameEntityWithVersion1001mActive
ParameterGroup1001mActive
Route2001mActive
RoutePlanItem1001mActive
Rule1501mActive
SecurityClearance1001mActive
ShipmentLog1001mActive
Source1001mActive
StatusData1001mActive
TachographDriverActivity1001mActive
TachographDrivingTimeStatus1001mActive
Tag1001mActive
TextMessage999991sActive
Trailer3001mActive
TrailerAttachment1501mActive
Trip1001mActive
UntrackedAsset1001mActive
VehicleConfiguration1001mActive
WifiHotspot601mActive
WorkHoliday1001mActive
WorkTime1001mActive
WorkTimeDetail1001mActive
XDevice1001mActive
Zone10001mActive
ZoneType1001mActive
Rate limit rules: Set
EntityLimitPeriodStatus
AddIn101mActive
AddInData17001mActive
AnnotationLog1001mActive
BinaryPayload1001mActive
ChargeEvent1001mActive
Controller1001mActive
CustomData1001mActive
CustomDevice1001mActive
CustomVehicleDevice1001mActive
DataDiagnostic1001mActive
Defect1001mActive
Device2501mActive
DeviceShare2501mActive
DeviceStatusInfo1001mActive
Diagnostic1001mActive
DistributionList1001mActive
Driver1001mActive
DutyStatusLog2501mActive
DVIRLog3501mActive
EmissionVehicleEnrollment5001mActive
EntityWithVersion1001mActive
ExceptionEvent1001mActive
ExceptionEventState1001mActive
FailureMode1001mActive
FaultData12001mActive
FaultStatus1001mActive
FillUp1001mActive
FlashCode1001mActive
FuelAndEnergyUsed1001mActive
FuelEvent1001mActive
FuelTransaction2001mActive
FuelUsed1001mActive
Go51001mActive
Go61001mActive
Go71001mActive
Go81001mActive
Go91001mActive
GoAnywhere1001mActive
GoAnywhereLite1001mActive
GoCurve1001mActive
GoCurveAuxiliary1001mActive
GoDevice1001mActive
GoDriveDevice1001mActive
Group3501mActive
GroupSecurity1001mActive
IoxAddOn1001mActive
IoxAddOnStatus1001mActive
MediaFile601mActive
NameEntity1001mActive
NameEntityWithVersion1001mActive
ParameterGroup1001mActive
Route2001mActive
RoutePlanItem1001mActive
Rule1501mActive
SecurityClearance1001mActive
ShipmentLog3501mActive
Source1001mActive
StatusData1001mActive
TachographDataFile601mActive
Tag1001mActive
TextMessage999991sActive
Trailer3001mActive
TrailerAttachment1501mActive
Trip1001mActive
UntrackedAsset1001mActive
User2501mActive
VehicleConfiguration1001mActive
WifiHotspot601mActive
WorkHoliday1001mActive
WorkTime1001mActive
WorkTimeDetail1001mActive
XDevice1001mActive
Zone2001mActive
ZoneType1001mActive
Rate limit rules: Web methods
MethodLimitPeriodStatus
Authenticate101mActive
CreateDatabase151mActive
DownloadMediaFile2401mActive
EmissionEnrollDevices101mActive
GenerateCaptcha101mActive
GetAddresses4501mActive
GetCoordinates3001mActive
GetDaylightSavingRules2501mActive
GetDirections2001mActive
GetEmissionComplianceDeadline5001mActive
GetLanguages601mActive
GetPostedRoadSpeedsForDevice3001mActive
GetRegions601mActive
GetSystemTimeUtc5001mActive
GetTimeZones1001mActive
GetVersion40001mActive
GetVersionInformation110001mActive
OptimizeWaypoints1001mActive
SetUserPassword21mActive
UploadMediaFile601mActive