ipfs/kubo · warning
telemetry endpoint returned HTTP %d
Error message
telemetry endpoint returned HTTP %d
What it means
sendTelemetry posts the node's telemetry report to the configured collector endpoint and, when the response status is >= 400, returns 'telemetry endpoint returned HTTP <code>' (after logging at debug level). The endpoint rejected the payload or the request, so this cycle's telemetry was not accepted. Status 410 is special-cased as errEndpointRetired.
Source
Thrown at plugin/plugins/telemetry/telemetry.go:808
// so HTTP_PROXY, HTTPS_PROXY and NO_PROXY are respected.
client := &http.Client{
Timeout: httpTimeout,
}
resp, err := client.Do(req)
if err != nil {
log.Debugf("failed to send telemetry: %s", err)
return err
}
defer resp.Body.Close()
// A collector says it is permanently out of service with 410 Gone, which
// stops this node for good. See retire.
if resp.StatusCode == http.StatusGone {
return errEndpointRetired
}
if resp.StatusCode >= 400 {
err := fmt.Errorf("telemetry endpoint returned HTTP %d", resp.StatusCode)
log.Debug(err)
return err
}
log.Debugf("telemetry sent successfully (%d)", resp.StatusCode)
return nil
}
View on GitHub (pinned to 329838acdf)
Solutions
- Check the status code: 410 means the endpoint is retired — stop sending (kubo handles this via errEndpointRetired) or upgrade kubo
- Verify the collector URL in config (Telemetry settings) is current and reachable
- Check IPFS_TELEMETRY=off / DO_NOT_TRACK if you simply want to silence telemetry entirely
- Retry later for 429/5xx; failures are non-fatal and logged at debug level
Example fix
// before collector := "https://old-collector.example.com/v1" // after collector := "https://current-collector.example.com/v2" // or disable: IPFS_TELEMETRY=off ipfs daemon
Defensive patterns
Strategy: retry
Validate before calling
resp, err := http.Head(collectorURL)
if err == nil && resp.StatusCode == http.StatusGone {
// endpoint retired; disable telemetry or update collector
} Try / catch
if err := sendTelemetry(ctx, payload); err != nil {
if errors.Is(err, errEndpointRetired) { disableTelemetry() }
// otherwise: log and retry on next cycle; non-fatal
log.Debug(err)
} Prevention
- Keep kubo updated so the payload schema matches the current collector
- Validate collector URL configuration
- Set IPFS_TELEMETRY=off or DO_NOT_TRACK=1 if telemetry is unwanted
- Treat 4xx/5xx as non-fatal; telemetry must never break the daemon
When it happens
Trigger: Collector returns 400 (malformed payload/schema mismatch), 401/403 (auth/token invalid), 404/410 (endpoint moved or retired), or 429/5xx (rate limit, collector outage).
Common situations: A kubo version posting a schema the collector no longer accepts, misconfigured collector URL, retired endpoint pinned in an old binary, or the collector temporarily down.
Related errors
- GitHub API returned HTTP %d for %s
- download returned HTTP %d
- unexpected redirect
- no local swarm address for migration node
- could not connect to migration peer %q: %s
AI-assisted analysis of ipfs/kubo@329838acdf (2026-09-03).
Data as JSON: /api/errors/9165f885c8821c43.
Report an issue: GitHub.