{"openapi":"3.1.0","info":{"title":"Foxglove (BYOK) API","version":"0.1.0","description":"Foxglove (BYOK) lets an AI assistant read your own Foxglove data through the Foxglove API with a key you supply (Foxglove API key (fox_sk_...)). Read-only: 10 tools (list_devices, get_device, list_projects, list_recordings, list_sessions, list_events, list_event_types, list_coverage, list_custom_properties, list_sites). The BYOK key travels with each request, is used for that one call only and is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-foxglove.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-foxglove/docs"},"termsOfService":"https://connectorbay.com/byok-foxglove/terms"},"servers":[{"url":"https://byok-foxglove.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-foxglove/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_devices":{"post":{"operationId":"list_devices","summary":"List the robots (devices) of the organization with name, project and custom properties. Needs an API key with the device","description":"List the robots (devices) of the organization with name, project and custom properties. Needs an API key with the devices.list capability. Use for \"Which robots are registered in Foxglove\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only items of this project id (from list_projects). Needed in multi-project organizations.","title":"Project Id"},"sort_by":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Sort by id, name or a custom property key prefixed with properties.","title":"Sort By"},"sort_order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order: asc or desc.","title":"Sort Order"},"query":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Filter on custom properties, for example properties.site:berlin.","title":"Query"},"limit":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"Maximum items to return (default 100, at most 2000).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip, for paging.","title":"Offset"}},"title":"list_devicesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_device":{"post":{"operationId":"get_device","summary":"Get one robot (device) by name or id. Use for \"Show Foxglove device robot-01\".","description":"Get one robot (device) by name or id. Use for \"Show Foxglove device robot-01\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"device":{"description":"Device name or device id (names with special characters are URL-encoded for you).","maxLength":120,"title":"Device","type":"string"},"project_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only items of this project id (from list_projects). Needed in multi-project organizations.","title":"Project Id"}},"required":["device"],"title":"get_deviceArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_projects":{"post":{"operationId":"list_projects","summary":"List the Foxglove projects (data isolation groups) the key can see with member counts and last seen time. Needs projects","description":"List the Foxglove projects (data isolation groups) the key can see with member counts and last seen time. Needs projects.list. Use for \"Which Foxglove projects do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_projectsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_recordings":{"post":{"operationId":"list_recordings","summary":"List recordings (data files uploaded by robots) with path, size, time range, device and import status. Needs recordings.","description":"List recordings (data files uploaded by robots) with path, size, time range, device and import status. Needs recordings.list. Use for \"What recordings did robot-01 make this week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of an inclusive time range, RFC 3339 UTC like 2026-06-01T00:00:00Z.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of an inclusive time range, RFC 3339 UTC like 2026-06-02T00:00:00Z.","title":"End"},"device_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only recordings of this device id.","title":"Device Id"},"device_name":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"Only recordings of the device with this name.","title":"Device Name"},"import_status":{"anyOf":[{"enum":["none","pending","importing","failed","complete"],"type":"string"},{"type":"null"}],"default":null,"description":"Only recordings with this import status.","title":"Import Status"},"topic":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only recordings containing this topic.","title":"Topic"},"project_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only items of this project id (from list_projects). Needed in multi-project organizations.","title":"Project Id"},"sort_by":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Field to sort by, for example id or start.","title":"Sort By"},"sort_order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order: asc or desc.","title":"Sort Order"},"limit":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"Maximum items to return (default 100, at most 2000).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip, for paging.","title":"Offset"}},"title":"list_recordingsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_sessions":{"post":{"operationId":"list_sessions","summary":"List recording sessions (groups of recordings from a device, such as a drive or mission). Needs sessions.list. Use for \"","description":"List recording sessions (groups of recordings from a device, such as a drive or mission). Needs sessions.list. Use for \"Which Foxglove sessions did robot-01 record last week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"device_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only sessions of this device id.","title":"Device Id"},"device_name":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"Only sessions of the device with this name.","title":"Device Name"},"key_matches":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Case-insensitive partial match on the session key.","title":"Key Matches"},"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of an inclusive time range, RFC 3339 UTC like 2026-06-01T00:00:00Z.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of an inclusive time range, RFC 3339 UTC like 2026-06-02T00:00:00Z.","title":"End"},"project_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only items of this project id (from list_projects). Needed in multi-project organizations.","title":"Project Id"},"sort_by":{"anyOf":[{"enum":["id","createdAt","updatedAt"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by id, createdAt or updatedAt.","title":"Sort By"},"sort_order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order: asc or desc.","title":"Sort Order"},"limit":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"Maximum items to return (default 100, at most 2000).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip, for paging.","title":"Offset"}},"title":"list_sessionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_events":{"post":{"operationId":"list_events","summary":"List events (marked points or ranges of interest in recordings) with device, time range and metadata. Needs events.list.","description":"List events (marked points or ranges of interest in recordings) with device, time range and metadata. Needs events.list. Use for \"What events were marked on robot-01 yesterday\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of an inclusive time range, RFC 3339 UTC like 2026-06-01T00:00:00Z.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of an inclusive time range, RFC 3339 UTC like 2026-06-02T00:00:00Z.","title":"End"},"device_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only events of this device id.","title":"Device Id"},"device_name":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"Only events of the device with this name.","title":"Device Name"},"event_type_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only events of this event type id.","title":"Event Type Id"},"project_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only items of this project id (from list_projects). Needed in multi-project organizations.","title":"Project Id"},"query":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Filter on event metadata, for example severity:high.","title":"Query"},"sort_by":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Field to sort by, for example start.","title":"Sort By"},"sort_order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order: asc or desc.","title":"Sort Order"},"limit":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"Maximum items to return (default 100, at most 2000).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip, for paging.","title":"Offset"}},"title":"list_eventsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_event_types":{"post":{"operationId":"list_event_types","summary":"List the event types defined in the organization. Needs eventTypes.list. Use for \"Which Foxglove event types exist\".","description":"List the event types defined in the organization. Needs eventTypes.list. Use for \"Which Foxglove event types exist\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_event_typesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_coverage":{"post":{"operationId":"list_coverage","summary":"List time spans for which Foxglove has data for a device (coverage ranges). Needs start and end. Use for \"When do I have","description":"List time spans for which Foxglove has data for a device (coverage ranges). Needs start and end. Use for \"When do I have Foxglove data for robot-01 in June\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start":{"description":"Start of the inclusive time range, RFC 3339 UTC.","maxLength":40,"title":"Start","type":"string"},"end":{"description":"End of the inclusive time range, RFC 3339 UTC.","maxLength":40,"title":"End","type":"string"},"device_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only this device id.","title":"Device Id"},"device_name":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"Only the device with this name.","title":"Device Name"},"tolerance":{"anyOf":[{"maximum":86400,"minimum":14,"type":"integer"},{"type":"null"}],"default":null,"description":"Minimum gap in seconds between separate ranges (at least 14).","title":"Tolerance"},"project_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only items of this project id (from list_projects). Needed in multi-project organizations.","title":"Project Id"}},"required":["start","end"],"title":"list_coverageArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_custom_properties":{"post":{"operationId":"list_custom_properties","summary":"List the custom property definitions (typed metadata keys) for devices, events or sessions. Needs properties.list. Use f","description":"List the custom property definitions (typed metadata keys) for devices, events or sessions. Needs properties.list. Use for \"Which custom device properties are defined in Foxglove\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"resource_type":{"anyOf":[{"enum":["device","event","session"],"type":"string"},{"type":"null"}],"default":null,"description":"Only properties for this resource type.","title":"Resource Type"}},"title":"list_custom_propertiesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_sites":{"post":{"operationId":"list_sites","summary":"List the storage sites (primary and edge) configured in the organization. Needs sites.list. Use for \"Which Foxglove site","description":"List the storage sites (primary and edge) configured in the organization. Needs sites.list. Use for \"Which Foxglove sites do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_sitesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}