Get passkey account
curl --request GET \
--url https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address} \
--header 'Authorization: Bearer <token>' \
--header 'x-grid-environment: <x-grid-environment>'import requests
url = "https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}"
headers = {
"x-grid-environment": "<x-grid-environment>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'x-grid-environment': '<x-grid-environment>', Authorization: 'Bearer <token>'}
};
fetch('https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}', 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://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"x-grid-environment: <x-grid-environment>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-grid-environment", "<x-grid-environment>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}")
.header("x-grid-environment", "<x-grid-environment>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-grid-environment"] = '<x-grid-environment>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"pubkey": "<string>",
"relyingPartyId": "<string>",
"sessionKey": {
"expiration": 1,
"key": "11111111111111111111111111111111"
}
}Passkeys
Get Passkey Account
Retrieve passkey account details including relying party ID, public key, and session key status.
GET
/
api
/
grid
/
v1
/
passkeys
/
account
/
{passkey_account_address}
Get passkey account
curl --request GET \
--url https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address} \
--header 'Authorization: Bearer <token>' \
--header 'x-grid-environment: <x-grid-environment>'import requests
url = "https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}"
headers = {
"x-grid-environment": "<x-grid-environment>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'x-grid-environment': '<x-grid-environment>', Authorization: 'Bearer <token>'}
};
fetch('https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}', 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://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"x-grid-environment: <x-grid-environment>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-grid-environment", "<x-grid-environment>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}")
.header("x-grid-environment", "<x-grid-environment>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://grid.squads.xyz/api/grid/v1/passkeys/account/{passkey_account_address}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-grid-environment"] = '<x-grid-environment>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"pubkey": "<string>",
"relyingPartyId": "<string>",
"sessionKey": {
"expiration": 1,
"key": "11111111111111111111111111111111"
}
}Retrieves detailed information about a passkey account including its relying party ID, public key, and current session key if not expired.
Path Parameters
- passkey_account_address (required): The on-chain Solana address of the passkey account
Response
Returns passkey account details:{
"relying_party_id": "example.com",
"pubkey": "9yM...def", // Passkey public key in base58
"session_key": {
// Optional: Only if session is still valid
"key": "3pQ...ghi",
"expiration": 1234567890 // Unix timestamp
}
}
Session Key Validation
The endpoint performs session key expiration validation:- Checks Blockchain Clock: Queries Solana for current slot/timestamp
- Validates Expiration: Compares session expiration against blockchain time
- Returns if Valid: Includes session_key in response if not expired
- Omits if Expired: session_key field not included if expired
Session validation is performed against the Solana blockchain clock, not
the API server time. This ensures consistent validation across all Grid
services.
Use Cases
Check Session Status
Determine if an existing session key is still valid:const response = await fetch(
`https://grid.squads.xyz/api/grid/v1/passkeys/account/${passkeyAddress}`,
{
headers: {
Authorization: "Bearer YOUR_API_KEY",
"x-grid-environment": "sandbox",
},
}
);
const data = await response.json();
if (data.session_key) {
console.log("Session is valid until:", new Date(data.session_key.expiration * 1000));
// Use existing session
} else {
console.log("Session expired, need to re-authenticate");
// Call /passkeys/auth to refresh
}
Verify Passkey Existence
Check if a passkey account exists before operations:try {
const response = await fetch(
`https://grid.squads.xyz/api/grid/v1/passkeys/account/${passkeyAddress}`,
{
headers: {
Authorization: "Bearer YOUR_API_KEY",
"x-grid-environment": "sandbox",
},
}
);
if (response.ok) {
console.log("Passkey exists");
}
} catch (error) {
console.error("Passkey not found");
}
Get Relying Party Information
Retrieve the relying party ID for cross-origin validation:const data = await response.json();
console.log("Relying Party:", data.relying_party_id);
// Use for WebAuthn RP configuration
Response Fields
relying_party_id
The WebAuthn relying party identifier associated with this passkey. Limited to 32 bytes. Used for validating WebAuthn operations.pubkey
The passkey’s public key in base58 format. This is the cryptographic public key used to verify signatures from this passkey.session_key (optional)
Only included if a session key exists and has not expired:- key: Session public key in base58 format
- expiration: Unix timestamp when session expires
Important Notes
- Blockchain Validation: Session expiration checked against Solana clock
- Expired Sessions: session_key omitted if expired (not an error)
- Passkey Persistence: Passkey data persists even after session expiration
- RP ID Limit: Relying party IDs are limited to 32 bytes
- Cross-Origin: Relying party ID must match WebAuthn origin
Error Handling
Common errors:- NoValidExternallySignedAccount: Passkey address not found
- InvalidExternallySignedAccountAddress: Malformed address
- NotFound: Passkey account does not exist
Related Endpoints
- Authorize Passkey Session - Refresh expired session
- Find Passkey Account - Lookup by authenticator
- Get Passkey Session - Get session URL
Authorizations
Your Grid API key from the Grid Dashboard
Headers
Solana network environment (sandbox, devnet, mainnet)
Path Parameters
Passkey account address (Solana public key)
Response
Passkey account retrieved successfully
Was this page helpful?