Webhook

Setting your business webhook with the API, and the messages it receives.

Your business has one webhook. Every shared vehicle's telemetry is posted to it. You can set it on the Webhook page, or with these endpoints.

Setting the webhook

PUT /api/business/webhook sets the webhook, and replaces any webhook you had.

Curl Example
curl --request PUT --header "Authorization: Bearer {token}" --header 'Content-Type: application/json' \
  --data '{"url":"https://fleetco.example/tesla/webhook","format":"teslemetry","auth":"Bearer {your secret}"}' \
  'https://api.teslemetry.pro/api/business/webhook'
FieldRequiredDescription
urlYesWhere each message is posted. Must be reachable from the internet.
formatYesteslemetry, tesla or splunk. See Payloads.
authNoSent as the Authorization header with every message. Never returned.
verifyNoCheck the TLS certificate of url. Defaults to true.
enabledNoDeliver messages. Defaults to true. Send false to pause delivery without deleting the webhook.
Response
{
  "response": {
    "url": "https://fleetco.example/tesla/webhook",
    "format": "teslemetry",
    "auth": true,
    "verify": true,
    "enabled": true,
    "updated_at": "2026-10-05T00:00:00.000Z"
  }
}

auth in the response only says whether a header is set.

A URL that is not reachable from the internet, such as localhost, a .local name or a private IP address, is refused with 400 invalid_webhook_url.

Reading and deleting

  • GET /api/business/webhook returns the webhook, in the same shape as above.
  • DELETE /api/business/webhook deletes it and returns {"response": true}.

Both return 404 webhook_not_found when no webhook is set.

Verifying messages

Teslemetry does not sign webhook messages. Set auth to a long random secret, and check the Authorization header of each request your URL receives against it. Use https:// so the header and data are encrypted.

Delivery

Each message is an HTTP POST with Content-Type: application/json, sent once. A message your server does not accept is not retried, so answer quickly with a 2xx and process the message afterwards.

Messages carry the vin of the vehicle they are about. Use it with your consented products to find the customer.

Topics

TopicDescription
dataTelemetry data updates, for the fields in the vehicle's streaming config
stateVehicle state changes (online, asleep, driving)
vehicle_dataFull vehicle data responses
alertsAlert notifications
errorsError events from the vehicle
connectivityConnection status changes

Payloads

A data message in each format:

Teslemetry format
{
  "data": {
    "Location": {
      "latitude": 30.2226645,
      "longitude": -97.6213806
    },
    "VehicleSpeed": "34.797"
  },
  "createdAt": "2026-10-05T04:58:44.983607402Z",
  "vin": "5YJ3E1EA7KF000001"
}
Tesla format
{
  "data": [
    {
      "key": "Location",
      "value": {
        "locationValue": {
          "latitude": 30.2226645,
          "longitude": -97.6213806
        }
      }
    },
    {
      "key": "VehicleSpeed",
      "value": {
        "stringValue": "34.797"
      }
    }
  ],
  "createdAt": "2026-10-05T04:58:44.983607402Z",
  "vin": "5YJ3E1EA7KF000001"
}
Splunk format
{
  "time": 1791176324.9836073,
  "host": "na1.teslemetry.com",
  "source": "5YJ3E1EA7KF000001",
  "sourcetype": "tesla:telemetry:data",
  "event": {
    "Location": {
      "latitude": 30.2226645,
      "longitude": -97.6213806
    },
    "VehicleSpeed": "34.797"
  }
}

In the Teslemetry format, alerts and errors messages are keyed by name. The Tesla format is Tesla's own message, unchanged. The Splunk format is a Splunk HTTP Event Collector event; an auth value without a scheme is sent as Splunk <auth>.