curl --request POST \
--url https://staging.crossmint.com/api/2022-06-09/wallets \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <x-api-key>' \
--data '
{
"type": "evm-smart-wallet",
"config": {
"adminSigner": {
"type": "evm-keypair",
"address": "0x1234567890123456789012345678901234567890"
}
},
"linkedUser": "email:user@example.com"
}
'import requests
url = "https://staging.crossmint.com/api/2022-06-09/wallets"
payload = {
"type": "evm-smart-wallet",
"config": { "adminSigner": {
"type": "evm-keypair",
"address": "0x1234567890123456789012345678901234567890"
} },
"linkedUser": "email:user@example.com"
}
headers = {
"X-API-KEY": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'evm-smart-wallet',
config: {
adminSigner: {type: 'evm-keypair', address: '0x1234567890123456789012345678901234567890'}
},
linkedUser: 'email:user@example.com'
})
};
fetch('https://staging.crossmint.com/api/2022-06-09/wallets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://staging.crossmint.com/api/2022-06-09/wallets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'type' => 'evm-smart-wallet',
'config' => [
'adminSigner' => [
'type' => 'evm-keypair',
'address' => '0x1234567890123456789012345678901234567890'
]
],
'linkedUser' => 'email:user@example.com'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://staging.crossmint.com/api/2022-06-09/wallets"
payload := strings.NewReader("{\n \"type\": \"evm-smart-wallet\",\n \"config\": {\n \"adminSigner\": {\n \"type\": \"evm-keypair\",\n \"address\": \"0x1234567890123456789012345678901234567890\"\n }\n },\n \"linkedUser\": \"email:user@example.com\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://staging.crossmint.com/api/2022-06-09/wallets")
.header("X-API-KEY", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"evm-smart-wallet\",\n \"config\": {\n \"adminSigner\": {\n \"type\": \"evm-keypair\",\n \"address\": \"0x1234567890123456789012345678901234567890\"\n }\n },\n \"linkedUser\": \"email:user@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.crossmint.com/api/2022-06-09/wallets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"evm-smart-wallet\",\n \"config\": {\n \"adminSigner\": {\n \"type\": \"evm-keypair\",\n \"address\": \"0x1234567890123456789012345678901234567890\"\n }\n },\n \"linkedUser\": \"email:user@example.com\"\n}"
response = http.request(request)
puts response.read_body{
"type": "evm-smart-wallet",
"linkedUser": "email:user@example.com",
"address": "0x1234567890123456789012345678901234567890",
"config": {
"adminSigner": {
"type": "evm-keypair",
"address": "0x1234567890123456789012345678901234567890",
"locator": "evm-keypair:0x1234567890123456789012345678901234567890"
}
}
}{
"error": true,
"message": "<error message>"
}Create Wallet
Creates a new wallet of specified type. If called with an idempotency key or for a user who already has a wallet, returns existing wallet. When linkedUser is provided, subsequent calls with the same linkedUser will return the existing wallet. Supports both custodial and non-custodial wallet types.
API scope required: wallets.create
curl --request POST \
--url https://staging.crossmint.com/api/2022-06-09/wallets \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <x-api-key>' \
--data '
{
"type": "evm-smart-wallet",
"config": {
"adminSigner": {
"type": "evm-keypair",
"address": "0x1234567890123456789012345678901234567890"
}
},
"linkedUser": "email:user@example.com"
}
'import requests
url = "https://staging.crossmint.com/api/2022-06-09/wallets"
payload = {
"type": "evm-smart-wallet",
"config": { "adminSigner": {
"type": "evm-keypair",
"address": "0x1234567890123456789012345678901234567890"
} },
"linkedUser": "email:user@example.com"
}
headers = {
"X-API-KEY": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'evm-smart-wallet',
config: {
adminSigner: {type: 'evm-keypair', address: '0x1234567890123456789012345678901234567890'}
},
linkedUser: 'email:user@example.com'
})
};
fetch('https://staging.crossmint.com/api/2022-06-09/wallets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://staging.crossmint.com/api/2022-06-09/wallets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'type' => 'evm-smart-wallet',
'config' => [
'adminSigner' => [
'type' => 'evm-keypair',
'address' => '0x1234567890123456789012345678901234567890'
]
],
'linkedUser' => 'email:user@example.com'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://staging.crossmint.com/api/2022-06-09/wallets"
payload := strings.NewReader("{\n \"type\": \"evm-smart-wallet\",\n \"config\": {\n \"adminSigner\": {\n \"type\": \"evm-keypair\",\n \"address\": \"0x1234567890123456789012345678901234567890\"\n }\n },\n \"linkedUser\": \"email:user@example.com\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://staging.crossmint.com/api/2022-06-09/wallets")
.header("X-API-KEY", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"evm-smart-wallet\",\n \"config\": {\n \"adminSigner\": {\n \"type\": \"evm-keypair\",\n \"address\": \"0x1234567890123456789012345678901234567890\"\n }\n },\n \"linkedUser\": \"email:user@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.crossmint.com/api/2022-06-09/wallets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"evm-smart-wallet\",\n \"config\": {\n \"adminSigner\": {\n \"type\": \"evm-keypair\",\n \"address\": \"0x1234567890123456789012345678901234567890\"\n }\n },\n \"linkedUser\": \"email:user@example.com\"\n}"
response = http.request(request)
puts response.read_body{
"type": "evm-smart-wallet",
"linkedUser": "email:user@example.com",
"address": "0x1234567890123456789012345678901234567890",
"config": {
"adminSigner": {
"type": "evm-keypair",
"address": "0x1234567890123456789012345678901234567890",
"locator": "evm-keypair:0x1234567890123456789012345678901234567890"
}
}
}{
"error": true,
"message": "<error message>"
}Headers
API key required for authentication
Unique key to prevent duplicate wallet creation
Body
- EVM smart wallet creation input
- Solana MPC wallet creation input
- Solana smart wallet creation input
- Aptos MPC wallet creation input
- Sui MPC wallet creation input
- Solana custodial wallet creation input
- EVM MPC wallet creation input
EVM smart wallet creation input
evm-smart-wallet Show child attributes
Show child attributes
A user locator can be of the format:
email:<email>userId:<userId>phoneNumber:<phoneNumber>twitter:<handle>x:<handle>
[
"email:user@example.com",
"userId:507f1f77bcf86cd799439011",
"userId:did:example:cm4lr5piw0h6t1bjho0onryql",
"phoneNumber:+12125551234",
"twitter:johndoe",
"x:@johndoe"
]
Response
Returns an existing wallet (200) if one already exists for the provided linkedUser or idempotencyKey, or creates and returns a new wallet (201). The response includes the wallet details and whether it was newly created.
- EVM smart wallet output
- Solana Smart wallet output
- Solana MPC wallet output
- Aptos MPC wallet output
- Sui MPC wallet output
- EVM MPC wallet output
Complete wallet configuration including type-specific settings
The type of wallet configuration
evm-smart-wallet EVM smart wallet type specific configuration settings
Show child attributes
Show child attributes
The onchain address of the wallet
"0x1234567890123456789012345678901234567890"
The user that is linked to this wallet in format :
"email:test@test.com"
ISO timestamp of when the wallet was created
"2024-01-01T00:00:00.000Z"
Was this page helpful?

