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.
Contract decoding
Submit contracts for decoding in batches and track their status. Submissions are attributed to the user who created the API key; see the docs for plan requirements.
use ;
# async
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