{ "openapi": "3.0.0", "paths": { "/about": { "get": { "description": "Retrieves basic information about the Safe Client Gateway application including version and build details.", "operationId": "aboutGetAbout", "parameters": [], "responses": { "200": { "description": "Application information retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/About" } } } } }, "summary": "Get application information", "tags": [ "about" ] } }, "/v1/auth/me": { "get": { "description": "Returns the authenticated user session if a valid session cookie is present, 403 otherwise. The response includes the user ID, the authentication method used, and (for SIWE users) the wallet signer address.", "operationId": "authGetMeV1", "parameters": [], "responses": { "200": { "description": "Authenticated user session", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserSession" } } } }, "403": { "description": "Not authenticated" } }, "summary": "Get authenticated user", "tags": [ "auth" ] } }, "/v1/auth/nonce": { "get": { "description": "Generates and returns a unique nonce that must be signed by the client for authentication. The nonce is used in the Sign-In with Ethereum (SiWE) message.", "operationId": "authGetNonceV1", "parameters": [], "responses": { "200": { "description": "Unique nonce generated for authentication", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthNonce" } } } } }, "summary": "Get authentication nonce", "tags": [ "auth" ] } }, "/v1/auth/verify": { "post": { "description": "Verifies a signed Sign-In with Ethereum (SiWE) message and nonce. On successful verification, sets an HTTP-only JWT cookie for subsequent authenticated requests.", "operationId": "authVerifyV1", "parameters": [], "requestBody": { "required": true, "description": "Sign-In with Ethereum message and signature for verification", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SiweDto" } } } }, "responses": { "200": { "description": "Authentication successful. JWT token set as HTTP-only cookie named \"access_token\"." }, "400": { "description": "Invalid SiWE message format or signature verification failed" }, "401": { "description": "Authentication failed - invalid or expired nonce" } }, "summary": "Verify authentication", "tags": [ "auth" ] } }, "/v1/auth/logout": { "post": { "description": "Logs out the authenticated user by clearing the JWT authentication cookie. This invalidates the current session.", "operationId": "authLogoutV1", "parameters": [], "responses": { "200": { "description": "Logout successful. Authentication cookie cleared and set to expire." } }, "summary": "Logout user", "tags": [ "auth" ] } }, "/v1/auth/logout/redirect": { "post": { "description": "Clears the authentication cookie and redirects the browser. For OIDC users, redirects through identity platform to clear their session cookie. For SiWe users, redirects directly to the app.", "operationId": "authLogoutWithRedirectV1", "parameters": [], "requestBody": { "required": false, "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/LogoutDto" } } } }, "responses": { "303": { "description": "Redirects to identity platform logout (OIDC) or directly to the app." }, "400": { "description": "Invalid redirect URL" } }, "summary": "Logout (with redirect)", "tags": [ "auth" ] } }, "/v1/auth/oidc/authorize": { "get": { "description": "Redirects the browser to OIDC provider login page with a generated state value stored in an HTTP-only cookie.", "operationId": "oidcAuthAuthorizeV1", "parameters": [ { "name": "redirect_url", "required": false, "in": "query", "description": "URL to redirect to after successful login. Must be same-origin as the configured post-login redirect URI.", "schema": { "example": "/settings", "type": "string" } }, { "name": "connection", "required": false, "in": "query", "description": "OIDC connection name to route to a specific identity provider.", "schema": { "type": "string" } } ], "responses": { "302": { "description": "Redirect to OIDC authorize endpoint" } }, "summary": "Start OIDC authorization code flow", "tags": [ "auth" ] } }, "/v1/auth/oidc/callback": { "get": { "description": "Exchanges the OIDC authorization code for user information, mints the internal JWT cookie, and redirects to the provided post-login URL or a configured default one.", "operationId": "oidcAuthCallbackV1", "parameters": [ { "name": "code", "required": false, "in": "query", "description": "Authorization code returned by the OIDC provider", "schema": { "example": "SplxlOBeZQQYbYS6WxSbIA", "type": "string" } }, { "name": "state", "required": false, "in": "query", "description": "State parameter returned by the OIDC provider", "schema": { "example": "af0ifjsldkj", "type": "string" } }, { "name": "error", "required": false, "in": "query", "description": "Error parameter returned by the OIDC provider", "schema": { "example": "access_denied", "type": "string" } }, { "name": "error_description", "required": false, "in": "query", "description": "Description of the error returned by the OIDC provider (if failed)", "schema": { "example": "The user has denied the request", "type": "string" } } ], "responses": { "302": { "description": "Redirect to the post-login URL. On error, includes error query parameter." } }, "summary": "Handle OIDC authorization callback", "tags": [ "auth" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/balances/{fiatCode}": { "get": { "description": "Retrieves token balances for a Safe on a specific chain, converted to the specified fiat currency. Includes native tokens, ERC-20 tokens, and their current market values.", "operationId": "balancesGetBalancesV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "fiatCode", "required": true, "in": "path", "description": "Fiat currency code for balance conversion (e.g., USD, EUR)", "schema": { "example": "USD", "type": "string" } }, { "name": "trusted", "required": false, "in": "query", "description": "If true, only returns balances for trusted tokens", "schema": { "example": false, "type": "boolean" } }, { "name": "exclude_spam", "required": false, "in": "query", "description": "If true, excludes spam tokens from results", "schema": { "example": true, "type": "boolean" } } ], "responses": { "200": { "description": "Safe balances retrieved successfully with fiat conversions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Balances" } } } } }, "summary": "Get Safe balances", "tags": [ "balances" ] } }, "/v1/balances/supported-fiat-codes": { "get": { "description": "Retrieves a list of all supported fiat currency codes that can be used for balance conversions.", "operationId": "balancesGetSupportedFiatCodesV1", "parameters": [], "responses": { "200": { "description": "List of supported fiat currency codes (e.g., [\"USD\", \"EUR\", \"GBP\"])", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } } } } }, "summary": "Get supported fiat currencies", "tags": [ "balances" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/positions/{fiatCode}": { "get": { "operationId": "positionsGetPositionsV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "fiatCode", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "refresh", "required": false, "in": "query", "description": "Cache busting parameter. Set to true to invalidate cache and fetch fresh data from Zerion", "schema": { "example": true, "type": "boolean" } }, { "name": "sync", "required": false, "in": "query", "description": "If true, waits for position data to be aggregated before responding (up to 30s)", "schema": { "example": false, "type": "boolean" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Protocol" } } } } } }, "tags": [ "positions" ] } }, "/v1/portfolio/{address}": { "get": { "description": "Retrieves the complete portfolio for an address including token balances and app positions across all supported chains.", "operationId": "portfolioGetPortfolioV1", "parameters": [ { "name": "address", "required": true, "in": "path", "description": "Wallet address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "sync", "required": false, "in": "query", "description": "If true, waits for position data to be aggregated before responding (up to 30s)", "schema": { "example": false, "type": "boolean" } }, { "name": "excludeDust", "required": false, "in": "query", "description": "If true, filters out dust positions (balance < $0.001 USD)", "schema": { "example": true, "type": "boolean" } }, { "name": "trusted", "required": false, "in": "query", "description": "If true, only returns trusted tokens", "schema": { "example": true, "type": "boolean" } }, { "name": "chainIds", "required": false, "in": "query", "description": "Comma-separated list of chain IDs to filter by. If omitted, returns data for all chains.", "schema": { "example": "1,137,42161", "type": "string" } }, { "name": "fiatCode", "required": false, "in": "query", "description": "Fiat currency code for balance conversion (e.g., USD, EUR)", "schema": { "example": "USD", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Portfolio" } } } } }, "summary": "Get portfolio", "tags": [ "portfolio" ] }, "delete": { "description": "Clears the cached portfolio data for a specific address", "operationId": "portfolioClearPortfolioV1", "parameters": [ { "name": "address", "required": true, "in": "path", "description": "Wallet address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "204": { "description": "" } }, "summary": "Clear portfolio cache", "tags": [ "portfolio" ] } }, "/v1/chains": { "get": { "description": "Retrieves a paginated list of all blockchain networks supported by the Safe infrastructure, including their configuration and capabilities.", "operationId": "chainsGetChainsV1", "parameters": [ { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of supported chains", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChainPage" } } } } }, "summary": "Get supported chains", "tags": [ "chains" ] } }, "/v1/chains/{chainId}": { "get": { "description": "Retrieves detailed information about a specific blockchain network, including its configuration, features, and Safe-specific settings.", "operationId": "chainsGetChainV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID of the blockchain network", "schema": { "example": "1", "type": "string" } } ], "responses": { "200": { "description": "Chain details retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Chain" } } } } }, "summary": "Get chain details", "tags": [ "chains" ] } }, "/v1/chains/{chainId}/about": { "get": { "description": "Retrieves general information about a blockchain network, including network details and statistics.", "operationId": "chainsGetAboutChainV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID of the blockchain network", "schema": { "example": "1", "type": "string" } } ], "responses": { "200": { "description": "Chain information retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AboutChain" } } } } }, "summary": "Get chain information", "tags": [ "chains" ] } }, "/v1/chains/{chainId}/about/backbone": { "get": { "description": "Retrieves backbone infrastructure information for a specific chain, including API endpoints and service configurations.", "operationId": "chainsGetBackboneV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID of the blockchain network", "schema": { "example": "1", "type": "string" } } ], "responses": { "200": { "description": "Chain backbone information retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Backbone" } } } } }, "summary": "Get chain backbone information", "tags": [ "chains" ] } }, "/v1/chains/{chainId}/about/master-copies": { "get": { "description": "Retrieves information about Safe master copy contracts deployed on the specified chain, including their addresses and versions.", "operationId": "chainsGetMasterCopiesV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID of the blockchain network", "schema": { "example": "1", "type": "string" } } ], "responses": { "200": { "description": "List of Safe master copy contracts", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/MasterCopy" } } } } } }, "summary": "Get Safe master copy contracts", "tags": [ "chains" ] } }, "/v1/chains/{chainId}/about/indexing": { "get": { "description": "Retrieves the current indexing status for a blockchain network, including the latest indexed block and synchronization state.", "operationId": "chainsGetIndexingStatusV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID of the blockchain network", "schema": { "example": "1", "type": "string" } } ], "responses": { "200": { "description": "Chain indexing status retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IndexingStatus" } } } } }, "summary": "Get chain indexing status", "tags": [ "chains" ] } }, "/v1/chains/{chainId}/gas-price": { "get": { "operationId": "chainsGetGasPriceV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "example": "1", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GasPriceResponse" } } } } }, "summary": "Get gas price from oracle", "tags": [ "chains" ] } }, "/v2/chains": { "get": { "description": "Retrieves a paginated list of all blockchain networks supported by the Safe infrastructure, with features scoped to the service key.", "operationId": "chainsGetChainsV2", "parameters": [ { "name": "serviceKey", "required": true, "in": "query", "description": "Service key for scoping chain features (e.g., WALLET_WEB, MOBILE)", "schema": { "example": "WALLET_WEB", "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of supported chains with service-scoped features", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChainPage" } } } } }, "summary": "Get supported chains (v2)", "tags": [ "chains" ] } }, "/v2/chains/{chainId}": { "get": { "description": "Retrieves detailed information about a specific blockchain network, with features scoped to the service key.", "operationId": "chainsGetChainV2", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID of the blockchain network", "schema": { "example": "1", "type": "string" } }, { "name": "serviceKey", "required": true, "in": "query", "description": "Service key for scoping chain features (e.g., WALLET_WEB, MOBILE)", "schema": { "example": "WALLET_WEB", "type": "string" } } ], "responses": { "200": { "description": "Chain details with service-scoped features", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Chain" } } } } }, "summary": "Get chain details (v2)", "tags": [ "chains" ] } }, "/v2/chains/{chainId}/safes/{safeAddress}/collectibles": { "get": { "operationId": "collectiblesGetCollectiblesV2", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "trusted", "required": false, "in": "query", "schema": { "type": "boolean" } }, { "name": "exclude_spam", "required": false, "in": "query", "schema": { "type": "boolean" } }, { "name": "cursor", "required": false, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CollectiblePage" } } } } }, "tags": [ "collectibles" ] } }, "/v1/community/campaigns": { "get": { "operationId": "communityGetCampaignsV1", "parameters": [ { "name": "cursor", "required": false, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CampaignPage" } } } } }, "tags": [ "community" ] } }, "/v1/community/campaigns/{resourceId}": { "get": { "operationId": "communityGetCampaignByIdV1", "parameters": [ { "name": "resourceId", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Campaign" } } } } }, "tags": [ "community" ] } }, "/v1/community/campaigns/{resourceId}/activities": { "get": { "operationId": "communityGetCampaignActivitiesV1", "parameters": [ { "name": "resourceId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "holder", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "" } }, "tags": [ "community" ] } }, "/v1/community/campaigns/{resourceId}/leaderboard": { "get": { "operationId": "communityGetCampaignLeaderboardV1", "parameters": [ { "name": "resourceId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CampaignRankPage" } } } } }, "tags": [ "community" ] } }, "/v1/community/campaigns/{resourceId}/leaderboard/{safeAddress}": { "get": { "operationId": "communityGetCampaignRankV1", "parameters": [ { "name": "resourceId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CampaignRank" } } } } }, "tags": [ "community" ] } }, "/v1/community/eligibility": { "post": { "operationId": "communityCheckEligibilityV1", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EligibilityRequest" } } } }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Eligibility" } } } } }, "tags": [ "community" ] } }, "/v1/community/locking/leaderboard": { "get": { "operationId": "communityGetLeaderboardV1", "parameters": [ { "name": "cursor", "required": false, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LockingRankPage" } } } } }, "tags": [ "community" ] } }, "/v1/community/locking/{safeAddress}/rank": { "get": { "operationId": "communityGetLockingRankV1", "parameters": [ { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LockingRank" } } } } }, "tags": [ "community" ] } }, "/v1/community/locking/{safeAddress}/history": { "get": { "operationId": "communityGetLockingHistoryV1", "parameters": [ { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LockingEventPage" } } } } }, "tags": [ "community" ] } }, "/v1/chains/{chainId}/contracts/{contractAddress}": { "get": { "description": "Retrieves detailed information about a smart contract deployed on the specified chain, including ABI, source code verification status, and contract metadata.", "operationId": "contractsGetContractV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the contract is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "contractAddress", "required": true, "in": "path", "description": "Contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Contract information retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Contract" } } } } }, "summary": "Get contract information", "tags": [ "contracts" ] } }, "/v1/chains/{chainId}/data-decoder": { "post": { "description": "Decodes raw transaction data into human-readable format using contract ABIs. This helps understand what functions are being called and with what parameters.", "operationId": "dataDecodedGetDataDecodedV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the transaction will be executed", "schema": { "example": "1", "type": "string" } } ], "requestBody": { "required": true, "description": "Transaction data to decode, including contract address and data payload", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TransactionDataDto" } } } }, "responses": { "200": { "description": "Transaction data decoded successfully with method name, parameters, and values", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DataDecoded" } } } } }, "summary": "Decode transaction data", "tags": [ "data-decoded" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/recovery": { "post": { "operationId": "recoveryAddRecoveryModuleV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddRecoveryModuleDto" } } } }, "responses": { "200": { "description": "" } }, "tags": [ "recovery" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/recovery/{moduleAddress}": { "delete": { "operationId": "recoveryDeleteRecoveryModuleV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "moduleAddress", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "204": { "description": "" } }, "tags": [ "recovery" ] } }, "/v2/chains/{chainId}/safes/{address}/multisig-transactions/estimations": { "post": { "description": "Estimates the gas cost for executing a multisig transaction on a Safe. Provides both the recommended gas limit and the current gas price for accurate cost calculation.", "operationId": "estimationsGetEstimationV2", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "address", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Transaction details for gas estimation including recipient, value, and data", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetEstimationDto" } } } }, "responses": { "200": { "description": "Gas estimation calculated successfully with recommended values", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EstimationResponse" } } } }, "400": { "description": "Invalid transaction parameters or estimation failed" } }, "summary": "Estimate multisig transaction gas", "tags": [ "estimations" ] } }, "/v1/chains/{chainId}/fees/{safeAddress}/preview": { "post": { "description": "Calculates the estimated fees for executing a transaction via Pay with Safe, including gas costs, relay fees, and total costs in USD.", "operationId": "feesGetFeePreviewV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Transaction data for fee calculation including recipient, value, data, operation type, gas token, and number of signatures", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FeePreviewTransactionDto" } } } }, "responses": { "200": { "description": "Fee preview with transaction data, relay cost, and pricing context", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FeePreviewResponse" } } } }, "400": { "description": "Invalid transaction data or Pay with Safe not available for this chain" } }, "summary": "Get transaction fee preview", "tags": [ "fees" ] } }, "/v1/chains/{chainId}/messages/{messageHash}": { "get": { "description": "Retrieves a specific message by its hash, including signatures, confirmations, and message content.", "operationId": "messagesGetMessageByHashV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the message was created", "schema": { "example": "1", "type": "string" } }, { "name": "messageHash", "required": true, "in": "path", "description": "Message hash (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Message retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Message" } } } }, "404": { "description": "Message not found" } }, "summary": "Get message by hash", "tags": [ "messages" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/messages": { "get": { "description": "Retrieves a paginated list of messages for a specific Safe, including both pending and confirmed messages with date labels.", "operationId": "messagesGetMessagesBySafeV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of messages for the Safe", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MessagePage" } } } }, "404": { "description": "Safe not found on the specified chain" } }, "summary": "Get messages for Safe", "tags": [ "messages" ] }, "post": { "description": "Creates a new message for a Safe. The message must be properly formatted and signed according to EIP-191 or EIP-712 standards.", "operationId": "messagesCreateMessageV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Message data including content and signature", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateMessageDto" } } } }, "responses": { "200": { "description": "Message created successfully" }, "400": { "description": "Invalid message format or signature" } }, "summary": "Create message", "tags": [ "messages" ] } }, "/v1/chains/{chainId}/messages/{messageHash}/signatures": { "post": { "description": "Adds a signature to an existing message. Multiple Safe owners can sign the same message to reach consensus.", "operationId": "messagesUpdateMessageSignatureV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the message was created", "schema": { "example": "1", "type": "string" } }, { "name": "messageHash", "required": true, "in": "path", "description": "Message hash (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Signature data to add to the message", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateMessageSignatureDto" } } } }, "responses": { "200": { "description": "Signature added successfully" }, "400": { "description": "Invalid signature or signer not authorized" }, "404": { "description": "Message not found" } }, "summary": "Add message signature", "tags": [ "messages" ] } }, "/v1/users": { "get": { "description": "Retrieves the authenticated user information along with all associated wallet addresses.", "operationId": "usersGetWithWalletsV1", "parameters": [], "responses": { "200": { "description": "User information with associated wallets retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserWithWallets" } } } }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "404": { "description": "User not found - the authenticated wallet is not associated with any user" } }, "summary": "Get user with wallets", "tags": [ "users" ] }, "delete": { "description": "Deletes the authenticated user and all associated data including wallets and account information.", "operationId": "usersDeleteV1", "parameters": [], "responses": { "204": { "description": "User deleted successfully" }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "404": { "description": "User not found - the authenticated wallet is not associated with any user" } }, "summary": "Delete user", "tags": [ "users" ] } }, "/v1/users/wallet": { "post": { "description": "Creates a new user account associated with the authenticated wallet address.", "operationId": "usersCreateWithWalletV1", "parameters": [], "responses": { "201": { "description": "User created successfully with wallet association", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreatedUserWithWallet" } } } }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "409": { "description": "Wallet already exists - this wallet is already associated with a user" } }, "summary": "Create user with wallet", "tags": [ "users" ] } }, "/v1/users/wallet/add": { "post": { "description": "Associates an additional wallet address with the authenticated user account using Sign-In with Ethereum (SiWE) verification.", "operationId": "usersAddWalletToUserV1", "parameters": [], "requestBody": { "required": true, "description": "Sign-In with Ethereum message and signature for the wallet to add", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SiweDto" } } } }, "responses": { "200": { "description": "Wallet added to user successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WalletAddedToUser" } } } }, "401": { "description": "Authentication required or invalid SiWE message/signature" }, "404": { "description": "User not found - the authenticated wallet is not associated with any user" }, "409": { "description": "Wallet already exists - this wallet is already associated with a user" } }, "summary": "Add wallet to user", "tags": [ "users" ] } }, "/v1/users/wallet/{walletAddress}": { "delete": { "description": "Removes a wallet address from the authenticated user account. Cannot remove the currently authenticated wallet.", "operationId": "usersDeleteWalletFromUserV1", "parameters": [ { "name": "walletAddress", "required": true, "in": "path", "description": "Wallet address to remove (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "204": { "description": "Wallet removed from user successfully" }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "404": { "description": "User or specified wallet not found" }, "409": { "description": "Cannot remove the current wallet - use a different wallet to authenticate" } }, "summary": "Remove wallet from user", "tags": [ "users" ] } }, "/v1/spaces/{spaceId}/address-book": { "get": { "description": "Retrieves all address book entries for a specific space. Address books help organize and label frequently used addresses.", "operationId": "addressBooksGetAddressBookItemsV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to get address book for", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Address book items retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpaceAddressBookDto" } } } }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "403": { "description": "Access forbidden - user is not a member of this space" }, "404": { "description": "User, member, or space not found" } }, "summary": "Get space address book", "tags": [ "spaces" ] }, "put": { "description": "Creates or updates address book entries for a space. This allows adding labels and organizing frequently used addresses.", "operationId": "addressBooksUpsertAddressBookItemsV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to update address book for", "schema": { "example": 1, "type": "number" } } ], "requestBody": { "required": true, "description": "Address book items to create or update, including addresses and their labels", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpsertAddressBookItemsDto" } } } }, "responses": { "200": { "description": "Address book updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpaceAddressBookDto" } } } }, "400": { "description": "Address book items limit exceeded or invalid data provided" }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "403": { "description": "Access forbidden - user is not authorized to modify this address book" }, "404": { "description": "User, member, or space not found" } }, "summary": "Update space address book", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/address-book/{address}": { "delete": { "description": "Removes a specific address from the space address book by its address.", "operationId": "addressBooksDeleteByAddressV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID containing the address book", "schema": { "example": 1, "type": "number" } }, { "name": "address", "required": true, "in": "path", "description": "Address to remove from the address book (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "204": { "description": "Address book entry deleted successfully" }, "403": { "description": "Access forbidden - user is not authorized to modify this address book" }, "404": { "description": "User, member, space, or address book entry not found" } }, "summary": "Delete address book entry", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/address-book/private": { "get": { "description": "Retrieves the authenticated user's private address book entries for a specific space.", "operationId": "userAddressBookGetPrivateItemsV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Private address book items retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserAddressBookDto" } } } }, "401": { "description": "Authentication required" }, "403": { "description": "User is not a member of this space" } }, "summary": "Get private address book", "tags": [ "spaces" ] }, "put": { "description": "Creates or updates the authenticated user's private address book entries for a space.", "operationId": "userAddressBookUpsertPrivateItemsV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } } ], "requestBody": { "required": true, "description": "Address book items to create or update", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpsertAddressBookItemsDto" } } } }, "responses": { "200": { "description": "Private address book updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserAddressBookDto" } } } }, "401": { "description": "Authentication required" }, "403": { "description": "User is not a member of this space or wallet authentication required" } }, "summary": "Upsert private address book entries", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/address-book/private/{address}": { "delete": { "description": "Removes a specific address from the user's private address book.", "operationId": "userAddressBookDeletePrivateItemV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } }, { "name": "address", "required": true, "in": "path", "description": "Address to remove (0x prefixed)", "schema": { "type": "string" } } ], "responses": { "204": { "description": "Private address book entry deleted successfully" }, "403": { "description": "User is not a member or wallet authentication required" }, "404": { "description": "Entry not found" } }, "summary": "Delete a private address book entry", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/address-book/requests": { "get": { "description": "Retrieves pending requests to add contacts to the space address book. Admins see all pending requests, members see only their own.", "operationId": "addressBookRequestsGetPendingRequestsV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Pending requests retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddressBookRequestsDto" } } } }, "401": { "description": "Authentication required" }, "403": { "description": "User is not a member of this space" } }, "summary": "Get pending address book requests", "tags": [ "spaces" ] }, "post": { "description": "Creates a request to add a private contact to the shared space address book. Requires the contact to exist in the private address book first.", "operationId": "addressBookRequestsCreateRequestV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } } ], "requestBody": { "required": true, "description": "Address of the private contact to request adding", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateAddressBookRequestDto" } } } }, "responses": { "201": { "description": "Request created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddressBookRequestItemDto" } } } }, "403": { "description": "User is not a member or wallet authentication required" }, "404": { "description": "Private contact not found" } }, "summary": "Request to add a private contact to the space address book", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/address-book/requests/{requestId}/approve": { "put": { "description": "Admin approves a pending request. The contact is added to the shared space address book.", "operationId": "addressBookRequestsApproveRequestV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } }, { "name": "requestId", "required": true, "in": "path", "description": "Request ID to approve", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Request approved successfully" }, "400": { "description": "Only pending requests can be approved" }, "403": { "description": "User is not an admin or wallet authentication required" }, "404": { "description": "Request not found" } }, "summary": "Approve a pending address book request", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/address-book/requests/{requestId}/reject": { "put": { "description": "Admin rejects a pending request. The contact stays in the private address book.", "operationId": "addressBookRequestsRejectRequestV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } }, { "name": "requestId", "required": true, "in": "path", "description": "Request ID to reject", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Request rejected successfully" }, "400": { "description": "Only pending requests can be rejected" }, "403": { "description": "User is not an admin or wallet authentication required" }, "404": { "description": "Request not found" } }, "summary": "Reject a pending address book request", "tags": [ "spaces" ] } }, "/v1/spaces": { "post": { "description": "Creates a new space for the authenticated user. A space is a collaborative workspace where users can manage multiple Safes together.", "operationId": "spacesCreateV1", "parameters": [], "requestBody": { "required": true, "description": "Space creation data including the name of the space", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSpaceDto" } } } }, "responses": { "200": { "description": "Space created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSpaceResponse" } } } }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "403": { "description": "Forbidden resource - user lacks permission to create spaces" } }, "summary": "Create space", "tags": [ "spaces" ] }, "get": { "description": "Retrieves all spaces that the authenticated user is a member of or has been invited to, including the count of Safes in each space.", "operationId": "spacesGetV1", "parameters": [], "responses": { "200": { "description": "User spaces retrieved successfully", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/GetSpaceResponse" } } } } }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "403": { "description": "Forbidden resource - user lacks permission to view spaces" } }, "summary": "Get user spaces", "tags": [ "spaces" ] } }, "/v1/spaces/create-with-user": { "post": { "deprecated": true, "description": "Creates a new space for the authenticated user. This endpoint is deprecated, please use POST /v1/spaces instead.", "operationId": "spacesCreateWithUserV1", "parameters": [], "requestBody": { "required": true, "description": "Space creation data including the name of the space", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSpaceDto" } } } }, "responses": { "200": { "description": "Space created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSpaceResponse" } } } }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "403": { "description": "Forbidden resource - user lacks permission to create spaces" } }, "summary": "Create space with user (deprecated)", "tags": [ "spaces" ] } }, "/v1/spaces/{id}": { "get": { "description": "Retrieves detailed information about a specific space. The user must be a member of or invited to the space.", "operationId": "spacesGetOneV1", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Space information retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetSpaceResponse" } } } }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "403": { "description": "Forbidden resource - user is not a member of this space" }, "404": { "description": "Space not found" } }, "summary": "Get space by ID", "tags": [ "spaces" ] }, "patch": { "description": "Updates space information such as name. Only space admins can update space details.", "operationId": "spacesUpdateV1", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Space ID to update", "schema": { "example": 1, "type": "number" } } ], "requestBody": { "required": true, "description": "Space update data including new name or other properties", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateSpaceDto" } } } }, "responses": { "200": { "description": "Space updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateSpaceResponse" } } } }, "401": { "description": "Authentication required or user unauthorized to update this space" }, "403": { "description": "Forbidden resource - user is not an admin of this space" }, "404": { "description": "Space not found" } }, "summary": "Update space", "tags": [ "spaces" ] }, "delete": { "description": "Deletes a space and all its associated data. Only space admins can delete spaces.", "operationId": "spacesDeleteV1", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Space ID to delete", "schema": { "example": 1, "type": "number" } } ], "responses": { "204": { "description": "Space deleted successfully" }, "401": { "description": "Authentication required or user unauthorized to delete this space" }, "403": { "description": "Forbidden resource - user is not an admin of this space" }, "404": { "description": "Space not found" } }, "summary": "Delete space", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/safes": { "post": { "description": "Adds one or more Safe addresses to a space. This allows the space members to collectively manage these Safes.", "operationId": "spaceSafesCreateV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to add Safes to", "schema": { "example": 1, "type": "number" } } ], "requestBody": { "required": true, "description": "List of Safe addresses and their chain information to add to the space", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSpaceSafesDto" } } } }, "responses": { "201": { "description": "Safes added to space successfully" }, "401": { "description": "Authentication required or user unauthorized to modify this space" }, "403": { "description": "Access forbidden - user lacks permission to add Safes to this space" }, "404": { "description": "User or space not found" } }, "summary": "Add Safes to space", "tags": [ "spaces" ] }, "get": { "description": "Retrieves all Safes associated with a specific space, including their chain information and metadata.", "operationId": "spaceSafesGetV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to get Safes for", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Space Safes retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetSpaceSafeResponse" } } } }, "401": { "description": "Authentication required or user unauthorized to access this space" }, "403": { "description": "Access forbidden - user is not a member of this space" }, "404": { "description": "User or space not found" } }, "summary": "Get space Safes", "tags": [ "spaces" ] }, "delete": { "description": "Removes one or more Safe addresses from a space. This stops the space from managing these Safes.", "operationId": "spaceSafesDeleteV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to remove Safes from", "schema": { "example": 1, "type": "number" } } ], "requestBody": { "required": true, "description": "List of Safe addresses and their chain information to remove from the space", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteSpaceSafesDto" } } } }, "responses": { "204": { "description": "Safes removed from space successfully" }, "401": { "description": "Authentication required or user unauthorized to modify this space" }, "403": { "description": "Access forbidden - user lacks permission to remove Safes from this space" }, "404": { "description": "Space has no Safes, user not found, or specified Safes not found in space" } }, "summary": "Remove Safes from space", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/members/invite": { "post": { "description": "Invites one or more users to join a space. Only space admins can send invitations.", "operationId": "membersInviteUserV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to invite users to", "schema": { "example": 1, "type": "number" } } ], "requestBody": { "required": true, "description": "List of wallet addresses to invite to the space", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/InviteUsersDto" } } } }, "responses": { "200": { "description": "Users invited successfully", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Invitation" } } } } }, "401": { "description": "Authentication required or user not admin or member not active" }, "403": { "description": "User not authorized - must be a space admin to invite users" }, "409": { "description": "Too many invites or some users already invited" } }, "summary": "Invite users to space", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/members/accept": { "post": { "description": "Accepts an invitation to join a space. The user must have a pending invitation to the space.", "operationId": "membersAcceptInviteV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to accept invitation for", "schema": { "example": 1, "type": "number" } } ], "requestBody": { "required": true, "description": "Invitation acceptance data including any required confirmation", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AcceptInviteDto" } } } }, "responses": { "200": { "description": "Invitation accepted successfully - user is now a member of the space" }, "403": { "description": "Access forbidden - user is not authorized to accept this invitation" }, "404": { "description": "User, space, or membership invitation not found" }, "409": { "description": "User invitation is not in pending state or already processed" } }, "summary": "Accept space invitation", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/members/decline": { "post": { "description": "Declines an invitation to join a space. The user must have a pending invitation to the space.", "operationId": "membersDeclineInviteV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to decline invitation for", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Invitation declined successfully" }, "403": { "description": "Access forbidden - user is not authorized to decline this invitation" }, "404": { "description": "User, space, or membership invitation not found" }, "409": { "description": "User invitation is not in pending state or already processed" } }, "summary": "Decline space invitation", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/members": { "get": { "description": "Retrieves all members of a space including their roles, status, and membership information.", "operationId": "membersGetUsersV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to get members for", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Space members retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MembersDto" } } } }, "403": { "description": "Access forbidden - user is not authorized to view this space's members" }, "404": { "description": "User or space not found" } }, "summary": "Get space members", "tags": [ "spaces" ] }, "delete": { "description": "Remove own membership from a space.", "operationId": "membersSelfRemoveV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Membership deleted" }, "401": { "description": "Not authenticated" }, "403": { "description": "User not authorized" }, "404": { "description": "Space not found" }, "409": { "description": "Cannot remove last admin" } }, "summary": "Leave a space", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/membership": { "get": { "description": "Returns the membership record of the authenticated user for the given space. Returns 403 if the caller has no ACTIVE or INVITED membership in the space.", "operationId": "membersGetMembershipV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to fetch the caller's membership for", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Membership retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MemberDto" } } } }, "401": { "description": "Not authenticated" }, "403": { "description": "Access forbidden - user not authenticated, or has no ACTIVE/INVITED membership in this space" } }, "summary": "Get the authenticated user's membership in a space", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/members/{userId}/role": { "patch": { "description": "Updates the role of a space member. Only space admins can change member roles. Cannot remove the last admin from a space.", "operationId": "membersUpdateRoleV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID containing the member", "schema": { "example": 1, "type": "number" } }, { "name": "userId", "required": true, "in": "path", "description": "User ID of the member to update", "schema": { "example": 123, "type": "number" } } ], "requestBody": { "required": true, "description": "New role information for the member", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateRoleDto" } } } }, "responses": { "200": { "description": "Member role updated successfully" }, "401": { "description": "User is not active or not an admin of this space" }, "403": { "description": "Access forbidden - user is not authorized to update member roles" }, "404": { "description": "User, space, or member not found" }, "409": { "description": "Cannot remove the last admin from the space" } }, "summary": "Update member role", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/members/alias": { "patch": { "description": "Update the alias of the authenticated member in a space. Users can only update their own alias.", "operationId": "membersUpdateAliasV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "schema": { "type": "number" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateMemberAliasDto" } } } }, "responses": { "200": { "description": "Alias updated" }, "403": { "description": "User not authorized" }, "404": { "description": "Space or member not found" } }, "summary": "Update member alias", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/members/{userId}": { "delete": { "description": "Removes a member from a space. Only space admins can remove other members. Cannot remove the last admin from a space.", "operationId": "membersRemoveUserV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID to remove member from", "schema": { "example": 1, "type": "number" } }, { "name": "userId", "required": true, "in": "path", "description": "User ID of the member to remove", "schema": { "example": 123, "type": "number" } } ], "responses": { "200": { "description": "Member removed from space successfully" }, "401": { "description": "User is not active or not an admin of this space" }, "403": { "description": "Access forbidden - user is not authorized to remove members" }, "404": { "description": "User, space, or member not found" }, "409": { "description": "Cannot remove the last admin from the space" } }, "summary": "Remove member from space", "tags": [ "spaces" ] } }, "/v1/users/counterfactual-safes": { "post": { "description": "Stores the CREATE2 deployment parameters for one or more counterfactual (undeployed) Safes. These parameters are needed to deploy the Safe later.", "operationId": "counterfactualSafesCreateV1", "parameters": [], "requestBody": { "required": true, "description": "Counterfactual Safe creation parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateCounterfactualSafesDto" } } } }, "responses": { "201": { "description": "Counterfactual Safes saved successfully" }, "401": { "description": "Authentication required" } }, "summary": "Save counterfactual Safe creation parameters", "tags": [ "counterfactual-safes" ] }, "get": { "description": "Retrieves all counterfactual (undeployed) Safes for the authenticated user, grouped by chain ID.", "operationId": "counterfactualSafesGetV1", "parameters": [], "responses": { "200": { "description": "Counterfactual Safes retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetCounterfactualSafesResponse" } } } }, "401": { "description": "Authentication required" } }, "summary": "Get counterfactual Safes", "tags": [ "counterfactual-safes" ] }, "delete": { "description": "Removes counterfactual Safe records for the authenticated user, typically after successful deployment.", "operationId": "counterfactualSafesDeleteV1", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteCounterfactualSafesDto" } } } }, "responses": { "204": { "description": "Counterfactual Safes deleted successfully" }, "401": { "description": "Authentication required" }, "404": { "description": "Counterfactual Safe not found" } }, "summary": "Delete counterfactual Safes", "tags": [ "counterfactual-safes" ] } }, "/v1/spaces/{spaceId}/counterfactual-safes": { "get": { "description": "Retrieves creation parameters for all counterfactual (undeployed) Safes that are associated with a space. Uses a join between space_safes and counterfactual_safes to provide full transparency on Safe ownership and deployment parameters to all space members.", "operationId": "spaceCounterfactualSafesGetV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space ID", "schema": { "example": 1, "type": "number" } } ], "responses": { "200": { "description": "Counterfactual Safes retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetCounterfactualSafesResponse" } } } }, "401": { "description": "Authentication required or user is not a member of this space" }, "404": { "description": "Space not found" } }, "summary": "Get counterfactual Safes in a space", "tags": [ "spaces" ] } }, "/v1/chains/{chainId}/owners/{ownerAddress}/safes": { "get": { "description": "Retrieves a list of Safe addresses that are owned by the specified address on a specific chain.", "operationId": "ownersGetSafesByOwnerV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID to search for Safes", "schema": { "example": "1", "type": "string" } }, { "name": "ownerAddress", "required": true, "in": "path", "description": "Owner address to search Safes for (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "List of Safes owned by the specified address", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SafeList" } } } } }, "summary": "Get Safes by owner", "tags": [ "owners" ] } }, "/v2/owners/{ownerAddress}/safes": { "get": { "description": "Retrieves all Safes owned by the specified address across all supported chains. Returns a map of chain IDs to arrays of Safe addresses.", "operationId": "ownersGetAllSafesByOwnerV2", "parameters": [ { "name": "ownerAddress", "required": true, "in": "path", "description": "Owner address to search Safes for (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Map of chain IDs to arrays of Safe addresses owned by the address", "content": { "application/json": { "schema": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } }, "example": { "1": [ "0x1234567890123456789012345678901234567890" ], "5": [ "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd" ] } } } } } }, "summary": "Get all Safes by owner", "tags": [ "owners" ] } }, "/v3/owners/{ownerAddress}/safes": { "get": { "description": "Retrieves all Safes owned by the specified address across all supported chains. Returns a map of chain IDs to arrays of Safe addresses.", "operationId": "ownersGetAllSafesByOwnerV3", "parameters": [ { "name": "ownerAddress", "required": true, "in": "path", "description": "Owner address to search Safes for (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Map of chain IDs to arrays of Safe addresses owned by the address", "content": { "application/json": { "schema": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } }, "example": { "1": [ "0x1234567890123456789012345678901234567890" ], "5": [ "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd" ] } } } } } }, "summary": "Get all Safes by owner", "tags": [ "owners" ] } }, "/v1/chains/{chainId}/relay": { "post": { "description": "Relays a Safe transaction using the relay service, which pays for gas fees. The transaction must meet certain criteria and the Safe must have remaining relay quota.", "operationId": "relayRelayV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe transaction will be executed", "schema": { "example": "1", "type": "string" } } ], "requestBody": { "required": true, "description": "Transaction data to relay including Safe address, transaction details, and signatures", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RelayDto" } } } }, "responses": { "200": { "description": "Transaction relayed successfully with transaction hash", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Relay" } } } }, "400": { "description": "Invalid transaction data, unofficial contracts, or unsupported operation" }, "429": { "description": "Relay limit reached for this Safe" } }, "summary": "Relay transaction", "tags": [ "relay" ] } }, "/v1/chains/{chainId}/relay/status/{taskId}": { "get": { "description": "Retrieves the status of a relay task from the relay provider. This is a proxy endpoint to securely query task status without exposing the API key.", "operationId": "relayGetTaskStatusV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID associated with the relay task", "schema": { "example": "11155111", "type": "string" } }, { "name": "taskId", "required": true, "in": "path", "description": "Task ID returned from the relay transaction", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Task status retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RelayTaskStatus" } } } }, "404": { "description": "Task not found" } }, "summary": "Get relay task status", "tags": [ "relay" ] } }, "/v1/chains/{chainId}/relay/{safeAddress}": { "get": { "description": "Retrieves the number of remaining relay transactions available for a specific Safe on the given chain.", "operationId": "relayGetRelaysRemainingV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "safeTxHash", "required": false, "in": "query", "description": "Safe transaction hash (0x prefixed hex string). Required for chains enabled for relay-fee relayer", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Remaining relay quota retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RelaysRemaining" } } } } }, "summary": "Get remaining relays", "tags": [ "relay" ] } }, "/v1/chains/{chainId}/safe-apps": { "get": { "description": "Retrieves a list of Safe Apps available for a specific chain, with optional filtering by client URL or app URL.", "operationId": "safeAppsGetSafeAppsV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID to get Safe Apps for", "schema": { "example": "1", "type": "string" } }, { "name": "clientUrl", "required": false, "in": "query", "description": "Filter by client URL to get apps compatible with specific client", "schema": { "type": "string" } }, { "name": "url", "required": false, "in": "query", "description": "Filter by specific Safe App URL", "schema": { "type": "string" } } ], "responses": { "200": { "description": "List of Safe Apps available for the specified chain", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/SafeApp" } } } } } }, "summary": "Get Safe Apps", "tags": [ "safe-apps" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}": { "get": { "description": "Retrieves detailed information about a Safe including owners, threshold, modules, and current state.", "operationId": "safesGetSafeV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Safe information retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SafeState" } } } }, "404": { "description": "Safe not found on the specified chain" } }, "summary": "Get Safe information", "tags": [ "safes" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/nonces": { "get": { "description": "Retrieves the current nonces for a Safe, including the transaction nonce and any queued nonces.", "operationId": "safesGetNoncesV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Safe nonces retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SafeNonces" } } } }, "404": { "description": "Safe not found on the specified chain" } }, "summary": "Get Safe nonces", "tags": [ "safes" ] } }, "/v1/safes": { "get": { "description": "Retrieves an overview of multiple Safes including their balances, transaction counts, and other summary information. Supports cross-chain queries using CAIP-10 address format.", "operationId": "safesGetSafeOverviewV1", "parameters": [ { "name": "currency", "required": true, "in": "query", "description": "Fiat currency code for balance conversion (e.g., USD, EUR)", "schema": { "example": "USD", "type": "string" } }, { "name": "safes", "required": true, "in": "query", "description": "Comma-separated list of Safe addresses in CAIP-10 format (chainId:address)", "schema": { "example": "1:0x1234567890123456789012345678901234567890,5:0xabcdefabcdefabcdefabcdefabcdefabcdefabcd", "type": "string" } }, { "name": "trusted", "required": false, "in": "query", "description": "If true, only includes trusted tokens in balance calculations", "schema": { "example": false, "type": "boolean" } }, { "name": "exclude_spam", "required": false, "in": "query", "description": "If true, excludes spam tokens from balance calculations", "schema": { "example": true, "type": "boolean" } }, { "name": "wallet_address", "required": false, "in": "query", "description": "Optional wallet address to filter Safes where this address is an owner", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Array of Safe overviews with balances and metadata", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/SafeOverview" } } } } } }, "summary": "Get Safe overview", "tags": [ "safes" ] } }, "/v2/safes": { "get": { "description": "Retrieves an overview of multiple Safes. Supports cross-chain queries using chainId:address format.", "operationId": "safesGetSafeOverviewV2", "parameters": [ { "name": "currency", "required": true, "in": "query", "description": "Fiat currency code for balance conversion (e.g., USD, EUR)", "schema": { "example": "USD", "type": "string" } }, { "name": "safes", "required": true, "in": "query", "description": "Comma-separated list of Safe addresses in chainId:address format", "schema": { "example": "1:0x1234567890123456789012345678901234567890,5:0xabcdefabcdefabcdefabcdefabcdefabcdefabcd", "type": "string" } }, { "name": "trusted", "required": false, "in": "query", "description": "If true, only includes trusted tokens in balance calculations.", "schema": { "example": false, "type": "boolean" } }, { "name": "wallet_address", "required": false, "in": "query", "description": "Optional wallet address to filter Safes where this address is an owner", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Array of Safe overviews with balances and metadata", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/SafeOverview" } } } } } }, "summary": "Get Safe overview (v2)", "tags": [ "safes" ] } }, "/v1/chains/{chainId}/security/{safeAddress}/recipient/{recipientAddress}": { "get": { "description": "Performs real-time security analysis of a recipient address for a specific Safe. Returns analysis results grouped by status group, sorted by severity (CRITICAL first).", "operationId": "safeShieldAnalyzeRecipientV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address", "schema": { "type": "string" } }, { "name": "recipientAddress", "required": true, "in": "path", "description": "Recipient address to analyze", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Recipient interaction analysis results", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SingleRecipientAnalysisDto" } } } } }, "summary": "Analyze recipient address", "tags": [ "safe-shield" ] } }, "/v1/chains/{chainId}/security/{safeAddress}/counterparty-analysis": { "post": { "description": "Performs combined contract and recipient analysis for a Safe transaction. Returns both analyses grouped by status group for each counterparty.", "operationId": "safeShieldAnalyzeCounterpartyV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Transaction data used to analyze all counterparties involved.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CounterpartyAnalysisRequestDto" } } } }, "responses": { "200": { "description": "Combined counterparty analysis including recipients and contracts grouped by status group and mapped to an address.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CounterpartyAnalysisDto" } } } } }, "summary": "Analyze transaction counterparties", "tags": [ "safe-shield" ] } }, "/v1/chains/{chainId}/security/{safeAddress}/threat-analysis": { "post": { "description": "Performs real-time threat analysis for a Safe transaction.", "operationId": "safeShieldAnalyzeThreatV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "EIP-712 typed data and wallet information for threat analysis.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ThreatAnalysisRequestDto" } } } }, "responses": { "200": { "description": "Threat analysis results including threat findings and balance changes.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ThreatAnalysisResponseDto" } } } } }, "summary": "Analyze transaction threat", "tags": [ "safe-shield" ] } }, "/v1/chains/{chainId}/security/{safeAddress}/report-false-result": { "post": { "description": "Reports a FALSE_POSITIVE or FALSE_NEGATIVE Blockaid transaction scan result for review. Use the request_id from the original scan response to identify the transaction.", "operationId": "safeShieldReportFalseResultV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Report details including event type, request_id from scan response, and details.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportFalseResultRequestDto" } } } }, "responses": { "200": { "description": "Report submitted successfully.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportFalseResultResponseDto" } } } } }, "summary": "Report false Blockaid scan result", "tags": [ "safe-shield" ] } }, "/v1/targeted-messaging/outreaches/{outreachId}/chains/{chainId}/safes/{safeAddress}": { "get": { "operationId": "targetedMessagingGetTargetedSafeV1", "parameters": [ { "name": "outreachId", "required": true, "in": "path", "schema": { "type": "number" } }, { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TargetedSafe" } } } }, "404": { "description": "Safe not targeted." } }, "tags": [ "targeted-messaging" ] } }, "/v1/targeted-messaging/outreaches/{outreachId}/chains/{chainId}/safes/{safeAddress}/signers/{signerAddress}/submissions": { "get": { "operationId": "targetedMessagingGetSubmissionV1", "parameters": [ { "name": "outreachId", "required": true, "in": "path", "schema": { "type": "number" } }, { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "signerAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Submission" } } } } }, "tags": [ "targeted-messaging" ] }, "post": { "operationId": "targetedMessagingCreateSubmissionV1", "parameters": [ { "name": "outreachId", "required": true, "in": "path", "schema": { "type": "number" } }, { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "signerAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateSubmissionDto" } } } }, "responses": { "201": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Submission" } } } } }, "tags": [ "targeted-messaging" ] } }, "/v1/chains/{chainId}/transactions/{id}": { "get": { "description": "Retrieves detailed information about a specific transaction by its ID, including execution status, confirmations, and decoded transaction data.", "operationId": "transactionsGetTransactionByIdV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the transaction exists", "schema": { "example": "1", "type": "string" } }, { "name": "id", "required": true, "in": "path", "description": "Transaction ID (safe transaction hash or multisig transaction ID)", "schema": { "example": "multisig_0x1234567890123456789012345678901234567890_0x5678...", "type": "string" } } ], "responses": { "200": { "description": "Transaction details retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TransactionDetails" } } } }, "404": { "description": "Transaction not found" } }, "summary": "Get transaction details", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/multisig-transactions/{safeTxHash}/raw": { "get": { "deprecated": true, "operationId": "transactionsGetDomainMultisigTransactionBySafeTxHashV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeTxHash", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TXSMultisigTransaction" } } } } }, "summary": "Deprecated", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/multisig-transactions/raw": { "get": { "deprecated": true, "operationId": "transactionsGetDomainMultisigTransactionsV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "failed", "required": false, "in": "query", "schema": { "type": "boolean" } }, { "name": "modified__lt", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "modified__gt", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "modified__lte", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "modified__gte", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "nonce__lt", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "nonce__gt", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "nonce__lte", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "nonce__gte", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "nonce", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "safe_tx_hash", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "to", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "value__lt", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "value__gt", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "value", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "executed", "required": false, "in": "query", "schema": { "type": "boolean" } }, { "name": "has_confirmations", "required": false, "in": "query", "schema": { "type": "boolean" } }, { "name": "trusted", "required": false, "in": "query", "schema": { "type": "boolean" } }, { "name": "execution_date__gte", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "execution_date__lte", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "submission_date__gte", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "submission_date__lte", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "transaction_hash", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "ordering", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "limit", "required": false, "in": "query", "schema": { "type": "number" } }, { "name": "offset", "required": false, "in": "query", "schema": { "type": "number" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TXSMultisigTransactionPage" } } } } }, "summary": "Deprecated", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/multisig-transactions": { "get": { "description": "Retrieves a paginated list of multisig transactions for a Safe with optional filtering by execution date, recipient, value, nonce, and execution status.", "operationId": "transactionsGetMultisigTransactionsV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "execution_date__gte", "required": false, "in": "query", "description": "Filter by execution date greater than or equal to (ISO 8601 format)", "schema": { "type": "string" } }, { "name": "execution_date__lte", "required": false, "in": "query", "description": "Filter by execution date less than or equal to (ISO 8601 format)", "schema": { "type": "string" } }, { "name": "to", "required": false, "in": "query", "description": "Filter by recipient address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "value", "required": false, "in": "query", "description": "Filter by transaction value in wei", "schema": { "type": "string" } }, { "name": "nonce", "required": false, "in": "query", "description": "Filter by transaction nonce", "schema": { "type": "string" } }, { "name": "executed", "required": false, "in": "query", "description": "Filter by execution status (true for executed, false for pending)", "schema": { "type": "boolean" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of multisig transactions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MultisigTransactionPage" } } } } }, "summary": "Get multisig transactions", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/transactions/{safeTxHash}": { "delete": { "description": "Deletes a pending multisig transaction. Only the proposer or a Safe owner can delete a transaction.", "operationId": "transactionsDeleteTransactionV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the transaction exists", "schema": { "example": "1", "type": "string" } }, { "name": "safeTxHash", "required": true, "in": "path", "description": "Safe transaction hash (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Signature proving authorization to delete the transaction", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteTransactionDto" } } } }, "responses": { "204": { "description": "Transaction deleted successfully" }, "400": { "description": "Invalid signature or unauthorized deletion attempt" }, "404": { "description": "Transaction not found" } }, "summary": "Delete transaction", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/module-transactions": { "get": { "description": "Retrieves a paginated list of module transactions for a Safe. Module transactions are executed directly by enabled modules without requiring owner signatures.", "operationId": "transactionsGetModuleTransactionsV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "to", "required": false, "in": "query", "description": "Filter by recipient address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "module", "required": false, "in": "query", "description": "Filter by module address that executed the transaction", "schema": { "type": "string" } }, { "name": "transaction_hash", "required": false, "in": "query", "description": "Filter by specific transaction hash", "schema": { "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of module transactions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ModuleTransactionPage" } } } } }, "summary": "Get module transactions", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/transactions/{safeTxHash}/confirmations": { "post": { "description": "Adds a confirmation signature to a pending multisig transaction. Once enough confirmations are collected to meet the Safe threshold, the transaction can be executed.", "operationId": "transactionsAddConfirmationV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeTxHash", "required": true, "in": "path", "description": "Safe transaction hash (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Confirmation signature from a Safe owner proving their approval of the transaction", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddConfirmationDto" } } } }, "responses": { "200": { "description": "Transaction details with updated confirmation status", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Transaction" } } } }, "400": { "description": "Invalid signature or confirmation already exists for this owner" }, "404": { "description": "Transaction not found" } }, "summary": "Add transaction confirmation", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/incoming-transfers": { "get": { "description": "Retrieves a paginated list of incoming transfers to a Safe, including ETH and token transfers with optional filtering by date, value, token, and trust status.", "operationId": "transactionsGetIncomingTransfersV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "trusted", "required": false, "in": "query", "description": "Filter by trust status (true for trusted tokens, false for untrusted)", "schema": { "type": "boolean" } }, { "name": "execution_date__gte", "required": false, "in": "query", "description": "Filter by execution date greater than or equal to (ISO 8601 format)", "schema": { "type": "string" } }, { "name": "execution_date__lte", "required": false, "in": "query", "description": "Filter by execution date less than or equal to (ISO 8601 format)", "schema": { "type": "string" } }, { "name": "to", "required": false, "in": "query", "description": "Filter by recipient address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "value", "required": false, "in": "query", "description": "Filter by transfer value in wei", "schema": { "type": "string" } }, { "name": "token_address", "required": false, "in": "query", "description": "Filter by token contract address (0x prefixed hex string for ERC-20 tokens)", "schema": { "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of incoming transfers", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncomingTransferPage" } } } } }, "summary": "Get incoming transfers", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/transactions/{safeAddress}/preview": { "post": { "description": "Simulates a transaction execution to preview its effects, including gas estimates, balance changes, and potential errors before actually proposing or executing it.", "operationId": "transactionsPreviewTransactionV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Transaction data to preview including recipient, value, data, and operation type", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PreviewTransactionDto" } } } }, "responses": { "200": { "description": "Transaction preview with simulation results, gas estimates, and potential effects", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TransactionPreview" } } } }, "400": { "description": "Invalid transaction data or simulation failed" }, "404": { "description": "Safe not found" } }, "summary": "Preview transaction", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/transactions/queued": { "get": { "description": "Retrieves a paginated list of queued (pending) transactions for a Safe that are waiting for execution, ordered by nonce.", "operationId": "transactionsGetTransactionQueueV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "trusted", "required": false, "in": "query", "description": "Filter by trust status (true for trusted transactions, false for untrusted)", "schema": { "type": "boolean" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of queued transactions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QueuedItemPage" } } } } }, "summary": "Get transaction queue", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/transactions/history": { "get": { "description": "Retrieves a paginated list of executed transactions for a Safe, including multisig transactions, module transactions, and incoming transfers, ordered by execution date.", "operationId": "transactionsGetTransactionsHistoryV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "timezone_offset", "required": false, "in": "query", "deprecated": true, "description": "Deprecated: Timezone offset in milliseconds for date formatting (use timezone parameter instead)", "schema": { "type": "string" } }, { "name": "trusted", "required": false, "in": "query", "description": "Filter by trust status (default: true, set to false to include untrusted transactions)", "schema": { "type": "boolean" } }, { "name": "imitation", "required": false, "in": "query", "description": "Include imitation transactions in results (default: true, set to false to exclude)", "schema": { "type": "boolean" } }, { "name": "timezone", "required": false, "in": "query", "description": "IANA timezone identifier for date formatting (e.g., \"America/New_York\")", "schema": { "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of historical transactions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TransactionItemPage" } } } } }, "summary": "Get transaction history", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/transactions/{safeAddress}/propose": { "post": { "description": "Proposes a new multisig transaction for a Safe. The transaction will be pending until enough owners sign it to reach the required threshold.", "operationId": "transactionsProposeTransactionV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Transaction proposal including recipient, value, data, and initial signature", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProposeTransactionDto" } } } }, "responses": { "200": { "description": "Transaction proposed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TransactionDetails" } } } }, "400": { "description": "Invalid transaction data or signature" } }, "summary": "Propose transaction", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/transactions/creation": { "get": { "description": "Retrieves the transaction that created the Safe, including the creation timestamp, creator address, factory used, and setup data.", "operationId": "transactionsGetCreationTransactionV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Safe creation transaction details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreationTransaction" } } } }, "404": { "description": "Safe not found or creation transaction not available" } }, "summary": "Get Safe creation transaction", "tags": [ "transactions" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/creation/raw": { "get": { "deprecated": true, "operationId": "transactionsGetDomainCreationTransactionV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TXSCreationTransaction" } } } } }, "summary": "Deprecated", "tags": [ "transactions" ] } }, "/v1/export/chains/{chainId}/{safeAddress}": { "post": { "operationId": "csvExportLaunchExportV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "schema": { "type": "string" } } ], "requestBody": { "required": false, "description": "Transaction export request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TransactionExportDto" } } } }, "responses": { "202": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobStatusDto" } } } } }, "tags": [ "export" ] } }, "/v1/export/{jobId}/status": { "get": { "operationId": "csvExportGetExportStatusV1", "parameters": [ { "name": "jobId", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "CSV export status retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobStatusDto" } } } }, "404": { "description": "CSV export not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JobStatusErrorDto" } } } } }, "tags": [ "export" ] } }, "/v1/chains/{chainId}/delegates": { "get": { "deprecated": true, "description": "Retrieves a paginated list of delegates for a specific chain. This endpoint is deprecated, please use the v2 version instead.", "operationId": "delegatesGetDelegatesV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where delegates are registered", "schema": { "example": "1", "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } }, { "name": "label", "required": false, "in": "query", "description": "Filter by delegate label", "schema": { "type": "string" } }, { "name": "delegator", "required": false, "in": "query", "description": "Filter by delegator address", "schema": { "type": "string" } }, { "name": "delegate", "required": false, "in": "query", "description": "Filter by delegate address", "schema": { "type": "string" } }, { "name": "safe", "required": false, "in": "query", "description": "Filter by Safe address", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of delegates retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DelegatePage" } } } } }, "summary": "Get delegates (deprecated)", "tags": [ "delegates" ] }, "post": { "deprecated": true, "description": "Creates a new delegate for a specific chain. This endpoint is deprecated, please use the v2 version instead.", "operationId": "delegatesPostDelegateV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the delegate will be registered", "schema": { "example": "1", "type": "string" } } ], "requestBody": { "required": true, "description": "Delegate creation data including Safe address, delegate address, and signature", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateDelegateDto" } } } }, "responses": { "204": { "description": "Delegate created successfully" }, "400": { "description": "Invalid delegate data or signature" } }, "summary": "Create delegate (deprecated)", "tags": [ "delegates" ] } }, "/v1/chains/{chainId}/delegates/{delegateAddress}": { "delete": { "deprecated": true, "description": "Deletes a delegate for a specific chain and address. This endpoint is deprecated, please use the v2 version instead.", "operationId": "delegatesDeleteDelegateV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the delegate is registered", "schema": { "example": "1", "type": "string" } }, { "name": "delegateAddress", "required": true, "in": "path", "description": "Delegate address to delete (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Signature proving authorization to delete the delegate", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteDelegateDto" } } } }, "responses": { "204": { "description": "Delegate deleted successfully" }, "400": { "description": "Invalid signature or unauthorized deletion attempt" } }, "summary": "Delete delegate (deprecated)", "tags": [ "delegates" ] } }, "/v1/chains/{chainId}/safes/{safeAddress}/delegates/{delegateAddress}": { "delete": { "deprecated": true, "description": "Removes a delegate from a specific Safe. This endpoint is deprecated, please use the v2 version instead.", "operationId": "delegatesDeleteSafeDelegateV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "delegateAddress", "required": true, "in": "path", "description": "Delegate address to remove (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Signature proving authorization to remove the delegate", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteSafeDelegateDto" } } } }, "responses": { "204": { "description": "Safe delegate removed successfully" }, "400": { "description": "Invalid signature or unauthorized removal attempt" } }, "summary": "Delete Safe delegate (deprecated)", "tags": [ "delegates" ] } }, "/v2/chains/{chainId}/delegates": { "get": { "description": "Retrieves a paginated list of delegates for a specific chain with optional filtering by Safe, delegate, delegator, or label.", "operationId": "delegatesGetDelegatesV2", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where delegates are registered", "schema": { "example": "1", "type": "string" } }, { "name": "cursor", "required": false, "in": "query", "description": "Pagination cursor for retrieving the next set of results", "schema": { "type": "string" } }, { "name": "label", "required": false, "in": "query", "description": "Filter by delegate label or name", "schema": { "type": "string" } }, { "name": "delegator", "required": false, "in": "query", "description": "Filter by delegator address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "delegate", "required": false, "in": "query", "description": "Filter by delegate address (0x prefixed hex string)", "schema": { "type": "string" } }, { "name": "safe", "required": false, "in": "query", "description": "Filter by Safe address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Paginated list of delegates retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DelegatePage" } } } } }, "summary": "Get delegates", "tags": [ "delegates" ] }, "post": { "description": "Creates a new delegate relationship between a Safe and a delegate address. Requires proper authorization signature.", "operationId": "delegatesPostDelegateV2", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the delegate will be registered", "schema": { "example": "1", "type": "string" } } ], "requestBody": { "required": true, "description": "Delegate creation data including Safe address, delegate address, label, and authorization signature", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateDelegateDto" } } } }, "responses": { "204": { "description": "Delegate created successfully" }, "400": { "description": "Invalid delegate data, signature, or unauthorized creation attempt" } }, "summary": "Create delegate", "tags": [ "delegates" ] } }, "/v2/chains/{chainId}/delegates/{delegateAddress}": { "delete": { "description": "Removes a delegate relationship for a specific delegate address. Requires proper authorization signature.", "operationId": "delegatesDeleteDelegateV2", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the delegate is registered", "schema": { "example": "1", "type": "string" } }, { "name": "delegateAddress", "required": true, "in": "path", "description": "Delegate address to remove (0x prefixed hex string)", "schema": { "type": "string" } } ], "requestBody": { "required": true, "description": "Signature and data proving authorization to delete the delegate", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteDelegateV2Dto" } } } }, "responses": { "204": { "description": "Delegate deleted successfully" }, "400": { "description": "Invalid signature or unauthorized deletion attempt" } }, "summary": "Delete delegate", "tags": [ "delegates" ] } }, "/v1/register/notifications": { "post": { "deprecated": true, "description": "Registers a device to receive push notifications for Safe events. This endpoint is deprecated, please use the v2 version instead.", "operationId": "notificationsRegisterDeviceV1", "parameters": [], "requestBody": { "required": true, "description": "Device registration data including device token, UUID, and Safe registrations with signatures", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterDeviceDto" } } } }, "responses": { "200": { "description": "Device registered successfully for notifications" }, "400": { "description": "Invalid device data, expired timestamp, or invalid signature" } }, "summary": "Register device for notifications (deprecated)", "tags": [ "notifications" ] } }, "/v1/chains/{chainId}/notifications/devices/{uuid}": { "delete": { "deprecated": true, "description": "Removes a device from receiving notifications. This endpoint is deprecated, please use the v2 version instead.", "operationId": "notificationsUnregisterDeviceV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID (kept for backward compatibility)", "schema": { "example": "1", "type": "string" } }, { "name": "uuid", "required": true, "in": "path", "description": "Device UUID to unregister", "schema": { "example": "550e8400-e29b-41d4-a716-446655440000", "type": "string" } } ], "responses": { "204": { "description": "Device unregistered successfully" } }, "summary": "Unregister device (deprecated)", "tags": [ "notifications" ] } }, "/v1/chains/{chainId}/notifications/devices/{uuid}/safes/{safeAddress}": { "delete": { "deprecated": true, "description": "Removes a specific Safe from receiving notifications on a device. This endpoint is deprecated, please use the v2 version instead.", "operationId": "notificationsUnregisterSafeV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "uuid", "required": true, "in": "path", "description": "Device UUID", "schema": { "example": "550e8400-e29b-41d4-a716-446655440000", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "204": { "description": "Safe unregistered from device notifications successfully" } }, "summary": "Unregister Safe from device (deprecated)", "tags": [ "notifications" ] } }, "/v2/register/notifications": { "post": { "description": "Registers or updates a device to receive push notifications for Safe events. Creates subscriptions for specified Safes and notification types.", "operationId": "notificationsUpsertSubscriptionsV2", "parameters": [], "requestBody": { "required": true, "description": "Device and subscription data including device token, Safe addresses, and notification preferences", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpsertSubscriptionsDto" } } } }, "responses": { "201": { "description": "Device registered successfully with returned device UUID", "content": { "application/json": { "schema": { "type": "object", "properties": { "deviceUuid": { "type": "string", "format": "uuid", "description": "Generated UUID for the registered device" } } } } } }, "400": { "description": "Invalid device data or subscription configuration" } }, "summary": "Register device for notifications", "tags": [ "notifications" ] } }, "/v2/chains/{chainId}/notifications/devices/{deviceUuid}/safes/{safeAddress}": { "get": { "description": "Retrieves the notification types that a device is subscribed to for a specific Safe.", "operationId": "notificationsGetSafeSubscriptionV2", "parameters": [ { "name": "deviceUuid", "required": true, "in": "path", "description": "Device UUID", "schema": { "example": "550e8400-e29b-41d4-a716-446655440000", "type": "string" } }, { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "List of notification types the device is subscribed to for this Safe", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/NotificationTypeResponseDto" } } } } }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "404": { "description": "Device, Safe, or subscription not found" } }, "summary": "Get Safe subscription", "tags": [ "notifications" ] }, "delete": { "description": "Removes all notification subscriptions for a specific Safe on a device.", "operationId": "notificationsDeleteSubscriptionV2", "parameters": [ { "name": "deviceUuid", "required": true, "in": "path", "description": "Device UUID", "schema": { "example": "550e8400-e29b-41d4-a716-446655440000", "type": "string" } }, { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "type": "string" } }, { "name": "safeAddress", "required": true, "in": "path", "description": "Safe contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "204": { "description": "Safe subscription deleted successfully" }, "404": { "description": "Device, Safe, or subscription not found" } }, "summary": "Delete Safe subscription", "tags": [ "notifications" ] } }, "/v2/notifications/subscriptions": { "delete": { "description": "Delete all subscriptions of a Safe on a device. This will delete all subscriptions of a Safe on a device for all chains passed in the request body.", "operationId": "notificationsDeleteAllSubscriptionsV2", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteAllSubscriptionsDto" } } } }, "responses": { "404": { "description": "No subscription was found" }, "422": { "description": "The request body is invalid" } }, "summary": "Delete all subscriptions of a device", "tags": [ "notifications" ] } }, "/v2/chains/{chainId}/notifications/devices/{deviceUuid}": { "delete": { "description": "Removes a device and all its notification subscriptions from the system.", "operationId": "notificationsDeleteDeviceV2", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID (kept for backward compatibility)", "schema": { "example": "1", "type": "string" } }, { "name": "deviceUuid", "required": true, "in": "path", "description": "Device UUID to delete", "schema": { "example": "550e8400-e29b-41d4-a716-446655440000", "type": "string" } } ], "responses": { "204": { "description": "Device deleted successfully" }, "404": { "description": "Device not found" } }, "summary": "Delete device", "tags": [ "notifications" ] } } }, "info": { "title": "Safe Client Gateway", "description": "", "version": "main", "contact": {} }, "tags": [], "servers": [], "components": { "schemas": { "About": { "type": "object", "properties": { "name": { "type": "string" }, "version": { "type": "string", "nullable": true }, "buildNumber": { "type": "string", "nullable": true } }, "required": [ "name" ] }, "UserSession": { "type": "object", "properties": { "id": { "type": "string" }, "authMethod": { "type": "string", "enum": [ "siwe", "oidc" ] }, "signerAddress": { "type": "string", "description": "Wallet signer address. Present only for SIWE-authenticated users." }, "email": { "type": "string", "description": "Verified email address. Present only for OIDC-authenticated users when stored." } }, "required": [ "id", "authMethod" ] }, "AuthNonce": { "type": "object", "properties": { "nonce": { "type": "string" } }, "required": [ "nonce" ] }, "SiweDto": { "type": "object", "properties": { "message": { "type": "string" }, "signature": { "type": "string" } }, "required": [ "message", "signature" ] }, "LogoutDto": { "type": "object", "properties": { "redirect_url": { "type": "string", "description": "Post-logout redirect URL (must be same-origin as pre-configured URL)" } } }, "NativeToken": { "type": "object", "properties": { "address": { "type": "string" }, "decimals": { "type": "number" }, "logoUri": { "type": "string" }, "name": { "type": "string" }, "symbol": { "type": "string" }, "type": { "type": "string", "enum": [ "NATIVE_TOKEN" ] } }, "required": [ "address", "decimals", "logoUri", "name", "symbol", "type" ] }, "Erc20Token": { "type": "object", "properties": { "address": { "type": "string" }, "decimals": { "type": "number" }, "logoUri": { "type": "string" }, "name": { "type": "string" }, "symbol": { "type": "string" }, "type": { "type": "string", "enum": [ "ERC20" ] } }, "required": [ "address", "decimals", "logoUri", "name", "symbol", "type" ] }, "Erc721Token": { "type": "object", "properties": { "address": { "type": "string" }, "decimals": { "type": "number" }, "logoUri": { "type": "string" }, "name": { "type": "string" }, "symbol": { "type": "string" }, "type": { "type": "string", "enum": [ "ERC721" ] } }, "required": [ "address", "decimals", "logoUri", "name", "symbol", "type" ] }, "Balance": { "type": "object", "properties": { "balance": { "type": "string" }, "fiatBalance": { "type": "string" }, "fiatConversion": { "type": "string" }, "tokenInfo": { "oneOf": [ { "$ref": "#/components/schemas/NativeToken" }, { "$ref": "#/components/schemas/Erc20Token" }, { "$ref": "#/components/schemas/Erc721Token" } ] }, "fiatBalance24hChange": { "type": "string", "nullable": true } }, "required": [ "balance", "fiatBalance", "fiatConversion", "tokenInfo" ] }, "Balances": { "type": "object", "properties": { "fiatTotal": { "type": "string" }, "items": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/Balance" } ] } } }, "required": [ "fiatTotal", "items" ] }, "Position": { "type": "object", "properties": { "balance": { "type": "string" }, "fiatBalance": { "type": "string" }, "fiatConversion": { "type": "string" }, "tokenInfo": { "oneOf": [ { "$ref": "#/components/schemas/NativeToken" }, { "$ref": "#/components/schemas/Erc20Token" }, { "$ref": "#/components/schemas/Erc721Token" } ] }, "fiatBalance24hChange": { "type": "string", "nullable": true }, "position_type": { "type": "string", "enum": [ "deposit", "loan", "locked", "staked", "reward", "wallet", "airdrop", "margin", "unknown" ], "nullable": true } }, "required": [ "balance", "fiatBalance", "fiatConversion", "tokenInfo", "fiatBalance24hChange", "position_type" ] }, "PositionGroup": { "type": "object", "properties": { "name": { "type": "string" }, "items": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/Position" } ] } } }, "required": [ "name", "items" ] }, "ProtocolIcon": { "type": "object", "properties": { "url": { "type": "string", "nullable": true } }, "required": [ "url" ] }, "ProtocolMetadata": { "type": "object", "properties": { "name": { "type": "string" }, "icon": { "$ref": "#/components/schemas/ProtocolIcon" } }, "required": [ "name", "icon" ] }, "Protocol": { "type": "object", "properties": { "protocol": { "type": "string" }, "protocol_metadata": { "$ref": "#/components/schemas/ProtocolMetadata" }, "fiatTotal": { "type": "string" }, "items": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/PositionGroup" } ] } } }, "required": [ "protocol", "protocol_metadata", "fiatTotal", "items" ] }, "PortfolioNativeToken": { "type": "object", "properties": { "address": { "type": "string" }, "decimals": { "type": "number" }, "logoUri": { "type": "string" }, "name": { "type": "string" }, "symbol": { "type": "string" }, "type": { "type": "string", "enum": [ "NATIVE_TOKEN" ] }, "chainId": { "type": "string", "description": "The chain ID" }, "trusted": { "type": "boolean", "description": "Whether the token is trusted (spam filter)" } }, "required": [ "address", "decimals", "logoUri", "name", "symbol", "type", "chainId", "trusted" ] }, "PortfolioErc20Token": { "type": "object", "properties": { "address": { "type": "string" }, "decimals": { "type": "number" }, "logoUri": { "type": "string" }, "name": { "type": "string" }, "symbol": { "type": "string" }, "type": { "type": "string", "enum": [ "ERC20" ] }, "chainId": { "type": "string", "description": "The chain ID" }, "trusted": { "type": "boolean", "description": "Whether the token is trusted (spam filter)" } }, "required": [ "address", "decimals", "logoUri", "name", "symbol", "type", "chainId", "trusted" ] }, "PortfolioErc721Token": { "type": "object", "properties": { "address": { "type": "string" }, "decimals": { "type": "number" }, "logoUri": { "type": "string" }, "name": { "type": "string" }, "symbol": { "type": "string" }, "type": { "type": "string", "enum": [ "ERC721" ] }, "chainId": { "type": "string", "description": "The chain ID" }, "trusted": { "type": "boolean", "description": "Whether the token is trusted (spam filter)" } }, "required": [ "address", "decimals", "logoUri", "name", "symbol", "type", "chainId", "trusted" ] }, "TokenBalance": { "type": "object", "properties": { "tokenInfo": { "description": "Token information", "oneOf": [ { "$ref": "#/components/schemas/PortfolioNativeToken" }, { "$ref": "#/components/schemas/PortfolioErc20Token" }, { "$ref": "#/components/schemas/PortfolioErc721Token" } ] }, "balance": { "type": "string", "description": "Balance in smallest unit as string integer. Use decimals to convert." }, "balanceFiat": { "type": "string", "description": "Balance in requested fiat currency. Decimal string without exponent notation or thousand separators.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "4801.653401839" }, "price": { "type": "string", "description": "Token price in requested fiat currency. Decimal string without exponent notation or thousand separators.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "3890.12" }, "priceChangePercentage1d": { "type": "string", "description": "Price change as decimal (e.g., \"-0.0431\" for -4.31%). Decimal string without exponent notation.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "-0.0431" } }, "required": [ "tokenInfo", "balance" ] }, "AppPosition": { "type": "object", "properties": { "key": { "type": "string", "description": "Unique position key" }, "type": { "type": "string", "description": "Position type (e.g., staked, lending, liquidity)" }, "name": { "type": "string", "description": "Position name" }, "groupId": { "type": "string", "description": "Group ID for grouping related positions together" }, "tokenInfo": { "description": "Token information", "oneOf": [ { "$ref": "#/components/schemas/PortfolioNativeToken" }, { "$ref": "#/components/schemas/PortfolioErc20Token" }, { "$ref": "#/components/schemas/PortfolioErc721Token" } ] }, "receiptTokenAddress": { "type": "string", "description": "Receipt token address (pool address) representing this position. This is the contract address for the position token (LP token, staking receipt, etc.), not the underlying token." }, "balance": { "type": "string", "description": "Balance in smallest unit as string integer. Use decimals to convert." }, "balanceFiat": { "type": "string", "description": "Balance in requested fiat currency. Decimal string without exponent notation or thousand separators.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "18638914.125656575" }, "priceChangePercentage1d": { "type": "string", "description": "Price change as decimal (e.g., \"-0.0431\" for -4.31%). Decimal string without exponent notation.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "-0.0431" } }, "required": [ "key", "type", "name", "tokenInfo", "balance" ] }, "AppPositionGroup": { "type": "object", "properties": { "name": { "type": "string", "description": "Group name (e.g., \"Protocol A Vesting\")" }, "items": { "type": "array", "description": "Positions in this group", "items": { "$ref": "#/components/schemas/AppPosition" } } }, "required": [ "name", "items" ] }, "AppBalanceAppInfo": { "type": "object", "properties": { "name": { "type": "string", "description": "Application name" }, "logoUrl": { "type": "string", "format": "uri", "description": "Application logo URL (HTTPS)" }, "url": { "type": "string", "format": "uri", "description": "Application URL (HTTPS)" } }, "required": [ "name" ] }, "AppBalance": { "type": "object", "properties": { "appInfo": { "description": "Application information", "allOf": [ { "$ref": "#/components/schemas/AppBalanceAppInfo" } ] }, "balanceFiat": { "type": "string", "description": "Total balance in fiat currency across all position groups. Decimal string without exponent notation or thousand separators.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "18638914.125656575" }, "groups": { "type": "array", "description": "Position groups in this app, grouped by position name", "items": { "$ref": "#/components/schemas/AppPositionGroup" } } }, "required": [ "appInfo", "balanceFiat", "groups" ] }, "Portfolio": { "type": "object", "properties": { "totalBalanceFiat": { "type": "string", "description": "Total balance in fiat currency across all tokens and positions. Decimal string without exponent notation or thousand separators.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "954181237.094243" }, "totalTokenBalanceFiat": { "type": "string", "description": "Total balance in fiat currency for all token holdings. Decimal string without exponent notation or thousand separators.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "935542322.9685864" }, "totalPositionsBalanceFiat": { "type": "string", "description": "Total balance in fiat currency for all app positions. Decimal string without exponent notation or thousand separators.", "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$", "example": "18638914.125656575" }, "tokenBalances": { "description": "List of token balances", "type": "array", "items": { "$ref": "#/components/schemas/TokenBalance" } }, "positionBalances": { "description": "List of app balances", "type": "array", "items": { "$ref": "#/components/schemas/AppBalance" } } }, "required": [ "totalBalanceFiat", "totalTokenBalanceFiat", "totalPositionsBalanceFiat", "tokenBalances", "positionBalances" ] }, "GasPriceOracle": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "oracle" ] }, "gasParameter": { "type": "string" }, "gweiFactor": { "type": "string" }, "uri": { "type": "string" } }, "required": [ "type", "gasParameter", "gweiFactor", "uri" ] }, "GasPriceFixed": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "fixed" ] }, "weiValue": { "type": "string" } }, "required": [ "type", "weiValue" ] }, "GasPriceFixedEIP1559": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "fixed1559" ] }, "maxFeePerGas": { "type": "string" }, "maxPriorityFeePerGas": { "type": "string" } }, "required": [ "type", "maxFeePerGas", "maxPriorityFeePerGas" ] }, "NativeCurrency": { "type": "object", "properties": { "decimals": { "type": "number" }, "logoUri": { "type": "string" }, "name": { "type": "string" }, "symbol": { "type": "string" } }, "required": [ "decimals", "logoUri", "name", "symbol" ] }, "BlockExplorerUriTemplate": { "type": "object", "properties": { "address": { "type": "string" }, "api": { "type": "string" }, "txHash": { "type": "string" } }, "required": [ "address", "api", "txHash" ] }, "BalancesProvider": { "type": "object", "properties": { "chainName": { "type": "string", "nullable": true }, "enabled": { "type": "boolean" } }, "required": [ "chainName", "enabled" ] }, "RpcUri": { "type": "object", "properties": { "authentication": { "type": "string", "enum": [ "API_KEY_PATH", "NO_AUTHENTICATION", "UNKNOWN" ] }, "value": { "type": "string" } }, "required": [ "authentication", "value" ] }, "Theme": { "type": "object", "properties": { "backgroundColor": { "type": "string" }, "textColor": { "type": "string" } }, "required": [ "backgroundColor", "textColor" ] }, "Chain": { "type": "object", "properties": { "chainId": { "type": "string" }, "chainName": { "type": "string" }, "description": { "type": "string" }, "chainLogoUri": { "type": "string", "nullable": true }, "l2": { "type": "boolean" }, "isTestnet": { "type": "boolean" }, "zk": { "type": "boolean" }, "nativeCurrency": { "$ref": "#/components/schemas/NativeCurrency" }, "transactionService": { "type": "string" }, "blockExplorerUriTemplate": { "$ref": "#/components/schemas/BlockExplorerUriTemplate" }, "beaconChainExplorerUriTemplate": { "type": "object" }, "disabledWallets": { "type": "array", "items": { "type": "string" } }, "ensRegistryAddress": { "type": "string", "nullable": true }, "balancesProvider": { "$ref": "#/components/schemas/BalancesProvider" }, "features": { "type": "array", "items": { "type": "string" } }, "gasPrice": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/GasPriceOracle" }, { "$ref": "#/components/schemas/GasPriceFixed" }, { "$ref": "#/components/schemas/GasPriceFixedEIP1559" } ] } }, "publicRpcUri": { "$ref": "#/components/schemas/RpcUri" }, "rpcUri": { "$ref": "#/components/schemas/RpcUri" }, "safeAppsRpcUri": { "$ref": "#/components/schemas/RpcUri" }, "shortName": { "type": "string" }, "theme": { "$ref": "#/components/schemas/Theme" }, "recommendedMasterCopyVersion": { "type": "string", "nullable": true } }, "required": [ "chainId", "chainName", "description", "l2", "isTestnet", "zk", "nativeCurrency", "transactionService", "blockExplorerUriTemplate", "beaconChainExplorerUriTemplate", "disabledWallets", "balancesProvider", "features", "gasPrice", "publicRpcUri", "rpcUri", "safeAppsRpcUri", "shortName", "theme" ] }, "ChainPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/Chain" } } }, "required": [ "results" ] }, "AboutChain": { "type": "object", "properties": { "transactionServiceBaseUri": { "type": "string" }, "name": { "type": "string" }, "version": { "type": "string" }, "buildNumber": { "type": "string" } }, "required": [ "transactionServiceBaseUri", "name", "version", "buildNumber" ] }, "Backbone": { "type": "object", "properties": { "api_version": { "type": "string" }, "headers": { "type": "string", "nullable": true }, "host": { "type": "string" }, "name": { "type": "string" }, "secure": { "type": "boolean" }, "settings": { "type": "object", "nullable": true }, "version": { "type": "string" } }, "required": [ "api_version", "host", "name", "secure", "settings", "version" ] }, "MasterCopy": { "type": "object", "properties": { "address": { "type": "string" }, "version": { "type": "string" } }, "required": [ "address", "version" ] }, "IndexingStatus": { "type": "object", "properties": { "currentBlockNumber": { "type": "number" }, "currentBlockTimestamp": { "format": "date-time", "type": "string" }, "erc20BlockNumber": { "type": "number" }, "erc20BlockTimestamp": { "format": "date-time", "type": "string" }, "erc20Synced": { "type": "boolean" }, "masterCopiesBlockNumber": { "type": "number" }, "masterCopiesBlockTimestamp": { "format": "date-time", "type": "string" }, "masterCopiesSynced": { "type": "boolean" }, "synced": { "type": "boolean" }, "lastSync": { "type": "number" } }, "required": [ "currentBlockNumber", "currentBlockTimestamp", "erc20BlockNumber", "erc20BlockTimestamp", "erc20Synced", "masterCopiesBlockNumber", "masterCopiesBlockTimestamp", "masterCopiesSynced", "synced", "lastSync" ] }, "GasPriceResult": { "type": "object", "properties": { "LastBlock": { "type": "string", "description": "Last block number", "example": "23467872" }, "SafeGasPrice": { "type": "string", "description": "Safe gas price recommendation (Gwei)", "example": "0.496839934" }, "ProposeGasPrice": { "type": "string", "description": "Proposed gas price (Gwei)", "example": "0.496840168" }, "FastGasPrice": { "type": "string", "description": "Fast gas price recommendation (Gwei)", "example": "0.55411917" }, "suggestBaseFee": { "type": "string", "description": "Base fee of the next pending block (Gwei)", "example": "0.496839934" }, "gasUsedRatio": { "type": "string", "description": "Gas used ratio to estimate network congestion", "example": "0.5,0.6,0.7" } }, "required": [ "LastBlock", "SafeGasPrice", "ProposeGasPrice", "FastGasPrice", "suggestBaseFee", "gasUsedRatio" ] }, "GasPriceResponse": { "type": "object", "properties": { "status": { "type": "string", "description": "Status code (\"1\" = success)", "example": "1" }, "message": { "type": "string", "description": "Response message", "example": "OK" }, "result": { "description": "Gas price data", "allOf": [ { "$ref": "#/components/schemas/GasPriceResult" } ] } }, "required": [ "status", "message", "result" ] }, "Collectible": { "type": "object", "properties": { "address": { "type": "string" }, "tokenName": { "type": "string" }, "tokenSymbol": { "type": "string" }, "logoUri": { "type": "string" }, "id": { "type": "string" }, "uri": { "type": "string", "nullable": true }, "name": { "type": "string", "nullable": true }, "description": { "type": "string", "nullable": true }, "imageUri": { "type": "string", "nullable": true }, "metadata": { "type": "object", "nullable": true } }, "required": [ "address", "tokenName", "tokenSymbol", "logoUri", "id" ] }, "CollectiblePage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/Collectible" } } }, "required": [ "results" ] }, "ActivityMetadata": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "maxPoints": { "type": "number" } }, "required": [ "name", "description", "maxPoints" ] }, "Campaign": { "type": "object", "properties": { "resourceId": { "type": "string" }, "name": { "type": "string" }, "description": { "type": "string" }, "startDate": { "type": "string" }, "endDate": { "type": "string" }, "lastUpdated": { "type": "string", "nullable": true }, "activitiesMetadata": { "nullable": true, "type": "array", "items": { "$ref": "#/components/schemas/ActivityMetadata" } }, "rewardValue": { "type": "string", "nullable": true }, "rewardText": { "type": "string", "nullable": true }, "iconUrl": { "type": "string", "nullable": true }, "safeAppUrl": { "type": "string", "nullable": true }, "partnerUrl": { "type": "string", "nullable": true }, "isPromoted": { "type": "boolean" } }, "required": [ "resourceId", "name", "description", "startDate", "endDate", "isPromoted" ] }, "CampaignPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/Campaign" } } }, "required": [ "results" ] }, "CampaignRank": { "type": "object", "properties": { "holder": { "type": "string" }, "position": { "type": "number" }, "boost": { "type": "number" }, "totalPoints": { "type": "number" }, "totalBoostedPoints": { "type": "number" } }, "required": [ "holder", "position", "boost", "totalPoints", "totalBoostedPoints" ] }, "CampaignRankPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/CampaignRank" } } }, "required": [ "results" ] }, "EligibilityRequest": { "type": "object", "properties": { "requestId": { "type": "string" }, "sealedData": { "type": "string" } }, "required": [ "requestId", "sealedData" ] }, "Eligibility": { "type": "object", "properties": { "requestId": { "type": "string" }, "isAllowed": { "type": "boolean" }, "isVpn": { "type": "boolean" } }, "required": [ "requestId", "isAllowed", "isVpn" ] }, "LockingRank": { "type": "object", "properties": { "holder": { "type": "string" }, "position": { "type": "number" }, "lockedAmount": { "type": "string" }, "unlockedAmount": { "type": "string" }, "withdrawnAmount": { "type": "string" } }, "required": [ "holder", "position", "lockedAmount", "unlockedAmount", "withdrawnAmount" ] }, "LockingRankPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/LockingRank" } } }, "required": [ "results" ] }, "LockEventItem": { "type": "object", "properties": { "eventType": { "type": "string", "enum": [ "LOCKED" ] }, "executionDate": { "type": "string" }, "transactionHash": { "type": "string" }, "holder": { "type": "string" }, "amount": { "type": "string" }, "logIndex": { "type": "string" } }, "required": [ "eventType", "executionDate", "transactionHash", "holder", "amount", "logIndex" ] }, "UnlockEventItem": { "type": "object", "properties": { "eventType": { "type": "string", "enum": [ "UNLOCKED" ] }, "executionDate": { "type": "string" }, "transactionHash": { "type": "string" }, "holder": { "type": "string" }, "amount": { "type": "string" }, "logIndex": { "type": "string" }, "unlockIndex": { "type": "string" } }, "required": [ "eventType", "executionDate", "transactionHash", "holder", "amount", "logIndex", "unlockIndex" ] }, "WithdrawEventItem": { "type": "object", "properties": { "eventType": { "type": "string", "enum": [ "WITHDRAWN" ] }, "executionDate": { "type": "string" }, "transactionHash": { "type": "string" }, "holder": { "type": "string" }, "amount": { "type": "string" }, "logIndex": { "type": "string" }, "unlockIndex": { "type": "string" } }, "required": [ "eventType", "executionDate", "transactionHash", "holder", "amount", "logIndex", "unlockIndex" ] }, "LockingEventPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/LockEventItem" }, { "$ref": "#/components/schemas/UnlockEventItem" }, { "$ref": "#/components/schemas/WithdrawEventItem" } ] } } }, "required": [ "results" ] }, "Contract": { "type": "object", "properties": { "address": { "type": "string" }, "name": { "type": "string" }, "displayName": { "type": "string" }, "logoUri": { "type": "string" }, "contractAbi": { "type": "object", "nullable": true }, "trustedForDelegateCall": { "type": "boolean" } }, "required": [ "address", "name", "displayName", "logoUri", "trustedForDelegateCall" ] }, "TransactionDataDto": { "type": "object", "properties": { "data": { "type": "string", "description": "Hexadecimal value" }, "to": { "type": "string", "description": "The target Ethereum address" } }, "required": [ "data" ] }, "Operation": { "type": "number", "enum": [ 0, 1 ], "description": "Operation type: 0 for CALL, 1 for DELEGATE" }, "BaseDataDecoded": { "type": "object", "properties": { "method": { "type": "string" }, "parameters": { "type": "array", "items": { "$ref": "#/components/schemas/DataDecodedParameter" } } }, "required": [ "method" ] }, "MultiSend": { "type": "object", "properties": { "operation": { "description": "Operation type: 0 for CALL, 1 for DELEGATE", "allOf": [ { "$ref": "#/components/schemas/Operation" } ] }, "value": { "type": "string" }, "dataDecoded": { "$ref": "#/components/schemas/BaseDataDecoded" }, "to": { "type": "string" }, "data": { "type": "string", "nullable": true, "description": "Hexadecimal encoded data", "pattern": "^0x[0-9a-fA-F]*$" } }, "required": [ "operation", "value", "to", "data" ] }, "DataDecodedParameter": { "type": "object", "properties": { "name": { "type": "string" }, "type": { "type": "string" }, "value": { "description": "Parameter value - typically a string, but may be an array of strings for array types (e.g., address[], uint256[])", "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ] }, "valueDecoded": { "oneOf": [ { "$ref": "#/components/schemas/BaseDataDecoded" }, { "type": "array", "items": { "$ref": "#/components/schemas/MultiSend" } }, { "type": "null" } ] } }, "required": [ "name", "type", "value" ] }, "DataDecoded": { "type": "object", "properties": { "method": { "type": "string" }, "parameters": { "nullable": true, "type": "array", "items": { "$ref": "#/components/schemas/DataDecodedParameter" } }, "accuracy": { "type": "string", "enum": [ "FULL_MATCH", "PARTIAL_MATCH", "ONLY_FUNCTION_MATCH", "NO_MATCH", "UNKNOWN" ], "default": "UNKNOWN" } }, "required": [ "method" ] }, "AddRecoveryModuleDto": { "type": "object", "properties": { "moduleAddress": { "type": "string" } }, "required": [ "moduleAddress" ] }, "GetEstimationDto": { "type": "object", "properties": { "to": { "type": "string" }, "value": { "type": "string" }, "data": { "type": "string", "nullable": true }, "operation": { "description": "Operation type: 0 for CALL, 1 for DELEGATE", "allOf": [ { "$ref": "#/components/schemas/Operation" } ] } }, "required": [ "to", "value", "operation" ] }, "EstimationResponse": { "type": "object", "properties": { "currentNonce": { "type": "number" }, "recommendedNonce": { "type": "number" }, "safeTxGas": { "type": "string" } }, "required": [ "currentNonce", "recommendedNonce", "safeTxGas" ] }, "FeePreviewTransactionDto": { "type": "object", "properties": { "to": { "type": "string" }, "value": { "type": "string" }, "data": { "type": "string" }, "operation": { "description": "Operation type: 0 for CALL, 1 for DELEGATE", "allOf": [ { "$ref": "#/components/schemas/Operation" } ] }, "gasToken": { "type": "string", "description": "Gas token address (0x0...0 for native token)", "example": "0x0000000000000000000000000000000000000000" }, "numberSignatures": { "type": "number", "description": "Number of signatures required for execution", "example": 2, "minimum": 1 }, "fiatCode": { "type": "string", "description": "Fiat currency code for relay cost conversion (e.g. EUR, GBP). Defaults to USD.", "example": "EUR" } }, "required": [ "to", "value", "data", "operation", "gasToken", "numberSignatures" ] }, "FeePreviewTxData": { "type": "object", "properties": { "chainId": { "type": "number", "description": "Chain ID", "example": 1 }, "safeAddress": { "type": "string", "description": "Safe address", "example": "0x..." }, "safeTxGas": { "type": "string", "description": "Safe transaction gas", "example": "150000" }, "baseGas": { "type": "string", "description": "Base gas for relay overhead", "example": "48564" }, "gasPrice": { "type": "string", "description": "Gas price per gas unit. Denominated in wei when `gasToken` is the native token (zero address), or in the ERC20 gas token atomic units per gas otherwise", "example": "195000000000000" }, "gasToken": { "type": "string", "description": "Gas token address", "example": "0x0000000000000000000000000000000000000000" }, "refundReceiver": { "type": "string", "description": "Refund receiver address", "example": "0x0000000000000000000000000000000000000000" }, "numberSignatures": { "type": "number", "description": "Number of signatures", "example": 2 } }, "required": [ "chainId", "safeAddress", "safeTxGas", "baseGas", "gasPrice", "gasToken", "refundReceiver", "numberSignatures" ] }, "FeePreviewRelayCost": { "type": "object", "properties": { "fiatCode": { "type": "string", "description": "Fiat currency code", "example": "USD" }, "fiatValue": { "type": "string", "description": "Relay cost as a string", "example": "0.0025" } }, "required": [ "fiatCode", "fiatValue" ] }, "PriceSource": { "type": "string", "enum": [ "COINGECKO" ], "description": "Price data source" }, "FeePreviewPricingContext": { "type": "object", "properties": { "phase": { "type": "number", "description": "Pricing phase" }, "priceSource": { "description": "Price data source", "example": "COINGECKO", "allOf": [ { "$ref": "#/components/schemas/PriceSource" } ] }, "priceTimestamp": { "type": "number", "description": "Price snapshot Unix timestamp", "example": 1700000000 }, "gasPriceVolatilityBuffer": { "type": "number", "description": "Gas price volatility buffer multiplier", "example": 1.3 } }, "required": [ "phase", "priceSource", "priceTimestamp", "gasPriceVolatilityBuffer" ] }, "FeePreviewResponse": { "type": "object", "properties": { "txData": { "$ref": "#/components/schemas/FeePreviewTxData" }, "relayCost": { "$ref": "#/components/schemas/FeePreviewRelayCost" }, "pricingContextSnapshot": { "$ref": "#/components/schemas/FeePreviewPricingContext" } }, "required": [ "txData", "relayCost", "pricingContextSnapshot" ] }, "TypedDataParameter": { "type": "object", "properties": { "name": { "type": "string" }, "type": { "type": "string" } }, "required": [ "name", "type" ] }, "TypedDataDomain": { "type": "object", "properties": { "chainId": { "type": "number" }, "name": { "type": "string" }, "salt": { "type": "string" }, "verifyingContract": { "type": "string" }, "version": { "type": "string" } } }, "TypedData": { "type": "object", "properties": { "domain": { "$ref": "#/components/schemas/TypedDataDomain" }, "primaryType": { "type": "string" }, "types": { "type": "object", "additionalProperties": { "items": { "$ref": "#/components/schemas/TypedDataParameter" }, "type": "array" } }, "message": { "type": "object", "additionalProperties": true } }, "required": [ "domain", "primaryType", "types", "message" ] }, "AddressInfo": { "type": "object", "properties": { "value": { "type": "string" }, "name": { "type": "string", "nullable": true }, "logoUri": { "type": "string", "nullable": true } }, "required": [ "value" ] }, "MessageConfirmation": { "type": "object", "properties": { "owner": { "$ref": "#/components/schemas/AddressInfo" }, "signature": { "type": "string" } }, "required": [ "owner", "signature" ] }, "Message": { "type": "object", "properties": { "messageHash": { "type": "string" }, "status": { "type": "string", "enum": [ "NEEDS_CONFIRMATION", "CONFIRMED" ] }, "logoUri": { "type": "string", "nullable": true }, "name": { "type": "string", "nullable": true }, "message": { "oneOf": [ { "type": "string" }, { "$ref": "#/components/schemas/TypedData" } ] }, "creationTimestamp": { "type": "number" }, "modifiedTimestamp": { "type": "number" }, "confirmationsSubmitted": { "type": "number" }, "confirmationsRequired": { "type": "number" }, "proposedBy": { "$ref": "#/components/schemas/AddressInfo" }, "confirmations": { "type": "array", "items": { "$ref": "#/components/schemas/MessageConfirmation" } }, "preparedSignature": { "type": "string", "nullable": true }, "origin": { "type": "string", "nullable": true } }, "required": [ "messageHash", "status", "message", "creationTimestamp", "modifiedTimestamp", "confirmationsSubmitted", "confirmationsRequired", "proposedBy", "confirmations" ] }, "MessageItem": { "type": "object", "properties": { "messageHash": { "type": "string" }, "status": { "type": "string", "enum": [ "NEEDS_CONFIRMATION", "CONFIRMED" ] }, "logoUri": { "type": "string", "nullable": true }, "name": { "type": "string", "nullable": true }, "message": { "oneOf": [ { "type": "string" }, { "$ref": "#/components/schemas/TypedData" } ] }, "creationTimestamp": { "type": "number" }, "modifiedTimestamp": { "type": "number" }, "confirmationsSubmitted": { "type": "number" }, "confirmationsRequired": { "type": "number" }, "proposedBy": { "$ref": "#/components/schemas/AddressInfo" }, "confirmations": { "type": "array", "items": { "$ref": "#/components/schemas/MessageConfirmation" } }, "preparedSignature": { "type": "string", "nullable": true }, "origin": { "type": "string", "nullable": true }, "type": { "type": "string", "enum": [ "MESSAGE" ] } }, "required": [ "messageHash", "status", "message", "creationTimestamp", "modifiedTimestamp", "confirmationsSubmitted", "confirmationsRequired", "proposedBy", "confirmations", "type" ] }, "DateLabel": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "DATE_LABEL" ] }, "timestamp": { "type": "number" } }, "required": [ "type", "timestamp" ] }, "MessagePage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/MessageItem" }, { "$ref": "#/components/schemas/DateLabel" } ] } } }, "required": [ "results" ] }, "CreateMessageDto": { "type": "object", "properties": { "message": { "oneOf": [ { "type": "string" }, { "$ref": "#/components/schemas/TypedData" } ] }, "safeAppId": { "type": "number", "nullable": true, "deprecated": true }, "signature": { "type": "string" }, "origin": { "type": "string", "nullable": true } }, "required": [ "message", "signature" ] }, "UpdateMessageSignatureDto": { "type": "object", "properties": { "signature": { "type": "string" } }, "required": [ "signature" ] }, "UserWallet": { "type": "object", "properties": { "id": { "type": "number" }, "address": { "type": "string" } }, "required": [ "id", "address" ] }, "UserWithWallets": { "type": "object", "properties": { "id": { "type": "number" }, "status": { "type": "number", "enum": [ 0, 1 ] }, "wallets": { "type": "array", "items": { "$ref": "#/components/schemas/UserWallet" } } }, "required": [ "id", "status", "wallets" ] }, "CreatedUserWithWallet": { "type": "object", "properties": { "id": { "type": "number" } }, "required": [ "id" ] }, "WalletAddedToUser": { "type": "object", "properties": { "id": { "type": "number" } }, "required": [ "id" ] }, "SpaceAddressBookItemDto": { "type": "object", "properties": { "name": { "type": "string" }, "address": { "type": "string" }, "chainIds": { "type": "array", "items": { "type": "string" } }, "createdBy": { "type": "string", "description": "Email or wallet address of the creator, \"Unknown user\" if the user has no display identity, or \"Deleted user\"" }, "createdByUserId": { "type": "number", "description": "User ID of the creator" }, "lastUpdatedBy": { "type": "string", "description": "Email or wallet address of the last editor, \"Unknown user\" if the user has no display identity, or \"Deleted user\"" }, "lastUpdatedByUserId": { "type": "number", "description": "User ID of the last editor" }, "createdAt": { "format": "date-time", "type": "string" }, "updatedAt": { "format": "date-time", "type": "string" } }, "required": [ "name", "address", "chainIds", "createdBy", "createdByUserId", "lastUpdatedBy", "lastUpdatedByUserId", "createdAt", "updatedAt" ] }, "SpaceAddressBookDto": { "type": "object", "properties": { "spaceId": { "type": "string" }, "data": { "type": "array", "items": { "$ref": "#/components/schemas/SpaceAddressBookItemDto" } } }, "required": [ "spaceId", "data" ] }, "AddressBookItem": { "type": "object", "properties": { "name": { "type": "string" }, "address": { "type": "string" }, "chainIds": { "type": "array", "items": { "type": "string" } } }, "required": [ "name", "address", "chainIds" ] }, "UpsertAddressBookItemsDto": { "type": "object", "properties": { "items": { "type": "array", "items": { "$ref": "#/components/schemas/AddressBookItem" } } }, "required": [ "items" ] }, "UserAddressBookItemDto": { "type": "object", "properties": { "name": { "type": "string" }, "address": { "type": "string" }, "chainIds": { "type": "array", "items": { "type": "string" } }, "createdBy": { "type": "string" }, "createdAt": { "type": "object" }, "updatedAt": { "type": "object" } }, "required": [ "name", "address", "chainIds", "createdBy", "createdAt", "updatedAt" ] }, "UserAddressBookDto": { "type": "object", "properties": { "spaceId": { "type": "string" }, "data": { "type": "array", "items": { "$ref": "#/components/schemas/UserAddressBookItemDto" } } }, "required": [ "spaceId", "data" ] }, "AddressBookRequestItemDto": { "type": "object", "properties": { "id": { "type": "number" }, "name": { "type": "string" }, "address": { "type": "string" }, "chainIds": { "type": "array", "items": { "type": "string" } }, "requestedBy": { "type": "string" }, "status": { "type": "string", "enum": [ "PENDING", "APPROVED", "REJECTED" ] }, "createdAt": { "format": "date-time", "type": "string" }, "updatedAt": { "format": "date-time", "type": "string" } }, "required": [ "id", "name", "address", "chainIds", "requestedBy", "status", "createdAt", "updatedAt" ] }, "AddressBookRequestsDto": { "type": "object", "properties": { "spaceId": { "type": "string" }, "data": { "type": "array", "items": { "$ref": "#/components/schemas/AddressBookRequestItemDto" } } }, "required": [ "spaceId", "data" ] }, "CreateAddressBookRequestDto": { "type": "object", "properties": { "address": { "type": "string", "description": "Address of the private contact to request adding to space" } }, "required": [ "address" ] }, "CreateSpaceDto": { "type": "object", "properties": { "name": { "type": "string" } }, "required": [ "name" ] }, "CreateSpaceResponse": { "type": "object", "properties": { "name": { "type": "string" }, "id": { "type": "number" } }, "required": [ "name", "id" ] }, "UserDto": { "type": "object", "properties": { "id": { "type": "number" } }, "required": [ "id" ] }, "SpaceMemberDto": { "type": "object", "properties": { "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] }, "name": { "type": "string" }, "invitedBy": { "type": "string" }, "status": { "type": "string", "enum": [ "INVITED", "ACTIVE", "DECLINED" ] }, "user": { "$ref": "#/components/schemas/UserDto" } }, "required": [ "role", "name", "invitedBy", "status", "user" ] }, "GetSpaceResponse": { "type": "object", "properties": { "id": { "type": "number" }, "name": { "type": "string" }, "members": { "type": "array", "items": { "$ref": "#/components/schemas/SpaceMemberDto" } }, "safeCount": { "type": "number", "description": "Total count of Safes in the space", "example": 5 } }, "required": [ "id", "name", "members", "safeCount" ] }, "UpdateSpaceDto": { "type": "object", "properties": { "name": { "type": "string" }, "status": { "type": "string", "enum": [ "ACTIVE" ] } } }, "UpdateSpaceResponse": { "type": "object", "properties": { "id": { "type": "number" } }, "required": [ "id" ] }, "SpaceSafeDto": { "type": "object", "properties": { "chainId": { "type": "string" }, "address": { "type": "string" } }, "required": [ "chainId", "address" ] }, "CreateSpaceSafesDto": { "type": "object", "properties": { "safes": { "type": "array", "items": { "$ref": "#/components/schemas/SpaceSafeDto" } } }, "required": [ "safes" ] }, "GetSpaceSafeResponse": { "type": "object", "properties": { "safes": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } }, "example": { "{chainId}": [ "0x..." ] } } }, "required": [ "safes" ] }, "DeleteSpaceSafesDto": { "type": "object", "properties": { "safes": { "type": "array", "items": { "$ref": "#/components/schemas/SpaceSafeDto" } } }, "required": [ "safes" ] }, "InviteUserDto": { "type": "object", "properties": { "address": { "type": "string" }, "name": { "type": "string", "minLength": 3, "maxLength": 30 }, "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] } }, "required": [ "address", "name", "role" ] }, "InviteUsersDto": { "type": "object", "properties": { "users": { "type": "array", "items": { "$ref": "#/components/schemas/InviteUserDto" } } }, "required": [ "users" ] }, "Invitation": { "type": "object", "properties": { "userId": { "type": "number" }, "name": { "type": "string" }, "spaceId": { "type": "number" }, "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] }, "status": { "type": "string", "enum": [ "INVITED", "ACTIVE", "DECLINED" ] }, "invitedBy": { "type": "string", "nullable": true } }, "required": [ "userId", "name", "spaceId", "role", "status" ] }, "AcceptInviteDto": { "type": "object", "properties": { "name": { "type": "string", "minLength": 3, "maxLength": 30 } }, "required": [ "name" ] }, "MemberUser": { "type": "object", "properties": { "id": { "type": "number" }, "status": { "type": "string", "enum": [ "PENDING", "ACTIVE" ] }, "email": { "type": "string", "nullable": true } }, "required": [ "id", "status", "email" ] }, "MemberDto": { "type": "object", "properties": { "id": { "type": "number" }, "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] }, "status": { "type": "string", "enum": [ "INVITED", "ACTIVE", "DECLINED" ] }, "name": { "type": "string" }, "alias": { "type": "string", "nullable": true }, "invitedBy": { "type": "string", "nullable": true }, "createdAt": { "format": "date-time", "type": "string" }, "updatedAt": { "format": "date-time", "type": "string" }, "user": { "$ref": "#/components/schemas/MemberUser" } }, "required": [ "id", "role", "status", "name", "createdAt", "updatedAt", "user" ] }, "MembersDto": { "type": "object", "properties": { "members": { "type": "array", "items": { "$ref": "#/components/schemas/MemberDto" } } }, "required": [ "members" ] }, "UpdateRoleDto": { "type": "object", "properties": { "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] } }, "required": [ "role" ] }, "UpdateMemberAliasDto": { "type": "object", "properties": { "alias": { "type": "string", "description": "The new alias for the member" } }, "required": [ "alias" ] }, "CounterfactualSafeDto": { "type": "object", "properties": { "chainId": { "type": "string" }, "address": { "type": "string" }, "factoryAddress": { "type": "string" }, "masterCopy": { "type": "string" }, "saltNonce": { "type": "string" }, "safeVersion": { "type": "string" }, "threshold": { "type": "number" }, "owners": { "type": "array", "items": { "type": "string" } }, "fallbackHandler": { "type": "string", "nullable": true }, "to": { "type": "string", "nullable": true }, "data": { "type": "string" }, "paymentToken": { "type": "string", "nullable": true }, "payment": { "type": "string", "nullable": true }, "paymentReceiver": { "type": "string", "nullable": true } }, "required": [ "chainId", "address", "factoryAddress", "masterCopy", "saltNonce", "safeVersion", "threshold", "owners", "data" ] }, "CreateCounterfactualSafesDto": { "type": "object", "properties": { "safes": { "type": "array", "items": { "$ref": "#/components/schemas/CounterfactualSafeDto" } } }, "required": [ "safes" ] }, "GetCounterfactualSafeItem": { "type": "object", "properties": { "address": { "type": "string" }, "factoryAddress": { "type": "string" }, "masterCopy": { "type": "string" }, "saltNonce": { "type": "string" }, "safeVersion": { "type": "string" }, "threshold": { "type": "number" }, "owners": { "type": "array", "items": { "type": "string" } }, "fallbackHandler": { "type": "string", "nullable": true }, "to": { "type": "string", "nullable": true }, "data": { "type": "string" }, "paymentToken": { "type": "string", "nullable": true }, "payment": { "type": "string", "nullable": true }, "paymentReceiver": { "type": "string", "nullable": true } }, "required": [ "address", "factoryAddress", "masterCopy", "saltNonce", "safeVersion", "threshold", "owners", "fallbackHandler", "to", "data", "paymentToken", "payment", "paymentReceiver" ] }, "GetCounterfactualSafesResponse": { "type": "object", "properties": { "safes": { "type": "object", "additionalProperties": { "type": "array", "items": { "$ref": "#/components/schemas/GetCounterfactualSafeItem" } }, "example": { "{chainId}": [ { "address": "0x...", "factoryAddress": "0x...", "masterCopy": "0x...", "saltNonce": "1712000000000", "safeVersion": "1.4.1", "threshold": 1, "owners": [ "0x..." ], "fallbackHandler": "0x...", "to": null, "data": "0x...", "paymentToken": null, "payment": null, "paymentReceiver": null } ] } } }, "required": [ "safes" ] }, "DeleteCounterfactualSafeDto": { "type": "object", "properties": { "chainId": { "type": "string" }, "address": { "type": "string" } }, "required": [ "chainId", "address" ] }, "DeleteCounterfactualSafesDto": { "type": "object", "properties": { "safes": { "type": "array", "items": { "$ref": "#/components/schemas/DeleteCounterfactualSafeDto" } } }, "required": [ "safes" ] }, "SafeList": { "type": "object", "properties": { "safes": { "type": "array", "items": { "type": "string" } } }, "required": [ "safes" ] }, "RelayDto": { "type": "object", "properties": { "version": { "type": "string" }, "to": { "type": "string" }, "data": { "type": "string" }, "gasLimit": { "type": "string", "nullable": true, "description": "Accepted for backward compatibility and validation; not forwarded to the relay provider (Gelato)." }, "safeTxHash": { "type": "string", "description": "Safe transaction hash for relay-fee eligibility check" } }, "required": [ "version", "to", "data" ] }, "Relay": { "type": "object", "properties": { "taskId": { "type": "string" } }, "required": [ "taskId" ] }, "RelayTaskStatusReceipt": { "type": "object", "properties": { "transactionHash": { "type": "string", "example": "0x4e4bb4493b2183061c3a0106ea96604edcc84f83313dbc0ab718abb1523d1042" } }, "required": [ "transactionHash" ] }, "RelayTaskStatus": { "type": "object", "properties": { "status": { "type": "number", "description": "Relay task status code: 100=Pending, 110=Submitted, 200=Included, 400=Rejected, 500=Reverted", "enum": [ 100, 110, 200, 400, 500 ], "example": 200 }, "receipt": { "description": "On-chain receipt. Only present when status is 200 (Included) or 500 (Reverted)", "allOf": [ { "$ref": "#/components/schemas/RelayTaskStatusReceipt" } ] } }, "required": [ "status" ] }, "RelaysRemaining": { "type": "object", "properties": { "remaining": { "type": "number" }, "limit": { "type": "number" } }, "required": [ "remaining", "limit" ] }, "SafeAppProvider": { "type": "object", "properties": { "url": { "type": "string" }, "name": { "type": "string" } }, "required": [ "url", "name" ] }, "SafeAppAccessControl": { "type": "object", "properties": { "type": { "type": "string" }, "value": { "nullable": true, "type": "array", "items": { "type": "string" } } }, "required": [ "type" ] }, "SafeAppSocialProfile": { "type": "object", "properties": { "platform": { "type": "string", "enum": [ "DISCORD", "GITHUB", "TWITTER", "TELEGRAM", "UNKNOWN" ] }, "url": { "type": "string" } }, "required": [ "platform", "url" ] }, "SafeApp": { "type": "object", "properties": { "id": { "type": "number" }, "url": { "type": "string" }, "name": { "type": "string" }, "iconUrl": { "type": "string", "nullable": true }, "description": { "type": "string" }, "chainIds": { "type": "array", "items": { "type": "string" } }, "provider": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/SafeAppProvider" } ] }, "accessControl": { "$ref": "#/components/schemas/SafeAppAccessControl" }, "tags": { "type": "array", "items": { "type": "string" } }, "features": { "type": "array", "items": { "type": "string" } }, "developerWebsite": { "type": "string", "nullable": true }, "socialProfiles": { "type": "array", "items": { "$ref": "#/components/schemas/SafeAppSocialProfile" } }, "featured": { "type": "boolean" } }, "required": [ "id", "url", "name", "description", "chainIds", "accessControl", "tags", "features", "socialProfiles", "featured" ] }, "SafeState": { "type": "object", "properties": { "address": { "$ref": "#/components/schemas/AddressInfo" }, "chainId": { "type": "string" }, "nonce": { "type": "number" }, "threshold": { "type": "number" }, "owners": { "type": "array", "items": { "$ref": "#/components/schemas/AddressInfo" } }, "implementation": { "$ref": "#/components/schemas/AddressInfo" }, "modules": { "nullable": true, "type": "array", "items": { "$ref": "#/components/schemas/AddressInfo" } }, "fallbackHandler": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/AddressInfo" } ] }, "guard": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/AddressInfo" } ] }, "version": { "type": "string", "nullable": true }, "implementationVersionState": { "type": "string", "enum": [ "UP_TO_DATE", "OUTDATED", "UNKNOWN" ] }, "collectiblesTag": { "type": "string", "nullable": true }, "txQueuedTag": { "type": "string", "nullable": true }, "txHistoryTag": { "type": "string", "nullable": true }, "messagesTag": { "type": "string", "nullable": true } }, "required": [ "address", "chainId", "nonce", "threshold", "owners", "implementation", "implementationVersionState" ] }, "SafeNonces": { "type": "object", "properties": { "currentNonce": { "type": "number" }, "recommendedNonce": { "type": "number" } }, "required": [ "currentNonce", "recommendedNonce" ] }, "SafeOverview": { "type": "object", "properties": { "address": { "$ref": "#/components/schemas/AddressInfo" }, "chainId": { "type": "string" }, "threshold": { "type": "number" }, "owners": { "type": "array", "items": { "$ref": "#/components/schemas/AddressInfo" } }, "fiatTotal": { "type": "string" }, "queued": { "type": "number" }, "awaitingConfirmation": { "type": "number", "nullable": true } }, "required": [ "address", "chainId", "threshold", "owners", "fiatTotal", "queued" ] }, "SingleRecipientAnalysisResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Recipient interaction status code", "enum": [ "NEW_RECIPIENT", "RECURRING_RECIPIENT", "LOW_ACTIVITY", "FAILED" ], "example": "NEW_RECIPIENT" }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" } }, "required": [ "severity", "type", "title", "description" ] }, "SingleRecipientAnalysisDto": { "type": "object", "properties": { "RECIPIENT_INTERACTION": { "description": "Analysis results related to recipient interaction history. Shows whether this is a new or recurring recipient.", "example": [ { "severity": "INFO", "type": "NEW_RECIPIENT", "title": "New recipient", "description": "This is the first time you are interacting with this recipient." } ], "type": "array", "items": { "$ref": "#/components/schemas/SingleRecipientAnalysisResultDto" } }, "RECIPIENT_ACTIVITY": { "description": "Analysis results related to recipient activity. Shows whether this is a low activity recipient. (Available only for Safes)", "example": [ { "severity": "WARN", "type": "LOW_ACTIVITY", "title": "Low activity recipient", "description": "This address has few transactions." } ], "type": "array", "items": { "$ref": "#/components/schemas/SingleRecipientAnalysisResultDto" } }, "isSafe": { "type": "boolean", "description": "Indicates whether the analyzed recipient address is a Safe.", "example": false } }, "required": [ "RECIPIENT_INTERACTION", "isSafe" ] }, "CounterpartyAnalysisRequestDto": { "type": "object", "properties": { "to": { "type": "string", "description": "Recipient address of the transaction." }, "value": { "type": "string", "description": "Amount to send with the transaction." }, "data": { "type": "string", "description": "Hex-encoded data payload for the transaction." }, "operation": { "type": "number", "enum": [ 0, 1 ], "description": "Operation type: 0 for CALL, 1 for DELEGATECALL." } }, "required": [ "to", "value", "data", "operation" ] }, "RecipientResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Bridge compatibility status code", "enum": [ "NEW_RECIPIENT", "RECURRING_RECIPIENT", "LOW_ACTIVITY", "INCOMPATIBLE_SAFE", "MISSING_OWNERSHIP", "UNSUPPORTED_NETWORK", "DIFFERENT_SAFE_SETUP", "FAILED" ], "example": "MISSING_OWNERSHIP" }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" }, "targetChainId": { "type": "string", "description": "Target chain ID for bridge operations. Only present for BridgeStatus." } }, "required": [ "severity", "type", "title", "description" ] }, "RecipientAnalysisDto": { "type": "object", "properties": { "isSafe": { "type": "boolean", "description": "Indicates whether the analyzed recipient address is a Safe.", "example": true }, "RECIPIENT_INTERACTION": { "description": "Analysis results related to recipient interaction history. Shows whether this is a new or recurring recipient.", "example": [ { "severity": "INFO", "type": "NEW_RECIPIENT", "title": "New recipient", "description": "This is the first time you are interacting with this recipient." } ], "type": "array", "items": { "$ref": "#/components/schemas/RecipientResultDto" } }, "RECIPIENT_ACTIVITY": { "description": "Analysis results related to recipient activity frequency. Shows whether this is a low activity recipient.", "example": [ { "severity": "WARN", "type": "LOW_ACTIVITY", "title": "Low activity recipient", "description": "This address has few transactions." } ], "type": "array", "items": { "$ref": "#/components/schemas/RecipientResultDto" } }, "BRIDGE": { "description": "Analysis results for cross-chain bridge operations. Identifies compatibility issues, ownership problems, or unsupported networks.", "example": [ { "severity": "WARN", "type": "MISSING_OWNERSHIP", "title": "No ownership on target chain", "description": "You do not have ownership of a Safe on the target chain.", "targetChainId": "137" } ], "type": "array", "items": { "$ref": "#/components/schemas/RecipientResultDto" } } }, "required": [ "isSafe" ] }, "ContractAnalysisResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Contract verification status code", "enum": [ "VERIFIED", "NOT_VERIFIED", "NOT_VERIFIED_BY_SAFE", "VERIFICATION_UNAVAILABLE", "NEW_CONTRACT", "KNOWN_CONTRACT", "UNEXPECTED_DELEGATECALL", "UNOFFICIAL_FALLBACK_HANDLER", "FAILED" ], "example": "VERIFIED" }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" } }, "required": [ "severity", "type", "title", "description" ] }, "FallbackHandlerInfoDto": { "type": "object", "properties": { "address": { "type": "string", "description": "Address of the fallback handler contract" }, "name": { "type": "string", "description": "Name of the fallback handler contract" }, "logoUrl": { "type": "string", "description": "Logo URL for the fallback handler contract" } }, "required": [ "address" ] }, "FallbackHandlerAnalysisResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Status code for unofficial fallback handler", "enum": [ "UNOFFICIAL_FALLBACK_HANDLER" ], "example": "VERIFIED" }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" }, "fallbackHandler": { "description": "Information about the fallback handler", "allOf": [ { "$ref": "#/components/schemas/FallbackHandlerInfoDto" } ] } }, "required": [ "severity", "type", "title", "description" ] }, "ContractAnalysisDto": { "type": "object", "properties": { "logoUrl": { "type": "string", "description": "Logo URL for the contract", "example": "https://example.com/logo.png" }, "name": { "type": "string", "description": "Name of the contract", "example": "Uniswap V3 Router" }, "CONTRACT_VERIFICATION": { "description": "Analysis results for contract verification status. Shows whether contracts are verified and source code is available.", "example": [ { "severity": "INFO", "type": "VERIFIED", "title": "Verified contract", "description": "This contract has been verified and its source code is available" } ], "type": "array", "items": { "$ref": "#/components/schemas/ContractAnalysisResultDto" } }, "CONTRACT_INTERACTION": { "description": "Analysis results related to contract interaction history. Shows whether this is a new or previously interacted contract.", "example": [ { "severity": "INFO", "type": "NEW_CONTRACT", "title": "New contract", "description": "This is the first time you are interacting with this contract" } ], "type": "array", "items": { "$ref": "#/components/schemas/ContractAnalysisResultDto" } }, "DELEGATECALL": { "description": "Analysis results for delegatecall operations. Identifies unexpected or potentially dangerous delegate calls.", "example": [ { "severity": "CRITICAL", "type": "UNEXPECTED_DELEGATECALL", "title": "Unexpected delegatecall", "description": "An unexpected delegatecall operation was detected that could be dangerous" } ], "type": "array", "items": { "$ref": "#/components/schemas/ContractAnalysisResultDto" } }, "FALLBACK_HANDLER": { "description": "Analysis results for setFallbackHandler operations. Identifies untrusted or unofficial fallback handlers in the transactions.", "example": [ { "severity": "WARN", "type": "UNOFFICIAL_FALLBACK_HANDLER", "title": "Unofficial fallback handler", "description": "Verify the fallback handler is trusted and secure before proceeding.", "fallbackHandler": { "address": "0x123", "name": "CompatibilityFallbackHandler", "logoUrl": "https://example.com/logo.png" } } ], "type": "array", "items": { "$ref": "#/components/schemas/FallbackHandlerAnalysisResultDto" } } } }, "DeadlockAnalysisResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Deadlock analysis status code", "enum": [ "DEADLOCK_DETECTED", "NESTED_SAFE_WARNING", "FAILED" ], "example": "DEADLOCK_DETECTED" }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" } }, "required": [ "severity", "type", "title", "description" ] }, "DeadlockAnalysisDto": { "type": "object", "properties": { "DEADLOCK": { "description": "Deadlock analysis findings. Identifies signing deadlock risks in nested Safe configurations.", "example": [ { "severity": "CRITICAL", "type": "DEADLOCK_DETECTED", "title": "Signing deadlock risk detected", "description": "This change may create a signing cycle between Safes and can permanently lock funds. You will not be allowed to proceed forward." } ], "type": "array", "items": { "$ref": "#/components/schemas/DeadlockAnalysisResultDto" } } } }, "CounterpartyAnalysisDto": { "type": "object", "properties": { "recipient": { "type": "object", "description": "Recipient analysis results mapped by address. Contains recipient interaction history and bridge analysis.type: Record.", "additionalProperties": { "$ref": "#/components/schemas/RecipientAnalysisDto" }, "example": { "0x0000000000000000000000000000000000000000": { "isSafe": true, "RECIPIENT_INTERACTION": [ { "severity": "INFO", "type": "NEW_RECIPIENT", "title": "New recipient", "description": "This is the first time you are interacting with this recipient" } ] } } }, "contract": { "type": "object", "description": "Contract analysis results mapped by address. Contains contract verification, interaction history, and delegatecall analysis.type: Record.", "additionalProperties": { "$ref": "#/components/schemas/ContractAnalysisDto" }, "example": { "0x0000000000000000000000000000000000000000": { "CONTRACT_VERIFICATION": [ { "severity": "INFO", "type": "VERIFIED", "title": "Verified contract", "description": "This contract has been verified and its source code is available" } ] } } }, "deadlock": { "type": "object", "description": "Deadlock analysis results mapped by Safe address. Contains signing deadlock risk findings for owner/threshold management transactions.", "additionalProperties": { "$ref": "#/components/schemas/DeadlockAnalysisDto" }, "example": { "0x0000000000000000000000000000000000000000": { "DEADLOCK": [ { "severity": "CRITICAL", "type": "DEADLOCK_DETECTED", "title": "Signing deadlock risk detected", "description": "This change may create a signing cycle between Safes and can permanently lock funds. You will not be allowed to proceed forward." } ] } } } }, "required": [ "recipient", "contract", "deadlock" ] }, "ThreatAnalysisRequestDto": { "type": "object", "properties": { "data": { "description": "EIP-712 typed data to analyze for security threats. Contains domain, primaryType, types, and message fields following the EIP-712 standard for structured data signing.", "allOf": [ { "$ref": "#/components/schemas/TypedData" } ] }, "walletAddress": { "type": "string", "description": "Address of the transaction signer/wallet" }, "origin": { "type": "string", "description": "Optional origin identifier for the request" } }, "required": [ "data", "walletAddress" ] }, "ThreatAnalysisResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Threat status code", "enum": [ "NO_THREAT", "OWNERSHIP_CHANGE", "MODULE_CHANGE" ] }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" } }, "required": [ "severity", "type", "title", "description" ] }, "MasterCopyChangeThreatAnalysisResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Threat status code", "enum": [ "MASTERCOPY_CHANGE" ] }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" }, "before": { "type": "string", "description": "Address of the old master copy/implementation contract" }, "after": { "type": "string", "description": "Address of the new master copy/implementation contract" } }, "required": [ "severity", "type", "title", "description", "before", "after" ] }, "ThreatIssueDto": { "type": "object", "properties": { "address": { "type": "string", "description": "Address involved in the issue, if applicable" }, "description": { "type": "string", "description": "Issue description" } }, "required": [ "description" ] }, "MaliciousOrModerateThreatAnalysisResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Threat status code", "enum": [ "MALICIOUS", "MODERATE" ] }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" }, "issues": { "type": "object", "description": "A partial record of specific issues identified during threat analysis, grouped by severity.Record - keys should be one of the Severity enum (OK | INFO | WARN | CRITICAL)", "additionalProperties": { "type": "array", "items": { "$ref": "#/components/schemas/ThreatIssueDto" } }, "example": { "CRITICAL": [ { "description": "Malicious contract interaction detected", "address": "0x0000000000000000000000000000000000000000" } ], "WARN": [ { "description": "High gas price detected" } ] } } }, "required": [ "severity", "type", "title", "description" ] }, "FailedThreatAnalysisResultDto": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity level indicating the importance and risk", "enum": [ "OK", "INFO", "WARN", "CRITICAL" ] }, "type": { "type": "string", "description": "Threat status code", "enum": [ "FAILED" ] }, "title": { "type": "string", "description": "User-facing title of the finding" }, "description": { "type": "string", "description": "Detailed description explaining the finding and its implications" }, "error": { "type": "string", "description": "Error message for failed analysis" } }, "required": [ "severity", "type", "title", "description" ] }, "NativeAssetDetailsDto": { "type": "object", "properties": { "symbol": { "type": "string", "description": "Token symbol (if available)" }, "logo_url": { "type": "string", "description": "URL to asset logo (if available)", "example": "https://example.com/logo.png" }, "type": { "type": "string", "description": "Asset type", "enum": [ "NATIVE" ] } }, "required": [ "type" ] }, "TokenAssetDetailsDto": { "type": "object", "properties": { "symbol": { "type": "string", "description": "Token symbol (if available)" }, "logo_url": { "type": "string", "description": "URL to asset logo (if available)", "example": "https://example.com/logo.png" }, "type": { "type": "string", "description": "Asset type", "enum": [ "ERC20", "ERC721", "ERC1155" ] }, "address": { "type": "string", "description": "Token contract address" } }, "required": [ "type", "address" ] }, "FungibleDiffDto": { "type": "object", "properties": { "value": { "type": "string", "description": "Value change for fungible tokens", "example": "1000000" } } }, "NFTDiffDto": { "type": "object", "properties": { "token_id": { "type": "number", "description": "Token ID for NFTs", "example": 42 } }, "required": [ "token_id" ] }, "BalanceChangeDto": { "type": "object", "properties": { "asset": { "description": "Asset details", "oneOf": [ { "$ref": "#/components/schemas/NativeAssetDetailsDto" }, { "$ref": "#/components/schemas/TokenAssetDetailsDto" } ] }, "in": { "type": "array", "description": "Incoming asset changes", "items": { "oneOf": [ { "$ref": "#/components/schemas/FungibleDiffDto" }, { "$ref": "#/components/schemas/NFTDiffDto" } ] }, "example": [ { "value": "1000000" } ] }, "out": { "type": "array", "description": "Outgoing asset changes", "items": { "oneOf": [ { "$ref": "#/components/schemas/FungibleDiffDto" }, { "$ref": "#/components/schemas/NFTDiffDto" } ] }, "example": [ { "value": "500000" } ] } }, "required": [ "asset", "in", "out" ] }, "ThreatAnalysisResponseDto": { "type": "object", "properties": { "THREAT": { "description": "Array of threat analysis results. Results are sorted by severity (CRITICAL first). May include malicious patterns, ownership changes, module changes, or master copy upgrades.", "example": [ { "severity": "OK", "type": "NO_THREAT", "title": "No threats detected", "description": "Transaction analysis found no security threats" } ], "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/ThreatAnalysisResultDto" }, { "$ref": "#/components/schemas/MasterCopyChangeThreatAnalysisResultDto" }, { "$ref": "#/components/schemas/MaliciousOrModerateThreatAnalysisResultDto" }, { "$ref": "#/components/schemas/FailedThreatAnalysisResultDto" } ] } }, "BALANCE_CHANGE": { "description": "Balance changes resulting from the transaction. Shows incoming and outgoing transfers for various asset types.", "example": [ { "asset": { "type": "ERC20", "symbol": "USDC", "address": "0x0000000000000000000000000000000000000000", "logo_url": "https://example.com/usdc-logo.png" }, "in": [ { "value": "1000000" } ], "out": [ { "value": "500000" } ] } ], "type": "array", "items": { "$ref": "#/components/schemas/BalanceChangeDto" } }, "request_id": { "type": "string", "description": "Blockaid request ID from x-request-id header. Used for reporting false positives/negatives via the report endpoint.", "example": "11111111-1111-1111-1111-111111111111" } } }, "ReportFalseResultRequestDto": { "type": "object", "properties": { "event": { "type": "string", "enum": [ "FALSE_POSITIVE", "FALSE_NEGATIVE" ], "description": "Type of report: FALSE_POSITIVE if flagged incorrectly, FALSE_NEGATIVE if should have been flagged" }, "request_id": { "type": "string", "description": "The request_id from the original Blockaid scan response", "example": "11111111-1111-1111-1111-111111111111" }, "details": { "type": "string", "description": "Details about why this is a false result", "maxLength": 1000, "example": "This transaction was incorrectly flagged as malicious" } }, "required": [ "event", "request_id", "details" ] }, "ReportFalseResultResponseDto": { "type": "object", "properties": { "success": { "type": "boolean", "description": "Whether the report was submitted successfully", "example": true } }, "required": [ "success" ] }, "TargetedSafe": { "type": "object", "properties": { "outreachId": { "type": "number" }, "address": { "type": "string" } }, "required": [ "outreachId", "address" ] }, "Submission": { "type": "object", "properties": { "outreachId": { "type": "number" }, "targetedSafeId": { "type": "number" }, "signerAddress": { "type": "string" }, "completionDate": { "format": "date-time", "type": "string", "nullable": true } }, "required": [ "outreachId", "targetedSafeId", "signerAddress" ] }, "CreateSubmissionDto": { "type": "object", "properties": { "completed": { "type": "boolean" } }, "required": [ "completed" ] }, "TransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "Bridge", "Creation", "Custom", "NativeStakingDeposit", "NativeStakingValidatorsExit", "NativeStakingWithdraw", "SettingsChange", "Swap", "SwapAndBridge", "SwapOrder", "SwapTransfer", "Transfer", "TwapOrder", "VaultDeposit", "VaultRedeem" ] }, "humanDescription": { "type": "string", "nullable": true } }, "required": [ "type" ] }, "CreationTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "Creation" ] }, "humanDescription": { "type": "string", "nullable": true }, "creator": { "$ref": "#/components/schemas/AddressInfo" }, "transactionHash": { "type": "string" }, "implementation": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/AddressInfo" } ] }, "factory": { "$ref": "#/components/schemas/AddressInfo" }, "saltNonce": { "type": "string", "nullable": true } }, "required": [ "type", "creator", "transactionHash" ] }, "CustomTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "Custom" ] }, "humanDescription": { "type": "string", "nullable": true }, "to": { "$ref": "#/components/schemas/AddressInfo" }, "dataSize": { "type": "string" }, "value": { "type": "string", "nullable": true }, "isCancellation": { "type": "boolean" }, "methodName": { "type": "string", "nullable": true } }, "required": [ "type", "to", "dataSize", "isCancellation" ] }, "MultiSendTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "Custom" ] }, "humanDescription": { "type": "string", "nullable": true }, "to": { "$ref": "#/components/schemas/AddressInfo" }, "dataSize": { "type": "string" }, "value": { "type": "string", "nullable": true }, "isCancellation": { "type": "boolean" }, "methodName": { "type": "string", "enum": [ "multiSend" ] }, "actionCount": { "type": "number" } }, "required": [ "type", "to", "dataSize", "isCancellation", "methodName", "actionCount" ] }, "AddOwner": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "ADD_OWNER" ] }, "owner": { "$ref": "#/components/schemas/AddressInfo" }, "threshold": { "type": "number" } }, "required": [ "type", "owner", "threshold" ] }, "ChangeMasterCopy": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "CHANGE_MASTER_COPY" ] }, "implementation": { "$ref": "#/components/schemas/AddressInfo" } }, "required": [ "type", "implementation" ] }, "ChangeThreshold": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "CHANGE_THRESHOLD" ] }, "threshold": { "type": "number" } }, "required": [ "type", "threshold" ] }, "DeleteGuard": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "DELETE_GUARD" ] } }, "required": [ "type" ] }, "DisableModule": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "DISABLE_MODULE" ] }, "module": { "$ref": "#/components/schemas/AddressInfo" } }, "required": [ "type", "module" ] }, "EnableModule": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "ENABLE_MODULE" ] }, "module": { "$ref": "#/components/schemas/AddressInfo" } }, "required": [ "type", "module" ] }, "RemoveOwner": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "REMOVE_OWNER" ] }, "owner": { "$ref": "#/components/schemas/AddressInfo" }, "threshold": { "type": "number" } }, "required": [ "type", "owner", "threshold" ] }, "SetFallbackHandler": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "SET_FALLBACK_HANDLER" ] }, "handler": { "$ref": "#/components/schemas/AddressInfo" } }, "required": [ "type", "handler" ] }, "SetGuard": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "SET_GUARD" ] }, "guard": { "$ref": "#/components/schemas/AddressInfo" } }, "required": [ "type", "guard" ] }, "SettingsChange": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "ADD_OWNER", "CHANGE_MASTER_COPY", "CHANGE_THRESHOLD", "DELETE_GUARD", "DISABLE_MODULE", "ENABLE_MODULE", "REMOVE_OWNER", "SET_FALLBACK_HANDLER", "SET_GUARD", "SWAP_OWNER" ] } }, "required": [ "type" ] }, "SwapOwner": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "SWAP_OWNER" ] }, "oldOwner": { "$ref": "#/components/schemas/AddressInfo" }, "newOwner": { "$ref": "#/components/schemas/AddressInfo" } }, "required": [ "type", "oldOwner", "newOwner" ] }, "SettingsChangeTransaction": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "SettingsChange" ] }, "humanDescription": { "type": "string", "nullable": true }, "dataDecoded": { "$ref": "#/components/schemas/DataDecoded" }, "settingsInfo": { "oneOf": [ { "$ref": "#/components/schemas/AddOwner" }, { "$ref": "#/components/schemas/ChangeMasterCopy" }, { "$ref": "#/components/schemas/ChangeThreshold" }, { "$ref": "#/components/schemas/DeleteGuard" }, { "$ref": "#/components/schemas/DisableModule" }, { "$ref": "#/components/schemas/EnableModule" }, { "$ref": "#/components/schemas/RemoveOwner" }, { "$ref": "#/components/schemas/SetFallbackHandler" }, { "$ref": "#/components/schemas/SetGuard" }, { "$ref": "#/components/schemas/SwapOwner" } ] } }, "required": [ "type", "dataDecoded", "settingsInfo" ] }, "Erc20Transfer": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "ERC20" ] }, "tokenAddress": { "type": "string" }, "value": { "type": "string" }, "tokenName": { "type": "string", "nullable": true }, "tokenSymbol": { "type": "string", "nullable": true }, "logoUri": { "type": "string", "nullable": true }, "decimals": { "type": "number", "nullable": true }, "trusted": { "type": "boolean", "nullable": true }, "imitation": { "type": "boolean" } }, "required": [ "type", "tokenAddress", "value", "imitation" ] }, "Erc721Transfer": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "ERC721" ] }, "tokenAddress": { "type": "string" }, "tokenId": { "type": "string" }, "tokenName": { "type": "string", "nullable": true }, "tokenSymbol": { "type": "string", "nullable": true }, "logoUri": { "type": "string", "nullable": true }, "trusted": { "type": "boolean", "nullable": true } }, "required": [ "type", "tokenAddress", "tokenId" ] }, "NativeCoinTransfer": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "NATIVE_COIN" ] }, "value": { "type": "string", "nullable": true } }, "required": [ "type" ] }, "Transfer": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "NATIVE_COIN", "ERC20", "ERC721" ] } }, "required": [ "type" ] }, "TransferTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "Transfer" ] }, "humanDescription": { "type": "string", "nullable": true }, "sender": { "$ref": "#/components/schemas/AddressInfo" }, "recipient": { "$ref": "#/components/schemas/AddressInfo" }, "direction": { "type": "string", "enum": [ "INCOMING", "OUTGOING", "UNKNOWN" ] }, "transferInfo": { "oneOf": [ { "$ref": "#/components/schemas/Erc20Transfer" }, { "$ref": "#/components/schemas/Erc721Transfer" }, { "$ref": "#/components/schemas/NativeCoinTransfer" } ], "allOf": [ { "$ref": "#/components/schemas/Transfer" } ] } }, "required": [ "type", "sender", "recipient", "direction", "transferInfo" ] }, "BridgeFee": { "type": "object", "properties": { "tokenAddress": { "type": "string" }, "integratorFee": { "type": "string" }, "lifiFee": { "type": "string" } }, "required": [ "tokenAddress", "integratorFee", "lifiFee" ] }, "TokenInfo": { "type": "object", "properties": { "address": { "type": "string", "description": "The token address" }, "decimals": { "type": "number", "description": "The token decimals" }, "logoUri": { "type": "string", "nullable": true, "description": "The logo URI for the token" }, "name": { "type": "string", "description": "The token name" }, "symbol": { "type": "string", "description": "The token symbol" }, "trusted": { "type": "boolean", "description": "The token trusted status" } }, "required": [ "address", "decimals", "name", "symbol", "trusted" ] }, "BridgeAndSwapTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "SwapAndBridge" ] }, "humanDescription": { "type": "string", "nullable": true }, "fromToken": { "$ref": "#/components/schemas/TokenInfo" }, "recipient": { "$ref": "#/components/schemas/AddressInfo" }, "explorerUrl": { "type": "string", "nullable": true }, "status": { "type": "string", "enum": [ "NOT_FOUND", "INVALID", "PENDING", "DONE", "FAILED", "UNKNOWN", "AWAITING_EXECUTION" ] }, "substatus": { "type": "string", "enum": [ "WAIT_SOURCE_CONFIRMATIONS", "WAIT_DESTINATION_TRANSACTION", "BRIDGE_NOT_AVAILABLE", "CHAIN_NOT_AVAILABLE", "REFUND_IN_PROGRESS", "UNKNOWN_ERROR", "COMPLETED", "PARTIAL", "REFUNDED", "INSUFFICIENT_ALLOWANCE", "INSUFFICIENT_BALANCE", "OUT_OF_GAS", "EXPIRED", "SLIPPAGE_EXCEEDED", "UNKNOWN_FAILED_ERROR", "UNKNOWN", "AWAITING_EXECUTION" ] }, "fees": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/BridgeFee" } ] }, "fromAmount": { "type": "string" }, "toChain": { "type": "string" }, "toToken": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "toAmount": { "type": "string", "nullable": true } }, "required": [ "type", "fromToken", "recipient", "explorerUrl", "status", "substatus", "fees", "fromAmount", "toChain", "toToken", "toAmount" ] }, "SwapOrderTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "SwapOrder" ] }, "humanDescription": { "type": "string", "nullable": true }, "uid": { "type": "string", "description": "The order UID" }, "status": { "type": "string", "enum": [ "presignaturePending", "open", "fulfilled", "cancelled", "expired", "unknown" ] }, "kind": { "type": "string", "enum": [ "buy", "sell", "unknown" ] }, "orderClass": { "type": "string", "enum": [ "market", "limit", "liquidity", "unknown" ] }, "validUntil": { "type": "number", "description": "The timestamp when the order expires" }, "sellAmount": { "type": "string", "description": "The sell token raw amount (no decimals)" }, "buyAmount": { "type": "string", "description": "The buy token raw amount (no decimals)" }, "executedSellAmount": { "type": "string", "description": "The executed sell token raw amount (no decimals)" }, "executedBuyAmount": { "type": "string", "description": "The executed buy token raw amount (no decimals)" }, "sellToken": { "description": "The sell token of the order", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "buyToken": { "description": "The buy token of the order", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "explorerUrl": { "type": "string", "description": "The URL to the explorer page of the order" }, "executedFee": { "type": "string", "description": "The amount of fees paid for this order." }, "executedFeeToken": { "description": "The token in which the fee was paid, expressed by SURPLUS tokens (BUY tokens for SELL orders and SELL tokens for BUY orders).", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "receiver": { "type": "string", "nullable": true, "description": "The (optional) address to receive the proceeds of the trade" }, "owner": { "type": "string" }, "fullAppData": { "type": "object", "nullable": true, "description": "The App Data for this order" } }, "required": [ "type", "uid", "status", "kind", "orderClass", "validUntil", "sellAmount", "buyAmount", "executedSellAmount", "executedBuyAmount", "sellToken", "buyToken", "explorerUrl", "executedFee", "executedFeeToken", "owner" ] }, "SwapTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "Swap" ] }, "humanDescription": { "type": "string", "nullable": true }, "recipient": { "$ref": "#/components/schemas/AddressInfo" }, "fees": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/BridgeFee" } ] }, "fromToken": { "$ref": "#/components/schemas/TokenInfo" }, "fromAmount": { "type": "string" }, "toToken": { "$ref": "#/components/schemas/TokenInfo" }, "toAmount": { "type": "string" }, "lifiExplorerUrl": { "type": "string", "nullable": true } }, "required": [ "type", "recipient", "fees", "fromToken", "fromAmount", "toToken", "toAmount", "lifiExplorerUrl" ] }, "SwapTransferTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "SwapTransfer" ] }, "humanDescription": { "type": "string", "nullable": true }, "sender": { "$ref": "#/components/schemas/AddressInfo" }, "recipient": { "$ref": "#/components/schemas/AddressInfo" }, "direction": { "type": "string" }, "transferInfo": { "oneOf": [ { "$ref": "#/components/schemas/Erc20Transfer" }, { "$ref": "#/components/schemas/Erc721Transfer" }, { "$ref": "#/components/schemas/NativeCoinTransfer" } ], "allOf": [ { "$ref": "#/components/schemas/Transfer" } ] }, "uid": { "type": "string", "description": "The order UID" }, "status": { "type": "string", "enum": [ "presignaturePending", "open", "fulfilled", "cancelled", "expired", "unknown" ] }, "kind": { "type": "string", "enum": [ "buy", "sell", "unknown" ] }, "orderClass": { "type": "string", "enum": [ "market", "limit", "liquidity", "unknown" ] }, "validUntil": { "type": "number", "description": "The timestamp when the order expires" }, "sellAmount": { "type": "string", "description": "The sell token raw amount (no decimals)" }, "buyAmount": { "type": "string", "description": "The buy token raw amount (no decimals)" }, "executedSellAmount": { "type": "string", "description": "The executed sell token raw amount (no decimals)" }, "executedBuyAmount": { "type": "string", "description": "The executed buy token raw amount (no decimals)" }, "sellToken": { "description": "The sell token of the order", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "buyToken": { "description": "The buy token of the order", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "explorerUrl": { "type": "string", "description": "The URL to the explorer page of the order" }, "executedFee": { "type": "string", "description": "The amount of fees paid for this order." }, "executedFeeToken": { "description": "The token in which the fee was paid, expressed by SURPLUS tokens (BUY tokens for SELL orders and SELL tokens for BUY orders).", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "receiver": { "type": "string", "nullable": true, "description": "The (optional) address to receive the proceeds of the trade" }, "owner": { "type": "string" }, "fullAppData": { "type": "object", "nullable": true, "description": "The App Data for this order" } }, "required": [ "type", "sender", "recipient", "direction", "transferInfo", "uid", "status", "kind", "orderClass", "validUntil", "sellAmount", "buyAmount", "executedSellAmount", "executedBuyAmount", "sellToken", "buyToken", "explorerUrl", "executedFee", "executedFeeToken", "owner" ] }, "DurationAuto": { "type": "object", "properties": { "durationType": { "type": "string", "enum": [ "AUTO" ] } }, "required": [ "durationType" ] }, "DurationLimit": { "type": "object", "properties": { "durationType": { "type": "string", "enum": [ "LIMIT_DURATION" ] }, "duration": { "type": "string" } }, "required": [ "durationType", "duration" ] }, "StartTimeAtMining": { "type": "object", "properties": { "startType": { "type": "string", "enum": [ "AT_MINING_TIME" ] } }, "required": [ "startType" ] }, "StartTimeAtEpoch": { "type": "object", "properties": { "startType": { "type": "string", "enum": [ "AT_EPOCH" ] }, "epoch": { "type": "number" } }, "required": [ "startType", "epoch" ] }, "TwapOrderTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "TwapOrder" ] }, "humanDescription": { "type": "string", "nullable": true }, "status": { "type": "string", "description": "The TWAP status", "enum": [ "presignaturePending", "open", "fulfilled", "cancelled", "expired", "unknown" ] }, "kind": { "type": "string", "enum": [ "buy", "sell", "unknown" ] }, "class": { "type": "string", "enum": [ "market", "limit", "liquidity", "unknown" ] }, "activeOrderUid": { "type": "string", "nullable": true, "description": "The order UID of the active order, or null if none is active" }, "validUntil": { "type": "number", "description": "The timestamp when the TWAP expires" }, "sellAmount": { "type": "string", "description": "The sell token raw amount (no decimals)" }, "buyAmount": { "type": "string", "description": "The buy token raw amount (no decimals)" }, "executedSellAmount": { "type": "string", "nullable": true, "description": "The executed sell token raw amount (no decimals), or null if there are too many parts" }, "executedBuyAmount": { "type": "string", "nullable": true, "description": "The executed buy token raw amount (no decimals), or null if there are too many parts" }, "executedFee": { "type": "string", "nullable": true, "description": "The executed surplus fee raw amount (no decimals), or null if there are too many parts" }, "executedFeeToken": { "description": "The token in which the fee was paid, expressed by SURPLUS tokens (BUY tokens for SELL orders and SELL tokens for BUY orders).", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "sellToken": { "description": "The sell token of the TWAP", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "buyToken": { "description": "The buy token of the TWAP", "allOf": [ { "$ref": "#/components/schemas/TokenInfo" } ] }, "receiver": { "type": "string", "description": "The address to receive the proceeds of the trade" }, "owner": { "type": "string" }, "fullAppData": { "type": "object", "nullable": true, "description": "The App Data for this TWAP" }, "numberOfParts": { "type": "string", "description": "The number of parts in the TWAP" }, "partSellAmount": { "type": "string", "description": "The amount of sellToken to sell in each part" }, "minPartLimit": { "type": "string", "description": "The amount of buyToken that must be bought in each part" }, "timeBetweenParts": { "type": "number", "description": "The duration of the TWAP interval" }, "durationOfPart": { "description": "Whether the TWAP is valid for the entire interval or not", "oneOf": [ { "$ref": "#/components/schemas/DurationAuto" }, { "$ref": "#/components/schemas/DurationLimit" } ] }, "startTime": { "description": "The start time of the TWAP", "oneOf": [ { "$ref": "#/components/schemas/StartTimeAtMining" }, { "$ref": "#/components/schemas/StartTimeAtEpoch" } ] } }, "required": [ "type", "status", "kind", "validUntil", "sellAmount", "buyAmount", "executedFeeToken", "sellToken", "buyToken", "receiver", "owner", "numberOfParts", "partSellAmount", "minPartLimit", "timeBetweenParts", "durationOfPart", "startTime" ] }, "NativeStakingDepositTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "NativeStakingDeposit" ] }, "humanDescription": { "type": "string", "nullable": true }, "status": { "type": "string", "enum": [ "NOT_STAKED", "ACTIVATING", "DEPOSIT_IN_PROGRESS", "ACTIVE", "EXIT_REQUESTED", "EXITING", "EXITED", "SLASHED" ] }, "estimatedEntryTime": { "type": "number" }, "estimatedExitTime": { "type": "number" }, "estimatedWithdrawalTime": { "type": "number" }, "fee": { "type": "number" }, "monthlyNrr": { "type": "number" }, "annualNrr": { "type": "number" }, "value": { "type": "string" }, "numValidators": { "type": "number" }, "expectedAnnualReward": { "type": "string" }, "expectedMonthlyReward": { "type": "string" }, "expectedFiatAnnualReward": { "type": "number" }, "expectedFiatMonthlyReward": { "type": "number" }, "tokenInfo": { "$ref": "#/components/schemas/TokenInfo" }, "validators": { "nullable": true, "description": "Populated after transaction has been executed", "type": "array", "items": { "type": "string" } } }, "required": [ "type", "status", "estimatedEntryTime", "estimatedExitTime", "estimatedWithdrawalTime", "fee", "monthlyNrr", "annualNrr", "value", "numValidators", "expectedAnnualReward", "expectedMonthlyReward", "expectedFiatAnnualReward", "expectedFiatMonthlyReward", "tokenInfo" ] }, "NativeStakingValidatorsExitTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "NativeStakingValidatorsExit" ] }, "humanDescription": { "type": "string", "nullable": true }, "status": { "type": "string", "enum": [ "NOT_STAKED", "ACTIVATING", "DEPOSIT_IN_PROGRESS", "ACTIVE", "EXIT_REQUESTED", "EXITING", "EXITED", "SLASHED" ] }, "estimatedExitTime": { "type": "number" }, "estimatedWithdrawalTime": { "type": "number" }, "value": { "type": "string" }, "numValidators": { "type": "number" }, "tokenInfo": { "$ref": "#/components/schemas/TokenInfo" }, "validators": { "type": "array", "items": { "type": "string" } } }, "required": [ "type", "status", "estimatedExitTime", "estimatedWithdrawalTime", "value", "numValidators", "tokenInfo", "validators" ] }, "NativeStakingWithdrawTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "NativeStakingWithdraw" ] }, "humanDescription": { "type": "string", "nullable": true }, "value": { "type": "string" }, "tokenInfo": { "$ref": "#/components/schemas/TokenInfo" }, "validators": { "type": "array", "items": { "type": "string" } } }, "required": [ "type", "value", "tokenInfo", "validators" ] }, "VaultInfo": { "type": "object", "properties": { "address": { "type": "string" }, "name": { "type": "string" }, "description": { "type": "string" }, "dashboardUri": { "type": "string", "nullable": true }, "logoUri": { "type": "string" } }, "required": [ "address", "name", "description", "logoUri" ] }, "VaultExtraReward": { "type": "object", "properties": { "tokenInfo": { "$ref": "#/components/schemas/TokenInfo" }, "nrr": { "type": "number" }, "claimable": { "type": "string" }, "claimableNext": { "type": "string" } }, "required": [ "tokenInfo", "nrr", "claimable", "claimableNext" ] }, "VaultDepositTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "VaultDeposit" ] }, "humanDescription": { "type": "string", "nullable": true }, "value": { "type": "string" }, "baseNrr": { "type": "number" }, "fee": { "type": "number" }, "tokenInfo": { "$ref": "#/components/schemas/TokenInfo" }, "vaultInfo": { "$ref": "#/components/schemas/VaultInfo" }, "currentReward": { "type": "string" }, "additionalRewardsNrr": { "type": "number" }, "additionalRewards": { "type": "array", "items": { "$ref": "#/components/schemas/VaultExtraReward" } }, "expectedMonthlyReward": { "type": "string" }, "expectedAnnualReward": { "type": "string" } }, "required": [ "type", "value", "baseNrr", "fee", "tokenInfo", "vaultInfo", "currentReward", "additionalRewardsNrr", "additionalRewards", "expectedMonthlyReward", "expectedAnnualReward" ] }, "VaultRedeemTransactionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "VaultRedeem" ] }, "humanDescription": { "type": "string", "nullable": true }, "value": { "type": "string" }, "baseNrr": { "type": "number" }, "fee": { "type": "number" }, "tokenInfo": { "$ref": "#/components/schemas/TokenInfo" }, "vaultInfo": { "$ref": "#/components/schemas/VaultInfo" }, "currentReward": { "type": "string" }, "additionalRewardsNrr": { "type": "number" }, "additionalRewards": { "type": "array", "items": { "$ref": "#/components/schemas/VaultExtraReward" } } }, "required": [ "type", "value", "baseNrr", "fee", "tokenInfo", "vaultInfo", "currentReward", "additionalRewardsNrr", "additionalRewards" ] }, "TransactionData": { "type": "object", "properties": { "hexData": { "type": "string", "nullable": true }, "dataDecoded": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/DataDecoded" } ] }, "to": { "$ref": "#/components/schemas/AddressInfo" }, "value": { "type": "string", "nullable": true }, "operation": { "description": "Operation type: 0 for CALL, 1 for DELEGATE", "allOf": [ { "$ref": "#/components/schemas/Operation" } ] }, "trustedDelegateCallTarget": { "type": "boolean", "nullable": true }, "addressInfoIndex": { "type": "object", "additionalProperties": { "$ref": "#/components/schemas/AddressInfo" }, "nullable": true }, "tokenInfoIndex": { "type": "object", "additionalProperties": { "oneOf": [ { "$ref": "#/components/schemas/NativeToken" }, { "$ref": "#/components/schemas/Erc20Token" }, { "$ref": "#/components/schemas/Erc721Token" } ] }, "nullable": true } }, "required": [ "to", "operation" ] }, "MultisigConfirmationDetails": { "type": "object", "properties": { "signer": { "$ref": "#/components/schemas/AddressInfo" }, "signature": { "type": "string", "nullable": true }, "submittedAt": { "type": "number" } }, "required": [ "signer", "submittedAt" ] }, "MultisigExecutionDetails": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "MULTISIG" ] }, "submittedAt": { "type": "number" }, "nonce": { "type": "number" }, "safeTxGas": { "type": "string" }, "baseGas": { "type": "string" }, "gasPrice": { "type": "string" }, "gasToken": { "type": "string" }, "fee": { "type": "string" }, "payment": { "type": "string" }, "refundReceiver": { "$ref": "#/components/schemas/AddressInfo" }, "safeTxHash": { "type": "string" }, "executor": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/AddressInfo" } ] }, "signers": { "type": "array", "items": { "$ref": "#/components/schemas/AddressInfo" } }, "confirmationsRequired": { "type": "number" }, "confirmations": { "type": "array", "items": { "$ref": "#/components/schemas/MultisigConfirmationDetails" } }, "rejectors": { "type": "array", "items": { "$ref": "#/components/schemas/AddressInfo" } }, "gasTokenInfo": { "oneOf": [ { "$ref": "#/components/schemas/NativeToken" }, { "$ref": "#/components/schemas/Erc20Token" }, { "$ref": "#/components/schemas/Erc721Token" } ], "nullable": true }, "trusted": { "type": "boolean" }, "proposer": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/AddressInfo" } ] }, "proposedByDelegate": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/AddressInfo" } ] } }, "required": [ "type", "submittedAt", "nonce", "safeTxGas", "baseGas", "gasPrice", "gasToken", "fee", "payment", "refundReceiver", "safeTxHash", "signers", "confirmationsRequired", "confirmations", "rejectors", "trusted" ] }, "ModuleExecutionDetails": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "MODULE" ] }, "address": { "$ref": "#/components/schemas/AddressInfo" } }, "required": [ "type", "address" ] }, "SafeAppInfo": { "type": "object", "properties": { "name": { "type": "string" }, "url": { "type": "string" }, "logoUri": { "type": "string", "nullable": true } }, "required": [ "name", "url" ] }, "TransactionDetails": { "type": "object", "properties": { "txInfo": { "oneOf": [ { "$ref": "#/components/schemas/CreationTransactionInfo" }, { "$ref": "#/components/schemas/CustomTransactionInfo" }, { "$ref": "#/components/schemas/MultiSendTransactionInfo" }, { "$ref": "#/components/schemas/SettingsChangeTransaction" }, { "$ref": "#/components/schemas/TransferTransactionInfo" }, { "$ref": "#/components/schemas/SwapOrderTransactionInfo" }, { "$ref": "#/components/schemas/BridgeAndSwapTransactionInfo" }, { "$ref": "#/components/schemas/SwapTransactionInfo" }, { "$ref": "#/components/schemas/SwapTransferTransactionInfo" }, { "$ref": "#/components/schemas/TwapOrderTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingDepositTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingValidatorsExitTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingWithdrawTransactionInfo" }, { "$ref": "#/components/schemas/VaultDepositTransactionInfo" }, { "$ref": "#/components/schemas/VaultRedeemTransactionInfo" } ], "allOf": [ { "$ref": "#/components/schemas/TransactionInfo" } ] }, "safeAddress": { "type": "string" }, "txId": { "type": "string" }, "executedAt": { "type": "number", "nullable": true }, "txStatus": { "type": "string", "enum": [ "SUCCESS", "FAILED", "CANCELLED", "AWAITING_CONFIRMATIONS", "AWAITING_EXECUTION" ] }, "txData": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/TransactionData" } ] }, "detailedExecutionInfo": { "oneOf": [ { "$ref": "#/components/schemas/MultisigExecutionDetails" }, { "$ref": "#/components/schemas/ModuleExecutionDetails" } ], "nullable": true }, "txHash": { "type": "string", "nullable": true }, "safeAppInfo": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/SafeAppInfo" } ] }, "note": { "type": "string", "nullable": true } }, "required": [ "txInfo", "safeAddress", "txId", "txStatus" ] }, "TXSMultisigTransaction": { "type": "object", "properties": { "safe": { "type": "string" }, "to": { "type": "string" }, "value": { "type": "string" }, "data": { "type": "object" }, "operation": { "description": "Operation type: 0 for CALL, 1 for DELEGATE", "allOf": [ { "$ref": "#/components/schemas/Operation" } ] }, "gasToken": { "type": "object" }, "safeTxGas": { "type": "object" }, "baseGas": { "type": "object" }, "gasPrice": { "type": "object" }, "proposer": { "type": "object" }, "proposedByDelegate": { "type": "object" }, "refundReceiver": { "type": "object" }, "nonce": { "type": "number" }, "executionDate": { "type": "object" }, "submissionDate": { "format": "date-time", "type": "string" }, "modified": { "type": "object" }, "blockNumber": { "type": "object" }, "transactionHash": { "type": "object" }, "safeTxHash": { "type": "string" }, "executor": { "type": "object" }, "isExecuted": { "type": "boolean" }, "isSuccessful": { "type": "object" }, "ethGasPrice": { "type": "object" }, "gasUsed": { "type": "object" }, "fee": { "type": "object" }, "payment": { "type": "object" }, "origin": { "type": "object" }, "confirmationsRequired": { "type": "number" }, "confirmations": { "type": "object" }, "signatures": { "type": "object" }, "trusted": { "type": "boolean" } }, "required": [ "safe", "to", "value", "data", "operation", "gasToken", "safeTxGas", "baseGas", "gasPrice", "proposer", "proposedByDelegate", "refundReceiver", "nonce", "executionDate", "submissionDate", "modified", "blockNumber", "transactionHash", "safeTxHash", "executor", "isExecuted", "isSuccessful", "ethGasPrice", "gasUsed", "fee", "payment", "origin", "confirmationsRequired", "confirmations", "signatures", "trusted" ] }, "TXSMultisigTransactionPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/TXSMultisigTransaction" } } }, "required": [ "results" ] }, "ModuleExecutionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "MODULE" ] }, "address": { "$ref": "#/components/schemas/AddressInfo" } }, "required": [ "type", "address" ] }, "MultisigExecutionInfo": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "MULTISIG" ] }, "nonce": { "type": "number" }, "confirmationsRequired": { "type": "number" }, "confirmationsSubmitted": { "type": "number" }, "missingSigners": { "nullable": true, "type": "array", "items": { "$ref": "#/components/schemas/AddressInfo" } } }, "required": [ "type", "nonce", "confirmationsRequired", "confirmationsSubmitted" ] }, "Transaction": { "type": "object", "properties": { "txInfo": { "oneOf": [ { "$ref": "#/components/schemas/CreationTransactionInfo" }, { "$ref": "#/components/schemas/CustomTransactionInfo" }, { "$ref": "#/components/schemas/MultiSendTransactionInfo" }, { "$ref": "#/components/schemas/SettingsChangeTransaction" }, { "$ref": "#/components/schemas/TransferTransactionInfo" }, { "$ref": "#/components/schemas/SwapOrderTransactionInfo" }, { "$ref": "#/components/schemas/BridgeAndSwapTransactionInfo" }, { "$ref": "#/components/schemas/SwapTransactionInfo" }, { "$ref": "#/components/schemas/SwapTransferTransactionInfo" }, { "$ref": "#/components/schemas/TwapOrderTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingDepositTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingValidatorsExitTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingWithdrawTransactionInfo" }, { "$ref": "#/components/schemas/VaultDepositTransactionInfo" }, { "$ref": "#/components/schemas/VaultRedeemTransactionInfo" } ], "allOf": [ { "$ref": "#/components/schemas/TransactionInfo" } ] }, "id": { "type": "string" }, "txHash": { "type": "string", "nullable": true }, "timestamp": { "type": "number" }, "txStatus": { "type": "string", "enum": [ "SUCCESS", "FAILED", "CANCELLED", "AWAITING_CONFIRMATIONS", "AWAITING_EXECUTION" ] }, "executionInfo": { "oneOf": [ { "$ref": "#/components/schemas/MultisigExecutionInfo" }, { "$ref": "#/components/schemas/ModuleExecutionInfo" } ], "nullable": true }, "safeAppInfo": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/SafeAppInfo" } ] }, "note": { "type": "string", "nullable": true } }, "required": [ "txInfo", "id", "timestamp", "txStatus" ] }, "MultisigTransaction": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "TRANSACTION" ] }, "transaction": { "$ref": "#/components/schemas/Transaction" }, "conflictType": { "type": "string", "enum": [ "None", "HasNext", "End" ] } }, "required": [ "type", "transaction", "conflictType" ] }, "MultisigTransactionPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/MultisigTransaction" } } }, "required": [ "results" ] }, "DeleteTransactionDto": { "type": "object", "properties": { "signature": { "type": "string" } }, "required": [ "signature" ] }, "ModuleTransaction": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "TRANSACTION" ] }, "transaction": { "$ref": "#/components/schemas/Transaction" }, "conflictType": { "type": "string", "enum": [ "None" ] } }, "required": [ "type", "transaction", "conflictType" ] }, "ModuleTransactionPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/ModuleTransaction" } } }, "required": [ "results" ] }, "AddConfirmationDto": { "type": "object", "properties": { "signature": { "type": "string" } }, "required": [ "signature" ] }, "IncomingTransfer": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "TRANSACTION" ] }, "transaction": { "$ref": "#/components/schemas/Transaction" }, "conflictType": { "type": "string", "enum": [ "None" ] } }, "required": [ "type", "transaction", "conflictType" ] }, "IncomingTransferPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/IncomingTransfer" } } }, "required": [ "results" ] }, "PreviewTransactionDto": { "type": "object", "properties": { "to": { "type": "string" }, "data": { "type": "string", "nullable": true }, "value": { "type": "string" }, "operation": { "description": "Operation type: 0 for CALL, 1 for DELEGATE", "allOf": [ { "$ref": "#/components/schemas/Operation" } ] } }, "required": [ "to", "value", "operation" ] }, "TransactionPreview": { "type": "object", "properties": { "txInfo": { "oneOf": [ { "$ref": "#/components/schemas/CreationTransactionInfo" }, { "$ref": "#/components/schemas/CustomTransactionInfo" }, { "$ref": "#/components/schemas/MultiSendTransactionInfo" }, { "$ref": "#/components/schemas/SettingsChangeTransaction" }, { "$ref": "#/components/schemas/TransferTransactionInfo" }, { "$ref": "#/components/schemas/SwapOrderTransactionInfo" }, { "$ref": "#/components/schemas/BridgeAndSwapTransactionInfo" }, { "$ref": "#/components/schemas/SwapTransactionInfo" }, { "$ref": "#/components/schemas/SwapTransferTransactionInfo" }, { "$ref": "#/components/schemas/TwapOrderTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingDepositTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingValidatorsExitTransactionInfo" }, { "$ref": "#/components/schemas/NativeStakingWithdrawTransactionInfo" }, { "$ref": "#/components/schemas/VaultDepositTransactionInfo" }, { "$ref": "#/components/schemas/VaultRedeemTransactionInfo" } ], "allOf": [ { "$ref": "#/components/schemas/TransactionInfo" } ] }, "txData": { "$ref": "#/components/schemas/TransactionData" } }, "required": [ "txInfo", "txData" ] }, "ConflictHeaderQueuedItem": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "CONFLICT_HEADER" ] }, "nonce": { "type": "number" } }, "required": [ "type", "nonce" ] }, "LabelQueuedItem": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "LABEL" ] }, "label": { "type": "string" } }, "required": [ "type", "label" ] }, "TransactionQueuedItem": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "TRANSACTION" ] }, "transaction": { "$ref": "#/components/schemas/Transaction" }, "conflictType": { "type": "string", "enum": [ "None", "HasNext", "End" ] } }, "required": [ "type", "transaction", "conflictType" ] }, "QueuedItemPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/ConflictHeaderQueuedItem" }, { "$ref": "#/components/schemas/LabelQueuedItem" }, { "$ref": "#/components/schemas/TransactionQueuedItem" } ] } } }, "required": [ "results" ] }, "TransactionItem": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "TRANSACTION" ] }, "transaction": { "$ref": "#/components/schemas/Transaction" }, "conflictType": { "type": "string", "enum": [ "None" ] } }, "required": [ "type", "transaction", "conflictType" ] }, "TransactionItemPage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/TransactionItem" }, { "$ref": "#/components/schemas/DateLabel" } ] } } }, "required": [ "results" ] }, "ProposeTransactionDto": { "type": "object", "properties": { "to": { "type": "string" }, "value": { "type": "string" }, "data": { "type": "string", "nullable": true }, "nonce": { "type": "string" }, "operation": { "description": "Operation type: 0 for CALL, 1 for DELEGATE", "allOf": [ { "$ref": "#/components/schemas/Operation" } ] }, "safeTxGas": { "type": "string" }, "baseGas": { "type": "string" }, "gasPrice": { "type": "string" }, "gasToken": { "type": "string" }, "refundReceiver": { "type": "string", "nullable": true }, "safeTxHash": { "type": "string" }, "sender": { "type": "string" }, "signature": { "type": "string", "nullable": true }, "origin": { "type": "string", "nullable": true } }, "required": [ "to", "value", "nonce", "operation", "safeTxGas", "baseGas", "gasPrice", "gasToken", "safeTxHash", "sender" ] }, "CreationTransaction": { "type": "object", "properties": { "created": { "format": "date-time", "type": "string" }, "creator": { "type": "string" }, "transactionHash": { "type": "string" }, "factoryAddress": { "type": "string" }, "masterCopy": { "type": "string", "nullable": true }, "setupData": { "type": "string", "nullable": true }, "saltNonce": { "type": "string", "nullable": true }, "dataDecoded": { "nullable": true, "allOf": [ { "$ref": "#/components/schemas/DataDecoded" } ] } }, "required": [ "created", "creator", "transactionHash", "factoryAddress" ] }, "TXSCreationTransaction": { "type": "object", "properties": { "created": { "format": "date-time", "type": "string" }, "creator": { "type": "string" }, "transactionHash": { "type": "string" }, "factoryAddress": { "type": "string" }, "masterCopy": { "type": "object" }, "setupData": { "type": "object" }, "saltNonce": { "type": "object" } }, "required": [ "created", "creator", "transactionHash", "factoryAddress", "masterCopy", "setupData", "saltNonce" ] }, "TransactionExportDto": { "type": "object", "properties": { "executionDateGte": { "type": "string", "description": "Execution date greater than or equal to (ISO date string)" }, "executionDateLte": { "type": "string", "description": "Execution date less than or equal to (ISO date string)" }, "limit": { "type": "number", "description": "Maximum number of transactions to export" }, "offset": { "type": "number", "description": "Number of transactions to start from" } } }, "JobStatusDto": { "type": "object", "properties": { "id": { "type": "string", "description": "Job ID" }, "name": { "type": "string", "description": "Job name" }, "data": { "type": "object", "description": "Job data payload" }, "timestamp": { "type": "number", "description": "Timestamp when the job was created" }, "progress": { "description": "Job progress", "oneOf": [ { "type": "number", "example": 50 }, { "type": "string", "example": "50%" }, { "type": "boolean", "example": false }, { "type": "object", "example": { "current": 5, "total": 10 } } ] }, "processedOn": { "type": "number", "description": "Timestamp when job processing started" }, "finishedOn": { "type": "number", "description": "Timestamp when job finished" }, "failedReason": { "type": "string", "description": "Reason for job failure" }, "returnValue": { "type": "object", "description": "Job return value" } }, "required": [ "id", "name", "data", "timestamp", "progress", "processedOn", "finishedOn", "failedReason", "returnValue" ] }, "JobStatusErrorDto": { "type": "object", "properties": { "error": { "type": "string", "description": "Error message" } }, "required": [ "error" ] }, "Delegate": { "type": "object", "properties": { "safe": { "type": "string", "nullable": true }, "delegate": { "type": "string" }, "delegator": { "type": "string" }, "label": { "type": "string" } }, "required": [ "delegate", "delegator", "label" ] }, "DelegatePage": { "type": "object", "properties": { "count": { "type": "number", "nullable": true }, "next": { "type": "string", "nullable": true }, "previous": { "type": "string", "nullable": true }, "results": { "type": "array", "items": { "$ref": "#/components/schemas/Delegate" } } }, "required": [ "results" ] }, "CreateDelegateDto": { "type": "object", "properties": { "safe": { "type": "string", "nullable": true }, "delegate": { "type": "string" }, "delegator": { "type": "string" }, "signature": { "type": "string" }, "label": { "type": "string" } }, "required": [ "delegate", "delegator", "signature", "label" ] }, "DeleteDelegateDto": { "type": "object", "properties": { "delegate": { "type": "string" }, "delegator": { "type": "string" }, "signature": { "type": "string" } }, "required": [ "delegate", "delegator", "signature" ] }, "DeleteSafeDelegateDto": { "type": "object", "properties": { "delegate": { "type": "string" }, "safe": { "type": "string" }, "signature": { "type": "string" } }, "required": [ "delegate", "safe", "signature" ] }, "DeleteDelegateV2Dto": { "type": "object", "properties": { "delegator": { "type": "string", "nullable": true }, "safe": { "type": "string", "nullable": true }, "signature": { "type": "string" } }, "required": [ "signature" ] }, "SafeRegistration": { "type": "object", "properties": { "chainId": { "type": "string" }, "safes": { "type": "array", "items": { "type": "string" } }, "signatures": { "type": "array", "items": { "type": "string" } } }, "required": [ "chainId", "safes", "signatures" ] }, "RegisterDeviceDto": { "type": "object", "properties": { "uuid": { "type": "string", "nullable": true }, "cloudMessagingToken": { "type": "string" }, "buildNumber": { "type": "string" }, "bundle": { "type": "string" }, "deviceType": { "type": "string" }, "version": { "type": "string" }, "timestamp": { "type": "string", "nullable": true }, "safeRegistrations": { "type": "array", "items": { "$ref": "#/components/schemas/SafeRegistration" } } }, "required": [ "cloudMessagingToken", "buildNumber", "bundle", "deviceType", "version", "safeRegistrations" ] }, "NotificationTypeEnum": { "type": "string", "enum": [ "CONFIRMATION_REQUEST", "DELETED_MULTISIG_TRANSACTION", "EXECUTED_MULTISIG_TRANSACTION", "INCOMING_ETHER", "INCOMING_TOKEN", "MESSAGE_CONFIRMATION_REQUEST", "MODULE_TRANSACTION" ] }, "UpsertSubscriptionsSafesDto": { "type": "object", "properties": { "chainId": { "type": "string" }, "address": { "type": "string" }, "notificationTypes": { "type": "array", "items": { "$ref": "#/components/schemas/NotificationTypeEnum" } } }, "required": [ "chainId", "address", "notificationTypes" ] }, "DeviceType": { "type": "string", "enum": [ "ANDROID", "IOS", "WEB" ] }, "UpsertSubscriptionsDto": { "type": "object", "properties": { "cloudMessagingToken": { "type": "string" }, "safes": { "type": "array", "items": { "$ref": "#/components/schemas/UpsertSubscriptionsSafesDto" } }, "deviceType": { "allOf": [ { "$ref": "#/components/schemas/DeviceType" } ] }, "deviceUuid": { "type": "string", "nullable": true } }, "required": [ "cloudMessagingToken", "safes", "deviceType" ] }, "NotificationTypeResponseDto": { "type": "object", "properties": { "name": { "description": "The notification type name", "allOf": [ { "$ref": "#/components/schemas/NotificationTypeEnum" } ] } }, "required": [ "name" ] }, "DeleteAllSubscriptionItemDto": { "type": "object", "properties": { "chainId": { "type": "string" }, "deviceUuid": { "type": "string" }, "safeAddress": { "type": "string" }, "signerAddress": { "type": "string", "nullable": true, "description": "Optional signer address filter:\n• Omitted (undefined): Deletes subscriptions regardless of signer address\n• null: Deletes only subscriptions with no signer address\n• Valid address: Deletes only subscriptions with that specific signer address" } }, "required": [ "chainId", "deviceUuid", "safeAddress" ] }, "DeleteAllSubscriptionsDto": { "type": "object", "properties": { "subscriptions": { "minItems": 1, "description": "At least one subscription is required", "type": "array", "items": { "$ref": "#/components/schemas/DeleteAllSubscriptionItemDto" } } }, "required": [ "subscriptions" ] } } } }