commaai/openpilot · warning · APIError

error getting events for segment {self._name}

Error message

error getting events for segment {self._name}

What it means

Segment.events fetches {segment_url}/events.json over HTTP; any failure (non-2xx status, network error, bad JSON) is wrapped in APIError. events.json is an optional per-segment artifact on openpilot's data backend, so 404s are the most common cause.

Source

Thrown at openpilot/tools/lib/route.py:202

  def _get_route_metadata(route_name: str):
    api = CommaApi(get_token())
    return api.get(f'v1/route/{route_name}')

  @property
  def url(self):
    route_name = self._name.route_name.canonical_name
    metadata = self._get_route_metadata(route_name)
    return f'{metadata["url"]}/{self._name.segment_num}'

  @property
  def events(self):
    if not self._events:
      try:
        resp = requests.get(f'{self.url}/events.json')
        resp.raise_for_status()
        self._events = resp.json()
      except Exception as e:
        raise APIError(f'error getting events for segment {self._name}') from e
    return self._events


class RouteName:
  def __init__(self, name_str: str):
    self._name_str = name_str
    delim = next(c for c in self._name_str if c in ("|", "/"))
    self._dongle_id, self._time_str = self._name_str.split(delim)

    assert len(self._dongle_id) == 16, self._name_str
    assert len(self._time_str) == 20, self._name_str
    self._canonical_name = f"{self._dongle_id}|{self._time_str}"

  @property
  def canonical_name(self) -> str: return self._canonical_name

  @property
  def dongle_id(self) -> str: return self._dongle_id

View on GitHub (pinned to 516ec1e682)

Solutions

  1. Treat events as optional: wrap access in try/except APIError and default to an empty list
  2. Check the URL manually with curl to distinguish 404 (no events) from 401/timeout
  3. For offline analysis, skip .events entirely — it is enrichment data, not core log data

Example fix

# before
events = seg.events

# after
from openpilot.tools.lib.route import APIError
try:
    events = seg.events
except APIError:
    events = []  # events.json is optional metadata
Defensive patterns

Strategy: try-catch

Validate before calling

import requests

def has_events(segment_url: str) -> bool:
    try:
        return requests.head(f'{segment_url}/events.json', timeout=10).status_code == 200
    except requests.RequestException:
        return False

Try / catch

from openpilot.tools.lib.route import APIError
try:
    events = seg.events
except APIError:
    events = []  # events.json is optional enrichment

Prevention

When it happens

Trigger: Accessing segment.events for old or non-user routes where events.json was never generated; the backend URL from route metadata is stale; offline runs.

Common situations: Older routes predating events.json; network/VPN issues; hitting the API without credentials for a private route.

Related errors


AI-assisted analysis of commaai/openpilot@516ec1e682 (2026-08-15). Data as JSON: /api/errors/507e489916af3d7e. Report an issue: GitHub.