Overview
Updates the global hide list and/or the approval-banner flag in one
signed payload. SignedRequest, action prefs.update. The recovered
wallet must equal the path addr or the call fails 403 owner_mismatch.
At least one of hide_vault_key, unhide_vault_key, hide_approval is
required. Hides and unhides merge into the stored list; the full
resulting list is returned.
Hiding a held vault is allowed (it can force-exit positions). The
response then carries an advisory warnings array listing each active
strategy whose eligible pool drops below its max_positions + 1 floor.
Endpoint
PATCH https://earn-api.quicknode.dev/functions/v1/api/v1/wallets/{addr}/prefs
Authorization
Include the published apikey header and a valid Sign-In with Ethereum (SIWE) proof in the request body. The SIWE message binds the wallet to this action, payload, and request path.
Parameters
| Parameter | Location | Type | Required | Description |
|---|---|---|---|---|
| addr | path | string | Yes | Wallet address (`0x` + 40 hex). |
Request body
At least one of hide_vault_key, unhide_vault_key, hide_approval must be present (all part of the signed payload). hide_vault_key adds to the global hide list; unhide_vault_key removes; both may be sent together.
| Field | Type | Required | Description |
|---|---|---|---|
| siwe | object | Yes | A Sign-In-With-Ethereum proof binding the wallet to (action, payload, issuedAt, expirationTime). |
| hide_vault_key | string | No | Vault key to add to the hide list. |
| unhide_vault_key | string | No | Vault key to remove from the hide list. |
| hide_approval | boolean | No | Set the approval-banner dismissal flag. |
Example request
curl --request PATCH \
--url 'https://earn-api.quicknode.dev/functions/v1/api/v1/wallets/0x1234567890abcdef1234567890abcdef12345678/prefs' \
--header 'Accept: application/json' \
--header 'apikey: <EARN_PUBLIC_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"hide_vault_key": "8453:0x616a4e1db48e22028f6bbf20444cd3b8e3273738",
"hide_approval": true,
"siwe": {
"message": "earn.quicknode.com wants you to sign in with your Ethereum account:\n0x1234...\n\nAuthorize prefs.update\n\nURI: https://earn.quicknode.com\nVersion: 1\nChain ID: 8453\nNonce: 5c6d...\nIssued At: 2026-07-07T18:00:00.000Z\nExpiration Time: 2026-07-07T18:05:00.000Z\nResources:\n- sha256:<hex>\n- path:/wallets/0x1234.../prefs",
"signature": "0xabcd..."
}
}'
Response
| Field | Type | Required | Description |
|---|---|---|---|
| ok | boolean | Yes | Always true on a 2xx. |
| hidden_vault_keys | array<string> | Yes | The full hide list after the merge. |
| hide_approval | boolean | Yes | — |
| warnings | array<object> | No | Present only when a `hide_vault_key` request shrank a strategy's eligible vault pool below its `max_positions + 1` rebalancing floor. Advisory only; the write is always applied. Best-effort: may be absent even when applicable, never an error. |
Example response
{
"ok": true,
"hidden_vault_keys": ["8453:0x616a4e1db48e22028f6bbf20444cd3b8e3273738"],
"hide_approval": true
}
HTTP responses
| Status | Description |
|---|---|
| 200 | The merged hide list and the current approval-banner flag. |
| 400 | Malformed request or SIWE block. `code` is one of: `invalid_request`, `siwe_missing` (no `siwe` block), `siwe_shape` (message/signature not strings), `siwe_parse` (message does not match the documented line format). |
| 401 | SIWE verification failed. `code` is one of: `siwe_domain` (message domain not allowlisted), `siwe_action` (statement/action mismatch), `siwe_stale` (expired or validity window out of bounds), `siwe_payload` (payload hash or resource mismatch — canonicalization drift, a re-serialized body, or a `- path:` entry that does not match the request path), `siwe_chain` (bad chain id), `siwe_recover` (signature does not match the claimed address), `siwe_replay` (nonce already used — sign a fresh request). |
| 403 | The signing wallet does not match the `{addr}` in the path. A wallet may only write its own preferences / ToS state. |
| 429 | Rate limit exceeded. `Retry-After` (seconds) tells you when to retry. Reads, feedback, and push writes are keyed per IP; create/update/delete are keyed per wallet+IP; deposit/withdraw/claim calldata is keyed per strategy+IP. |
| 500 | Internal server error. |
| 503 | Transient: `prefs_read_failed` (current prefs could not be read; nothing was written) or `siwe_rpc` (signature-verification RPC failed). Retry. |
This page is based on operation updateWalletPrefs in the Earn OpenAPI 3.1 specification.