5 releases (breaking)

new 0.6.0+20240710.0 Jul 15, 2024
0.5.0+20240502.0 May 8, 2024
0.4.0+20240327.0 Apr 2, 2024
0.3.0+0.0.6 Feb 14, 2024
0.1.0 Aug 28, 2023

#828 in Web programming

Used in oxide-httpmock

MPL-2.0 license

47K SLoC

The Oxide Rust SDK

Generated bindings for the Oxide API.


The oxide crate is available on crates.io. You'll probably want to use tokio as well. Add them to your Cargo.toml file or use cargo add:

$ cargo add oxide
$ cargo add tokio


To connect to the Oxide API, the SDK needs a host URL and a token. There are two ways to specify these:

  • Environment variables: You can set the OXIDE_HOST and OXIDE_TOKEN environment variables.
  • Configuration file: When you run oxide auth login in the CLI, a $HOME/.config/oxide/hosts.toml file is generated. This file contains sensitive information like your token and user ID.

The SDK will first look for the environment variables, and if they are not defined, it will look for the config file.


Create a new oxide::Client like this:

use futures::StreamExt;
use oxide::{config::Config, context::Context, prelude::*};

async fn main() {
    // Get a client from the on-disk configuration.
    let context = Context::new(Config::default()).expect("unabled to create context");
    let client: &Client = context.client().expect("unable to get client");

    // Start using the client!

    // For example we can look at the projects in our silo:
    let mut projects = client.project_list().stream();
    loop {
        match projects.next().await {
            // No more items.
            None => break,
            // Print the name of a project.
            Some(Ok(project)) => println!("project {}", *project.name),
            // Something went wrong
            Some(Err(err)) => println!("error {}", err),


~419K SLoC