Public API keys and webhooks
Create scoped API keys for your TMS, payroll or BI tools, and receive signed webhook events at your own HTTPS endpoints.
The Developer pages let you connect EZ Logs to other systems. API keys let an integration call the EZ Logs Public API with only the permissions (scopes) you grant. Webhooks push events, such as a load status change or a submitted DVIR, to your own HTTPS endpoint as they happen. API reference documents every operation and event.
ELD records stay read-only: HOS logs (49 CFR 395 Subpart B) can never be created or edited through the API.
Before you start
- The Developer pages are part of the Public API feature. If you do not see Developer under Settings, the feature is not turned on for your account. Contact EZ Logs support to enable it.
- Data in other modules is only available when that module is on as well. For example, the loads operations need Dispatch, and pay statements need Driver pay.
- Owners and carrier admins can create, change and revoke keys and webhook endpoints. Support (read-only) users can view the pages but not change them. Drivers have no access. See Users and roles.
- Every change is recorded in the Audit log (without the key or secret itself).
Getting there
Open Settings in the left rail, then under Developer choose:
- API keys — manage keys.
- Webhooks — manage webhook endpoints and see their deliveries.
- API reference — the full Public API and webhook documentation.
The three pages are also linked by tabs at the top of each Developer page.
API keys
The API keys page lists each key with its name and prefix (for example ezl_live_Ab12Cd34…), scopes, status (Active, Expiring soon, Expired or Revoked), when and from which IP it was last used, its limits, its expiry and who created it. The full key is never shown again after it is created.
A carrier can have up to 25 active keys. Create a separate key for each integration so you can revoke one without affecting the others.
Keys start with ezl_live_ in production. Keys from a test environment start with ezl_test_ and do not work in production.
Create an API key
- Go to Settings > Developer > API keys and click Create API key.
- Enter a Name that identifies the integration (for example "McLeod TMS sync"), up to 100 characters.
- Under Scopes, tick only what the integration needs (see the table below). Scopes cannot be changed later.
- Optional: set Expires (optional) to a date after today. Leave it empty for a key that never expires.
- Optional: change Rate limit (requests per minute). The default is 120; you can choose 1 to 1000.
- Optional: enter an IP allow-list (optional): one IPv4 or IPv6 address or CIDR range per line (for example
203.0.113.0/24), up to 50 entries. Leave it empty to allow any IP. - Click Create key.
- Copy the key from the dialog (use the copy button) and store it in your secret manager.
- Tick I have stored it somewhere safe, then click Done.
Important: The key is shown only once. EZ Logs keeps only a hash of it and cannot show it again. If you lose it, rotate the key to get a new one.
Scopes
| Group | Scope | Gives access to |
|---|---|---|
| Drivers & fleet | drivers:read | Drivers |
| Drivers & fleet | vehicles:read | Vehicles |
| Drivers & fleet | assets:read | Trailers and assets (including trailer readings and pairings) |
| Hours of service & tracking | hos:read | HOS logs and clocks (read only) |
| Hours of service & tracking | locations:read | Vehicle locations |
| Hours of service & tracking | alerts:read | Alerts |
| Compliance & safety | dvirs:read | DVIRs |
| Compliance & safety | documents:read | Documents |
| Compliance & safety | safety:read | Safety events and scores |
| Compliance & safety | ifta:read | IFTA miles and quarterly summaries |
| Operations | loads:read | Dispatch loads |
| Operations | loads:write | Create and update loads (marked Write) |
| Operations | fuel:read | Fuel purchases, idle events and fuel anomalies |
| Operations | maintenance:read | Maintenance work orders, PM programs, schedule, service records and meters |
| Finance | pay:read | Driver pay statements (marked Sensitive) |
- Ticking
loads:writealso ticksloads:read. pay:readexposes driver earnings and deductions. Grant it only to your payroll integration.loads:writeis the only write scope. Write requests are refused while your account is read-only for billing reasons (see Billing and your free trial).
Using a key
Send the key in the Authorization header of every request: Authorization: Bearer <key>. Portal sign-in sessions and cookies are not accepted by the Public API.
- Call
GET /public/v1/meto check a new key: it returns the carrier, scopes, expiry and rate limit of the key and needs no scope. - Every response carries
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset. When the per-minute limit is used up the API answers429 rate_limitedwith aRetry-Afterheader (seconds). - Common errors:
401 invalid_api_key,401 api_key_revoked,401 api_key_expired,403 ip_not_allowed(the caller is not on the IP allow-list),403 feature_disabled(the Public API or the module is off), and403 insufficient_scope(the key lacks the scope the operation needs). - Lists return
{ data, nextCursor }; passcursor=<nextCursor>for the next page (limit1 to 200, default 50).
Edit a key
- On API keys, click the pencil (Edit) next to an active key.
- Change the Name, IP allow-list or Rate limit (requests per minute).
- Click Save key.
Scopes and expiry cannot be edited. To change them, create a new key and revoke the old one.
Rotate a key
Rotate a key when it may have been exposed, or on a regular schedule.
- Click Rotate next to the key.
- Choose an Overlap: how long the old key keeps working so you can deploy the new one first. Options: None: stop the old one now, 1 hour, 24 hours (default), 3 days or 7 days.
- Click Rotate key.
- Copy the new key, tick I have stored it somewhere safe and click Done. The dialog shows until when the previous key keeps working.
The new key has the same scopes and limits as the old one.
Revoke a key
- Click Revoke next to the key.
- Confirm with Revoke key.
Requests with that key are refused immediately (401 api_key_revoked). Revoking cannot be undone.
Webhooks
EZ Logs sends each event as a signed JSON POST to your endpoint. A carrier can have up to 10 endpoints. Each endpoint card shows its URL and description, its status (Enabled, Enabled, failing, Disabled or Disabled after failures), the consecutive failure count against the auto-disable threshold, the last success and last failure, and the events it receives.
Events you can subscribe to
| Event | Sent when |
|---|---|
hos.duty_status_changed | A driver's ELD recorded a new duty status (the newest status per driver of each upload). |
hos.violation | An HOS violation alert fired (needs an active HOS violation alert rule). |
dvir.submitted | A driver submitted a vehicle inspection report. |
alert.fired | Any alert rule fired. |
alert.resolved | An alert was resolved, automatically or by a user. |
load.status_changed | A dispatch load changed status (also when changed through the API). |
document.expiring | A tracked document reached an expiry threshold or expired. |
vehicle.location | The latest GPS position of a vehicle, at most once per vehicle every 5 minutes. |
fuel.anomaly | A fuel purchase anomaly was detected. |
safety.event | A safety event was recorded. |
trailer.hooked | A trailer was hooked to a tractor. |
trailer.dropped | A trailer was dropped. |
pay.statement_approved | A driver pay statement was approved (pay data, see below). |
Alerts-based events need the matching alert rules (see Alerts and geofences), and module events need that module turned on.
Add an endpoint
- Go to Settings > Developer > Webhooks and click Add endpoint.
- Enter the Endpoint URL. It must start with
https://, be on a public host, and must not contain a user name or password. - Optional: add a Description (optional), for example "TMS production".
- Under Events, tick the events this endpoint should receive.
- For pay events, first tick Include pay data (driver pay statements), then tick the pay event. Pay events are only sent to endpoints with this opt-in.
- Click Add endpoint.
- Copy the Signing secret, tick I have stored it somewhere safe and click Done. The secret is shown only once.
To change the URL, description or events later, click Edit on the endpoint card and then Save endpoint. Turning off Include pay data removes the pay events from the endpoint.
Send a test
Click Send test on the endpoint card. EZ Logs posts a signed webhook.test event and shows the result, for example "Test delivered: HTTP 200 in 120 ms" or "Test failed: HTTP 500".
Verify the signature
Every delivery has an EZL-Signature header in the form t=<unix seconds>,v1=<hex signature>. To verify it on your receiver:
- Read
tand thev1value(s) from the header. During a secret rotation there are twov1values (old and new secret): accept either. - Compute the HMAC-SHA256 (hex) of the string
<t>.<raw body>using the endpoint's signing secret, over the raw request body exactly as received (before any JSON parsing). - Compare your result with each
v1value using a constant-time comparison. - Reject the request if
tis more than 5 minutes away from your clock, to stop replays.
The API reference page has the same steps and a Node.js snippet you can copy.
Each delivery also carries EZL-Event-Id, EZL-Event-Type, EZL-Delivery-Id and EZL-Delivery-Attempt headers. The body is { id, type, apiVersion, createdAt, carrierId, data }.
Respond, retries and auto-disable
- Answer with any 2xx status within 10 seconds. Any other status, a redirect (redirects are not followed), a timeout or a connection error counts as a failed attempt.
- A failed delivery is retried with exponential backoff: after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours (7 attempts in total). After the last attempt the delivery is marked Failed.
- The event
idis identical on retries and redeliveries. Use it to ignore duplicates. - After 20 consecutive failed attempts the endpoint is disabled automatically (Disabled after failures), its pending retries are stopped and your admins get a portal notification. Any successful delivery resets the counter.
To bring a disabled endpoint back: fix your receiver, click Send test, then click Enable. Re-enabling resets the failure counter. You can also switch an endpoint off yourself with Disable.
Delivery log
- Click Deliveries on an endpoint card.
- Filter by Status (Succeeded, Failed, Retrying, Pending) or Event if needed. Click Load older deliveries to see more.
- Click Details on a delivery to see the response code, latency, attempts, last attempt, next retry, the error, the request body and the first 512 characters of the response.
- To send the same event again, click Redeliver (owners and carrier admins). The redelivery is a new delivery with the same event id and is marked Manual in the log.
Deliveries are kept for 30 days.
Rotate the signing secret
- Click Rotate secret on the endpoint card.
- Choose an Overlap (None: stop the old one now, 1 hour, 24 hours, 3 days or 7 days).
- Click Rotate secret, then copy and store the new secret.
During the overlap every delivery is signed with both secrets (two v1 values), so you can update your receiver without missing events.
Delete an endpoint
Click Delete on the endpoint card and confirm with Delete endpoint. The endpoint stops receiving events and its delivery log is deleted. This cannot be undone.
API reference
Settings > Developer > API reference shows the full Public API: the base URL to use, every operation grouped by area with its parameters, required scope and response, the webhook events and their payloads, and the signature steps. Click Download the OpenAPI document (JSON) to import the API into your tools.
The API at /public/v1 only changes additively (new fields, operations and event types), so integrations should ignore fields they do not know. All timestamps are ISO-8601 UTC and distances are in miles.
Good practice
- Use one key per integration, with the fewest scopes and an IP allow-list where your integration has fixed addresses.
- Never put a key or signing secret in email, chat or source code. Keep them in a secret manager.
- Rotate keys and secrets with an overlap so the integration keeps working while you deploy the new value.
- Revoke keys you no longer use. Check Last used to find unused keys.