- Dashboard
- NodeJS
- Java
- Rust
- REST API
Visit the Authorization keys page of the Wallets section for your app, click New key, and select Register key quorum instead.Specify the public keys you’d like to add to the quorum and an authorization threshold.
Key quorums containing both user IDs and authorization keys must be created via the REST API.

This guide is for the
@privy-io/node library only, as the feature is not available in the
@privy-io/server-auth library.keyQuorums().create() method.Usage
The returned
id for the key quorum is used as the owner_id field when creating or updating resources (e.g. wallets or policies) in the Privy API.Example: Create a 2-of-2 key quorum with an authorization key and a user
Report incorrect code
Copy
Ask AI
try {
const keyQuorum = await privyClient.keyQuorums().create({
public_keys: ['authorization-key'],
user_ids: ['user-id'],
display_name: '2 of 2 Test Key Quorum',
authorization_threshold: 2, // Require 2 signatures (both keys)
});
const keyQuorumId = keyQuorum.id;
} catch (error) {
console.error(error);
}
You can create a key quorum using the Java SDK by using the
keyQuorums().create() method.Usage
The returned
id for the key quorum is used as the ownerId field when creating or updating resources (e.g. wallets or policies) in the Privy API.Example: Create a 2-of-2 key quorum with an authorization key and a user
Report incorrect code
Copy
Ask AI
try {
KeyQuorumCreateRequestBody keyQuorumRequest = KeyQuorumCreateRequestBody.builder()
.publicKeys(List.of("authorization-key"))
.userIds(List.of("user-id"))
.displayName("2 of 2 Test Key Quorum")
.authorizationThreshold(2.0) // Require 2 signatures (both keys)
.build();
KeyQuorumCreateResponse keyQuorumResponse = privyClient
.keyQuorums()
.create(keyQuorumRequest);
if (keyQuorumResponse.keyQuorum().isPresent()) {
KeyQuorum keyQuorum = keyQuorumResponse.keyQuorum().get();
String keyQuorumId = keyQuorum.id();
}
} catch (APIException e) {
String errorBody = e.bodyAsString();
System.err.println(errorBody);
} catch (Exception e) {
System.err.println(e.getMessage());
}
Parameters
When creating a key quorum, you can specify the following values on theKeyQuorumCreateRequestBody builder:A list of base64-encoded, DER-formatted P-256 public keys to register.
A list of user IDs to include in the key quorum.
The minimum number of signatures required to authorize an action. If left unset, the default is all keys.
Human readable display name to attach to the key.
Returns
TheKeyQuorumCreateResponse object contains an optional keyQuorum() field, present if the key quorum was created successfully.The created
KeyQuorum object.Hide KeyQuorum
Hide KeyQuorum
Unique ID for the key quorum, used to assign the
owner_id to a resource.The list of user IDs included in the key quorum.
The minimum number of signatures required to authorize an action. If left unset, the default is all keys.
Human readable display name to attach to the key.
You can create a key quorum using the Rust SDK by using the
key_quorums().create() method.Usage
The returned
id for the key quorum is used as the owner_id field when creating or updating resources (e.g. wallets or policies) in the Privy API.Example: Create a 2-of-2 key quorum with an authorization key and a user
Report incorrect code
Copy
Ask AI
use privy_rs::{PrivyClient, generated::types::*};
let client = PrivyClient::new(app_id, app_secret)?;
let request = CreateKeyQuorumBody {
public_keys: Some(vec!["authorization-key".to_string()]),
user_ids: Some(vec!["user-id".to_string()]),
display_name: Some("2 of 2 Test Key Quorum".to_string()),
authorization_threshold: Some(2.0), // Require 2 signatures (both keys)
};
let key_quorum = client
.key_quorums()
.create(request)
.await?;
let key_quorum_id = key_quorum.id;
println!("Created key quorum: {}", key_quorum_id);
Parameters and Returns
See the Rust SDK documentation for detailed parameter and return types, including embedded examples:For REST API details, see the API reference.Register the key quorum with Privy by making a In the request body, include the following.
If the request is successful, Privy will return the following fields in the response.
See an example request for creating a key quorum below.
POST request to:Report incorrect code
Copy
Ask AI
https://api.privy.io/v1/key_quorums
Show request body parameters
Show request body parameters
A list of base64-encoded, DER-formatted P-256 public keys to register.
A list of user IDs to include in the key quorum.
The minimum number of signatures required to authorize an action. If left unset, the default is all keys.
Human readable display name to attach to the key.
Show response body fields
Show response body fields
Unique ID for the key quorum, used to assign the
owner_id to a resource.The list of public keys and their display names.
The list of user IDs included in the key quorum.
The minimum number of signatures required to authorize an action. If left unset, the default is all keys.
Human readable display name to attach to the key.
The returned
id for the key quorum is used as the owner_id field when creating or updating resources (e.g. wallets or policies) in the Privy API.Show example request to create a key quorum
Show example request to create a key quorum
As an example, a request to register a 2 of 2 key quorum might look like the following:An example successful response would look like:
Report incorrect code
Copy
Ask AI
$ curl --request POST https://api.privy.io/v1/key_quorums \
-u "<your-privy-app-id>:<your-privy-app-secret>" \
-H "privy-app-id: <your-privy-app-id>" \
-H 'Content-Type: application/json' \
-d '{
"display_name": "Sample key",
"public_keys": [
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEx4aoeD72yykviK+f/ckqE2CItVIG\n1rCnvC3/XZ1HgpOcMEMialRmTrqIK4oZlYd1RfxU3za/C9yjhboIuoPD3g==",
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErzZtQr/bMIh3Y8f9ZqseB9i/AfjQ\nhu+agbNqXcJy/TfoNqvc/Y3Mh7gIZ8ZLXQEykycx4mYSpqrxp1lBKqsZDQ=="
],
"authorization_threshold": 2
}'
Report incorrect code
Copy
Ask AI
{
"id": "<insert-owner-id>",
"display_name": "Sample key",
"public_keys": [
{
"public_key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEx4aoeD72yykviK+f/ckqE2CItVIG\n1rCnvC3/XZ1HgpOcMEMialRmTrqIK4oZlYd1RfxU3za/C9yjhboIuoPD3g=="
},
{
"public_key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErzZtQr/bMIh3Y8f9ZqseB9i/AfjQ\nhu+agbNqXcJy/TfoNqvc/Y3Mh7gIZ8ZLXQEykycx4mYSpqrxp1lBKqsZDQ=="
}
],
"authorization_threshold": 2
}

