Check signer via simulated memo transaction
Signs a server-authored memo message with the named wallet, verifies the signature, and simulates the transaction.
POST/Run in dashboard
Nothing is broadcast and no sponsorship is spent. The wallet is the only readonly signer and the request cannot supply memo text.
Requires an API key with the wallets.execute action.
Headers
-
x-project-id·string· min length 1 · exampleprj_exampleRequired for dashboard sessions. API keys use their assigned project.
-
Idempotency-Key·stringUse a unique 1–255 printable ASCII key per operation. Reuse it with the same request on retries. An in-flight attempt returns
409; a changed request returns422. Retry and recovery rules.
Request body
application/json · required
walletId is the Provider wallet ID to check, required. Ambiguous Provider IDs are rejected; the check uses the resolved exact custody wallet record, and an API key may check only a wallet within its wallet scope.
walletId·string· required · min length 1
Responses
-
200Signer check verified in simulation-
data·object· requiredSigner check response payload.
-
walletId·string· required · min length 1 · exampleprivy_wallet_123Resolved signing wallet ID.
-
walletAddress·string· required · min length 32 · max length 44 · exampleSo11111111111111111111111111111111111111112Resolved signer address used for the check message.
-
feePayer·string· required · min length 32 · max length 44 · exampleSo11111111111111111111111111111111111111112Funded fee payer address used in the simulated message; nothing is spent from it.
-
memo·string· required · exampleSDP signer check 123e4567-e89b-42d3-a456-426614174000Server-generated memo text in the simulated check message.
-
signature·string· required · examplesig_exampleThe custody wallet's Ed25519 signature over the check message, base58. Verified server-side and exercised in RPC simulation only — the check never broadcasts, so this signature does not exist on chain.
-
simulated·boolean· required · alwaystrueAlways true: signer checks run in simulation and cannot spend sponsorship.
-
checkedAt·string· required · formatdate-time· example2026-02-20T00:00:00.000ZTimestamp recorded after the simulation succeeded.
-
-
meta·object· requiredResponse metadata.
-
requestId·string· required · min length 1 · examplereq_exampleRequest identifier for tracing.
-
timestamp·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
-
-
400Bad Request-
error·object· requiredStandard error payload.
-
code·string· requiredMachine-readable error code.
-
message·string· requiredHuman-readable error message.
-
details·objectOptional error details for debugging.
*·any
-
-
meta·object-
requestId·string· min length 1 · examplereq_exampleRequest identifier for tracing.
-
-
-
401UnauthorizedSame fields as
400. -
403Forbidden. Requires thewallets.executeaction: an API key must hold it (a module'smanageorexecutealso covers itsread), and a signed-in member's organization role must include it. Without it the error is INSUFFICIENT_PERMISSIONS anderror.details.actionnames the action. Any other 403 names its own reason.Same fields as
400. -
404Not FoundSame fields as
400. -
409ConflictSame fields as
400. -
422Unprocessable EntitySame fields as
400. -
429Too Many RequestsSame fields as
400. -
500Internal Server ErrorSame fields as
400. -
502Bad GatewaySame fields as
400.
Example request
curl -X POST 'https://api.solana.com/v1/wallets/signer-check' \
-H "Authorization: Bearer $SDP_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"walletId": "privy_wallet_123"
}'Example responses
{
"data": {
"walletId": "privy_wallet_123",
"walletAddress": "So11111111111111111111111111111111111111112",
"feePayer": "So11111111111111111111111111111111111111112",
"memo": "SDP signer check 123e4567-e89b-42d3-a456-426614174000",
"signature": "sig_example",
"simulated": true,
"checkedAt": "2026-02-20T00:00:00.000Z"
},
"meta": {
"requestId": "req_example",
"timestamp": "2025-01-01T00:00:00.000Z"
}
}Error responses use the standard error shape.