Check signer via simulated memo transaction

Signs a server-authored memo message with the named wallet, verifies the signature, and simulates the transaction.

POST/v1/wallets/signer-checkRun 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 · example prj_example

    Required for dashboard sessions. API keys use their assigned project.

  • Idempotency-Key · string

    Use 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 returns 422. 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

  • 200 Signer check verified in simulation

    • data · object · required

      Signer check response payload.

      • walletId · string · required · min length 1 · example privy_wallet_123

        Resolved signing wallet ID.

      • walletAddress · string · required · min length 32 · max length 44 · example So11111111111111111111111111111111111111112

        Resolved signer address used for the check message.

      • feePayer · string · required · min length 32 · max length 44 · example So11111111111111111111111111111111111111112

        Funded fee payer address used in the simulated message; nothing is spent from it.

      • memo · string · required · example SDP signer check 123e4567-e89b-42d3-a456-426614174000

        Server-generated memo text in the simulated check message.

      • signature · string · required · example sig_example

        The 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 · always true

        Always true: signer checks run in simulation and cannot spend sponsorship.

      • checkedAt · string · required · format date-time · example 2026-02-20T00:00:00.000Z

        Timestamp recorded after the simulation succeeded.

    • meta · object · required

      Response metadata.

      • requestId · string · required · min length 1 · example req_example

        Request identifier for tracing.

      • timestamp · string · required · format date-time · example 2025-01-01T00:00:00.000Z

        ISO 8601 timestamp.

  • 400 Bad Request

    • error · object · required

      Standard error payload.

      • code · string · required

        Machine-readable error code.

      • message · string · required

        Human-readable error message.

      • details · object

        Optional error details for debugging.

        • * · any
    • meta · object

      • requestId · string · min length 1 · example req_example

        Request identifier for tracing.

  • 401 Unauthorized

    Same fields as 400.

  • 403 Forbidden. Requires the wallets.execute action: an API key must hold it (a module's manage or execute also covers its read), and a signed-in member's organization role must include it. Without it the error is INSUFFICIENT_PERMISSIONS and error.details.action names the action. Any other 403 names its own reason.

    Same fields as 400.

  • 404 Not Found

    Same fields as 400.

  • 409 Conflict

    Same fields as 400.

  • 422 Unprocessable Entity

    Same fields as 400.

  • 429 Too Many Requests

    Same fields as 400.

  • 500 Internal Server Error

    Same fields as 400.

  • 502 Bad Gateway

    Same 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.

Is this page helpful?