{"openapi":"3.1.0","info":{"title":"Qubitro (BYOK) API","version":"0.1.0","description":"Qubitro (BYOK) lets an AI assistant read your own Qubitro data through the Qubitro API with a key you supply (Qubitro API key). Read-only: 10 tools (list_projects, get_project, list_devices, get_device, get_device_data, list_device_data_keys, list_aggregated_views, get_aggregated_data, list_dashboards, list_groups). 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-qubitro.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-qubitro/docs"},"termsOfService":"https://connectorbay.com/byok-qubitro/terms"},"servers":[{"url":"https://byok-qubitro.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-qubitro/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_projects":{"post":{"operationId":"list_projects","summary":"List the Qubitro projects the API key can see, newest first, with name, description and tags. Use for \"Which Qubitro pro","description":"List the Qubitro projects the API key can see, newest first, with name, description and tags. Use for \"Which Qubitro 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/get_project":{"post":{"operationId":"get_project","summary":"Get one Qubitro project by id. Use for \"Show my Qubitro project details\".","description":"Get one Qubitro project by id. Use for \"Show my Qubitro project details\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Project id (UUID) as returned by list_projects.","maxLength":60,"title":"Project Id","type":"string"}},"required":["project_id"],"title":"get_projectArguments","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_devices":{"post":{"operationId":"list_devices","summary":"List the devices of a project with brand, model, source, tags, metadata and last-seen time. Device credentials are not r","description":"List the devices of a project with brand, model, source, tags, metadata and last-seen time. Device credentials are not returned. Use for \"Which devices are in my Qubitro project, and when were they last seen\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Project id (UUID) as returned by list_projects.","maxLength":60,"title":"Project Id","type":"string"},"metadata":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Filter by metadata as key:value pairs separated by commas, for example site:north,type:soil.","title":"Metadata"}},"required":["project_id"],"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 device of a project: brand, model, description, source, tags, metadata and last-seen time. Use for \"When did Qub","description":"Get one device of a project: brand, model, description, source, tags, metadata and last-seen time. Use for \"When did Qubitro device 7a1c2d3e last report\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Project id (UUID) as returned by list_projects.","maxLength":60,"title":"Project Id","type":"string"},"device_id":{"description":"Device id as returned by list_devices.","maxLength":60,"title":"Device Id","type":"string"}},"required":["project_id","device_id"],"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/get_device_data":{"post":{"operationId":"get_device_data","summary":"Get stored telemetry records of a device, paged. Fields depend on the device (for example temperature, humidity, battery","description":"Get stored telemetry records of a device, paged. Fields depend on the device (for example temperature, humidity, battery) plus a time field. Use for \"Show the latest temperature readings of Qubitro device 7a1c2d3e\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Project id (UUID) as returned by list_projects.","maxLength":60,"title":"Project Id","type":"string"},"device_id":{"description":"Device id as returned by list_devices.","maxLength":60,"title":"Device Id","type":"string"},"page":{"description":"Page number, starting at 1.","maximum":100000,"minimum":1,"title":"Page","type":"integer"},"limit":{"description":"Records per page (at most 1000).","maximum":1000,"minimum":1,"title":"Limit","type":"integer"},"range":{"description":"Which part of the history: all, time (needs start and end) or last.","enum":["all","time","last"],"title":"Range","type":"string"},"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start time in ISO 8601 (UTC), required when range is time.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End time in ISO 8601 (UTC), required when range is time.","title":"End"},"storage":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Storage view id for transformed data. Leave empty for raw data.","title":"Storage"}},"required":["project_id","device_id","page","limit","range"],"title":"get_device_dataArguments","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_device_data_keys":{"post":{"operationId":"list_device_data_keys","summary":"List the telemetry field names a device has stored (for example temperature, humidity). Use for \"Which data fields does ","description":"List the telemetry field names a device has stored (for example temperature, humidity). Use for \"Which data fields does Qubitro device 7a1c2d3e report\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Project id (UUID) as returned by list_projects.","maxLength":60,"title":"Project Id","type":"string"},"device_id":{"description":"Device id as returned by list_devices.","maxLength":60,"title":"Device Id","type":"string"}},"required":["project_id","device_id"],"title":"list_device_data_keysArguments","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_aggregated_views":{"post":{"operationId":"list_aggregated_views","summary":"List the continuous aggregations (aggregated views) defined for a device, with name and interval. Use for \"Which aggrega","description":"List the continuous aggregations (aggregated views) defined for a device, with name and interval. Use for \"Which aggregated views does Qubitro device 7a1c2d3e have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Project id (UUID) as returned by list_projects.","maxLength":60,"title":"Project Id","type":"string"},"device_id":{"description":"Device id as returned by list_devices.","maxLength":60,"title":"Device Id","type":"string"}},"required":["project_id","device_id"],"title":"list_aggregated_viewsArguments","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_aggregated_data":{"post":{"operationId":"get_aggregated_data","summary":"Get aggregated telemetry of a device from one continuous aggregation, paged, optionally for a time range or selected key","description":"Get aggregated telemetry of a device from one continuous aggregation, paged, optionally for a time range or selected keys. Use for \"Show the hourly averages for Qubitro device 7a1c2d3e\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Project id (UUID) as returned by list_projects.","maxLength":60,"title":"Project Id","type":"string"},"device_id":{"description":"Device id as returned by list_devices.","maxLength":60,"title":"Device Id","type":"string"},"aggregation_id":{"description":"Continuous aggregation (aggregated view) id as returned by list_aggregated_views.","maxLength":60,"title":"Aggregation Id","type":"string"},"page":{"description":"Page number, starting at 1.","maximum":100000,"minimum":1,"title":"Page","type":"integer"},"limit":{"description":"Records per page (at most 10000).","maximum":10000,"minimum":1,"title":"Limit","type":"integer"},"range":{"description":"Which part of the history: all or time (needs start and end).","enum":["all","time"],"title":"Range","type":"string"},"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start time in ISO 8601 (UTC), required when range is time.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End time in ISO 8601 (UTC), required when range is time.","title":"End"},"keys":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated field names to include.","title":"Keys"}},"required":["project_id","device_id","aggregation_id","page","limit","range"],"title":"get_aggregated_dataArguments","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_dashboards":{"post":{"operationId":"list_dashboards","summary":"List the Qubitro dashboards with name, refresh period, tags and public flag. Use for \"Which Qubitro dashboards do I have","description":"List the Qubitro dashboards with name, refresh period, tags and public flag. Use for \"Which Qubitro dashboards do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_dashboardsArguments","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_groups":{"post":{"operationId":"list_groups","summary":"List the organization groups of the Qubitro account. Use for \"Which groups exist in my Qubitro organization\".","description":"List the organization groups of the Qubitro account. Use for \"Which groups exist in my Qubitro organization\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_groupsArguments","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}}}}