duners
A Rust client for the Dune Analytics API. Execute queries, wait for completion, and deserialize results into your own types.
Installation
You’ll need the tokio runtime (e.g. tokio with rt-multi-thread and macros).
Quick start
-
Get an API key from Dune → Settings → API.
-
Set it (or put it in a
.envfile asDUNE_API_KEY=...): -
Run a saved query using
run_query(execute → wait until done → return all results):
use ;
use Deserialize;
async
The query ID (e.g. 971694) is the number at the end of a Dune query URL: https://dune.com/queries/971694.
To execute repository-owned SQL without creating a saved query, use run_sql:
let result = client
.
.await?;
For large result sets, stream_query and stream_sql yield each result page as it is fetched instead of buffering everything in memory:
use StreamExt;
let pages = client
.
.await?;
let mut pages = pin!;
while let Some = pages.next.await
Authentication
DuneClient::new(api_key)— pass the API key directly.DuneClient::from_env()— readsDUNE_API_KEYfrom the environment. If a.envfile exists in the current directory, it is loaded first.
Parameterized queries
For saved queries that take parameters, pass a list of Parameter as the second argument to run_query (or execute_query):
use ;
let params = vec!;
let result = client..await?;
Parameter names must match the names defined in the query on Dune.
Deserializing result rows
Define a struct whose fields match the query’s columns and derive Deserialize. You can use your own types; depending on the column type, the API returns numbers and dates either as JSON numbers or as strings, so use the helpers in parse_utils to accept both:
use ;
use ;
use Deserialize;
f64_from_str/u64_from_str— for numeric columns, whether they arrive as JSON numbers or strings (Dune encodes e.g. decimals and bigints as strings).datetime_from_str/optional_datetime_from_str— for date/timestamp columns; accepts RFC 3339 as well as Dune result formats like2022-01-01 01:02:03[.000][ UTC].
Lower-level API
For more control (e.g. custom polling or cancellation):
execute_query(query_id, params)— start execution; returns anexecution_id.get_status(execution_id)— check status (Complete,Executing,Pending,Cancelled,Failed).get_results(execution_id)— fetch result rows (only valid when status isComplete).cancel_execution(execution_id)— cancel a running execution.
See the API docs for details and types.
Error handling
All fallible methods return Result<_, DuneRequestError>. Use ? to propagate. DuneRequestError implements std::error::Error and Display; variants are:
DuneRequestError::Dune(msg)— API returned an error (e.g. invalid API key, query not found).DuneRequestError::Request(msg)— network/HTTP error (e.g. connection failed, timeout).
Documentation
Full API reference: docs.rs/duners
License
MIT OR Apache-2.0