API Reference
Look up the SpiceClient parameters and methods of the Spice Node.js SDK, including sql, nsql, search, and refreshDataset.
SpiceClient(params)
The top-level object that connects to Spice.ai.
params.apiKey(string, optional): API key to authenticate with the endpoint.params.httpUrl(string, optional): URL of the HTTP endpoint, including the scheme (default:http://127.0.0.1:8090).params.flightUrl(string, optional): Host and port of the Flight endpoint, without a scheme (default:127.0.0.1:50051, using local Spice Runtime).params.flightTlsEnabled(boolean, optional): Use TLS for Flight. Defaults tofalsefor a localhost address andtrueotherwise.params.userAgent(string, optional): Prepended to the reported user agent.params.customHeaders(object, optional): Additional headers to send with each request.params.flightOnly(boolean, optional): Use only the Flight transport (default:false).params.httpOnly(boolean, optional): Use only the HTTP transport (default:false). Setting bothflightOnlyandhttpOnlythrows.params.logging(boolean, optional): Enable or disable logging output (default:true).
Supplying only an apiKey (with neither URL set) selects the Spice Cloud endpoints for both.
From 3.3.0, you can set only one of httpUrl or flightUrl to a Spice Cloud or local runtime address. The client then uses the matching address for the other one. For example, flightUrl: 'flight.spiceai.io:443' alone sends HTTP calls to https://data.spiceai.io. An empty or whitespace-only httpUrl or flightUrl throws. To use the default, omit the option.
Default connection to local Spice Runtime:
import { SpiceClient } from "@spiceai/spice";
const spiceClient = new SpiceClient();Connect to Spice Cloud:
import { SpiceClient } from "@spiceai/spice";
const spiceClient = new SpiceClient({
apiKey: 'API_KEY',
httpUrl: 'https://data.spiceai.io',
flightUrl: 'flight.spiceai.io:443'
});Or using shorthand:
import { SpiceClient } from "@spiceai/spice";
const spiceClient = new SpiceClient('API_KEY');SpiceClient Methods
sql(query, options?, onData?, headers?): Execute SQL queries
The recommended method for executing SQL queries. Returns an Apache Arrow Table.
query(string, required): The SQL query to execute.options(object, optional): Query options includingparametersfor parameterized queries andsignal. A callback may be passed in this position instead ofonData.signal(AbortSignal, optional): Cancels the query when it aborts. The client closes the request, and the runtime stops the query. The call rejects with the signal'sreason, and the client does not retry it.sqlJson()accepts the same option.
onData(callback, optional): Callback for handling streaming data.headers(object, optional): Custom headers to include with the request.
// Standard query
const table = await spiceClient.sql("SELECT * FROM tpch.lineitem LIMIT 10");
table.toArray().forEach((row) => {
console.log(JSON.stringify(row));
});
// Parameterized query
const table = await spiceClient.sql(
'SELECT * FROM taxi_trips WHERE passenger_count = $1 AND trip_distance > $2 LIMIT 10',
{ parameters: [2, 5.0] }
);Get all elements for a column by calling getChild(name: string):
const table = await spiceClient.sql(
'SELECT sum(l_extendedprice) as sum_extendedprice FROM tpch.lineitem'
);
let sumExtendedPrice = table.getChild("sum_extendedprice");
console.log(sumExtendedPrice?.toJSON());sqlJson(query, headers?): Execute SQL queries with JSON results
Returns results in JSON format with schema information.
query(string, required): The SQL query to execute.headers(object, optional): Custom headers to include with the request.
const result = await spiceClient.sqlJson('SELECT name, age FROM users LIMIT 5');
console.log(`Returned ${result.row_count} rows`);
console.log('Schema:', result.schema);
console.log('Data:', result.data);
console.log(`Query took ${result.execution_time_ms}ms`);The response includes:
row_count: Number of rows returnedschema: Schema information with field names and typesdata: Array of row objectsexecution_time_ms: Query execution time in milliseconds
nsql(query, options?): Natural language to SQL
Converts natural language queries into SQL and executes them.
query(string, required): The natural language query.options(object, optional):datasets(array, optional): Dataset names to sample from when building the model context. It is a sampling hint only. It does not restrict which tables the query can target.model(string, optional): Model to use for SQL generation. When omitted, the single compatible model configured in the project is used; if none or more than one is configured, the request fails.sample_data_enabled(boolean, optional): Include sample data in context (default:false).
See the Text-to-SQL API for the full contract.
const result = await spiceClient.nsql('Show me the top 5 customers by total sales');
console.log('Generated SQL:', result.sql);
console.log('Results:', result.data);
console.log(`Returned ${result.row_count} rows`);refreshDataset(dataset, options?): Trigger dataset refresh
Triggers an on-demand refresh for an accelerated dataset. refreshDataset() is new in 3.3.0. refreshAcceleration() is a deprecated alias that sends the same request.
dataset(string, required): Name of the dataset to refresh.options(object, optional):refresh_mode(string):'full','append','changes', or'disabled'.refresh_sql(string): Custom SQL query for the refresh.refresh_jitter_max(string): Maximum jitter time for refresh scheduling.
await spiceClient.refreshDataset('my_dataset');
// With options
await spiceClient.refreshDataset('my_dataset', {
refresh_mode: 'full',
refresh_sql: 'SELECT * FROM source WHERE updated_at > NOW() - INTERVAL 1 DAY',
});isSpiceHealthy(): Check runtime health
Checks if the Spice runtime is healthy. This endpoint is unauthenticated.
const isHealthy = await spiceClient.isSpiceHealthy();isSpiceReady(): Check runtime readiness
Checks if the Spice runtime is ready to accept queries. This endpoint is authenticated if an API key is configured.
const isReady = await spiceClient.isSpiceReady();runtimeStatus(): Get the status of each runtime connection
Returns one { name, endpoint, status } entry for each runtime connection (http, flight, metrics and opentelemetry) from GET /v1/status. Use it to find which endpoint is not ready. It throws when the response is not a valid status list.
const connections = await spiceClient.runtimeStatus();
console.table(connections);search(query, options?): Search datasets
Runs a search query against the project's datasets.
const results = await spiceClient.search('quarterly revenue trends');query(sql, options?): Submit an asynchronous query
Submits a query for asynchronous execution and resolves to an AsyncQuery handle rather than a Table. Requires the runtime to be running in distributed (scheduler) mode. Use sql() for the synchronous, streaming path.
sql(string, required): The SQL query to submit.options(object, optional): Query options, includingparametersfor parameterized queries.
const job = await spiceClient.query('SELECT * FROM taxi_trips');
const table = await job.results(); // waits for completion, then fetches resultsThe handle exposes status(), waitForCompletion(options?), results(), and cancel(). queryWithParams(sql, parameters) is equivalent to query() with options.parameters set, and listQueries() lists submitted jobs.
setMaxRetries(retries): Configure connection retries
Configures the maximum number of connection retry attempts (default: 3).
spiceClient.setMaxRetries(5); // Setting to 0 disables retries