56 stable releases (18 major)

26.6.1 Apr 8, 2026
26.5.200 Feb 8, 2026
26.4.0 Sep 30, 2025
26.3.100 Jul 18, 2025
0.2.2 Mar 12, 2020

#46 in Asynchronous

Download history 5197/week @ 2026-01-07 5922/week @ 2026-01-14 6233/week @ 2026-01-21 7019/week @ 2026-01-28 6636/week @ 2026-02-04 5703/week @ 2026-02-11 6268/week @ 2026-02-18 7301/week @ 2026-02-25 7473/week @ 2026-03-04 9107/week @ 2026-03-11 8969/week @ 2026-03-18 9177/week @ 2026-03-25 5737/week @ 2026-04-01 6158/week @ 2026-04-08 7443/week @ 2026-04-15 7426/week @ 2026-04-22

28,708 downloads per month
Used in 9 crates (5 directly)

Unlicense OR MIT

1.5MB
23K SLoC

Keycloak Admin REST API

Dual-licensed under MIT or the UNLICENSE.

Features

Implements Keycloak Admin REST API version 26.6.0.

Feature flags

Default flags: tags-all, resource-builder, reqwest.

  • rc: use Arc for deserialization.
  • schemars: add schemars support.
  • multipart: add multipart support to reqwest, enabling extra methods in API.
  • tags-all: activate all tags (resource groups) in REST API, it is default behavior. Disable default features and use individual tag-xxx features to activate only required resource groups. For a full list reference the Cargo.toml.
  • resource-builder: add resource builder support.
  • reqwest: use up to date reqwest version (reqwest 0.13.x).
  • reqwest12: use reqwest 0.12.x.
  • reqwest13: use reqwest 0.13.x.

Usage

Requires Rust version >= 1.87.0.

Add dependency to Cargo.toml:

[dependencies]
keycloak = "~26.6"
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    use keycloak::{prelude::reqwest, types::*, KeycloakAdmin, KeycloakAdminToken};

    const REALM: &str = "resource";

    let url = std::env::var("KEYCLOAK_ADDR").unwrap_or_else(|_| "http://localhost:8080".into());
    let user = std::env::var("KEYCLOAK_USER").unwrap_or_else(|_| "admin".into());
    let password = std::env::var("KEYCLOAK_PASSWORD").unwrap_or_else(|_| "password".into());

    let client = reqwest::Client::new();
    let admin_token = KeycloakAdminToken::acquire(&url, &user, &password, &client).await?;

    eprintln!("{admin_token:?}");

    let admin = KeycloakAdmin::new(&url, admin_token, client);

    admin
        .post(RealmRepresentation {
            realm: Some(REALM.into()),
            ..Default::default()
        })
        .await?;

    let realm = admin.realm(REALM);

    let response = realm
        .users_post(UserRepresentation {
            username: Some("user".into()),
            ..Default::default()
        })
        .await?;

    eprintln!("{:?}", response.to_id());

    let users = realm.users_get().username("user".to_string()).await?;

    eprintln!("{users:?}");

    let id = users
        .iter()
        .find(|u| u.username == Some("user".into()))
        .unwrap()
        .id
        .as_ref()
        .unwrap()
        .to_string();

    realm.users_with_user_id_delete(id.as_str()).await?;

    realm.delete().await?;
    Ok(())
}

Version agreement

If we have x.y.z version of keycloak, our package version would be x.y.(z * 100 + v) there v is a minor fix version to official x.y.z version.

Example: official version 13.0.1 is 13.0.100 for crate version. 13.0.102 means keycloak version 13.0.1 and minor fix version 2.

Update

To update current version use provided update.ts deno script:

deno run --allow-env=KEYCLOAK_RUST_VERSION,KEYCLOAK_VERSION,KEYCLOAK_RUST_MAJOR_VERSION --allow-read=Cargo.toml --allow-write=Cargo.toml,api/openapi.json,src/types.rs,src/rest/generated_rest,src/resource --allow-net=keycloak.org,www.keycloak.org --allow-run=cargo,gh,git,handlebars-magic update.ts

Dependencies

~1.5–8.5MB
~147K SLoC