{"openapi":"3.1.0","info":{"title":"Ubidots (BYOK) API","version":"0.1.0","description":"Ubidots (BYOK) lets an AI assistant read your own Ubidots data through the Ubidots API with a key you supply (Ubidots account token). Read-only: 12 tools (list_devices, get_device, get_device_last_values, list_variables, list_device_variables, get_variable, get_data_series, get_data_statistics, list_dashboards, list_device_groups, list_events, get_event_logs). The BYOK key travels with each...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-ubidots.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-ubidots/docs"},"termsOfService":"https://connectorbay.com/byok-ubidots/terms"},"servers":[{"url":"https://byok-ubidots.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-ubidots/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 Ubidots devices with label, name, active flag, last activity, tags and number of variables. Use for \"Which of my Ub","description":"List Ubidots devices with label, name, active flag, last activity, tags and number of variables. Use for \"Which of my Ubidots devices are active and when did they last report\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items per page (1 to 200).","title":"Page Size"}},"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 by id or ~label with its properties, tags, last activity and number of variables. Use for \"Show the Ubido","description":"Get one device by id or ~label with its properties, tags, last activity and number of variables. Use for \"Show the Ubidots device ~my-device\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"device_key":{"description":"Device id, or the device label with a ~ prefix such as ~my-device.","maxLength":200,"title":"Device Key","type":"string"}},"required":["device_key"],"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_last_values":{"post":{"operationId":"get_device_last_values","summary":"Get the latest value, timestamp and context of every variable of a device in one call. Use for \"What are the latest read","description":"Get the latest value, timestamp and context of every variable of a device in one call. Use for \"What are the latest readings of Ubidots device ~my-device\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"device_key":{"description":"Device id, or the device label with a ~ prefix such as ~my-device.","maxLength":200,"title":"Device Key","type":"string"},"only_value":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to return only the values without timestamps.","title":"Only Value"}},"required":["device_key"],"title":"get_device_last_valuesArguments","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_variables":{"post":{"operationId":"list_variables","summary":"List variables across all devices with label, type, unit, device and last value. Use for \"Which Ubidots variables report","description":"List variables across all devices with label, type, unit, device and last value. Use for \"Which Ubidots variables report temperature\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items per page (1 to 200).","title":"Page Size"}},"title":"list_variablesArguments","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_variables":{"post":{"operationId":"list_device_variables","summary":"List the variables of one device with label, type, unit, last value and last activity. Use for \"Which variables does Ubi","description":"List the variables of one device with label, type, unit, last value and last activity. Use for \"Which variables does Ubidots device ~my-device have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"device_key":{"description":"Device id, or the device label with a ~ prefix such as ~my-device.","maxLength":200,"title":"Device Key","type":"string"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items per page (1 to 200).","title":"Page Size"}},"required":["device_key"],"title":"list_device_variablesArguments","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_variable":{"post":{"operationId":"get_variable","summary":"Get one variable by id with its type, unit, device, last value and properties. Use for \"Show Ubidots variable 5dfa39ee1a","description":"Get one variable by id with its type, unit, device, last value and properties. Use for \"Show Ubidots variable 5dfa39ee1a9ca53020c69391\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"variable_id":{"description":"Variable id as returned by list_variables.","maxLength":200,"title":"Variable Id","type":"string"}},"required":["variable_id"],"title":"get_variableArguments","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_data_series":{"post":{"operationId":"get_data_series","summary":"Get time-series values of one variable between two times, as timestamp and value rows. Give a variable id, or a ~label t","description":"Get time-series values of one variable between two times, as timestamp and value rows. Give a variable id, or a ~label together with its device. Use for \"Show the temperature readings of device ~my-device over the last day\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"variable":{"description":"Variable id, or variable label with a ~ prefix such as ~temperature (then also give the device).","maxLength":100,"title":"Variable","type":"string"},"start":{"description":"Start of the range. Epoch time in milliseconds.","maximum":99999999999999,"minimum":0,"title":"Start","type":"integer"},"end":{"description":"End of the range. Epoch time in milliseconds.","maximum":99999999999999,"minimum":0,"title":"End","type":"integer"},"device":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Device id or ~label; needed when the variable is given by label.","title":"Device"},"decimal_places":{"anyOf":[{"maximum":16,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Decimal places for values (0 to 16).","title":"Decimal Places"}},"required":["variable","start","end"],"title":"get_data_seriesArguments","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_data_statistics":{"post":{"operationId":"get_data_statistics","summary":"Compute statistics (count, mean, min, max, first, last, sum, std, percentiles) of one variable between two times. Use fo","description":"Compute statistics (count, mean, min, max, first, last, sum, std, percentiles) of one variable between two times. Use for \"What were the average and peak temperature of device ~my-device yesterday\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"variable":{"description":"Variable id, or variable label with a ~ prefix such as ~temperature (then also give the device).","maxLength":100,"title":"Variable","type":"string"},"start":{"description":"Start of the range. Epoch time in milliseconds.","maximum":99999999999999,"minimum":0,"title":"Start","type":"integer"},"end":{"description":"End of the range, not before start. Epoch time in milliseconds.","maximum":99999999999999,"minimum":0,"title":"End","type":"integer"},"device":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Device id or ~label; needed when the variable is given by label.","title":"Device"},"decimal_places":{"anyOf":[{"maximum":16,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Decimal places for values (0 to 16).","title":"Decimal Places"}},"required":["variable","start","end"],"title":"get_data_statisticsArguments","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 dashboards with label, name, default time frame, widget count and active flag. Use for \"Which Ubidots dashboards do","description":"List dashboards with label, name, default time frame, widget count and active flag. Use for \"Which Ubidots dashboards do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items per page (1 to 200).","title":"Page Size"}},"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_device_groups":{"post":{"operationId":"list_device_groups","summary":"List device groups with label, name and number of devices. Use for \"Which Ubidots device groups exist and how many devic","description":"List device groups with label, name and number of devices. Use for \"Which Ubidots device groups exist and how many devices are in each\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items per page (1 to 200).","title":"Page Size"}},"title":"list_device_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}},"/v1/tools/list_events":{"post":{"operationId":"list_events","summary":"List alert events (rules) with label, name, active flag and last triggered time. Use for \"Which Ubidots alert events are","description":"List alert events (rules) with label, name, active flag and last triggered time. Use for \"Which Ubidots alert events are active and when did they last fire\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items per page (1 to 200).","title":"Page Size"}},"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/get_event_logs":{"post":{"operationId":"get_event_logs","summary":"List the log of one event: when it ran, what action it took and whether it succeeded. Use for \"Did Ubidots event ~if-var","description":"List the log of one event: when it ran, what action it took and whether it succeeded. Use for \"Did Ubidots event ~if-var0-then-telegram send its notification\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"event_key":{"description":"Event id, or the event label with a ~ prefix such as ~my-event.","maxLength":200,"title":"Event Key","type":"string"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items per page (1 to 200).","title":"Page Size"}},"required":["event_key"],"title":"get_event_logsArguments","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}}}}