AlexxIT/go2rtc · error

failed to fetch ring devices

Error message

failed to fetch ring devices: %w

What it means

FetchRingDevices' GET ring_devices request (via c.Request) returned an error — typically an expired token or network/API failure. Wraps the underlying request error before any JSON parsing is attempted.

Solutions

  1. Verify auth token validity and refresh if expired
  2. Check network connectivity to the Ring API
  3. Retry after transient failures
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at pkg/ring/api.go:340 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of AlexxIT/go2rtc@c245815e75 (2026-09-07). Data as JSON: /api/errors/c0b21e5356d374cf. Report an issue: GitHub.

Appendix: source

Thrown at pkg/ring/api.go:340

	c.tokenExpiry = time.Now().Add(expiresIn)

	c.RefreshToken = encodeAuthConfig(c.authConfig)
	if c.onTokenRefresh != nil {
		c.onTokenRefresh(c.RefreshToken)
	}

	// Refresh the cached client
	cacheMutex.Lock()
	clientCache[c.cacheKey] = c
	cacheMutex.Unlock()

	return c.authToken, nil
}

func (c *RingApi) FetchRingDevices() (*RingDevicesResponse, error) {
	response, err := c.Request("GET", ClientAPI("ring_devices"), nil)
	if err != nil {
		return nil, fmt.Errorf("failed to fetch ring devices: %w", err)
	}

	var devices RingDevicesResponse
	if err := json.Unmarshal(response, &devices); err != nil {
		return nil, fmt.Errorf("failed to unmarshal devices response: %w", err)
	}

	// Process "other" devices
	var onvifCameras []CameraData
	var intercoms []CameraData

	for _, device := range devices.Other {
		kind, ok := device["kind"].(string)
		if !ok {
			continue
		}

		switch RingDeviceType(kind) {

View on GitHub (pinned to c245815e75)