Skip to main content

Troubleshooting

Organized by what you see, with the most likely cause first. API error shapes are documented exhaustively in Errors and limits; this page is the triage view.

API: authentication

SymptomLikely causeFix
401 {"error": "auth_failed"}Wrong key, or right key on the wrong environment (keys never cross environments)Verify the key against the environment you are calling; prefixes (cos_live_, cos_dev_, cos_sbx_) identify the environment at a glance
401 from the fleet agent while the same key works in curlOlder agent builds send Authorization: Bearer; the platform only accepts x-api-keyCheck which header your agent version sends; see the integration bundle caveat
401 with a console-generated keyKeys generated in the console browser are not registered until the platform team provisions themGet the key provisioned; see Authentication
429 {"error": "auth_lockout", "retry_after_seconds": N}5 auth failures from your IP within 300 seconds; lockout lasts 900 seconds and fires before key verificationStop the failing client, fix the credential, wait out Retry-After; make clients treat 401 as fatal so this cannot recur

API: limits

SymptomLikely causeFix
429 {"error": "rate_limited", "retry_after_seconds": N}Over 30 requests/min per IP, 60/min per tenant, or the 10/s burstHonor Retry-After; batch reads (one topology call, up to 100 link_ids per predictions call) instead of per-entity requests
413 {"error": "request_too_large", ...}Body over the 1 MB capSplit the payload; the body names max_bytes and received_bytes
413 {"error": "batch_too_large", "max": 1000, ...}More than 1,000 telemetry records in one batchChunk to 1,000; never retry the oversized batch as-is
411 {"error": "length_required"}Body request without Content-Length (usually chunked encoding)Send a Content-Length header
422 with a detail listA record failed schema validation (bad time format is the classic)The detail entries locate the failing record by index and field

API: availability

SymptomLikely causeFix
503 {"error": "telemetry_unavailable", "upstream": "influx", ...}Your tenant's data plane is transiently unreachableRetry after the Retry-After hint (typically 5 seconds) with a retry cap; check GET /health/telemetry
503 {"error": "tenant_unavailable"}Key authenticated but the tenant is not registered in this environmentYou are probably on the wrong environment for this tenant; otherwise contact the platform team
403 {"error": "tenant_disabled"}The tenant has been disabled; fail-closed is intentionalContact the platform team

API: empty or odd data

SymptomLikely causeFix
GET /topology returns 200 with empty entitiesNo telemetry inside the freshness_seconds window at as_of_utc (default now), or the wrong measurement familyWiden freshness_seconds, pass an explicit as_of_utc for seeded or historical data, confirm the measurement; the key is fine, 200 proves it
400 {"error": "invalid_input", "field": "entity_type"}measurement not one of link, satellite, ground_station, weather, telemetryCustom metrics are written under telemetry with identifying tags; read them back that way
Predictions return an empty items listNo cached prediction set for those links yet, or link_ids do not match your topology's link identitiesTry live=true; cross-check ids against GET /topology?measurement=link
400 {"error": "too_many_link_ids", "max": 100, ...}Over the 100-link cap on GET /predictionsChunk the fleet into requests of 100

Console

SymptomLikely causeFix
Blank globe, healthy UIEmpty base state (no dataset activated) or every asset group toggled offLoad the demo or a dataset from fleet setup; check group visibility toggles in the Assets panel
Satellites frozen or missing after a big timeline seekThe seek landed outside the precomputed propagation window, or assets are outside their TLE epoch validityBrief coarse motion after a seek resolves itself; persistent absence means stale epochs, check epoch age on the card
Chat replies "offline" or only handles simple queriesNo chat backend is reachable; the local intent layer still answers deterministic queriesCheck connection status under Settings, Chat; verify network access to the chat endpoint
Assistant refuses with an upgrade messageGuest query limit (10) exhausted, or the request needs a prediction tier your plan lacksSign in or upgrade; see Plans and billing
Import rejected recordsMalformed TLE lines (wrapping, missing 1 /2 prefixes, NORAD id mismatch across lines)The per-record report quotes the offending text; fix those records and re-import (dedupe makes this safe)
Import succeeded but nothing on the globeTabular data without recognizable position columns, or the group is hiddenCheck the import warnings; add lat/lon columns or a TLE, check visibility
Predictions panel shows "baseline" instead of your modelNo tenant API key configured in the console, or guest modeThe baseline is the honest keyless fallback; configure live API access to get your tenant's model
Elevation mask or horizon looks syntheticNo terrain token configuredExpected fallback, and labeled as such; real terrain requires a Cesium ion token in the build

Escalation

If a failure does not match these tables, capture the full response body (the error code is designed to be quoted), the environment, and the UTC time, and check the per-subsystem health endpoints (GET /health/telemetry, /health/topology, /health/predictions) before reporting. Monitor the platform shows how to automate exactly that capture.