import json
import os
from parable_types_web_api import ProviderPoolQueryInput
from parable_web_api_sdk import ClientConfig, WebApiSDK
sdk = WebApiSDK(
ClientConfig(
base_url=os.environ["PARABLE_API_URL"],
auth_token=os.environ["PARABLE_API_TOKEN"],
default_headers={"X-Tenant": os.environ["PARABLE_WORKSPACE"]},
)
)
input_data = ProviderPoolQueryInput.model_validate(
json.loads("{\"sql\":\"example\"}"),
)
result = sdk.provider_pool.plan_sql(input_data)sdk, err := webapisdk.New(webapisdk.SDKConfig{
BaseURL: os.Getenv("PARABLE_API_URL"),
Auth: &webapisdk.AuthConfig{Token: os.Getenv("PARABLE_API_TOKEN")},
RequestInterceptor: func(ctx context.Context, req *http.Request) error {
req.Header.Set("X-Tenant", os.Getenv("PARABLE_WORKSPACE"))
return nil
},
})
if err != nil {
return err
}
var input webapitypes.ProviderPoolQueryInput
if err := json.Unmarshal([]byte(`{"sql":"example"}`), &input); err != nil {
return err
}
result, err := sdk.ProviderPoolNamespace.PlanSql(ctx, input){
"data": {
"columns": [
{
"arrowType": "<string>",
"name": "<string>",
"scalarRef": "<string>"
}
],
"elapsedMs": 0,
"planned": true,
"requestId": "<string>",
"refusal": {
"code": "<string>",
"message": "<string>"
}
},
"meta": {
"requestId": "<string>",
"totalCount": 123
},
"links": {
"first": "<string>",
"last": "<string>",
"next": "<string>",
"prev": "<string>"
}
}{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}Too Many Requests{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}Gateway TimeoutPlan a SQL query
Plans one SQL statement against the Provider Pools without running it. 1. The input is the one Query the Provider Pool takes. 2. A statement that a run would refuse comes back as a refusal with its code and reason, such as QL-PL-002 for a name the catalog does not serve; correct the SQL from the reason. 3. No row is read, so a plan says nothing about whether the table holds rows.
import json
import os
from parable_types_web_api import ProviderPoolQueryInput
from parable_web_api_sdk import ClientConfig, WebApiSDK
sdk = WebApiSDK(
ClientConfig(
base_url=os.environ["PARABLE_API_URL"],
auth_token=os.environ["PARABLE_API_TOKEN"],
default_headers={"X-Tenant": os.environ["PARABLE_WORKSPACE"]},
)
)
input_data = ProviderPoolQueryInput.model_validate(
json.loads("{\"sql\":\"example\"}"),
)
result = sdk.provider_pool.plan_sql(input_data)sdk, err := webapisdk.New(webapisdk.SDKConfig{
BaseURL: os.Getenv("PARABLE_API_URL"),
Auth: &webapisdk.AuthConfig{Token: os.Getenv("PARABLE_API_TOKEN")},
RequestInterceptor: func(ctx context.Context, req *http.Request) error {
req.Header.Set("X-Tenant", os.Getenv("PARABLE_WORKSPACE"))
return nil
},
})
if err != nil {
return err
}
var input webapitypes.ProviderPoolQueryInput
if err := json.Unmarshal([]byte(`{"sql":"example"}`), &input); err != nil {
return err
}
result, err := sdk.ProviderPoolNamespace.PlanSql(ctx, input){
"data": {
"columns": [
{
"arrowType": "<string>",
"name": "<string>",
"scalarRef": "<string>"
}
],
"elapsedMs": 0,
"planned": true,
"requestId": "<string>",
"refusal": {
"code": "<string>",
"message": "<string>"
}
},
"meta": {
"requestId": "<string>",
"totalCount": 123
},
"links": {
"first": "<string>",
"last": "<string>",
"next": "<string>",
"prev": "<string>"
}
}{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}Too Many Requests{
"detail": "<string>",
"status": 400,
"title": "Bad Request",
"type": "about:blank",
"code": "WA-VL-001",
"details": "<unknown>",
"errors": "<unknown>",
"requestId": "<string>"
}Gateway TimeoutAccess
An MCP token or a Parable token can call this operation. See Authentication for the kinds of token. Your roles must granttenant.data.query.providers.
Errors
HTTP 400: A parameter is not a JSON scalar. Send each parameter as a string, finite number, boolean or null.HTTP 403: The caller may not query data in this Workspace. Ask a Workspace Administrator for the Provider Pools Reader role. A different query does not help.HTTP 429: Too many queries were running, so the statement did not start (QL-IN-008), or the caller sent more than 120 of these requests in a minute. Nothing ran. Wait a moment, or for the seconds in the Retry-After header when it is set, then send the same request again.HTTP 503: The statement stopped for lack of memory (QL-IN-009), or a service it needs did not answer, such as the model service behind semantic ranking or a SQL AI function (QL-IN-010). The code says which. Try again shortly. For QL-IN-009, read fewer columns or rows, or aggregate.HTTP 504: The statement ran past its time budget (a QL-TO code) or did not finish in 30 seconds. Narrow the scope or the statement, then send it again.
Authorizations
A personal access token, which starts with pat_. A Parable token can call each operation that the roles of its owner allow. An MCP token can call only the read operations that are open to agents. A SQL token does not work on this API.
Headers
Workspace slug. Overrides subdomain-based workspace resolution when provided.
"acme"
Optional request correlation ID echoed back in the response.
"550e8400-e29b-41d4-a716-446655440000"
Body
One SQL statement to run against the Provider Pools, or to plan without running.
Single read-only SQL statement. Text.Sql rejects empty; maxLength is 100000 bytes.
1 - 100000^[\s\S]*$Positional values for $1, $2, ... placeholders, sent through Flight SQL prepared-statement binding. Values are never interpolated into SQL. Each value is a JSON scalar (string, finite number, boolean, or null). Identifiers and the arguments of search_available_data cannot be bound.
Any valid JSON value: object, array, primitive, or null
Response
Successful response