{"openapi":"3.1.0","info":{"title":"Laminar (BYOK) API","version":"0.1.0","description":"Laminar (BYOK) lets an AI assistant read your own Laminar data through the Laminar API with a key you supply (Laminar project API key). Read-only: 8 tools (get_project, list_datasets, get_dataset, list_dataset_datapoints, list_signals, get_signal, list_llm_profiles, run_sql_query). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-laminar.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-laminar/docs"},"termsOfService":"https://connectorbay.com/byok-laminar/terms"},"servers":[{"url":"https://byok-laminar.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-laminar/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/get_project":{"post":{"operationId":"get_project","summary":"Show the id of the Laminar project that the API key belongs to. Use for \"Which Laminar project is this key for\".","description":"Show the id of the Laminar project that the API key belongs to. Use for \"Which Laminar project is this key for\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"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_datasets":{"post":{"operationId":"list_datasets","summary":"List the datasets of the project with id, name and creation time; optionally filter by id or exact name. Use for \"Which ","description":"List the datasets of the project with id, name and creation time; optionally filter by id or exact name. Use for \"Which datasets do I have in Laminar\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only the dataset with this id.","title":"Id"},"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only the dataset with exactly this name.","title":"Name"}},"title":"list_datasetsArguments","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_dataset":{"post":{"operationId":"get_dataset","summary":"Get one dataset by id: name, project and creation time. Use for \"Tell me about Laminar dataset X\".","description":"Get one dataset by id: name, project and creation time. Use for \"Tell me about Laminar dataset X\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"dataset_id":{"description":"Dataset id, from list_datasets.","maxLength":100,"title":"Dataset Id","type":"string"}},"required":["dataset_id"],"title":"get_datasetArguments","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_dataset_datapoints":{"post":{"operationId":"list_dataset_datapoints","summary":"List the datapoints of a dataset (data, target and metadata) one page at a time, given the dataset id or name. Use for \"","description":"List the datapoints of a dataset (data, target and metadata) one page at a time, given the dataset id or name. Use for \"Show the first rows of my Laminar dataset\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"dataset_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Dataset id (use this or dataset_name).","title":"Dataset Id"},"dataset_name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Dataset name (use this or dataset_id).","title":"Dataset Name"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many datapoints to return (1 to 1000).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many datapoints to skip, for paging.","title":"Offset"}},"title":"list_dataset_datapointsArguments","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_signals":{"post":{"operationId":"list_signals","summary":"List the Signals (LLM-evaluated checks run on traces) with name, prompt, mode, sample rate and whether they are disabled","description":"List the Signals (LLM-evaluated checks run on traces) with name, prompt, mode, sample rate and whether they are disabled. Use for \"Which signals are configured in my Laminar project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only signals whose name contains this text.","title":"Name"}},"title":"list_signalsArguments","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_signal":{"post":{"operationId":"get_signal","summary":"Get one Signal: prompt, filters, mode, model, sample rate and version. Use for \"Show the definition of Laminar signal X\"","description":"Get one Signal: prompt, filters, mode, model, sample rate and version. Use for \"Show the definition of Laminar signal X\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"signal_id":{"description":"Signal id, from list_signals.","maxLength":100,"title":"Signal Id","type":"string"}},"required":["signal_id"],"title":"get_signalArguments","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_llm_profiles":{"post":{"operationId":"list_llm_profiles","summary":"List the LLM profiles of the workspace with name, provider and models. Keys and secrets are not requested. Use for \"Whic","description":"List the LLM profiles of the workspace with name, provider and models. Keys and secrets are not requested. Use for \"Which LLM profiles are set up in Laminar\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_llm_profilesArguments","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/run_sql_query":{"post":{"operationId":"run_sql_query","summary":"Run one read-only SELECT over the project's Laminar tables (spans, traces, signal_events, evaluation_datapoints, dataset","description":"Run one read-only SELECT over the project's Laminar tables (spans, traces, signal_events, evaluation_datapoints, dataset_datapoints, logs and others) and return the rows. Filter spans by start_time. Use for \"How many LLM spans did my Laminar project record in the last day\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"description":"A single SELECT statement in ClickHouse SQL, for example SELECT name, span_type, start_time FROM spans WHERE start_time > now() - INTERVAL 1 DAY LIMIT 20. Only SELECT is accepted.","maxLength":2000,"title":"Query","type":"string"}},"required":["query"],"title":"run_sql_queryArguments","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}}}}