metabase

Crates.iometabase
lib.rsmetabase
version0.1.1
created_at2026-01-02 08:13:33.367076+00
updated_at2026-01-02 08:13:33.367076+00
descriptionErgonomic Rust SDK for Metabase's HTTP API, with async and blocking clients.
homepagehttps://github.com/lvillis/metabase-rs
repositoryhttps://github.com/lvillis/metabase-rs
max_upload_size
id2018140
size638,891
(lvillis)

documentation

https://docs.rs/metabase

README

metabase-rs

Ergonomic Rust SDK for Metabase's HTTP API, with async and blocking clients.

Crates.io  Downloads  Docs.rs  MSRV  CI  Repo Size  License


Features

  • Async Client (default, reqwest + rustls)
  • Blocking BlockingClient (--features blocking, ureq + rustls)
  • Optional: tracing, metrics

Install

cargo add metabase
# blocking-only:
cargo add metabase --no-default-features --features blocking
# with observability:
cargo add metabase --features tracing,metrics

Usage (async)

use metabase::{Auth, Client};

# async fn demo() -> Result<(), metabase::Error> {
let client = Client::builder("https://metabase.example.com")?
    .auth(Auth::session("SESSION_TOKEN")) // or: Auth::api_key("API_KEY")
    .build()?;

let me = client.user().get_current().await?;
println!("{me:?}");
# Ok(())
# }

Usage (blocking)

use metabase::{Auth, BlockingClient};

fn demo() -> Result<(), metabase::Error> {
    let client = BlockingClient::builder("https://metabase.example.com")?
        .auth(Auth::session("SESSION_TOKEN"))
        .build()?;

    let health = client.health().get()?;
    println!("{health:?}");
    Ok(())
}

Errors

# use metabase::{Client, Error};
# async fn demo() -> Result<(), Error> {
# let client = Client::builder("https://metabase.example.com")?.build()?;
if let Err(err) = client.health().get().await {
    eprintln!("{err} status={:?} request_id={:?}", err.status(), err.request_id());
}
# Ok(())
# }
Commit count: 0

cargo fmt