{ "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" } }, { "name": "enroll", "required": false, "in": "query", "description": "When true, requests hosted enrollment of a new authenticator: the provider challenges an existing factor, then walks the user through enrolling the new one.", "schema": { "type": "boolean" } }, { "name": "elevate", "required": false, "in": "query", "description": "When true, requests step-up authentication: the provider re-challenges a second factor and the resulting session is elevated for sensitive actions.", "schema": { "type": "boolean" } } ], "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/auth/oidc/mfa/authenticators": { "get": { "description": "Lists the MFA authentication methods of the authenticated user for the self-service authenticator management UI.", "operationId": "oidcAuthListAuthenticatorsV1", "parameters": [], "responses": { "200": { "description": "MFA authentication methods", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Authenticator" } } } } }, "403": { "description": "Not authenticated" } }, "summary": "List MFA authenticators", "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/billing/spaces/{spaceId}/subscriptions": { "get": { "operationId": "billingGetSubscriptionsV1", "parameters": [ { "name": "status", "required": false, "in": "query", "schema": { "type": "string" } }, { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Subscription" } } } } } }, "summary": "Get a space subscriptions", "tags": [ "billing" ] } }, "/v1/billing/plans/{planId}": { "get": { "operationId": "billingGetPlanV1", "parameters": [ { "name": "planId", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Plan" } } } } }, "summary": "Get a plan by id", "tags": [ "billing" ] } }, "/v1/billing/spaces/{spaceId}/session-url": { "get": { "operationId": "billingGetSessionUrlV1", "parameters": [ { "name": "returnUrl", "required": true, "in": "query", "schema": { "type": "string" } }, { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UrlResponse" } } } } }, "summary": "Get the billing portal session URL for a space", "tags": [ "billing" ] } }, "/v1/billing/spaces/{spaceId}/payment-links": { "get": { "operationId": "billingGetSpacePaymentLinksV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/PaymentLink" } } } } } }, "summary": "Get payment links for a space, plus the general catalog", "tags": [ "billing" ] } }, "/v1/billing/spaces/{spaceId}/payment-links/{paymentLinkId}/checkout-url": { "get": { "operationId": "billingGetCheckoutUrlV1", "parameters": [ { "name": "paymentLinkId", "required": true, "in": "path", "description": "Payment link identifier", "schema": { "type": "string" } }, { "name": "returnUrl", "required": true, "in": "query", "schema": { "type": "string" } }, { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CheckoutSessionResult" } } } } }, "summary": "Create a checkout session for a payment link", "tags": [ "billing" ] } }, "/v1/billing/spaces/{spaceId}/subscriptions/{subscriptionId}/preview-update": { "get": { "operationId": "billingPreviewSubscriptionUpdateV1", "parameters": [ { "name": "subscriptionId", "required": true, "in": "path", "description": "Subscription identifier", "schema": { "type": "string" } }, { "name": "planId", "required": true, "in": "query", "description": "The price id of the plan to preview", "schema": { "type": "string" } }, { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SubscriptionUpdatePreview" } } } }, "403": { "description": "Not a member, or a plan this workspace is not offered" }, "404": { "description": "Subscription not found" }, "409": { "description": "Already on this plan" }, "422": { "description": "Malformed subscriptionId or planId" } }, "summary": "Preview what moving a subscription to another plan would cost", "tags": [ "billing" ] } }, "/v1/billing/spaces/{spaceId}/subscriptions/{subscriptionId}": { "patch": { "operationId": "billingUpdateSubscriptionV1", "parameters": [ { "name": "subscriptionId", "required": true, "in": "path", "description": "Subscription identifier", "schema": { "type": "string" } }, { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateSubscriptionDto" } } } }, "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateSubscriptionResult" } } } }, "403": { "description": "Not a member, or a plan this workspace is not offered" }, "404": { "description": "Subscription not found" }, "409": { "description": "Already on this plan, the subscription is not updatable, or several offered links sell the plan and none was named" }, "422": { "description": "The named payment link does not offer this plan" }, "502": { "description": "The billing service reported the plan change as unsuccessful" } }, "summary": "Move a subscription onto another plan", "tags": [ "billing" ] } }, "/v1/billing/sessions/{sessionId}": { "get": { "operationId": "billingGetCheckoutSessionV1", "parameters": [ { "name": "sessionId", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CheckoutSession" } } } } }, "summary": "Get a checkout session by id", "tags": [ "billing" ] } }, "/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 all cached Zerion portfolio data (overview, portfolio, positions) 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/gas-tokens": { "get": { "description": "Retrieves a paginated list of gas tokens supported for Pay with Safe on the given chain, ordered by selection priority.", "operationId": "feesGetGasTokensV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID where the Safe is deployed", "schema": { "example": "1", "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 gas tokens, ordered by priority", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GasTokenPage" } } } } }, "summary": "Get supported gas tokens", "tags": [ "fees" ] } }, "/v1/chains/{chainId}/fees/{safeAddress}/preview": { "post": { "description": "Calculates the estimated fees for executing a transaction via Pay with Safe. The fee model applied is selected internally per-chain and is transparent to the caller.", "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, nonce, gas token, and number of signatures", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FeePreviewTransactionDto" } } } }, "responses": { "200": { "description": "Fee preview with transaction data plus, depending on the fee model applied for the chain, either a relay cost or a fee breakdown", "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": { "202": { "description": "Message accepted. The Transaction Service indexes messages asynchronously, so the message may not be immediately retrievable — poll GET /v1/chains/{chainId}/messages/{messageHash}." }, "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 UUID to get address book for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Address book items retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpaceAddressBookDto" } } } }, "400": { "description": "Invalid space identifier" }, "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 UUID to update address book for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "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 UUID containing the address book", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "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" }, "400": { "description": "Invalid space identifier" }, "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/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 UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Pending requests retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddressBookRequestsDto" } } } }, "400": { "description": "Invalid space identifier" }, "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 contact to the shared space address book. The proposed contact (name, address, chain ids) is stored on the request and added to the address book once an admin approves it.", "operationId": "addressBookRequestsCreateRequestV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "requestBody": { "required": true, "description": "The contact to propose for the space address book", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateAddressBookRequestDto" } } } }, "responses": { "201": { "description": "Request created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AddressBookRequestItemDto" } } } }, "400": { "description": "Maximum number of pending requests reached" }, "403": { "description": "User is not an active member of this space" }, "409": { "description": "A pending request for this address already exists" }, "429": { "description": "Rate limit exceeded" } }, "summary": "Request to add a 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 UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "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 of this space" }, "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 requester can submit a new request for the same address afterwards.", "operationId": "addressBookRequestsRejectRequestV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "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 of this space" }, "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/{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 UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Space information retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetSpaceResponse" } } } }, "400": { "description": "Invalid space identifier" }, "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 UUID", "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 UUID to update", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "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" } } } }, "400": { "description": "Invalid space identifier" }, "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 UUID to delete", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "204": { "description": "Space deleted successfully" }, "400": { "description": "Invalid space identifier" }, "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}/audit-log": { "get": { "description": "Retrieves the append-only audit log of a space — who did what, when. Requires ACTIVE membership. Events are ordered by creation time (newest first by default) with a stable id tie-break.", "operationId": "spaceAuditGetAuditLogV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "name": "event_type", "required": false, "in": "query", "description": "Comma-separated list of event types to filter by", "schema": { "type": "string" } }, { "name": "actor_user_id", "required": false, "in": "query", "description": "Filter by acting user id", "schema": { "type": "number" } }, { "name": "created_at__gte", "required": false, "in": "query", "description": "ISO 8601 lower bound (inclusive) on event creation time", "schema": { "type": "string" } }, { "name": "created_at__lte", "required": false, "in": "query", "description": "ISO 8601 upper bound (inclusive) on event creation time", "schema": { "type": "string" } }, { "name": "sort_direction", "required": false, "in": "query", "description": "Sort direction over (created_at, id). Defaults to desc.", "schema": { "enum": [ "asc", "desc" ], "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 audit log entries", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpaceAuditLogPage" } } } }, "400": { "description": "Invalid space identifier" }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "403": { "description": "User is not an ACTIVE member of the space, or the feature is disabled" } }, "summary": "Get space audit log", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/audit-log/actors": { "get": { "description": "Retrieves the distinct actors appearing in a space audit log — including former and deleted members — as a filter dropdown source. Requires ACTIVE membership.", "operationId": "spaceAuditGetAuditLogActorsV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Distinct audit log actors", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/SpaceAuditLogActorDto" } } } } }, "400": { "description": "Invalid space identifier" }, "401": { "description": "Authentication required - valid JWT token must be provided" }, "403": { "description": "User is not an ACTIVE member of the space, or the feature is disabled" } }, "summary": "Get space audit log actors", "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 UUID to add Safes to", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "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" }, "400": { "description": "Invalid space identifier" }, "401": { "description": "Authentication required or user unauthorized to modify this space" }, "402": { "description": "The space is at its plan's Safe seat limit. The body carries `{ code: \"QUOTA_EXCEEDED\", feature, quota, used, resetsAt }`" }, "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 UUID to get Safes for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Space Safes retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetSpaceSafeResponse" } } } }, "400": { "description": "Invalid space identifier" }, "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 UUID to remove Safes from", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "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" }, "400": { "description": "Invalid space identifier" }, "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 UUID to invite users to", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "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" } } } } }, "400": { "description": "Invalid space identifier" }, "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 UUID to accept invitation for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "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" }, "400": { "description": "Invalid space identifier" }, "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 UUID to decline invitation for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Invitation declined successfully" }, "400": { "description": "Invalid space identifier" }, "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/{userId}/invite/renew": { "post": { "description": "Renews a pending invitation to a space, refreshing its expiry. Only space admins can renew, and only pending invitations can be renewed.Note: renewal for email invites also resends the invitation email.", "operationId": "membersRenewInviteV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID containing the invitation", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "name": "userId", "required": true, "in": "path", "description": "User ID of the invited member", "schema": { "example": 123, "type": "number" } } ], "responses": { "200": { "description": "Invitation renewed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Invitation" } } } }, "400": { "description": "Invalid space identifier" }, "403": { "description": "Access forbidden - user is not an active admin of this space" }, "404": { "description": "User, space, or member not found" }, "409": { "description": "Invitation is not in a pending state" } }, "summary": "Renew space invitation", "tags": [ "spaces" ] } }, "/v1/spaces/{spaceId}/members": { "get": { "description": "Retrieves all members of a space including their roles, status, and membership information. A pending (INVITED) member only sees their own membership state, not the other members.", "operationId": "membersGetUsersV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID to get members for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Space members retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MembersDto" } } } }, "400": { "description": "Invalid space identifier" }, "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", "description": "Space UUID to remove own membership from", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Membership deleted" }, "400": { "description": "Invalid space identifier" }, "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 UUID to fetch the caller's membership for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Membership retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MemberDto" } } } }, "400": { "description": "Invalid space identifier" }, "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 UUID containing the member", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "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" }, "400": { "description": "Invalid space identifier" }, "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", "description": "Space UUID to update own member alias in", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateMemberAliasDto" } } } }, "responses": { "200": { "description": "Alias updated" }, "400": { "description": "Invalid space identifier" }, "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 UUID to remove member from", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "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" }, "400": { "description": "Invalid space identifier" }, "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 UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "Counterfactual Safes retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GetCounterfactualSafesResponse" } } } }, "400": { "description": "Invalid space identifier" }, "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/spaces/{spaceId}/surveys/{slug}/state": { "get": { "description": "Returns the active survey definition and this space's response (if any) in a single round trip. Only active admins of the space can read survey state.", "operationId": "surveysGetStateV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID to get survey state for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "name": "slug", "required": true, "in": "path", "schema": { "example": "onboarding", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SurveyStateDto" } } } }, "400": { "description": "Invalid space identifier" }, "401": { "description": "Not authenticated" }, "403": { "description": "User is not an active admin of this space" }, "404": { "description": "No active survey for this slug" } }, "summary": "Get survey state for a space", "tags": [ "surveys" ] } }, "/v1/spaces/{spaceId}/surveys/{slug}/responses": { "post": { "description": "Submits or updates the space's response to the active survey for the given slug. Only active admins of the space can submit. Idempotent: repeat submissions overwrite the previous response.", "operationId": "surveysSubmitResponseV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID to submit a survey response for", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } }, { "name": "slug", "required": true, "in": "path", "schema": { "example": "onboarding", "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SubmitSurveyResponseDto" } } } }, "responses": { "201": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SurveyResponseResultDto" } } } }, "400": { "description": "Empty selections or unknown option keys" }, "401": { "description": "Not authenticated" }, "403": { "description": "User is not an active admin of this space" }, "404": { "description": "No active survey for this slug" } }, "summary": "Submit a survey response for a space", "tags": [ "surveys" ] } }, "/v1/spaces/{spaceId}/entitlements": { "get": { "description": "The single source of truth for what a workspace can do: the active plan and per-feature entitlements, with quotas and usage for metered ones. Free-tier workspaces get the same contract shape.", "operationId": "entitlementsGetEntitlementsV1", "parameters": [ { "name": "spaceId", "required": true, "in": "path", "description": "Space UUID", "schema": { "example": "123e4567-e89b-12d3-a456-426614174000", "type": "string" } } ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntitlementsResponse" } } } }, "400": { "description": "Invalid space identifier" }, "401": { "description": "Authentication required" }, "403": { "description": "Access forbidden - user is not a member of this space" }, "404": { "description": "Space not found" } }, "summary": "Get space entitlements", "tags": [ "entitlements" ] } }, "/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 or Safe creation transaction using the relay service, which pays for gas fees. Supports execTransaction (Safe tx) and createProxyWithNonce (Safe creation) calldata. On relay-fee chains, safeTxHash is required and must match the hash derived on-chain from the submitted calldata. On chains where pre-relay Tenderly simulation is enabled, an execTransaction is simulated before being submitted: a confirmed revert returns SIMULATION_FAILED, and an unreachable simulator returns INDETERMINATE_SIMULATION (retry with acceptUnverifiedSimulation=true to proceed anyway when the simulator is unreachable).", "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. safeTxHash is required on relay-fee chains and must correspond to the to + data fields. Set acceptUnverifiedSimulation=true to retry a relay skipping the simulation which previously returned INDETERMINATE_SIMULATION.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RelayDto" } } } }, "responses": { "200": { "description": "Transaction relayed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Relay" } } } }, "400": { "description": "Request body failed schema validation" }, "403": { "description": "Relay denied: safeTxHash missing, fee service rejected, or unofficial proxy factory" }, "422": { "description": "Relay rejected. The consumers MUST branch on the `code` field; `message` is informational. Possible cases: safeTxHash does not match the transaction data, unrecognised transaction type, SIMULATION_FAILED (Tenderly confirmed revert), or INDETERMINATE_SIMULATION (simulator unreachable; retry with `acceptUnverifiedSimulation=true` to proceed anyway).", "schema": { "examples": { "simulationFailed": { "summary": "SIMULATION_FAILED", "value": { "code": "SIMULATION_FAILED", "message": "Relay denied: transaction simulation failed: Reverted with reason string: 'GS013'", "statusCode": 422 } }, "indeterminateSimulation": { "summary": "INDETERMINATE_SIMULATION", "value": { "code": "INDETERMINATE_SIMULATION", "message": "Relay simulation could not be completed.", "statusCode": 422 } }, "safeTxHashMismatch": { "summary": "safeTxHash mismatch (no `code`)", "value": { "message": "Safe transaction hash mismatch: provided hash 0x... does not match the transaction data", "statusCode": 422 } } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RelayErrorResponse" } } } }, "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. On relay-fee chains, safeTxHash is forwarded to the fee service to determine per-transaction eligibility (returns remaining=1 when eligible, 0 when not). On daily-limit and no-fee-campaign chains, a count-based quota is returned.", "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 on relay-fee chains to check per-transaction eligibility with the fee service. Optional on daily-limit and no-fee-campaign chains.", "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}/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/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/chains/{chainId}/tokens/{address}": { "get": { "description": "Symbol, name, decimals, logo and trust flag of a token on the given chain, as known by the Transaction Service.", "operationId": "tokensGetTokenV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID the token is deployed on", "schema": { "example": "1", "type": "string" } }, { "name": "address", "required": true, "in": "path", "description": "Token contract address (0x prefixed hex string)", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Token metadata", "content": { "application/json": { "schema": { "oneOf": [ { "$ref": "#/components/schemas/NativeTokenMetadata" }, { "$ref": "#/components/schemas/Erc20TokenMetadata" }, { "$ref": "#/components/schemas/Erc721TokenMetadata" } ] } } } }, "404": { "description": "The Transaction Service does not know this token" }, "422": { "description": "Invalid chain ID or address" }, "429": { "description": "Rate limit exceeded" } }, "summary": "Get token metadata", "tags": [ "tokens" ] } }, "/v1/chains/{chainId}/tokens": { "get": { "description": "Metadata for up to 20 tokens of one chain, in request order. Addresses the Transaction Service does not know are omitted.", "operationId": "tokensGetTokensV1", "parameters": [ { "name": "chainId", "required": true, "in": "path", "description": "Chain ID the token is deployed on", "schema": { "example": "1", "type": "string" } }, { "name": "addresses", "required": true, "in": "query", "description": "Comma-separated token contract addresses, at most 20", "schema": { "example": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7", "type": "string" } } ], "responses": { "200": { "description": "Token metadata for the known addresses, in request order", "content": { "application/json": { "schema": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/NativeTokenMetadata" }, { "$ref": "#/components/schemas/Erc20TokenMetadata" }, { "$ref": "#/components/schemas/Erc721TokenMetadata" } ] } } } } }, "422": { "description": "Invalid chain ID, malformed address, empty list or more than 20 addresses" }, "429": { "description": "Rate limit exceeded" } }, "summary": "Get metadata for several tokens", "tags": [ "tokens" ] } }, "/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)" } } }, "Authenticator": { "type": "object", "properties": { "id": { "type": "string", "description": "Auth0 authentication method identifier (e.g. totp|...)" }, "type": { "type": "string", "description": "Authentication method type (e.g. totp)" }, "name": { "type": "string", "description": "User-visible authenticator name" }, "createdAt": { "type": "string", "description": "ISO 8601 timestamp of when the method was enrolled" } }, "required": [ "id", "type" ] }, "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" ] }, "SubscriptionPlan": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string", "nullable": true }, "description": { "type": "string", "nullable": true }, "currentPrice": { "type": "number" }, "originalPrice": { "type": "number", "nullable": true }, "paymentMethod": { "type": "string", "enum": [ "fiat" ] }, "currency": { "type": "string", "enum": [ "usd", "eur" ] }, "features": { "type": "array", "items": { "type": "string" } }, "billingCycle": { "type": "string", "enum": [ "month", "year" ], "nullable": true }, "type": { "type": "string", "enum": [ "standard", "premium", "enterprise" ] }, "product": { "type": "string", "nullable": true } }, "required": [ "id", "currentPrice", "originalPrice", "paymentMethod", "currency", "features", "type", "product" ] }, "Subscription": { "type": "object", "properties": { "id": { "type": "string" }, "customerId": { "type": "string" }, "upstreamCustomerId": { "type": "string" }, "plan": { "$ref": "#/components/schemas/SubscriptionPlan" }, "status": { "type": "string", "enum": [ "active", "canceled", "incomplete", "incomplete_expired", "past_due", "paused", "trialing", "unpaid" ] }, "createdAt": { "type": "number" }, "startAt": { "type": "number" }, "cancelledAt": { "type": "number", "nullable": true }, "cancelAt": { "type": "number", "nullable": true }, "currentPeriodStart": { "type": "number", "nullable": true }, "currentPeriodEnd": { "type": "number", "nullable": true }, "metadata": { "type": "object", "nullable": true } }, "required": [ "id", "customerId", "upstreamCustomerId", "plan", "status", "createdAt", "startAt", "cancelledAt", "cancelAt" ] }, "MarketingFeature": { "type": "object", "properties": { "name": { "type": "string" } }, "required": [ "name" ] }, "Product": { "type": "object", "properties": { "id": { "type": "string" }, "active": { "type": "boolean" }, "description": { "type": "string" }, "marketingFeatures": { "type": "array", "items": { "$ref": "#/components/schemas/MarketingFeature" } }, "metadata": { "type": "object" }, "name": { "type": "string" } }, "required": [ "id", "active", "description", "marketingFeatures", "metadata", "name" ] }, "Plan": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string", "nullable": true }, "description": { "type": "string", "nullable": true }, "currentPrice": { "type": "number" }, "originalPrice": { "type": "number", "nullable": true }, "paymentMethod": { "type": "string", "enum": [ "fiat" ] }, "currency": { "type": "string", "enum": [ "usd", "eur" ] }, "features": { "type": "array", "items": { "type": "string" } }, "billingCycle": { "type": "string", "enum": [ "month", "year" ], "nullable": true }, "type": { "type": "string", "enum": [ "standard", "premium", "enterprise" ] }, "product": { "$ref": "#/components/schemas/Product" } }, "required": [ "id", "currentPrice", "originalPrice", "paymentMethod", "currency", "features", "type", "product" ] }, "UrlResponse": { "type": "object", "properties": { "url": { "type": "string" } }, "required": [ "url" ] }, "PaymentLink": { "type": "object", "properties": { "id": { "type": "string" }, "url": { "type": "string" }, "active": { "type": "boolean" }, "metadata": { "type": "object" }, "customText": { "type": "object" }, "afterCompletion": { "type": "object" }, "lineItems": { "type": "array", "items": { "type": "object" } }, "trialPeriodDays": { "type": "number", "nullable": true } }, "required": [ "id", "url", "active", "metadata" ] }, "CheckoutSessionResult": { "type": "object", "properties": { "sessionId": { "type": "string" }, "url": { "type": "string" } }, "required": [ "sessionId", "url" ] }, "PreviewLineItem": { "type": "object", "properties": { "description": { "type": "string" }, "amount": { "type": "number", "description": "Signed amount in minor units; negative for credit on unused time" }, "currency": { "type": "string" } }, "required": [ "description", "amount", "currency" ] }, "SubscriptionUpdatePreview": { "type": "object", "properties": { "amountDue": { "type": "number" }, "currency": { "type": "string" }, "nextBillingDate": { "type": "number", "description": "Unix timestamp in seconds" }, "lineItems": { "type": "array", "items": { "$ref": "#/components/schemas/PreviewLineItem" } } }, "required": [ "amountDue", "currency", "nextBillingDate", "lineItems" ] }, "UpdateSubscriptionDto": { "type": "object", "properties": { "planId": { "type": "string", "description": "The price id of the plan to move the subscription onto" }, "paymentLinkId": { "type": "string", "description": "Which offered payment link sells that plan. Only needed to disambiguate when several do" } }, "required": [ "planId" ] }, "UpdateSubscriptionResult": { "type": "object", "properties": { "subscriptionId": { "type": "string" }, "success": { "type": "boolean" } }, "required": [ "subscriptionId", "success" ] }, "CheckoutSession": { "type": "object", "properties": { "id": { "type": "string" }, "object": { "type": "string" }, "amountSubtotal": { "type": "number" }, "amountTotal": { "type": "number" }, "cancelUrl": { "type": "string" }, "clientReferenceId": { "type": "object", "nullable": true }, "created": { "type": "number" }, "currency": { "type": "string" }, "customer": { "type": "object", "nullable": true }, "expiresAt": { "type": "number" }, "metadata": { "type": "object" }, "mode": { "type": "string" }, "paymentStatus": { "type": "string" }, "status": { "type": "string" }, "successUrl": { "type": "string" }, "url": { "type": "object", "nullable": true }, "subscription": { "type": "object", "nullable": true }, "invoice": { "type": "object", "nullable": true } }, "required": [ "id", "object", "amountSubtotal", "amountTotal", "cancelUrl", "created", "currency", "expiresAt", "metadata", "mode", "paymentStatus", "status", "successUrl" ] }, "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" ] }, "Relayer": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "GTF", "RELAY_FEE", "DAILY_LIMIT", "NO_FEE_CAMPAIGN" ], "nullable": true }, "safeCreationSponsored": { "type": "boolean" }, "safeTransactionSponsored": { "type": "boolean" }, "enableTenderlySimulationBeforeRelay": { "type": "boolean" } }, "required": [ "type", "safeCreationSponsored", "safeTransactionSponsored", "enableTenderlySimulationBeforeRelay" ] }, "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 }, "relayer": { "nullable": true, "type": "object", "allOf": [ { "$ref": "#/components/schemas/Relayer" } ] } }, "required": [ "chainId", "chainName", "description", "l2", "isTestnet", "zk", "nativeCurrency", "transactionService", "blockExplorerUriTemplate", "beaconChainExplorerUriTemplate", "disabledWallets", "balancesProvider", "features", "gasPrice", "publicRpcUri", "rpcUri", "safeAppsRpcUri", "shortName", "theme", "relayer" ] }, "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" ] }, "GasToken": { "type": "object", "properties": { "address": { "type": "string", "description": "Gas token contract address", "example": "0x0000000000000000000000000000000000000000" }, "symbol": { "type": "string", "description": "The token's ticker symbol", "example": "USDC" } }, "required": [ "address", "symbol" ] }, "GasTokenPage": { "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/GasToken" } } }, "required": [ "results" ] }, "Origin": { "type": "string", "enum": [ "SAFE_APP", "WALLET_CONNECT", "TX_BUILDER", "NATIVE" ], "description": "Transaction origin. Defaults to NATIVE when omitted." }, "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 }, "nonce": { "type": "string", "description": "Safe nonce the transaction will use (uint256 string)", "example": "42" }, "origin": { "description": "Transaction origin. Defaults to NATIVE when omitted.", "allOf": [ { "$ref": "#/components/schemas/Origin" } ] }, "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", "nonce" ] }, "FeePreviewTxData": { "type": "object", "properties": { "chainId": { "type": "string", "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" ] }, "FeePreviewValuationDetail": { "type": "object", "properties": { "tokenAddress": { "type": "string", "description": "Token contract address (absent for native transfers)" }, "symbol": { "type": "string", "description": "Token symbol", "example": "USDC" }, "amount": { "type": "string", "description": "Token amount", "example": "1000" }, "priceUsd": { "type": "number", "description": "Token price in USD" }, "valueUsd": { "type": "number", "description": "Token value in USD" } }, "required": [ "symbol", "amount" ] }, "FeePreviewFeeBreakdown": { "type": "object", "properties": { "txValueUsd": { "type": "number", "description": "Transaction value in USD", "example": 1000 }, "trailingVolumeUsd": { "type": "number", "description": "Trailing volume in USD that fed tier selection", "example": 0 }, "tierBps": { "type": "number", "description": "Tier fee in basis points", "example": 5 }, "gtfFeeUsd": { "type": "number", "description": "GTF fee in USD", "example": 0.5 }, "relayCostUsd": { "type": "number", "description": "Relay cost in USD", "example": 38.22 }, "totalUsd": { "type": "number", "description": "Total fee in USD", "example": 38.72 }, "numberSignatures": { "type": "number", "description": "Number of signatures", "example": 2 }, "valuationDetails": { "type": "array", "items": { "$ref": "#/components/schemas/FeePreviewValuationDetail" } } }, "required": [ "txValueUsd", "trailingVolumeUsd", "tierBps", "gtfFeeUsd", "relayCostUsd", "totalUsd", "numberSignatures", "valuationDetails" ] }, "FeePreviewResponse": { "type": "object", "properties": { "txData": { "$ref": "#/components/schemas/FeePreviewTxData" }, "relayCost": { "description": "Relay cost. Present when the relay fee flow applies.", "allOf": [ { "$ref": "#/components/schemas/FeePreviewRelayCost" } ] }, "feeBreakdown": { "description": "GTF fee breakdown, as returned by the fee-engine service. Present when the GTF fee flow applies.", "allOf": [ { "$ref": "#/components/schemas/FeePreviewFeeBreakdown" } ] }, "maxFeeCapUsd": { "type": "number", "description": "Maximum fee cap in USD (buffered max fee). Present when the GTF fee flow applies." } }, "required": [ "txData" ] }, "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": { "spaceUuid": { "type": "string", "description": "Space UUID" }, "data": { "type": "array", "items": { "$ref": "#/components/schemas/SpaceAddressBookItemDto" } } }, "required": [ "spaceUuid", "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" ] }, "AddressBookRequestItemDto": { "type": "object", "properties": { "id": { "type": "number" }, "name": { "type": "string" }, "address": { "type": "string" }, "chainIds": { "type": "array", "items": { "type": "string" } }, "requestedBy": { "type": "string", "description": "Email or wallet address of the requester, \"Unknown user\" if the user has no display identity, or \"Deleted user\"" }, "requestedByUserId": { "type": "number", "description": "User ID of the requester" }, "reviewedBy": { "type": "string", "nullable": true, "description": "Email or wallet address of the reviewing admin, \"Unknown user\", \"Deleted user\", or null when still PENDING" }, "reviewedByUserId": { "type": "number", "nullable": true, "description": "User ID of the reviewing admin, null when still PENDING" }, "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", "requestedByUserId", "reviewedBy", "reviewedByUserId", "status", "createdAt", "updatedAt" ] }, "AddressBookRequestsDto": { "type": "object", "properties": { "spaceUuid": { "type": "string", "description": "Space UUID" }, "data": { "type": "array", "items": { "$ref": "#/components/schemas/AddressBookRequestItemDto" } } }, "required": [ "spaceUuid", "data" ] }, "CreateAddressBookRequestDto": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 50, "description": "Name of the proposed contact" }, "address": { "type": "string", "description": "Address of the contact to propose for the space address book" }, "chainIds": { "description": "Chain ids the contact applies to (at least one, duplicates are removed)", "type": "array", "items": { "type": "string" } } }, "required": [ "name", "address", "chainIds" ] }, "CreateSpaceDto": { "type": "object", "properties": { "name": { "type": "string" } }, "required": [ "name" ] }, "CreateSpaceResponse": { "type": "object", "properties": { "name": { "type": "string" }, "uuid": { "type": "string", "description": "Space UUID" } }, "required": [ "name", "uuid" ] }, "UserDto": { "type": "object", "properties": { "id": { "type": "number" } }, "required": [ "id" ] }, "SpaceMemberDto": { "type": "object", "properties": { "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] }, "name": { "type": "string" }, "invitedBy": { "type": "number", "nullable": true }, "inviteExpiresAt": { "format": "date-time", "type": "string", "nullable": true }, "invitedByName": { "type": "string" }, "status": { "type": "string", "enum": [ "INVITED", "ACTIVE", "DECLINED" ] }, "user": { "$ref": "#/components/schemas/UserDto" } }, "required": [ "role", "name", "invitedBy", "inviteExpiresAt", "status", "user" ] }, "GetSpaceResponse": { "type": "object", "properties": { "uuid": { "type": "string", "description": "Space UUID" }, "name": { "type": "string" }, "members": { "description": "Members of the space. A pending (INVITED) member only sees their own membership row here, not the other members.", "type": "array", "items": { "$ref": "#/components/schemas/SpaceMemberDto" } }, "memberCount": { "type": "number", "description": "Total count of ACTIVE members in the space", "example": 5 }, "safeCount": { "type": "number", "description": "Total count of Safes in the space", "example": 5 } }, "required": [ "uuid", "name", "members", "memberCount", "safeCount" ] }, "UpdateSpaceDto": { "type": "object", "properties": { "name": { "type": "string" }, "status": { "type": "string", "enum": [ "ACTIVE" ] } } }, "UpdateSpaceResponse": { "type": "object", "properties": { "uuid": { "type": "string", "description": "Space UUID" } }, "required": [ "uuid" ] }, "SpaceAuditLogEntryDto": { "type": "object", "properties": { "id": { "type": "string", "description": "Monotonic entry id (bigint serialized as string)" }, "eventType": { "type": "string", "enum": [ "SPACE_CREATED", "SPACE_UPDATED", "SPACE_DELETED", "MEMBER_INVITED", "MEMBER_INVITE_ACCEPTED", "MEMBER_INVITE_DECLINED", "MEMBER_INVITE_RENEWED", "MEMBER_ROLE_UPDATED", "MEMBER_ALIAS_UPDATED", "MEMBER_REMOVED", "MEMBER_LEFT", "SAFE_ADDED", "SAFE_REMOVED", "ADDRESS_BOOK_UPSERTED", "ADDRESS_BOOK_DELETED", "ADDRESS_BOOK_REQUEST_CREATED", "ADDRESS_BOOK_REQUEST_REJECTED" ] }, "actorUserId": { "type": "number" }, "actor": { "type": "string", "description": "Resolved (and masked) display string of the acting user." }, "targetUser": { "type": "string", "nullable": true, "description": "Resolved (and masked) display string of the affected user, when the event has one." }, "payload": { "type": "object", "description": "Event-specific payload, allowlisted per event type. Clients must treat every field as optional." }, "createdAt": { "format": "date-time", "type": "string" } }, "required": [ "id", "eventType", "actorUserId", "actor", "targetUser", "payload", "createdAt" ] }, "SpaceAuditLogPage": { "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/SpaceAuditLogEntryDto" } } }, "required": [ "results" ] }, "SpaceAuditLogActorDto": { "type": "object", "properties": { "actorUserId": { "type": "number" }, "actor": { "type": "string", "description": "Resolved (and masked) display string of the actor." } }, "required": [ "actorUserId", "actor" ] }, "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" ] }, "WalletInviteUserDto": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "wallet" ] }, "address": { "type": "string" }, "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] }, "name": { "type": "string", "maxLength": 255 } }, "required": [ "type", "address", "role", "name" ] }, "EmailInviteUserDto": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "email" ] }, "email": { "type": "string", "format": "email", "maxLength": 255 }, "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] }, "name": { "type": "string", "maxLength": 255 } }, "required": [ "type", "email", "role", "name" ] }, "InviteUsersDto": { "type": "object", "properties": { "users": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/WalletInviteUserDto" }, { "$ref": "#/components/schemas/EmailInviteUserDto" } ] } } }, "required": [ "users" ] }, "Invitation": { "type": "object", "properties": { "userId": { "type": "number" }, "name": { "type": "string" }, "spaceUuid": { "type": "string", "description": "Space UUID" }, "role": { "type": "string", "enum": [ "ADMIN", "MEMBER" ] }, "status": { "type": "string", "enum": [ "INVITED", "ACTIVE", "DECLINED" ] }, "invitedBy": { "type": "number", "nullable": true } }, "required": [ "userId", "name", "spaceUuid", "role", "status", "invitedBy" ] }, "AcceptInviteDto": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 255 } }, "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": "number", "nullable": true }, "inviteExpiresAt": { "format": "date-time", "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", "invitedBy", "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" ] }, "SurveyOptionDto": { "type": "object", "properties": { "key": { "type": "string" }, "label": { "type": "string" }, "description": { "type": "string" }, "icon": { "type": "string" } }, "required": [ "key", "label" ] }, "SurveyPageDto": { "type": "object", "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "subtitle": { "type": "string", "nullable": true }, "multiSelect": { "type": "boolean" }, "options": { "type": "array", "items": { "$ref": "#/components/schemas/SurveyOptionDto" } } }, "required": [ "id", "title", "subtitle", "multiSelect", "options" ] }, "SurveyContentDto": { "type": "object", "properties": { "pages": { "type": "array", "items": { "$ref": "#/components/schemas/SurveyPageDto" } } }, "required": [ "pages" ] }, "SurveyDto": { "type": "object", "properties": { "id": { "type": "number" }, "slug": { "type": "string" }, "version": { "type": "number" }, "title": { "type": "string" }, "subtitle": { "type": "string", "nullable": true }, "surveyContent": { "$ref": "#/components/schemas/SurveyContentDto" } }, "required": [ "id", "slug", "version", "title", "subtitle", "surveyContent" ] }, "SpaceSurveyResponseDto": { "type": "object", "properties": { "surveyVersion": { "type": "number" }, "selections": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } }, "description": "Map from page id → selected option keys" }, "submittedAt": { "format": "date-time", "type": "string" }, "updatedAt": { "format": "date-time", "type": "string" }, "answeredByUserId": { "type": "number", "nullable": true } }, "required": [ "surveyVersion", "selections", "submittedAt", "updatedAt", "answeredByUserId" ] }, "SurveyStateDto": { "type": "object", "properties": { "survey": { "$ref": "#/components/schemas/SurveyDto" }, "surveyResponse": { "nullable": true, "type": "object", "allOf": [ { "$ref": "#/components/schemas/SpaceSurveyResponseDto" } ] } }, "required": [ "survey", "surveyResponse" ] }, "SubmitSurveyResponseDto": { "type": "object", "properties": { "selections": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } }, "description": "Map from page id → selected option keys", "example": { "use_cases": [ "run_payments", "hold_assets" ] } } }, "required": [ "selections" ] }, "SurveyResponseResultDto": { "type": "object", "properties": { "id": { "type": "number" }, "spaceUuid": { "type": "string", "description": "Space UUID" }, "surveySlug": { "type": "string" }, "surveyVersion": { "type": "number" }, "selections": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } } }, "submittedAt": { "format": "date-time", "type": "string" }, "updatedAt": { "format": "date-time", "type": "string" }, "answeredByUserId": { "type": "number", "nullable": true } }, "required": [ "id", "spaceUuid", "surveySlug", "surveyVersion", "selections", "submittedAt", "updatedAt", "answeredByUserId" ] }, "FeatureKey": { "type": "string", "enum": [ "safe_seats" ], "description": "Feature key from the entitlements catalog." }, "BinaryEntitlement": { "type": "object", "properties": { "feature": { "description": "Feature key from the entitlements catalog.", "allOf": [ { "$ref": "#/components/schemas/FeatureKey" } ] }, "enabled": { "type": "boolean", "description": "Whether the plan grants the feature at all. A metered feature reports its quota and usage even when this is false." }, "type": { "type": "string", "enum": [ "binary" ] } }, "required": [ "feature", "enabled", "type" ] }, "ValueEntitlement": { "type": "object", "properties": { "feature": { "description": "Feature key from the entitlements catalog.", "allOf": [ { "$ref": "#/components/schemas/FeatureKey" } ] }, "enabled": { "type": "boolean", "description": "Whether the plan grants the feature at all. A metered feature reports its quota and usage even when this is false." }, "type": { "type": "string", "enum": [ "value" ] }, "value": { "type": "string", "nullable": true } }, "required": [ "feature", "enabled", "type", "value" ] }, "MeteredEntitlement": { "type": "object", "properties": { "feature": { "description": "Feature key from the entitlements catalog.", "allOf": [ { "$ref": "#/components/schemas/FeatureKey" } ] }, "enabled": { "type": "boolean", "description": "Whether the plan grants the feature at all. A metered feature reports its quota and usage even when this is false." }, "type": { "type": "string", "enum": [ "metered" ] }, "quota": { "type": "number", "nullable": true, "description": "The plan's quota, never inflated to match usage; null means unlimited." }, "used": { "type": "number", "description": "May legally exceed `quota`." }, "resetsAt": { "format": "date-time", "type": "string", "nullable": true, "description": "Null for stock-type features (seats) that have no reset window." } }, "required": [ "feature", "enabled", "type", "quota", "used", "resetsAt" ] }, "EntitlementsPlan": { "type": "object", "properties": { "id": { "type": "string", "description": "Plan identifier in the billing service" }, "name": { "type": "string", "nullable": true }, "cycleEndsAt": { "format": "date-time", "type": "string", "nullable": true, "description": "End of the current billing cycle" } }, "required": [ "id", "name", "cycleEndsAt" ] }, "EntitlementsResponse": { "type": "object", "properties": { "plan": { "nullable": true, "description": "Null when the workspace has no active subscription.", "type": "object", "allOf": [ { "$ref": "#/components/schemas/EntitlementsPlan" } ] }, "entitlements": { "type": "array", "description": "One entry per catalog feature. Which fields an entry carries is decided by `type`: a metered one always carries quota, usage and its reset window, and the others never do.", "items": { "oneOf": [ { "$ref": "#/components/schemas/BinaryEntitlement" }, { "$ref": "#/components/schemas/ValueEntitlement" }, { "$ref": "#/components/schemas/MeteredEntitlement" } ], "discriminator": { "propertyName": "type", "mapping": { "binary": "#/components/schemas/BinaryEntitlement", "value": "#/components/schemas/ValueEntitlement", "metered": "#/components/schemas/MeteredEntitlement" } } } } }, "required": [ "plan", "entitlements" ] }, "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." }, "safeTxHash": { "type": "string", "description": "Safe transaction hash for relay-fee eligibility check" }, "acceptUnverifiedSimulation": { "type": "boolean", "description": "Set to true to proceed with the relay when a previous attempt returned INDETERMINATE_SIMULATION. The user has acknowledged the simulation could not be completed and accepts the risk." } }, "required": [ "version", "to", "data" ] }, "Relay": { "type": "object", "properties": { "taskId": { "type": "string" } }, "required": [ "taskId" ] }, "RelayErrorResponse": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "SIMULATION_FAILED", "INDETERMINATE_SIMULATION" ], "description": "Stable identifier of the error condition. The frontend MUST branch on this value (not on `message`, which is informational and may change)." }, "message": { "type": "string", "description": "Human-readable description of the error. Informational only; do not parse." }, "statusCode": { "type": "number", "example": 422 } }, "required": [ "code", "message", "statusCode" ] }, "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, "type": "object", "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, "type": "object", "allOf": [ { "$ref": "#/components/schemas/AddressInfo" } ] }, "guard": { "nullable": true, "type": "object", "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