curl --request POST \
--url https://staging.crossmint.com/api/2022-06-09/wallets/{walletLocator}/signers \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <x-api-key>' \
--data '
{
"signer": "0x1234567890123456789012345678901234567890",
"chain": "base"
}
'import requests
url = "https://staging.crossmint.com/api/2022-06-09/wallets/{walletLocator}/signers"
payload = {
"signer": "0x1234567890123456789012345678901234567890",
"chain": "base"
}
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({signer: '0x1234567890123456789012345678901234567890', chain: 'base'})
};
fetch('https://staging.crossmint.com/api/2022-06-09/wallets/{walletLocator}/signers', 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/{walletLocator}/signers",
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([
'signer' => '0x1234567890123456789012345678901234567890',
'chain' => 'base'
]),
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/{walletLocator}/signers"
payload := strings.NewReader("{\n \"signer\": \"0x1234567890123456789012345678901234567890\",\n \"chain\": \"base\"\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/{walletLocator}/signers")
.header("X-API-KEY", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"signer\": \"0x1234567890123456789012345678901234567890\",\n \"chain\": \"base\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.crossmint.com/api/2022-06-09/wallets/{walletLocator}/signers")
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 \"signer\": \"0x1234567890123456789012345678901234567890\",\n \"chain\": \"base\"\n}"
response = http.request(request)
puts response.read_body{
"type": "evm-keypair",
"locator": "evm-keypair:0x1234567890123456789012345678901234567890",
"chains": {
"polygon": {
"status": "active"
},
"base": {
"id": "b984491a-5785-43c0-8811-45d46fe6e520",
"status": "awaiting-approval",
"approvals": {
"pending": [],
"submitted": [
{
"signer": "evm-keypair:0x1234567890123456789012345678901234567890",
"message": "0x1234567890123456789012345678901234567890123456789012345678901234",
"signature": "0x1234567890123456789012345678901234567890123456789012345678901234",
"submittedAt": "2024-01-01T00:00:00.000Z"
}
]
}
}
}
}{
"error": true,
"message": "<error message>"
}{
"error": true,
"message": "<error message>"
}Register Delegated Signer
Register a delegated key for a smart wallet with optional restrictions around permissions and expiry date.
API scope required: wallets.create
curl --request POST \
--url https://staging.crossmint.com/api/2022-06-09/wallets/{walletLocator}/signers \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <x-api-key>' \
--data '
{
"signer": "0x1234567890123456789012345678901234567890",
"chain": "base"
}
'import requests
url = "https://staging.crossmint.com/api/2022-06-09/wallets/{walletLocator}/signers"
payload = {
"signer": "0x1234567890123456789012345678901234567890",
"chain": "base"
}
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({signer: '0x1234567890123456789012345678901234567890', chain: 'base'})
};
fetch('https://staging.crossmint.com/api/2022-06-09/wallets/{walletLocator}/signers', 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/{walletLocator}/signers",
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([
'signer' => '0x1234567890123456789012345678901234567890',
'chain' => 'base'
]),
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/{walletLocator}/signers"
payload := strings.NewReader("{\n \"signer\": \"0x1234567890123456789012345678901234567890\",\n \"chain\": \"base\"\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/{walletLocator}/signers")
.header("X-API-KEY", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"signer\": \"0x1234567890123456789012345678901234567890\",\n \"chain\": \"base\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.crossmint.com/api/2022-06-09/wallets/{walletLocator}/signers")
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 \"signer\": \"0x1234567890123456789012345678901234567890\",\n \"chain\": \"base\"\n}"
response = http.request(request)
puts response.read_body{
"type": "evm-keypair",
"locator": "evm-keypair:0x1234567890123456789012345678901234567890",
"chains": {
"polygon": {
"status": "active"
},
"base": {
"id": "b984491a-5785-43c0-8811-45d46fe6e520",
"status": "awaiting-approval",
"approvals": {
"pending": [],
"submitted": [
{
"signer": "evm-keypair:0x1234567890123456789012345678901234567890",
"message": "0x1234567890123456789012345678901234567890123456789012345678901234",
"signature": "0x1234567890123456789012345678901234567890123456789012345678901234",
"submittedAt": "2024-01-01T00:00:00.000Z"
}
]
}
}
}
}{
"error": true,
"message": "<error message>"
}{
"error": true,
"message": "<error message>"
}Headers
API key required for authentication
Path Parameters
A wallet locator can be of the format:
<walletAddress>email:<email>:<walletType>userId:<userId>:<walletType>userId:<userId>:<walletType>(white label user example)phoneNumber:<phoneNumber>:<walletType>twitter:<handle>:<walletType>x:<handle>:<walletType>
Body
- EVM
- Solana
Parameters for creating a EVM delegated signer
The locator of the delegated signer
The chain where the signer will be registered
base, polygon, optimism, arbitrum, mode, story, bsc, shape, ethereum-sepolia, base-sepolia, polygon-amoy, optimism-sepolia, arbitrum-sepolia, mode-sepolia, story-testnet The expiry date of the signer in milliseconds since UNIX epoch
The permissions of the signer following ERC-7715
Permission to transfer native tokens (e.g. ETH)
- Native Token Transfer
- ERC20 Transfer
- ERC721 Transfer
- ERC1155 Transfer
- Gas Limit
- Transaction Count Limit
- Rate Limit
Show child attributes
Show child attributes
{
"type": "native-token-transfer",
"data": { "allowance": "0x1234" }
}
Response
The delegated signer has been successfully added to the wallet.
- Delegated Signer Response
- Delegated Signer Response
Complete delegated signer response including the signer and authorizations for each chain
Specifies the type of EVM signer being used, describing the method of key management and transaction signing. evm-keypair indicates a signer using a locally managed keypair, suitable for non-custodial wallets. evm-fireblocks-custodial refers to a signer managed by Fireblocks, a custodial service provider.
evm-keypair, evm-fireblocks-custodial, evm-passkey The locator of the signer
[
"evm-keypair:0x1234567890123456789012345678901234567890",
"evm-passkey:credential-id-123",
"evm-fireblocks-custodial:0x1234567890123456789012345678901234567890",
"solana-keypair:DUSTawucrTsGU8hcqRdHDCbuYhCPADMLM2VcCb8VnFnQ",
"solana-fireblocks-custodial:DUSTawucrTsGU8hcqRdHDCbuYhCPADMLM2VcCb8VnFnQ"
]
The expiry date of the signer in ISO 8601 format
"2024-01-01T00:00:00.000Z"
The permissions of the signer following ERC-7715
Permission to transfer native tokens (e.g. ETH)
- Native Token Transfer
- ERC20 Transfer
- ERC721 Transfer
- ERC1155 Transfer
- Gas Limit
- Transaction Count Limit
- Rate Limit
Show child attributes
Show child attributes
{
"type": "native-token-transfer",
"data": { "allowance": "0x1234" }
}
Authorization status for each chain where the chain name is the key and the signature request is the value
Show child attributes
Show child attributes
Was this page helpful?

