diff --git a/.changeset/codegen-bump-2026-10.yml b/.changeset/codegen-bump-2026-10.yml new file mode 100644 index 0000000..ed7ed1f --- /dev/null +++ b/.changeset/codegen-bump-2026-10.yml @@ -0,0 +1,13 @@ +type: minor +packages: [ http, sdk-types ] +changelog: |- + Regenerate the SDK from the current public API schema. Main additions: send transaction V2 (eth_send_transaction and sol_send_transaction now use the V2 intents), swaps, earn, secrets, and transaction history. The default polling budget is now 10 retries at 1 second (was 3), and send_signed_request flattens versioned result keys such as ethSendTransactionResultV2. + + Breaking changes: + - EthSendTransactionBody uses the V2 intent: `to`, `value`, and `data` are gone; `calls: List[v1EthCallParams]` is required. + - SolSendTransactionBody uses the V2 intent: `signWith` is gone; `signWiths: List[str]` is required. + - CreateOauthProvidersBody.oauthProviders is `List[v1OauthProviderParamsV2]`, and the method sends V2. + - Oauth2AuthenticateBody.nonce is required. + - v1User.mfaPolicies is a required response field. + - v1FiatOnRampBlockchainNetwork no longer has FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BITCOIN. + - v1CreateTvcDeploymentIntent drops pivotBindAddresses and requires healthCheckType, healthCheckPort, and publicIngressPort. diff --git a/codegen/README.md b/codegen/README.md index dc5f853..57b80df 100644 --- a/codegen/README.md +++ b/codegen/README.md @@ -22,5 +22,11 @@ make generate-http # Generate HTTP client only - `pydantic_helpers.py` - Helper functions for Pydantic model generation - `generate_types.py` - Generates type definitions - `generate_http.py` - Generates HTTP client +- `constants.py` - Pinned activity versions (`VERSIONED_ACTIVITY_TYPES`) and other fixed tables +- `activity_versions.json` - Snapshot of the activity type each client method sends + +## Activity versions + +Unpinned activities take their version from the schema's request definition, so a new schema can move a method to a new version. `make generate-http` compares the versions it is about to emit with `activity_versions.json` and stops if any method moved. To keep the old version, pin it in `constants.py`. To accept the move, list it in the PR and rerun with `CODEGEN_ACCEPT_VERSION_CHANGES=1 make generate-http`, which rewrites the snapshot. This is not a package and is not published to PyPI. It's only used during development. diff --git a/codegen/activity_versions.json b/codegen/activity_versions.json new file mode 100644 index 0000000..0cafcbc --- /dev/null +++ b/codegen/activity_versions.json @@ -0,0 +1,116 @@ +{ + "claim_earn_fees": "ACTIVITY_TYPE_CLAIM_EARN_FEES", + "claim_swap_fees": "ACTIVITY_TYPE_CLAIM_SWAP_FEES", + "create_api_keys": "ACTIVITY_TYPE_CREATE_API_KEYS_V2", + "create_authenticators": "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", + "create_fiat_on_ramp_credential": "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", + "create_invitations": "ACTIVITY_TYPE_CREATE_INVITATIONS", + "create_mfa_policy": "ACTIVITY_TYPE_CREATE_MFA_POLICY", + "create_oauth2_credential": "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", + "create_oauth_providers": "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS_V2", + "create_policies": "ACTIVITY_TYPE_CREATE_POLICIES", + "create_policy": "ACTIVITY_TYPE_CREATE_POLICY_V3", + "create_private_key_tag": "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", + "create_private_keys": "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", + "create_read_only_session": "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", + "create_read_write_session": "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", + "create_session_profile": "ACTIVITY_TYPE_CREATE_SESSION_PROFILE", + "create_smart_contract_interface": "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", + "create_sub_organization": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", + "create_swap_quote": "ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V3", + "create_tvc_app": "ACTIVITY_TYPE_CREATE_TVC_APP", + "create_tvc_deployment": "ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT", + "create_tvc_manifest_approvals": "ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS", + "create_tvc_operator": "ACTIVITY_TYPE_CREATE_TVC_OPERATOR", + "create_tvc_quorum_key": "ACTIVITY_TYPE_CREATE_TVC_QUORUM_KEY", + "create_user_tag": "ACTIVITY_TYPE_CREATE_USER_TAG", + "create_users": "ACTIVITY_TYPE_CREATE_USERS_V3", + "create_wallet": "ACTIVITY_TYPE_CREATE_WALLET", + "create_wallet_accounts": "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", + "create_webhook_endpoint": "ACTIVITY_TYPE_CREATE_WEBHOOK_ENDPOINT", + "delete_api_keys": "ACTIVITY_TYPE_DELETE_API_KEYS", + "delete_authenticators": "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", + "delete_fiat_on_ramp_credential": "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", + "delete_invitation": "ACTIVITY_TYPE_DELETE_INVITATION", + "delete_mfa_policy": "ACTIVITY_TYPE_DELETE_MFA_POLICY", + "delete_oauth2_credential": "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", + "delete_oauth_providers": "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", + "delete_policies": "ACTIVITY_TYPE_DELETE_POLICIES", + "delete_policy": "ACTIVITY_TYPE_DELETE_POLICY", + "delete_private_key_tags": "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", + "delete_private_keys": "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", + "delete_secrets": "ACTIVITY_TYPE_DELETE_SECRETS", + "delete_smart_contract_interface": "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", + "delete_sub_organization": "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", + "delete_tvc_app_and_deployments": "ACTIVITY_TYPE_DELETE_TVC_APP_AND_DEPLOYMENTS", + "delete_tvc_deployment": "ACTIVITY_TYPE_DELETE_TVC_DEPLOYMENT", + "delete_user_tags": "ACTIVITY_TYPE_DELETE_USER_TAGS", + "delete_users": "ACTIVITY_TYPE_DELETE_USERS", + "delete_wallet_accounts": "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", + "delete_wallets": "ACTIVITY_TYPE_DELETE_WALLETS", + "delete_webhook_endpoint": "ACTIVITY_TYPE_DELETE_WEBHOOK_ENDPOINT", + "earn_claim_rewards": "ACTIVITY_TYPE_EARN_CLAIM_REWARDS", + "earn_deploy_wrapper": "ACTIVITY_TYPE_EARN_DEPLOY_WRAPPER", + "earn_deposit": "ACTIVITY_TYPE_EARN_DEPOSIT", + "earn_set_wrapper_state": "ACTIVITY_TYPE_EARN_SET_WRAPPER_STATE", + "earn_withdraw": "ACTIVITY_TYPE_EARN_WITHDRAW", + "email_auth": "ACTIVITY_TYPE_EMAIL_AUTH_V3", + "eth_send_transaction": "ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2", + "eth_undelegate7702": "ACTIVITY_TYPE_ETH_UNDELEGATE_7702", + "execute_swap": "ACTIVITY_TYPE_EXECUTE_SWAP_V3", + "export_private_key": "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", + "export_secrets": "ACTIVITY_TYPE_EXPORT_SECRETS", + "export_wallet": "ACTIVITY_TYPE_EXPORT_WALLET", + "export_wallet_account": "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", + "import_private_key": "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", + "import_secrets": "ACTIVITY_TYPE_IMPORT_SECRETS", + "import_wallet": "ACTIVITY_TYPE_IMPORT_WALLET", + "init_fiat_on_ramp": "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", + "init_import_private_key": "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", + "init_import_secrets": "ACTIVITY_TYPE_INIT_IMPORT_SECRETS", + "init_import_wallet": "ACTIVITY_TYPE_INIT_IMPORT_WALLET", + "init_otp": "ACTIVITY_TYPE_INIT_OTP_V3", + "init_otp_auth": "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", + "init_user_email_recovery": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", + "oauth": "ACTIVITY_TYPE_OAUTH", + "oauth2_authenticate": "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", + "oauth_login": "ACTIVITY_TYPE_OAUTH_LOGIN", + "otp_auth": "ACTIVITY_TYPE_OTP_AUTH", + "otp_login": "ACTIVITY_TYPE_OTP_LOGIN_V2", + "post_tvc_quorum_key_share": "ACTIVITY_TYPE_POST_TVC_QUORUM_KEY_SHARE", + "re_encrypt_tvc_quorum_key_share": "ACTIVITY_TYPE_RE_ENCRYPT_TVC_QUORUM_KEY_SHARE", + "recover_user": "ACTIVITY_TYPE_RECOVER_USER", + "remove_ip_allowlist": "ACTIVITY_TYPE_REMOVE_IP_ALLOWLIST", + "remove_organization_feature": "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", + "restore_tvc_deployment": "ACTIVITY_TYPE_RESTORE_TVC_DEPLOYMENT", + "set_ip_allowlist": "ACTIVITY_TYPE_SET_IP_ALLOWLIST", + "set_organization_feature": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", + "sign_raw_payload": "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", + "sign_raw_payloads": "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", + "sign_transaction": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", + "sol_send_transaction": "ACTIVITY_TYPE_SOL_SEND_TRANSACTION_V2", + "spark_claim_transfer": "ACTIVITY_TYPE_SPARK_CLAIM_TRANSFER", + "spark_prepare_lightning_receive": "ACTIVITY_TYPE_SPARK_PREPARE_LIGHTNING_RECEIVE", + "spark_prepare_transfer": "ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER", + "spark_sign_frost": "ACTIVITY_TYPE_SPARK_SIGN_FROST", + "stamp_login": "ACTIVITY_TYPE_STAMP_LOGIN", + "update_fiat_on_ramp_credential": "ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL", + "update_mfa_policy": "ACTIVITY_TYPE_UPDATE_MFA_POLICY", + "update_oauth2_credential": "ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL", + "update_organization_name": "ACTIVITY_TYPE_UPDATE_ORGANIZATION_NAME", + "update_policy": "ACTIVITY_TYPE_UPDATE_POLICY_V2", + "update_private_key_tag": "ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG", + "update_root_quorum": "ACTIVITY_TYPE_UPDATE_ROOT_QUORUM", + "update_tvc_app_live_deployment": "ACTIVITY_TYPE_UPDATE_TVC_APP_LIVE_DEPLOYMENT", + "update_user": "ACTIVITY_TYPE_UPDATE_USER", + "update_user_email": "ACTIVITY_TYPE_UPDATE_USER_EMAIL", + "update_user_name": "ACTIVITY_TYPE_UPDATE_USER_NAME", + "update_user_phone_number": "ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER", + "update_user_tag": "ACTIVITY_TYPE_UPDATE_USER_TAG", + "update_wallet": "ACTIVITY_TYPE_UPDATE_WALLET", + "update_webhook_endpoint": "ACTIVITY_TYPE_UPDATE_WEBHOOK_ENDPOINT", + "upsert_swap_config": "ACTIVITY_TYPE_UPSERT_SWAP_CONFIG", + "upsert_swap_fee_sponsorship_limit_config": "ACTIVITY_TYPE_UPSERT_SWAP_FEE_SPONSORSHIP_LIMIT_CONFIG", + "upsert_swap_fixed_rate_limit_config": "ACTIVITY_TYPE_UPSERT_SWAP_FIXED_RATE_LIMIT_CONFIG", + "verify_otp": "ACTIVITY_TYPE_VERIFY_OTP_V2" +} diff --git a/codegen/constants.py b/codegen/constants.py index ac53c29..620c250 100644 --- a/codegen/constants.py +++ b/codegen/constants.py @@ -86,6 +86,23 @@ "v1OtpLoginIntentV2", "v1OtpLoginResult", ), + # Moved to V2 in the October 2026 regen, in step with the TypeScript SDK. Pinned so a + # later schema cannot move them again without a visible diff here. + "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS": ( + "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS_V2", + "v1CreateOauthProvidersIntentV2", + "v1CreateOauthProvidersResultV2", + ), + "ACTIVITY_TYPE_ETH_SEND_TRANSACTION": ( + "ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2", + "v1EthSendTransactionIntentV2", + "v1EthSendTransactionResultV2", + ), + "ACTIVITY_TYPE_SOL_SEND_TRANSACTION": ( + "ACTIVITY_TYPE_SOL_SEND_TRANSACTION_V2", + "v1SolSendTransactionIntentV2", + "v1SolSendTransactionResultV2", + ), } # Methods that have only optional parameters diff --git a/codegen/http/generate_http.py b/codegen/http/generate_http.py index 3bc57b8..b92b4e9 100644 --- a/codegen/http/generate_http.py +++ b/codegen/http/generate_http.py @@ -2,6 +2,7 @@ """Generate HTTP client from OpenAPI specification.""" import json +import re import subprocess import sys from pathlib import Path @@ -21,6 +22,7 @@ extract_latest_versions, method_type_from_method_name, resolve_versioned_activity_type, + get_versioned_result_type, ) # Get the project root directory @@ -30,6 +32,65 @@ OUTPUT_FILE = OUTPUT_DIR / "client.py" +def get_request_activity_type( + definitions: Dict[str, Any], operation: Dict[str, Any] +) -> str | None: + """Return the activity type from the request definition's "type" enum, if any.""" + for param in operation.get("parameters", []): + if param.get("in") == "body" and "$ref" in param.get("schema", {}): + request_type_name = param["schema"]["$ref"].replace("#/definitions/", "") + request_def = definitions.get(request_type_name, {}) + enum = request_def.get("properties", {}).get("type", {}).get("enum") + if enum: + return enum[0] + return None + + +VERSIONS_FILE = PROJECT_ROOT / "codegen" / "activity_versions.json" + +# Filled while generating: snake_case method name -> activity type the client sends. +SENT_ACTIVITY_TYPES: Dict[str, str] = {} + + +def check_activity_versions(sent: Dict[str, str]) -> None: + """Fail when a method's sent activity type differs from codegen/activity_versions.json. + + A regen takes unpinned activity versions from the schema, so a new schema can move a + method to a new version with only a one-line change buried in client.py. This makes + every such move a visible diff in the snapshot. Set CODEGEN_ACCEPT_VERSION_CHANGES=1 + to rewrite the snapshot after reviewing the moves. + """ + import os + + previous: Dict[str, str] = {} + if VERSIONS_FILE.exists(): + previous = json.loads(VERSIONS_FILE.read_text()) + moved = { + name: (previous.get(name), sent[name]) + for name in sorted(sent) + if previous.get(name) != sent[name] + } + if not moved and VERSIONS_FILE.exists(): + return + if ( + moved + and VERSIONS_FILE.exists() + and not os.environ.get("CODEGEN_ACCEPT_VERSION_CHANGES") + ): + lines = [ + f" {name}: {old or '(new)'} -> {new}" for name, (old, new) in moved.items() + ] + raise SystemExit( + "Activity versions changed for these methods:\n" + + "\n".join(lines) + + "\nPin them in codegen/constants.py to keep the old version, or list the moves " + "in the PR and rerun with CODEGEN_ACCEPT_VERSION_CHANGES=1 to update " + f"{VERSIONS_FILE.name}." + ) + VERSIONS_FILE.write_text(json.dumps(dict(sorted(sent.items())), indent=2) + "\n") + print(f"📝 Updated {VERSIONS_FILE} ({len(moved)} change(s))") + + def generate_sdk_client(swagger: Dict[str, Any]) -> str: """Generate the SDK client from Swagger spec.""" namespace = next( @@ -50,7 +111,7 @@ def __init__( organization_id: str, default_timeout: int = 30, polling_interval_ms: int = 1000, - max_polling_retries: int = 3 + max_polling_retries: int = 10 ): \"\"\"Initialize the Turnkey client. @@ -292,18 +353,15 @@ def send_signed_request(self, signed_request: SignedRequest, response_type: type activity_dict = activity.model_dump(by_alias=True, exclude_none=True) if hasattr(activity, 'model_dump') else {} payload["activity"] = activity_dict - # Extract result fields if activity completed successfully - if activity.status == "ACTIVITY_STATUS_COMPLETED" and hasattr(activity, 'result') and activity.result: - result = activity.result - # Find the first result field (e.g., createApiKeysResult, createPolicyResult, etc.) - for attr_name in dir(result): - if not attr_name.startswith('_') and attr_name.endswith('Result'): - result_data = getattr(result, attr_name, None) - if result_data and hasattr(result_data, 'model_dump'): - # Flatten result fields into payload - result_dict = result_data.model_dump(by_alias=True, exclude_none=True) - payload.update(result_dict) - break + # Flatten the result that is set, whatever its version suffix + # (e.g., createPolicyResult, ethSendTransactionResultV2, createSubOrganizationResultV7) + result = activity.result + if activity.status == "ACTIVITY_STATUS_COMPLETED" and result is not None: + for field_name in type(result).model_fields: + result_data = getattr(result, field_name, None) + if result_data is not None: + payload.update(result_data.model_dump(by_alias=True, exclude_none=True)) + break return response_type(**payload) if response_type is not None else payload """) @@ -425,8 +483,36 @@ def stamp_{snake_method_name}(self, input: {input_type}) -> SignedRequest: """) elif method_type == "activity": - result_key = operation_name_without_namespace + "Result" - versioned_method_name = latest_versions[result_key]["formatted_key_name"] + # Use the activity type from the request definition. A pinned + # version in VERSIONED_ACTIVITY_TYPES takes precedence. + schema_activity_type = get_request_activity_type( + swagger["definitions"], operation + ) + if schema_activity_type: + unversioned_activity_type = re.sub(r"_V\d+$", "", schema_activity_type) + pinned_activity_type = resolve_versioned_activity_type( + unversioned_activity_type + ) + versioned_activity_type = ( + pinned_activity_type + if pinned_activity_type != unversioned_activity_type + else schema_activity_type + ) + + SENT_ACTIVITY_TYPES[snake_method_name] = versioned_activity_type + + # Use the pinned result type if there is one, else the latest version + pinned_result_type = get_versioned_result_type(unversioned_activity_type) + if pinned_result_type and pinned_result_type in swagger["definitions"]: + pinned_result_key = re.sub(r"^v\d+", "", pinned_result_type) + versioned_method_name = ( + pinned_result_key[0].lower() + pinned_result_key[1:] + ) + else: + result_key = operation_name_without_namespace + "Result" + versioned_method_name = latest_versions[result_key][ + "formatted_key_name" + ] code_buffer.append(f""" def {snake_method_name}(self, input: {input_type}) -> {response_type}: @@ -555,6 +641,8 @@ def main(): OUTPUT_DIR.mkdir(parents=True, exist_ok=True) # Write output + check_activity_versions(SENT_ACTIVITY_TYPES) + with open(OUTPUT_FILE, "w") as f: f.write(output) diff --git a/codegen/utils.py b/codegen/utils.py index dcaf713..422494a 100644 --- a/codegen/utils.py +++ b/codegen/utils.py @@ -72,9 +72,11 @@ def method_type_from_method_name(method_name: str) -> str: method_name_lower.startswith("get") or method_name_lower.startswith("list") or method_name_lower.startswith("test") + or method_name_lower.startswith("validate") or method_name_lower.startswith("tget") or method_name_lower.startswith("tlist") or method_name_lower.startswith("ttest") + or method_name_lower.startswith("tvalidate") ): return "query" return "activity" diff --git a/packages/http/src/turnkey_http/generated/client.py b/packages/http/src/turnkey_http/generated/client.py index 94e9b51..2e4ef16 100644 --- a/packages/http/src/turnkey_http/generated/client.py +++ b/packages/http/src/turnkey_http/generated/client.py @@ -28,7 +28,7 @@ def __init__( organization_id: str, default_timeout: int = 30, polling_interval_ms: int = 1000, - max_polling_retries: int = 3, + max_polling_retries: int = 10, ): """Initialize the Turnkey client. @@ -281,27 +281,52 @@ def send_signed_request( ) payload["activity"] = activity_dict - # Extract result fields if activity completed successfully - if ( - activity.status == "ACTIVITY_STATUS_COMPLETED" - and hasattr(activity, "result") - and activity.result - ): - result = activity.result - # Find the first result field (e.g., createApiKeysResult, createPolicyResult, etc.) - for attr_name in dir(result): - if not attr_name.startswith("_") and attr_name.endswith("Result"): - result_data = getattr(result, attr_name, None) - if result_data and hasattr(result_data, "model_dump"): - # Flatten result fields into payload - result_dict = result_data.model_dump( - by_alias=True, exclude_none=True - ) - payload.update(result_dict) - break + # Flatten the result that is set, whatever its version suffix + # (e.g., createPolicyResult, ethSendTransactionResultV2, createSubOrganizationResultV7) + result = activity.result + if activity.status == "ACTIVITY_STATUS_COMPLETED" and result is not None: + for field_name in type(result).model_fields: + result_data = getattr(result, field_name, None) + if result_data is not None: + payload.update( + result_data.model_dump(by_alias=True, exclude_none=True) + ) + break return response_type(**payload) if response_type is not None else payload + def get_active_policies( + self, input: GetActivePoliciesBody + ) -> GetActivePoliciesResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/get_active_policies", body, GetActivePoliciesResponse + ) + + def stamp_get_active_policies(self, input: GetActivePoliciesBody) -> SignedRequest: + """Stamp a getActivePolicies request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/get_active_policies" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + def get_activity(self, input: GetActivityBody) -> GetActivityResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -396,6 +421,36 @@ def stamp_get_api_keys( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) + def get_app_status(self, input: GetAppStatusBody) -> GetAppStatusResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/get_app_status", body, GetAppStatusResponse + ) + + def stamp_get_app_status(self, input: GetAppStatusBody) -> SignedRequest: + """Stamp a getAppStatus request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/get_app_status" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + def get_authenticator( self, input: GetAuthenticatorBody ) -> GetAuthenticatorResponse: @@ -490,7 +545,9 @@ def stamp_get_boot_proof(self, input: GetBootProofBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_gas_usage(self, input: GetGasUsageBody) -> GetGasUsageResponse: + def get_claim_earn_fees_status( + self, input: GetClaimEarnFeesStatusBody + ) -> GetClaimEarnFeesStatusResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -499,11 +556,15 @@ def get_gas_usage(self, input: GetGasUsageBody) -> GetGasUsageResponse: body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_gas_usage", body, GetGasUsageResponse + "/public/v1/query/get_claim_earn_fees_status", + body, + GetClaimEarnFeesStatusResponse, ) - def stamp_get_gas_usage(self, input: GetGasUsageBody) -> SignedRequest: - """Stamp a getGasUsage request without sending it.""" + def stamp_get_claim_earn_fees_status( + self, input: GetClaimEarnFeesStatusBody + ) -> SignedRequest: + """Stamp a getClaimEarnFeesStatus request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -512,7 +573,7 @@ def stamp_get_gas_usage(self, input: GetGasUsageBody) -> SignedRequest: body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_gas_usage" + full_url = self.base_url + "/public/v1/query/get_claim_earn_fees_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -520,9 +581,9 @@ def stamp_get_gas_usage(self, input: GetGasUsageBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_latest_boot_proof( - self, input: GetLatestBootProofBody - ) -> GetLatestBootProofResponse: + def get_earn_claim_rewards_status( + self, input: GetEarnClaimRewardsStatusBody + ) -> GetEarnClaimRewardsStatusResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -531,13 +592,15 @@ def get_latest_boot_proof( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_latest_boot_proof", body, GetLatestBootProofResponse + "/public/v1/query/get_earn_claim_rewards_status", + body, + GetEarnClaimRewardsStatusResponse, ) - def stamp_get_latest_boot_proof( - self, input: GetLatestBootProofBody + def stamp_get_earn_claim_rewards_status( + self, input: GetEarnClaimRewardsStatusBody ) -> SignedRequest: - """Stamp a getLatestBootProof request without sending it.""" + """Stamp a getEarnClaimRewardsStatus request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -546,7 +609,7 @@ def stamp_get_latest_boot_proof( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_latest_boot_proof" + full_url = self.base_url + "/public/v1/query/get_earn_claim_rewards_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -554,7 +617,9 @@ def stamp_get_latest_boot_proof( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_nonces(self, input: GetNoncesBody) -> GetNoncesResponse: + def get_earn_deploy_status( + self, input: GetEarnDeployStatusBody + ) -> GetEarnDeployStatusResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -562,10 +627,14 @@ def get_nonces(self, input: GetNoncesBody) -> GetNoncesResponse: body = {"organizationId": organization_id, **input_dict} - return self._request("/public/v1/query/get_nonces", body, GetNoncesResponse) + return self._request( + "/public/v1/query/get_earn_deploy_status", body, GetEarnDeployStatusResponse + ) - def stamp_get_nonces(self, input: GetNoncesBody) -> SignedRequest: - """Stamp a getNonces request without sending it.""" + def stamp_get_earn_deploy_status( + self, input: GetEarnDeployStatusBody + ) -> SignedRequest: + """Stamp a getEarnDeployStatus request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -574,7 +643,7 @@ def stamp_get_nonces(self, input: GetNoncesBody) -> SignedRequest: body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_nonces" + full_url = self.base_url + "/public/v1/query/get_earn_deploy_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -582,9 +651,9 @@ def stamp_get_nonces(self, input: GetNoncesBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_oauth2_credential( - self, input: GetOauth2CredentialBody - ) -> GetOauth2CredentialResponse: + def get_earn_deposit_status( + self, input: GetEarnDepositStatusBody + ) -> GetEarnDepositStatusResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -593,13 +662,15 @@ def get_oauth2_credential( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_oauth2_credential", body, GetOauth2CredentialResponse + "/public/v1/query/get_earn_deposit_status", + body, + GetEarnDepositStatusResponse, ) - def stamp_get_oauth2_credential( - self, input: GetOauth2CredentialBody + def stamp_get_earn_deposit_status( + self, input: GetEarnDepositStatusBody ) -> SignedRequest: - """Stamp a getOauth2Credential request without sending it.""" + """Stamp a getEarnDepositStatus request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -608,7 +679,7 @@ def stamp_get_oauth2_credential( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_oauth2_credential" + full_url = self.base_url + "/public/v1/query/get_earn_deposit_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -616,9 +687,9 @@ def stamp_get_oauth2_credential( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_oauth_providers( - self, input: GetOauthProvidersBody - ) -> GetOauthProvidersResponse: + def get_earn_withdraw_status( + self, input: GetEarnWithdrawStatusBody + ) -> GetEarnWithdrawStatusResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -627,11 +698,15 @@ def get_oauth_providers( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_oauth_providers", body, GetOauthProvidersResponse + "/public/v1/query/get_earn_withdraw_status", + body, + GetEarnWithdrawStatusResponse, ) - def stamp_get_oauth_providers(self, input: GetOauthProvidersBody) -> SignedRequest: - """Stamp a getOauthProviders request without sending it.""" + def stamp_get_earn_withdraw_status( + self, input: GetEarnWithdrawStatusBody + ) -> SignedRequest: + """Stamp a getEarnWithdrawStatus request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -640,7 +715,7 @@ def stamp_get_oauth_providers(self, input: GetOauthProvidersBody) -> SignedReque body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_oauth_providers" + full_url = self.base_url + "/public/v1/query/get_earn_withdraw_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -648,9 +723,7 @@ def stamp_get_oauth_providers(self, input: GetOauthProvidersBody) -> SignedReque url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_on_ramp_transaction_status( - self, input: GetOnRampTransactionStatusBody - ) -> GetOnRampTransactionStatusResponse: + def get_gas_usage(self, input: GetGasUsageBody) -> GetGasUsageResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -659,15 +732,11 @@ def get_on_ramp_transaction_status( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_onramp_transaction_status", - body, - GetOnRampTransactionStatusResponse, + "/public/v1/query/get_gas_usage", body, GetGasUsageResponse ) - def stamp_get_on_ramp_transaction_status( - self, input: GetOnRampTransactionStatusBody - ) -> SignedRequest: - """Stamp a getOnRampTransactionStatus request without sending it.""" + def stamp_get_gas_usage(self, input: GetGasUsageBody) -> SignedRequest: + """Stamp a getGasUsage request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -676,7 +745,7 @@ def stamp_get_on_ramp_transaction_status( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_onramp_transaction_status" + full_url = self.base_url + "/public/v1/query/get_gas_usage" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -684,9 +753,7 @@ def stamp_get_on_ramp_transaction_status( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_organization_configs( - self, input: GetOrganizationConfigsBody - ) -> GetOrganizationConfigsResponse: + def get_ip_allowlist(self, input: GetIpAllowlistBody) -> GetIpAllowlistResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -695,15 +762,11 @@ def get_organization_configs( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_organization_configs", - body, - GetOrganizationConfigsResponse, + "/public/v1/query/get_ip_allowlist", body, GetIpAllowlistResponse ) - def stamp_get_organization_configs( - self, input: GetOrganizationConfigsBody - ) -> SignedRequest: - """Stamp a getOrganizationConfigs request without sending it.""" + def stamp_get_ip_allowlist(self, input: GetIpAllowlistBody) -> SignedRequest: + """Stamp a getIpAllowlist request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -712,7 +775,7 @@ def stamp_get_organization_configs( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_organization_configs" + full_url = self.base_url + "/public/v1/query/get_ip_allowlist" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -720,7 +783,9 @@ def stamp_get_organization_configs( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_policy(self, input: GetPolicyBody) -> GetPolicyResponse: + def get_latest_boot_proof( + self, input: GetLatestBootProofBody + ) -> GetLatestBootProofResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -728,10 +793,14 @@ def get_policy(self, input: GetPolicyBody) -> GetPolicyResponse: body = {"organizationId": organization_id, **input_dict} - return self._request("/public/v1/query/get_policy", body, GetPolicyResponse) + return self._request( + "/public/v1/query/get_latest_boot_proof", body, GetLatestBootProofResponse + ) - def stamp_get_policy(self, input: GetPolicyBody) -> SignedRequest: - """Stamp a getPolicy request without sending it.""" + def stamp_get_latest_boot_proof( + self, input: GetLatestBootProofBody + ) -> SignedRequest: + """Stamp a getLatestBootProof request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -740,7 +809,7 @@ def stamp_get_policy(self, input: GetPolicyBody) -> SignedRequest: body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_policy" + full_url = self.base_url + "/public/v1/query/get_latest_boot_proof" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -748,9 +817,7 @@ def stamp_get_policy(self, input: GetPolicyBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_policy_evaluations( - self, input: GetPolicyEvaluationsBody - ) -> GetPolicyEvaluationsResponse: + def get_mfa_policies(self, input: GetMfaPoliciesBody) -> GetMfaPoliciesResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -759,15 +826,11 @@ def get_policy_evaluations( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_policy_evaluations", - body, - GetPolicyEvaluationsResponse, + "/public/v1/query/get_mfa_policies", body, GetMfaPoliciesResponse ) - def stamp_get_policy_evaluations( - self, input: GetPolicyEvaluationsBody - ) -> SignedRequest: - """Stamp a getPolicyEvaluations request without sending it.""" + def stamp_get_mfa_policies(self, input: GetMfaPoliciesBody) -> SignedRequest: + """Stamp a getMfaPolicies request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -776,7 +839,7 @@ def stamp_get_policy_evaluations( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_policy_evaluations" + full_url = self.base_url + "/public/v1/query/get_mfa_policies" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -784,7 +847,7 @@ def stamp_get_policy_evaluations( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_private_key(self, input: GetPrivateKeyBody) -> GetPrivateKeyResponse: + def get_mfa_policy(self, input: GetMfaPolicyBody) -> GetMfaPolicyResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -793,11 +856,11 @@ def get_private_key(self, input: GetPrivateKeyBody) -> GetPrivateKeyResponse: body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_private_key", body, GetPrivateKeyResponse + "/public/v1/query/get_mfa_policy", body, GetMfaPolicyResponse ) - def stamp_get_private_key(self, input: GetPrivateKeyBody) -> SignedRequest: - """Stamp a getPrivateKey request without sending it.""" + def stamp_get_mfa_policy(self, input: GetMfaPolicyBody) -> SignedRequest: + """Stamp a getMfaPolicy request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -806,7 +869,7 @@ def stamp_get_private_key(self, input: GetPrivateKeyBody) -> SignedRequest: body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_private_key" + full_url = self.base_url + "/public/v1/query/get_mfa_policy" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -814,9 +877,7 @@ def stamp_get_private_key(self, input: GetPrivateKeyBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_send_transaction_status( - self, input: GetSendTransactionStatusBody - ) -> GetSendTransactionStatusResponse: + def get_mfa_status(self, input: GetMfaStatusBody) -> GetMfaStatusResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -825,15 +886,11 @@ def get_send_transaction_status( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_send_transaction_status", - body, - GetSendTransactionStatusResponse, + "/public/v1/query/get_mfa_status", body, GetMfaStatusResponse ) - def stamp_get_send_transaction_status( - self, input: GetSendTransactionStatusBody - ) -> SignedRequest: - """Stamp a getSendTransactionStatus request without sending it.""" + def stamp_get_mfa_status(self, input: GetMfaStatusBody) -> SignedRequest: + """Stamp a getMfaStatus request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -842,7 +899,7 @@ def stamp_get_send_transaction_status( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_send_transaction_status" + full_url = self.base_url + "/public/v1/query/get_mfa_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -850,9 +907,7 @@ def stamp_get_send_transaction_status( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_smart_contract_interface( - self, input: GetSmartContractInterfaceBody - ) -> GetSmartContractInterfaceResponse: + def get_nonces(self, input: GetNoncesBody) -> GetNoncesResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -860,16 +915,10 @@ def get_smart_contract_interface( body = {"organizationId": organization_id, **input_dict} - return self._request( - "/public/v1/query/get_smart_contract_interface", - body, - GetSmartContractInterfaceResponse, - ) + return self._request("/public/v1/query/get_nonces", body, GetNoncesResponse) - def stamp_get_smart_contract_interface( - self, input: GetSmartContractInterfaceBody - ) -> SignedRequest: - """Stamp a getSmartContractInterface request without sending it.""" + def stamp_get_nonces(self, input: GetNoncesBody) -> SignedRequest: + """Stamp a getNonces request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -878,7 +927,7 @@ def stamp_get_smart_contract_interface( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_smart_contract_interface" + full_url = self.base_url + "/public/v1/query/get_nonces" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -886,7 +935,9 @@ def stamp_get_smart_contract_interface( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_user(self, input: GetUserBody) -> GetUserResponse: + def get_oauth2_credential( + self, input: GetOauth2CredentialBody + ) -> GetOauth2CredentialResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -894,10 +945,14 @@ def get_user(self, input: GetUserBody) -> GetUserResponse: body = {"organizationId": organization_id, **input_dict} - return self._request("/public/v1/query/get_user", body, GetUserResponse) + return self._request( + "/public/v1/query/get_oauth2_credential", body, GetOauth2CredentialResponse + ) - def stamp_get_user(self, input: GetUserBody) -> SignedRequest: - """Stamp a getUser request without sending it.""" + def stamp_get_oauth2_credential( + self, input: GetOauth2CredentialBody + ) -> SignedRequest: + """Stamp a getOauth2Credential request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -906,7 +961,7 @@ def stamp_get_user(self, input: GetUserBody) -> SignedRequest: body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_user" + full_url = self.base_url + "/public/v1/query/get_oauth2_credential" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -914,7 +969,9 @@ def stamp_get_user(self, input: GetUserBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_wallet(self, input: GetWalletBody) -> GetWalletResponse: + def get_oauth_providers( + self, input: GetOauthProvidersBody + ) -> GetOauthProvidersResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -922,10 +979,12 @@ def get_wallet(self, input: GetWalletBody) -> GetWalletResponse: body = {"organizationId": organization_id, **input_dict} - return self._request("/public/v1/query/get_wallet", body, GetWalletResponse) + return self._request( + "/public/v1/query/get_oauth_providers", body, GetOauthProvidersResponse + ) - def stamp_get_wallet(self, input: GetWalletBody) -> SignedRequest: - """Stamp a getWallet request without sending it.""" + def stamp_get_oauth_providers(self, input: GetOauthProvidersBody) -> SignedRequest: + """Stamp a getOauthProviders request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -934,7 +993,7 @@ def stamp_get_wallet(self, input: GetWalletBody) -> SignedRequest: body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_wallet" + full_url = self.base_url + "/public/v1/query/get_oauth_providers" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -942,9 +1001,9 @@ def stamp_get_wallet(self, input: GetWalletBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_wallet_account( - self, input: GetWalletAccountBody - ) -> GetWalletAccountResponse: + def get_on_ramp_transaction_status( + self, input: GetOnRampTransactionStatusBody + ) -> GetOnRampTransactionStatusResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -953,11 +1012,15 @@ def get_wallet_account( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_wallet_account", body, GetWalletAccountResponse + "/public/v1/query/get_onramp_transaction_status", + body, + GetOnRampTransactionStatusResponse, ) - def stamp_get_wallet_account(self, input: GetWalletAccountBody) -> SignedRequest: - """Stamp a getWalletAccount request without sending it.""" + def stamp_get_on_ramp_transaction_status( + self, input: GetOnRampTransactionStatusBody + ) -> SignedRequest: + """Stamp a getOnRampTransactionStatus request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -966,7 +1029,7 @@ def stamp_get_wallet_account(self, input: GetWalletAccountBody) -> SignedRequest body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_wallet_account" + full_url = self.base_url + "/public/v1/query/get_onramp_transaction_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -974,9 +1037,9 @@ def stamp_get_wallet_account(self, input: GetWalletAccountBody) -> SignedRequest url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_wallet_address_balances( - self, input: GetWalletAddressBalancesBody - ) -> GetWalletAddressBalancesResponse: + def get_organization_configs( + self, input: GetOrganizationConfigsBody + ) -> GetOrganizationConfigsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -985,15 +1048,15 @@ def get_wallet_address_balances( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/get_wallet_address_balances", + "/public/v1/query/get_organization_configs", body, - GetWalletAddressBalancesResponse, + GetOrganizationConfigsResponse, ) - def stamp_get_wallet_address_balances( - self, input: GetWalletAddressBalancesBody + def stamp_get_organization_configs( + self, input: GetOrganizationConfigsBody ) -> SignedRequest: - """Stamp a getWalletAddressBalances request without sending it.""" + """Stamp a getOrganizationConfigs request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1002,7 +1065,7 @@ def stamp_get_wallet_address_balances( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/get_wallet_address_balances" + full_url = self.base_url + "/public/v1/query/get_organization_configs" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1010,39 +1073,27 @@ def stamp_get_wallet_address_balances( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_activities( - self, input: Optional[GetActivitiesBody] = None - ) -> GetActivitiesResponse: - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) - + def get_policy(self, input: GetPolicyBody) -> GetPolicyResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - return self._request( - "/public/v1/query/list_activities", body, GetActivitiesResponse - ) + return self._request("/public/v1/query/get_policy", body, GetPolicyResponse) - def stamp_get_activities( - self, input: Optional[GetActivitiesBody] = None - ) -> SignedRequest: - """Stamp a getActivities request without sending it.""" + def stamp_get_policy(self, input: GetPolicyBody) -> SignedRequest: + """Stamp a getPolicy request without sending it.""" - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_activities" + full_url = self.base_url + "/public/v1/query/get_policy" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1050,7 +1101,9 @@ def stamp_get_activities( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_app_proofs(self, input: GetAppProofsBody) -> GetAppProofsResponse: + def get_policy_evaluations( + self, input: GetPolicyEvaluationsBody + ) -> GetPolicyEvaluationsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1059,11 +1112,15 @@ def get_app_proofs(self, input: GetAppProofsBody) -> GetAppProofsResponse: body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_app_proofs", body, GetAppProofsResponse + "/public/v1/query/get_policy_evaluations", + body, + GetPolicyEvaluationsResponse, ) - def stamp_get_app_proofs(self, input: GetAppProofsBody) -> SignedRequest: - """Stamp a getAppProofs request without sending it.""" + def stamp_get_policy_evaluations( + self, input: GetPolicyEvaluationsBody + ) -> SignedRequest: + """Stamp a getPolicyEvaluations request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1072,7 +1129,7 @@ def stamp_get_app_proofs(self, input: GetAppProofsBody) -> SignedRequest: body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_app_proofs" + full_url = self.base_url + "/public/v1/query/get_policy_evaluations" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1080,9 +1137,7 @@ def stamp_get_app_proofs(self, input: GetAppProofsBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def list_fiat_on_ramp_credentials( - self, input: ListFiatOnRampCredentialsBody - ) -> ListFiatOnRampCredentialsResponse: + def get_private_key(self, input: GetPrivateKeyBody) -> GetPrivateKeyResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1091,15 +1146,11 @@ def list_fiat_on_ramp_credentials( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_fiat_on_ramp_credentials", - body, - ListFiatOnRampCredentialsResponse, + "/public/v1/query/get_private_key", body, GetPrivateKeyResponse ) - def stamp_list_fiat_on_ramp_credentials( - self, input: ListFiatOnRampCredentialsBody - ) -> SignedRequest: - """Stamp a listFiatOnRampCredentials request without sending it.""" + def stamp_get_private_key(self, input: GetPrivateKeyBody) -> SignedRequest: + """Stamp a getPrivateKey request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1108,7 +1159,7 @@ def stamp_list_fiat_on_ramp_credentials( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_fiat_on_ramp_credentials" + full_url = self.base_url + "/public/v1/query/get_private_key" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1116,9 +1167,9 @@ def stamp_list_fiat_on_ramp_credentials( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def list_oauth2_credentials( - self, input: ListOauth2CredentialsBody - ) -> ListOauth2CredentialsResponse: + def get_send_transaction_status( + self, input: GetSendTransactionStatusBody + ) -> GetSendTransactionStatusResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1127,15 +1178,15 @@ def list_oauth2_credentials( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_oauth2_credentials", + "/public/v1/query/get_send_transaction_status", body, - ListOauth2CredentialsResponse, + GetSendTransactionStatusResponse, ) - def stamp_list_oauth2_credentials( - self, input: ListOauth2CredentialsBody + def stamp_get_send_transaction_status( + self, input: GetSendTransactionStatusBody ) -> SignedRequest: - """Stamp a listOauth2Credentials request without sending it.""" + """Stamp a getSendTransactionStatus request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1144,7 +1195,7 @@ def stamp_list_oauth2_credentials( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_oauth2_credentials" + full_url = self.base_url + "/public/v1/query/get_send_transaction_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1152,39 +1203,31 @@ def stamp_list_oauth2_credentials( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_policies( - self, input: Optional[GetPoliciesBody] = None - ) -> GetPoliciesResponse: - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + def get_session_profile( + self, input: GetSessionProfileBody + ) -> GetSessionProfileResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_policies", body, GetPoliciesResponse + "/public/v1/query/get_session_profile", body, GetSessionProfileResponse ) - def stamp_get_policies( - self, input: Optional[GetPoliciesBody] = None - ) -> SignedRequest: - """Stamp a getPolicies request without sending it.""" + def stamp_get_session_profile(self, input: GetSessionProfileBody) -> SignedRequest: + """Stamp a getSessionProfile request without sending it.""" - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_policies" + full_url = self.base_url + "/public/v1/query/get_session_profile" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1192,9 +1235,9 @@ def stamp_get_policies( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def list_private_key_tags( - self, input: ListPrivateKeyTagsBody - ) -> ListPrivateKeyTagsResponse: + def get_session_profiles( + self, input: GetSessionProfilesBody + ) -> GetSessionProfilesResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1203,13 +1246,13 @@ def list_private_key_tags( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_private_key_tags", body, ListPrivateKeyTagsResponse + "/public/v1/query/get_session_profiles", body, GetSessionProfilesResponse ) - def stamp_list_private_key_tags( - self, input: ListPrivateKeyTagsBody + def stamp_get_session_profiles( + self, input: GetSessionProfilesBody ) -> SignedRequest: - """Stamp a listPrivateKeyTags request without sending it.""" + """Stamp a getSessionProfiles request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1218,7 +1261,7 @@ def stamp_list_private_key_tags( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_private_key_tags" + full_url = self.base_url + "/public/v1/query/get_session_profiles" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1226,39 +1269,35 @@ def stamp_list_private_key_tags( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_private_keys( - self, input: Optional[GetPrivateKeysBody] = None - ) -> GetPrivateKeysResponse: - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + def get_smart_contract_interface( + self, input: GetSmartContractInterfaceBody + ) -> GetSmartContractInterfaceResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_private_keys", body, GetPrivateKeysResponse + "/public/v1/query/get_smart_contract_interface", + body, + GetSmartContractInterfaceResponse, ) - def stamp_get_private_keys( - self, input: Optional[GetPrivateKeysBody] = None + def stamp_get_smart_contract_interface( + self, input: GetSmartContractInterfaceBody ) -> SignedRequest: - """Stamp a getPrivateKeys request without sending it.""" + """Stamp a getSmartContractInterface request without sending it.""" - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_private_keys" + full_url = self.base_url + "/public/v1/query/get_smart_contract_interface" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1266,9 +1305,9 @@ def stamp_get_private_keys( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_smart_contract_interfaces( - self, input: GetSmartContractInterfacesBody - ) -> GetSmartContractInterfacesResponse: + def get_swap_sponsorship_usage( + self, input: GetSwapSponsorshipUsageBody + ) -> GetSwapSponsorshipUsageResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1277,15 +1316,15 @@ def get_smart_contract_interfaces( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_smart_contract_interfaces", + "/public/v1/query/get_swap_sponsorship_usage", body, - GetSmartContractInterfacesResponse, + GetSwapSponsorshipUsageResponse, ) - def stamp_get_smart_contract_interfaces( - self, input: GetSmartContractInterfacesBody + def stamp_get_swap_sponsorship_usage( + self, input: GetSwapSponsorshipUsageBody ) -> SignedRequest: - """Stamp a getSmartContractInterfaces request without sending it.""" + """Stamp a getSwapSponsorshipUsage request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1294,7 +1333,7 @@ def stamp_get_smart_contract_interfaces( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_smart_contract_interfaces" + full_url = self.base_url + "/public/v1/query/get_swap_sponsorship_usage" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1302,39 +1341,29 @@ def stamp_get_smart_contract_interfaces( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_sub_org_ids( - self, input: Optional[GetSubOrgIdsBody] = None - ) -> GetSubOrgIdsResponse: - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + def get_swap_status(self, input: GetSwapStatusBody) -> GetSwapStatusResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_suborgs", body, GetSubOrgIdsResponse + "/public/v1/query/get_swap_status", body, GetSwapStatusResponse ) - def stamp_get_sub_org_ids( - self, input: Optional[GetSubOrgIdsBody] = None - ) -> SignedRequest: - """Stamp a getSubOrgIds request without sending it.""" + def stamp_get_swap_status(self, input: GetSwapStatusBody) -> SignedRequest: + """Stamp a getSwapStatus request without sending it.""" - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_suborgs" + full_url = self.base_url + "/public/v1/query/get_swap_status" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1342,9 +1371,7 @@ def stamp_get_sub_org_ids( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def list_supported_assets( - self, input: ListSupportedAssetsBody - ) -> ListSupportedAssetsResponse: + def get_tvc_app(self, input: GetTvcAppBody) -> GetTvcAppResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1352,14 +1379,10 @@ def list_supported_assets( body = {"organizationId": organization_id, **input_dict} - return self._request( - "/public/v1/query/list_supported_assets", body, ListSupportedAssetsResponse - ) + return self._request("/public/v1/query/get_tvc_app", body, GetTvcAppResponse) - def stamp_list_supported_assets( - self, input: ListSupportedAssetsBody - ) -> SignedRequest: - """Stamp a listSupportedAssets request without sending it.""" + def stamp_get_tvc_app(self, input: GetTvcAppBody) -> SignedRequest: + """Stamp a getTvcApp request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1368,7 +1391,7 @@ def stamp_list_supported_assets( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_supported_assets" + full_url = self.base_url + "/public/v1/query/get_tvc_app" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1376,39 +1399,31 @@ def stamp_list_supported_assets( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def list_user_tags( - self, input: Optional[ListUserTagsBody] = None - ) -> ListUserTagsResponse: - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + def get_tvc_deployment( + self, input: GetTvcDeploymentBody + ) -> GetTvcDeploymentResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_user_tags", body, ListUserTagsResponse + "/public/v1/query/get_tvc_deployment", body, GetTvcDeploymentResponse ) - def stamp_list_user_tags( - self, input: Optional[ListUserTagsBody] = None - ) -> SignedRequest: - """Stamp a listUserTags request without sending it.""" + def stamp_get_tvc_deployment(self, input: GetTvcDeploymentBody) -> SignedRequest: + """Stamp a getTvcDeployment request without sending it.""" - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_user_tags" + full_url = self.base_url + "/public/v1/query/get_tvc_deployment" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1416,33 +1431,35 @@ def stamp_list_user_tags( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_users(self, input: Optional[GetUsersBody] = None) -> GetUsersResponse: - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + def get_tvc_deployment_debug_logs( + self, input: GetTvcDeploymentDebugLogsBody + ) -> GetTvcDeploymentDebugLogsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - return self._request("/public/v1/query/list_users", body, GetUsersResponse) + return self._request( + "/public/v1/query/get_tvc_deployment_debug_logs", + body, + GetTvcDeploymentDebugLogsResponse, + ) - def stamp_get_users(self, input: Optional[GetUsersBody] = None) -> SignedRequest: - """Stamp a getUsers request without sending it.""" + def stamp_get_tvc_deployment_debug_logs( + self, input: GetTvcDeploymentDebugLogsBody + ) -> SignedRequest: + """Stamp a getTvcDeploymentDebugLogs request without sending it.""" - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_users" + full_url = self.base_url + "/public/v1/query/get_tvc_deployment_debug_logs" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1450,9 +1467,9 @@ def stamp_get_users(self, input: Optional[GetUsersBody] = None) -> SignedRequest url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_verified_sub_org_ids( - self, input: GetVerifiedSubOrgIdsBody - ) -> GetVerifiedSubOrgIdsResponse: + def get_tvc_deployment_provisioning_details( + self, input: GetTvcDeploymentProvisioningDetailsBody + ) -> GetTvcDeploymentProvisioningDetailsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1461,13 +1478,15 @@ def get_verified_sub_org_ids( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_verified_suborgs", body, GetVerifiedSubOrgIdsResponse + "/public/v1/query/get_tvc_deployment_provisioning_details", + body, + GetTvcDeploymentProvisioningDetailsResponse, ) - def stamp_get_verified_sub_org_ids( - self, input: GetVerifiedSubOrgIdsBody + def stamp_get_tvc_deployment_provisioning_details( + self, input: GetTvcDeploymentProvisioningDetailsBody ) -> SignedRequest: - """Stamp a getVerifiedSubOrgIds request without sending it.""" + """Stamp a getTvcDeploymentProvisioningDetails request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1476,7 +1495,9 @@ def stamp_get_verified_sub_org_ids( body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_verified_suborgs" + full_url = ( + self.base_url + "/public/v1/query/get_tvc_deployment_provisioning_details" + ) body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1484,9 +1505,9 @@ def stamp_get_verified_sub_org_ids( url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_wallet_accounts( - self, input: GetWalletAccountsBody - ) -> GetWalletAccountsResponse: + def get_tvc_qos_versions( + self, input: GetTvcQosVersionsBody + ) -> GetTvcQosVersionsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1495,11 +1516,11 @@ def get_wallet_accounts( body = {"organizationId": organization_id, **input_dict} return self._request( - "/public/v1/query/list_wallet_accounts", body, GetWalletAccountsResponse + "/public/v1/query/get_tvc_qos_versions", body, GetTvcQosVersionsResponse ) - def stamp_get_wallet_accounts(self, input: GetWalletAccountsBody) -> SignedRequest: - """Stamp a getWalletAccounts request without sending it.""" + def stamp_get_tvc_qos_versions(self, input: GetTvcQosVersionsBody) -> SignedRequest: + """Stamp a getTvcQosVersions request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1508,7 +1529,7 @@ def stamp_get_wallet_accounts(self, input: GetWalletAccountsBody) -> SignedReque body = {"organizationId": organization_id, **input_dict} - full_url = self.base_url + "/public/v1/query/list_wallet_accounts" + full_url = self.base_url + "/public/v1/query/get_tvc_qos_versions" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1516,23 +1537,151 @@ def stamp_get_wallet_accounts(self, input: GetWalletAccountsBody) -> SignedReque url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY ) - def get_wallets(self, input: Optional[GetWalletsBody] = None) -> GetWalletsResponse: - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + def get_user(self, input: GetUserBody) -> GetUserResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) body = {"organizationId": organization_id, **input_dict} - return self._request("/public/v1/query/list_wallets", body, GetWalletsResponse) + return self._request("/public/v1/query/get_user", body, GetUserResponse) - def stamp_get_wallets( - self, input: Optional[GetWalletsBody] = None - ) -> SignedRequest: - """Stamp a getWallets request without sending it.""" + def stamp_get_user(self, input: GetUserBody) -> SignedRequest: + """Stamp a getUser request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/get_user" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_wallet(self, input: GetWalletBody) -> GetWalletResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request("/public/v1/query/get_wallet", body, GetWalletResponse) + + def stamp_get_wallet(self, input: GetWalletBody) -> SignedRequest: + """Stamp a getWallet request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/get_wallet" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_wallet_account( + self, input: GetWalletAccountBody + ) -> GetWalletAccountResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/get_wallet_account", body, GetWalletAccountResponse + ) + + def stamp_get_wallet_account(self, input: GetWalletAccountBody) -> SignedRequest: + """Stamp a getWalletAccount request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/get_wallet_account" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_wallet_address_balances( + self, input: GetWalletAddressBalancesBody + ) -> GetWalletAddressBalancesResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/get_wallet_address_balances", + body, + GetWalletAddressBalancesResponse, + ) + + def stamp_get_wallet_address_balances( + self, input: GetWalletAddressBalancesBody + ) -> SignedRequest: + """Stamp a getWalletAddressBalances request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/get_wallet_address_balances" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_activities( + self, input: Optional[GetActivitiesBody] = None + ) -> GetActivitiesResponse: + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_activities", body, GetActivitiesResponse + ) + + def stamp_get_activities( + self, input: Optional[GetActivitiesBody] = None + ) -> SignedRequest: + """Stamp a getActivities request without sending it.""" if input is None: input_dict = {} @@ -1542,51 +1691,2704 @@ def stamp_get_wallets( organization_id = input_dict.pop("organizationId", self.organization_id) - body = {"organizationId": organization_id, **input_dict} + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_activities" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_app_proofs(self, input: GetAppProofsBody) -> GetAppProofsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_app_proofs", body, GetAppProofsResponse + ) + + def stamp_get_app_proofs(self, input: GetAppProofsBody) -> SignedRequest: + """Stamp a getAppProofs request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_app_proofs" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_earn_enabled_vaults( + self, input: ListEarnEnabledVaultsBody + ) -> ListEarnEnabledVaultsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_earn_enabled_vaults", + body, + ListEarnEnabledVaultsResponse, + ) + + def stamp_list_earn_enabled_vaults( + self, input: ListEarnEnabledVaultsBody + ) -> SignedRequest: + """Stamp a listEarnEnabledVaults request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_earn_enabled_vaults" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_earn_positions( + self, input: ListEarnPositionsBody + ) -> ListEarnPositionsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_earn_positions", body, ListEarnPositionsResponse + ) + + def stamp_list_earn_positions(self, input: ListEarnPositionsBody) -> SignedRequest: + """Stamp a listEarnPositions request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_earn_positions" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_earn_rewards(self, input: ListEarnRewardsBody) -> ListEarnRewardsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_earn_rewards", body, ListEarnRewardsResponse + ) + + def stamp_list_earn_rewards(self, input: ListEarnRewardsBody) -> SignedRequest: + """Stamp a listEarnRewards request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_earn_rewards" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_earn_vaults(self, input: ListEarnVaultsBody) -> ListEarnVaultsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_earn_vaults", body, ListEarnVaultsResponse + ) + + def stamp_list_earn_vaults(self, input: ListEarnVaultsBody) -> SignedRequest: + """Stamp a listEarnVaults request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_earn_vaults" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_email_events(self, input: ListEmailEventsBody) -> ListEmailEventsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_email_events", body, ListEmailEventsResponse + ) + + def stamp_list_email_events(self, input: ListEmailEventsBody) -> SignedRequest: + """Stamp a listEmailEvents request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_email_events" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_eth_transaction_history( + self, input: ListEthTransactionHistoryBody + ) -> ListEthTransactionHistoryResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_eth_transaction_history", + body, + ListEthTransactionHistoryResponse, + ) + + def stamp_list_eth_transaction_history( + self, input: ListEthTransactionHistoryBody + ) -> SignedRequest: + """Stamp a listEthTransactionHistory request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_eth_transaction_history" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_fiat_on_ramp_credentials( + self, input: ListFiatOnRampCredentialsBody + ) -> ListFiatOnRampCredentialsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_fiat_on_ramp_credentials", + body, + ListFiatOnRampCredentialsResponse, + ) + + def stamp_list_fiat_on_ramp_credentials( + self, input: ListFiatOnRampCredentialsBody + ) -> SignedRequest: + """Stamp a listFiatOnRampCredentials request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_fiat_on_ramp_credentials" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_oauth2_credentials( + self, input: ListOauth2CredentialsBody + ) -> ListOauth2CredentialsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_oauth2_credentials", + body, + ListOauth2CredentialsResponse, + ) + + def stamp_list_oauth2_credentials( + self, input: ListOauth2CredentialsBody + ) -> SignedRequest: + """Stamp a listOauth2Credentials request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_oauth2_credentials" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_policies( + self, input: Optional[GetPoliciesBody] = None + ) -> GetPoliciesResponse: + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_policies", body, GetPoliciesResponse + ) + + def stamp_get_policies( + self, input: Optional[GetPoliciesBody] = None + ) -> SignedRequest: + """Stamp a getPolicies request without sending it.""" + + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_policies" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_private_key_tags( + self, input: ListPrivateKeyTagsBody + ) -> ListPrivateKeyTagsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_private_key_tags", body, ListPrivateKeyTagsResponse + ) + + def stamp_list_private_key_tags( + self, input: ListPrivateKeyTagsBody + ) -> SignedRequest: + """Stamp a listPrivateKeyTags request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_private_key_tags" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_private_keys( + self, input: Optional[GetPrivateKeysBody] = None + ) -> GetPrivateKeysResponse: + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_private_keys", body, GetPrivateKeysResponse + ) + + def stamp_get_private_keys( + self, input: Optional[GetPrivateKeysBody] = None + ) -> SignedRequest: + """Stamp a getPrivateKeys request without sending it.""" + + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_private_keys" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_secrets(self, input: ListSecretsBody) -> ListSecretsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request("/public/v1/query/list_secrets", body, ListSecretsResponse) + + def stamp_list_secrets(self, input: ListSecretsBody) -> SignedRequest: + """Stamp a listSecrets request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_secrets" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_smart_contract_interfaces( + self, input: GetSmartContractInterfacesBody + ) -> GetSmartContractInterfacesResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_smart_contract_interfaces", + body, + GetSmartContractInterfacesResponse, + ) + + def stamp_get_smart_contract_interfaces( + self, input: GetSmartContractInterfacesBody + ) -> SignedRequest: + """Stamp a getSmartContractInterfaces request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_smart_contract_interfaces" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_sol_transaction_history( + self, input: ListSolTransactionHistoryBody + ) -> ListSolTransactionHistoryResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_sol_transaction_history", + body, + ListSolTransactionHistoryResponse, + ) + + def stamp_list_sol_transaction_history( + self, input: ListSolTransactionHistoryBody + ) -> SignedRequest: + """Stamp a listSolTransactionHistory request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_sol_transaction_history" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_sub_org_ids( + self, input: Optional[GetSubOrgIdsBody] = None + ) -> GetSubOrgIdsResponse: + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_suborgs", body, GetSubOrgIdsResponse + ) + + def stamp_get_sub_org_ids( + self, input: Optional[GetSubOrgIdsBody] = None + ) -> SignedRequest: + """Stamp a getSubOrgIds request without sending it.""" + + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_suborgs" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_supported_assets( + self, input: ListSupportedAssetsBody + ) -> ListSupportedAssetsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_supported_assets", body, ListSupportedAssetsResponse + ) + + def stamp_list_supported_assets( + self, input: ListSupportedAssetsBody + ) -> SignedRequest: + """Stamp a listSupportedAssets request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_supported_assets" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_tvc_app_deployments( + self, input: GetTvcAppDeploymentsBody + ) -> GetTvcAppDeploymentsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_tvc_app_deployments", + body, + GetTvcAppDeploymentsResponse, + ) + + def stamp_get_tvc_app_deployments( + self, input: GetTvcAppDeploymentsBody + ) -> SignedRequest: + """Stamp a getTvcAppDeployments request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_tvc_app_deployments" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_tvc_apps(self, input: GetTvcAppsBody) -> GetTvcAppsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request("/public/v1/query/list_tvc_apps", body, GetTvcAppsResponse) + + def stamp_get_tvc_apps(self, input: GetTvcAppsBody) -> SignedRequest: + """Stamp a getTvcApps request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_tvc_apps" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_tvc_operators(self, input: GetTvcOperatorsBody) -> GetTvcOperatorsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_tvc_operators", body, GetTvcOperatorsResponse + ) + + def stamp_get_tvc_operators(self, input: GetTvcOperatorsBody) -> SignedRequest: + """Stamp a getTvcOperators request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_tvc_operators" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_tvc_quorum_keys( + self, input: GetTvcQuorumKeysBody + ) -> GetTvcQuorumKeysResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_tvc_quorum_keys", body, GetTvcQuorumKeysResponse + ) + + def stamp_get_tvc_quorum_keys(self, input: GetTvcQuorumKeysBody) -> SignedRequest: + """Stamp a getTvcQuorumKeys request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_tvc_quorum_keys" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_user_tags( + self, input: Optional[ListUserTagsBody] = None + ) -> ListUserTagsResponse: + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_user_tags", body, ListUserTagsResponse + ) + + def stamp_list_user_tags( + self, input: Optional[ListUserTagsBody] = None + ) -> SignedRequest: + """Stamp a listUserTags request without sending it.""" + + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_user_tags" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_users(self, input: Optional[GetUsersBody] = None) -> GetUsersResponse: + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request("/public/v1/query/list_users", body, GetUsersResponse) + + def stamp_get_users(self, input: Optional[GetUsersBody] = None) -> SignedRequest: + """Stamp a getUsers request without sending it.""" + + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_users" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_verified_sub_org_ids( + self, input: GetVerifiedSubOrgIdsBody + ) -> GetVerifiedSubOrgIdsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_verified_suborgs", body, GetVerifiedSubOrgIdsResponse + ) + + def stamp_get_verified_sub_org_ids( + self, input: GetVerifiedSubOrgIdsBody + ) -> SignedRequest: + """Stamp a getVerifiedSubOrgIds request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_verified_suborgs" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_wallet_accounts( + self, input: GetWalletAccountsBody + ) -> GetWalletAccountsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_wallet_accounts", body, GetWalletAccountsResponse + ) + + def stamp_get_wallet_accounts(self, input: GetWalletAccountsBody) -> SignedRequest: + """Stamp a getWalletAccounts request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_wallet_accounts" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_wallets(self, input: Optional[GetWalletsBody] = None) -> GetWalletsResponse: + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request("/public/v1/query/list_wallets", body, GetWalletsResponse) + + def stamp_get_wallets( + self, input: Optional[GetWalletsBody] = None + ) -> SignedRequest: + """Stamp a getWallets request without sending it.""" + + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_wallets" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def list_webhook_endpoints( + self, input: ListWebhookEndpointsBody + ) -> ListWebhookEndpointsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/list_webhook_endpoints", + body, + ListWebhookEndpointsResponse, + ) + + def stamp_list_webhook_endpoints( + self, input: ListWebhookEndpointsBody + ) -> SignedRequest: + """Stamp a listWebhookEndpoints request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/list_webhook_endpoints" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def validate_tvc_image( + self, input: ValidateTvcImageBody + ) -> ValidateTvcImageResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request( + "/public/v1/query/validate_tvc_image", body, ValidateTvcImageResponse + ) + + def stamp_validate_tvc_image(self, input: ValidateTvcImageBody) -> SignedRequest: + """Stamp a validateTvcImage request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/validate_tvc_image" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def get_whoami(self, input: Optional[GetWhoamiBody] = None) -> GetWhoamiResponse: + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + return self._request("/public/v1/query/whoami", body, GetWhoamiResponse) + + def stamp_get_whoami(self, input: Optional[GetWhoamiBody] = None) -> SignedRequest: + """Stamp a getWhoami request without sending it.""" + + if input is None: + input_dict = {} + else: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + + body = {"organizationId": organization_id, **input_dict} + + full_url = self.base_url + "/public/v1/query/whoami" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + ) + + def approve_activity(self, input: ApproveActivityBody) -> ApproveActivityResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_APPROVE_ACTIVITY", + } + + return self._activity_decision( + "/public/v1/submit/approve_activity", body, ApproveActivityResponse + ) + + def stamp_approve_activity(self, input: ApproveActivityBody) -> SignedRequest: + """Stamp a approveActivity request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_APPROVE_ACTIVITY", + } + + full_url = self.base_url + "/public/v1/submit/approve_activity" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY_DECISION + ) + + def claim_earn_fees(self, input: ClaimEarnFeesBody) -> ClaimEarnFeesResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CLAIM_EARN_FEES", + } + + return self._activity( + "/public/v1/submit/claim_earn_fees", + body, + "claimEarnFeesResult", + ClaimEarnFeesResponse, + ) + + def stamp_claim_earn_fees(self, input: ClaimEarnFeesBody) -> SignedRequest: + """Stamp a claimEarnFees request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CLAIM_EARN_FEES", + } + + full_url = self.base_url + "/public/v1/submit/claim_earn_fees" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def claim_swap_fees(self, input: ClaimSwapFeesBody) -> ClaimSwapFeesResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CLAIM_SWAP_FEES", + } + + return self._activity( + "/public/v1/submit/claim_swap_fees", + body, + "claimSwapFeesResult", + ClaimSwapFeesResponse, + ) + + def stamp_claim_swap_fees(self, input: ClaimSwapFeesBody) -> SignedRequest: + """Stamp a claimSwapFees request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CLAIM_SWAP_FEES", + } + + full_url = self.base_url + "/public/v1/submit/claim_swap_fees" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_api_keys(self, input: CreateApiKeysBody) -> CreateApiKeysResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_API_KEYS_V2", + } + + return self._activity( + "/public/v1/submit/create_api_keys", + body, + "createApiKeysResult", + CreateApiKeysResponse, + ) + + def stamp_create_api_keys(self, input: CreateApiKeysBody) -> SignedRequest: + """Stamp a createApiKeys request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_API_KEYS_V2", + } + + full_url = self.base_url + "/public/v1/submit/create_api_keys" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_authenticators( + self, input: CreateAuthenticatorsBody + ) -> CreateAuthenticatorsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", + } + + return self._activity( + "/public/v1/submit/create_authenticators", + body, + "createAuthenticatorsResult", + CreateAuthenticatorsResponse, + ) + + def stamp_create_authenticators( + self, input: CreateAuthenticatorsBody + ) -> SignedRequest: + """Stamp a createAuthenticators request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", + } + + full_url = self.base_url + "/public/v1/submit/create_authenticators" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_fiat_on_ramp_credential( + self, input: CreateFiatOnRampCredentialBody + ) -> CreateFiatOnRampCredentialResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", + } + + return self._activity( + "/public/v1/submit/create_fiat_on_ramp_credential", + body, + "createFiatOnRampCredentialResult", + CreateFiatOnRampCredentialResponse, + ) + + def stamp_create_fiat_on_ramp_credential( + self, input: CreateFiatOnRampCredentialBody + ) -> SignedRequest: + """Stamp a createFiatOnRampCredential request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", + } + + full_url = self.base_url + "/public/v1/submit/create_fiat_on_ramp_credential" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_invitations( + self, input: CreateInvitationsBody + ) -> CreateInvitationsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_INVITATIONS", + } + + return self._activity( + "/public/v1/submit/create_invitations", + body, + "createInvitationsResult", + CreateInvitationsResponse, + ) + + def stamp_create_invitations(self, input: CreateInvitationsBody) -> SignedRequest: + """Stamp a createInvitations request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_INVITATIONS", + } + + full_url = self.base_url + "/public/v1/submit/create_invitations" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_mfa_policy(self, input: CreateMfaPolicyBody) -> CreateMfaPolicyResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_MFA_POLICY", + } + + return self._activity( + "/public/v1/submit/create_mfa_policy", + body, + "createMfaPolicyResult", + CreateMfaPolicyResponse, + ) + + def stamp_create_mfa_policy(self, input: CreateMfaPolicyBody) -> SignedRequest: + """Stamp a createMfaPolicy request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_MFA_POLICY", + } + + full_url = self.base_url + "/public/v1/submit/create_mfa_policy" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_oauth2_credential( + self, input: CreateOauth2CredentialBody + ) -> CreateOauth2CredentialResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", + } + + return self._activity( + "/public/v1/submit/create_oauth2_credential", + body, + "createOauth2CredentialResult", + CreateOauth2CredentialResponse, + ) + + def stamp_create_oauth2_credential( + self, input: CreateOauth2CredentialBody + ) -> SignedRequest: + """Stamp a createOauth2Credential request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", + } + + full_url = self.base_url + "/public/v1/submit/create_oauth2_credential" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_oauth_providers( + self, input: CreateOauthProvidersBody + ) -> CreateOauthProvidersResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS_V2", + } + + return self._activity( + "/public/v1/submit/create_oauth_providers", + body, + "createOauthProvidersResultV2", + CreateOauthProvidersResponse, + ) + + def stamp_create_oauth_providers( + self, input: CreateOauthProvidersBody + ) -> SignedRequest: + """Stamp a createOauthProviders request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS_V2", + } + + full_url = self.base_url + "/public/v1/submit/create_oauth_providers" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_policies(self, input: CreatePoliciesBody) -> CreatePoliciesResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_POLICIES", + } + + return self._activity( + "/public/v1/submit/create_policies", + body, + "createPoliciesResult", + CreatePoliciesResponse, + ) + + def stamp_create_policies(self, input: CreatePoliciesBody) -> SignedRequest: + """Stamp a createPolicies request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_POLICIES", + } + + full_url = self.base_url + "/public/v1/submit/create_policies" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_policy(self, input: CreatePolicyBody) -> CreatePolicyResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_POLICY_V3", + } + + return self._activity( + "/public/v1/submit/create_policy", + body, + "createPolicyResult", + CreatePolicyResponse, + ) + + def stamp_create_policy(self, input: CreatePolicyBody) -> SignedRequest: + """Stamp a createPolicy request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_POLICY_V3", + } + + full_url = self.base_url + "/public/v1/submit/create_policy" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_private_key_tag( + self, input: CreatePrivateKeyTagBody + ) -> CreatePrivateKeyTagResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", + } + + return self._activity( + "/public/v1/submit/create_private_key_tag", + body, + "createPrivateKeyTagResult", + CreatePrivateKeyTagResponse, + ) + + def stamp_create_private_key_tag( + self, input: CreatePrivateKeyTagBody + ) -> SignedRequest: + """Stamp a createPrivateKeyTag request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", + } + + full_url = self.base_url + "/public/v1/submit/create_private_key_tag" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_private_keys( + self, input: CreatePrivateKeysBody + ) -> CreatePrivateKeysResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", + } + + return self._activity( + "/public/v1/submit/create_private_keys", + body, + "createPrivateKeysResultV2", + CreatePrivateKeysResponse, + ) + + def stamp_create_private_keys(self, input: CreatePrivateKeysBody) -> SignedRequest: + """Stamp a createPrivateKeys request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", + } + + full_url = self.base_url + "/public/v1/submit/create_private_keys" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_read_only_session( + self, input: CreateReadOnlySessionBody + ) -> CreateReadOnlySessionResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", + } + + return self._activity( + "/public/v1/submit/create_read_only_session", + body, + "createReadOnlySessionResult", + CreateReadOnlySessionResponse, + ) + + def stamp_create_read_only_session( + self, input: CreateReadOnlySessionBody + ) -> SignedRequest: + """Stamp a createReadOnlySession request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", + } + + full_url = self.base_url + "/public/v1/submit/create_read_only_session" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_read_write_session( + self, input: CreateReadWriteSessionBody + ) -> CreateReadWriteSessionResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", + } + + return self._activity( + "/public/v1/submit/create_read_write_session", + body, + "createReadWriteSessionResultV2", + CreateReadWriteSessionResponse, + ) + + def stamp_create_read_write_session( + self, input: CreateReadWriteSessionBody + ) -> SignedRequest: + """Stamp a createReadWriteSession request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", + } + + full_url = self.base_url + "/public/v1/submit/create_read_write_session" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_session_profile( + self, input: CreateSessionProfileBody + ) -> CreateSessionProfileResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_SESSION_PROFILE", + } + + return self._activity( + "/public/v1/submit/create_session_profile", + body, + "createSessionProfileResult", + CreateSessionProfileResponse, + ) + + def stamp_create_session_profile( + self, input: CreateSessionProfileBody + ) -> SignedRequest: + """Stamp a createSessionProfile request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_SESSION_PROFILE", + } + + full_url = self.base_url + "/public/v1/submit/create_session_profile" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_smart_contract_interface( + self, input: CreateSmartContractInterfaceBody + ) -> CreateSmartContractInterfaceResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", + } + + return self._activity( + "/public/v1/submit/create_smart_contract_interface", + body, + "createSmartContractInterfaceResult", + CreateSmartContractInterfaceResponse, + ) + + def stamp_create_smart_contract_interface( + self, input: CreateSmartContractInterfaceBody + ) -> SignedRequest: + """Stamp a createSmartContractInterface request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", + } + + full_url = self.base_url + "/public/v1/submit/create_smart_contract_interface" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_sub_organization( + self, input: CreateSubOrganizationBody + ) -> CreateSubOrganizationResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", + } + + return self._activity( + "/public/v1/submit/create_sub_organization", + body, + "createSubOrganizationResultV7", + CreateSubOrganizationResponse, + ) + + def stamp_create_sub_organization( + self, input: CreateSubOrganizationBody + ) -> SignedRequest: + """Stamp a createSubOrganization request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", + } + + full_url = self.base_url + "/public/v1/submit/create_sub_organization" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_swap_quote(self, input: CreateSwapQuoteBody) -> CreateSwapQuoteResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V3", + } + + return self._activity( + "/public/v1/submit/create_swap_quote", + body, + "createSwapQuoteResultV2", + CreateSwapQuoteResponse, + ) + + def stamp_create_swap_quote(self, input: CreateSwapQuoteBody) -> SignedRequest: + """Stamp a createSwapQuote request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V3", + } + + full_url = self.base_url + "/public/v1/submit/create_swap_quote" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_tvc_app(self, input: CreateTvcAppBody) -> CreateTvcAppResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_APP", + } + + return self._activity( + "/public/v1/submit/create_tvc_app", + body, + "createTvcAppResult", + CreateTvcAppResponse, + ) + + def stamp_create_tvc_app(self, input: CreateTvcAppBody) -> SignedRequest: + """Stamp a createTvcApp request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_APP", + } + + full_url = self.base_url + "/public/v1/submit/create_tvc_app" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_tvc_deployment( + self, input: CreateTvcDeploymentBody + ) -> CreateTvcDeploymentResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT", + } + + return self._activity( + "/public/v1/submit/create_tvc_deployment", + body, + "createTvcDeploymentResult", + CreateTvcDeploymentResponse, + ) + + def stamp_create_tvc_deployment( + self, input: CreateTvcDeploymentBody + ) -> SignedRequest: + """Stamp a createTvcDeployment request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT", + } + + full_url = self.base_url + "/public/v1/submit/create_tvc_deployment" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_tvc_manifest_approvals( + self, input: CreateTvcManifestApprovalsBody + ) -> CreateTvcManifestApprovalsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS", + } + + return self._activity( + "/public/v1/submit/create_tvc_manifest_approvals", + body, + "createTvcManifestApprovalsResult", + CreateTvcManifestApprovalsResponse, + ) + + def stamp_create_tvc_manifest_approvals( + self, input: CreateTvcManifestApprovalsBody + ) -> SignedRequest: + """Stamp a createTvcManifestApprovals request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS", + } + + full_url = self.base_url + "/public/v1/submit/create_tvc_manifest_approvals" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_tvc_operator( + self, input: CreateTvcOperatorBody + ) -> CreateTvcOperatorResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_OPERATOR", + } + + return self._activity( + "/public/v1/submit/create_tvc_operator", + body, + "createTvcOperatorResult", + CreateTvcOperatorResponse, + ) + + def stamp_create_tvc_operator(self, input: CreateTvcOperatorBody) -> SignedRequest: + """Stamp a createTvcOperator request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_OPERATOR", + } + + full_url = self.base_url + "/public/v1/submit/create_tvc_operator" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_tvc_quorum_key( + self, input: CreateTvcQuorumKeyBody + ) -> CreateTvcQuorumKeyResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_QUORUM_KEY", + } + + return self._activity( + "/public/v1/submit/create_tvc_quorum_key", + body, + "createTvcQuorumKeyResult", + CreateTvcQuorumKeyResponse, + ) + + def stamp_create_tvc_quorum_key( + self, input: CreateTvcQuorumKeyBody + ) -> SignedRequest: + """Stamp a createTvcQuorumKey request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_TVC_QUORUM_KEY", + } + + full_url = self.base_url + "/public/v1/submit/create_tvc_quorum_key" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_user_tag(self, input: CreateUserTagBody) -> CreateUserTagResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_USER_TAG", + } + + return self._activity( + "/public/v1/submit/create_user_tag", + body, + "createUserTagResult", + CreateUserTagResponse, + ) + + def stamp_create_user_tag(self, input: CreateUserTagBody) -> SignedRequest: + """Stamp a createUserTag request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_USER_TAG", + } + + full_url = self.base_url + "/public/v1/submit/create_user_tag" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_users(self, input: CreateUsersBody) -> CreateUsersResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_USERS_V3", + } + + return self._activity( + "/public/v1/submit/create_users", + body, + "createUsersResult", + CreateUsersResponse, + ) + + def stamp_create_users(self, input: CreateUsersBody) -> SignedRequest: + """Stamp a createUsers request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_USERS_V3", + } + + full_url = self.base_url + "/public/v1/submit/create_users" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_wallet(self, input: CreateWalletBody) -> CreateWalletResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_WALLET", + } + + return self._activity( + "/public/v1/submit/create_wallet", + body, + "createWalletResult", + CreateWalletResponse, + ) + + def stamp_create_wallet(self, input: CreateWalletBody) -> SignedRequest: + """Stamp a createWallet request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_WALLET", + } + + full_url = self.base_url + "/public/v1/submit/create_wallet" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_wallet_accounts( + self, input: CreateWalletAccountsBody + ) -> CreateWalletAccountsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", + } + + return self._activity( + "/public/v1/submit/create_wallet_accounts", + body, + "createWalletAccountsResult", + CreateWalletAccountsResponse, + ) + + def stamp_create_wallet_accounts( + self, input: CreateWalletAccountsBody + ) -> SignedRequest: + """Stamp a createWalletAccounts request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", + } + + full_url = self.base_url + "/public/v1/submit/create_wallet_accounts" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def create_webhook_endpoint( + self, input: CreateWebhookEndpointBody + ) -> CreateWebhookEndpointResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_WEBHOOK_ENDPOINT", + } + + return self._activity( + "/public/v1/submit/create_webhook_endpoint", + body, + "createWebhookEndpointResult", + CreateWebhookEndpointResponse, + ) + + def stamp_create_webhook_endpoint( + self, input: CreateWebhookEndpointBody + ) -> SignedRequest: + """Stamp a createWebhookEndpoint request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_CREATE_WEBHOOK_ENDPOINT", + } + + full_url = self.base_url + "/public/v1/submit/create_webhook_endpoint" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def delete_api_keys(self, input: DeleteApiKeysBody) -> DeleteApiKeysResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_API_KEYS", + } + + return self._activity( + "/public/v1/submit/delete_api_keys", + body, + "deleteApiKeysResult", + DeleteApiKeysResponse, + ) + + def stamp_delete_api_keys(self, input: DeleteApiKeysBody) -> SignedRequest: + """Stamp a deleteApiKeys request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_API_KEYS", + } + + full_url = self.base_url + "/public/v1/submit/delete_api_keys" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def delete_authenticators( + self, input: DeleteAuthenticatorsBody + ) -> DeleteAuthenticatorsResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", + } + + return self._activity( + "/public/v1/submit/delete_authenticators", + body, + "deleteAuthenticatorsResult", + DeleteAuthenticatorsResponse, + ) + + def stamp_delete_authenticators( + self, input: DeleteAuthenticatorsBody + ) -> SignedRequest: + """Stamp a deleteAuthenticators request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", + } + + full_url = self.base_url + "/public/v1/submit/delete_authenticators" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def delete_fiat_on_ramp_credential( + self, input: DeleteFiatOnRampCredentialBody + ) -> DeleteFiatOnRampCredentialResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", + } + + return self._activity( + "/public/v1/submit/delete_fiat_on_ramp_credential", + body, + "deleteFiatOnRampCredentialResult", + DeleteFiatOnRampCredentialResponse, + ) + + def stamp_delete_fiat_on_ramp_credential( + self, input: DeleteFiatOnRampCredentialBody + ) -> SignedRequest: + """Stamp a deleteFiatOnRampCredential request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", + } + + full_url = self.base_url + "/public/v1/submit/delete_fiat_on_ramp_credential" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def delete_invitation( + self, input: DeleteInvitationBody + ) -> DeleteInvitationResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_INVITATION", + } + + return self._activity( + "/public/v1/submit/delete_invitation", + body, + "deleteInvitationResult", + DeleteInvitationResponse, + ) + + def stamp_delete_invitation(self, input: DeleteInvitationBody) -> SignedRequest: + """Stamp a deleteInvitation request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_INVITATION", + } + + full_url = self.base_url + "/public/v1/submit/delete_invitation" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def delete_mfa_policy(self, input: DeleteMfaPolicyBody) -> DeleteMfaPolicyResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_MFA_POLICY", + } + + return self._activity( + "/public/v1/submit/delete_mfa_policy", + body, + "deleteMfaPolicyResult", + DeleteMfaPolicyResponse, + ) + + def stamp_delete_mfa_policy(self, input: DeleteMfaPolicyBody) -> SignedRequest: + """Stamp a deleteMfaPolicy request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_MFA_POLICY", + } - full_url = self.base_url + "/public/v1/query/list_wallets" + full_url = self.base_url + "/public/v1/submit/delete_mfa_policy" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) return SignedRequest( - url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def get_whoami(self, input: Optional[GetWhoamiBody] = None) -> GetWhoamiResponse: - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + def delete_oauth2_credential( + self, input: DeleteOauth2CredentialBody + ) -> DeleteOauth2CredentialResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) - body = {"organizationId": organization_id, **input_dict} + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", + } - return self._request("/public/v1/query/whoami", body, GetWhoamiResponse) + return self._activity( + "/public/v1/submit/delete_oauth2_credential", + body, + "deleteOauth2CredentialResult", + DeleteOauth2CredentialResponse, + ) - def stamp_get_whoami(self, input: Optional[GetWhoamiBody] = None) -> SignedRequest: - """Stamp a getWhoami request without sending it.""" + def stamp_delete_oauth2_credential( + self, input: DeleteOauth2CredentialBody + ) -> SignedRequest: + """Stamp a deleteOauth2Credential request without sending it.""" - if input is None: - input_dict = {} - else: - # Convert Pydantic model to dict - input_dict = input.model_dump(by_alias=True, exclude_none=True) + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) - body = {"organizationId": organization_id, **input_dict} + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", + } - full_url = self.base_url + "/public/v1/query/whoami" + full_url = self.base_url + "/public/v1/submit/delete_oauth2_credential" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) return SignedRequest( - url=full_url, body=body_str, stamp=stamp, type=RequestType.QUERY + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def approve_activity(self, input: ApproveActivityBody) -> ApproveActivityResponse: + def delete_oauth_providers( + self, input: DeleteOauthProvidersBody + ) -> DeleteOauthProvidersResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1597,15 +4399,20 @@ def approve_activity(self, input: ApproveActivityBody) -> ApproveActivityRespons "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_APPROVE_ACTIVITY", + "type": "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", } - return self._activity_decision( - "/public/v1/submit/approve_activity", body, ApproveActivityResponse + return self._activity( + "/public/v1/submit/delete_oauth_providers", + body, + "deleteOauthProvidersResult", + DeleteOauthProvidersResponse, ) - def stamp_approve_activity(self, input: ApproveActivityBody) -> SignedRequest: - """Stamp a approveActivity request without sending it.""" + def stamp_delete_oauth_providers( + self, input: DeleteOauthProvidersBody + ) -> SignedRequest: + """Stamp a deleteOauthProviders request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1617,18 +4424,18 @@ def stamp_approve_activity(self, input: ApproveActivityBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_APPROVE_ACTIVITY", + "type": "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", } - full_url = self.base_url + "/public/v1/submit/approve_activity" + full_url = self.base_url + "/public/v1/submit/delete_oauth_providers" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) return SignedRequest( - url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY_DECISION + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_api_keys(self, input: CreateApiKeysBody) -> CreateApiKeysResponse: + def delete_policies(self, input: DeletePoliciesBody) -> DeletePoliciesResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1639,18 +4446,18 @@ def create_api_keys(self, input: CreateApiKeysBody) -> CreateApiKeysResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_API_KEYS_V2", + "type": "ACTIVITY_TYPE_DELETE_POLICIES", } return self._activity( - "/public/v1/submit/create_api_keys", + "/public/v1/submit/delete_policies", body, - "createApiKeysResult", - CreateApiKeysResponse, + "deletePoliciesResult", + DeletePoliciesResponse, ) - def stamp_create_api_keys(self, input: CreateApiKeysBody) -> SignedRequest: - """Stamp a createApiKeys request without sending it.""" + def stamp_delete_policies(self, input: DeletePoliciesBody) -> SignedRequest: + """Stamp a deletePolicies request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1662,10 +4469,10 @@ def stamp_create_api_keys(self, input: CreateApiKeysBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_API_KEYS_V2", + "type": "ACTIVITY_TYPE_DELETE_POLICIES", } - full_url = self.base_url + "/public/v1/submit/create_api_keys" + full_url = self.base_url + "/public/v1/submit/delete_policies" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1673,9 +4480,7 @@ def stamp_create_api_keys(self, input: CreateApiKeysBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_authenticators( - self, input: CreateAuthenticatorsBody - ) -> CreateAuthenticatorsResponse: + def delete_policy(self, input: DeletePolicyBody) -> DeletePolicyResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1686,20 +4491,18 @@ def create_authenticators( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", + "type": "ACTIVITY_TYPE_DELETE_POLICY", } return self._activity( - "/public/v1/submit/create_authenticators", + "/public/v1/submit/delete_policy", body, - "createAuthenticatorsResult", - CreateAuthenticatorsResponse, + "deletePolicyResult", + DeletePolicyResponse, ) - def stamp_create_authenticators( - self, input: CreateAuthenticatorsBody - ) -> SignedRequest: - """Stamp a createAuthenticators request without sending it.""" + def stamp_delete_policy(self, input: DeletePolicyBody) -> SignedRequest: + """Stamp a deletePolicy request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1711,10 +4514,10 @@ def stamp_create_authenticators( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", + "type": "ACTIVITY_TYPE_DELETE_POLICY", } - full_url = self.base_url + "/public/v1/submit/create_authenticators" + full_url = self.base_url + "/public/v1/submit/delete_policy" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1722,9 +4525,9 @@ def stamp_create_authenticators( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_fiat_on_ramp_credential( - self, input: CreateFiatOnRampCredentialBody - ) -> CreateFiatOnRampCredentialResponse: + def delete_private_key_tags( + self, input: DeletePrivateKeyTagsBody + ) -> DeletePrivateKeyTagsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1735,20 +4538,20 @@ def create_fiat_on_ramp_credential( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", + "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", } return self._activity( - "/public/v1/submit/create_fiat_on_ramp_credential", + "/public/v1/submit/delete_private_key_tags", body, - "createFiatOnRampCredentialResult", - CreateFiatOnRampCredentialResponse, + "deletePrivateKeyTagsResult", + DeletePrivateKeyTagsResponse, ) - def stamp_create_fiat_on_ramp_credential( - self, input: CreateFiatOnRampCredentialBody + def stamp_delete_private_key_tags( + self, input: DeletePrivateKeyTagsBody ) -> SignedRequest: - """Stamp a createFiatOnRampCredential request without sending it.""" + """Stamp a deletePrivateKeyTags request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1760,10 +4563,10 @@ def stamp_create_fiat_on_ramp_credential( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", + "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", } - full_url = self.base_url + "/public/v1/submit/create_fiat_on_ramp_credential" + full_url = self.base_url + "/public/v1/submit/delete_private_key_tags" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1771,9 +4574,9 @@ def stamp_create_fiat_on_ramp_credential( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_invitations( - self, input: CreateInvitationsBody - ) -> CreateInvitationsResponse: + def delete_private_keys( + self, input: DeletePrivateKeysBody + ) -> DeletePrivateKeysResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1784,18 +4587,18 @@ def create_invitations( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_INVITATIONS", + "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", } return self._activity( - "/public/v1/submit/create_invitations", + "/public/v1/submit/delete_private_keys", body, - "createInvitationsResult", - CreateInvitationsResponse, + "deletePrivateKeysResult", + DeletePrivateKeysResponse, ) - def stamp_create_invitations(self, input: CreateInvitationsBody) -> SignedRequest: - """Stamp a createInvitations request without sending it.""" + def stamp_delete_private_keys(self, input: DeletePrivateKeysBody) -> SignedRequest: + """Stamp a deletePrivateKeys request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1807,10 +4610,10 @@ def stamp_create_invitations(self, input: CreateInvitationsBody) -> SignedReques "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_INVITATIONS", + "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", } - full_url = self.base_url + "/public/v1/submit/create_invitations" + full_url = self.base_url + "/public/v1/submit/delete_private_keys" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1818,9 +4621,7 @@ def stamp_create_invitations(self, input: CreateInvitationsBody) -> SignedReques url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_oauth2_credential( - self, input: CreateOauth2CredentialBody - ) -> CreateOauth2CredentialResponse: + def delete_secrets(self, input: DeleteSecretsBody) -> DeleteSecretsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1831,20 +4632,18 @@ def create_oauth2_credential( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", + "type": "ACTIVITY_TYPE_DELETE_SECRETS", } return self._activity( - "/public/v1/submit/create_oauth2_credential", + "/public/v1/submit/delete_secrets", body, - "createOauth2CredentialResult", - CreateOauth2CredentialResponse, + "deleteSecretsResult", + DeleteSecretsResponse, ) - def stamp_create_oauth2_credential( - self, input: CreateOauth2CredentialBody - ) -> SignedRequest: - """Stamp a createOauth2Credential request without sending it.""" + def stamp_delete_secrets(self, input: DeleteSecretsBody) -> SignedRequest: + """Stamp a deleteSecrets request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1856,10 +4655,10 @@ def stamp_create_oauth2_credential( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", + "type": "ACTIVITY_TYPE_DELETE_SECRETS", } - full_url = self.base_url + "/public/v1/submit/create_oauth2_credential" + full_url = self.base_url + "/public/v1/submit/delete_secrets" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1867,9 +4666,9 @@ def stamp_create_oauth2_credential( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_oauth_providers( - self, input: CreateOauthProvidersBody - ) -> CreateOauthProvidersResponse: + def delete_smart_contract_interface( + self, input: DeleteSmartContractInterfaceBody + ) -> DeleteSmartContractInterfaceResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1880,20 +4679,20 @@ def create_oauth_providers( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS", + "type": "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", } return self._activity( - "/public/v1/submit/create_oauth_providers", + "/public/v1/submit/delete_smart_contract_interface", body, - "createOauthProvidersResult", - CreateOauthProvidersResponse, + "deleteSmartContractInterfaceResult", + DeleteSmartContractInterfaceResponse, ) - def stamp_create_oauth_providers( - self, input: CreateOauthProvidersBody + def stamp_delete_smart_contract_interface( + self, input: DeleteSmartContractInterfaceBody ) -> SignedRequest: - """Stamp a createOauthProviders request without sending it.""" + """Stamp a deleteSmartContractInterface request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1905,10 +4704,10 @@ def stamp_create_oauth_providers( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS", + "type": "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", } - full_url = self.base_url + "/public/v1/submit/create_oauth_providers" + full_url = self.base_url + "/public/v1/submit/delete_smart_contract_interface" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1916,7 +4715,9 @@ def stamp_create_oauth_providers( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_policies(self, input: CreatePoliciesBody) -> CreatePoliciesResponse: + def delete_sub_organization( + self, input: DeleteSubOrganizationBody + ) -> DeleteSubOrganizationResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1927,18 +4728,20 @@ def create_policies(self, input: CreatePoliciesBody) -> CreatePoliciesResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_POLICIES", + "type": "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", } return self._activity( - "/public/v1/submit/create_policies", + "/public/v1/submit/delete_sub_organization", body, - "createPoliciesResult", - CreatePoliciesResponse, + "deleteSubOrganizationResult", + DeleteSubOrganizationResponse, ) - def stamp_create_policies(self, input: CreatePoliciesBody) -> SignedRequest: - """Stamp a createPolicies request without sending it.""" + def stamp_delete_sub_organization( + self, input: DeleteSubOrganizationBody + ) -> SignedRequest: + """Stamp a deleteSubOrganization request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1950,10 +4753,10 @@ def stamp_create_policies(self, input: CreatePoliciesBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_POLICIES", + "type": "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", } - full_url = self.base_url + "/public/v1/submit/create_policies" + full_url = self.base_url + "/public/v1/submit/delete_sub_organization" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -1961,7 +4764,9 @@ def stamp_create_policies(self, input: CreatePoliciesBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_policy(self, input: CreatePolicyBody) -> CreatePolicyResponse: + def delete_tvc_app_and_deployments( + self, input: DeleteTvcAppAndDeploymentsBody + ) -> DeleteTvcAppAndDeploymentsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1972,18 +4777,20 @@ def create_policy(self, input: CreatePolicyBody) -> CreatePolicyResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_POLICY_V3", + "type": "ACTIVITY_TYPE_DELETE_TVC_APP_AND_DEPLOYMENTS", } return self._activity( - "/public/v1/submit/create_policy", + "/public/v1/submit/delete_tvc_app_and_deployments", body, - "createPolicyResult", - CreatePolicyResponse, + "deleteTvcAppAndDeploymentsResult", + DeleteTvcAppAndDeploymentsResponse, ) - def stamp_create_policy(self, input: CreatePolicyBody) -> SignedRequest: - """Stamp a createPolicy request without sending it.""" + def stamp_delete_tvc_app_and_deployments( + self, input: DeleteTvcAppAndDeploymentsBody + ) -> SignedRequest: + """Stamp a deleteTvcAppAndDeployments request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -1995,10 +4802,10 @@ def stamp_create_policy(self, input: CreatePolicyBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_POLICY_V3", + "type": "ACTIVITY_TYPE_DELETE_TVC_APP_AND_DEPLOYMENTS", } - full_url = self.base_url + "/public/v1/submit/create_policy" + full_url = self.base_url + "/public/v1/submit/delete_tvc_app_and_deployments" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2006,9 +4813,9 @@ def stamp_create_policy(self, input: CreatePolicyBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_private_key_tag( - self, input: CreatePrivateKeyTagBody - ) -> CreatePrivateKeyTagResponse: + def delete_tvc_deployment( + self, input: DeleteTvcDeploymentBody + ) -> DeleteTvcDeploymentResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2019,20 +4826,20 @@ def create_private_key_tag( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", + "type": "ACTIVITY_TYPE_DELETE_TVC_DEPLOYMENT", } return self._activity( - "/public/v1/submit/create_private_key_tag", + "/public/v1/submit/delete_tvc_deployment", body, - "createPrivateKeyTagResult", - CreatePrivateKeyTagResponse, + "deleteTvcDeploymentResult", + DeleteTvcDeploymentResponse, ) - def stamp_create_private_key_tag( - self, input: CreatePrivateKeyTagBody + def stamp_delete_tvc_deployment( + self, input: DeleteTvcDeploymentBody ) -> SignedRequest: - """Stamp a createPrivateKeyTag request without sending it.""" + """Stamp a deleteTvcDeployment request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2044,20 +4851,18 @@ def stamp_create_private_key_tag( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", + "type": "ACTIVITY_TYPE_DELETE_TVC_DEPLOYMENT", } - full_url = self.base_url + "/public/v1/submit/create_private_key_tag" + full_url = self.base_url + "/public/v1/submit/delete_tvc_deployment" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) return SignedRequest( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY - ) - - def create_private_keys( - self, input: CreatePrivateKeysBody - ) -> CreatePrivateKeysResponse: + ) + + def delete_user_tags(self, input: DeleteUserTagsBody) -> DeleteUserTagsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2068,18 +4873,18 @@ def create_private_keys( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", + "type": "ACTIVITY_TYPE_DELETE_USER_TAGS", } return self._activity( - "/public/v1/submit/create_private_keys", + "/public/v1/submit/delete_user_tags", body, - "createPrivateKeysResultV2", - CreatePrivateKeysResponse, + "deleteUserTagsResult", + DeleteUserTagsResponse, ) - def stamp_create_private_keys(self, input: CreatePrivateKeysBody) -> SignedRequest: - """Stamp a createPrivateKeys request without sending it.""" + def stamp_delete_user_tags(self, input: DeleteUserTagsBody) -> SignedRequest: + """Stamp a deleteUserTags request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2091,10 +4896,10 @@ def stamp_create_private_keys(self, input: CreatePrivateKeysBody) -> SignedReque "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", + "type": "ACTIVITY_TYPE_DELETE_USER_TAGS", } - full_url = self.base_url + "/public/v1/submit/create_private_keys" + full_url = self.base_url + "/public/v1/submit/delete_user_tags" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2102,9 +4907,7 @@ def stamp_create_private_keys(self, input: CreatePrivateKeysBody) -> SignedReque url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_read_only_session( - self, input: CreateReadOnlySessionBody - ) -> CreateReadOnlySessionResponse: + def delete_users(self, input: DeleteUsersBody) -> DeleteUsersResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2115,20 +4918,18 @@ def create_read_only_session( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", + "type": "ACTIVITY_TYPE_DELETE_USERS", } return self._activity( - "/public/v1/submit/create_read_only_session", + "/public/v1/submit/delete_users", body, - "createReadOnlySessionResult", - CreateReadOnlySessionResponse, + "deleteUsersResult", + DeleteUsersResponse, ) - def stamp_create_read_only_session( - self, input: CreateReadOnlySessionBody - ) -> SignedRequest: - """Stamp a createReadOnlySession request without sending it.""" + def stamp_delete_users(self, input: DeleteUsersBody) -> SignedRequest: + """Stamp a deleteUsers request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2140,10 +4941,10 @@ def stamp_create_read_only_session( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", + "type": "ACTIVITY_TYPE_DELETE_USERS", } - full_url = self.base_url + "/public/v1/submit/create_read_only_session" + full_url = self.base_url + "/public/v1/submit/delete_users" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2151,9 +4952,9 @@ def stamp_create_read_only_session( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_read_write_session( - self, input: CreateReadWriteSessionBody - ) -> CreateReadWriteSessionResponse: + def delete_wallet_accounts( + self, input: DeleteWalletAccountsBody + ) -> DeleteWalletAccountsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2164,20 +4965,20 @@ def create_read_write_session( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", + "type": "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", } return self._activity( - "/public/v1/submit/create_read_write_session", + "/public/v1/submit/delete_wallet_accounts", body, - "createReadWriteSessionResultV2", - CreateReadWriteSessionResponse, + "deleteWalletAccountsResult", + DeleteWalletAccountsResponse, ) - def stamp_create_read_write_session( - self, input: CreateReadWriteSessionBody + def stamp_delete_wallet_accounts( + self, input: DeleteWalletAccountsBody ) -> SignedRequest: - """Stamp a createReadWriteSession request without sending it.""" + """Stamp a deleteWalletAccounts request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2189,10 +4990,10 @@ def stamp_create_read_write_session( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", + "type": "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", } - full_url = self.base_url + "/public/v1/submit/create_read_write_session" + full_url = self.base_url + "/public/v1/submit/delete_wallet_accounts" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2200,9 +5001,7 @@ def stamp_create_read_write_session( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_smart_contract_interface( - self, input: CreateSmartContractInterfaceBody - ) -> CreateSmartContractInterfaceResponse: + def delete_wallets(self, input: DeleteWalletsBody) -> DeleteWalletsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2213,20 +5012,18 @@ def create_smart_contract_interface( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", + "type": "ACTIVITY_TYPE_DELETE_WALLETS", } return self._activity( - "/public/v1/submit/create_smart_contract_interface", + "/public/v1/submit/delete_wallets", body, - "createSmartContractInterfaceResult", - CreateSmartContractInterfaceResponse, + "deleteWalletsResult", + DeleteWalletsResponse, ) - def stamp_create_smart_contract_interface( - self, input: CreateSmartContractInterfaceBody - ) -> SignedRequest: - """Stamp a createSmartContractInterface request without sending it.""" + def stamp_delete_wallets(self, input: DeleteWalletsBody) -> SignedRequest: + """Stamp a deleteWallets request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2238,10 +5035,10 @@ def stamp_create_smart_contract_interface( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", + "type": "ACTIVITY_TYPE_DELETE_WALLETS", } - full_url = self.base_url + "/public/v1/submit/create_smart_contract_interface" + full_url = self.base_url + "/public/v1/submit/delete_wallets" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2249,9 +5046,9 @@ def stamp_create_smart_contract_interface( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_sub_organization( - self, input: CreateSubOrganizationBody - ) -> CreateSubOrganizationResponse: + def delete_webhook_endpoint( + self, input: DeleteWebhookEndpointBody + ) -> DeleteWebhookEndpointResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2262,20 +5059,20 @@ def create_sub_organization( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", + "type": "ACTIVITY_TYPE_DELETE_WEBHOOK_ENDPOINT", } return self._activity( - "/public/v1/submit/create_sub_organization", + "/public/v1/submit/delete_webhook_endpoint", body, - "createSubOrganizationResultV7", - CreateSubOrganizationResponse, + "deleteWebhookEndpointResult", + DeleteWebhookEndpointResponse, ) - def stamp_create_sub_organization( - self, input: CreateSubOrganizationBody + def stamp_delete_webhook_endpoint( + self, input: DeleteWebhookEndpointBody ) -> SignedRequest: - """Stamp a createSubOrganization request without sending it.""" + """Stamp a deleteWebhookEndpoint request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2287,10 +5084,10 @@ def stamp_create_sub_organization( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", + "type": "ACTIVITY_TYPE_DELETE_WEBHOOK_ENDPOINT", } - full_url = self.base_url + "/public/v1/submit/create_sub_organization" + full_url = self.base_url + "/public/v1/submit/delete_webhook_endpoint" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2298,7 +5095,9 @@ def stamp_create_sub_organization( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_user_tag(self, input: CreateUserTagBody) -> CreateUserTagResponse: + def earn_claim_rewards( + self, input: EarnClaimRewardsBody + ) -> EarnClaimRewardsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2309,18 +5108,18 @@ def create_user_tag(self, input: CreateUserTagBody) -> CreateUserTagResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_USER_TAG", + "type": "ACTIVITY_TYPE_EARN_CLAIM_REWARDS", } return self._activity( - "/public/v1/submit/create_user_tag", + "/public/v1/submit/earn_claim_rewards", body, - "createUserTagResult", - CreateUserTagResponse, + "earnClaimRewardsResult", + EarnClaimRewardsResponse, ) - def stamp_create_user_tag(self, input: CreateUserTagBody) -> SignedRequest: - """Stamp a createUserTag request without sending it.""" + def stamp_earn_claim_rewards(self, input: EarnClaimRewardsBody) -> SignedRequest: + """Stamp a earnClaimRewards request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2332,10 +5131,10 @@ def stamp_create_user_tag(self, input: CreateUserTagBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_USER_TAG", + "type": "ACTIVITY_TYPE_EARN_CLAIM_REWARDS", } - full_url = self.base_url + "/public/v1/submit/create_user_tag" + full_url = self.base_url + "/public/v1/submit/earn_claim_rewards" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2343,7 +5142,9 @@ def stamp_create_user_tag(self, input: CreateUserTagBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_users(self, input: CreateUsersBody) -> CreateUsersResponse: + def earn_deploy_wrapper( + self, input: EarnDeployWrapperBody + ) -> EarnDeployWrapperResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2354,18 +5155,18 @@ def create_users(self, input: CreateUsersBody) -> CreateUsersResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_USERS_V3", + "type": "ACTIVITY_TYPE_EARN_DEPLOY_WRAPPER", } return self._activity( - "/public/v1/submit/create_users", + "/public/v1/submit/earn_deploy_wrapper", body, - "createUsersResult", - CreateUsersResponse, + "earnDeployWrapperResult", + EarnDeployWrapperResponse, ) - def stamp_create_users(self, input: CreateUsersBody) -> SignedRequest: - """Stamp a createUsers request without sending it.""" + def stamp_earn_deploy_wrapper(self, input: EarnDeployWrapperBody) -> SignedRequest: + """Stamp a earnDeployWrapper request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2377,10 +5178,10 @@ def stamp_create_users(self, input: CreateUsersBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_USERS_V3", + "type": "ACTIVITY_TYPE_EARN_DEPLOY_WRAPPER", } - full_url = self.base_url + "/public/v1/submit/create_users" + full_url = self.base_url + "/public/v1/submit/earn_deploy_wrapper" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2388,7 +5189,7 @@ def stamp_create_users(self, input: CreateUsersBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_wallet(self, input: CreateWalletBody) -> CreateWalletResponse: + def earn_deposit(self, input: EarnDepositBody) -> EarnDepositResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2399,18 +5200,18 @@ def create_wallet(self, input: CreateWalletBody) -> CreateWalletResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_WALLET", + "type": "ACTIVITY_TYPE_EARN_DEPOSIT", } return self._activity( - "/public/v1/submit/create_wallet", + "/public/v1/submit/earn_deposit", body, - "createWalletResult", - CreateWalletResponse, + "earnDepositResult", + EarnDepositResponse, ) - def stamp_create_wallet(self, input: CreateWalletBody) -> SignedRequest: - """Stamp a createWallet request without sending it.""" + def stamp_earn_deposit(self, input: EarnDepositBody) -> SignedRequest: + """Stamp a earnDeposit request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2422,10 +5223,10 @@ def stamp_create_wallet(self, input: CreateWalletBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_WALLET", + "type": "ACTIVITY_TYPE_EARN_DEPOSIT", } - full_url = self.base_url + "/public/v1/submit/create_wallet" + full_url = self.base_url + "/public/v1/submit/earn_deposit" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2433,9 +5234,9 @@ def stamp_create_wallet(self, input: CreateWalletBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def create_wallet_accounts( - self, input: CreateWalletAccountsBody - ) -> CreateWalletAccountsResponse: + def earn_set_wrapper_state( + self, input: EarnSetWrapperStateBody + ) -> EarnSetWrapperStateResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2446,20 +5247,20 @@ def create_wallet_accounts( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", + "type": "ACTIVITY_TYPE_EARN_SET_WRAPPER_STATE", } return self._activity( - "/public/v1/submit/create_wallet_accounts", + "/public/v1/submit/earn_set_wrapper_state", body, - "createWalletAccountsResult", - CreateWalletAccountsResponse, + "earnSetWrapperStateResult", + EarnSetWrapperStateResponse, ) - def stamp_create_wallet_accounts( - self, input: CreateWalletAccountsBody + def stamp_earn_set_wrapper_state( + self, input: EarnSetWrapperStateBody ) -> SignedRequest: - """Stamp a createWalletAccounts request without sending it.""" + """Stamp a earnSetWrapperState request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2471,10 +5272,10 @@ def stamp_create_wallet_accounts( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", + "type": "ACTIVITY_TYPE_EARN_SET_WRAPPER_STATE", } - full_url = self.base_url + "/public/v1/submit/create_wallet_accounts" + full_url = self.base_url + "/public/v1/submit/earn_set_wrapper_state" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2482,7 +5283,7 @@ def stamp_create_wallet_accounts( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_api_keys(self, input: DeleteApiKeysBody) -> DeleteApiKeysResponse: + def earn_withdraw(self, input: EarnWithdrawBody) -> EarnWithdrawResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2493,18 +5294,18 @@ def delete_api_keys(self, input: DeleteApiKeysBody) -> DeleteApiKeysResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_API_KEYS", + "type": "ACTIVITY_TYPE_EARN_WITHDRAW", } return self._activity( - "/public/v1/submit/delete_api_keys", + "/public/v1/submit/earn_withdraw", body, - "deleteApiKeysResult", - DeleteApiKeysResponse, + "earnWithdrawResult", + EarnWithdrawResponse, ) - def stamp_delete_api_keys(self, input: DeleteApiKeysBody) -> SignedRequest: - """Stamp a deleteApiKeys request without sending it.""" + def stamp_earn_withdraw(self, input: EarnWithdrawBody) -> SignedRequest: + """Stamp a earnWithdraw request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2516,10 +5317,10 @@ def stamp_delete_api_keys(self, input: DeleteApiKeysBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_API_KEYS", + "type": "ACTIVITY_TYPE_EARN_WITHDRAW", } - full_url = self.base_url + "/public/v1/submit/delete_api_keys" + full_url = self.base_url + "/public/v1/submit/earn_withdraw" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2527,9 +5328,7 @@ def stamp_delete_api_keys(self, input: DeleteApiKeysBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_authenticators( - self, input: DeleteAuthenticatorsBody - ) -> DeleteAuthenticatorsResponse: + def email_auth(self, input: EmailAuthBody) -> EmailAuthResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2540,20 +5339,15 @@ def delete_authenticators( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", + "type": "ACTIVITY_TYPE_EMAIL_AUTH_V3", } return self._activity( - "/public/v1/submit/delete_authenticators", - body, - "deleteAuthenticatorsResult", - DeleteAuthenticatorsResponse, + "/public/v1/submit/email_auth", body, "emailAuthResult", EmailAuthResponse ) - def stamp_delete_authenticators( - self, input: DeleteAuthenticatorsBody - ) -> SignedRequest: - """Stamp a deleteAuthenticators request without sending it.""" + def stamp_email_auth(self, input: EmailAuthBody) -> SignedRequest: + """Stamp a emailAuth request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2565,10 +5359,10 @@ def stamp_delete_authenticators( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", + "type": "ACTIVITY_TYPE_EMAIL_AUTH_V3", } - full_url = self.base_url + "/public/v1/submit/delete_authenticators" + full_url = self.base_url + "/public/v1/submit/email_auth" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2576,9 +5370,9 @@ def stamp_delete_authenticators( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_fiat_on_ramp_credential( - self, input: DeleteFiatOnRampCredentialBody - ) -> DeleteFiatOnRampCredentialResponse: + def eth_send_transaction( + self, input: EthSendTransactionBody + ) -> EthSendTransactionResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2589,20 +5383,20 @@ def delete_fiat_on_ramp_credential( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", + "type": "ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2", } return self._activity( - "/public/v1/submit/delete_fiat_on_ramp_credential", + "/public/v1/submit/eth_send_transaction", body, - "deleteFiatOnRampCredentialResult", - DeleteFiatOnRampCredentialResponse, + "ethSendTransactionResultV2", + EthSendTransactionResponse, ) - def stamp_delete_fiat_on_ramp_credential( - self, input: DeleteFiatOnRampCredentialBody + def stamp_eth_send_transaction( + self, input: EthSendTransactionBody ) -> SignedRequest: - """Stamp a deleteFiatOnRampCredential request without sending it.""" + """Stamp a ethSendTransaction request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2614,10 +5408,10 @@ def stamp_delete_fiat_on_ramp_credential( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", + "type": "ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2", } - full_url = self.base_url + "/public/v1/submit/delete_fiat_on_ramp_credential" + full_url = self.base_url + "/public/v1/submit/eth_send_transaction" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2625,9 +5419,9 @@ def stamp_delete_fiat_on_ramp_credential( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_invitation( - self, input: DeleteInvitationBody - ) -> DeleteInvitationResponse: + def eth_undelegate7702( + self, input: EthUndelegate7702Body + ) -> EthUndelegate7702Response: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2638,18 +5432,18 @@ def delete_invitation( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_INVITATION", + "type": "ACTIVITY_TYPE_ETH_UNDELEGATE_7702", } return self._activity( - "/public/v1/submit/delete_invitation", + "/public/v1/submit/eth_undelegate_7702", body, - "deleteInvitationResult", - DeleteInvitationResponse, + "ethUndelegate7702Result", + EthUndelegate7702Response, ) - def stamp_delete_invitation(self, input: DeleteInvitationBody) -> SignedRequest: - """Stamp a deleteInvitation request without sending it.""" + def stamp_eth_undelegate7702(self, input: EthUndelegate7702Body) -> SignedRequest: + """Stamp a ethUndelegate7702 request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2661,10 +5455,10 @@ def stamp_delete_invitation(self, input: DeleteInvitationBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_INVITATION", + "type": "ACTIVITY_TYPE_ETH_UNDELEGATE_7702", } - full_url = self.base_url + "/public/v1/submit/delete_invitation" + full_url = self.base_url + "/public/v1/submit/eth_undelegate_7702" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2672,9 +5466,7 @@ def stamp_delete_invitation(self, input: DeleteInvitationBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_oauth2_credential( - self, input: DeleteOauth2CredentialBody - ) -> DeleteOauth2CredentialResponse: + def execute_swap(self, input: ExecuteSwapBody) -> ExecuteSwapResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2685,20 +5477,18 @@ def delete_oauth2_credential( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", + "type": "ACTIVITY_TYPE_EXECUTE_SWAP_V3", } return self._activity( - "/public/v1/submit/delete_oauth2_credential", + "/public/v1/submit/execute_swap", body, - "deleteOauth2CredentialResult", - DeleteOauth2CredentialResponse, + "executeSwapResult", + ExecuteSwapResponse, ) - def stamp_delete_oauth2_credential( - self, input: DeleteOauth2CredentialBody - ) -> SignedRequest: - """Stamp a deleteOauth2Credential request without sending it.""" + def stamp_execute_swap(self, input: ExecuteSwapBody) -> SignedRequest: + """Stamp a executeSwap request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2710,10 +5500,10 @@ def stamp_delete_oauth2_credential( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", + "type": "ACTIVITY_TYPE_EXECUTE_SWAP_V3", } - full_url = self.base_url + "/public/v1/submit/delete_oauth2_credential" + full_url = self.base_url + "/public/v1/submit/execute_swap" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2721,9 +5511,9 @@ def stamp_delete_oauth2_credential( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_oauth_providers( - self, input: DeleteOauthProvidersBody - ) -> DeleteOauthProvidersResponse: + def export_private_key( + self, input: ExportPrivateKeyBody + ) -> ExportPrivateKeyResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2734,20 +5524,18 @@ def delete_oauth_providers( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", + "type": "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", } return self._activity( - "/public/v1/submit/delete_oauth_providers", + "/public/v1/submit/export_private_key", body, - "deleteOauthProvidersResult", - DeleteOauthProvidersResponse, + "exportPrivateKeyResult", + ExportPrivateKeyResponse, ) - def stamp_delete_oauth_providers( - self, input: DeleteOauthProvidersBody - ) -> SignedRequest: - """Stamp a deleteOauthProviders request without sending it.""" + def stamp_export_private_key(self, input: ExportPrivateKeyBody) -> SignedRequest: + """Stamp a exportPrivateKey request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2759,10 +5547,10 @@ def stamp_delete_oauth_providers( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", + "type": "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", } - full_url = self.base_url + "/public/v1/submit/delete_oauth_providers" + full_url = self.base_url + "/public/v1/submit/export_private_key" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2770,7 +5558,7 @@ def stamp_delete_oauth_providers( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_policies(self, input: DeletePoliciesBody) -> DeletePoliciesResponse: + def export_secrets(self, input: ExportSecretsBody) -> ExportSecretsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2781,18 +5569,18 @@ def delete_policies(self, input: DeletePoliciesBody) -> DeletePoliciesResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_POLICIES", + "type": "ACTIVITY_TYPE_EXPORT_SECRETS", } return self._activity( - "/public/v1/submit/delete_policies", + "/public/v1/submit/export_secrets", body, - "deletePoliciesResult", - DeletePoliciesResponse, + "exportSecretsResult", + ExportSecretsResponse, ) - def stamp_delete_policies(self, input: DeletePoliciesBody) -> SignedRequest: - """Stamp a deletePolicies request without sending it.""" + def stamp_export_secrets(self, input: ExportSecretsBody) -> SignedRequest: + """Stamp a exportSecrets request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2804,10 +5592,10 @@ def stamp_delete_policies(self, input: DeletePoliciesBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_POLICIES", + "type": "ACTIVITY_TYPE_EXPORT_SECRETS", } - full_url = self.base_url + "/public/v1/submit/delete_policies" + full_url = self.base_url + "/public/v1/submit/export_secrets" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2815,7 +5603,7 @@ def stamp_delete_policies(self, input: DeletePoliciesBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_policy(self, input: DeletePolicyBody) -> DeletePolicyResponse: + def export_wallet(self, input: ExportWalletBody) -> ExportWalletResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2826,18 +5614,18 @@ def delete_policy(self, input: DeletePolicyBody) -> DeletePolicyResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_POLICY", + "type": "ACTIVITY_TYPE_EXPORT_WALLET", } return self._activity( - "/public/v1/submit/delete_policy", + "/public/v1/submit/export_wallet", body, - "deletePolicyResult", - DeletePolicyResponse, + "exportWalletResult", + ExportWalletResponse, ) - def stamp_delete_policy(self, input: DeletePolicyBody) -> SignedRequest: - """Stamp a deletePolicy request without sending it.""" + def stamp_export_wallet(self, input: ExportWalletBody) -> SignedRequest: + """Stamp a exportWallet request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2849,10 +5637,10 @@ def stamp_delete_policy(self, input: DeletePolicyBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_POLICY", + "type": "ACTIVITY_TYPE_EXPORT_WALLET", } - full_url = self.base_url + "/public/v1/submit/delete_policy" + full_url = self.base_url + "/public/v1/submit/export_wallet" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2860,9 +5648,9 @@ def stamp_delete_policy(self, input: DeletePolicyBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_private_key_tags( - self, input: DeletePrivateKeyTagsBody - ) -> DeletePrivateKeyTagsResponse: + def export_wallet_account( + self, input: ExportWalletAccountBody + ) -> ExportWalletAccountResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2873,20 +5661,20 @@ def delete_private_key_tags( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", + "type": "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", } return self._activity( - "/public/v1/submit/delete_private_key_tags", + "/public/v1/submit/export_wallet_account", body, - "deletePrivateKeyTagsResult", - DeletePrivateKeyTagsResponse, + "exportWalletAccountResult", + ExportWalletAccountResponse, ) - def stamp_delete_private_key_tags( - self, input: DeletePrivateKeyTagsBody + def stamp_export_wallet_account( + self, input: ExportWalletAccountBody ) -> SignedRequest: - """Stamp a deletePrivateKeyTags request without sending it.""" + """Stamp a exportWalletAccount request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2898,10 +5686,10 @@ def stamp_delete_private_key_tags( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", + "type": "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", } - full_url = self.base_url + "/public/v1/submit/delete_private_key_tags" + full_url = self.base_url + "/public/v1/submit/export_wallet_account" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2909,9 +5697,9 @@ def stamp_delete_private_key_tags( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_private_keys( - self, input: DeletePrivateKeysBody - ) -> DeletePrivateKeysResponse: + def import_private_key( + self, input: ImportPrivateKeyBody + ) -> ImportPrivateKeyResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2922,18 +5710,18 @@ def delete_private_keys( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", + "type": "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", } return self._activity( - "/public/v1/submit/delete_private_keys", + "/public/v1/submit/import_private_key", body, - "deletePrivateKeysResult", - DeletePrivateKeysResponse, + "importPrivateKeyResult", + ImportPrivateKeyResponse, ) - def stamp_delete_private_keys(self, input: DeletePrivateKeysBody) -> SignedRequest: - """Stamp a deletePrivateKeys request without sending it.""" + def stamp_import_private_key(self, input: ImportPrivateKeyBody) -> SignedRequest: + """Stamp a importPrivateKey request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2945,10 +5733,10 @@ def stamp_delete_private_keys(self, input: DeletePrivateKeysBody) -> SignedReque "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", + "type": "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", } - full_url = self.base_url + "/public/v1/submit/delete_private_keys" + full_url = self.base_url + "/public/v1/submit/import_private_key" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -2956,9 +5744,7 @@ def stamp_delete_private_keys(self, input: DeletePrivateKeysBody) -> SignedReque url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_smart_contract_interface( - self, input: DeleteSmartContractInterfaceBody - ) -> DeleteSmartContractInterfaceResponse: + def import_secrets(self, input: ImportSecretsBody) -> ImportSecretsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2969,20 +5755,18 @@ def delete_smart_contract_interface( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", + "type": "ACTIVITY_TYPE_IMPORT_SECRETS", } return self._activity( - "/public/v1/submit/delete_smart_contract_interface", + "/public/v1/submit/import_secrets", body, - "deleteSmartContractInterfaceResult", - DeleteSmartContractInterfaceResponse, + "importSecretsResult", + ImportSecretsResponse, ) - def stamp_delete_smart_contract_interface( - self, input: DeleteSmartContractInterfaceBody - ) -> SignedRequest: - """Stamp a deleteSmartContractInterface request without sending it.""" + def stamp_import_secrets(self, input: ImportSecretsBody) -> SignedRequest: + """Stamp a importSecrets request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -2994,10 +5778,10 @@ def stamp_delete_smart_contract_interface( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", + "type": "ACTIVITY_TYPE_IMPORT_SECRETS", } - full_url = self.base_url + "/public/v1/submit/delete_smart_contract_interface" + full_url = self.base_url + "/public/v1/submit/import_secrets" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3005,9 +5789,7 @@ def stamp_delete_smart_contract_interface( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_sub_organization( - self, input: DeleteSubOrganizationBody - ) -> DeleteSubOrganizationResponse: + def import_wallet(self, input: ImportWalletBody) -> ImportWalletResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3018,20 +5800,18 @@ def delete_sub_organization( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", + "type": "ACTIVITY_TYPE_IMPORT_WALLET", } return self._activity( - "/public/v1/submit/delete_sub_organization", + "/public/v1/submit/import_wallet", body, - "deleteSubOrganizationResult", - DeleteSubOrganizationResponse, + "importWalletResult", + ImportWalletResponse, ) - def stamp_delete_sub_organization( - self, input: DeleteSubOrganizationBody - ) -> SignedRequest: - """Stamp a deleteSubOrganization request without sending it.""" + def stamp_import_wallet(self, input: ImportWalletBody) -> SignedRequest: + """Stamp a importWallet request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3043,10 +5823,10 @@ def stamp_delete_sub_organization( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", + "type": "ACTIVITY_TYPE_IMPORT_WALLET", } - full_url = self.base_url + "/public/v1/submit/delete_sub_organization" + full_url = self.base_url + "/public/v1/submit/import_wallet" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3054,7 +5834,7 @@ def stamp_delete_sub_organization( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_user_tags(self, input: DeleteUserTagsBody) -> DeleteUserTagsResponse: + def init_fiat_on_ramp(self, input: InitFiatOnRampBody) -> InitFiatOnRampResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3065,18 +5845,18 @@ def delete_user_tags(self, input: DeleteUserTagsBody) -> DeleteUserTagsResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_USER_TAGS", + "type": "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", } return self._activity( - "/public/v1/submit/delete_user_tags", + "/public/v1/submit/init_fiat_on_ramp", body, - "deleteUserTagsResult", - DeleteUserTagsResponse, + "initFiatOnRampResult", + InitFiatOnRampResponse, ) - def stamp_delete_user_tags(self, input: DeleteUserTagsBody) -> SignedRequest: - """Stamp a deleteUserTags request without sending it.""" + def stamp_init_fiat_on_ramp(self, input: InitFiatOnRampBody) -> SignedRequest: + """Stamp a initFiatOnRamp request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3088,10 +5868,10 @@ def stamp_delete_user_tags(self, input: DeleteUserTagsBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_USER_TAGS", + "type": "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", } - full_url = self.base_url + "/public/v1/submit/delete_user_tags" + full_url = self.base_url + "/public/v1/submit/init_fiat_on_ramp" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3099,7 +5879,9 @@ def stamp_delete_user_tags(self, input: DeleteUserTagsBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_users(self, input: DeleteUsersBody) -> DeleteUsersResponse: + def init_import_private_key( + self, input: InitImportPrivateKeyBody + ) -> InitImportPrivateKeyResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3110,18 +5892,20 @@ def delete_users(self, input: DeleteUsersBody) -> DeleteUsersResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_USERS", + "type": "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", } return self._activity( - "/public/v1/submit/delete_users", + "/public/v1/submit/init_import_private_key", body, - "deleteUsersResult", - DeleteUsersResponse, + "initImportPrivateKeyResult", + InitImportPrivateKeyResponse, ) - def stamp_delete_users(self, input: DeleteUsersBody) -> SignedRequest: - """Stamp a deleteUsers request without sending it.""" + def stamp_init_import_private_key( + self, input: InitImportPrivateKeyBody + ) -> SignedRequest: + """Stamp a initImportPrivateKey request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3133,10 +5917,10 @@ def stamp_delete_users(self, input: DeleteUsersBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_USERS", + "type": "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", } - full_url = self.base_url + "/public/v1/submit/delete_users" + full_url = self.base_url + "/public/v1/submit/init_import_private_key" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3144,9 +5928,9 @@ def stamp_delete_users(self, input: DeleteUsersBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_wallet_accounts( - self, input: DeleteWalletAccountsBody - ) -> DeleteWalletAccountsResponse: + def init_import_secrets( + self, input: InitImportSecretsBody + ) -> InitImportSecretsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3157,20 +5941,18 @@ def delete_wallet_accounts( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", + "type": "ACTIVITY_TYPE_INIT_IMPORT_SECRETS", } return self._activity( - "/public/v1/submit/delete_wallet_accounts", + "/public/v1/submit/init_import_secrets", body, - "deleteWalletAccountsResult", - DeleteWalletAccountsResponse, + "initImportSecretsResult", + InitImportSecretsResponse, ) - def stamp_delete_wallet_accounts( - self, input: DeleteWalletAccountsBody - ) -> SignedRequest: - """Stamp a deleteWalletAccounts request without sending it.""" + def stamp_init_import_secrets(self, input: InitImportSecretsBody) -> SignedRequest: + """Stamp a initImportSecrets request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3182,10 +5964,10 @@ def stamp_delete_wallet_accounts( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", + "type": "ACTIVITY_TYPE_INIT_IMPORT_SECRETS", } - full_url = self.base_url + "/public/v1/submit/delete_wallet_accounts" + full_url = self.base_url + "/public/v1/submit/init_import_secrets" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3193,7 +5975,9 @@ def stamp_delete_wallet_accounts( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def delete_wallets(self, input: DeleteWalletsBody) -> DeleteWalletsResponse: + def init_import_wallet( + self, input: InitImportWalletBody + ) -> InitImportWalletResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3204,18 +5988,18 @@ def delete_wallets(self, input: DeleteWalletsBody) -> DeleteWalletsResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_WALLETS", + "type": "ACTIVITY_TYPE_INIT_IMPORT_WALLET", } return self._activity( - "/public/v1/submit/delete_wallets", + "/public/v1/submit/init_import_wallet", body, - "deleteWalletsResult", - DeleteWalletsResponse, + "initImportWalletResult", + InitImportWalletResponse, ) - def stamp_delete_wallets(self, input: DeleteWalletsBody) -> SignedRequest: - """Stamp a deleteWallets request without sending it.""" + def stamp_init_import_wallet(self, input: InitImportWalletBody) -> SignedRequest: + """Stamp a initImportWallet request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3227,10 +6011,10 @@ def stamp_delete_wallets(self, input: DeleteWalletsBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_DELETE_WALLETS", + "type": "ACTIVITY_TYPE_INIT_IMPORT_WALLET", } - full_url = self.base_url + "/public/v1/submit/delete_wallets" + full_url = self.base_url + "/public/v1/submit/init_import_wallet" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3238,7 +6022,7 @@ def stamp_delete_wallets(self, input: DeleteWalletsBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def email_auth(self, input: EmailAuthBody) -> EmailAuthResponse: + def init_otp(self, input: InitOtpBody) -> InitOtpResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3249,15 +6033,15 @@ def email_auth(self, input: EmailAuthBody) -> EmailAuthResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_EMAIL_AUTH_V3", + "type": "ACTIVITY_TYPE_INIT_OTP_V3", } return self._activity( - "/public/v1/submit/email_auth", body, "emailAuthResult", EmailAuthResponse + "/public/v1/submit/init_otp", body, "initOtpResultV2", InitOtpResponse ) - def stamp_email_auth(self, input: EmailAuthBody) -> SignedRequest: - """Stamp a emailAuth request without sending it.""" + def stamp_init_otp(self, input: InitOtpBody) -> SignedRequest: + """Stamp a initOtp request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3269,10 +6053,10 @@ def stamp_email_auth(self, input: EmailAuthBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_EMAIL_AUTH_V3", + "type": "ACTIVITY_TYPE_INIT_OTP_V3", } - full_url = self.base_url + "/public/v1/submit/email_auth" + full_url = self.base_url + "/public/v1/submit/init_otp" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3280,9 +6064,7 @@ def stamp_email_auth(self, input: EmailAuthBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def eth_send_transaction( - self, input: EthSendTransactionBody - ) -> EthSendTransactionResponse: + def init_otp_auth(self, input: InitOtpAuthBody) -> InitOtpAuthResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3293,20 +6075,18 @@ def eth_send_transaction( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_ETH_SEND_TRANSACTION", + "type": "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", } return self._activity( - "/public/v1/submit/eth_send_transaction", + "/public/v1/submit/init_otp_auth", body, - "ethSendTransactionResult", - EthSendTransactionResponse, + "initOtpAuthResultV2", + InitOtpAuthResponse, ) - def stamp_eth_send_transaction( - self, input: EthSendTransactionBody - ) -> SignedRequest: - """Stamp a ethSendTransaction request without sending it.""" + def stamp_init_otp_auth(self, input: InitOtpAuthBody) -> SignedRequest: + """Stamp a initOtpAuth request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3318,10 +6098,10 @@ def stamp_eth_send_transaction( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_ETH_SEND_TRANSACTION", + "type": "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", } - full_url = self.base_url + "/public/v1/submit/eth_send_transaction" + full_url = self.base_url + "/public/v1/submit/init_otp_auth" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3329,9 +6109,9 @@ def stamp_eth_send_transaction( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def export_private_key( - self, input: ExportPrivateKeyBody - ) -> ExportPrivateKeyResponse: + def init_user_email_recovery( + self, input: InitUserEmailRecoveryBody + ) -> InitUserEmailRecoveryResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3342,18 +6122,20 @@ def export_private_key( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", + "type": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", } return self._activity( - "/public/v1/submit/export_private_key", + "/public/v1/submit/init_user_email_recovery", body, - "exportPrivateKeyResult", - ExportPrivateKeyResponse, + "initUserEmailRecoveryResult", + InitUserEmailRecoveryResponse, ) - def stamp_export_private_key(self, input: ExportPrivateKeyBody) -> SignedRequest: - """Stamp a exportPrivateKey request without sending it.""" + def stamp_init_user_email_recovery( + self, input: InitUserEmailRecoveryBody + ) -> SignedRequest: + """Stamp a initUserEmailRecovery request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3365,10 +6147,10 @@ def stamp_export_private_key(self, input: ExportPrivateKeyBody) -> SignedRequest "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", + "type": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", } - full_url = self.base_url + "/public/v1/submit/export_private_key" + full_url = self.base_url + "/public/v1/submit/init_user_email_recovery" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3376,7 +6158,7 @@ def stamp_export_private_key(self, input: ExportPrivateKeyBody) -> SignedRequest url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def export_wallet(self, input: ExportWalletBody) -> ExportWalletResponse: + def oauth(self, input: OauthBody) -> OauthResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3387,18 +6169,15 @@ def export_wallet(self, input: ExportWalletBody) -> ExportWalletResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_EXPORT_WALLET", + "type": "ACTIVITY_TYPE_OAUTH", } return self._activity( - "/public/v1/submit/export_wallet", - body, - "exportWalletResult", - ExportWalletResponse, + "/public/v1/submit/oauth", body, "oauthResult", OauthResponse ) - def stamp_export_wallet(self, input: ExportWalletBody) -> SignedRequest: - """Stamp a exportWallet request without sending it.""" + def stamp_oauth(self, input: OauthBody) -> SignedRequest: + """Stamp a oauth request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3410,10 +6189,10 @@ def stamp_export_wallet(self, input: ExportWalletBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_EXPORT_WALLET", + "type": "ACTIVITY_TYPE_OAUTH", } - full_url = self.base_url + "/public/v1/submit/export_wallet" + full_url = self.base_url + "/public/v1/submit/oauth" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3421,9 +6200,9 @@ def stamp_export_wallet(self, input: ExportWalletBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def export_wallet_account( - self, input: ExportWalletAccountBody - ) -> ExportWalletAccountResponse: + def oauth2_authenticate( + self, input: Oauth2AuthenticateBody + ) -> Oauth2AuthenticateResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3434,20 +6213,18 @@ def export_wallet_account( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", + "type": "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", } return self._activity( - "/public/v1/submit/export_wallet_account", + "/public/v1/submit/oauth2_authenticate", body, - "exportWalletAccountResult", - ExportWalletAccountResponse, + "oauth2AuthenticateResult", + Oauth2AuthenticateResponse, ) - def stamp_export_wallet_account( - self, input: ExportWalletAccountBody - ) -> SignedRequest: - """Stamp a exportWalletAccount request without sending it.""" + def stamp_oauth2_authenticate(self, input: Oauth2AuthenticateBody) -> SignedRequest: + """Stamp a oauth2Authenticate request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3459,10 +6236,10 @@ def stamp_export_wallet_account( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", + "type": "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", } - full_url = self.base_url + "/public/v1/submit/export_wallet_account" + full_url = self.base_url + "/public/v1/submit/oauth2_authenticate" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3470,9 +6247,7 @@ def stamp_export_wallet_account( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def import_private_key( - self, input: ImportPrivateKeyBody - ) -> ImportPrivateKeyResponse: + def oauth_login(self, input: OauthLoginBody) -> OauthLoginResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3483,18 +6258,18 @@ def import_private_key( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", + "type": "ACTIVITY_TYPE_OAUTH_LOGIN", } return self._activity( - "/public/v1/submit/import_private_key", + "/public/v1/submit/oauth_login", body, - "importPrivateKeyResult", - ImportPrivateKeyResponse, + "oauthLoginResult", + OauthLoginResponse, ) - def stamp_import_private_key(self, input: ImportPrivateKeyBody) -> SignedRequest: - """Stamp a importPrivateKey request without sending it.""" + def stamp_oauth_login(self, input: OauthLoginBody) -> SignedRequest: + """Stamp a oauthLogin request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3506,10 +6281,10 @@ def stamp_import_private_key(self, input: ImportPrivateKeyBody) -> SignedRequest "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", + "type": "ACTIVITY_TYPE_OAUTH_LOGIN", } - full_url = self.base_url + "/public/v1/submit/import_private_key" + full_url = self.base_url + "/public/v1/submit/oauth_login" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3517,7 +6292,7 @@ def stamp_import_private_key(self, input: ImportPrivateKeyBody) -> SignedRequest url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def import_wallet(self, input: ImportWalletBody) -> ImportWalletResponse: + def otp_auth(self, input: OtpAuthBody) -> OtpAuthResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3528,18 +6303,15 @@ def import_wallet(self, input: ImportWalletBody) -> ImportWalletResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_IMPORT_WALLET", + "type": "ACTIVITY_TYPE_OTP_AUTH", } return self._activity( - "/public/v1/submit/import_wallet", - body, - "importWalletResult", - ImportWalletResponse, + "/public/v1/submit/otp_auth", body, "otpAuthResult", OtpAuthResponse ) - def stamp_import_wallet(self, input: ImportWalletBody) -> SignedRequest: - """Stamp a importWallet request without sending it.""" + def stamp_otp_auth(self, input: OtpAuthBody) -> SignedRequest: + """Stamp a otpAuth request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3551,10 +6323,10 @@ def stamp_import_wallet(self, input: ImportWalletBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_IMPORT_WALLET", + "type": "ACTIVITY_TYPE_OTP_AUTH", } - full_url = self.base_url + "/public/v1/submit/import_wallet" + full_url = self.base_url + "/public/v1/submit/otp_auth" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3562,7 +6334,7 @@ def stamp_import_wallet(self, input: ImportWalletBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def init_fiat_on_ramp(self, input: InitFiatOnRampBody) -> InitFiatOnRampResponse: + def otp_login(self, input: OtpLoginBody) -> OtpLoginResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3573,18 +6345,15 @@ def init_fiat_on_ramp(self, input: InitFiatOnRampBody) -> InitFiatOnRampResponse "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", + "type": "ACTIVITY_TYPE_OTP_LOGIN_V2", } return self._activity( - "/public/v1/submit/init_fiat_on_ramp", - body, - "initFiatOnRampResult", - InitFiatOnRampResponse, + "/public/v1/submit/otp_login", body, "otpLoginResult", OtpLoginResponse ) - def stamp_init_fiat_on_ramp(self, input: InitFiatOnRampBody) -> SignedRequest: - """Stamp a initFiatOnRamp request without sending it.""" + def stamp_otp_login(self, input: OtpLoginBody) -> SignedRequest: + """Stamp a otpLogin request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3596,10 +6365,10 @@ def stamp_init_fiat_on_ramp(self, input: InitFiatOnRampBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", + "type": "ACTIVITY_TYPE_OTP_LOGIN_V2", } - full_url = self.base_url + "/public/v1/submit/init_fiat_on_ramp" + full_url = self.base_url + "/public/v1/submit/otp_login" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3607,9 +6376,9 @@ def stamp_init_fiat_on_ramp(self, input: InitFiatOnRampBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def init_import_private_key( - self, input: InitImportPrivateKeyBody - ) -> InitImportPrivateKeyResponse: + def post_tvc_quorum_key_share( + self, input: PostTvcQuorumKeyShareBody + ) -> PostTvcQuorumKeyShareResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3620,20 +6389,20 @@ def init_import_private_key( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", + "type": "ACTIVITY_TYPE_POST_TVC_QUORUM_KEY_SHARE", } return self._activity( - "/public/v1/submit/init_import_private_key", + "/public/v1/submit/post_tvc_quorum_key_share", body, - "initImportPrivateKeyResult", - InitImportPrivateKeyResponse, + "postTvcQuorumKeyShareResult", + PostTvcQuorumKeyShareResponse, ) - def stamp_init_import_private_key( - self, input: InitImportPrivateKeyBody + def stamp_post_tvc_quorum_key_share( + self, input: PostTvcQuorumKeyShareBody ) -> SignedRequest: - """Stamp a initImportPrivateKey request without sending it.""" + """Stamp a postTvcQuorumKeyShare request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3645,10 +6414,10 @@ def stamp_init_import_private_key( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", + "type": "ACTIVITY_TYPE_POST_TVC_QUORUM_KEY_SHARE", } - full_url = self.base_url + "/public/v1/submit/init_import_private_key" + full_url = self.base_url + "/public/v1/submit/post_tvc_quorum_key_share" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3656,9 +6425,9 @@ def stamp_init_import_private_key( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def init_import_wallet( - self, input: InitImportWalletBody - ) -> InitImportWalletResponse: + def re_encrypt_tvc_quorum_key_share( + self, input: ReEncryptTvcQuorumKeyShareBody + ) -> ReEncryptTvcQuorumKeyShareResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3669,18 +6438,20 @@ def init_import_wallet( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_IMPORT_WALLET", + "type": "ACTIVITY_TYPE_RE_ENCRYPT_TVC_QUORUM_KEY_SHARE", } return self._activity( - "/public/v1/submit/init_import_wallet", + "/public/v1/submit/re_encrypt_tvc_quorum_key_share", body, - "initImportWalletResult", - InitImportWalletResponse, + "reEncryptTvcQuorumKeyShareResult", + ReEncryptTvcQuorumKeyShareResponse, ) - def stamp_init_import_wallet(self, input: InitImportWalletBody) -> SignedRequest: - """Stamp a initImportWallet request without sending it.""" + def stamp_re_encrypt_tvc_quorum_key_share( + self, input: ReEncryptTvcQuorumKeyShareBody + ) -> SignedRequest: + """Stamp a reEncryptTvcQuorumKeyShare request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3692,10 +6463,10 @@ def stamp_init_import_wallet(self, input: InitImportWalletBody) -> SignedRequest "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_IMPORT_WALLET", + "type": "ACTIVITY_TYPE_RE_ENCRYPT_TVC_QUORUM_KEY_SHARE", } - full_url = self.base_url + "/public/v1/submit/init_import_wallet" + full_url = self.base_url + "/public/v1/submit/re_encrypt_tvc_quorum_key_share" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3703,7 +6474,7 @@ def stamp_init_import_wallet(self, input: InitImportWalletBody) -> SignedRequest url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def init_otp(self, input: InitOtpBody) -> InitOtpResponse: + def recover_user(self, input: RecoverUserBody) -> RecoverUserResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3714,15 +6485,18 @@ def init_otp(self, input: InitOtpBody) -> InitOtpResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_OTP_V3", + "type": "ACTIVITY_TYPE_RECOVER_USER", } return self._activity( - "/public/v1/submit/init_otp", body, "initOtpResultV2", InitOtpResponse + "/public/v1/submit/recover_user", + body, + "recoverUserResult", + RecoverUserResponse, ) - def stamp_init_otp(self, input: InitOtpBody) -> SignedRequest: - """Stamp a initOtp request without sending it.""" + def stamp_recover_user(self, input: RecoverUserBody) -> SignedRequest: + """Stamp a recoverUser request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3734,10 +6508,10 @@ def stamp_init_otp(self, input: InitOtpBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_OTP_V3", + "type": "ACTIVITY_TYPE_RECOVER_USER", } - full_url = self.base_url + "/public/v1/submit/init_otp" + full_url = self.base_url + "/public/v1/submit/recover_user" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3745,7 +6519,7 @@ def stamp_init_otp(self, input: InitOtpBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def init_otp_auth(self, input: InitOtpAuthBody) -> InitOtpAuthResponse: + def reject_activity(self, input: RejectActivityBody) -> RejectActivityResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3756,18 +6530,15 @@ def init_otp_auth(self, input: InitOtpAuthBody) -> InitOtpAuthResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", + "type": "ACTIVITY_TYPE_REJECT_ACTIVITY", } - return self._activity( - "/public/v1/submit/init_otp_auth", - body, - "initOtpAuthResultV2", - InitOtpAuthResponse, + return self._activity_decision( + "/public/v1/submit/reject_activity", body, RejectActivityResponse ) - def stamp_init_otp_auth(self, input: InitOtpAuthBody) -> SignedRequest: - """Stamp a initOtpAuth request without sending it.""" + def stamp_reject_activity(self, input: RejectActivityBody) -> SignedRequest: + """Stamp a rejectActivity request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3779,20 +6550,20 @@ def stamp_init_otp_auth(self, input: InitOtpAuthBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", + "type": "ACTIVITY_TYPE_REJECT_ACTIVITY", } - full_url = self.base_url + "/public/v1/submit/init_otp_auth" + full_url = self.base_url + "/public/v1/submit/reject_activity" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) return SignedRequest( - url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY_DECISION ) - def init_user_email_recovery( - self, input: InitUserEmailRecoveryBody - ) -> InitUserEmailRecoveryResponse: + def remove_ip_allowlist( + self, input: RemoveIpAllowlistBody + ) -> RemoveIpAllowlistResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3803,20 +6574,18 @@ def init_user_email_recovery( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", + "type": "ACTIVITY_TYPE_REMOVE_IP_ALLOWLIST", } return self._activity( - "/public/v1/submit/init_user_email_recovery", + "/public/v1/submit/remove_ip_allowlist", body, - "initUserEmailRecoveryResult", - InitUserEmailRecoveryResponse, + "removeIpAllowlistResult", + RemoveIpAllowlistResponse, ) - def stamp_init_user_email_recovery( - self, input: InitUserEmailRecoveryBody - ) -> SignedRequest: - """Stamp a initUserEmailRecovery request without sending it.""" + def stamp_remove_ip_allowlist(self, input: RemoveIpAllowlistBody) -> SignedRequest: + """Stamp a removeIpAllowlist request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3828,10 +6597,10 @@ def stamp_init_user_email_recovery( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", + "type": "ACTIVITY_TYPE_REMOVE_IP_ALLOWLIST", } - full_url = self.base_url + "/public/v1/submit/init_user_email_recovery" + full_url = self.base_url + "/public/v1/submit/remove_ip_allowlist" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3839,7 +6608,9 @@ def stamp_init_user_email_recovery( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def oauth(self, input: OauthBody) -> OauthResponse: + def remove_organization_feature( + self, input: RemoveOrganizationFeatureBody + ) -> RemoveOrganizationFeatureResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3850,15 +6621,20 @@ def oauth(self, input: OauthBody) -> OauthResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OAUTH", + "type": "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", } return self._activity( - "/public/v1/submit/oauth", body, "oauthResult", OauthResponse + "/public/v1/submit/remove_organization_feature", + body, + "removeOrganizationFeatureResult", + RemoveOrganizationFeatureResponse, ) - def stamp_oauth(self, input: OauthBody) -> SignedRequest: - """Stamp a oauth request without sending it.""" + def stamp_remove_organization_feature( + self, input: RemoveOrganizationFeatureBody + ) -> SignedRequest: + """Stamp a removeOrganizationFeature request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3870,10 +6646,10 @@ def stamp_oauth(self, input: OauthBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OAUTH", + "type": "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", } - full_url = self.base_url + "/public/v1/submit/oauth" + full_url = self.base_url + "/public/v1/submit/remove_organization_feature" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3881,9 +6657,9 @@ def stamp_oauth(self, input: OauthBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def oauth2_authenticate( - self, input: Oauth2AuthenticateBody - ) -> Oauth2AuthenticateResponse: + def restore_tvc_deployment( + self, input: RestoreTvcDeploymentBody + ) -> RestoreTvcDeploymentResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3894,18 +6670,20 @@ def oauth2_authenticate( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", + "type": "ACTIVITY_TYPE_RESTORE_TVC_DEPLOYMENT", } return self._activity( - "/public/v1/submit/oauth2_authenticate", + "/public/v1/submit/restore_tvc_deployment", body, - "oauth2AuthenticateResult", - Oauth2AuthenticateResponse, + "restoreTvcDeploymentResult", + RestoreTvcDeploymentResponse, ) - def stamp_oauth2_authenticate(self, input: Oauth2AuthenticateBody) -> SignedRequest: - """Stamp a oauth2Authenticate request without sending it.""" + def stamp_restore_tvc_deployment( + self, input: RestoreTvcDeploymentBody + ) -> SignedRequest: + """Stamp a restoreTvcDeployment request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3917,10 +6695,10 @@ def stamp_oauth2_authenticate(self, input: Oauth2AuthenticateBody) -> SignedRequ "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", + "type": "ACTIVITY_TYPE_RESTORE_TVC_DEPLOYMENT", } - full_url = self.base_url + "/public/v1/submit/oauth2_authenticate" + full_url = self.base_url + "/public/v1/submit/restore_tvc_deployment" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3928,7 +6706,7 @@ def stamp_oauth2_authenticate(self, input: Oauth2AuthenticateBody) -> SignedRequ url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def oauth_login(self, input: OauthLoginBody) -> OauthLoginResponse: + def set_ip_allowlist(self, input: SetIpAllowlistBody) -> SetIpAllowlistResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3939,18 +6717,18 @@ def oauth_login(self, input: OauthLoginBody) -> OauthLoginResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OAUTH_LOGIN", + "type": "ACTIVITY_TYPE_SET_IP_ALLOWLIST", } return self._activity( - "/public/v1/submit/oauth_login", + "/public/v1/submit/set_ip_allowlist", body, - "oauthLoginResult", - OauthLoginResponse, + "setIpAllowlistResult", + SetIpAllowlistResponse, ) - def stamp_oauth_login(self, input: OauthLoginBody) -> SignedRequest: - """Stamp a oauthLogin request without sending it.""" + def stamp_set_ip_allowlist(self, input: SetIpAllowlistBody) -> SignedRequest: + """Stamp a setIpAllowlist request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3962,10 +6740,10 @@ def stamp_oauth_login(self, input: OauthLoginBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OAUTH_LOGIN", + "type": "ACTIVITY_TYPE_SET_IP_ALLOWLIST", } - full_url = self.base_url + "/public/v1/submit/oauth_login" + full_url = self.base_url + "/public/v1/submit/set_ip_allowlist" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -3973,7 +6751,9 @@ def stamp_oauth_login(self, input: OauthLoginBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def otp_auth(self, input: OtpAuthBody) -> OtpAuthResponse: + def set_organization_feature( + self, input: SetOrganizationFeatureBody + ) -> SetOrganizationFeatureResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -3984,15 +6764,20 @@ def otp_auth(self, input: OtpAuthBody) -> OtpAuthResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OTP_AUTH", + "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", } return self._activity( - "/public/v1/submit/otp_auth", body, "otpAuthResult", OtpAuthResponse + "/public/v1/submit/set_organization_feature", + body, + "setOrganizationFeatureResult", + SetOrganizationFeatureResponse, ) - def stamp_otp_auth(self, input: OtpAuthBody) -> SignedRequest: - """Stamp a otpAuth request without sending it.""" + def stamp_set_organization_feature( + self, input: SetOrganizationFeatureBody + ) -> SignedRequest: + """Stamp a setOrganizationFeature request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4004,10 +6789,10 @@ def stamp_otp_auth(self, input: OtpAuthBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OTP_AUTH", + "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", } - full_url = self.base_url + "/public/v1/submit/otp_auth" + full_url = self.base_url + "/public/v1/submit/set_organization_feature" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4015,7 +6800,9 @@ def stamp_otp_auth(self, input: OtpAuthBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def otp_login(self, input: OtpLoginBody) -> OtpLoginResponse: + def update_tvc_app_live_deployment( + self, input: UpdateTvcAppLiveDeploymentBody + ) -> UpdateTvcAppLiveDeploymentResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4026,15 +6813,20 @@ def otp_login(self, input: OtpLoginBody) -> OtpLoginResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OTP_LOGIN_V2", + "type": "ACTIVITY_TYPE_UPDATE_TVC_APP_LIVE_DEPLOYMENT", } return self._activity( - "/public/v1/submit/otp_login", body, "otpLoginResult", OtpLoginResponse + "/public/v1/submit/set_tvc_app_live_deployment", + body, + "updateTvcAppLiveDeploymentResult", + UpdateTvcAppLiveDeploymentResponse, ) - def stamp_otp_login(self, input: OtpLoginBody) -> SignedRequest: - """Stamp a otpLogin request without sending it.""" + def stamp_update_tvc_app_live_deployment( + self, input: UpdateTvcAppLiveDeploymentBody + ) -> SignedRequest: + """Stamp a updateTvcAppLiveDeployment request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4046,10 +6838,10 @@ def stamp_otp_login(self, input: OtpLoginBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_OTP_LOGIN_V2", + "type": "ACTIVITY_TYPE_UPDATE_TVC_APP_LIVE_DEPLOYMENT", } - full_url = self.base_url + "/public/v1/submit/otp_login" + full_url = self.base_url + "/public/v1/submit/set_tvc_app_live_deployment" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4057,7 +6849,7 @@ def stamp_otp_login(self, input: OtpLoginBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def recover_user(self, input: RecoverUserBody) -> RecoverUserResponse: + def sign_raw_payload(self, input: SignRawPayloadBody) -> SignRawPayloadResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4068,18 +6860,18 @@ def recover_user(self, input: RecoverUserBody) -> RecoverUserResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_RECOVER_USER", + "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", } return self._activity( - "/public/v1/submit/recover_user", + "/public/v1/submit/sign_raw_payload", body, - "recoverUserResult", - RecoverUserResponse, + "signRawPayloadResult", + SignRawPayloadResponse, ) - def stamp_recover_user(self, input: RecoverUserBody) -> SignedRequest: - """Stamp a recoverUser request without sending it.""" + def stamp_sign_raw_payload(self, input: SignRawPayloadBody) -> SignedRequest: + """Stamp a signRawPayload request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4091,10 +6883,10 @@ def stamp_recover_user(self, input: RecoverUserBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_RECOVER_USER", + "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", } - full_url = self.base_url + "/public/v1/submit/recover_user" + full_url = self.base_url + "/public/v1/submit/sign_raw_payload" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4102,7 +6894,7 @@ def stamp_recover_user(self, input: RecoverUserBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def reject_activity(self, input: RejectActivityBody) -> RejectActivityResponse: + def sign_raw_payloads(self, input: SignRawPayloadsBody) -> SignRawPayloadsResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4113,15 +6905,18 @@ def reject_activity(self, input: RejectActivityBody) -> RejectActivityResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_REJECT_ACTIVITY", + "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", } - return self._activity_decision( - "/public/v1/submit/reject_activity", body, RejectActivityResponse + return self._activity( + "/public/v1/submit/sign_raw_payloads", + body, + "signRawPayloadsResult", + SignRawPayloadsResponse, ) - def stamp_reject_activity(self, input: RejectActivityBody) -> SignedRequest: - """Stamp a rejectActivity request without sending it.""" + def stamp_sign_raw_payloads(self, input: SignRawPayloadsBody) -> SignedRequest: + """Stamp a signRawPayloads request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4133,20 +6928,18 @@ def stamp_reject_activity(self, input: RejectActivityBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_REJECT_ACTIVITY", + "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", } - full_url = self.base_url + "/public/v1/submit/reject_activity" + full_url = self.base_url + "/public/v1/submit/sign_raw_payloads" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) return SignedRequest( - url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY_DECISION + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def remove_organization_feature( - self, input: RemoveOrganizationFeatureBody - ) -> RemoveOrganizationFeatureResponse: + def sign_transaction(self, input: SignTransactionBody) -> SignTransactionResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4157,20 +6950,18 @@ def remove_organization_feature( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", + "type": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", } return self._activity( - "/public/v1/submit/remove_organization_feature", + "/public/v1/submit/sign_transaction", body, - "removeOrganizationFeatureResult", - RemoveOrganizationFeatureResponse, + "signTransactionResult", + SignTransactionResponse, ) - def stamp_remove_organization_feature( - self, input: RemoveOrganizationFeatureBody - ) -> SignedRequest: - """Stamp a removeOrganizationFeature request without sending it.""" + def stamp_sign_transaction(self, input: SignTransactionBody) -> SignedRequest: + """Stamp a signTransaction request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4182,10 +6973,10 @@ def stamp_remove_organization_feature( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", + "type": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", } - full_url = self.base_url + "/public/v1/submit/remove_organization_feature" + full_url = self.base_url + "/public/v1/submit/sign_transaction" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4193,9 +6984,9 @@ def stamp_remove_organization_feature( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def set_organization_feature( - self, input: SetOrganizationFeatureBody - ) -> SetOrganizationFeatureResponse: + def sol_send_transaction( + self, input: SolSendTransactionBody + ) -> SolSendTransactionResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4206,20 +6997,20 @@ def set_organization_feature( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", + "type": "ACTIVITY_TYPE_SOL_SEND_TRANSACTION_V2", } return self._activity( - "/public/v1/submit/set_organization_feature", + "/public/v1/submit/sol_send_transaction", body, - "setOrganizationFeatureResult", - SetOrganizationFeatureResponse, + "solSendTransactionResultV2", + SolSendTransactionResponse, ) - def stamp_set_organization_feature( - self, input: SetOrganizationFeatureBody + def stamp_sol_send_transaction( + self, input: SolSendTransactionBody ) -> SignedRequest: - """Stamp a setOrganizationFeature request without sending it.""" + """Stamp a solSendTransaction request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4231,10 +7022,10 @@ def stamp_set_organization_feature( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", + "type": "ACTIVITY_TYPE_SOL_SEND_TRANSACTION_V2", } - full_url = self.base_url + "/public/v1/submit/set_organization_feature" + full_url = self.base_url + "/public/v1/submit/sol_send_transaction" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4242,7 +7033,9 @@ def stamp_set_organization_feature( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def sign_raw_payload(self, input: SignRawPayloadBody) -> SignRawPayloadResponse: + def spark_claim_transfer( + self, input: SparkClaimTransferBody + ) -> SparkClaimTransferResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4253,18 +7046,20 @@ def sign_raw_payload(self, input: SignRawPayloadBody) -> SignRawPayloadResponse: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", + "type": "ACTIVITY_TYPE_SPARK_CLAIM_TRANSFER", } return self._activity( - "/public/v1/submit/sign_raw_payload", + "/public/v1/submit/spark_claim_transfer", body, - "signRawPayloadResult", - SignRawPayloadResponse, + "sparkClaimTransferResult", + SparkClaimTransferResponse, ) - def stamp_sign_raw_payload(self, input: SignRawPayloadBody) -> SignedRequest: - """Stamp a signRawPayload request without sending it.""" + def stamp_spark_claim_transfer( + self, input: SparkClaimTransferBody + ) -> SignedRequest: + """Stamp a sparkClaimTransfer request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4276,10 +7071,10 @@ def stamp_sign_raw_payload(self, input: SignRawPayloadBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", + "type": "ACTIVITY_TYPE_SPARK_CLAIM_TRANSFER", } - full_url = self.base_url + "/public/v1/submit/sign_raw_payload" + full_url = self.base_url + "/public/v1/submit/spark_claim_transfer" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4287,7 +7082,9 @@ def stamp_sign_raw_payload(self, input: SignRawPayloadBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def sign_raw_payloads(self, input: SignRawPayloadsBody) -> SignRawPayloadsResponse: + def spark_prepare_lightning_receive( + self, input: SparkPrepareLightningReceiveBody + ) -> SparkPrepareLightningReceiveResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4298,18 +7095,20 @@ def sign_raw_payloads(self, input: SignRawPayloadsBody) -> SignRawPayloadsRespon "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", + "type": "ACTIVITY_TYPE_SPARK_PREPARE_LIGHTNING_RECEIVE", } return self._activity( - "/public/v1/submit/sign_raw_payloads", + "/public/v1/submit/spark_prepare_lightning_receive", body, - "signRawPayloadsResult", - SignRawPayloadsResponse, + "sparkPrepareLightningReceiveResult", + SparkPrepareLightningReceiveResponse, ) - def stamp_sign_raw_payloads(self, input: SignRawPayloadsBody) -> SignedRequest: - """Stamp a signRawPayloads request without sending it.""" + def stamp_spark_prepare_lightning_receive( + self, input: SparkPrepareLightningReceiveBody + ) -> SignedRequest: + """Stamp a sparkPrepareLightningReceive request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4321,10 +7120,10 @@ def stamp_sign_raw_payloads(self, input: SignRawPayloadsBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", + "type": "ACTIVITY_TYPE_SPARK_PREPARE_LIGHTNING_RECEIVE", } - full_url = self.base_url + "/public/v1/submit/sign_raw_payloads" + full_url = self.base_url + "/public/v1/submit/spark_prepare_lightning_receive" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4332,7 +7131,9 @@ def stamp_sign_raw_payloads(self, input: SignRawPayloadsBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def sign_transaction(self, input: SignTransactionBody) -> SignTransactionResponse: + def spark_prepare_transfer( + self, input: SparkPrepareTransferBody + ) -> SparkPrepareTransferResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4343,18 +7144,20 @@ def sign_transaction(self, input: SignTransactionBody) -> SignTransactionRespons "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", + "type": "ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER", } return self._activity( - "/public/v1/submit/sign_transaction", + "/public/v1/submit/spark_prepare_transfer", body, - "signTransactionResult", - SignTransactionResponse, + "sparkPrepareTransferResult", + SparkPrepareTransferResponse, ) - def stamp_sign_transaction(self, input: SignTransactionBody) -> SignedRequest: - """Stamp a signTransaction request without sending it.""" + def stamp_spark_prepare_transfer( + self, input: SparkPrepareTransferBody + ) -> SignedRequest: + """Stamp a sparkPrepareTransfer request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4366,10 +7169,10 @@ def stamp_sign_transaction(self, input: SignTransactionBody) -> SignedRequest: "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", + "type": "ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER", } - full_url = self.base_url + "/public/v1/submit/sign_transaction" + full_url = self.base_url + "/public/v1/submit/spark_prepare_transfer" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4377,9 +7180,7 @@ def stamp_sign_transaction(self, input: SignTransactionBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) - def sol_send_transaction( - self, input: SolSendTransactionBody - ) -> SolSendTransactionResponse: + def spark_sign_frost(self, input: SparkSignFrostBody) -> SparkSignFrostResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4390,20 +7191,18 @@ def sol_send_transaction( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SOL_SEND_TRANSACTION", + "type": "ACTIVITY_TYPE_SPARK_SIGN_FROST", } return self._activity( - "/public/v1/submit/sol_send_transaction", + "/public/v1/submit/spark_sign_frost", body, - "solSendTransactionResult", - SolSendTransactionResponse, + "sparkSignFrostResult", + SparkSignFrostResponse, ) - def stamp_sol_send_transaction( - self, input: SolSendTransactionBody - ) -> SignedRequest: - """Stamp a solSendTransaction request without sending it.""" + def stamp_spark_sign_frost(self, input: SparkSignFrostBody) -> SignedRequest: + """Stamp a sparkSignFrost request without sending it.""" # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) @@ -4415,10 +7214,10 @@ def stamp_sol_send_transaction( "parameters": input_dict, "organizationId": organization_id, "timestampMs": timestamp_ms, - "type": "ACTIVITY_TYPE_SOL_SEND_TRANSACTION", + "type": "ACTIVITY_TYPE_SPARK_SIGN_FROST", } - full_url = self.base_url + "/public/v1/submit/sol_send_transaction" + full_url = self.base_url + "/public/v1/submit/spark_sign_frost" body_str = self._serialize_body(body) stamp = self.stamper.stamp(body_str) @@ -4520,6 +7319,51 @@ def stamp_update_fiat_on_ramp_credential( url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) + def update_mfa_policy(self, input: UpdateMfaPolicyBody) -> UpdateMfaPolicyResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPDATE_MFA_POLICY", + } + + return self._activity( + "/public/v1/submit/update_mfa_policy", + body, + "updateMfaPolicyResult", + UpdateMfaPolicyResponse, + ) + + def stamp_update_mfa_policy(self, input: UpdateMfaPolicyBody) -> SignedRequest: + """Stamp a updateMfaPolicy request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPDATE_MFA_POLICY", + } + + full_url = self.base_url + "/public/v1/submit/update_mfa_policy" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + def update_oauth2_credential( self, input: UpdateOauth2CredentialBody ) -> UpdateOauth2CredentialResponse: @@ -5033,6 +7877,204 @@ def stamp_update_wallet(self, input: UpdateWalletBody) -> SignedRequest: url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY ) + def update_webhook_endpoint( + self, input: UpdateWebhookEndpointBody + ) -> UpdateWebhookEndpointResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPDATE_WEBHOOK_ENDPOINT", + } + + return self._activity( + "/public/v1/submit/update_webhook_endpoint", + body, + "updateWebhookEndpointResult", + UpdateWebhookEndpointResponse, + ) + + def stamp_update_webhook_endpoint( + self, input: UpdateWebhookEndpointBody + ) -> SignedRequest: + """Stamp a updateWebhookEndpoint request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPDATE_WEBHOOK_ENDPOINT", + } + + full_url = self.base_url + "/public/v1/submit/update_webhook_endpoint" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def upsert_swap_config( + self, input: UpsertSwapConfigBody + ) -> UpsertSwapConfigResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPSERT_SWAP_CONFIG", + } + + return self._activity( + "/public/v1/submit/upsert_swap_config", + body, + "upsertSwapConfigResult", + UpsertSwapConfigResponse, + ) + + def stamp_upsert_swap_config(self, input: UpsertSwapConfigBody) -> SignedRequest: + """Stamp a upsertSwapConfig request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPSERT_SWAP_CONFIG", + } + + full_url = self.base_url + "/public/v1/submit/upsert_swap_config" + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def upsert_swap_fee_sponsorship_limit_config( + self, input: UpsertSwapFeeSponsorshipLimitConfigBody + ) -> UpsertSwapFeeSponsorshipLimitConfigResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPSERT_SWAP_FEE_SPONSORSHIP_LIMIT_CONFIG", + } + + return self._activity( + "/public/v1/submit/upsert_swap_fee_sponsorship_limit_config", + body, + "upsertSwapFeeSponsorshipLimitConfigResult", + UpsertSwapFeeSponsorshipLimitConfigResponse, + ) + + def stamp_upsert_swap_fee_sponsorship_limit_config( + self, input: UpsertSwapFeeSponsorshipLimitConfigBody + ) -> SignedRequest: + """Stamp a upsertSwapFeeSponsorshipLimitConfig request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPSERT_SWAP_FEE_SPONSORSHIP_LIMIT_CONFIG", + } + + full_url = ( + self.base_url + "/public/v1/submit/upsert_swap_fee_sponsorship_limit_config" + ) + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + + def upsert_swap_fixed_rate_limit_config( + self, input: UpsertSwapFixedRateLimitConfigBody + ) -> UpsertSwapFixedRateLimitConfigResponse: + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPSERT_SWAP_FIXED_RATE_LIMIT_CONFIG", + } + + return self._activity( + "/public/v1/submit/upsert_swap_fixed_rate_limit_config", + body, + "upsertSwapFixedRateLimitConfigResult", + UpsertSwapFixedRateLimitConfigResponse, + ) + + def stamp_upsert_swap_fixed_rate_limit_config( + self, input: UpsertSwapFixedRateLimitConfigBody + ) -> SignedRequest: + """Stamp a upsertSwapFixedRateLimitConfig request without sending it.""" + + # Convert Pydantic model to dict + input_dict = input.model_dump(by_alias=True, exclude_none=True) + + organization_id = input_dict.pop("organizationId", self.organization_id) + timestamp_ms = input_dict.pop("timestampMs", str(int(time.time() * 1000))) + + body = { + "parameters": input_dict, + "organizationId": organization_id, + "timestampMs": timestamp_ms, + "type": "ACTIVITY_TYPE_UPSERT_SWAP_FIXED_RATE_LIMIT_CONFIG", + } + + full_url = ( + self.base_url + "/public/v1/submit/upsert_swap_fixed_rate_limit_config" + ) + body_str = self._serialize_body(body) + stamp = self.stamper.stamp(body_str) + + return SignedRequest( + url=full_url, body=body_str, stamp=stamp, type=RequestType.ACTIVITY + ) + def verify_otp(self, input: VerifyOtpBody) -> VerifyOtpResponse: # Convert Pydantic model to dict input_dict = input.model_dump(by_alias=True, exclude_none=True) diff --git a/packages/http/tests/test_send_signed_request.py b/packages/http/tests/test_send_signed_request.py new file mode 100644 index 0000000..b4f362f --- /dev/null +++ b/packages/http/tests/test_send_signed_request.py @@ -0,0 +1,137 @@ +"""Offline tests for send_signed_request result flattening. + +These mock ``requests.post`` and use a stub stamper, so they need no credentials +and make no network calls. They do not use the fixtures in ``conftest.py``. +""" + +from typing import Any, Dict + +from turnkey_api_key_stamper import TStamp +from turnkey_sdk_types import ( + EthSendTransactionBody, + EthSendTransactionResponse, + SignTransactionBody, + SignTransactionResponse, +) +from turnkey_http.generated import client as client_module +from turnkey_http.generated.client import TurnkeyClient + +ORG_ID = "org-123" +ADDRESS = "0x0000000000000000000000000000000000000001" + + +class StubStamper: + def stamp(self, body: str) -> TStamp: + return TStamp(stamp_header_name="X-Stamp", stamp_header_value="stub") + + +class FakeResponse: + def __init__(self, data: Dict[str, Any]): + self._data = data + self.ok = True + self.status_code = 200 + self.reason = "OK" + self.text = "" + + def json(self) -> Dict[str, Any]: + return self._data + + +def completed(activity_type: str, result: Dict[str, Any]) -> Dict[str, Any]: + return { + "activity": { + "id": "activity-1", + "organizationId": ORG_ID, + "status": "ACTIVITY_STATUS_COMPLETED", + "type": activity_type, + "intent": {}, + "result": result, + "votes": [], + "fingerprint": "fingerprint", + "canApprove": False, + "canReject": False, + "createdAt": {"seconds": "0", "nanos": "0"}, + "updatedAt": {"seconds": "0", "nanos": "0"}, + } + } + + +def make_client(monkeypatch, payload: Dict[str, Any]) -> TurnkeyClient: + monkeypatch.setattr( + client_module.requests, + "post", + lambda url, headers=None, data=None, timeout=None: FakeResponse(payload), + ) + return TurnkeyClient( + base_url="https://api.example.test", + stamper=StubStamper(), # type: ignore[arg-type] + organization_id=ORG_ID, + ) + + +def eth_send_body() -> EthSendTransactionBody: + # "from" is a Python keyword, so the model takes it by alias. + return EthSendTransactionBody.model_validate( + { + "from": ADDRESS, + "caip2": "eip155:8453", + "calls": [{"to": ADDRESS, "value": "1"}], + } + ) + + +def test_typed_send_signed_request_flattens_a_versioned_result_key(monkeypatch): + payload = completed( + "ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2", + {"ethSendTransactionResultV2": {"sendTransactionStatusId": "sts-1"}}, + ) + client = make_client(monkeypatch, payload) + + signed = client.stamp_eth_send_transaction(eth_send_body()) + response = client.send_signed_request(signed, EthSendTransactionResponse) + + assert response.sendTransactionStatusId == "sts-1" + assert response.activity.status == "ACTIVITY_STATUS_COMPLETED" + + +def test_untyped_send_signed_request_flattens_a_versioned_result_key(monkeypatch): + payload = completed( + "ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2", + {"ethSendTransactionResultV2": {"sendTransactionStatusId": "sts-1"}}, + ) + client = make_client(monkeypatch, payload) + + signed = client.stamp_eth_send_transaction(eth_send_body()) + raw = client.send_signed_request(signed) + + assert raw["sendTransactionStatusId"] == "sts-1" + assert raw["activity"]["id"] == "activity-1" + + +def test_send_signed_request_still_flattens_an_unversioned_result_key(monkeypatch): + payload = completed( + "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", + {"signTransactionResult": {"signedTransaction": "02abcd"}}, + ) + client = make_client(monkeypatch, payload) + + signed = client.stamp_sign_transaction( + SignTransactionBody( + signWith=ADDRESS, + unsignedTransaction="02ef", + type="TRANSACTION_TYPE_ETHEREUM", + ) + ) + response = client.send_signed_request(signed, SignTransactionResponse) + + assert response.signedTransaction == "02abcd" + + +def test_default_polling_budget_covers_slow_activities(): + client = TurnkeyClient( + base_url="https://api.example.test", + stamper=StubStamper(), # type: ignore[arg-type] + organization_id=ORG_ID, + ) + + assert client.polling_interval_ms * client.max_polling_retries >= 10_000 diff --git a/packages/sdk-types/src/turnkey_sdk_types/generated/types.py b/packages/sdk-types/src/turnkey_sdk_types/generated/types.py index b7360fa..2483d8a 100644 --- a/packages/sdk-types/src/turnkey_sdk_types/generated/types.py +++ b/packages/sdk-types/src/turnkey_sdk_types/generated/types.py @@ -29,6 +29,7 @@ class billingActivateBillingTierIntent(TurnkeyBaseModel): productId: str = Field( description="The product that the customer wants to subscribe to." ) + orbPlanId: Optional[str] = Field(default=None) class billingActivateBillingTierResult(TurnkeyBaseModel): @@ -78,6 +79,18 @@ class billingSetPaymentMethodResult(TurnkeyBaseModel): ) +class billingUpdatePaymentMethodIntent(TurnkeyBaseModel): + paymentEmail: str = Field( + description="The email that will receive invoices for the payment method." + ) + + +class billingUpdatePaymentMethodResult(TurnkeyBaseModel): + paymentEmail: str = Field( + description="The email address associated with the payment method." + ) + + class datav1Tag(TurnkeyBaseModel): tagId: str = Field(description="Unique identifier for a given Tag.") tagName: str = Field(description="Human-readable name for a Tag.") @@ -111,6 +124,10 @@ class externaldatav1Credential(TurnkeyBaseModel): description="The public component of a cryptographic key pair used to sign messages and transactions." ) type: v1CredentialType + sessionProfileId: Optional[str] = Field( + default=None, + description="The session profile associated with this credential, if any. This field is only applicable for credentials of type CREDENTIAL_TYPE_LOGIN.", + ) class externaldatav1Quorum(TurnkeyBaseModel): @@ -206,6 +223,24 @@ class v1AccessType(str, Enum): ACCESS_TYPE_ALL = "ACCESS_TYPE_ALL" +class v1ActivePolicyStatus(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for the organization the policy belongs to." + ) + policyId: str = Field(description="Unique identifier for a given policy.") + active: bool = Field( + description="Whether the policy is currently active. A policy without a time window is always active." + ) + timeExpr: Optional[str] = Field( + default=None, + description="The policy's time expression, absent when the policy has no time window.", + ) + error: Optional[str] = Field( + default=None, + description="Set when the policy's time expression could not be evaluated; the policy is reported inactive.", + ) + + class v1Activity(TurnkeyBaseModel): id: str = Field(description="Unique identifier for a given Activity object.") organizationId: str = Field( @@ -251,6 +286,7 @@ class v1ActivityStatus(str, Enum): ACTIVITY_STATUS_FAILED = "ACTIVITY_STATUS_FAILED" ACTIVITY_STATUS_CONSENSUS_NEEDED = "ACTIVITY_STATUS_CONSENSUS_NEEDED" ACTIVITY_STATUS_REJECTED = "ACTIVITY_STATUS_REJECTED" + ACTIVITY_STATUS_AUTHENTICATORS_NEEDED = "ACTIVITY_STATUS_AUTHENTICATORS_NEEDED" class v1ActivityType(str, Enum): @@ -405,6 +441,76 @@ class v1ActivityType(str, Enum): ACTIVITY_TYPE_VERIFY_OTP_V2 = "ACTIVITY_TYPE_VERIFY_OTP_V2" ACTIVITY_TYPE_OTP_LOGIN_V2 = "ACTIVITY_TYPE_OTP_LOGIN_V2" ACTIVITY_TYPE_UPDATE_ORGANIZATION_NAME = "ACTIVITY_TYPE_UPDATE_ORGANIZATION_NAME" + ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V8 = ( + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V8" + ) + ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS_V2 = "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS_V2" + ACTIVITY_TYPE_CREATE_USERS_V4 = "ACTIVITY_TYPE_CREATE_USERS_V4" + ACTIVITY_TYPE_CREATE_WEBHOOK_ENDPOINT = "ACTIVITY_TYPE_CREATE_WEBHOOK_ENDPOINT" + ACTIVITY_TYPE_UPDATE_WEBHOOK_ENDPOINT = "ACTIVITY_TYPE_UPDATE_WEBHOOK_ENDPOINT" + ACTIVITY_TYPE_DELETE_WEBHOOK_ENDPOINT = "ACTIVITY_TYPE_DELETE_WEBHOOK_ENDPOINT" + ACTIVITY_TYPE_SET_IP_ALLOWLIST = "ACTIVITY_TYPE_SET_IP_ALLOWLIST" + ACTIVITY_TYPE_REMOVE_IP_ALLOWLIST = "ACTIVITY_TYPE_REMOVE_IP_ALLOWLIST" + ACTIVITY_TYPE_UPDATE_TVC_APP_LIVE_DEPLOYMENT = ( + "ACTIVITY_TYPE_UPDATE_TVC_APP_LIVE_DEPLOYMENT" + ) + ACTIVITY_TYPE_DELETE_TVC_DEPLOYMENT = "ACTIVITY_TYPE_DELETE_TVC_DEPLOYMENT" + ACTIVITY_TYPE_DELETE_TVC_APP_AND_DEPLOYMENTS = ( + "ACTIVITY_TYPE_DELETE_TVC_APP_AND_DEPLOYMENTS" + ) + ACTIVITY_TYPE_RESTORE_TVC_DEPLOYMENT = "ACTIVITY_TYPE_RESTORE_TVC_DEPLOYMENT" + ACTIVITY_TYPE_SPARK_SIGN_FROST = "ACTIVITY_TYPE_SPARK_SIGN_FROST" + ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER = "ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER" + ACTIVITY_TYPE_SPARK_CLAIM_TRANSFER = "ACTIVITY_TYPE_SPARK_CLAIM_TRANSFER" + ACTIVITY_TYPE_SPARK_PREPARE_LIGHTNING_RECEIVE = ( + "ACTIVITY_TYPE_SPARK_PREPARE_LIGHTNING_RECEIVE" + ) + ACTIVITY_TYPE_POST_TVC_QUORUM_KEY_SHARE = "ACTIVITY_TYPE_POST_TVC_QUORUM_KEY_SHARE" + ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2 = "ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2" + ACTIVITY_TYPE_CREATE_MFA_POLICY = "ACTIVITY_TYPE_CREATE_MFA_POLICY" + ACTIVITY_TYPE_UPDATE_MFA_POLICY = "ACTIVITY_TYPE_UPDATE_MFA_POLICY" + ACTIVITY_TYPE_DELETE_MFA_POLICY = "ACTIVITY_TYPE_DELETE_MFA_POLICY" + ACTIVITY_TYPE_CREATE_SESSION_PROFILE = "ACTIVITY_TYPE_CREATE_SESSION_PROFILE" + ACTIVITY_TYPE_EARN_DEPLOY_WRAPPER = "ACTIVITY_TYPE_EARN_DEPLOY_WRAPPER" + ACTIVITY_TYPE_EARN_DEPOSIT = "ACTIVITY_TYPE_EARN_DEPOSIT" + ACTIVITY_TYPE_EARN_WITHDRAW = "ACTIVITY_TYPE_EARN_WITHDRAW" + ACTIVITY_TYPE_EXECUTE_SWAP = "ACTIVITY_TYPE_EXECUTE_SWAP" + ACTIVITY_TYPE_UPSERT_SWAP_CONFIG = "ACTIVITY_TYPE_UPSERT_SWAP_CONFIG" + ACTIVITY_TYPE_CREATE_TVC_OPERATOR = "ACTIVITY_TYPE_CREATE_TVC_OPERATOR" + ACTIVITY_TYPE_CREATE_TVC_QUORUM_KEY = "ACTIVITY_TYPE_CREATE_TVC_QUORUM_KEY" + ACTIVITY_TYPE_RE_ENCRYPT_TVC_QUORUM_KEY_SHARE = ( + "ACTIVITY_TYPE_RE_ENCRYPT_TVC_QUORUM_KEY_SHARE" + ) + ACTIVITY_TYPE_INIT_IMPORT_SECRETS = "ACTIVITY_TYPE_INIT_IMPORT_SECRETS" + ACTIVITY_TYPE_SOL_SEND_TRANSACTION_V2 = "ACTIVITY_TYPE_SOL_SEND_TRANSACTION_V2" + ACTIVITY_TYPE_CLAIM_SWAP_FEES = "ACTIVITY_TYPE_CLAIM_SWAP_FEES" + ACTIVITY_TYPE_EARN_SET_WRAPPER_STATE = "ACTIVITY_TYPE_EARN_SET_WRAPPER_STATE" + ACTIVITY_TYPE_CLAIM_EARN_FEES = "ACTIVITY_TYPE_CLAIM_EARN_FEES" + ACTIVITY_TYPE_UPDATE_WALLET_ACCOUNT_NAME = ( + "ACTIVITY_TYPE_UPDATE_WALLET_ACCOUNT_NAME" + ) + ACTIVITY_TYPE_ETH_UNDELEGATE_7702 = "ACTIVITY_TYPE_ETH_UNDELEGATE_7702" + ACTIVITY_TYPE_EXECUTE_SWAP_V2 = "ACTIVITY_TYPE_EXECUTE_SWAP_V2" + ACTIVITY_TYPE_CREATE_SWAP_QUOTE = "ACTIVITY_TYPE_CREATE_SWAP_QUOTE" + ACTIVITY_TYPE_IMPORT_SECRETS = "ACTIVITY_TYPE_IMPORT_SECRETS" + ACTIVITY_TYPE_EXPORT_SECRETS = "ACTIVITY_TYPE_EXPORT_SECRETS" + ACTIVITY_TYPE_CREATE_VELOCITY_CONTROL = "ACTIVITY_TYPE_CREATE_VELOCITY_CONTROL" + ACTIVITY_TYPE_DELETE_VELOCITY_CONTROLS = "ACTIVITY_TYPE_DELETE_VELOCITY_CONTROLS" + ACTIVITY_TYPE_UPDATE_PAYMENT_METHOD = "ACTIVITY_TYPE_UPDATE_PAYMENT_METHOD" + ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V2 = "ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V2" + ACTIVITY_TYPE_EXECUTE_SWAP_V3 = "ACTIVITY_TYPE_EXECUTE_SWAP_V3" + ACTIVITY_TYPE_DELETE_SECRETS = "ACTIVITY_TYPE_DELETE_SECRETS" + ACTIVITY_TYPE_EARN_CLAIM_REWARDS = "ACTIVITY_TYPE_EARN_CLAIM_REWARDS" + ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V3 = "ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V3" + ACTIVITY_TYPE_UPSERT_SWAP_FEE_SPONSORSHIP_LIMIT_CONFIG = ( + "ACTIVITY_TYPE_UPSERT_SWAP_FEE_SPONSORSHIP_LIMIT_CONFIG" + ) + ACTIVITY_TYPE_UPSERT_SWAP_FIXED_RATE_LIMIT_CONFIG = ( + "ACTIVITY_TYPE_UPSERT_SWAP_FIXED_RATE_LIMIT_CONFIG" + ) + ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_SESSION = ( + "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_SESSION" + ) class v1AddressFormat(str, Enum): @@ -444,6 +550,8 @@ class v1AddressFormat(str, Enum): ADDRESS_FORMAT_TON_V4R2 = "ADDRESS_FORMAT_TON_V4R2" ADDRESS_FORMAT_TON_V5R1 = "ADDRESS_FORMAT_TON_V5R1" ADDRESS_FORMAT_XRP = "ADDRESS_FORMAT_XRP" + ADDRESS_FORMAT_SPARK_MAINNET = "ADDRESS_FORMAT_SPARK_MAINNET" + ADDRESS_FORMAT_SPARK_REGTEST = "ADDRESS_FORMAT_SPARK_REGTEST" class v1ApiKey(TurnkeyBaseModel): @@ -500,6 +608,16 @@ class v1AppProof(TurnkeyBaseModel): signature: str = Field(description="Signature over hashed proof_payload.") +class v1AppStatus(TurnkeyBaseModel): + appId: str = Field(description="Unique identifier for this TVC App") + deployments: List[v1DeploymentStatus] = Field( + description="List of deployment statuses for this app" + ) + targetedDeploymentId: str = Field( + description="The deployment ID currently serving traffic for this app" + ) + + class v1ApproveActivityIntent(TurnkeyBaseModel): fingerprint: str = Field(description="An artifact verifying a User's action.") @@ -532,6 +650,10 @@ class v1AssetBalance(TurnkeyBaseModel): description="Normalized balance values for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise. Use the balance field instead.", ) name: Optional[str] = Field(default=None, description="The asset name") + tokenProgram: Optional[str] = Field( + default=None, + description="Solana token program address that owns this mint, inferred from getTokenAccountsByOwner. TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA for classic SPL Token, TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb for Token-2022. Empty for native SOL and non-Solana assets.", + ) class v1AssetBalanceDisplay(TurnkeyBaseModel): @@ -557,6 +679,14 @@ class v1AssetMetadata(TurnkeyBaseModel): default=None, description="The url of the asset logo" ) name: Optional[str] = Field(default=None, description="The asset name") + stable: Optional[bool] = Field( + default=None, + description="Whether this asset is on Turnkey's stablecoin list (used for stablepair swap fee pricing).", + ) + earnProviders: Optional[List[v1EarnProvider]] = Field( + default=None, + description="Earn yield providers with vaults denominated in this asset. Empty when the asset is not supported by Earn.", + ) class v1Attestation(TurnkeyBaseModel): @@ -574,6 +704,35 @@ class v1Attestation(TurnkeyBaseModel): ) +class v1AuthenticationMethod(TurnkeyBaseModel): + type: v1AuthenticationType = Field( + description="The type of authenticator (e.g., AUTHENTICATION_TYPE_EMAIL, AUTHENTICATION_TYPE_SESSION) required for this MFA step." + ) + id: Optional[str] = Field( + default=None, + description="Optional specific authenticator ID required (e.g., for requiring a specific session profile id)", + ) + + +class v1AuthenticationMethodParams(TurnkeyBaseModel): + type: v1AuthenticationType = Field( + description="The type of authenticator (e.g., AUTHENTICATION_TYPE_PASSKEY for passkey authentication)." + ) + id: Optional[str] = Field( + default=None, + description="Optional specific authenticator ID required (e.g., UUID of a passkey authenticator). If not provided, any authenticator of the specified type can be used.", + ) + + +class v1AuthenticationType(str, Enum): + AUTHENTICATION_TYPE_EMAIL_OTP = "AUTHENTICATION_TYPE_EMAIL_OTP" + AUTHENTICATION_TYPE_SMS_OTP = "AUTHENTICATION_TYPE_SMS_OTP" + AUTHENTICATION_TYPE_PASSKEY = "AUTHENTICATION_TYPE_PASSKEY" + AUTHENTICATION_TYPE_API_KEY = "AUTHENTICATION_TYPE_API_KEY" + AUTHENTICATION_TYPE_OAUTH = "AUTHENTICATION_TYPE_OAUTH" + AUTHENTICATION_TYPE_SESSION = "AUTHENTICATION_TYPE_SESSION" + + class v1Authenticator(TurnkeyBaseModel): transports: List[v1AuthenticatorTransport] = Field( description="Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE)." @@ -645,10 +804,10 @@ class v1BootProof(TurnkeyBaseModel): description="The DER encoded COSE Sign1 struct Attestation doc." ) qosManifestB64: str = Field( - description="The borsch serialized base64 encoded Manifest." + description="The base64 encoded QOS manifest. Encoding depends on qos_manifest_version." ) qosManifestEnvelopeB64: str = Field( - description="The borsch serialized base64 encoded Manifest Envelope." + description="The base64 encoded QOS manifest envelope. Encoding depends on qos_manifest_version." ) deploymentLabel: str = Field( description="The label under which the enclave app was deployed." @@ -656,12 +815,61 @@ class v1BootProof(TurnkeyBaseModel): enclaveApp: str = Field(description="Name of the enclave app") owner: str = Field(description="Owner of the app i.e. 'tkhq'") createdAt: externaldatav1Timestamp + qosManifestVersion: Optional[str] = Field( + default=None, description="QOS manifest schema version." + ) class v1BootProofResponse(TurnkeyBaseModel): bootProof: v1BootProof +class v1ClaimEarnFeesIntent(TurnkeyBaseModel): + wrapperAddress: str = Field( + description="Address of the deployed Earn wrapper to claim fees for. Must be one of the org's deployed wrappers." + ) + + +class v1ClaimEarnFeesRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ClaimEarnFeesIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ClaimEarnFeesResult(TurnkeyBaseModel): + claimRequestId: str = Field( + description="Identifier to poll claim status and tx hash via GetClaimEarnFeesStatus." + ) + + +class v1ClaimSwapFeesIntent(TurnkeyBaseModel): + pass + + +class v1ClaimSwapFeesRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ClaimSwapFeesIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ClaimSwapFeesResult(TurnkeyBaseModel): + requestId: str = Field( + description="Relay claim request ID submitted through the permit endpoint." + ) + + class v1ClientSignature(TurnkeyBaseModel): publicKey: str = Field( description="The public component of a cryptographic key pair used to create the signature." @@ -789,6 +997,24 @@ class v1CreateFiatOnRampCredentialResult(TurnkeyBaseModel): ) +class v1CreateFiatOnRampSessionIntent(TurnkeyBaseModel): + quoteId: str = Field( + description="Identifier of a saved fiat on-ramp quote. Returned by GetFiatOnRampQuote." + ) + walletAddress: str = Field( + description="Destination wallet address for the buy transaction." + ) + + +class v1CreateFiatOnRampSessionResult(TurnkeyBaseModel): + onRampUrl: str = Field( + description="URL of the fiat on-ramp session for the saved quote." + ) + onRampTransactionId: str = Field( + description="Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow." + ) + + class v1CreateInvitationsIntent(TurnkeyBaseModel): invitations: List[v1InvitationParams] = Field(description="A list of Invitations.") @@ -809,6 +1035,36 @@ class v1CreateInvitationsResult(TurnkeyBaseModel): invitationIds: List[str] = Field(description="A list of Invitation IDs") +class v1CreateMfaPolicyIntent(TurnkeyBaseModel): + userId: str = Field(description="The ID of the User to add the MFA Policy to.") + mfaPolicyName: str = Field(description="Human-readable name for a Policy.") + condition: str = Field( + description="A condition expression that evaluates to true or false, determining when this MFA policy applies." + ) + requiredAuthenticationMethods: List[v1RequiredAuthenticationMethodParams] = Field( + description="An ordered list of authentication requirements. Each requirement must be satisfied sequentially to complete MFA." + ) + order: int = Field( + description="The order in which this MFA policy is evaluated, starting from 0, relative to other MFA policies. Lower order values are evaluated first." + ) + notes: Optional[str] = Field(default=None, description="Notes for an MFA Policy.") + + +class v1CreateMfaPolicyRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateMfaPolicyIntent + + +class v1CreateMfaPolicyResult(TurnkeyBaseModel): + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + + class v1CreateOauth2CredentialIntent(TurnkeyBaseModel): provider: v1Oauth2Provider = Field(description="The OAuth 2.0 provider") clientId: str = Field(description="The Client ID issued by the OAuth 2.0 provider") @@ -842,6 +1098,13 @@ class v1CreateOauthProvidersIntent(TurnkeyBaseModel): ) +class v1CreateOauthProvidersIntentV2(TurnkeyBaseModel): + userId: str = Field(description="The ID of the User to add an Oauth provider to") + oauthProviders: List[v1OauthProviderParamsV2] = Field( + description="A list of Oauth providers." + ) + + class v1CreateOauthProvidersRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( @@ -850,7 +1113,7 @@ class v1CreateOauthProvidersRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1CreateOauthProvidersIntent + parameters: v1CreateOauthProvidersIntentV2 generateAppProofs: Optional[bool] = Field(default=None) @@ -860,6 +1123,12 @@ class v1CreateOauthProvidersResult(TurnkeyBaseModel): ) +class v1CreateOauthProvidersResultV2(TurnkeyBaseModel): + providerIds: List[str] = Field( + description="A list of unique identifiers for Oauth Providers" + ) + + class v1CreateOrganizationIntent(TurnkeyBaseModel): organizationName: str = Field( description="Human-readable name for an Organization." @@ -950,6 +1219,9 @@ class v1CreatePolicyIntentV3(TurnkeyBaseModel): default=None, description="The consensus expression that triggers the Effect" ) notes: str = Field(description="Notes for a Policy.") + time: Optional[str] = Field( + default=None, description="The time expression that triggers the Effect" + ) class v1CreatePolicyRequest(TurnkeyBaseModel): @@ -1000,6 +1272,10 @@ class v1CreatePrivateKeysIntent(TurnkeyBaseModel): class v1CreatePrivateKeysIntentV2(TurnkeyBaseModel): privateKeys: List[v1PrivateKeyParams] = Field(description="A list of Private Keys.") + externalSignerPubkey: Optional[str] = Field( + default=None, + description="The public key of the external signer to use for creating the private keys.", + ) class v1CreatePrivateKeysRequest(TurnkeyBaseModel): @@ -1077,7 +1353,8 @@ class v1CreateReadWriteSessionIntentV2(TurnkeyBaseModel): description="Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted." ) userId: Optional[str] = Field( - default=None, description="Unique identifier for a given User." + default=None, + description="Optional unique identifier for a given User. If none provided, the read write session will be created for the user who is making the request.", ) apiKeyName: Optional[str] = Field( default=None, @@ -1131,6 +1408,39 @@ class v1CreateReadWriteSessionResultV2(TurnkeyBaseModel): credentialBundle: str = Field(description="HPKE encrypted credential bundle") +class v1CreateSessionProfileIntent(TurnkeyBaseModel): + sessionProfileName: str = Field( + description="Human-readable name for a Session Profile." + ) + scope: str = Field( + description="The scope string that defines the permissions for this Session Profile." + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="The duration in seconds for which sessions created with this Session Profile are valid. If not set, expiration will be determined by the value passed in to the intent of login activities.", + ) + notes: Optional[str] = Field( + default=None, description="Notes for a Session Profile." + ) + + +class v1CreateSessionProfileRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateSessionProfileIntent + + +class v1CreateSessionProfileResult(TurnkeyBaseModel): + sessionProfileId: str = Field( + description="Unique identifier for a given Session Profile." + ) + + class v1CreateSmartContractInterfaceIntent(TurnkeyBaseModel): smartContractAddress: str = Field( description="Corresponding contract address or program ID" @@ -1283,6 +1593,39 @@ class v1CreateSubOrganizationIntentV7(TurnkeyBaseModel): ) +class v1CreateSubOrganizationIntentV8(TurnkeyBaseModel): + subOrganizationName: str = Field(description="Name for this sub-organization") + rootUsers: List[v1RootUserParamsV5] = Field( + description="Root users to create within this sub-organization" + ) + rootQuorumThreshold: int = Field( + description="The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + ) + wallet: Optional[v1WalletParams] = Field( + default=None, description="The wallet to create for the sub-organization" + ) + disableEmailRecovery: Optional[bool] = Field( + default=None, description="Disable email recovery for the sub-organization" + ) + disableEmailAuth: Optional[bool] = Field( + default=None, description="Disable email auth for the sub-organization" + ) + disableSmsAuth: Optional[bool] = Field( + default=None, description="Disable OTP SMS auth for the sub-organization" + ) + disableOtpEmailAuth: Optional[bool] = Field( + default=None, description="Disable OTP email auth for the sub-organization" + ) + verificationToken: Optional[str] = Field( + default=None, + description="Signed JWT containing a unique id, expiry, verification type, contact", + ) + clientSignature: Optional[v1ClientSignature] = Field( + default=None, + description="Optional signature proving authorization for this sub-organization creation. The signature is over the verification token ID and the root user parameters for the root user associated with the verification token. Only required if a public key was provided during the verification step.", + ) + + class v1CreateSubOrganizationRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( @@ -1291,7 +1634,7 @@ class v1CreateSubOrganizationRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1CreateSubOrganizationIntentV7 + parameters: v1CreateSubOrganizationIntentV8 generateAppProofs: Optional[bool] = Field(default=None) @@ -1332,6 +1675,97 @@ class v1CreateSubOrganizationResultV7(TurnkeyBaseModel): rootUserIds: Optional[List[str]] = Field(default=None) +class v1CreateSubOrganizationResultV8(TurnkeyBaseModel): + subOrganizationId: str + wallet: Optional[v1WalletResult] = Field(default=None) + rootUserIds: Optional[List[str]] = Field(default=None) + + +class v1CreateSwapQuoteIntent(TurnkeyBaseModel): + signWith: str = Field( + description="Wallet account or Private Key address used to price the executable provider quote. Private Key identifiers are not supported." + ) + inputToken: str = Field( + description="CAIP-19 asset ID for the input asset. The chain is derived from this value." + ) + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + inputAmount: str = Field(description="Base-unit amount of the input asset.") + slippageBps: Optional[str] = Field( + default=None, + description="Provider-neutral maximum allowed slippage in basis points. Turnkey converts this value to each provider's request format. When omitted, each provider applies its default slippage behavior.", + ) + + +class v1CreateSwapQuoteIntentV2(TurnkeyBaseModel): + signWith: str = Field( + description="Wallet account address used to price the executable provider quote. Private Key identifiers are not supported." + ) + inputToken: str = Field( + description="CAIP-19 asset ID for the input asset. The chain is derived from this value." + ) + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + inputAmount: str = Field(description="Base-unit amount of the input asset.") + slippageBps: Optional[str] = Field( + default=None, + description="Provider-neutral maximum allowed slippage in basis points. Turnkey converts this value to each provider's request format. When omitted, each provider applies its default slippage behavior.", + ) + destinationAddress: Optional[str] = Field( + default=None, + description="Raw public address that receives the output asset. Required for cross-protocol swaps. The address must match the output token protocol. Wallet account IDs, private key IDs, and CAIP account or asset identifiers are not supported.", + ) + + +class v1CreateSwapQuoteIntentV3(TurnkeyBaseModel): + signWith: str = Field( + description="Wallet account address used to price the executable provider quote. Private Key identifiers are not supported." + ) + inputToken: str = Field( + description="CAIP-19 asset ID for the input asset. The chain is derived from this value." + ) + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + inputAmount: str = Field(description="Base-unit amount of the input asset.") + slippageBps: Optional[str] = Field( + default=None, + description="Provider-neutral maximum allowed slippage in basis points. Turnkey converts this value to each provider's request format. When omitted, each provider applies its default slippage behavior.", + ) + destinationAddress: Optional[str] = Field( + default=None, + description="Raw public address that receives the output asset. Required for cross-protocol swaps. The address must match the output token protocol. Wallet account IDs, private key IDs, and CAIP account or asset identifiers are not supported.", + ) + feeSponsorship: Optional[bool] = Field( + default=None, + description="When true, Turnkey pays the provider fees for this swap and invoices them to the billing parent organization. Requires the FEATURE_NAME_SWAP_FEE_SPONSORSHIP organization feature. Defaults to false.", + ) + fixedRate: Optional[bool] = Field( + default=None, + description="When true, requests a 1:1 conversion before fees between supported stablecoins. Requires the FEATURE_NAME_SWAP_FIXED_RATE organization feature. Defaults to false.", + ) + + +class v1CreateSwapQuoteRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateSwapQuoteIntentV3 + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1CreateSwapQuoteResult(TurnkeyBaseModel): + quotes: List[v1SwapQuote] = Field( + description="One or more provider quotes for this request. Today this contains a single Relay quote; pass quotes[i].quoteId to execute_swap_v2 to bind execution." + ) + + +class v1CreateSwapQuoteResultV2(TurnkeyBaseModel): + quotes: List[v1SwapQuoteV2] = Field( + description="One or more provider quotes for this request. Today this contains a single Relay quote; pass quotes[i].quoteId to execute_swap to bind execution." + ) + + class v1CreateTvcAppIntent(TurnkeyBaseModel): name: str = Field(description="The name of the new TVC application") quorumPublicKey: str = Field( @@ -1357,6 +1791,21 @@ class v1CreateTvcAppIntent(TurnkeyBaseModel): default=None, description="Enables network egress for this TVC app. Default if not provided: false.", ) + enableDebugModeDeployments: Optional[bool] = Field( + default=None, + description="When true, this app may create deployments in debug-mode. Debug-mode deployments expose logs and emit zero'd attestation PCRs, so remote attestation cannot succeed. Cannot be changed after app creation. Setting this true means the app's quorum key is considered permanently insecure, and a new app with a fresh quorum key must be created. Default if not provided: false.", + ) + + +class v1CreateTvcAppRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateTvcAppIntent class v1CreateTvcAppResult(TurnkeyBaseModel): @@ -1370,6 +1819,13 @@ class v1CreateTvcAppResult(TurnkeyBaseModel): manifestSetThreshold: int = Field( description="The required number of approvals for the manifest set" ) + shareSetId: str = Field(description="The unique identifier for the TVC share set") + shareSetOperatorIds: List[str] = Field( + description="The unique identifiers of the share set operators" + ) + shareSetThreshold: int = Field( + description="The required number of approvals for the share set" + ) class v1CreateTvcDeploymentIntent(TurnkeyBaseModel): @@ -1397,14 +1853,35 @@ class v1CreateTvcDeploymentIntent(TurnkeyBaseModel): default=None, description="Optional encrypted pull secret to authorize Turnkey to pull the pivot container image. If your image is public, leave this empty.", ) - pivotBindAddresses: Optional[List[str]] = Field( - default=None, - description='Address(es) on which the pivot binary listens. A bind address can be a port alone (e.g. "3000") or an ip:port (e.g. "127.0.0.1:3000"). If provided as a port alone, the IP is assumed to be 0.0.0.0', - ) debugMode: Optional[bool] = Field( default=None, description="Optional flag to indicate whether to deploy the TVC app in debug mode, which includes additional logging and debugging tools. Default is false.", ) + healthCheckType: v1TvcHealthCheckType = Field( + description="Health check type (TVC_HEALTH_CHECK_TYPE_HTTP or TVC_HEALTH_CHECK_TYPE_GRPC). HTTP health checks are made with a GET request on /health, and gRPC health checks follow the standard gRPC health checking protocol." + ) + healthCheckPort: int = Field(description="Port to use for health checks.") + publicIngressPort: int = Field(description="Port to use for public ingress.") + replicas: Optional[int] = Field( + default=None, description="Optional desired replica count for this deployment." + ) + instanceSizeCpus: Optional[int] = Field( + default=None, description="Optional desired instance cpu count." + ) + instanceSizeRam: Optional[int] = Field( + default=None, description="Optional desired instance memory size in GiB." + ) + + +class v1CreateTvcDeploymentRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateTvcDeploymentIntent class v1CreateTvcDeploymentResult(TurnkeyBaseModel): @@ -1423,12 +1900,94 @@ class v1CreateTvcManifestApprovalsIntent(TurnkeyBaseModel): ) -class v1CreateTvcManifestApprovalsResult(TurnkeyBaseModel): - approvalIds: List[str] = Field( - description="The unique identifier(s) for the manifest approvals" +class v1CreateTvcManifestApprovalsRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - - + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateTvcManifestApprovalsIntent + + +class v1CreateTvcManifestApprovalsResult(TurnkeyBaseModel): + approvalIds: List[str] = Field( + description="The unique identifier(s) for the manifest approvals" + ) + + +class v1CreateTvcOperatorIntent(TurnkeyBaseModel): + walletName: Optional[str] = Field( + default=None, + description="Human-readable name for a new wallet created for this TVC operator", + ) + walletId: Optional[str] = Field( + default=None, + description="Unique identifier for an existing wallet to reuse for this TVC operator", + ) + path: str = Field( + description="Base derivation path for creating TVC operator wallet accounts" + ) + operatorName: str = Field( + description="Human-readable name for this new TVC operator" + ) + + +class v1CreateTvcOperatorRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateTvcOperatorIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1CreateTvcOperatorResult(TurnkeyBaseModel): + walletId: str = Field( + description="The unique identifier for the wallet containing TVC operator accounts" + ) + operatorId: str = Field(description="The unique identifier for the TVC operator") + encryptPublicKey: str = Field( + description="Public encryption key for this TVC operator" + ) + signPublicKey: str = Field(description="Public signing key for this TVC operator") + + +class v1CreateTvcQuorumKeyIntent(TurnkeyBaseModel): + threshold: int = Field( + description="The threshold of operators needed to reassemble this TVC quorum key" + ) + operatorEncryptKeys: List[str] = Field( + description="Operator public keys used to encrypt and later approve the generated TVC quorum key shares" + ) + + +class v1CreateTvcQuorumKeyRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateTvcQuorumKeyIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1CreateTvcQuorumKeyResult(TurnkeyBaseModel): + quorumKeyId: str = Field(description="The unique identifier for the TVC quorum key") + quorumPublicKey: str = Field( + description="Public key for the generated TVC quorum key" + ) + shareIds: List[str] = Field( + description="The unique identifier(s) for the generated TVC quorum key shares" + ) + + class v1CreateUserTagIntent(TurnkeyBaseModel): userTagName: str = Field(description="Human-readable name for a User Tag.") userIds: List[str] = Field(description="A list of User IDs.") @@ -1463,6 +2022,10 @@ class v1CreateUsersIntentV3(TurnkeyBaseModel): users: List[v1UserParamsV3] = Field(description="A list of Users.") +class v1CreateUsersIntentV4(TurnkeyBaseModel): + users: List[v1UserParamsV4] = Field(description="A list of Users.") + + class v1CreateUsersRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( @@ -1471,7 +2034,7 @@ class v1CreateUsersRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1CreateUsersIntentV3 + parameters: v1CreateUsersIntentV4 generateAppProofs: Optional[bool] = Field(default=None) @@ -1479,6 +2042,23 @@ class v1CreateUsersResult(TurnkeyBaseModel): userIds: List[str] = Field(description="A list of User IDs.") +class v1CreateVelocityControlIntent(TurnkeyBaseModel): + name: str = Field(description="Human-readable name for the Velocity Control.") + dataSource: v1VelocityControlDataSource = Field( + description="Data source for the Velocity Control." + ) + aggregation: v1VelocityControlAggregation = Field( + description="Aggregation expression that the Velocity Control evaluates." + ) + identifier: str = Field( + description="Identifier for the Velocity Control. Policies reference it as `controls.`. It must be unique within the Organization." + ) + + +class v1CreateVelocityControlResult(TurnkeyBaseModel): + velocityControlId: str + + class v1CreateWalletAccountsIntent(TurnkeyBaseModel): walletId: str = Field(description="Unique identifier for a given Wallet.") accounts: List[v1WalletAccountParams] = Field( @@ -1534,6 +2114,35 @@ class v1CreateWalletResult(TurnkeyBaseModel): addresses: List[str] = Field(description="A list of account addresses.") +class v1CreateWebhookEndpointIntent(TurnkeyBaseModel): + url: str = Field(description="The destination URL for webhook delivery.") + name: str = Field(description="Human-readable name for this webhook endpoint.") + subscriptions: Optional[List[v1WebhookSubscriptionParams]] = Field( + default=None, description="Event subscriptions to create for this endpoint." + ) + + +class v1CreateWebhookEndpointRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1CreateWebhookEndpointIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1CreateWebhookEndpointResult(TurnkeyBaseModel): + endpointId: str = Field( + description="Unique identifier of the created webhook endpoint." + ) + webhookEndpoint: v1WebhookEndpointData = Field( + description="The created webhook endpoint data." + ) + + class v1CredPropsAuthenticationExtensionsClientOutputs(TurnkeyBaseModel): rk: bool @@ -1658,6 +2267,26 @@ class v1DeleteInvitationResult(TurnkeyBaseModel): invitationId: str = Field(description="Unique identifier for a given Invitation.") +class v1DeleteMfaPolicyIntent(TurnkeyBaseModel): + userId: str = Field(description="The ID of the User to delete the MFA Policy from.") + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + + +class v1DeleteMfaPolicyRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1DeleteMfaPolicyIntent + + +class v1DeleteMfaPolicyResult(TurnkeyBaseModel): + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + + class v1DeleteOauth2CredentialIntent(TurnkeyBaseModel): oauth2CredentialId: str = Field( description="The ID of the OAuth 2.0 credential to delete" @@ -1814,6 +2443,29 @@ class v1DeletePrivateKeysResult(TurnkeyBaseModel): ) +class v1DeleteSecretsIntent(TurnkeyBaseModel): + secretIds: List[str] = Field( + description="Unique identifiers of the secrets to delete. Must contain between 1 and 32 distinct UUIDs. All secrets must belong to the organization." + ) + + +class v1DeleteSecretsRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1DeleteSecretsIntent + + +class v1DeleteSecretsResult(TurnkeyBaseModel): + secretIds: List[str] = Field( + description="Unique identifiers of the deleted secrets, in the order requested." + ) + + class v1DeleteSmartContractInterfaceIntent(TurnkeyBaseModel): smartContractInterfaceId: str = Field( description="The ID of a Smart Contract Interface intended for deletion." @@ -1863,6 +2515,52 @@ class v1DeleteSubOrganizationResult(TurnkeyBaseModel): ) +class v1DeleteTvcAppAndDeploymentsIntent(TurnkeyBaseModel): + appId: str = Field( + description="The unique identifier of the TVC app to delete. The app and all associated deployments will be removed." + ) + + +class v1DeleteTvcAppAndDeploymentsRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1DeleteTvcAppAndDeploymentsIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1DeleteTvcAppAndDeploymentsResult(TurnkeyBaseModel): + appId: str = Field(description="The unique identifier of the deleted TVC app.") + + +class v1DeleteTvcDeploymentIntent(TurnkeyBaseModel): + deploymentId: str = Field( + description="The unique identifier of the TVC deployment to delete." + ) + + +class v1DeleteTvcDeploymentRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1DeleteTvcDeploymentIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1DeleteTvcDeploymentResult(TurnkeyBaseModel): + deploymentId: str = Field( + description="The unique identifier of the deleted TVC deployment." + ) + + class v1DeleteUserTagsIntent(TurnkeyBaseModel): userTagIds: List[str] = Field(description="A list of User Tag IDs.") @@ -1904,6 +2602,18 @@ class v1DeleteUsersResult(TurnkeyBaseModel): userIds: List[str] = Field(description="A list of User IDs.") +class v1DeleteVelocityControlsIntent(TurnkeyBaseModel): + velocityControlIds: List[str] = Field( + description="List of 1 to 32 unique identifiers for Velocity Controls within an Organization." + ) + + +class v1DeleteVelocityControlsResult(TurnkeyBaseModel): + velocityControlIds: List[str] = Field( + description="A list of unique identifiers for the deleted Velocity Controls." + ) + + class v1DeleteWalletAccountsIntent(TurnkeyBaseModel): walletAccountIds: List[str] = Field( description="List of unique identifiers for wallet accounts within an organization" @@ -1960,6 +2670,44 @@ class v1DeleteWalletsResult(TurnkeyBaseModel): ) +class v1DeleteWebhookEndpointIntent(TurnkeyBaseModel): + endpointId: str = Field( + description="Unique identifier of the webhook endpoint to delete." + ) + + +class v1DeleteWebhookEndpointRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1DeleteWebhookEndpointIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1DeleteWebhookEndpointResult(TurnkeyBaseModel): + endpointId: str = Field( + description="Unique identifier of the deleted webhook endpoint." + ) + + +class v1DeploymentStatus(TurnkeyBaseModel): + deploymentId: str = Field( + description="Unique identifier for this deployment (corresponds to k8s deployment label)" + ) + readyReplicas: int = Field(description="Number of ready replicas") + desiredReplicas: int = Field(description="Desired number of replicas") + lastUpdatedTime: externaldatav1Timestamp = Field( + description="Last time this deployment was updated" + ) + provisioningState: v1ProvisioningState = Field( + description="Current quorum-key provisioning state for this deployment" + ) + + class v1DisableAuthProxyIntent(TurnkeyBaseModel): pass @@ -1976,258 +2724,337 @@ class v1DisablePrivateKeyResult(TurnkeyBaseModel): privateKeyId: str = Field(description="Unique identifier for a given Private Key.") -class v1Effect(str, Enum): - EFFECT_ALLOW = "EFFECT_ALLOW" - EFFECT_DENY = "EFFECT_DENY" - - -class v1EmailAuthCustomizationParams(TurnkeyBaseModel): - appName: str = Field( - description="The name of the application. This field is required and will be used in email notifications if an email template is not provided." +class v1EarnClaimRewardsIntent(TurnkeyBaseModel): + signWith: str = Field( + description="A Turnkey-managed wallet address the rewards are attributed to. The claim transaction is signed by this wallet and the Merkl Distributor transfers every reward token to it." ) - logoUrl: Optional[str] = Field( - default=None, - description="A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.", + caip2: str = Field( + description="CAIP-2 chain to claim rewards on (e.g. 'eip155:8453'). Rewards accrue per chain; see ListEarnRewards." ) - magicLinkTemplate: Optional[str] = Field( - default=None, - description="A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.", + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." ) - templateVariables: Optional[str] = Field( - default=None, - description="JSON object containing key/value pairs to be used with custom templates.", + + +class v1EarnClaimRewardsRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - templateId: Optional[str] = Field( - default=None, - description="Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.", + organizationId: str = Field( + description="Unique identifier for a given Organization." ) + parameters: v1EarnClaimRewardsIntent + generateAppProofs: Optional[bool] = Field(default=None) -class v1EmailAuthIntent(TurnkeyBaseModel): - email: str = Field(description="Email of the authenticating user.") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." +class v1EarnClaimRewardsResult(TurnkeyBaseModel): + claimRequestId: str = Field( + description="Identifier to poll claim status and tx hash via GetEarnClaimRewardsStatus." ) - apiKeyName: Optional[str] = Field( - default=None, - description="Optional human-readable name for an API Key. If none provided, default to Email Auth - ", + + +class v1EarnDeployWrapperIntent(TurnkeyBaseModel): + vaultAddress: str = Field( + description="Address of the underlying yield vault to wrap (from the ListEarnVaults catalog)." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", + caip2: str = Field( + description="CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." ) - emailCustomization: Optional[v1EmailCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", + clientFeeBps: str = Field( + description="Your fee on gross yield, in basis points (e.g., '2000' for 20%). Maximum is 4000 (40%)." ) - invalidateExisting: Optional[bool] = Field( - default=None, - description="Invalidate all other previously generated Email Auth API keys", + clientFeeWallet: str = Field( + description="The wallet address that receives the client's fee payouts on-chain. Must be a Turnkey-managed wallet address." ) - sendFromEmailAddress: Optional[str] = Field( - default=None, - description="Optional custom email address from which to send the email", + + +class v1EarnDeployWrapperRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - sendFromEmailSenderName: Optional[str] = Field( - default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + organizationId: str = Field( + description="Unique identifier for a given Organization." ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + parameters: v1EarnDeployWrapperIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1EarnDeployWrapperResult(TurnkeyBaseModel): + wrapperAddress: str = Field( + description="Address of the deployed fee wrapper (the deposit target)." ) + splitterAddress: str = Field( + description="Address of the deployed fee splitter (PaymentSplitter for Morpho, RevenueSplitterOwner for Aave)." + ) + deployRequestId: str = Field(description="Identifier to poll deploy status.") -class v1EmailAuthIntentV2(TurnkeyBaseModel): - email: str = Field(description="Email of the authenticating user.") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." +class v1EarnDepositIntent(TurnkeyBaseModel): + wrapperAddress: str = Field( + description="Address of the deployed Earn wrapper to deposit into, from ListEarnVaults/ListEarnPositions. Must be one of the org's deployed wrappers." ) - apiKeyName: Optional[str] = Field( - default=None, - description="Optional human-readable name for an API Key. If none provided, default to Email Auth - ", + signWith: str = Field( + description="A Wallet account address or Private Key address to deposit from and sign with. Must be an on-chain address; Private Key identifiers are not supported." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", + assets: str = Field( + description="Amount of the underlying asset to deposit, in raw on-chain units (e.g., '1000000' for 1 USDC at 6 decimals)." ) - emailCustomization: Optional[v1EmailCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", + caip2: str = Field( + description="CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." ) - invalidateExisting: Optional[bool] = Field( + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." + ) + + +class v1EarnDepositRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1EarnDepositIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1EarnDepositResult(TurnkeyBaseModel): + depositRequestId: str = Field( + description="Identifier to poll deposit status and tx hash via GetEarnDepositStatus." + ) + + +class v1EarnEnabledVault(TurnkeyBaseModel): + vaultAddress: Optional[str] = Field( + default=None, description="Address of the underlying yield vault." + ) + wrapperAddress: Optional[str] = Field( default=None, - description="Invalidate all other previously generated Email Auth API keys", + description="Address of the deployed fee wrapper (the deposit target).", ) - sendFromEmailAddress: Optional[str] = Field( + provider: Optional[v1EarnProvider] = Field( + default=None, description="Yield provider for the vault." + ) + caip19: Optional[str] = Field( default=None, - description="Optional custom email address from which to send the email", + description="CAIP-19 asset ID of the vault's underlying asset (e.g. 'eip155:8453/erc20:0x833589...'); the chain is encoded in the identifier.", ) - sendFromEmailSenderName: Optional[str] = Field( + apyPct: Optional[str] = Field( default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + description="Gross annual percentage yield, expressed as a decimal fraction (before fees).", ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + totalDeposited: Optional[str] = Field( + default=None, + description="Total deposited through this wrapper (wrapper TVL), in raw on-chain units of the underlying asset.", ) - - -class v1EmailAuthIntentV3(TurnkeyBaseModel): - email: str = Field(description="Email of the authenticating user.") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." + display: Optional[v1EarnValueDisplay] = Field( + default=None, + description="Normalized total-deposited values for display only (usd + crypto). Do not do arithmetic with these; use total_deposited instead.", ) - apiKeyName: Optional[str] = Field( + netApyPct: Optional[str] = Field( default=None, - description="Optional human-readable name for an API Key. If none provided, default to Email Auth - ", + description="Annual percentage yield net of fees, expressed as a decimal fraction.", ) - expirationSeconds: Optional[str] = Field( + clientFeeBps: Optional[str] = Field( + default=None, description="Client fee taken on yield, in basis points." + ) + depositsDisabled: Optional[bool] = Field( default=None, - description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", + description="When true, deposits to this wrapper are rejected; withdrawals are unaffected. Toggled via EarnSetWrapperState.", ) - emailCustomization: v1EmailAuthCustomizationParams = Field( - description="Parameters for customizing emails. If not provided, the default email will be used. Note that app_name is required." + name: Optional[str] = Field( + default=None, + description="Human-readable vault name from the provider (e.g. 'Steakhouse Prime USDC' for Morpho; the reserve symbol for Aave).", ) - invalidateExisting: Optional[bool] = Field( + curator: Optional[str] = Field( default=None, - description="Invalidate all other previously generated Email Auth API keys", + description="Vault curator name(s), comma-separated when a vault has multiple. Empty for providers without curators (e.g. Aave).", ) - sendFromEmailAddress: Optional[str] = Field( + claimableClientFee: Optional[str] = Field( default=None, - description="Optional custom email address from which to send the email", + description="The client's claimable fee (releasable now), in raw on-chain units of the underlying asset (the caip19 asset). Turnkey's fee is excluded. Only returned to the parent org; unset when a sub-org queries.", ) - sendFromEmailSenderName: Optional[str] = Field( + claimableClientFeeDisplay: Optional[v1EarnValueDisplay] = Field( default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + description="Normalized claimable_client_fee for display only (usd + crypto). Do not do arithmetic with these; use claimable_client_fee. Unset when a sub-org queries.", ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + clientFeeWallet: Optional[str] = Field( + default=None, + description="The wallet address that receives the client's fee payouts on-chain. Unset when a sub-org queries.", ) - - -class v1EmailAuthRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + liquidity: Optional[str] = Field( + default=None, + description="Assets currently withdrawable from the underlying vault without a reallocation, in raw on-chain units of the underlying asset. This is the vault's liquidity, not the wrapper's balance. Empty when the provider does not report it.", ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + liquidityDisplay: Optional[v1EarnValueDisplay] = Field( + default=None, + description="Normalized liquidity values for display purposes only (usd + crypto). Do not do arithmetic with these; use liquidity instead.", ) - parameters: v1EmailAuthIntentV3 - generateAppProofs: Optional[bool] = Field(default=None) - - -class v1EmailAuthResult(TurnkeyBaseModel): - userId: str = Field(description="Unique identifier for the authenticating User.") - apiKeyId: str = Field(description="Unique identifier for the created API key.") - - -class v1EmailCustomizationParams(TurnkeyBaseModel): - appName: Optional[str] = Field( - default=None, description="The name of the application." + exposures: Optional[List[v1EarnVaultExposure]] = Field( + default=None, + description="The underlying markets the vault allocates into, ranked by supplied amount descending. Only populated when the request sets include_exposure, and only for providers that expose an allocation breakdown (Morpho).", ) - logoUrl: Optional[str] = Field( + forceDeallocatableLiquidity: Optional[str] = Field( default=None, - description="A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.", + description="Additional assets withdrawable from the underlying vault by force-deallocating its non-liquidity adapters at zero penalty, in raw on-chain units of the underlying asset. Additive to liquidity. Empty when the provider does not report it.", ) - magicLinkTemplate: Optional[str] = Field( + forceDeallocatableLiquidityDisplay: Optional[v1EarnValueDisplay] = Field( default=None, - description="A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.", + description="Normalized force-deallocatable liquidity values for display purposes only (usd + crypto). Do not do arithmetic with these; use force_deallocatable_liquidity instead.", ) - templateVariables: Optional[str] = Field( + deployStatus: Optional[str] = Field( default=None, - description="JSON object containing key/value pairs to be used with custom templates.", + description="On-chain status of the wrapper deployment: PENDING, COMPLETED, or FAILED. Only a COMPLETED wrapper is usable. Empty when no deploy is recorded for the wrapper.", ) - templateId: Optional[str] = Field( + deployRequestId: Optional[str] = Field( default=None, - description="Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.", + description="Request id of the wrapper's most recent deploy, for polling GetEarnDeployStatus. Empty when no deploy is recorded.", + ) + deployError: Optional[str] = Field( + default=None, description="Failure detail when deploy_status is FAILED." ) -class v1EmailCustomizationParamsV2(TurnkeyBaseModel): - logoUrl: Optional[str] = Field( +class v1EarnPosition(TurnkeyBaseModel): + vaultAddress: Optional[str] = Field( + default=None, description="Address of the underlying yield vault." + ) + wrapperAddress: Optional[str] = Field( + default=None, description="Address of the fee wrapper holding the position." + ) + provider: Optional[v1EarnProvider] = Field( + default=None, description="Yield provider for the vault." + ) + caip19: Optional[str] = Field( default=None, - description="A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.", + description="CAIP-19 asset ID of the vault's underlying asset (e.g. 'eip155:8453/erc20:0x833589...'); the chain is encoded in the identifier.", ) - magicLinkTemplate: Optional[str] = Field( + currentValue: Optional[str] = Field( default=None, - description="A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.", + description="Current value of the position in the underlying asset, in raw on-chain units (already net of the wrapper fee).", ) - templateVariables: Optional[str] = Field( + totalDeposited: Optional[str] = Field( default=None, - description="JSON object containing key/value pairs to be used with custom templates.", + description="Lifetime total deposited into this position, in raw on-chain units.", ) - templateId: Optional[str] = Field( + totalWithdrawn: Optional[str] = Field( default=None, - description="Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.", + description="Lifetime total withdrawn from this position, in raw on-chain units.", ) - - -class v1EnableAuthProxyIntent(TurnkeyBaseModel): - pass - - -class v1EnableAuthProxyResult(TurnkeyBaseModel): - userId: str = Field( - description="A User ID with permission to initiate authentication." + display: Optional[v1EarnPositionDisplay] = Field( + default=None, + description="USD + crypto renderings for display only. Do not do arithmetic with these.", + ) + depositsDisabled: Optional[bool] = Field( + default=None, + description="When true, deposits to this wrapper are rejected; withdrawals are unaffected. Toggled via EarnSetWrapperState.", ) -class v1EthSendRawTransactionIntent(TurnkeyBaseModel): - signedTransaction: str = Field( - description="The raw, signed transaction to be sent." +class v1EarnPositionDisplay(TurnkeyBaseModel): + currentValueUsd: Optional[str] = Field( + default=None, description="Current value in USD, for display only." ) - caip2: str = Field( - description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + totalDepositedUsd: Optional[str] = Field( + default=None, description="Total deposited in USD, for display only." + ) + totalWithdrawnUsd: Optional[str] = Field( + default=None, description="Total withdrawn in USD, for display only." + ) + currentValueCrypto: Optional[str] = Field( + default=None, + description="Current value in the asset's own units, for display only.", + ) + totalDepositedCrypto: Optional[str] = Field( + default=None, + description="Total deposited in the asset's own units, for display only.", + ) + totalWithdrawnCrypto: Optional[str] = Field( + default=None, + description="Total withdrawn in the asset's own units, for display only.", ) -class v1EthSendRawTransactionResult(TurnkeyBaseModel): - transactionHash: str = Field( - description="The transaction hash of the sent transaction" - ) +class v1EarnProvider(str, Enum): + EARN_PROVIDER_MORPHO = "EARN_PROVIDER_MORPHO" + EARN_PROVIDER_AAVE = "EARN_PROVIDER_AAVE" + EARN_PROVIDER_KAMINO = "EARN_PROVIDER_KAMINO" -class v1EthSendTransactionIntent(TurnkeyBaseModel): - from_: str = Field( - alias="from", - description="A wallet or private key address to sign with. This does not support private key IDs.", +class v1EarnReward(TurnkeyBaseModel): + caip2: Optional[str] = Field( + default=None, + description="CAIP-2 chain the reward is claimable on (e.g. 'eip155:8453').", ) - sponsor: Optional[bool] = Field( - default=None, description="Whether to sponsor this transaction via Gas Station." + caip19: Optional[str] = Field( + default=None, + description="CAIP-19 asset ID of the reward token (e.g. 'eip155:8453/erc20:0xBAa5...'). Reward tokens are campaign-specific and unrelated to the position's underlying asset.", ) - caip2: str = Field( - description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + symbol: Optional[str] = Field( + default=None, + description="Symbol of the reward token (e.g. 'MORPHO'), as reported by Merkl.", ) - to: str = Field(description="Recipient address as a hex string with 0x prefix.") - value: Optional[str] = Field( - default=None, description="Amount of native asset to send in wei." + decimals: Optional[int] = Field( + default=None, description="Decimals of the reward token." ) - data: Optional[str] = Field( - default=None, description="Hex-encoded call data for contract interactions." + claimable: Optional[str] = Field( + default=None, + description="Amount claimable now, in raw on-chain units of the reward token.", ) - nonce: Optional[str] = Field( + claimed: Optional[str] = Field( default=None, - description="Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations.", + description="Lifetime amount already claimed, in raw on-chain units of the reward token.", ) - gasLimit: Optional[str] = Field( + pending: Optional[str] = Field( default=None, - description="Maximum amount of gas to use for this transaction, for EIP-1559 transactions.", + description="Amount accrued but not yet claimable (not yet in a live on-chain merkle root; roots update roughly every 8 hours), in raw on-chain units of the reward token.", ) - maxFeePerGas: Optional[str] = Field( + display: Optional[v1EarnRewardDisplay] = Field( default=None, - description="Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions.", + description="USD + crypto renderings for display only. Do not do arithmetic with these.", ) - maxPriorityFeePerGas: Optional[str] = Field( + + +class v1EarnRewardDisplay(TurnkeyBaseModel): + claimableUsd: Optional[str] = Field( default=None, - description="Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions.", + description="Claimable amount in USD, for display only. Empty when the token is unpriced.", ) - gasStationNonce: Optional[str] = Field( + claimableCrypto: Optional[str] = Field( default=None, - description="The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture.", + description="Claimable amount in the reward token's own units, for display only.", + ) + claimedUsd: Optional[str] = Field( + default=None, + description="Lifetime claimed amount in USD, for display only. Empty when the token is unpriced.", + ) + claimedCrypto: Optional[str] = Field( + default=None, + description="Lifetime claimed amount in the reward token's own units, for display only.", + ) + pendingUsd: Optional[str] = Field( + default=None, + description="Pending amount in USD, for display only. Empty when the token is unpriced.", + ) + pendingCrypto: Optional[str] = Field( + default=None, + description="Pending amount in the reward token's own units, for display only.", ) -class v1EthSendTransactionRequest(TurnkeyBaseModel): +class v1EarnSetWrapperStateIntent(TurnkeyBaseModel): + wrapperAddress: str = Field( + description="Address of the deployed Earn wrapper to update, from ListEarnVaults/ListEarnPositions. Must be one of the org's deployed wrappers." + ) + depositsDisabled: bool = Field( + description="When true, deposits to this wrapper are rejected; withdrawals are unaffected. Set to false to re-enable deposits." + ) + + +class v1EarnSetWrapperStateRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -2235,56 +3062,127 @@ class v1EthSendTransactionRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1EthSendTransactionIntent + parameters: v1EarnSetWrapperStateIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1EthSendTransactionResult(TurnkeyBaseModel): - sendTransactionStatusId: str = Field( - description="The send_transaction_status ID associated with the transaction submission" +class v1EarnSetWrapperStateResult(TurnkeyBaseModel): + wrapperAddress: str = Field(description="Address of the updated Earn wrapper.") + depositsDisabled: bool = Field( + description="The wrapper's deposit state after this activity." ) -class v1EthSendTransactionStatus(TurnkeyBaseModel): - txHash: Optional[str] = Field( - default=None, description="The Ethereum transaction hash, if available." +class v1EarnValueDisplay(TurnkeyBaseModel): + usd: Optional[str] = Field(default=None, description="USD value, for display only.") + crypto: Optional[str] = Field( + default=None, + description="Normalized amount in the asset's own units, for display only.", ) -class v1ExportPrivateKeyIntent(TurnkeyBaseModel): - privateKeyId: str = Field(description="Unique identifier for a given Private Key.") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the export bundle will be encrypted." +class v1EarnVault(TurnkeyBaseModel): + vaultAddress: Optional[str] = Field( + default=None, description="Address of the underlying yield vault." ) - - -class v1ExportPrivateKeyRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + provider: Optional[v1EarnProvider] = Field( + default=None, description="Yield provider for the vault." ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + caip19: Optional[str] = Field( + default=None, + description="CAIP-19 asset ID of the vault's underlying asset (e.g. 'eip155:8453/erc20:0x833589...'); the chain is encoded in the identifier.", + ) + tvl: Optional[str] = Field( + default=None, + description="Total value locked in the vault, in raw on-chain units of the underlying asset. The catalog is sorted by the USD value of this.", + ) + apyPct: Optional[str] = Field( + default=None, + description="Current annual percentage yield, expressed as a decimal fraction (e.g., '0.0812' for 8.12%).", + ) + enabled: Optional[bool] = Field( + default=None, description="Whether the organization has enabled this vault." + ) + display: Optional[v1EarnValueDisplay] = Field( + default=None, + description="Normalized TVL values for display purposes only (usd + crypto). Do not do arithmetic with these; use tvl instead.", + ) + name: Optional[str] = Field( + default=None, + description="Human-readable vault name from the provider (e.g. 'Steakhouse Prime USDC' for Morpho; the reserve symbol for Aave).", + ) + curator: Optional[str] = Field( + default=None, + description="Vault curator name(s), comma-separated when a vault has multiple. Empty for providers without curators (e.g. Aave).", + ) + liquidity: Optional[str] = Field( + default=None, + description="Assets currently withdrawable from the vault without a reallocation, in raw on-chain units of the underlying asset. Empty when the provider does not report it.", + ) + liquidityDisplay: Optional[v1EarnValueDisplay] = Field( + default=None, + description="Normalized liquidity values for display purposes only (usd + crypto). Do not do arithmetic with these; use liquidity instead.", + ) + forceDeallocatableLiquidity: Optional[str] = Field( + default=None, + description="Additional assets withdrawable from the vault by force-deallocating its non-liquidity adapters at zero penalty, in raw on-chain units of the underlying asset. Additive to liquidity. Empty when the provider does not report it.", + ) + forceDeallocatableLiquidityDisplay: Optional[v1EarnValueDisplay] = Field( + default=None, + description="Normalized force-deallocatable liquidity values for display purposes only (usd + crypto). Do not do arithmetic with these; use force_deallocatable_liquidity instead.", ) - parameters: v1ExportPrivateKeyIntent - generateAppProofs: Optional[bool] = Field(default=None) -class v1ExportPrivateKeyResult(TurnkeyBaseModel): - privateKeyId: str = Field(description="Unique identifier for a given Private Key.") - exportBundle: str = Field( - description="Export bundle containing a private key encrypted to the client's target public key." +class v1EarnVaultExposure(TurnkeyBaseModel): + marketId: Optional[str] = Field( + default=None, + description="Provider-specific identifier for the market (the Morpho Blue market id).", + ) + collateralSymbol: Optional[str] = Field( + default=None, + description="Symbol of the market's collateral asset (e.g. 'cbBTC'). Empty for an idle/uncollateralized market.", + ) + collateralCaip19: Optional[str] = Field( + default=None, + description="CAIP-19 asset ID of the market's collateral asset. Empty for an idle/uncollateralized market.", + ) + lltvPct: Optional[str] = Field( + default=None, + description="The market's liquidation loan-to-value, expressed as a decimal fraction (e.g. '0.86' for 86%).", + ) + supplied: Optional[str] = Field( + default=None, + description="Assets the vault supplies to this market, in raw on-chain units of the underlying asset.", + ) + display: Optional[v1EarnValueDisplay] = Field( + default=None, + description="Normalized supplied values for display purposes only (usd + crypto). Do not do arithmetic with these; use supplied instead.", + ) + sharePct: Optional[str] = Field( + default=None, + description="This market's share of the vault's supplied assets, as a decimal fraction (e.g. '0.997' for 99.7%).", ) -class v1ExportWalletAccountIntent(TurnkeyBaseModel): - address: str = Field(description="Address to identify Wallet Account.") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the export bundle will be encrypted." +class v1EarnWithdrawIntent(TurnkeyBaseModel): + wrapperAddress: str = Field( + description="Address of the deployed Earn wrapper holding the position to withdraw from, from ListEarnPositions. Must be one of the org's deployed wrappers." + ) + signWith: str = Field( + description="A Wallet account address or Private Key address to withdraw to and sign with. Must be an on-chain address; Private Key identifiers are not supported." + ) + caip2: str = Field( + description="CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." + ) + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." + ) + amountValue: str = Field( + description="The amount of the underlying asset to withdraw, in raw on-chain units. Pass 'MAX' to withdraw the entire position." ) -class v1ExportWalletAccountRequest(TurnkeyBaseModel): +class v1EarnWithdrawRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -2292,715 +3190,3056 @@ class v1ExportWalletAccountRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1ExportWalletAccountIntent + parameters: v1EarnWithdrawIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1ExportWalletAccountResult(TurnkeyBaseModel): - address: str = Field(description="Address to identify Wallet Account.") - exportBundle: str = Field( - description="Export bundle containing a private key encrypted by the client's target public key." +class v1EarnWithdrawResult(TurnkeyBaseModel): + withdrawRequestId: str = Field( + description="Identifier to poll withdrawal status and tx hash via GetEarnWithdrawStatus." ) -class v1ExportWalletIntent(TurnkeyBaseModel): - walletId: str = Field(description="Unique identifier for a given Wallet.") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the export bundle will be encrypted." - ) - language: Optional[v1MnemonicLanguage] = Field( - default=None, - description="The language of the mnemonic to export. Defaults to English.", - ) +class v1Effect(str, Enum): + EFFECT_ALLOW = "EFFECT_ALLOW" + EFFECT_DENY = "EFFECT_DENY" -class v1ExportWalletRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." +class v1EmailAuthCustomizationParams(TurnkeyBaseModel): + appName: str = Field( + description="The name of the application. This field is required and will be used in email notifications if an email template is not provided." ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + logoUrl: Optional[str] = Field( + default=None, + description="A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.", ) - parameters: v1ExportWalletIntent - generateAppProofs: Optional[bool] = Field(default=None) - - -class v1ExportWalletResult(TurnkeyBaseModel): - walletId: str = Field(description="Unique identifier for a given Wallet.") - exportBundle: str = Field( - description="Export bundle containing a wallet mnemonic + optional newline passphrase encrypted by the client's target public key." + magicLinkTemplate: Optional[str] = Field( + default=None, + description="A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.", ) - - -class v1Feature(TurnkeyBaseModel): - name: Optional[v1FeatureName] = Field(default=None) - value: Optional[str] = Field(default=None) - - -class v1FeatureName(str, Enum): - FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY = "FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY" - FEATURE_NAME_WEBAUTHN_ORIGINS = "FEATURE_NAME_WEBAUTHN_ORIGINS" - FEATURE_NAME_EMAIL_AUTH = "FEATURE_NAME_EMAIL_AUTH" - FEATURE_NAME_EMAIL_RECOVERY = "FEATURE_NAME_EMAIL_RECOVERY" - FEATURE_NAME_WEBHOOK = "FEATURE_NAME_WEBHOOK" - FEATURE_NAME_SMS_AUTH = "FEATURE_NAME_SMS_AUTH" - FEATURE_NAME_OTP_EMAIL_AUTH = "FEATURE_NAME_OTP_EMAIL_AUTH" - FEATURE_NAME_AUTH_PROXY = "FEATURE_NAME_AUTH_PROXY" - - -class v1FiatOnRampBlockchainNetwork(str, Enum): - FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BITCOIN = "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BITCOIN" - FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM = ( - "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM" + templateVariables: Optional[str] = Field( + default=None, + description="JSON object containing key/value pairs to be used with custom templates.", + ) + templateId: Optional[str] = Field( + default=None, + description="Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.", ) - FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA = "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA" - FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE = "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE" -class v1FiatOnRampCredential(TurnkeyBaseModel): - fiatOnrampCredentialId: str = Field( - description="Unique identifier for a given Fiat On-Ramp Credential." +class v1EmailAuthIntent(TurnkeyBaseModel): + email: str = Field(description="Email of the authenticating user.") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." ) - organizationId: str = Field(description="Unique identifier for an Organization.") - onrampProvider: v1FiatOnRampProvider = Field( - description="The fiat on-ramp provider." + apiKeyName: Optional[str] = Field( + default=None, + description="Optional human-readable name for an API Key. If none provided, default to Email Auth - ", ) - projectId: Optional[str] = Field( + expirationSeconds: Optional[str] = Field( default=None, - description="Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier.", + description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", ) - publishableApiKey: str = Field( - description="Publishable API key for the on-ramp provider." + emailCustomization: Optional[v1EmailCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", ) - encryptedSecretApiKey: str = Field( - description="Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key." + invalidateExisting: Optional[bool] = Field( + default=None, + description="Invalidate all other previously generated Email Auth API keys", ) - encryptedPrivateApiKey: Optional[str] = Field( + sendFromEmailAddress: Optional[str] = Field( default=None, - description="Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key.", + description="Optional custom email address from which to send the email", ) - sandboxMode: Optional[bool] = Field( - default=None, description="If the on-ramp credential is a sandbox credential." + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" ) - createdAt: externaldatav1Timestamp - updatedAt: externaldatav1Timestamp - - -class v1FiatOnRampCryptoCurrency(str, Enum): - FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC = "FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC" - FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH = "FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH" - FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL = "FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL" - FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC = "FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC" - - -class v1FiatOnRampCurrency(str, Enum): - FIAT_ON_RAMP_CURRENCY_AUD = "FIAT_ON_RAMP_CURRENCY_AUD" - FIAT_ON_RAMP_CURRENCY_BGN = "FIAT_ON_RAMP_CURRENCY_BGN" - FIAT_ON_RAMP_CURRENCY_BRL = "FIAT_ON_RAMP_CURRENCY_BRL" - FIAT_ON_RAMP_CURRENCY_CAD = "FIAT_ON_RAMP_CURRENCY_CAD" - FIAT_ON_RAMP_CURRENCY_CHF = "FIAT_ON_RAMP_CURRENCY_CHF" - FIAT_ON_RAMP_CURRENCY_COP = "FIAT_ON_RAMP_CURRENCY_COP" - FIAT_ON_RAMP_CURRENCY_CZK = "FIAT_ON_RAMP_CURRENCY_CZK" - FIAT_ON_RAMP_CURRENCY_DKK = "FIAT_ON_RAMP_CURRENCY_DKK" - FIAT_ON_RAMP_CURRENCY_DOP = "FIAT_ON_RAMP_CURRENCY_DOP" - FIAT_ON_RAMP_CURRENCY_EGP = "FIAT_ON_RAMP_CURRENCY_EGP" - FIAT_ON_RAMP_CURRENCY_EUR = "FIAT_ON_RAMP_CURRENCY_EUR" - FIAT_ON_RAMP_CURRENCY_GBP = "FIAT_ON_RAMP_CURRENCY_GBP" - FIAT_ON_RAMP_CURRENCY_HKD = "FIAT_ON_RAMP_CURRENCY_HKD" - FIAT_ON_RAMP_CURRENCY_IDR = "FIAT_ON_RAMP_CURRENCY_IDR" - FIAT_ON_RAMP_CURRENCY_ILS = "FIAT_ON_RAMP_CURRENCY_ILS" - FIAT_ON_RAMP_CURRENCY_JOD = "FIAT_ON_RAMP_CURRENCY_JOD" - FIAT_ON_RAMP_CURRENCY_KES = "FIAT_ON_RAMP_CURRENCY_KES" - FIAT_ON_RAMP_CURRENCY_KWD = "FIAT_ON_RAMP_CURRENCY_KWD" - FIAT_ON_RAMP_CURRENCY_LKR = "FIAT_ON_RAMP_CURRENCY_LKR" - FIAT_ON_RAMP_CURRENCY_MXN = "FIAT_ON_RAMP_CURRENCY_MXN" - FIAT_ON_RAMP_CURRENCY_NGN = "FIAT_ON_RAMP_CURRENCY_NGN" - FIAT_ON_RAMP_CURRENCY_NOK = "FIAT_ON_RAMP_CURRENCY_NOK" - FIAT_ON_RAMP_CURRENCY_NZD = "FIAT_ON_RAMP_CURRENCY_NZD" - FIAT_ON_RAMP_CURRENCY_OMR = "FIAT_ON_RAMP_CURRENCY_OMR" - FIAT_ON_RAMP_CURRENCY_PEN = "FIAT_ON_RAMP_CURRENCY_PEN" - FIAT_ON_RAMP_CURRENCY_PLN = "FIAT_ON_RAMP_CURRENCY_PLN" - FIAT_ON_RAMP_CURRENCY_RON = "FIAT_ON_RAMP_CURRENCY_RON" - FIAT_ON_RAMP_CURRENCY_SEK = "FIAT_ON_RAMP_CURRENCY_SEK" - FIAT_ON_RAMP_CURRENCY_THB = "FIAT_ON_RAMP_CURRENCY_THB" - FIAT_ON_RAMP_CURRENCY_TRY = "FIAT_ON_RAMP_CURRENCY_TRY" - FIAT_ON_RAMP_CURRENCY_TWD = "FIAT_ON_RAMP_CURRENCY_TWD" - FIAT_ON_RAMP_CURRENCY_USD = "FIAT_ON_RAMP_CURRENCY_USD" - FIAT_ON_RAMP_CURRENCY_VND = "FIAT_ON_RAMP_CURRENCY_VND" - FIAT_ON_RAMP_CURRENCY_ZAR = "FIAT_ON_RAMP_CURRENCY_ZAR" -class v1FiatOnRampPaymentMethod(str, Enum): - FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD = ( - "FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD" +class v1EmailAuthIntentV2(TurnkeyBaseModel): + email: str = Field(description="Email of the authenticating user.") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." ) - FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY = "FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY" - FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER = ( - "FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER" + apiKeyName: Optional[str] = Field( + default=None, + description="Optional human-readable name for an API Key. If none provided, default to Email Auth - ", ) - FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT = ( - "FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT" + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", ) - FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY = "FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY" - FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER = ( - "FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER" + emailCustomization: Optional[v1EmailCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", ) - FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT = ( - "FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT" + invalidateExisting: Optional[bool] = Field( + default=None, + description="Invalidate all other previously generated Email Auth API keys", ) - FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL = "FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL" - FIAT_ON_RAMP_PAYMENT_METHOD_VENMO = "FIAT_ON_RAMP_PAYMENT_METHOD_VENMO" - FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE = ( - "FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE" + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the email", ) - FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT = ( - "FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT" + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", ) - FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET = "FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET" - FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT = ( - "FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT" + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" ) -class v1FiatOnRampProvider(str, Enum): - FIAT_ON_RAMP_PROVIDER_COINBASE = "FIAT_ON_RAMP_PROVIDER_COINBASE" - FIAT_ON_RAMP_PROVIDER_MOONPAY = "FIAT_ON_RAMP_PROVIDER_MOONPAY" - - -class v1GetActivitiesRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." +class v1EmailAuthIntentV3(TurnkeyBaseModel): + email: str = Field(description="Email of the authenticating user.") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." ) - filterByStatus: Optional[List[v1ActivityStatus]] = Field( + apiKeyName: Optional[str] = Field( default=None, - description="Array of activity statuses filtering which activities will be listed in the response.", + description="Optional human-readable name for an API Key. If none provided, default to Email Auth - ", ) - paginationOptions: Optional[v1Pagination] = Field( - default=None, description="Parameters used for cursor-based pagination." + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", ) - filterByType: Optional[List[v1ActivityType]] = Field( + emailCustomization: v1EmailAuthCustomizationParams = Field( + description="Parameters for customizing emails. If not provided, the default email will be used. Note that app_name is required." + ) + invalidateExisting: Optional[bool] = Field( default=None, - description="Array of activity types filtering which activities will be listed in the response.", + description="Invalidate all other previously generated Email Auth API keys", ) - - -class v1GetActivitiesResponse(TurnkeyBaseModel): - activities: List[v1Activity] = Field(description="A list of activities.") - - -class v1GetActivityRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the email", ) - activityId: str = Field( - description="Unique identifier for a given activity object." + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" ) -class v1GetApiKeyRequest(TurnkeyBaseModel): +class v1EmailAuthRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." ) - apiKeyId: str = Field(description="Unique identifier for a given API key.") + parameters: v1EmailAuthIntentV3 + generateAppProofs: Optional[bool] = Field(default=None) -class v1GetApiKeyResponse(TurnkeyBaseModel): - apiKey: v1ApiKey = Field(description="An API key.") +class v1EmailAuthResult(TurnkeyBaseModel): + userId: str = Field(description="Unique identifier for the authenticating User.") + apiKeyId: str = Field(description="Unique identifier for the created API key.") -class v1GetApiKeysRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." +class v1EmailCustomizationParams(TurnkeyBaseModel): + appName: Optional[str] = Field( + default=None, description="The name of the application." ) - userId: Optional[str] = Field( - default=None, description="Unique identifier for a given user." + logoUrl: Optional[str] = Field( + default=None, + description="A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.", + ) + magicLinkTemplate: Optional[str] = Field( + default=None, + description="A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.", + ) + templateVariables: Optional[str] = Field( + default=None, + description="JSON object containing key/value pairs to be used with custom templates.", + ) + templateId: Optional[str] = Field( + default=None, + description="Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.", ) -class v1GetApiKeysResponse(TurnkeyBaseModel): - apiKeys: List[v1ApiKey] = Field(description="A list of API keys.") +class v1EmailCustomizationParamsV2(TurnkeyBaseModel): + logoUrl: Optional[str] = Field( + default=None, + description="A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px.", + ) + magicLinkTemplate: Optional[str] = Field( + default=None, + description="A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`.", + ) + templateVariables: Optional[str] = Field( + default=None, + description="JSON object containing key/value pairs to be used with custom templates.", + ) + templateId: Optional[str] = Field( + default=None, + description="Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template.", + ) -class v1GetAppProofsRequest(TurnkeyBaseModel): +class v1EmailEvent(TurnkeyBaseModel): + id: str = Field(description="Unique identifier for the email event") organizationId: str = Field( - description="Unique identifier for a given Organization." + description="Unique identifier for the organization associated with the email event" + ) + messageId: str = Field( + description="Provider message identifier. Multiple events can share the same message ID" + ) + eventType: str = Field( + description="Email event type, such as Send, Delivery, Bounce, or DeliveryDelay" + ) + fromAddress: str = Field(description="Sender email address") + toAddress: str = Field(description="Recipient email address") + senderTenant: Optional[str] = Field( + default=None, description="SES tenant that sent the email, when available" + ) + timestamp: str = Field(description="Event timestamp as millisecond epoch string") + createdAt: str = Field(description="Creation timestamp as millisecond epoch string") + details: v1EmailEventDetails = Field( + description="Parsed email event details. Fields are populated based on event type and available provider metadata" ) - activityId: str = Field(description="Unique identifier for a given activity.") -class v1GetAppProofsResponse(TurnkeyBaseModel): - appProofs: List[v1AppProof] +class v1EmailEventDetails(TurnkeyBaseModel): + bounceType: Optional[str] = Field( + default=None, description="Bounce type for Bounce events" + ) + bounceSubType: Optional[str] = Field( + default=None, description="Bounce subtype for Bounce events" + ) + diagnosticCode: Optional[str] = Field( + default=None, description="Diagnostic text for Bounce or DeliveryDelay events" + ) + deliverySmtpResponse: Optional[str] = Field( + default=None, description="SMTP response for Delivery events" + ) + deliveryProcessingTimeMillis: Optional[str] = Field( + default=None, description="Processing time in milliseconds for Delivery events" + ) + deliveryDelayType: Optional[str] = Field( + default=None, description="Delay type for DeliveryDelay events" + ) + complaintFeedbackType: Optional[str] = Field( + default=None, description="Feedback type for Complaint events" + ) -class v1GetAuthenticatorRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." +class v1EnableAuthProxyIntent(TurnkeyBaseModel): + pass + + +class v1EnableAuthProxyResult(TurnkeyBaseModel): + userId: str = Field( + description="A User ID with permission to initiate authentication." ) - authenticatorId: str = Field( - description="Unique identifier for a given authenticator." + + +class v1EthCallParams(TurnkeyBaseModel): + to: str = Field(description="Recipient address as a hex string with 0x prefix.") + value: Optional[str] = Field( + default=None, description="Amount of native asset to send in wei." + ) + data: Optional[str] = Field( + default=None, description="Hex-encoded call data for contract interactions." ) -class v1GetAuthenticatorResponse(TurnkeyBaseModel): - authenticator: v1Authenticator = Field(description="An authenticator.") +class v1EthFailureDetails(TurnkeyBaseModel): + revertChain: Optional[List[v1RevertChainEntry]] = Field( + default=None, + description="Ethereum revert chain, ordered from outermost to innermost.", + ) -class v1GetAuthenticatorsRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." +class v1EthSendRawTransactionIntent(TurnkeyBaseModel): + signedTransaction: str = Field( + description="The raw, signed transaction to be sent." + ) + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." ) - userId: str = Field(description="Unique identifier for a given user.") -class v1GetAuthenticatorsResponse(TurnkeyBaseModel): - authenticators: List[v1Authenticator] = Field( - description="A list of authenticators." +class v1EthSendRawTransactionResult(TurnkeyBaseModel): + transactionHash: str = Field( + description="The transaction hash of the sent transaction" ) -class v1GetBootProofRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given Organization." +class v1EthSendTransactionIntent(TurnkeyBaseModel): + from_: str = Field( + alias="from", + description="A wallet or private key address to sign with. This does not support private key IDs.", + ) + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." + ) + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + ) + to: str = Field(description="Recipient address as a hex string with 0x prefix.") + value: Optional[str] = Field( + default=None, description="Amount of native asset to send in wei." + ) + data: Optional[str] = Field( + default=None, description="Hex-encoded call data for contract interactions." + ) + nonce: Optional[str] = Field( + default=None, + description="Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations.", + ) + gasLimit: Optional[str] = Field( + default=None, + description="Maximum amount of gas to use for this transaction, for EIP-1559 transactions.", + ) + maxFeePerGas: Optional[str] = Field( + default=None, + description="Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions.", + ) + maxPriorityFeePerGas: Optional[str] = Field( + default=None, + description="Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions.", + ) + deadline: Optional[str] = Field( + default=None, + description="Unix timestamp in seconds for EIP-712 execution deadline. Only used when sponsor=true.", + ) + gasStationNonce: Optional[str] = Field( + default=None, + description="The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture.", ) - ephemeralKey: str = Field(description="Hex encoded ephemeral public key.") -class v1GetGasUsageRequest(TurnkeyBaseModel): +class v1EthSendTransactionIntentV2(TurnkeyBaseModel): + from_: str = Field( + alias="from", + description="A wallet or private key address to sign with. This does not support private key IDs.", + ) + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + ) + sponsor: Optional[bool] = Field( + default=None, + description="Whether to sponsor this transaction via Gas Station. If false or unset, the EOA pays gas. A single call uses EIP-1559; multiple calls use EIP-7702 batch execution via Gas Station.", + ) + nonce: Optional[str] = Field( + default=None, description="Outer transaction nonce. Omit to auto-fetch." + ) + gasLimit: Optional[str] = Field( + default=None, + description="Maximum amount of gas for the outer transaction. Omit to auto-estimate.", + ) + maxFeePerGas: Optional[str] = Field( + default=None, + description="Maximum total fee per gas unit (base fee + priority fee) in wei. Omit to auto-estimate.", + ) + maxPriorityFeePerGas: Optional[str] = Field( + default=None, + description="Maximum priority fee (tip) per gas unit in wei. Omit to auto-estimate.", + ) + deadline: Optional[str] = Field( + default=None, + description="Unix timestamp in seconds for EIP-712 execution deadline. Only used when sponsor=true.", + ) + gasStationNonce: Optional[str] = Field( + default=None, + description="The gas station delegate contract nonce used in the BatchExecution EIP-712 message. Valid for sponsored transactions and non-sponsored multi-call batches. Omit to auto-fetch. Use the nonces endpoint for replay protection.", + ) + calls: List[v1EthCallParams] = Field( + description="Ordered list of calls to execute. Must contain between 1 and 50 entries. A single entry with sponsor=false uses EIP-1559; multiple entries use EIP-7702 batch execution via Gas Station." + ) + + +class v1EthSendTransactionRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) organizationId: str = Field( description="Unique identifier for a given Organization." ) + parameters: v1EthSendTransactionIntentV2 + generateAppProofs: Optional[bool] = Field(default=None) -class v1GetGasUsageResponse(TurnkeyBaseModel): - windowDurationMinutes: int = Field( - description="The window duration (in minutes) for the organization or sub-organization." +class v1EthSendTransactionResult(TurnkeyBaseModel): + sendTransactionStatusId: str = Field( + description="The send_transaction_status ID associated with the transaction submission" ) - windowLimitUsd: str = Field( - description="The window limit (in USD) for the organization or sub-organization." + + +class v1EthSendTransactionResultV2(TurnkeyBaseModel): + sendTransactionStatusId: str = Field( + description="The send_transaction_status ID associated with the transaction submission" ) - usageUsd: str = Field( - description="The total gas usage (in USD) of all sponsored transactions processed over the last `window_duration_minutes`" + + +class v1EthSendTransactionStatus(TurnkeyBaseModel): + txHash: Optional[str] = Field( + default=None, description="The Ethereum transaction hash, if available." ) -class v1GetLatestBootProofRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given Organization." +class v1EthTransactionHistoryItem(TurnkeyBaseModel): + transactionHash: str = Field(description="EVM transaction hash.") + block: v1TransactionHistoryBlock = Field( + description="Block metadata for the transaction." + ) + status: str = Field(description="Transaction confirmation status.") + origin: str = Field( + description="Origin of the transaction. Examples include TURNKEY." + ) + from_: str = Field( + alias="from", description="EVM sender address for the transaction." + ) + to: Optional[str] = Field( + default=None, + description="EVM transaction destination address, such as the called contract or EVM tx.to. Omitted for contract-creation transactions with no destination. Recipients and payers of value transfers are reflected in transfers[].counterparty.", + ) + fee: v1TransactionHistoryFee = Field(description="Transaction fee information.") + transfers: List[v1TransactionHistoryTransfer] = Field( + description="Asset transfers associated with the transaction." + ) + turnkey: Optional[v1TransactionHistoryTurnkey] = Field( + default=None, + description="Turnkey-specific metadata for transactions originated by Turnkey.", + ) + executionFailed: Optional[bool] = Field( + default=None, + description="Whether the transaction failed during on-chain execution. Omitted when execution outcome is unavailable.", ) - appName: str = Field(description="Name of enclave app.") -class v1GetNoncesRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given Organization." +class v1EthUndelegate7702Intent(TurnkeyBaseModel): + from_: str = Field( + alias="from", + description="A wallet or private key address to undelegate. This does not support private key IDs.", ) - address: str = Field(description="The Ethereum address to query nonces for.") caip2: str = Field( description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." ) - nonce: Optional[bool] = Field( - default=None, description="Whether to fetch the standard on-chain nonce." + nonce: Optional[str] = Field( + default=None, description="Outer transaction nonce. Omit to auto-fetch." ) - gasStationNonce: Optional[bool] = Field( + gasLimit: Optional[str] = Field( default=None, - description="Whether to fetch the gas station nonce used for sponsored transactions.", + description="Maximum amount of gas for the undelegation transaction. Omit to use the fixed undelegation gas limit.", + ) + maxFeePerGas: Optional[str] = Field( + default=None, + description="Maximum total fee per gas unit (base fee + priority fee) in wei. Omit to auto-estimate.", + ) + maxPriorityFeePerGas: Optional[str] = Field( + default=None, + description="Maximum priority fee (tip) per gas unit in wei. Omit to auto-estimate.", ) -class v1GetNoncesResponse(TurnkeyBaseModel): - nonce: Optional[str] = Field( +class v1EthUndelegate7702Request(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1EthUndelegate7702Intent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1EthUndelegate7702Result(TurnkeyBaseModel): + sendTransactionStatusId: str = Field( + description="The send_transaction_status ID associated with the undelegation transaction submission" + ) + + +class v1ExecuteSwapIntent(TurnkeyBaseModel): + inputToken: str = Field( + description="CAIP-19 asset ID for the input asset. The chain is derived from this value." + ) + outputToken: str = Field( + description="CAIP-19 asset ID for the output asset. May be on a different chain than `input_token` for cross-chain swaps." + ) + inputAmount: str = Field(description="Base-unit amount of the input asset.") + walletAccount: str = Field( + description="Wallet account address to sign and submit the swap transaction from. Cross-wallet swaps are not supported." + ) + sponsor: Optional[bool] = Field( default=None, - description="The standard on-chain nonce for the address, if requested.", + description="Whether to sponsor the resulting swap transaction via Gas Station when supported by the chain.", ) - gasStationNonce: Optional[str] = Field( + slippage: Optional[str] = Field( + default=None, description="Maximum allowed slippage in basis points." + ) + provider: Optional[str] = Field( default=None, - description="The gas station nonce for sponsored transactions, if requested.", + description="Swap provider to execute with, as returned by create_swap_quote. When omitted, execution uses the default provider.", + ) + minOutputAmount: str = Field( + description="Minimum acceptable base-unit amount of the output asset. Execution fails if the swap provider's quoted minimum output falls below this floor at execution time." + ) + + +class v1ExecuteSwapIntentV2(TurnkeyBaseModel): + quoteId: str = Field( + description="Quote identifier returned by create_swap_quote. Execution is bound to this quote; the signer is derived from the quote and must not be resupplied." + ) + inputToken: str = Field(description="CAIP-19 asset ID for the input asset.") + inputAmount: str = Field( + description="Exact base-unit amount of the input asset committed by the quote." + ) + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + quotedOutputAmount: str = Field( + description="Exact quoted base-unit output amount committed by the quote." + ) + minOutputAmount: str = Field( + description="Exact minimum base-unit output committed by the quote." + ) + sponsor: bool = Field(description="Whether the quoted transaction is sponsored.") + evmNonce: Optional[str] = Field( + default=None, + description="Exact EVM sender (EOA account) nonce. Valid only for a non-sponsored EVM swap. Honored for already-delegated (Type-2) batch swaps and single-call swaps; ignored for not-yet-delegated EIP-7702 (Type-4) batches where the outer nonce is derived from the authorization. Prefer gas_station_nonce for batch replay protection and use the nonces endpoint to fetch it. Omit to auto-fetch.", + ) + recentBlockhash: Optional[str] = Field( + default=None, + description="Exact Solana recent blockhash. Valid only for a Solana swap, including sponsored swaps. Omit to auto-fetch.", + ) + gasStationNonce: Optional[str] = Field( + default=None, + description="Exact gas station delegate contract nonce used in the BatchExecution EIP-712 message. Valid for sponsored EVM swaps and non-sponsored EVM swaps that execute as a multi-call batch (for example ERC-20 approve + swap). This is the replay-protection nonce for gas-station batches; use the nonces endpoint to fetch it. Omit to auto-fetch.", + ) + + +class v1ExecuteSwapIntentV3(TurnkeyBaseModel): + quoteId: str = Field( + description="Quote identifier returned by create_swap_quote. Execution is bound to this quote; the signer is derived from the quote and must not be resupplied." + ) + inputToken: str = Field(description="CAIP-19 asset ID for the input asset.") + inputAmount: str = Field( + description="Exact base-unit amount of the input asset committed by the quote." + ) + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + quotedOutputAmount: str = Field( + description="Exact quoted base-unit output amount committed by the quote." + ) + minOutputAmount: str = Field( + description="Exact minimum base-unit output committed by the quote." + ) + sponsor: bool = Field(description="Whether the quoted transaction is sponsored.") + evmNonce: Optional[str] = Field( + default=None, + description="Exact EVM sender (EOA account) nonce. Valid only for a non-sponsored EVM swap. Honored for already-delegated (Type-2) batch swaps and single-call swaps; ignored for not-yet-delegated EIP-7702 (Type-4) batches where the outer nonce is derived from the authorization. Prefer gas_station_nonce for batch replay protection and use the nonces endpoint to fetch it. Omit to auto-fetch.", + ) + recentBlockhash: Optional[str] = Field( + default=None, + description="Exact Solana recent blockhash. Valid only for a Solana swap, including sponsored swaps. Omit to auto-fetch.", + ) + gasStationNonce: Optional[str] = Field( + default=None, + description="Exact gas station delegate contract nonce used in the BatchExecution EIP-712 message. Valid for sponsored EVM swaps and non-sponsored EVM swaps that execute as a multi-call batch (for example ERC-20 approve + swap). This is the replay-protection nonce for gas-station batches; use the nonces endpoint to fetch it. Omit to auto-fetch.", + ) + destinationAddress: Optional[str] = Field( + default=None, + description="Raw public address that receives the output asset. Required for cross-protocol swaps. The address must match the output token protocol. Wallet account IDs, private key IDs, and CAIP account or asset identifiers are not supported.", + ) + + +class v1ExecuteSwapRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ExecuteSwapIntentV3 + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ExecuteSwapResult(TurnkeyBaseModel): + swapRequestId: str = Field( + description="Identifier to poll swap status via GetSwapStatus." + ) + provider: Optional[str] = Field( + default=None, description="Swap provider used to build the transaction." + ) + quoteId: Optional[str] = Field( + default=None, description="Quote identifier used for execution, if any." + ) + + +class v1ExportPrivateKeyIntent(TurnkeyBaseModel): + privateKeyId: str = Field(description="Unique identifier for a given Private Key.") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the export bundle will be encrypted." + ) + + +class v1ExportPrivateKeyRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ExportPrivateKeyIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ExportPrivateKeyResult(TurnkeyBaseModel): + privateKeyId: str = Field(description="Unique identifier for a given Private Key.") + exportBundle: str = Field( + description="Export bundle containing a private key encrypted to the client's target public key." + ) + + +class v1ExportSecretParams(TurnkeyBaseModel): + secretId: str = Field(description="Unique identifier for the secret to export.") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the exported secret will be encrypted." + ) + encryptionSuite: v1TransportEncryptionSuite = Field( + description="Transport encryption suite used for the exported secret." + ) + requestContext: Optional[List[v1KeyValue]] = Field( + default=None, description="Bind metadata to the request." + ) + + +class v1ExportSecretsIntent(TurnkeyBaseModel): + secrets: List[v1ExportSecretParams] = Field( + description="A list of secrets to export." + ) + + +class v1ExportSecretsRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ExportSecretsIntent + + +class v1ExportSecretsResult(TurnkeyBaseModel): + secretPayloads: List[str] = Field( + description="Encryption suite specific payload containing each secret ciphertext, in the order the params were specified. For enclave encrypt v1 each entry is a JSON-encoded ServerSendMsg." + ) + + +class v1ExportWalletAccountIntent(TurnkeyBaseModel): + address: str = Field(description="Address to identify Wallet Account.") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the export bundle will be encrypted." + ) + + +class v1ExportWalletAccountRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ExportWalletAccountIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ExportWalletAccountResult(TurnkeyBaseModel): + address: str = Field(description="Address to identify Wallet Account.") + exportBundle: str = Field( + description="Export bundle containing a private key encrypted by the client's target public key." + ) + + +class v1ExportWalletIntent(TurnkeyBaseModel): + walletId: str = Field(description="Unique identifier for a given Wallet.") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the export bundle will be encrypted." + ) + language: Optional[v1MnemonicLanguage] = Field( + default=None, + description="The language of the mnemonic to export. Defaults to English.", + ) + + +class v1ExportWalletRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ExportWalletIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ExportWalletResult(TurnkeyBaseModel): + walletId: str = Field(description="Unique identifier for a given Wallet.") + exportBundle: str = Field( + description="Export bundle containing a wallet mnemonic + optional newline passphrase encrypted by the client's target public key." + ) + + +class v1Feature(TurnkeyBaseModel): + name: Optional[v1FeatureName] = Field(default=None) + value: Optional[str] = Field(default=None) + + +class v1FeatureName(str, Enum): + FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY = "FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY" + FEATURE_NAME_WEBAUTHN_ORIGINS = "FEATURE_NAME_WEBAUTHN_ORIGINS" + FEATURE_NAME_EMAIL_AUTH = "FEATURE_NAME_EMAIL_AUTH" + FEATURE_NAME_EMAIL_RECOVERY = "FEATURE_NAME_EMAIL_RECOVERY" + FEATURE_NAME_WEBHOOK = "FEATURE_NAME_WEBHOOK" + FEATURE_NAME_SMS_AUTH = "FEATURE_NAME_SMS_AUTH" + FEATURE_NAME_OTP_EMAIL_AUTH = "FEATURE_NAME_OTP_EMAIL_AUTH" + FEATURE_NAME_AUTH_PROXY = "FEATURE_NAME_AUTH_PROXY" + FEATURE_NAME_SOLANA_RENT_PREFUND_ENABLED = ( + "FEATURE_NAME_SOLANA_RENT_PREFUND_ENABLED" + ) + FEATURE_NAME_SWAP_CONFIG = "FEATURE_NAME_SWAP_CONFIG" + FEATURE_NAME_EARN_CONFIG = "FEATURE_NAME_EARN_CONFIG" + FEATURE_NAME_SWAP_FEE_SPONSORSHIP = "FEATURE_NAME_SWAP_FEE_SPONSORSHIP" + FEATURE_NAME_SWAP_FIXED_RATE = "FEATURE_NAME_SWAP_FIXED_RATE" + + +class v1FiatOnRampBlockchainNetwork(str, Enum): + FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM = ( + "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM" + ) + FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA = "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA" + FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE = "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE" + + +class v1FiatOnRampCredential(TurnkeyBaseModel): + fiatOnrampCredentialId: str = Field( + description="Unique identifier for a given Fiat On-Ramp Credential." + ) + organizationId: str = Field(description="Unique identifier for an Organization.") + onrampProvider: v1FiatOnRampProvider = Field( + description="The fiat on-ramp provider." + ) + projectId: Optional[str] = Field( + default=None, + description="Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier.", + ) + publishableApiKey: str = Field( + description="Publishable API key for the on-ramp provider." + ) + encryptedSecretApiKey: str = Field( + description="Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key." + ) + encryptedPrivateApiKey: Optional[str] = Field( + default=None, + description="Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key.", + ) + sandboxMode: Optional[bool] = Field( + default=None, description="If the on-ramp credential is a sandbox credential." + ) + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + + +class v1FiatOnRampCryptoCurrency(str, Enum): + FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC = "FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC" + FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH = "FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH" + FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL = "FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL" + FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC = "FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC" + + +class v1FiatOnRampCurrency(str, Enum): + FIAT_ON_RAMP_CURRENCY_AUD = "FIAT_ON_RAMP_CURRENCY_AUD" + FIAT_ON_RAMP_CURRENCY_BGN = "FIAT_ON_RAMP_CURRENCY_BGN" + FIAT_ON_RAMP_CURRENCY_BRL = "FIAT_ON_RAMP_CURRENCY_BRL" + FIAT_ON_RAMP_CURRENCY_CAD = "FIAT_ON_RAMP_CURRENCY_CAD" + FIAT_ON_RAMP_CURRENCY_CHF = "FIAT_ON_RAMP_CURRENCY_CHF" + FIAT_ON_RAMP_CURRENCY_COP = "FIAT_ON_RAMP_CURRENCY_COP" + FIAT_ON_RAMP_CURRENCY_CZK = "FIAT_ON_RAMP_CURRENCY_CZK" + FIAT_ON_RAMP_CURRENCY_DKK = "FIAT_ON_RAMP_CURRENCY_DKK" + FIAT_ON_RAMP_CURRENCY_DOP = "FIAT_ON_RAMP_CURRENCY_DOP" + FIAT_ON_RAMP_CURRENCY_EGP = "FIAT_ON_RAMP_CURRENCY_EGP" + FIAT_ON_RAMP_CURRENCY_EUR = "FIAT_ON_RAMP_CURRENCY_EUR" + FIAT_ON_RAMP_CURRENCY_GBP = "FIAT_ON_RAMP_CURRENCY_GBP" + FIAT_ON_RAMP_CURRENCY_HKD = "FIAT_ON_RAMP_CURRENCY_HKD" + FIAT_ON_RAMP_CURRENCY_IDR = "FIAT_ON_RAMP_CURRENCY_IDR" + FIAT_ON_RAMP_CURRENCY_ILS = "FIAT_ON_RAMP_CURRENCY_ILS" + FIAT_ON_RAMP_CURRENCY_JOD = "FIAT_ON_RAMP_CURRENCY_JOD" + FIAT_ON_RAMP_CURRENCY_KES = "FIAT_ON_RAMP_CURRENCY_KES" + FIAT_ON_RAMP_CURRENCY_KWD = "FIAT_ON_RAMP_CURRENCY_KWD" + FIAT_ON_RAMP_CURRENCY_LKR = "FIAT_ON_RAMP_CURRENCY_LKR" + FIAT_ON_RAMP_CURRENCY_MXN = "FIAT_ON_RAMP_CURRENCY_MXN" + FIAT_ON_RAMP_CURRENCY_NGN = "FIAT_ON_RAMP_CURRENCY_NGN" + FIAT_ON_RAMP_CURRENCY_NOK = "FIAT_ON_RAMP_CURRENCY_NOK" + FIAT_ON_RAMP_CURRENCY_NZD = "FIAT_ON_RAMP_CURRENCY_NZD" + FIAT_ON_RAMP_CURRENCY_OMR = "FIAT_ON_RAMP_CURRENCY_OMR" + FIAT_ON_RAMP_CURRENCY_PEN = "FIAT_ON_RAMP_CURRENCY_PEN" + FIAT_ON_RAMP_CURRENCY_PLN = "FIAT_ON_RAMP_CURRENCY_PLN" + FIAT_ON_RAMP_CURRENCY_RON = "FIAT_ON_RAMP_CURRENCY_RON" + FIAT_ON_RAMP_CURRENCY_SEK = "FIAT_ON_RAMP_CURRENCY_SEK" + FIAT_ON_RAMP_CURRENCY_THB = "FIAT_ON_RAMP_CURRENCY_THB" + FIAT_ON_RAMP_CURRENCY_TRY = "FIAT_ON_RAMP_CURRENCY_TRY" + FIAT_ON_RAMP_CURRENCY_TWD = "FIAT_ON_RAMP_CURRENCY_TWD" + FIAT_ON_RAMP_CURRENCY_USD = "FIAT_ON_RAMP_CURRENCY_USD" + FIAT_ON_RAMP_CURRENCY_VND = "FIAT_ON_RAMP_CURRENCY_VND" + FIAT_ON_RAMP_CURRENCY_ZAR = "FIAT_ON_RAMP_CURRENCY_ZAR" + + +class v1FiatOnRampPaymentMethod(str, Enum): + FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD = ( + "FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD" + ) + FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY = "FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY" + FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER = ( + "FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER" + ) + FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT = ( + "FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT" + ) + FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY = "FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY" + FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER = ( + "FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER" + ) + FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT = ( + "FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT" + ) + FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL = "FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL" + FIAT_ON_RAMP_PAYMENT_METHOD_VENMO = "FIAT_ON_RAMP_PAYMENT_METHOD_VENMO" + FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE = ( + "FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE" + ) + FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT = ( + "FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT" + ) + FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET = "FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET" + FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT = ( + "FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT" + ) + + +class v1FiatOnRampProvider(str, Enum): + FIAT_ON_RAMP_PROVIDER_COINBASE = "FIAT_ON_RAMP_PROVIDER_COINBASE" + FIAT_ON_RAMP_PROVIDER_MOONPAY = "FIAT_ON_RAMP_PROVIDER_MOONPAY" + + +class v1GetActivePoliciesRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetActivePoliciesResponse(TurnkeyBaseModel): + statuses: List[v1ActivePolicyStatus] = Field( + description="The active/inactive status of every policy in the organization." + ) + evaluatedAtMs: str = Field( + description="The enclave's trusted timestamp (Unix epoch milliseconds) used to evaluate every policy." + ) + + +class v1GetActivitiesRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + filterByStatus: Optional[List[v1ActivityStatus]] = Field( + default=None, + description="Array of activity statuses filtering which activities will be listed in the response.", + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, description="Parameters used for cursor-based pagination." + ) + filterByType: Optional[List[v1ActivityType]] = Field( + default=None, + description="Array of activity types filtering which activities will be listed in the response.", + ) + + +class v1GetActivitiesResponse(TurnkeyBaseModel): + activities: List[v1Activity] = Field(description="A list of activities.") + + +class v1GetActivityRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + activityId: str = Field( + description="Unique identifier for a given activity object." + ) + + +class v1GetApiKeyRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + apiKeyId: str = Field(description="Unique identifier for a given API key.") + + +class v1GetApiKeyResponse(TurnkeyBaseModel): + apiKey: v1ApiKey = Field(description="An API key.") + + +class v1GetApiKeysRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + userId: Optional[str] = Field( + default=None, description="Unique identifier for a given user." + ) + + +class v1GetApiKeysResponse(TurnkeyBaseModel): + apiKeys: List[v1ApiKey] = Field(description="A list of API keys.") + + +class v1GetAppProofsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + activityId: str = Field(description="Unique identifier for a given activity.") + + +class v1GetAppProofsResponse(TurnkeyBaseModel): + appProofs: List[v1AppProof] + + +class v1GetAppStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + appId: str = Field(description="Unique identifier for a given TVC App.") + + +class v1GetAppStatusResponse(TurnkeyBaseModel): + appStatus: v1AppStatus = Field(description="Live runtime status for the TVC App") + + +class v1GetAuthenticatorRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + authenticatorId: str = Field( + description="Unique identifier for a given authenticator." + ) + + +class v1GetAuthenticatorResponse(TurnkeyBaseModel): + authenticator: v1Authenticator = Field(description="An authenticator.") + + +class v1GetAuthenticatorsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + userId: str = Field(description="Unique identifier for a given user.") + + +class v1GetAuthenticatorsResponse(TurnkeyBaseModel): + authenticators: List[v1Authenticator] = Field( + description="A list of authenticators." + ) + + +class v1GetBootProofRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + ephemeralKey: str = Field(description="Hex encoded ephemeral public key.") + + +class v1GetClaimEarnFeesStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + claimRequestId: str = Field( + description="The claim_request_id returned by ClaimEarnFees." + ) + + +class v1GetClaimEarnFeesStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the fee claim.") + claimTxHash: Optional[str] = Field( + default=None, description="Transaction hash of the fee claim, once available." + ) + error: Optional[str] = Field( + default=None, + description="Reason the fee claim transaction failed, when status is FAILED.", + ) + + +class v1GetEarnClaimRewardsStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + claimRequestId: str = Field( + description="The claim_request_id returned by EarnClaimRewards." + ) + + +class v1GetEarnClaimRewardsStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the rewards claim.") + claimTxHash: Optional[str] = Field( + default=None, + description="Transaction hash of the rewards claim, once available.", + ) + error: Optional[str] = Field( + default=None, + description="Reason the rewards claim transaction failed, when status is FAILED.", + ) + + +class v1GetEarnDeployStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + deployRequestId: str = Field( + description="The deploy_request_id returned by EarnDeployWrapper." + ) + + +class v1GetEarnDeployStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the wrapper deployment.") + deployTxHash: Optional[str] = Field( + default=None, description="Transaction hash of the deployment, once available." + ) + error: Optional[str] = Field( + default=None, + description="Reason the deployment transaction failed, when status is FAILED.", + ) + + +class v1GetEarnDepositStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + depositRequestId: str = Field( + description="The deposit_request_id returned by EarnDeposit." + ) + + +class v1GetEarnDepositStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the deposit.") + depositTxHash: Optional[str] = Field( + default=None, description="Transaction hash of the deposit, once available." + ) + error: Optional[str] = Field( + default=None, + description="Reason the deposit transaction failed, when status is FAILED.", + ) + + +class v1GetEarnWithdrawStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + withdrawRequestId: str = Field( + description="The withdraw_request_id returned by EarnWithdraw." + ) + + +class v1GetEarnWithdrawStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the withdrawal.") + withdrawTxHash: Optional[str] = Field( + default=None, description="Transaction hash of the withdrawal, once available." + ) + error: Optional[str] = Field( + default=None, + description="Reason the withdrawal transaction failed, when status is FAILED.", + ) + + +class v1GetGasUsageRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetGasUsageResponse(TurnkeyBaseModel): + windowDurationMinutes: int = Field( + description="The window duration (in minutes) for the organization or sub-organization." + ) + windowLimitUsd: str = Field( + description="The window limit (in USD) for the organization or sub-organization." + ) + usageUsd: str = Field( + description="The total gas usage (in USD) of all sponsored transactions processed over the last `window_duration_minutes`" + ) + + +class v1GetIpAllowlistRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + publicKey: Optional[str] = Field( + default=None, + description="If provided, return only the allowlist for this specific API key.", + ) + + +class v1GetIpAllowlistResponse(TurnkeyBaseModel): + allowlist: v1IpAllowlist + + +class v1GetLatestBootProofRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + appName: str = Field(description="Unique identifier (UUID) of the enclave app.") + + +class v1GetMfaPoliciesRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + userId: str = Field(description="Unique identifier for a given user.") + + +class v1GetMfaPoliciesResponse(TurnkeyBaseModel): + mfaPolicies: List[v1MfaPolicy] = Field( + description="A list of multi-factor authentication policies for a user." + ) + + +class v1GetMfaPolicyRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + userId: str = Field(description="Unique identifier for a given user.") + mfaPolicyId: str = Field(description="Unique identifier for a given MFA policy.") + + +class v1GetMfaPolicyResponse(TurnkeyBaseModel): + mfaPolicy: v1MfaPolicy = Field( + description="Multi-factor authentication policy for a user." + ) + + +class v1GetMfaStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + activityId: str = Field( + description="The unique identifier of the activity to get MFA status for." + ) + userId: Optional[str] = Field( + default=None, + description="Optional user ID to filter MFA status for a specific user.", + ) + + +class v1GetMfaStatusResponse(TurnkeyBaseModel): + mfaStatuses: List[v1MfaStatus] = Field( + description="A list of MFA statuses for the activity's votes." + ) + + +class v1GetNoncesRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + address: str = Field(description="The Ethereum address to query nonces for.") + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + ) + nonce: Optional[bool] = Field( + default=None, description="Whether to fetch the standard on-chain nonce." + ) + gasStationNonce: Optional[bool] = Field( + default=None, + description="Whether to fetch the gas station nonce used for sponsored transactions.", + ) + + +class v1GetNoncesResponse(TurnkeyBaseModel): + nonce: Optional[str] = Field( + default=None, + description="The standard on-chain nonce for the address, if requested.", + ) + gasStationNonce: Optional[str] = Field( + default=None, + description="The gas station nonce for sponsored transactions, if requested.", + ) + + +class v1GetOauth2CredentialRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + oauth2CredentialId: str = Field( + description="Unique identifier for a given OAuth 2.0 Credential." + ) + + +class v1GetOauth2CredentialResponse(TurnkeyBaseModel): + oauth2Credential: v1Oauth2Credential + + +class v1GetOauthProvidersRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + userId: Optional[str] = Field( + default=None, description="Unique identifier for a given user." + ) + + +class v1GetOauthProvidersResponse(TurnkeyBaseModel): + oauthProviders: List[v1OauthProvider] = Field( + description="A list of Oauth providers." + ) + + +class v1GetOnRampTransactionStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + transactionId: str = Field( + description="The unique identifier for the fiat on ramp transaction." + ) + refresh: Optional[bool] = Field( + default=None, + description="Optional flag to specify if the transaction status should be refreshed from the fiat on ramp provider. Default = false.", + ) + + +class v1GetOnRampTransactionStatusResponse(TurnkeyBaseModel): + transactionStatus: str = Field( + description="The status of the fiat on ramp transaction." + ) + + +class v1GetOrganizationConfigsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetOrganizationConfigsResponse(TurnkeyBaseModel): + configs: v1Config = Field( + description="Organization configs including quorum settings and organization features." + ) + + +class v1GetPoliciesRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetPoliciesResponse(TurnkeyBaseModel): + policies: List[v1Policy] = Field(description="A list of policies.") + + +class v1GetPolicyEvaluationsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + activityId: str = Field(description="Unique identifier for a given activity.") + + +class v1GetPolicyEvaluationsResponse(TurnkeyBaseModel): + policyEvaluations: List[externalactivityv1PolicyEvaluation] + + +class v1GetPolicyRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + policyId: str = Field(description="Unique identifier for a given policy.") + + +class v1GetPolicyResponse(TurnkeyBaseModel): + policy: v1Policy = Field( + description="Object that codifies rules defining the actions that are permissible within an organization." + ) + + +class v1GetPrivateKeyRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + privateKeyId: str = Field(description="Unique identifier for a given private key.") + + +class v1GetPrivateKeyResponse(TurnkeyBaseModel): + privateKey: v1PrivateKey = Field( + description="Cryptographic public/private key pair that can be used for cryptocurrency needs or more generalized encryption." + ) + + +class v1GetPrivateKeysRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetPrivateKeysResponse(TurnkeyBaseModel): + privateKeys: List[v1PrivateKey] = Field(description="A list of private keys.") + + +class v1GetSendTransactionStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + sendTransactionStatusId: str = Field( + description="The unique identifier of a send transaction request." + ) + + +class v1GetSendTransactionStatusResponse(TurnkeyBaseModel): + txStatus: str = Field(description="The current status of the send transaction.") + eth: Optional[v1EthSendTransactionStatus] = Field( + default=None, description="Ethereum-specific transaction status." + ) + solana: Optional[v1SolanaSendTransactionStatus] = Field( + default=None, description="Solana-specific transaction status." + ) + txError: Optional[str] = Field( + default=None, + description="The error encountered when broadcasting or confirming the transaction, if any.", + ) + error: Optional[v1TxError] = Field( + default=None, + description="Structured error information including revert details, if available.", + ) + + +class v1GetSessionProfileRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + sessionProfileId: str = Field( + description="Unique identifier for a session profile." + ) + + +class v1GetSessionProfileResponse(TurnkeyBaseModel): + sessionProfile: v1SessionProfile = Field( + description="Session profile for a user, including details about the user's authenticators, Oauth providers, API keys, and MFA policies." + ) + + +class v1GetSessionProfilesRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetSessionProfilesResponse(TurnkeyBaseModel): + sessionProfiles: List[v1SessionProfile] = Field( + description="A list of session profiles for users in the organization." + ) + + +class v1GetSmartContractInterfaceRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + smartContractInterfaceId: str = Field( + description="Unique identifier for a given smart contract interface." + ) + + +class v1GetSmartContractInterfaceResponse(TurnkeyBaseModel): + smartContractInterface: externaldatav1SmartContractInterface = Field( + description="Object to be used in conjunction with policies to guard transaction signing." + ) + + +class v1GetSmartContractInterfacesRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetSmartContractInterfacesResponse(TurnkeyBaseModel): + smartContractInterfaces: List[externaldatav1SmartContractInterface] = Field( + description="A list of smart contract interfaces." + ) + + +class v1GetSubOrgIdsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for the parent organization. This is used to find sub-organizations within it." + ) + filterType: Optional[str] = Field( + default=None, + description="Specifies the type of filter to apply, i.e 'CREDENTIAL_ID', 'NAME', 'USERNAME', 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN', 'WALLET_ACCOUNT_ADDRESS' or 'PUBLIC_KEY'", + ) + filterValue: Optional[str] = Field( + default=None, + description="The value of the filter to apply for the specified type. For example, a specific email or name string.", + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, description="Parameters used for cursor-based pagination." + ) + + +class v1GetSubOrgIdsResponse(TurnkeyBaseModel): + organizationIds: List[str] = Field( + description="List of unique identifiers for the matching sub-organizations." + ) + + +class v1GetSwapSponsorshipUsageRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given organization." + ) + + +class v1GetSwapSponsorshipUsageResponse(TurnkeyBaseModel): + feeSponsorship: v1SwapSponsorshipFeature + fixedRate: v1SwapSponsorshipFeature + + +class v1GetSwapStatusRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + swapRequestId: str = Field( + description="The swap_request_id returned by ExecuteSwap." + ) + + +class v1GetSwapStatusResponse(TurnkeyBaseModel): + status: str = Field( + description="Normalized swap status. One of PENDING, COMPLETED, FAILED." + ) + swapKind: str = Field(description="SAME_CHAIN or CROSS_CHAIN.") + provider: str = Field(description="Swap provider that executed the swap.") + inputToken: str = Field(description="CAIP-19 asset ID for the input asset.") + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + inputAmount: str = Field(description="Base-unit amount of the input asset.") + originTxHash: Optional[str] = Field( + default=None, + description="Final included origin-chain transaction hash, when known.", + ) + destinationTxHashes: Optional[List[str]] = Field( + default=None, + description="Provider-reported destination-chain transaction hashes; cross-chain COMPLETED only.", + ) + outputAmount: Optional[str] = Field( + default=None, + description="Actual base-unit output amount on COMPLETED, when known. Unset on FAILED.", + ) + refund: Optional[v1SwapRefund] = Field( + default=None, + description="Funds returned by the provider after a successful origin transfer and failed cross-chain fill. Omitted for origin transaction failures and same-chain swaps.", + ) + updatedAt: str = Field( + description="Timestamp of the last swap status change, as millisecond epoch string." + ) + error: Optional[v1SwapError] = Field( + default=None, + description="Normalized failure details, present whenever status is FAILED.", + ) + destinationAddress: Optional[str] = Field( + default=None, description="Address that receives the output asset." + ) + + +class v1GetTvcAppDeploymentsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + appId: str = Field(description="Unique identifier for a given TVC App.") + + +class v1GetTvcAppDeploymentsResponse(TurnkeyBaseModel): + tvcDeployments: List[v1TvcDeployment] = Field( + description="List of deployments for this TVC App" + ) + + +class v1GetTvcAppRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + tvcAppId: str = Field(description="Unique identifier for a given TVC App.") + + +class v1GetTvcAppResponse(TurnkeyBaseModel): + tvcApp: v1TvcApp = Field(description="Details about a single TVC App") + + +class v1GetTvcAppsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + isLive: Optional[bool] = Field( + default=None, + description="Filter TVC Apps by whether they have a live deployment. If omitted, all TVC Apps are returned.", + ) + + +class v1GetTvcAppsResponse(TurnkeyBaseModel): + tvcApps: List[v1TvcApp] = Field(description="A list of TVC Apps.") + + +class v1GetTvcDeploymentDebugLogsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + deploymentId: str = Field( + description="Unique identifier for a given TVC Deployment. The deployment must be running in debug mode." + ) + tailLines: Optional[int] = Field( + default=None, + description="Limit returned history to the last N lines per replica. If unset or zero, no tail-line limit is applied.", + ) + sinceSeconds: Optional[str] = Field( + default=None, + description="Return logs newer than this many seconds ago. If unset or zero, no since-time limit is applied. Useful for clients that poll to follow logs.", + ) + + +class v1GetTvcDeploymentDebugLogsResponse(TurnkeyBaseModel): + entries: List[v1TvcDeploymentDebugLogEntry] = Field( + description="Application log entries sorted by platform timestamp." + ) + + +class v1GetTvcDeploymentProvisioningDetailsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + deploymentId: str = Field( + description="Unique identifier for a given TVC Deployment." + ) + + +class v1GetTvcDeploymentProvisioningDetailsResponse(TurnkeyBaseModel): + attestationDocument: Optional[str] = Field( + default=None, + description="The attestation document of the provisioning enclave. Present only when a deployment is awaiting provisioning.", + ) + manifestEnvelope: Optional[str] = Field( + default=None, + description="The manifest envelope containing the TVC deployment's manifest and signatures. Present only when a deployment is awaiting provisioning.", + ) + provisioningState: v1ProvisioningState = Field( + description="Current provisioning state." + ) + + +class v1GetTvcDeploymentRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + deploymentId: str = Field( + description="Unique identifier for a given TVC Deployment." + ) + + +class v1GetTvcDeploymentResponse(TurnkeyBaseModel): + tvcDeployment: v1TvcDeployment = Field( + description="Details about a single TVC Deployment" + ) + + +class v1GetTvcOperatorsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetTvcOperatorsResponse(TurnkeyBaseModel): + tvcOperators: List[v1TvcOperator] + + +class v1GetTvcQosVersionsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetTvcQosVersionsResponse(TurnkeyBaseModel): + availableVersions: List[str] = Field( + description="QOS versions supported for new TVC deployments." + ) + latestVersion: str = Field( + description="Latest recommended QOS version for new TVC deployments." + ) + + +class v1GetTvcQuorumKeysRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetTvcQuorumKeysResponse(TurnkeyBaseModel): + tvcQuorumKeys: List[v1TvcQuorumKey] + + +class v1GetUserRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + userId: str = Field(description="Unique identifier for a given user.") + + +class v1GetUserResponse(TurnkeyBaseModel): + user: v1User = Field(description="Web and/or API user within your organization.") + + +class v1GetUsersRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetUsersResponse(TurnkeyBaseModel): + users: List[v1User] = Field(description="A list of users.") + + +class v1GetVerifiedSubOrgIdsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for the parent organization. This is used to find sub-organizations within it." + ) + filterType: Optional[str] = Field( + default=None, + description="Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN', 'OAUTH_CLAIM', or 'PUBLIC_KEY'", + ) + filterValue: Optional[str] = Field( + default=None, + description="The value of the filter to apply for the specified type. For example, a specific email or phone number string.", + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, description="Parameters used for cursor-based pagination." + ) + + +class v1GetVerifiedSubOrgIdsResponse(TurnkeyBaseModel): + organizationIds: List[str] = Field( + description="List of unique identifiers for the matching sub-organizations." + ) + + +class v1GetWalletAccountRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + walletId: str = Field(description="Unique identifier for a given wallet.") + address: Optional[str] = Field( + default=None, description="Address corresponding to a wallet account." + ) + path: Optional[str] = Field( + default=None, description="Path corresponding to a wallet account." + ) + + +class v1GetWalletAccountResponse(TurnkeyBaseModel): + account: v1WalletAccount = Field(description="The resulting wallet account.") + + +class v1GetWalletAccountsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + walletId: Optional[str] = Field( + default=None, + description="Unique identifier for a given wallet. If not provided, all accounts for the organization will be returned.", + ) + includeWalletDetails: Optional[bool] = Field( + default=None, + description="Optional flag to specify if the wallet details should be included in the response. Default = false.", + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, description="Parameters used for cursor-based pagination." + ) + + +class v1GetWalletAccountsResponse(TurnkeyBaseModel): + accounts: List[v1WalletAccount] = Field( + description="A list of accounts generated from a wallet that share a common seed." + ) + + +class v1GetWalletAddressBalancesRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + address: str = Field( + description="Address corresponding to a wallet account. Private key addresses are not supported." + ) + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." + ) + + +class v1GetWalletAddressBalancesResponse(TurnkeyBaseModel): + balances: Optional[List[v1AssetBalance]] = Field( + default=None, description="List of asset balances" + ) + + +class v1GetWalletRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + walletId: str = Field(description="Unique identifier for a given wallet.") + + +class v1GetWalletResponse(TurnkeyBaseModel): + wallet: v1Wallet = Field( + description="A collection of deterministically generated cryptographic public / private key pairs that share a common seed." + ) + + +class v1GetWalletsRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + + +class v1GetWalletsResponse(TurnkeyBaseModel): + wallets: List[v1Wallet] = Field(description="A list of wallets.") + + +class v1GetWhoamiRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given organization. If the request is being made by a WebAuthN user and their sub-organization ID is unknown, this can be the parent organization ID; using the sub-organization ID when possible is preferred due to performance reasons." + ) + + +class v1GetWhoamiResponse(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + organizationName: str = Field( + description="Human-readable name for an organization." + ) + userId: str = Field(description="Unique identifier for a given user.") + username: str = Field(description="Human-readable name for a user.") + + +class v1HashFunction(str, Enum): + HASH_FUNCTION_NO_OP = "HASH_FUNCTION_NO_OP" + HASH_FUNCTION_SHA256 = "HASH_FUNCTION_SHA256" + HASH_FUNCTION_KECCAK256 = "HASH_FUNCTION_KECCAK256" + HASH_FUNCTION_NOT_APPLICABLE = "HASH_FUNCTION_NOT_APPLICABLE" + + +class v1ImportPrivateKeyIntent(TurnkeyBaseModel): + userId: str = Field(description="The ID of the User importing a Private Key.") + privateKeyName: str = Field(description="Human-readable name for a Private Key.") + encryptedBundle: str = Field( + description="Bundle containing a raw private key encrypted to the enclave's target public key." + ) + curve: v1Curve = Field( + description="Cryptographic Curve used to generate a given Private Key." + ) + addressFormats: List[v1AddressFormat] = Field( + description="Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." + ) + + +class v1ImportPrivateKeyRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ImportPrivateKeyIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ImportPrivateKeyResult(TurnkeyBaseModel): + privateKeyId: str = Field(description="Unique identifier for a Private Key.") + addresses: List[immutableactivityv1Address] = Field( + description="A list of addresses." + ) + + +class v1ImportSecretParams(TurnkeyBaseModel): + name: Optional[str] = Field( + default=None, + description="Optional human-readable name for the secret. Names must be unique within an organization when provided.", + ) + secretPayload: str = Field( + description="Encryption suite specific payload containing the secret ciphertext. For enclave encrypt v1 this is a JSON-encoded ClientSendMsg." + ) + targetPublicKey: str = Field( + description="Targeted transport encryption public key, as returned by InitImportSecrets." + ) + encryptionSuite: v1TransportEncryptionSuite = Field( + description="Transport encryption suite used for the ingress secret." + ) + staticProperties: Optional[List[v1KeyValue]] = Field( + default=None, + description="Policy-visible, static properties to permanently bind to the secret.", + ) + + +class v1ImportSecretsIntent(TurnkeyBaseModel): + secrets: List[v1ImportSecretParams] = Field( + description="A list of secrets to import." + ) + + +class v1ImportSecretsRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ImportSecretsIntent + + +class v1ImportSecretsResult(TurnkeyBaseModel): + secretIds: List[str] = Field( + description="Unique identifier for each imported secret, in the order the params were specified." + ) + + +class v1ImportWalletIntent(TurnkeyBaseModel): + userId: str = Field(description="The ID of the User importing a Wallet.") + walletName: str = Field(description="Human-readable name for a Wallet.") + encryptedBundle: str = Field( + description="Bundle containing a wallet mnemonic encrypted to the enclave's target public key." + ) + accounts: List[v1WalletAccountParams] = Field( + description="A list of wallet Accounts." + ) + + +class v1ImportWalletRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1ImportWalletIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ImportWalletResult(TurnkeyBaseModel): + walletId: str = Field(description="Unique identifier for a Wallet.") + addresses: List[str] = Field(description="A list of account addresses.") + + +class v1InitFiatOnRampIntent(TurnkeyBaseModel): + onrampProvider: v1FiatOnRampProvider = Field( + description="Enum to specify which on-ramp provider to use" + ) + walletAddress: str = Field( + description="Destination wallet address for the buy transaction." + ) + network: v1FiatOnRampBlockchainNetwork = Field( + description="Blockchain network to be used for the transaction, e.g., bitcoin, ethereum. Maps to MoonPay's network or Coinbase's defaultNetwork." + ) + cryptoCurrencyCode: v1FiatOnRampCryptoCurrency = Field( + description="Code for the cryptocurrency to be purchased, e.g., btc, eth. Maps to MoonPay's currencyCode or Coinbase's defaultAsset." + ) + fiatCurrencyCode: Optional[v1FiatOnRampCurrency] = Field( + default=None, + description="Code for the fiat currency to be used in the transaction, e.g., USD, EUR.", + ) + fiatCurrencyAmount: Optional[str] = Field( + default=None, + description="Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount.", + ) + paymentMethod: Optional[v1FiatOnRampPaymentMethod] = Field( + default=None, + description="Pre-selected payment method, e.g., CREDIT_DEBIT_CARD, APPLE_PAY. Validated against the chosen provider.", + ) + countryCode: Optional[str] = Field( + default=None, + description="ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB.", + ) + countrySubdivisionCode: Optional[str] = Field( + default=None, + description="ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country_code=US.", + ) + sandboxMode: Optional[bool] = Field( + default=None, + description="Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false.", + ) + urlForSignature: Optional[str] = Field( + default=None, + description="Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled.", + ) + + +class v1InitFiatOnRampRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1InitFiatOnRampIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1InitFiatOnRampResult(TurnkeyBaseModel): + onRampUrl: str = Field(description="Unique URL for a given fiat on-ramp flow.") + onRampTransactionId: str = Field( + description="Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow." + ) + onRampUrlSignature: Optional[str] = Field( + default=None, + description="Optional signature of the MoonPay Widget URL. The signature is generated if the Init Fiat On Ramp intent includes the urlForSignature field. The signature can be used to initialize the MoonPay SDKs when URL signing is enabled for your project.", + ) + + +class v1InitImportPrivateKeyIntent(TurnkeyBaseModel): + userId: str = Field(description="The ID of the User importing a Private Key.") + + +class v1InitImportPrivateKeyRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1InitImportPrivateKeyIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1InitImportPrivateKeyResult(TurnkeyBaseModel): + importBundle: str = Field( + description="Import bundle containing a public key and signature to use for importing client data." + ) + + +class v1InitImportSecretsIntent(TurnkeyBaseModel): + encryptionSuite: v1TransportEncryptionSuite = Field( + description="Transport encryption suite used for ingress secrets." + ) + numSecrets: int = Field( + description="The number of secrets the user intends to import." + ) + + +class v1InitImportSecretsRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1InitImportSecretsIntent + + +class v1InitImportSecretsResult(TurnkeyBaseModel): + enclaveTargetMessages: List[str] = Field( + description="Enclave ingress target keys along with metadata specific to the encryption suite. For enclave encrypt v1 this will be ServerTargetMsgV1." + ) + + +class v1InitImportWalletIntent(TurnkeyBaseModel): + userId: str = Field(description="The ID of the User importing a Wallet.") + + +class v1InitImportWalletRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1InitImportWalletIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1InitImportWalletResult(TurnkeyBaseModel): + importBundle: str = Field( + description="Import bundle containing a public key and signature to use for importing client data." + ) + + +class v1InitOtpAuthIntent(TurnkeyBaseModel): + otpType: str = Field( + description="Enum to specify whether to send OTP via SMS, email, or WhatsApp" + ) + contact: str = Field(description="Email or phone number to send the OTP code to") + emailCustomization: Optional[v1EmailCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", + ) + smsCustomization: Optional[v1SmsCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing SMS message. If not provided, the default sms message will be used.", + ) + userIdentifier: Optional[str] = Field( + default=None, + description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + ) + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the OTP email", + ) + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" + ) + + +class v1InitOtpAuthIntentV2(TurnkeyBaseModel): + otpType: str = Field( + description="Enum to specify whether to send OTP via SMS, email, or WhatsApp" + ) + contact: str = Field(description="Email or phone number to send the OTP code to") + otpLength: Optional[int] = Field( + default=None, description="Optional length of the OTP code. Default = 9" + ) + emailCustomization: Optional[v1EmailCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", + ) + smsCustomization: Optional[v1SmsCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing SMS message. If not provided, the default SMS message will be used.", + ) + userIdentifier: Optional[str] = Field( + default=None, + description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + ) + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the OTP email", + ) + alphanumeric: Optional[bool] = Field( + default=None, + description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true", + ) + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" + ) + + +class v1InitOtpAuthIntentV3(TurnkeyBaseModel): + otpType: str = Field( + description="Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" + ) + contact: str = Field(description="Email or phone number to send the OTP code to") + otpLength: Optional[int] = Field( + default=None, description="Optional length of the OTP code. Default = 9" + ) + appName: str = Field( + description="The name of the application. This field is required and will be used in email notifications if an email template is not provided." + ) + emailCustomization: Optional[v1EmailCustomizationParamsV2] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", + ) + smsCustomization: Optional[v1SmsCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing SMS message. If not provided, the default SMS message will be used.", + ) + userIdentifier: Optional[str] = Field( + default=None, + description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + ) + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the OTP email", + ) + alphanumeric: Optional[bool] = Field( + default=None, + description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true", + ) + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" + ) + + +class v1InitOtpAuthRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1InitOtpAuthIntentV3 + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1InitOtpAuthResult(TurnkeyBaseModel): + otpId: str = Field(description="Unique identifier for an OTP authentication") + + +class v1InitOtpAuthResultV2(TurnkeyBaseModel): + otpId: str = Field(description="Unique identifier for an OTP authentication") + + +class v1InitOtpIntent(TurnkeyBaseModel): + otpType: str = Field( + description="Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" + ) + contact: str = Field(description="Email or phone number to send the OTP code to") + otpLength: Optional[int] = Field( + default=None, description="Optional length of the OTP code. Default = 9" + ) + emailCustomization: Optional[v1EmailCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", + ) + smsCustomization: Optional[v1SmsCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing SMS message. If not provided, the default sms message will be used.", + ) + userIdentifier: Optional[str] = Field( + default=None, + description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + ) + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the OTP email", + ) + alphanumeric: Optional[bool] = Field( + default=None, + description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true", + ) + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" + ) + + +class v1InitOtpIntentV2(TurnkeyBaseModel): + otpType: str = Field( + description="Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" + ) + contact: str = Field(description="Email or phone number to send the OTP code to") + otpLength: Optional[int] = Field( + default=None, description="Optional length of the OTP code. Default = 9" + ) + appName: str = Field( + description="The name of the application. This field is required and will be used in email notifications if an email template is not provided." + ) + emailCustomization: Optional[v1EmailCustomizationParamsV2] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", + ) + smsCustomization: Optional[v1SmsCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing SMS message. If not provided, the default SMS message will be used.", + ) + userIdentifier: Optional[str] = Field( + default=None, + description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + ) + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the OTP email", + ) + alphanumeric: Optional[bool] = Field( + default=None, + description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true", + ) + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" + ) + + +class v1InitOtpIntentV3(TurnkeyBaseModel): + otpType: str = Field( + description="Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" + ) + contact: str = Field(description="Email or phone number to send the OTP code to") + appName: str = Field(description="The name of the application.") + otpLength: Optional[int] = Field( + default=None, description="Optional length of the OTP code. Default = 9" + ) + emailCustomization: Optional[v1EmailCustomizationParamsV2] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", + ) + smsCustomization: Optional[v1SmsCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing SMS message. If not provided, the default sms message will be used.", + ) + userIdentifier: Optional[str] = Field( + default=None, + description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + ) + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the OTP email", + ) + alphanumeric: Optional[bool] = Field( + default=None, + description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). If set to false, OTP code will only be numeric. Default = true", + ) + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" + ) + + +class v1InitOtpRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1InitOtpIntentV3 + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1InitOtpResult(TurnkeyBaseModel): + otpId: str = Field(description="Unique identifier for an OTP authentication") + + +class v1InitOtpResultV2(TurnkeyBaseModel): + otpId: str = Field(description="Unique identifier for an OTP flow") + otpEncryptionTargetBundle: str = Field( + description="Signed bundle containing a target encryption key to use when submitting OTP codes." + ) + + +class v1InitUserEmailRecoveryIntent(TurnkeyBaseModel): + email: str = Field(description="Email of the user starting recovery") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the recovery bundle will be encrypted." + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used.", + ) + emailCustomization: Optional[v1EmailCustomizationParams] = Field( + default=None, + description="Optional parameters for customizing emails. If not provided, the default email will be used.", + ) + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the OTP email", + ) + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" + ) + + +class v1InitUserEmailRecoveryIntentV2(TurnkeyBaseModel): + email: str = Field(description="Email of the user starting recovery") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the recovery bundle will be encrypted." + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used.", + ) + emailCustomization: v1EmailAuthCustomizationParams = Field( + description="Parameters for customizing emails. If not provided, the default email will be used. Note that `app_name` is required." + ) + sendFromEmailAddress: Optional[str] = Field( + default=None, + description="Optional custom email address from which to send the OTP email", + ) + sendFromEmailSenderName: Optional[str] = Field( + default=None, + description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + ) + replyToEmailAddress: Optional[str] = Field( + default=None, description="Optional custom email address to use as reply-to" + ) + + +class v1InitUserEmailRecoveryRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1InitUserEmailRecoveryIntentV2 + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1InitUserEmailRecoveryResult(TurnkeyBaseModel): + userId: str = Field(description="Unique identifier for the user being recovered.") + + +class v1Intent(TurnkeyBaseModel): + createOrganizationIntent: Optional[v1CreateOrganizationIntent] = Field(default=None) + createAuthenticatorsIntent: Optional[v1CreateAuthenticatorsIntent] = Field( + default=None + ) + createUsersIntent: Optional[v1CreateUsersIntent] = Field(default=None) + createPrivateKeysIntent: Optional[v1CreatePrivateKeysIntent] = Field(default=None) + signRawPayloadIntent: Optional[v1SignRawPayloadIntent] = Field(default=None) + createInvitationsIntent: Optional[v1CreateInvitationsIntent] = Field(default=None) + acceptInvitationIntent: Optional[v1AcceptInvitationIntent] = Field(default=None) + createPolicyIntent: Optional[v1CreatePolicyIntent] = Field(default=None) + disablePrivateKeyIntent: Optional[v1DisablePrivateKeyIntent] = Field(default=None) + deleteUsersIntent: Optional[v1DeleteUsersIntent] = Field(default=None) + deleteAuthenticatorsIntent: Optional[v1DeleteAuthenticatorsIntent] = Field( + default=None + ) + deleteInvitationIntent: Optional[v1DeleteInvitationIntent] = Field(default=None) + deleteOrganizationIntent: Optional[v1DeleteOrganizationIntent] = Field(default=None) + deletePolicyIntent: Optional[v1DeletePolicyIntent] = Field(default=None) + createUserTagIntent: Optional[v1CreateUserTagIntent] = Field(default=None) + deleteUserTagsIntent: Optional[v1DeleteUserTagsIntent] = Field(default=None) + signTransactionIntent: Optional[v1SignTransactionIntent] = Field(default=None) + createApiKeysIntent: Optional[v1CreateApiKeysIntent] = Field(default=None) + deleteApiKeysIntent: Optional[v1DeleteApiKeysIntent] = Field(default=None) + approveActivityIntent: Optional[v1ApproveActivityIntent] = Field(default=None) + rejectActivityIntent: Optional[v1RejectActivityIntent] = Field(default=None) + createPrivateKeyTagIntent: Optional[v1CreatePrivateKeyTagIntent] = Field( + default=None + ) + deletePrivateKeyTagsIntent: Optional[v1DeletePrivateKeyTagsIntent] = Field( + default=None + ) + createPolicyIntentV2: Optional[v1CreatePolicyIntentV2] = Field(default=None) + setPaymentMethodIntent: Optional[billingSetPaymentMethodIntent] = Field( + default=None + ) + activateBillingTierIntent: Optional[billingActivateBillingTierIntent] = Field( + default=None + ) + deletePaymentMethodIntent: Optional[billingDeletePaymentMethodIntent] = Field( + default=None + ) + createPolicyIntentV3: Optional[v1CreatePolicyIntentV3] = Field(default=None) + createApiOnlyUsersIntent: Optional[v1CreateApiOnlyUsersIntent] = Field(default=None) + updateRootQuorumIntent: Optional[v1UpdateRootQuorumIntent] = Field(default=None) + updateUserTagIntent: Optional[v1UpdateUserTagIntent] = Field(default=None) + updatePrivateKeyTagIntent: Optional[v1UpdatePrivateKeyTagIntent] = Field( + default=None + ) + createAuthenticatorsIntentV2: Optional[v1CreateAuthenticatorsIntentV2] = Field( + default=None + ) + acceptInvitationIntentV2: Optional[v1AcceptInvitationIntentV2] = Field(default=None) + createOrganizationIntentV2: Optional[v1CreateOrganizationIntentV2] = Field( + default=None + ) + createUsersIntentV2: Optional[v1CreateUsersIntentV2] = Field(default=None) + createSubOrganizationIntent: Optional[v1CreateSubOrganizationIntent] = Field( + default=None + ) + createSubOrganizationIntentV2: Optional[v1CreateSubOrganizationIntentV2] = Field( + default=None + ) + updateAllowedOriginsIntent: Optional[v1UpdateAllowedOriginsIntent] = Field( + default=None + ) + createPrivateKeysIntentV2: Optional[v1CreatePrivateKeysIntentV2] = Field( + default=None + ) + updateUserIntent: Optional[v1UpdateUserIntent] = Field(default=None) + updatePolicyIntent: Optional[v1UpdatePolicyIntent] = Field(default=None) + setPaymentMethodIntentV2: Optional[billingSetPaymentMethodIntentV2] = Field( + default=None + ) + createSubOrganizationIntentV3: Optional[v1CreateSubOrganizationIntentV3] = Field( + default=None + ) + createWalletIntent: Optional[v1CreateWalletIntent] = Field(default=None) + createWalletAccountsIntent: Optional[v1CreateWalletAccountsIntent] = Field( + default=None + ) + initUserEmailRecoveryIntent: Optional[v1InitUserEmailRecoveryIntent] = Field( + default=None + ) + recoverUserIntent: Optional[v1RecoverUserIntent] = Field(default=None) + setOrganizationFeatureIntent: Optional[v1SetOrganizationFeatureIntent] = Field( + default=None + ) + removeOrganizationFeatureIntent: Optional[v1RemoveOrganizationFeatureIntent] = ( + Field(default=None) + ) + signRawPayloadIntentV2: Optional[v1SignRawPayloadIntentV2] = Field(default=None) + signTransactionIntentV2: Optional[v1SignTransactionIntentV2] = Field(default=None) + exportPrivateKeyIntent: Optional[v1ExportPrivateKeyIntent] = Field(default=None) + exportWalletIntent: Optional[v1ExportWalletIntent] = Field(default=None) + createSubOrganizationIntentV4: Optional[v1CreateSubOrganizationIntentV4] = Field( + default=None + ) + emailAuthIntent: Optional[v1EmailAuthIntent] = Field(default=None) + exportWalletAccountIntent: Optional[v1ExportWalletAccountIntent] = Field( + default=None + ) + initImportWalletIntent: Optional[v1InitImportWalletIntent] = Field(default=None) + importWalletIntent: Optional[v1ImportWalletIntent] = Field(default=None) + initImportPrivateKeyIntent: Optional[v1InitImportPrivateKeyIntent] = Field( + default=None + ) + importPrivateKeyIntent: Optional[v1ImportPrivateKeyIntent] = Field(default=None) + createPoliciesIntent: Optional[v1CreatePoliciesIntent] = Field(default=None) + signRawPayloadsIntent: Optional[v1SignRawPayloadsIntent] = Field(default=None) + createReadOnlySessionIntent: Optional[v1CreateReadOnlySessionIntent] = Field( + default=None + ) + createOauthProvidersIntent: Optional[v1CreateOauthProvidersIntent] = Field( + default=None + ) + deleteOauthProvidersIntent: Optional[v1DeleteOauthProvidersIntent] = Field( + default=None + ) + createSubOrganizationIntentV5: Optional[v1CreateSubOrganizationIntentV5] = Field( + default=None + ) + oauthIntent: Optional[v1OauthIntent] = Field(default=None) + createApiKeysIntentV2: Optional[v1CreateApiKeysIntentV2] = Field(default=None) + createReadWriteSessionIntent: Optional[v1CreateReadWriteSessionIntent] = Field( + default=None + ) + emailAuthIntentV2: Optional[v1EmailAuthIntentV2] = Field(default=None) + createSubOrganizationIntentV6: Optional[v1CreateSubOrganizationIntentV6] = Field( + default=None + ) + deletePrivateKeysIntent: Optional[v1DeletePrivateKeysIntent] = Field(default=None) + deleteWalletsIntent: Optional[v1DeleteWalletsIntent] = Field(default=None) + createReadWriteSessionIntentV2: Optional[v1CreateReadWriteSessionIntentV2] = Field( + default=None + ) + deleteSubOrganizationIntent: Optional[v1DeleteSubOrganizationIntent] = Field( + default=None + ) + initOtpAuthIntent: Optional[v1InitOtpAuthIntent] = Field(default=None) + otpAuthIntent: Optional[v1OtpAuthIntent] = Field(default=None) + createSubOrganizationIntentV7: Optional[v1CreateSubOrganizationIntentV7] = Field( + default=None + ) + updateWalletIntent: Optional[v1UpdateWalletIntent] = Field(default=None) + updatePolicyIntentV2: Optional[v1UpdatePolicyIntentV2] = Field(default=None) + createUsersIntentV3: Optional[v1CreateUsersIntentV3] = Field(default=None) + initOtpAuthIntentV2: Optional[v1InitOtpAuthIntentV2] = Field(default=None) + initOtpIntent: Optional[v1InitOtpIntent] = Field(default=None) + verifyOtpIntent: Optional[v1VerifyOtpIntent] = Field(default=None) + otpLoginIntent: Optional[v1OtpLoginIntent] = Field(default=None) + stampLoginIntent: Optional[v1StampLoginIntent] = Field(default=None) + oauthLoginIntent: Optional[v1OauthLoginIntent] = Field(default=None) + updateUserNameIntent: Optional[v1UpdateUserNameIntent] = Field(default=None) + updateUserEmailIntent: Optional[v1UpdateUserEmailIntent] = Field(default=None) + updateUserPhoneNumberIntent: Optional[v1UpdateUserPhoneNumberIntent] = Field( + default=None + ) + initFiatOnRampIntent: Optional[v1InitFiatOnRampIntent] = Field(default=None) + createSmartContractInterfaceIntent: Optional[ + v1CreateSmartContractInterfaceIntent + ] = Field(default=None) + deleteSmartContractInterfaceIntent: Optional[ + v1DeleteSmartContractInterfaceIntent + ] = Field(default=None) + enableAuthProxyIntent: Optional[v1EnableAuthProxyIntent] = Field(default=None) + disableAuthProxyIntent: Optional[v1DisableAuthProxyIntent] = Field(default=None) + updateAuthProxyConfigIntent: Optional[v1UpdateAuthProxyConfigIntent] = Field( + default=None + ) + createOauth2CredentialIntent: Optional[v1CreateOauth2CredentialIntent] = Field( + default=None + ) + updateOauth2CredentialIntent: Optional[v1UpdateOauth2CredentialIntent] = Field( + default=None + ) + deleteOauth2CredentialIntent: Optional[v1DeleteOauth2CredentialIntent] = Field( + default=None + ) + oauth2AuthenticateIntent: Optional[v1Oauth2AuthenticateIntent] = Field(default=None) + deleteWalletAccountsIntent: Optional[v1DeleteWalletAccountsIntent] = Field( + default=None + ) + deletePoliciesIntent: Optional[v1DeletePoliciesIntent] = Field(default=None) + ethSendRawTransactionIntent: Optional[v1EthSendRawTransactionIntent] = Field( + default=None + ) + ethSendTransactionIntent: Optional[v1EthSendTransactionIntent] = Field(default=None) + createFiatOnRampCredentialIntent: Optional[v1CreateFiatOnRampCredentialIntent] = ( + Field(default=None) + ) + updateFiatOnRampCredentialIntent: Optional[v1UpdateFiatOnRampCredentialIntent] = ( + Field(default=None) + ) + deleteFiatOnRampCredentialIntent: Optional[v1DeleteFiatOnRampCredentialIntent] = ( + Field(default=None) + ) + emailAuthIntentV3: Optional[v1EmailAuthIntentV3] = Field(default=None) + initUserEmailRecoveryIntentV2: Optional[v1InitUserEmailRecoveryIntentV2] = Field( + default=None + ) + initOtpIntentV2: Optional[v1InitOtpIntentV2] = Field(default=None) + initOtpAuthIntentV3: Optional[v1InitOtpAuthIntentV3] = Field(default=None) + upsertGasUsageConfigIntent: Optional[v1UpsertGasUsageConfigIntent] = Field( + default=None + ) + createTvcAppIntent: Optional[v1CreateTvcAppIntent] = Field(default=None) + createTvcDeploymentIntent: Optional[v1CreateTvcDeploymentIntent] = Field( + default=None + ) + createTvcManifestApprovalsIntent: Optional[v1CreateTvcManifestApprovalsIntent] = ( + Field(default=None) + ) + solSendTransactionIntent: Optional[v1SolSendTransactionIntent] = Field(default=None) + initOtpIntentV3: Optional[v1InitOtpIntentV3] = Field(default=None) + verifyOtpIntentV2: Optional[v1VerifyOtpIntentV2] = Field(default=None) + otpLoginIntentV2: Optional[v1OtpLoginIntentV2] = Field(default=None) + updateOrganizationNameIntent: Optional[v1UpdateOrganizationNameIntent] = Field( + default=None + ) + createSubOrganizationIntentV8: Optional[v1CreateSubOrganizationIntentV8] = Field( + default=None + ) + createOauthProvidersIntentV2: Optional[v1CreateOauthProvidersIntentV2] = Field( + default=None + ) + createUsersIntentV4: Optional[v1CreateUsersIntentV4] = Field(default=None) + createWebhookEndpointIntent: Optional[v1CreateWebhookEndpointIntent] = Field( + default=None + ) + updateWebhookEndpointIntent: Optional[v1UpdateWebhookEndpointIntent] = Field( + default=None + ) + deleteWebhookEndpointIntent: Optional[v1DeleteWebhookEndpointIntent] = Field( + default=None + ) + setIpAllowlistIntent: Optional[v1SetIpAllowlistIntent] = Field(default=None) + removeIpAllowlistIntent: Optional[v1RemoveIpAllowlistIntent] = Field(default=None) + updateTvcAppLiveDeploymentIntent: Optional[v1UpdateTvcAppLiveDeploymentIntent] = ( + Field(default=None) + ) + deleteTvcDeploymentIntent: Optional[v1DeleteTvcDeploymentIntent] = Field( + default=None + ) + deleteTvcAppAndDeploymentsIntent: Optional[v1DeleteTvcAppAndDeploymentsIntent] = ( + Field(default=None) + ) + restoreTvcDeploymentIntent: Optional[v1RestoreTvcDeploymentIntent] = Field( + default=None + ) + sparkSignFrostIntent: Optional[v1SparkSignFrostIntent] = Field(default=None) + sparkPrepareTransferIntent: Optional[v1SparkPrepareTransferIntent] = Field( + default=None + ) + sparkClaimTransferIntent: Optional[v1SparkClaimTransferIntent] = Field(default=None) + sparkPrepareLightningReceiveIntent: Optional[ + v1SparkPrepareLightningReceiveIntent + ] = Field(default=None) + postTvcQuorumKeyShareIntent: Optional[v1PostTvcQuorumKeyShareIntent] = Field( + default=None + ) + ethSendTransactionIntentV2: Optional[v1EthSendTransactionIntentV2] = Field( + default=None + ) + createMfaPolicyIntent: Optional[v1CreateMfaPolicyIntent] = Field(default=None) + updateMfaPolicyIntent: Optional[v1UpdateMfaPolicyIntent] = Field(default=None) + deleteMfaPolicyIntent: Optional[v1DeleteMfaPolicyIntent] = Field(default=None) + createSessionProfileIntent: Optional[v1CreateSessionProfileIntent] = Field( + default=None + ) + earnDeployWrapperIntent: Optional[v1EarnDeployWrapperIntent] = Field(default=None) + earnDepositIntent: Optional[v1EarnDepositIntent] = Field(default=None) + earnWithdrawIntent: Optional[v1EarnWithdrawIntent] = Field(default=None) + executeSwapIntent: Optional[v1ExecuteSwapIntent] = Field(default=None) + upsertSwapConfigIntent: Optional[v1UpsertSwapConfigIntent] = Field(default=None) + createTvcOperatorIntent: Optional[v1CreateTvcOperatorIntent] = Field(default=None) + createTvcQuorumKeyIntent: Optional[v1CreateTvcQuorumKeyIntent] = Field(default=None) + reEncryptTvcQuorumKeyShareIntent: Optional[v1ReEncryptTvcQuorumKeyShareIntent] = ( + Field(default=None) + ) + initImportSecretsIntent: Optional[v1InitImportSecretsIntent] = Field(default=None) + solSendTransactionIntentV2: Optional[v1SolSendTransactionIntentV2] = Field( + default=None + ) + claimSwapFeesIntent: Optional[v1ClaimSwapFeesIntent] = Field(default=None) + earnSetWrapperStateIntent: Optional[v1EarnSetWrapperStateIntent] = Field( + default=None + ) + claimEarnFeesIntent: Optional[v1ClaimEarnFeesIntent] = Field(default=None) + updateWalletAccountNameIntent: Optional[v1UpdateWalletAccountNameIntent] = Field( + default=None + ) + ethUndelegate7702Intent: Optional[v1EthUndelegate7702Intent] = Field(default=None) + executeSwapIntentV2: Optional[v1ExecuteSwapIntentV2] = Field(default=None) + createSwapQuoteIntent: Optional[v1CreateSwapQuoteIntent] = Field(default=None) + importSecretsIntent: Optional[v1ImportSecretsIntent] = Field(default=None) + exportSecretsIntent: Optional[v1ExportSecretsIntent] = Field(default=None) + createVelocityControlIntent: Optional[v1CreateVelocityControlIntent] = Field( + default=None + ) + deleteVelocityControlsIntent: Optional[v1DeleteVelocityControlsIntent] = Field( + default=None + ) + updatePaymentMethodIntent: Optional[billingUpdatePaymentMethodIntent] = Field( + default=None + ) + createSwapQuoteIntentV2: Optional[v1CreateSwapQuoteIntentV2] = Field(default=None) + executeSwapIntentV3: Optional[v1ExecuteSwapIntentV3] = Field(default=None) + deleteSecretsIntent: Optional[v1DeleteSecretsIntent] = Field(default=None) + earnClaimRewardsIntent: Optional[v1EarnClaimRewardsIntent] = Field(default=None) + createSwapQuoteIntentV3: Optional[v1CreateSwapQuoteIntentV3] = Field(default=None) + upsertSwapFeeSponsorshipLimitConfigIntent: Optional[ + v1UpsertSwapFeeSponsorshipLimitConfigIntent + ] = Field(default=None) + upsertSwapFixedRateLimitConfigIntent: Optional[ + v1UpsertSwapFixedRateLimitConfigIntent + ] = Field(default=None) + createFiatOnRampSessionIntent: Optional[v1CreateFiatOnRampSessionIntent] = Field( + default=None ) -class v1GetOauth2CredentialRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given Organization." +class v1InvitationParams(TurnkeyBaseModel): + receiverUserName: str = Field( + description="The name of the intended Invitation recipient." ) - oauth2CredentialId: str = Field( - description="Unique identifier for a given OAuth 2.0 Credential." + receiverUserEmail: str = Field( + description="The email address of the intended Invitation recipient." ) - - -class v1GetOauth2CredentialResponse(TurnkeyBaseModel): - oauth2Credential: v1Oauth2Credential - - -class v1GetOauthProvidersRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." + receiverUserTags: List[str] = Field( + description="A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body." ) - userId: Optional[str] = Field( - default=None, description="Unique identifier for a given user." + accessType: v1AccessType = Field( + description="The User's permissible access method(s)." ) - - -class v1GetOauthProvidersResponse(TurnkeyBaseModel): - oauthProviders: List[v1OauthProvider] = Field( - description="A list of Oauth providers." + senderUserId: str = Field( + description="Unique identifier for the Sender of an Invitation." ) -class v1GetOnRampTransactionStatusRequest(TurnkeyBaseModel): +class v1IpAllowlist(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for the organization this allowlist belongs to." ) - transactionId: str = Field( - description="The unique identifier for the fiat on ramp transaction." + rules: List[v1IpAllowlistRule] = Field( + description="List of IP allowlist rules with their metadata." ) - refresh: Optional[bool] = Field( + publicKey: Optional[str] = Field( default=None, - description="Optional flag to specify if the transaction status should be refreshed from the fiat on ramp provider. Default = false.", + description="Public key of the API key this allowlist applies to. Null means the allowlist applies to the entire organization.", ) - - -class v1GetOnRampTransactionStatusResponse(TurnkeyBaseModel): - transactionStatus: str = Field( - description="The status of the fiat on ramp transaction." + enabled: Optional[bool] = Field( + default=None, + description="Whether the IP allowlist is enabled. Only present for organization-level allowlists. Null for API key-level allowlists (presence of the allowlist implies enablement).", ) - - -class v1GetOrganizationConfigsRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." + onEvaluationError: Optional[str] = Field( + default=None, + description="Behavior when an error occurs during IP allowlist evaluation. Valid values: ALLOW, DENY. Defaults to DENY.", ) -class v1GetOrganizationConfigsResponse(TurnkeyBaseModel): - configs: v1Config = Field( - description="Organization configs including quorum settings and organization features." +class v1IpAllowlistIntentRule(TurnkeyBaseModel): + cidr: str = Field( + description="CIDR block (e.g., '192.168.1.0/24', '2001:db8::/32')." ) - - -class v1GetPoliciesRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." + label: Optional[str] = Field( + default=None, + description="Optional human-readable label for this rule (e.g., 'Office VPN').", ) -class v1GetPoliciesResponse(TurnkeyBaseModel): - policies: List[v1Policy] = Field(description="A list of policies.") - - -class v1GetPolicyEvaluationsRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." +class v1IpAllowlistRule(TurnkeyBaseModel): + cidr: str = Field(description="CIDR block (e.g., '192.168.1.0/24').") + label: Optional[str] = Field( + default=None, description="Optional human-readable label for this rule." + ) + createdAt: Optional[str] = Field( + default=None, description="Creation timestamp as millisecond epoch string." ) - activityId: str = Field(description="Unique identifier for a given activity.") -class v1GetPolicyEvaluationsResponse(TurnkeyBaseModel): - policyEvaluations: List[externalactivityv1PolicyEvaluation] +class v1KeyValue(TurnkeyBaseModel): + key: Optional[str] = Field(default=None) + value: Optional[str] = Field(default=None) -class v1GetPolicyRequest(TurnkeyBaseModel): +class v1ListEarnEnabledVaultsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." + ) + provider: Optional[v1EarnProvider] = Field( + default=None, + description="Optional filter: only return enabled vaults from this provider. Leave EARN_PROVIDER_UNSPECIFIED to return all providers.", + ) + caip19: Optional[str] = Field( + default=None, + description="Optional filter: only return enabled vaults whose underlying asset matches this CAIP-19 asset ID (e.g. 'eip155:8453/erc20:0x833589...'). The chain is taken from the CAIP-19 identifier.", + ) + includeExposure: Optional[bool] = Field( + default=None, + description="When true, populate each vault's exposures (the underlying markets it allocates into). This costs an extra provider query per vault, so leave it off for list views.", ) - policyId: str = Field(description="Unique identifier for a given policy.") -class v1GetPolicyResponse(TurnkeyBaseModel): - policy: v1Policy = Field( - description="Object that codifies rules defining the actions that are permissible within an organization." +class v1ListEarnEnabledVaultsResponse(TurnkeyBaseModel): + enabledVaults: Optional[List[v1EarnEnabledVault]] = Field( + default=None, description="The organization's deployed wrappers." ) -class v1GetPrivateKeyRequest(TurnkeyBaseModel): +class v1ListEarnPositionsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." + ) + walletAddress: str = Field( + description="The wallet address to return positions for." ) - privateKeyId: str = Field(description="Unique identifier for a given private key.") -class v1GetPrivateKeyResponse(TurnkeyBaseModel): - privateKey: v1PrivateKey = Field( - description="Cryptographic public/private key pair that can be used for cryptocurrency needs or more generalized encryption." +class v1ListEarnPositionsResponse(TurnkeyBaseModel): + positions: Optional[List[v1EarnPosition]] = Field( + default=None, description="The wallet's active Earn positions." ) -class v1GetPrivateKeysRequest(TurnkeyBaseModel): +class v1ListEarnRewardsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." + ) + walletAddress: str = Field(description="The wallet address to return rewards for.") + caip2: Optional[str] = Field( + default=None, + description="Optional filter: only return rewards on this chain (e.g. 'eip155:8453'). When unset, every chain the organization has deployed Earn wrappers on is queried.", ) -class v1GetPrivateKeysResponse(TurnkeyBaseModel): - privateKeys: List[v1PrivateKey] = Field(description="A list of private keys.") +class v1ListEarnRewardsResponse(TurnkeyBaseModel): + rewards: Optional[List[v1EarnReward]] = Field( + default=None, + description="The wallet's rewards, one entry per (chain, reward token), sorted by chain then token. Entries where every amount is zero are omitted.", + ) -class v1GetSendTransactionStatusRequest(TurnkeyBaseModel): +class v1ListEarnVaultsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization. Annotates which vaults the organization has already enabled." ) - sendTransactionStatusId: str = Field( - description="The unique identifier of a send transaction request." + provider: Optional[v1EarnProvider] = Field( + default=None, + description="Optional filter: only return vaults from this provider. Leave EARN_PROVIDER_UNSPECIFIED to return all providers.", + ) + caip19: str = Field( + description="CAIP-19 asset ID (e.g. 'eip155:8453/erc20:0x833589...') to return vaults for. Only vaults whose underlying asset matches are returned; the chain is taken from the CAIP-19 identifier." + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, + description="Pagination over the TVL-sorted catalog. before/after cursors are a vault_address from a prior page.", ) -class v1GetSendTransactionStatusResponse(TurnkeyBaseModel): - txStatus: str = Field(description="The current status of the send transaction.") - eth: Optional[v1EthSendTransactionStatus] = Field( - default=None, description="Ethereum-specific transaction status." - ) - txError: Optional[str] = Field( +class v1ListEarnVaultsResponse(TurnkeyBaseModel): + vaults: Optional[List[v1EarnVault]] = Field( default=None, - description="The error encountered when broadcasting or confirming the transaction, if any.", + description="The catalog of wrappable vaults, sorted by TVL (USD) descending. To page, pass page_info.end_cursor as the pagination after cursor.", ) - error: Optional[v1TxError] = Field( + pageInfo: Optional[v1PageInfo] = Field( default=None, - description="Structured error information including revert details, if available.", + description="Pagination metadata for the returned page. Pass end_cursor as the next request's after cursor (or start_cursor as the before cursor) to page through the catalog. Cursors are opaque; do not parse them.", ) -class v1GetSmartContractInterfaceRequest(TurnkeyBaseModel): +class v1ListEmailEventsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." - ) - smartContractInterfaceId: str = Field( - description="Unique identifier for a given smart contract interface." + description="Unique identifier for a given organization" ) - - -class v1GetSmartContractInterfaceResponse(TurnkeyBaseModel): - smartContractInterface: externaldatav1SmartContractInterface = Field( - description="Object to be used in conjunction with policies to guard transaction signing." + email: str = Field(description="Recipient email address to list email events for") + eventType: Optional[str] = Field( + default=None, + description="Optional email event type to filter by. Examples include Send, Delivery, Bounce, and DeliveryDelay", ) - - -class v1GetSmartContractInterfacesRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." + paginationOptions: Optional[v1Pagination] = Field( + default=None, description="Parameters used for cursor-based pagination" ) -class v1GetSmartContractInterfacesResponse(TurnkeyBaseModel): - smartContractInterfaces: List[externaldatav1SmartContractInterface] = Field( - description="A list of smart contract interfaces." +class v1ListEmailEventsResponse(TurnkeyBaseModel): + emailEvents: List[v1EmailEvent] = Field( + description="Email events matching the requested filters, ordered by most recent event first." ) -class v1GetSubOrgIdsRequest(TurnkeyBaseModel): +class v1ListEthTransactionHistoryRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for the parent organization. This is used to find sub-organizations within it." + description="Unique identifier for a given Organization." ) - filterType: Optional[str] = Field( - default=None, - description="Specifies the type of filter to apply, i.e 'CREDENTIAL_ID', 'NAME', 'USERNAME', 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN', 'WALLET_ACCOUNT_ADDRESS' or 'PUBLIC_KEY'", + address: str = Field( + description="Address corresponding to a wallet account. Private key addresses are not supported." ) - filterValue: Optional[str] = Field( - default=None, - description="The value of the filter to apply for the specified type. For example, a specific email or name string.", + caip2: str = Field( + description="EVM CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." ) paginationOptions: Optional[v1Pagination] = Field( - default=None, description="Parameters used for cursor-based pagination." + default=None, + description="Cursor-based pagination options. Cursors are opaque and valid only for the same address and CAIP-2 query.", ) -class v1GetSubOrgIdsResponse(TurnkeyBaseModel): - organizationIds: List[str] = Field( - description="List of unique identifiers for the matching sub-organizations." +class v1ListEthTransactionHistoryResponse(TurnkeyBaseModel): + transactions: List[v1EthTransactionHistoryItem] = Field( + description="EVM transactions for the requested address, ordered by most recent first." ) + pageInfo: Optional[v1PageInfo] = Field(default=None) -class v1GetUserRequest(TurnkeyBaseModel): +class v1ListFiatOnRampCredentialsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." ) - userId: str = Field(description="Unique identifier for a given user.") -class v1GetUserResponse(TurnkeyBaseModel): - user: v1User = Field(description="Web and/or API user within your organization.") +class v1ListFiatOnRampCredentialsResponse(TurnkeyBaseModel): + fiatOnRampCredentials: List[v1FiatOnRampCredential] -class v1GetUsersRequest(TurnkeyBaseModel): +class v1ListOauth2CredentialsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." ) -class v1GetUsersResponse(TurnkeyBaseModel): - users: List[v1User] = Field(description="A list of users.") +class v1ListOauth2CredentialsResponse(TurnkeyBaseModel): + oauth2Credentials: List[v1Oauth2Credential] -class v1GetVerifiedSubOrgIdsRequest(TurnkeyBaseModel): +class v1ListPrivateKeyTagsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for the parent organization. This is used to find sub-organizations within it." - ) - filterType: Optional[str] = Field( - default=None, - description="Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE_NUMBER'.", - ) - filterValue: Optional[str] = Field( - default=None, - description="The value of the filter to apply for the specified type. For example, a specific email or phone number string.", - ) - paginationOptions: Optional[v1Pagination] = Field( - default=None, description="Parameters used for cursor-based pagination." + description="Unique identifier for a given Organization." ) -class v1GetVerifiedSubOrgIdsResponse(TurnkeyBaseModel): - organizationIds: List[str] = Field( - description="List of unique identifiers for the matching sub-organizations." - ) +class v1ListPrivateKeyTagsResponse(TurnkeyBaseModel): + privateKeyTags: List[datav1Tag] = Field(description="A list of private key tags.") -class v1GetWalletAccountRequest(TurnkeyBaseModel): +class v1ListSecretsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." - ) - walletId: str = Field(description="Unique identifier for a given wallet.") - address: Optional[str] = Field( - default=None, description="Address corresponding to a wallet account." + description="Unique identifier for the organization or sub-organization whose secrets are listed." ) - path: Optional[str] = Field( - default=None, description="Path corresponding to a wallet account." + paginationOptions: Optional[v1Pagination] = Field( + default=None, description="Parameters used for cursor-based pagination." ) -class v1GetWalletAccountResponse(TurnkeyBaseModel): - account: v1WalletAccount = Field(description="The resulting wallet account.") +class v1ListSecretsResponse(TurnkeyBaseModel): + secrets: List[v1SecretMetadata] = Field( + description="Metadata for each secret in the organization, ordered by most recently created first." + ) -class v1GetWalletAccountsRequest(TurnkeyBaseModel): +class v1ListSolTransactionHistoryRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." ) - walletId: Optional[str] = Field( - default=None, - description="Unique identifier for a given wallet. If not provided, all accounts for the organization will be returned.", + address: str = Field( + description="Address corresponding to a wallet account. Private key addresses are not supported." ) - includeWalletDetails: Optional[bool] = Field( - default=None, - description="Optional flag to specify if the wallet details should be included in the response. Default = false.", + caip2: str = Field( + description="Solana CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." ) paginationOptions: Optional[v1Pagination] = Field( - default=None, description="Parameters used for cursor-based pagination." + default=None, + description="Cursor-based pagination options. Cursors are opaque and valid only for the same address and CAIP-2 query.", ) -class v1GetWalletAccountsResponse(TurnkeyBaseModel): - accounts: List[v1WalletAccount] = Field( - description="A list of accounts generated from a wallet that share a common seed." +class v1ListSolTransactionHistoryResponse(TurnkeyBaseModel): + transactions: List[v1SolTransactionHistoryItem] = Field( + description="Solana transactions for the requested address, ordered by most recent first." ) + pageInfo: Optional[v1PageInfo] = Field(default=None) -class v1GetWalletAddressBalancesRequest(TurnkeyBaseModel): +class v1ListSupportedAssetsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." ) - address: str = Field(description="Address corresponding to a wallet account.") caip2: str = Field( description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." ) -class v1GetWalletAddressBalancesResponse(TurnkeyBaseModel): - balances: Optional[List[v1AssetBalance]] = Field( - default=None, description="List of asset balances" - ) - - -class v1GetWalletRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." - ) - walletId: str = Field(description="Unique identifier for a given wallet.") - - -class v1GetWalletResponse(TurnkeyBaseModel): - wallet: v1Wallet = Field( - description="A collection of deterministically generated cryptographic public / private key pairs that share a common seed." +class v1ListSupportedAssetsResponse(TurnkeyBaseModel): + assets: Optional[List[v1AssetMetadata]] = Field( + default=None, description="List of asset metadata" ) -class v1GetWalletsRequest(TurnkeyBaseModel): +class v1ListUserTagsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." ) -class v1GetWalletsResponse(TurnkeyBaseModel): - wallets: List[v1Wallet] = Field(description="A list of wallets.") +class v1ListUserTagsResponse(TurnkeyBaseModel): + userTags: List[datav1Tag] = Field(description="A list of user tags.") -class v1GetWhoamiRequest(TurnkeyBaseModel): +class v1ListWebhookEndpointsRequest(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization. If the request is being made by a WebAuthN user and their sub-organization ID is unknown, this can be the parent organization ID; using the sub-organization ID when possible is preferred due to performance reasons." + description="Unique identifier for a given Organization." ) -class v1GetWhoamiResponse(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." +class v1ListWebhookEndpointsResponse(TurnkeyBaseModel): + webhookEndpoints: List[v1WebhookEndpointData] + + +class v1LogLine(TurnkeyBaseModel): + content: str = Field( + description="One log line, exactly as the application printed it (without the trailing newline)" ) - organizationName: str = Field( - description="Human-readable name for an organization." + ts: Optional[externaldatav1Timestamp] = Field( + default=None, + description="When the line was logged. Stable across replays, so lines can be chronologically merged across pods", ) - userId: str = Field(description="Unique identifier for a given user.") - username: str = Field(description="Human-readable name for a user.") -class v1HashFunction(str, Enum): - HASH_FUNCTION_NO_OP = "HASH_FUNCTION_NO_OP" - HASH_FUNCTION_SHA256 = "HASH_FUNCTION_SHA256" - HASH_FUNCTION_KECCAK256 = "HASH_FUNCTION_KECCAK256" - HASH_FUNCTION_NOT_APPLICABLE = "HASH_FUNCTION_NOT_APPLICABLE" +class v1LoginUsage(TurnkeyBaseModel): + publicKey: str = Field(description="Public key for authentication") -class v1ImportPrivateKeyIntent(TurnkeyBaseModel): - userId: str = Field(description="The ID of the User importing a Private Key.") - privateKeyName: str = Field(description="Human-readable name for a Private Key.") - encryptedBundle: str = Field( - description="Bundle containing a raw private key encrypted to the enclave's target public key." +class v1MfaPolicy(TurnkeyBaseModel): + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + mfaPolicyName: str = Field(description="Human-readable name for an MFA Policy.") + condition: str = Field( + description="A condition expression that evaluates to true or false, determining when this MFA policy applies." ) - curve: v1Curve = Field( - description="Cryptographic Curve used to generate a given Private Key." + requiredAuthenticationMethods: List[v1RequiredAuthenticationMethod] = Field( + description="An ordered list of authentication requirements. Each requirement must be satisfied sequentially to complete MFA." ) - addressFormats: List[v1AddressFormat] = Field( - description="Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." + order: int = Field( + description="The order in which this policy is evaluated relative to other MFA policies." + ) + notes: Optional[str] = Field( + default=None, + description="Optional human-readable notes added by a User to describe a particular MFA policy.", ) + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp -class v1ImportPrivateKeyRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." +class v1MfaStatus(TurnkeyBaseModel): + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + userId: str = Field(description="Unique identifier for a given User.") + satisfied: bool = Field( + description="Whether the MFA policy requirements are currently satisfied." ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + satisfiedMethods: List[v1AuthenticationMethod] = Field( + description="A list of authentication methods already satisfied for this MFA policy." + ) + requiredMethods: List[v1RequiredAuthenticationMethod] = Field( + description="An ordered list of authentication requirements needed to satisfy this MFA policy." ) - parameters: v1ImportPrivateKeyIntent - generateAppProofs: Optional[bool] = Field(default=None) -class v1ImportPrivateKeyResult(TurnkeyBaseModel): - privateKeyId: str = Field(description="Unique identifier for a Private Key.") - addresses: List[immutableactivityv1Address] = Field( - description="A list of addresses." +class v1MnemonicLanguage(str, Enum): + MNEMONIC_LANGUAGE_ENGLISH = "MNEMONIC_LANGUAGE_ENGLISH" + MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE = "MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE" + MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE = "MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE" + MNEMONIC_LANGUAGE_CZECH = "MNEMONIC_LANGUAGE_CZECH" + MNEMONIC_LANGUAGE_FRENCH = "MNEMONIC_LANGUAGE_FRENCH" + MNEMONIC_LANGUAGE_ITALIAN = "MNEMONIC_LANGUAGE_ITALIAN" + MNEMONIC_LANGUAGE_JAPANESE = "MNEMONIC_LANGUAGE_JAPANESE" + MNEMONIC_LANGUAGE_KOREAN = "MNEMONIC_LANGUAGE_KOREAN" + MNEMONIC_LANGUAGE_SPANISH = "MNEMONIC_LANGUAGE_SPANISH" + + +class v1NOOPCodegenAnchorResponse(TurnkeyBaseModel): + stamp: v1WebAuthnStamp + tokenUsage: Optional[v1TokenUsage] = Field(default=None) + + +class v1NativeRevertError(TurnkeyBaseModel): + nativeType: Optional[str] = Field( + default=None, + description="The type of native error: 'error_string', 'panic', or 'execution_reverted'.", + ) + message: Optional[str] = Field( + default=None, description="The error message for Error(string) reverts." + ) + panicCode: Optional[str] = Field( + default=None, description="The panic code for Panic(uint256) reverts." ) -class v1ImportWalletIntent(TurnkeyBaseModel): - userId: str = Field(description="The ID of the User importing a Wallet.") - walletName: str = Field(description="Human-readable name for a Wallet.") - encryptedBundle: str = Field( - description="Bundle containing a wallet mnemonic encrypted to the enclave's target public key." +class v1Oauth2AuthenticateIntent(TurnkeyBaseModel): + oauth2CredentialId: str = Field( + description="The OAuth 2.0 credential id whose client_id and client_secret will be used in the OAuth 2.0 flow" ) - accounts: List[v1WalletAccountParams] = Field( - description="A list of wallet Accounts." + authCode: str = Field( + description="The auth_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow" + ) + redirectUri: str = Field( + description="The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider" + ) + codeVerifier: str = Field( + description="The code verifier used by OAuth 2.0 PKCE providers" + ) + nonce: str = Field( + description="A nonce value set to sha256(publicKey), used to bind the OIDC token to a specific public key" + ) + bearerTokenTargetPublicKey: Optional[str] = Field( + default=None, + description="An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token", ) -class v1ImportWalletRequest(TurnkeyBaseModel): +class v1Oauth2AuthenticateRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -3008,59 +6247,76 @@ class v1ImportWalletRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1ImportWalletIntent + parameters: v1Oauth2AuthenticateIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1ImportWalletResult(TurnkeyBaseModel): - walletId: str = Field(description="Unique identifier for a Wallet.") - addresses: List[str] = Field(description="A list of account addresses.") +class v1Oauth2AuthenticateResult(TurnkeyBaseModel): + oidcToken: str = Field( + description="Base64 encoded OIDC token issued by Turnkey to be used with the LoginWithOAuth activity" + ) -class v1InitFiatOnRampIntent(TurnkeyBaseModel): - onrampProvider: v1FiatOnRampProvider = Field( - description="Enum to specifiy which on-ramp provider to use" +class v1Oauth2Credential(TurnkeyBaseModel): + oauth2CredentialId: str = Field( + description="Unique identifier for a given OAuth 2.0 Credential." ) - walletAddress: str = Field( - description="Destination wallet address for the buy transaction." + organizationId: str = Field(description="Unique identifier for an Organization.") + provider: v1Oauth2Provider = Field( + description="The provider for a given OAuth 2.0 Credential." ) - network: v1FiatOnRampBlockchainNetwork = Field( - description="Blockchain network to be used for the transaction, e.g., bitcoin, ethereum. Maps to MoonPay's network or Coinbase's defaultNetwork." + clientId: str = Field(description="The client id for a given OAuth 2.0 Credential.") + encryptedClientSecret: str = Field( + description="The encrypted client secret for a given OAuth 2.0 Credential encrypted to the TLS Fetcher quorum key." ) - cryptoCurrencyCode: v1FiatOnRampCryptoCurrency = Field( - description="Code for the cryptocurrency to be purchased, e.g., btc, eth. Maps to MoonPay's currencyCode or Coinbase's defaultAsset." + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + + +class v1Oauth2Provider(str, Enum): + OAUTH2_PROVIDER_X = "OAUTH2_PROVIDER_X" + OAUTH2_PROVIDER_DISCORD = "OAUTH2_PROVIDER_DISCORD" + + +class v1OauthIntent(TurnkeyBaseModel): + oidcToken: str = Field(description="Base64 encoded OIDC token") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted." ) - fiatCurrencyCode: Optional[v1FiatOnRampCurrency] = Field( + apiKeyName: Optional[str] = Field( default=None, - description="Code for the fiat currency to be used in the transaction, e.g., USD, EUR.", + description="Optional human-readable name for an API Key. If none provided, default to Oauth - ", ) - fiatCurrencyAmount: Optional[str] = Field( + expirationSeconds: Optional[str] = Field( default=None, - description="Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount.", + description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", ) - paymentMethod: Optional[v1FiatOnRampPaymentMethod] = Field( + invalidateExisting: Optional[bool] = Field( default=None, - description="Pre-selected payment method, e.g., CREDIT_DEBIT_CARD, APPLE_PAY. Validated against the chosen provider.", + description="Invalidate all other previously generated Oauth API keys", ) - countryCode: Optional[str] = Field( - default=None, - description="ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB.", + + +class v1OauthLoginIntent(TurnkeyBaseModel): + oidcToken: str = Field(description="Base64 encoded OIDC token") + publicKey: str = Field( + description="Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request" ) - countrySubdivisionCode: Optional[str] = Field( + expirationSeconds: Optional[str] = Field( default=None, - description="ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country_code=US.", + description="Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.", ) - sandboxMode: Optional[bool] = Field( + invalidateExisting: Optional[bool] = Field( default=None, - description="Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false.", + description="Invalidate all other previously generated Login API keys", ) - urlForSignature: Optional[str] = Field( + sessionProfileId: Optional[str] = Field( default=None, - description="Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled.", + description="Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used.", ) -class v1InitFiatOnRampRequest(TurnkeyBaseModel): +class v1OauthLoginRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -3068,48 +6324,113 @@ class v1InitFiatOnRampRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1InitFiatOnRampIntent + parameters: v1OauthLoginIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1InitFiatOnRampResult(TurnkeyBaseModel): - onRampUrl: str = Field(description="Unique URL for a given fiat on-ramp flow.") - onRampTransactionId: str = Field( - description="Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow." +class v1OauthLoginResult(TurnkeyBaseModel): + session: str = Field( + description="Signed JWT containing an expiry, public key, session type, user id, and organization id" ) - onRampUrlSignature: Optional[str] = Field( - default=None, - description="Optional signature of the MoonPay Widget URL. The signature is generated if the Init Fiat On Ramp intent includes the urlForSignature field. The signature can be used to initialize the MoonPay SDKs when URL signing is enabled for your project.", + + +class v1OauthProvider(TurnkeyBaseModel): + providerId: str = Field(description="Unique identifier for an OAuth Provider") + providerName: str = Field(description="Human-readable name to identify a Provider.") + issuer: str = Field( + description="The issuer of the token, typically a URL indicating the authentication server, e.g https://accounts.google.com" ) + audience: str = Field( + description="Expected audience ('aud' attribute of the signed token) which represents the app ID" + ) + subject: str = Field( + description="Expected subject ('sub' attribute of the signed token) which represents the user ID" + ) + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp -class v1InitImportPrivateKeyIntent(TurnkeyBaseModel): - userId: str = Field(description="The ID of the User importing a Private Key.") +class v1OauthProviderParams(TurnkeyBaseModel): + providerName: str = Field(description="Human-readable name to identify a Provider.") + oidcToken: str = Field(description="Base64 encoded OIDC token") -class v1InitImportPrivateKeyRequest(TurnkeyBaseModel): +class v1OauthProviderParamsV2(TurnkeyBaseModel): + providerName: str = Field(description="Human-readable name to identify a Provider.") + oidcToken: Optional[str] = Field( + default=None, description="Base64 encoded OIDC token" + ) + oidcClaims: Optional[v1OidcClaims] = Field( + default=None, + description="OIDC claims (iss, sub, aud) to uniquely identify the user", + ) + + +class v1OauthRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1OauthIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1OauthResult(TurnkeyBaseModel): + userId: str = Field(description="Unique identifier for the authenticating User.") + apiKeyId: str = Field(description="Unique identifier for the created API key.") + credentialBundle: str = Field(description="HPKE encrypted credential bundle") + + +class v1OidcClaims(TurnkeyBaseModel): + iss: str = Field( + description="The issuer identifier from the OIDC token (iss claim)" + ) + sub: str = Field( + description="The subject identifier from the OIDC token (sub claim)" + ) + aud: str = Field(description="The audience from the OIDC token (aud claim)") + + +class v1Operator(str, Enum): + OPERATOR_EQUAL = "OPERATOR_EQUAL" + OPERATOR_MORE_THAN = "OPERATOR_MORE_THAN" + OPERATOR_MORE_THAN_OR_EQUAL = "OPERATOR_MORE_THAN_OR_EQUAL" + OPERATOR_LESS_THAN = "OPERATOR_LESS_THAN" + OPERATOR_LESS_THAN_OR_EQUAL = "OPERATOR_LESS_THAN_OR_EQUAL" + OPERATOR_CONTAINS = "OPERATOR_CONTAINS" + OPERATOR_NOT_EQUAL = "OPERATOR_NOT_EQUAL" + OPERATOR_IN = "OPERATOR_IN" + OPERATOR_NOT_IN = "OPERATOR_NOT_IN" + OPERATOR_CONTAINS_ONE = "OPERATOR_CONTAINS_ONE" + OPERATOR_CONTAINS_ALL = "OPERATOR_CONTAINS_ALL" + + +class v1OtpAuthIntent(TurnkeyBaseModel): + otpId: str = Field( + description="ID representing the result of an init OTP activity." + ) + otpCode: str = Field(description="OTP sent out to a user's contact (email or SMS)") + targetPublicKey: str = Field( + description="Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted." + ) + apiKeyName: Optional[str] = Field( + default=None, + description="Optional human-readable name for an API Key. If none provided, default to OTP Auth - ", + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", ) - parameters: v1InitImportPrivateKeyIntent - generateAppProofs: Optional[bool] = Field(default=None) - - -class v1InitImportPrivateKeyResult(TurnkeyBaseModel): - importBundle: str = Field( - description="Import bundle containing a public key and signature to use for importing client data." + invalidateExisting: Optional[bool] = Field( + default=None, + description="Invalidate all other previously generated OTP Auth API keys", ) -class v1InitImportWalletIntent(TurnkeyBaseModel): - userId: str = Field(description="The ID of the User importing a Wallet.") - - -class v1InitImportWalletRequest(TurnkeyBaseModel): +class v1OtpAuthRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -3117,128 +6438,70 @@ class v1InitImportWalletRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1InitImportWalletIntent + parameters: v1OtpAuthIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1InitImportWalletResult(TurnkeyBaseModel): - importBundle: str = Field( - description="Import bundle containing a public key and signature to use for importing client data." - ) - - -class v1InitOtpAuthIntent(TurnkeyBaseModel): - otpType: str = Field( - description="Enum to specifiy whether to send OTP via SMS or email" - ) - contact: str = Field(description="Email or phone number to send the OTP code to") - emailCustomization: Optional[v1EmailCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", - ) - smsCustomization: Optional[v1SmsCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing SMS message. If not provided, the default sms message will be used.", - ) - userIdentifier: Optional[str] = Field( - default=None, - description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", - ) - sendFromEmailAddress: Optional[str] = Field( - default=None, - description="Optional custom email address from which to send the OTP email", - ) - sendFromEmailSenderName: Optional[str] = Field( - default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", +class v1OtpAuthResult(TurnkeyBaseModel): + userId: str = Field(description="Unique identifier for the authenticating User.") + apiKeyId: Optional[str] = Field( + default=None, description="Unique identifier for the created API key." ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + credentialBundle: Optional[str] = Field( + default=None, description="HPKE encrypted credential bundle" ) -class v1InitOtpAuthIntentV2(TurnkeyBaseModel): - otpType: str = Field( - description="Enum to specifiy whether to send OTP via SMS or email" - ) - contact: str = Field(description="Email or phone number to send the OTP code to") - otpLength: Optional[int] = Field( - default=None, description="Optional length of the OTP code. Default = 9" - ) - emailCustomization: Optional[v1EmailCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", +class v1OtpLoginIntent(TurnkeyBaseModel): + verificationToken: str = Field( + description="Signed JWT containing a unique id, expiry, verification type, contact" ) - smsCustomization: Optional[v1SmsCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing SMS message. If not provided, the default SMS message will be used.", + publicKey: str = Field( + description="Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token" ) - userIdentifier: Optional[str] = Field( + expirationSeconds: Optional[str] = Field( default=None, - description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + description="Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.", ) - sendFromEmailAddress: Optional[str] = Field( + invalidateExisting: Optional[bool] = Field( default=None, - description="Optional custom email address from which to send the OTP email", + description="Invalidate all other previously generated Login API keys", ) - alphanumeric: Optional[bool] = Field( + clientSignature: Optional[v1ClientSignature] = Field( default=None, - description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true", + description="Optional signature proving authorization for this login. The signature is over the verification token ID and the public key. Only required if a public key was provided during the verification step.", ) - sendFromEmailSenderName: Optional[str] = Field( + sessionProfileId: Optional[str] = Field( default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", - ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + description="Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used.", ) -class v1InitOtpAuthIntentV3(TurnkeyBaseModel): - otpType: str = Field( - description="Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" - ) - contact: str = Field(description="Email or phone number to send the OTP code to") - otpLength: Optional[int] = Field( - default=None, description="Optional length of the OTP code. Default = 9" - ) - appName: str = Field( - description="The name of the application. This field is required and will be used in email notifications if an email template is not provided." - ) - emailCustomization: Optional[v1EmailCustomizationParamsV2] = Field( - default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", - ) - smsCustomization: Optional[v1SmsCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing SMS message. If not provided, the default SMS message will be used.", +class v1OtpLoginIntentV2(TurnkeyBaseModel): + verificationToken: str = Field( + description="Signed Verification Token containing a unique id, expiry, verification type, contact" ) - userIdentifier: Optional[str] = Field( - default=None, - description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + publicKey: str = Field( + description="Client-side public key generated by the user, used as the session public key upon successful login" ) - sendFromEmailAddress: Optional[str] = Field( - default=None, - description="Optional custom email address from which to send the OTP email", + clientSignature: v1ClientSignature = Field( + description="Required signature proving authorization for this login. The signature is over the verification token ID and the public key. Required for secure OTP login process." ) - alphanumeric: Optional[bool] = Field( + expirationSeconds: Optional[str] = Field( default=None, - description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true", + description="Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.", ) - sendFromEmailSenderName: Optional[str] = Field( + invalidateExisting: Optional[bool] = Field( default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + description="Invalidate all other previously generated Login sessions", ) - expirationSeconds: Optional[str] = Field( + sessionProfileId: Optional[str] = Field( default=None, - description="Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)", - ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + description="Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used.", ) -class v1InitOtpAuthRequest(TurnkeyBaseModel): +class v1OtpLoginRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -3246,146 +6509,226 @@ class v1InitOtpAuthRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1InitOtpAuthIntentV3 + parameters: v1OtpLoginIntentV2 generateAppProofs: Optional[bool] = Field(default=None) -class v1InitOtpAuthResult(TurnkeyBaseModel): - otpId: str = Field(description="Unique identifier for an OTP authentication") +class v1OtpLoginResult(TurnkeyBaseModel): + session: str = Field( + description="Signed JWT containing an expiry, public key, session type, user id, and organization id" + ) -class v1InitOtpAuthResultV2(TurnkeyBaseModel): - otpId: str = Field(description="Unique identifier for an OTP authentication") +class v1Outcome(str, Enum): + OUTCOME_ALLOW = "OUTCOME_ALLOW" + OUTCOME_DENY_EXPLICIT = "OUTCOME_DENY_EXPLICIT" + OUTCOME_DENY_IMPLICIT = "OUTCOME_DENY_IMPLICIT" + OUTCOME_REQUIRES_CONSENSUS = "OUTCOME_REQUIRES_CONSENSUS" + OUTCOME_REJECTED = "OUTCOME_REJECTED" + OUTCOME_ERROR = "OUTCOME_ERROR" + OUTCOME_REQUIRES_AUTHENTICATORS = "OUTCOME_REQUIRES_AUTHENTICATORS" + OUTCOME_TIME_INACTIVE = "OUTCOME_TIME_INACTIVE" -class v1InitOtpIntent(TurnkeyBaseModel): - otpType: str = Field( - description="Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" - ) - contact: str = Field(description="Email or phone number to send the OTP code to") - otpLength: Optional[int] = Field( - default=None, description="Optional length of the OTP code. Default = 9" - ) - emailCustomization: Optional[v1EmailCustomizationParams] = Field( +class v1PageInfo(TurnkeyBaseModel): + hasNextPage: Optional[bool] = Field(default=None) + hasPreviousPage: Optional[bool] = Field(default=None) + startCursor: Optional[str] = Field(default=None) + endCursor: Optional[str] = Field(default=None) + + +class v1Pagination(TurnkeyBaseModel): + limit: Optional[str] = Field( default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", + description="A limit of the number of object to be returned, between 1 and 100. Defaults to 10.", ) - smsCustomization: Optional[v1SmsCustomizationParams] = Field( + before: Optional[str] = Field( default=None, - description="Optional parameters for customizing SMS message. If not provided, the default sms message will be used.", + description="A pagination cursor. This is an object ID that enables you to fetch all objects before this ID.", ) - userIdentifier: Optional[str] = Field( + after: Optional[str] = Field( default=None, - description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + description="A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.", ) - sendFromEmailAddress: Optional[str] = Field( - default=None, - description="Optional custom email address from which to send the OTP email", + + +class v1PathFormat(str, Enum): + PATH_FORMAT_BIP32 = "PATH_FORMAT_BIP32" + + +class v1PayloadEncoding(str, Enum): + PAYLOAD_ENCODING_HEXADECIMAL = "PAYLOAD_ENCODING_HEXADECIMAL" + PAYLOAD_ENCODING_TEXT_UTF8 = "PAYLOAD_ENCODING_TEXT_UTF8" + PAYLOAD_ENCODING_EIP712 = "PAYLOAD_ENCODING_EIP712" + PAYLOAD_ENCODING_EIP7702_AUTHORIZATION = "PAYLOAD_ENCODING_EIP7702_AUTHORIZATION" + + +class v1Policy(TurnkeyBaseModel): + policyId: str = Field(description="Unique identifier for a given Policy.") + policyName: str = Field(description="Human-readable name for a Policy.") + effect: v1Effect = Field( + description="The instruction to DENY or ALLOW a particular activity following policy selector(s)." ) - alphanumeric: Optional[bool] = Field( - default=None, - description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true", + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + notes: str = Field( + description="Human-readable notes added by a User to describe a particular policy." ) - sendFromEmailSenderName: Optional[str] = Field( - default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + consensus: str = Field( + description="A consensus expression that evalutes to true or false." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)", + condition: str = Field( + description="A condition expression that evalutes to true or false." ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + time: Optional[str] = Field( + default=None, description="A time expression that evalutes to true or false." ) -class v1InitOtpIntentV2(TurnkeyBaseModel): - otpType: str = Field( - description="Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" +class v1PostTvcQuorumKeyShareIntent(TurnkeyBaseModel): + deploymentId: str = Field( + description="Unique identifier of the TVC deployment receiving quorum key share" ) - contact: str = Field(description="Email or phone number to send the OTP code to") - otpLength: Optional[int] = Field( - default=None, description="Optional length of the OTP code. Default = 9" + ephemeralPublicKeyHex: str = Field( + description="Hex-encoded ephemeral public key used to encrypt the quorum key share" ) - appName: str = Field( - description="The name of the application. This field is required and will be used in email notifications if an email template is not provided." + shareApprovalBundle: v1QuorumKeyShareApprovalBundle = Field( + description="Re-encrypted quorum key share and approval" ) - emailCustomization: Optional[v1EmailCustomizationParamsV2] = Field( - default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", + + +class v1PostTvcQuorumKeyShareRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1PostTvcQuorumKeyShareIntent + + +class v1PostTvcQuorumKeyShareResult(TurnkeyBaseModel): + provisioningShareId: str = Field( + description="The unique identifier for the provisioning quorum key share" + ) + + +class v1PrivateKey(TurnkeyBaseModel): + privateKeyId: str = Field(description="Unique identifier for a given Private Key.") + publicKey: str = Field( + description="The public component of a cryptographic key pair used to sign messages and transactions." + ) + privateKeyName: str = Field(description="Human-readable name for a Private Key.") + curve: v1Curve = Field( + description="Cryptographic Curve used to generate a given Private Key." + ) + addresses: List[externaldatav1Address] = Field( + description="Derived cryptocurrency addresses for a given Private Key." ) - smsCustomization: Optional[v1SmsCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing SMS message. If not provided, the default SMS message will be used.", + privateKeyTags: List[str] = Field(description="A list of Private Key Tag IDs.") + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + exported: bool = Field( + description="True when a given Private Key is exported, false otherwise." ) - userIdentifier: Optional[str] = Field( - default=None, - description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + imported: bool = Field( + description="True when a given Private Key is imported, false otherwise." ) - sendFromEmailAddress: Optional[str] = Field( - default=None, - description="Optional custom email address from which to send the OTP email", + + +class v1PrivateKeyParams(TurnkeyBaseModel): + privateKeyName: str = Field(description="Human-readable name for a Private Key.") + curve: v1Curve = Field( + description="Cryptographic Curve used to generate a given Private Key." ) - alphanumeric: Optional[bool] = Field( - default=None, - description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true", + privateKeyTags: List[str] = Field( + description="A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body." ) - sendFromEmailSenderName: Optional[str] = Field( - default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + addressFormats: List[v1AddressFormat] = Field( + description="Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)", + + +class v1PrivateKeyResult(TurnkeyBaseModel): + privateKeyId: Optional[str] = Field(default=None) + addresses: Optional[List[immutableactivityv1Address]] = Field(default=None) + + +class v1ProvisioningState(str, Enum): + PROVISIONING_STATE_PENDING = "PROVISIONING_STATE_PENDING" + PROVISIONING_STATE_AWAITING_PROVISION = "PROVISIONING_STATE_AWAITING_PROVISION" + PROVISIONING_STATE_PROVISIONED = "PROVISIONING_STATE_PROVISIONED" + + +class v1PublicKeyCredentialWithAttestation(TurnkeyBaseModel): + id: str + type: str + rawId: str + authenticatorAttachment: Optional[str] = Field(default=None) + response: v1AuthenticatorAttestationResponse + clientExtensionResults: v1SimpleClientExtensionResults + + +class v1QuorumKeyShareApprovalBundle(TurnkeyBaseModel): + operatorId: str = Field( + description="Unique identifier of the operator providing this quorum key share" ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + reEncryptedShareHex: str = Field( + description="Hex-encoded re-encrypted quorum key share" + ) + signature: str = Field( + description="Signature from the share set operator approving the manifest" ) -class v1InitOtpIntentV3(TurnkeyBaseModel): - otpType: str = Field( - description="Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" +class v1ReEncryptTvcQuorumKeyShareIntent(TurnkeyBaseModel): + attestationDocB64: str = Field( + description="Base64-encoded attestation document for the TVC deployment provisioning enclave" ) - contact: str = Field(description="Email or phone number to send the OTP code to") - appName: str = Field(description="The name of the application.") - otpLength: Optional[int] = Field( - default=None, description="Optional length of the OTP code. Default = 9" + manifestB64: str = Field( + description="Base64-encoded manifest for the TVC deployment" ) - emailCustomization: Optional[v1EmailCustomizationParamsV2] = Field( - default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", + operatorEncryptKey: str = Field( + description="Operator encryption public key used to encrypt the hosted TVC quorum key share" ) - smsCustomization: Optional[v1SmsCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing SMS message. If not provided, the default sms message will be used.", + operatorSignKey: str = Field( + description="Operator signing public key used to approve the TVC manifest" ) - userIdentifier: Optional[str] = Field( - default=None, - description="Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address.", + deploymentId: str = Field( + description="Unique identifier of the TVC deployment receiving the re-encrypted quorum key share" ) - sendFromEmailAddress: Optional[str] = Field( - default=None, - description="Optional custom email address from which to send the OTP email", + appQuorumKey: str = Field(description="Quorum key for the TVC application") + + +class v1ReEncryptTvcQuorumKeyShareRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - alphanumeric: Optional[bool] = Field( - default=None, - description="Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). If set to false, OTP code will only be numeric. Default = true", + organizationId: str = Field( + description="Unique identifier for a given Organization." ) - sendFromEmailSenderName: Optional[str] = Field( - default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + parameters: v1ReEncryptTvcQuorumKeyShareIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1ReEncryptTvcQuorumKeyShareResult(TurnkeyBaseModel): + provisioningShareId: str = Field( + description="The unique identifier for the provisioning quorum key share" ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)", + + +class v1RecoverUserIntent(TurnkeyBaseModel): + authenticator: v1AuthenticatorParamsV2 = Field( + description="The new authenticator to register." ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + userId: str = Field( + description="Unique identifier for the user performing recovery." ) -class v1InitOtpRequest(TurnkeyBaseModel): +class v1RecoverUserRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -3393,73 +6736,94 @@ class v1InitOtpRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1InitOtpIntentV3 + parameters: v1RecoverUserIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1InitOtpResult(TurnkeyBaseModel): - otpId: str = Field(description="Unique identifier for an OTP authentication") +class v1RecoverUserResult(TurnkeyBaseModel): + authenticatorId: List[str] = Field(description="ID of the authenticator created.") -class v1InitOtpResultV2(TurnkeyBaseModel): - otpId: str = Field(description="Unique identifier for an OTP flow") - otpEncryptionTargetBundle: str = Field( - description="Signed bundle containing a target encryption key to use when submitting OTP codes." - ) +class v1RejectActivityIntent(TurnkeyBaseModel): + fingerprint: str = Field(description="An artifact verifying a User's action.") -class v1InitUserEmailRecoveryIntent(TurnkeyBaseModel): - email: str = Field(description="Email of the user starting recovery") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the recovery bundle will be encrypted." - ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used.", +class v1RejectActivityRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - emailCustomization: Optional[v1EmailCustomizationParams] = Field( - default=None, - description="Optional parameters for customizing emails. If not provided, the default email will be used.", + organizationId: str = Field( + description="Unique identifier for a given Organization." ) - sendFromEmailAddress: Optional[str] = Field( + parameters: v1RejectActivityIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1RemoveIpAllowlistIntent(TurnkeyBaseModel): + publicKey: Optional[str] = Field( default=None, - description="Optional custom email address from which to send the OTP email", + description="The public component of an API key. If null, removes the organization-level IP allowlist. If set, removes the IP allowlist for this specific API key.", ) - sendFromEmailSenderName: Optional[str] = Field( - default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + + +class v1RemoveIpAllowlistRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + organizationId: str = Field( + description="Unique identifier for a given Organization." ) + parameters: v1RemoveIpAllowlistIntent + generateAppProofs: Optional[bool] = Field(default=None) -class v1InitUserEmailRecoveryIntentV2(TurnkeyBaseModel): - email: str = Field(description="Email of the user starting recovery") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the recovery bundle will be encrypted." +class v1RemoveIpAllowlistResult(TurnkeyBaseModel): + pass + + +class v1RemoveOrganizationFeatureIntent(TurnkeyBaseModel): + name: v1FeatureName = Field(description="Name of the feature to remove") + + +class v1RemoveOrganizationFeatureRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used.", + organizationId: str = Field( + description="Unique identifier for a given Organization." ) - emailCustomization: v1EmailAuthCustomizationParams = Field( - description="Parameters for customizing emails. If not provided, the default email will be used. Note that `app_name` is required." + parameters: v1RemoveOrganizationFeatureIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1RemoveOrganizationFeatureResult(TurnkeyBaseModel): + features: List[v1Feature] = Field( + description="Resulting list of organization features." ) - sendFromEmailAddress: Optional[str] = Field( - default=None, - description="Optional custom email address from which to send the OTP email", + + +class v1RequiredAuthenticationMethod(TurnkeyBaseModel): + any: List[v1AuthenticationMethod] = Field( + description="A list of authentication methods for this MFA step. If only one method is provided, it is required. If multiple are provided, the user must satisfy ANY one of them." ) - sendFromEmailSenderName: Optional[str] = Field( - default=None, - description="Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'", + + +class v1RequiredAuthenticationMethodParams(TurnkeyBaseModel): + any: List[v1AuthenticationMethodParams] = Field( + description="A list of authentication methods for this MFA step. If only one method is provided, it is required. If multiple are provided, the user must satisfy ANY one of them." ) - replyToEmailAddress: Optional[str] = Field( - default=None, description="Optional custom email address to use as reply-to" + + +class v1RestoreTvcDeploymentIntent(TurnkeyBaseModel): + deploymentId: str = Field( + description="The unique identifier of the TVC deployment to restore." ) -class v1InitUserEmailRecoveryRequest(TurnkeyBaseModel): +class v1RestoreTvcDeploymentRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -3467,440 +6831,477 @@ class v1InitUserEmailRecoveryRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1InitUserEmailRecoveryIntentV2 + parameters: v1RestoreTvcDeploymentIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1InitUserEmailRecoveryResult(TurnkeyBaseModel): - userId: str = Field(description="Unique identifier for the user being recovered.") +class v1RestoreTvcDeploymentResult(TurnkeyBaseModel): + deploymentId: str = Field( + description="The unique identifier of the restored TVC deployment." + ) -class v1Intent(TurnkeyBaseModel): - createOrganizationIntent: Optional[v1CreateOrganizationIntent] = Field(default=None) - createAuthenticatorsIntent: Optional[v1CreateAuthenticatorsIntent] = Field( +class v1Result(TurnkeyBaseModel): + createOrganizationResult: Optional[v1CreateOrganizationResult] = Field(default=None) + createAuthenticatorsResult: Optional[v1CreateAuthenticatorsResult] = Field( default=None ) - createUsersIntent: Optional[v1CreateUsersIntent] = Field(default=None) - createPrivateKeysIntent: Optional[v1CreatePrivateKeysIntent] = Field(default=None) - signRawPayloadIntent: Optional[v1SignRawPayloadIntent] = Field(default=None) - createInvitationsIntent: Optional[v1CreateInvitationsIntent] = Field(default=None) - acceptInvitationIntent: Optional[v1AcceptInvitationIntent] = Field(default=None) - createPolicyIntent: Optional[v1CreatePolicyIntent] = Field(default=None) - disablePrivateKeyIntent: Optional[v1DisablePrivateKeyIntent] = Field(default=None) - deleteUsersIntent: Optional[v1DeleteUsersIntent] = Field(default=None) - deleteAuthenticatorsIntent: Optional[v1DeleteAuthenticatorsIntent] = Field( + createUsersResult: Optional[v1CreateUsersResult] = Field(default=None) + createPrivateKeysResult: Optional[v1CreatePrivateKeysResult] = Field(default=None) + createInvitationsResult: Optional[v1CreateInvitationsResult] = Field(default=None) + acceptInvitationResult: Optional[v1AcceptInvitationResult] = Field(default=None) + signRawPayloadResult: Optional[v1SignRawPayloadResult] = Field(default=None) + createPolicyResult: Optional[v1CreatePolicyResult] = Field(default=None) + disablePrivateKeyResult: Optional[v1DisablePrivateKeyResult] = Field(default=None) + deleteUsersResult: Optional[v1DeleteUsersResult] = Field(default=None) + deleteAuthenticatorsResult: Optional[v1DeleteAuthenticatorsResult] = Field( default=None ) - deleteInvitationIntent: Optional[v1DeleteInvitationIntent] = Field(default=None) - deleteOrganizationIntent: Optional[v1DeleteOrganizationIntent] = Field(default=None) - deletePolicyIntent: Optional[v1DeletePolicyIntent] = Field(default=None) - createUserTagIntent: Optional[v1CreateUserTagIntent] = Field(default=None) - deleteUserTagsIntent: Optional[v1DeleteUserTagsIntent] = Field(default=None) - signTransactionIntent: Optional[v1SignTransactionIntent] = Field(default=None) - createApiKeysIntent: Optional[v1CreateApiKeysIntent] = Field(default=None) - deleteApiKeysIntent: Optional[v1DeleteApiKeysIntent] = Field(default=None) - approveActivityIntent: Optional[v1ApproveActivityIntent] = Field(default=None) - rejectActivityIntent: Optional[v1RejectActivityIntent] = Field(default=None) - createPrivateKeyTagIntent: Optional[v1CreatePrivateKeyTagIntent] = Field( + deleteInvitationResult: Optional[v1DeleteInvitationResult] = Field(default=None) + deleteOrganizationResult: Optional[v1DeleteOrganizationResult] = Field(default=None) + deletePolicyResult: Optional[v1DeletePolicyResult] = Field(default=None) + createUserTagResult: Optional[v1CreateUserTagResult] = Field(default=None) + deleteUserTagsResult: Optional[v1DeleteUserTagsResult] = Field(default=None) + signTransactionResult: Optional[v1SignTransactionResult] = Field(default=None) + deleteApiKeysResult: Optional[v1DeleteApiKeysResult] = Field(default=None) + createApiKeysResult: Optional[v1CreateApiKeysResult] = Field(default=None) + createPrivateKeyTagResult: Optional[v1CreatePrivateKeyTagResult] = Field( + default=None + ) + deletePrivateKeyTagsResult: Optional[v1DeletePrivateKeyTagsResult] = Field( + default=None + ) + setPaymentMethodResult: Optional[billingSetPaymentMethodResult] = Field( default=None ) - deletePrivateKeyTagsIntent: Optional[v1DeletePrivateKeyTagsIntent] = Field( + activateBillingTierResult: Optional[billingActivateBillingTierResult] = Field( default=None ) - createPolicyIntentV2: Optional[v1CreatePolicyIntentV2] = Field(default=None) - setPaymentMethodIntent: Optional[billingSetPaymentMethodIntent] = Field( + deletePaymentMethodResult: Optional[billingDeletePaymentMethodResult] = Field( default=None ) - activateBillingTierIntent: Optional[billingActivateBillingTierIntent] = Field( + createApiOnlyUsersResult: Optional[v1CreateApiOnlyUsersResult] = Field(default=None) + updateRootQuorumResult: Optional[v1UpdateRootQuorumResult] = Field(default=None) + updateUserTagResult: Optional[v1UpdateUserTagResult] = Field(default=None) + updatePrivateKeyTagResult: Optional[v1UpdatePrivateKeyTagResult] = Field( default=None ) - deletePaymentMethodIntent: Optional[billingDeletePaymentMethodIntent] = Field( + createSubOrganizationResult: Optional[v1CreateSubOrganizationResult] = Field( default=None ) - createPolicyIntentV3: Optional[v1CreatePolicyIntentV3] = Field(default=None) - createApiOnlyUsersIntent: Optional[v1CreateApiOnlyUsersIntent] = Field(default=None) - updateRootQuorumIntent: Optional[v1UpdateRootQuorumIntent] = Field(default=None) - updateUserTagIntent: Optional[v1UpdateUserTagIntent] = Field(default=None) - updatePrivateKeyTagIntent: Optional[v1UpdatePrivateKeyTagIntent] = Field( + updateAllowedOriginsResult: Optional[v1UpdateAllowedOriginsResult] = Field( default=None ) - createAuthenticatorsIntentV2: Optional[v1CreateAuthenticatorsIntentV2] = Field( + createPrivateKeysResultV2: Optional[v1CreatePrivateKeysResultV2] = Field( default=None ) - acceptInvitationIntentV2: Optional[v1AcceptInvitationIntentV2] = Field(default=None) - createOrganizationIntentV2: Optional[v1CreateOrganizationIntentV2] = Field( + updateUserResult: Optional[v1UpdateUserResult] = Field(default=None) + updatePolicyResult: Optional[v1UpdatePolicyResult] = Field(default=None) + createSubOrganizationResultV3: Optional[v1CreateSubOrganizationResultV3] = Field( default=None ) - createUsersIntentV2: Optional[v1CreateUsersIntentV2] = Field(default=None) - createSubOrganizationIntent: Optional[v1CreateSubOrganizationIntent] = Field( + createWalletResult: Optional[v1CreateWalletResult] = Field(default=None) + createWalletAccountsResult: Optional[v1CreateWalletAccountsResult] = Field( default=None ) - createSubOrganizationIntentV2: Optional[v1CreateSubOrganizationIntentV2] = Field( + initUserEmailRecoveryResult: Optional[v1InitUserEmailRecoveryResult] = Field( default=None ) - updateAllowedOriginsIntent: Optional[v1UpdateAllowedOriginsIntent] = Field( + recoverUserResult: Optional[v1RecoverUserResult] = Field(default=None) + setOrganizationFeatureResult: Optional[v1SetOrganizationFeatureResult] = Field( default=None ) - createPrivateKeysIntentV2: Optional[v1CreatePrivateKeysIntentV2] = Field( + removeOrganizationFeatureResult: Optional[v1RemoveOrganizationFeatureResult] = ( + Field(default=None) + ) + exportPrivateKeyResult: Optional[v1ExportPrivateKeyResult] = Field(default=None) + exportWalletResult: Optional[v1ExportWalletResult] = Field(default=None) + createSubOrganizationResultV4: Optional[v1CreateSubOrganizationResultV4] = Field( default=None ) - updateUserIntent: Optional[v1UpdateUserIntent] = Field(default=None) - updatePolicyIntent: Optional[v1UpdatePolicyIntent] = Field(default=None) - setPaymentMethodIntentV2: Optional[billingSetPaymentMethodIntentV2] = Field( + emailAuthResult: Optional[v1EmailAuthResult] = Field(default=None) + exportWalletAccountResult: Optional[v1ExportWalletAccountResult] = Field( default=None ) - createSubOrganizationIntentV3: Optional[v1CreateSubOrganizationIntentV3] = Field( + initImportWalletResult: Optional[v1InitImportWalletResult] = Field(default=None) + importWalletResult: Optional[v1ImportWalletResult] = Field(default=None) + initImportPrivateKeyResult: Optional[v1InitImportPrivateKeyResult] = Field( default=None ) - createWalletIntent: Optional[v1CreateWalletIntent] = Field(default=None) - createWalletAccountsIntent: Optional[v1CreateWalletAccountsIntent] = Field( + importPrivateKeyResult: Optional[v1ImportPrivateKeyResult] = Field(default=None) + createPoliciesResult: Optional[v1CreatePoliciesResult] = Field(default=None) + signRawPayloadsResult: Optional[v1SignRawPayloadsResult] = Field(default=None) + createReadOnlySessionResult: Optional[v1CreateReadOnlySessionResult] = Field( default=None ) - initUserEmailRecoveryIntent: Optional[v1InitUserEmailRecoveryIntent] = Field( + createOauthProvidersResult: Optional[v1CreateOauthProvidersResult] = Field( default=None ) - recoverUserIntent: Optional[v1RecoverUserIntent] = Field(default=None) - setOrganizationFeatureIntent: Optional[v1SetOrganizationFeatureIntent] = Field( + deleteOauthProvidersResult: Optional[v1DeleteOauthProvidersResult] = Field( default=None ) - removeOrganizationFeatureIntent: Optional[v1RemoveOrganizationFeatureIntent] = ( - Field(default=None) + createSubOrganizationResultV5: Optional[v1CreateSubOrganizationResultV5] = Field( + default=None ) - signRawPayloadIntentV2: Optional[v1SignRawPayloadIntentV2] = Field(default=None) - signTransactionIntentV2: Optional[v1SignTransactionIntentV2] = Field(default=None) - exportPrivateKeyIntent: Optional[v1ExportPrivateKeyIntent] = Field(default=None) - exportWalletIntent: Optional[v1ExportWalletIntent] = Field(default=None) - createSubOrganizationIntentV4: Optional[v1CreateSubOrganizationIntentV4] = Field( + oauthResult: Optional[v1OauthResult] = Field(default=None) + createReadWriteSessionResult: Optional[v1CreateReadWriteSessionResult] = Field( default=None ) - emailAuthIntent: Optional[v1EmailAuthIntent] = Field(default=None) - exportWalletAccountIntent: Optional[v1ExportWalletAccountIntent] = Field( + createSubOrganizationResultV6: Optional[v1CreateSubOrganizationResultV6] = Field( default=None ) - initImportWalletIntent: Optional[v1InitImportWalletIntent] = Field(default=None) - importWalletIntent: Optional[v1ImportWalletIntent] = Field(default=None) - initImportPrivateKeyIntent: Optional[v1InitImportPrivateKeyIntent] = Field( + deletePrivateKeysResult: Optional[v1DeletePrivateKeysResult] = Field(default=None) + deleteWalletsResult: Optional[v1DeleteWalletsResult] = Field(default=None) + createReadWriteSessionResultV2: Optional[v1CreateReadWriteSessionResultV2] = Field( default=None ) - importPrivateKeyIntent: Optional[v1ImportPrivateKeyIntent] = Field(default=None) - createPoliciesIntent: Optional[v1CreatePoliciesIntent] = Field(default=None) - signRawPayloadsIntent: Optional[v1SignRawPayloadsIntent] = Field(default=None) - createReadOnlySessionIntent: Optional[v1CreateReadOnlySessionIntent] = Field( + deleteSubOrganizationResult: Optional[v1DeleteSubOrganizationResult] = Field( default=None ) - createOauthProvidersIntent: Optional[v1CreateOauthProvidersIntent] = Field( + initOtpAuthResult: Optional[v1InitOtpAuthResult] = Field(default=None) + otpAuthResult: Optional[v1OtpAuthResult] = Field(default=None) + createSubOrganizationResultV7: Optional[v1CreateSubOrganizationResultV7] = Field( default=None ) - deleteOauthProvidersIntent: Optional[v1DeleteOauthProvidersIntent] = Field( + updateWalletResult: Optional[v1UpdateWalletResult] = Field(default=None) + updatePolicyResultV2: Optional[v1UpdatePolicyResultV2] = Field(default=None) + initOtpAuthResultV2: Optional[v1InitOtpAuthResultV2] = Field(default=None) + initOtpResult: Optional[v1InitOtpResult] = Field(default=None) + verifyOtpResult: Optional[v1VerifyOtpResult] = Field(default=None) + otpLoginResult: Optional[v1OtpLoginResult] = Field(default=None) + stampLoginResult: Optional[v1StampLoginResult] = Field(default=None) + oauthLoginResult: Optional[v1OauthLoginResult] = Field(default=None) + updateUserNameResult: Optional[v1UpdateUserNameResult] = Field(default=None) + updateUserEmailResult: Optional[v1UpdateUserEmailResult] = Field(default=None) + updateUserPhoneNumberResult: Optional[v1UpdateUserPhoneNumberResult] = Field( default=None ) - createSubOrganizationIntentV5: Optional[v1CreateSubOrganizationIntentV5] = Field( + initFiatOnRampResult: Optional[v1InitFiatOnRampResult] = Field(default=None) + createSmartContractInterfaceResult: Optional[ + v1CreateSmartContractInterfaceResult + ] = Field(default=None) + deleteSmartContractInterfaceResult: Optional[ + v1DeleteSmartContractInterfaceResult + ] = Field(default=None) + enableAuthProxyResult: Optional[v1EnableAuthProxyResult] = Field(default=None) + disableAuthProxyResult: Optional[v1DisableAuthProxyResult] = Field(default=None) + updateAuthProxyConfigResult: Optional[v1UpdateAuthProxyConfigResult] = Field( default=None ) - oauthIntent: Optional[v1OauthIntent] = Field(default=None) - createApiKeysIntentV2: Optional[v1CreateApiKeysIntentV2] = Field(default=None) - createReadWriteSessionIntent: Optional[v1CreateReadWriteSessionIntent] = Field( + createOauth2CredentialResult: Optional[v1CreateOauth2CredentialResult] = Field( default=None ) - emailAuthIntentV2: Optional[v1EmailAuthIntentV2] = Field(default=None) - createSubOrganizationIntentV6: Optional[v1CreateSubOrganizationIntentV6] = Field( + updateOauth2CredentialResult: Optional[v1UpdateOauth2CredentialResult] = Field( default=None ) - deletePrivateKeysIntent: Optional[v1DeletePrivateKeysIntent] = Field(default=None) - deleteWalletsIntent: Optional[v1DeleteWalletsIntent] = Field(default=None) - createReadWriteSessionIntentV2: Optional[v1CreateReadWriteSessionIntentV2] = Field( + deleteOauth2CredentialResult: Optional[v1DeleteOauth2CredentialResult] = Field( default=None ) - deleteSubOrganizationIntent: Optional[v1DeleteSubOrganizationIntent] = Field( + oauth2AuthenticateResult: Optional[v1Oauth2AuthenticateResult] = Field(default=None) + deleteWalletAccountsResult: Optional[v1DeleteWalletAccountsResult] = Field( default=None ) - initOtpAuthIntent: Optional[v1InitOtpAuthIntent] = Field(default=None) - otpAuthIntent: Optional[v1OtpAuthIntent] = Field(default=None) - createSubOrganizationIntentV7: Optional[v1CreateSubOrganizationIntentV7] = Field( + deletePoliciesResult: Optional[v1DeletePoliciesResult] = Field(default=None) + ethSendRawTransactionResult: Optional[v1EthSendRawTransactionResult] = Field( default=None ) - updateWalletIntent: Optional[v1UpdateWalletIntent] = Field(default=None) - updatePolicyIntentV2: Optional[v1UpdatePolicyIntentV2] = Field(default=None) - createUsersIntentV3: Optional[v1CreateUsersIntentV3] = Field(default=None) - initOtpAuthIntentV2: Optional[v1InitOtpAuthIntentV2] = Field(default=None) - initOtpIntent: Optional[v1InitOtpIntent] = Field(default=None) - verifyOtpIntent: Optional[v1VerifyOtpIntent] = Field(default=None) - otpLoginIntent: Optional[v1OtpLoginIntent] = Field(default=None) - stampLoginIntent: Optional[v1StampLoginIntent] = Field(default=None) - oauthLoginIntent: Optional[v1OauthLoginIntent] = Field(default=None) - updateUserNameIntent: Optional[v1UpdateUserNameIntent] = Field(default=None) - updateUserEmailIntent: Optional[v1UpdateUserEmailIntent] = Field(default=None) - updateUserPhoneNumberIntent: Optional[v1UpdateUserPhoneNumberIntent] = Field( + createFiatOnRampCredentialResult: Optional[v1CreateFiatOnRampCredentialResult] = ( + Field(default=None) + ) + updateFiatOnRampCredentialResult: Optional[v1UpdateFiatOnRampCredentialResult] = ( + Field(default=None) + ) + deleteFiatOnRampCredentialResult: Optional[v1DeleteFiatOnRampCredentialResult] = ( + Field(default=None) + ) + ethSendTransactionResult: Optional[v1EthSendTransactionResult] = Field(default=None) + upsertGasUsageConfigResult: Optional[v1UpsertGasUsageConfigResult] = Field( default=None ) - initFiatOnRampIntent: Optional[v1InitFiatOnRampIntent] = Field(default=None) - createSmartContractInterfaceIntent: Optional[ - v1CreateSmartContractInterfaceIntent - ] = Field(default=None) - deleteSmartContractInterfaceIntent: Optional[ - v1DeleteSmartContractInterfaceIntent - ] = Field(default=None) - enableAuthProxyIntent: Optional[v1EnableAuthProxyIntent] = Field(default=None) - disableAuthProxyIntent: Optional[v1DisableAuthProxyIntent] = Field(default=None) - updateAuthProxyConfigIntent: Optional[v1UpdateAuthProxyConfigIntent] = Field( + createTvcAppResult: Optional[v1CreateTvcAppResult] = Field(default=None) + createTvcDeploymentResult: Optional[v1CreateTvcDeploymentResult] = Field( default=None ) - createOauth2CredentialIntent: Optional[v1CreateOauth2CredentialIntent] = Field( + createTvcManifestApprovalsResult: Optional[v1CreateTvcManifestApprovalsResult] = ( + Field(default=None) + ) + solSendTransactionResult: Optional[v1SolSendTransactionResult] = Field(default=None) + initOtpResultV2: Optional[v1InitOtpResultV2] = Field(default=None) + updateOrganizationNameResult: Optional[v1UpdateOrganizationNameResult] = Field( default=None ) - updateOauth2CredentialIntent: Optional[v1UpdateOauth2CredentialIntent] = Field( + createSubOrganizationResultV8: Optional[v1CreateSubOrganizationResultV8] = Field( default=None ) - deleteOauth2CredentialIntent: Optional[v1DeleteOauth2CredentialIntent] = Field( + createOauthProvidersResultV2: Optional[v1CreateOauthProvidersResultV2] = Field( default=None ) - oauth2AuthenticateIntent: Optional[v1Oauth2AuthenticateIntent] = Field(default=None) - deleteWalletAccountsIntent: Optional[v1DeleteWalletAccountsIntent] = Field( + createWebhookEndpointResult: Optional[v1CreateWebhookEndpointResult] = Field( default=None ) - deletePoliciesIntent: Optional[v1DeletePoliciesIntent] = Field(default=None) - ethSendRawTransactionIntent: Optional[v1EthSendRawTransactionIntent] = Field( + updateWebhookEndpointResult: Optional[v1UpdateWebhookEndpointResult] = Field( default=None ) - ethSendTransactionIntent: Optional[v1EthSendTransactionIntent] = Field(default=None) - createFiatOnRampCredentialIntent: Optional[v1CreateFiatOnRampCredentialIntent] = ( - Field(default=None) + deleteWebhookEndpointResult: Optional[v1DeleteWebhookEndpointResult] = Field( + default=None ) - updateFiatOnRampCredentialIntent: Optional[v1UpdateFiatOnRampCredentialIntent] = ( + setIpAllowlistResult: Optional[v1SetIpAllowlistResult] = Field(default=None) + removeIpAllowlistResult: Optional[v1RemoveIpAllowlistResult] = Field(default=None) + updateTvcAppLiveDeploymentResult: Optional[v1UpdateTvcAppLiveDeploymentResult] = ( Field(default=None) ) - deleteFiatOnRampCredentialIntent: Optional[v1DeleteFiatOnRampCredentialIntent] = ( + deleteTvcDeploymentResult: Optional[v1DeleteTvcDeploymentResult] = Field( + default=None + ) + deleteTvcAppAndDeploymentsResult: Optional[v1DeleteTvcAppAndDeploymentsResult] = ( Field(default=None) ) - emailAuthIntentV3: Optional[v1EmailAuthIntentV3] = Field(default=None) - initUserEmailRecoveryIntentV2: Optional[v1InitUserEmailRecoveryIntentV2] = Field( + restoreTvcDeploymentResult: Optional[v1RestoreTvcDeploymentResult] = Field( default=None ) - initOtpIntentV2: Optional[v1InitOtpIntentV2] = Field(default=None) - initOtpAuthIntentV3: Optional[v1InitOtpAuthIntentV3] = Field(default=None) - upsertGasUsageConfigIntent: Optional[v1UpsertGasUsageConfigIntent] = Field( + sparkSignFrostResult: Optional[v1SparkSignFrostResult] = Field(default=None) + sparkPrepareTransferResult: Optional[v1SparkPrepareTransferResult] = Field( default=None ) - createTvcAppIntent: Optional[v1CreateTvcAppIntent] = Field(default=None) - createTvcDeploymentIntent: Optional[v1CreateTvcDeploymentIntent] = Field( + sparkClaimTransferResult: Optional[v1SparkClaimTransferResult] = Field(default=None) + sparkPrepareLightningReceiveResult: Optional[ + v1SparkPrepareLightningReceiveResult + ] = Field(default=None) + postTvcQuorumKeyShareResult: Optional[v1PostTvcQuorumKeyShareResult] = Field( default=None ) - createTvcManifestApprovalsIntent: Optional[v1CreateTvcManifestApprovalsIntent] = ( + ethSendTransactionResultV2: Optional[v1EthSendTransactionResultV2] = Field( + default=None + ) + createMfaPolicyResult: Optional[v1CreateMfaPolicyResult] = Field(default=None) + updateMfaPolicyResult: Optional[v1UpdateMfaPolicyResult] = Field(default=None) + deleteMfaPolicyResult: Optional[v1DeleteMfaPolicyResult] = Field(default=None) + createSessionProfileResult: Optional[v1CreateSessionProfileResult] = Field( + default=None + ) + earnDeployWrapperResult: Optional[v1EarnDeployWrapperResult] = Field(default=None) + earnDepositResult: Optional[v1EarnDepositResult] = Field(default=None) + earnWithdrawResult: Optional[v1EarnWithdrawResult] = Field(default=None) + executeSwapResult: Optional[v1ExecuteSwapResult] = Field(default=None) + upsertSwapConfigResult: Optional[v1UpsertSwapConfigResult] = Field(default=None) + createTvcOperatorResult: Optional[v1CreateTvcOperatorResult] = Field(default=None) + createTvcQuorumKeyResult: Optional[v1CreateTvcQuorumKeyResult] = Field(default=None) + reEncryptTvcQuorumKeyShareResult: Optional[v1ReEncryptTvcQuorumKeyShareResult] = ( Field(default=None) ) - solSendTransactionIntent: Optional[v1SolSendTransactionIntent] = Field(default=None) - initOtpIntentV3: Optional[v1InitOtpIntentV3] = Field(default=None) - verifyOtpIntentV2: Optional[v1VerifyOtpIntentV2] = Field(default=None) - otpLoginIntentV2: Optional[v1OtpLoginIntentV2] = Field(default=None) - updateOrganizationNameIntent: Optional[v1UpdateOrganizationNameIntent] = Field( + initImportSecretsResult: Optional[v1InitImportSecretsResult] = Field(default=None) + solSendTransactionResultV2: Optional[v1SolSendTransactionResultV2] = Field( default=None ) - - -class v1InvitationParams(TurnkeyBaseModel): - receiverUserName: str = Field( - description="The name of the intended Invitation recipient." + claimSwapFeesResult: Optional[v1ClaimSwapFeesResult] = Field(default=None) + earnSetWrapperStateResult: Optional[v1EarnSetWrapperStateResult] = Field( + default=None ) - receiverUserEmail: str = Field( - description="The email address of the intended Invitation recipient." + claimEarnFeesResult: Optional[v1ClaimEarnFeesResult] = Field(default=None) + updateWalletAccountNameResult: Optional[v1UpdateWalletAccountNameResult] = Field( + default=None ) - receiverUserTags: List[str] = Field( - description="A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body." + ethUndelegate7702Result: Optional[v1EthUndelegate7702Result] = Field(default=None) + createSwapQuoteResult: Optional[v1CreateSwapQuoteResult] = Field(default=None) + importSecretsResult: Optional[v1ImportSecretsResult] = Field(default=None) + exportSecretsResult: Optional[v1ExportSecretsResult] = Field(default=None) + createVelocityControlResult: Optional[v1CreateVelocityControlResult] = Field( + default=None ) - accessType: v1AccessType = Field( - description="The User's permissible access method(s)." + deleteVelocityControlsResult: Optional[v1DeleteVelocityControlsResult] = Field( + default=None ) - senderUserId: str = Field( - description="Unique identifier for the Sender of an Invitation." + updatePaymentMethodResult: Optional[billingUpdatePaymentMethodResult] = Field( + default=None ) - - -class v1ListFiatOnRampCredentialsRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given Organization." + deleteSecretsResult: Optional[v1DeleteSecretsResult] = Field(default=None) + earnClaimRewardsResult: Optional[v1EarnClaimRewardsResult] = Field(default=None) + createSwapQuoteResultV2: Optional[v1CreateSwapQuoteResultV2] = Field(default=None) + upsertSwapFeeSponsorshipLimitConfigResult: Optional[ + v1UpsertSwapFeeSponsorshipLimitConfigResult + ] = Field(default=None) + upsertSwapFixedRateLimitConfigResult: Optional[ + v1UpsertSwapFixedRateLimitConfigResult + ] = Field(default=None) + createFiatOnRampSessionResult: Optional[v1CreateFiatOnRampSessionResult] = Field( + default=None ) -class v1ListFiatOnRampCredentialsResponse(TurnkeyBaseModel): - fiatOnRampCredentials: List[v1FiatOnRampCredential] - - -class v1ListOauth2CredentialsRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given Organization." +class v1RevertChainEntry(TurnkeyBaseModel): + address: Optional[str] = Field( + default=None, description="The contract address where the revert occurred." + ) + errorType: Optional[str] = Field( + default=None, description="Type of error: 'unknown', 'native', or 'custom'." + ) + displayMessage: Optional[str] = Field( + default=None, description="Human-readable message describing this revert." + ) + unknown: Optional[v1UnknownRevertError] = Field( + default=None, description="Details for unknown error types." + ) + native: Optional[v1NativeRevertError] = Field( + default=None, + description="Details for native Solidity errors (Error, Panic, execution reverted).", ) - - -class v1ListOauth2CredentialsResponse(TurnkeyBaseModel): - oauth2Credentials: List[v1Oauth2Credential] - - -class v1ListPrivateKeyTagsRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." + custom: Optional[v1CustomRevertError] = Field( + default=None, description="Details for custom contract errors." ) -class v1ListPrivateKeyTagsResponse(TurnkeyBaseModel): - privateKeyTags: List[datav1Tag] = Field(description="A list of private key tags.") - - -class v1ListSupportedAssetsRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." +class v1RootUserParams(TurnkeyBaseModel): + userName: str = Field(description="Human-readable name for a User.") + userEmail: Optional[str] = Field( + default=None, description="The user's email address." ) - caip2: str = Field( - description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." + apiKeys: List[apiApiKeyParams] = Field( + description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." ) - - -class v1ListSupportedAssetsResponse(TurnkeyBaseModel): - assets: Optional[List[v1AssetMetadata]] = Field( - default=None, description="List of asset metadata" + authenticators: List[v1AuthenticatorParamsV2] = Field( + description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." ) -class v1ListUserTagsRequest(TurnkeyBaseModel): - organizationId: str = Field( - description="Unique identifier for a given organization." +class v1RootUserParamsV2(TurnkeyBaseModel): + userName: str = Field(description="Human-readable name for a User.") + userEmail: Optional[str] = Field( + default=None, description="The user's email address." ) - - -class v1ListUserTagsResponse(TurnkeyBaseModel): - userTags: List[datav1Tag] = Field(description="A list of user tags.") - - -class v1LoginUsage(TurnkeyBaseModel): - publicKey: str = Field(description="Public key for authentication") - - -class v1MnemonicLanguage(str, Enum): - MNEMONIC_LANGUAGE_ENGLISH = "MNEMONIC_LANGUAGE_ENGLISH" - MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE = "MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE" - MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE = "MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE" - MNEMONIC_LANGUAGE_CZECH = "MNEMONIC_LANGUAGE_CZECH" - MNEMONIC_LANGUAGE_FRENCH = "MNEMONIC_LANGUAGE_FRENCH" - MNEMONIC_LANGUAGE_ITALIAN = "MNEMONIC_LANGUAGE_ITALIAN" - MNEMONIC_LANGUAGE_JAPANESE = "MNEMONIC_LANGUAGE_JAPANESE" - MNEMONIC_LANGUAGE_KOREAN = "MNEMONIC_LANGUAGE_KOREAN" - MNEMONIC_LANGUAGE_SPANISH = "MNEMONIC_LANGUAGE_SPANISH" - - -class v1NOOPCodegenAnchorResponse(TurnkeyBaseModel): - stamp: v1WebAuthnStamp - tokenUsage: Optional[v1TokenUsage] = Field(default=None) - - -class v1NativeRevertError(TurnkeyBaseModel): - nativeType: Optional[str] = Field( - default=None, - description="The type of native error: 'error_string', 'panic', or 'execution_reverted'.", + apiKeys: List[apiApiKeyParams] = Field( + description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." ) - message: Optional[str] = Field( - default=None, description="The error message for Error(string) reverts." + authenticators: List[v1AuthenticatorParamsV2] = Field( + description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." ) - panicCode: Optional[str] = Field( - default=None, description="The panic code for Panic(uint256) reverts." + oauthProviders: List[v1OauthProviderParams] = Field( + description="A list of Oauth providers. This field, if not needed, should be an empty array in your request body." ) -class v1Oauth2AuthenticateIntent(TurnkeyBaseModel): - oauth2CredentialId: str = Field( - description="The OAuth 2.0 credential id whose client_id and client_secret will be used in the OAuth 2.0 flow" +class v1RootUserParamsV3(TurnkeyBaseModel): + userName: str = Field(description="Human-readable name for a User.") + userEmail: Optional[str] = Field( + default=None, description="The user's email address." ) - authCode: str = Field( - description="The auth_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow" + apiKeys: List[v1ApiKeyParamsV2] = Field( + description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." ) - redirectUri: str = Field( - description="The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider" + authenticators: List[v1AuthenticatorParamsV2] = Field( + description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." ) - codeVerifier: str = Field( - description="The code verifier used by OAuth 2.0 PKCE providers" + oauthProviders: List[v1OauthProviderParams] = Field( + description="A list of Oauth providers. This field, if not needed, should be an empty array in your request body." ) - nonce: Optional[str] = Field( - default=None, - description="An optional nonce used by the client to prevent replay/substitution of an ID token", + + +class v1RootUserParamsV4(TurnkeyBaseModel): + userName: str = Field(description="Human-readable name for a User.") + userEmail: Optional[str] = Field( + default=None, description="The user's email address." ) - bearerTokenTargetPublicKey: Optional[str] = Field( + userPhoneNumber: Optional[str] = Field( default=None, - description="An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token", + description="The user's phone number in E.164 format e.g. +13214567890", ) - - -class v1Oauth2AuthenticateRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + apiKeys: List[v1ApiKeyParamsV2] = Field( + description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + authenticators: List[v1AuthenticatorParamsV2] = Field( + description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + ) + oauthProviders: List[v1OauthProviderParams] = Field( + description="A list of Oauth providers. This field, if not needed, should be an empty array in your request body." ) - parameters: v1Oauth2AuthenticateIntent - generateAppProofs: Optional[bool] = Field(default=None) -class v1Oauth2AuthenticateResult(TurnkeyBaseModel): - oidcToken: str = Field( - description="Base64 encoded OIDC token issued by Turnkey to be used with the LoginWithOAuth activity" +class v1RootUserParamsV5(TurnkeyBaseModel): + userName: str = Field(description="Human-readable name for a User.") + userEmail: Optional[str] = Field( + default=None, description="The user's email address." + ) + userPhoneNumber: Optional[str] = Field( + default=None, + description="The user's phone number in E.164 format e.g. +13214567890", + ) + apiKeys: List[v1ApiKeyParamsV2] = Field( + description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + ) + authenticators: List[v1AuthenticatorParamsV2] = Field( + description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + ) + oauthProviders: List[v1OauthProviderParamsV2] = Field( + description="A list of Oauth providers. This field, if not needed, should be an empty array in your request body." ) -class v1Oauth2Credential(TurnkeyBaseModel): - oauth2CredentialId: str = Field( - description="Unique identifier for a given OAuth 2.0 Credential." +class v1SecretMetadata(TurnkeyBaseModel): + secretId: str = Field(description="Unique identifier for the secret.") + name: Optional[str] = Field( + default=None, description="Optional human-readable name for the secret." ) - organizationId: str = Field(description="Unique identifier for an Organization.") - provider: v1Oauth2Provider = Field( - description="The provider for a given OAuth 2.0 Credential." + staticProperties: List[v1KeyValue] = Field( + description="Policy visible static properties bound to the secret at creation time." ) - clientId: str = Field(description="The client id for a given OAuth 2.0 Credential.") - encryptedClientSecret: str = Field( - description="The encrypted client secret for a given OAuth 2.0 Credential encrypted to the TLS Fetcher quorum key." + createdAtUnixMs: str = Field( + description="Unix timestamp in milliseconds for when the secret was created." ) - createdAt: externaldatav1Timestamp - updatedAt: externaldatav1Timestamp -class v1Oauth2Provider(str, Enum): - OAUTH2_PROVIDER_X = "OAUTH2_PROVIDER_X" - OAUTH2_PROVIDER_DISCORD = "OAUTH2_PROVIDER_DISCORD" +class v1Selector(TurnkeyBaseModel): + subject: Optional[str] = Field(default=None) + operator: Optional[v1Operator] = Field(default=None) + target: Optional[str] = Field(default=None) -class v1OauthIntent(TurnkeyBaseModel): - oidcToken: str = Field(description="Base64 encoded OIDC token") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted." +class v1SelectorV2(TurnkeyBaseModel): + subject: Optional[str] = Field(default=None) + operator: Optional[v1Operator] = Field(default=None) + targets: Optional[List[str]] = Field(default=None) + + +class v1SessionProfile(TurnkeyBaseModel): + sessionProfileId: str = Field( + description="Unique identifier for a given Session Profile." ) - apiKeyName: Optional[str] = Field( - default=None, - description="Optional human-readable name for an API Key. If none provided, default to Oauth - ", + sessionProfileName: str = Field( + description="Human-readable name for a Session Profile." + ) + scope: str = Field( + description="The specific scope that a session created with this profile is limited to." ) expirationSeconds: Optional[str] = Field( default=None, - description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", + description="Optional window (in seconds) indicating how long sessions created with this profile should last.", ) - invalidateExisting: Optional[bool] = Field( + notes: Optional[str] = Field( default=None, - description="Invalidate all other previously generated Oauth API keys", + description="Optional human-readable notes added by a User to describe a particular Session Profile.", ) + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp -class v1OauthLoginIntent(TurnkeyBaseModel): - oidcToken: str = Field(description="Base64 encoded OIDC token") - publicKey: str = Field( - description="Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request" +class v1SetIpAllowlistIntent(TurnkeyBaseModel): + publicKey: Optional[str] = Field( + default=None, + description="The public component of an API key. If null, the IP allowlist applies at the organization level. If set, it applies only to this specific API key.", ) - expirationSeconds: Optional[str] = Field( + enabled: Optional[bool] = Field( default=None, - description="Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.", + description="Whether the IP allowlist is enabled. Only meaningful for organization-level allowlists. Omit for API key-level allowlists.", ) - invalidateExisting: Optional[bool] = Field( + rules: Optional[List[v1IpAllowlistIntentRule]] = Field( default=None, - description="Invalidate all other previously generated Login API keys", + description="List of IP allowlist rules with CIDR blocks and optional labels.", + ) + onEvaluationError: Optional[str] = Field( + default=None, + description="Behavior when an error occurs during IP allowlist evaluation. Valid values: ALLOW, DENY. Defaults to DENY.", ) -class v1OauthLoginRequest(TurnkeyBaseModel): +class v1SetIpAllowlistRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -3908,38 +7309,22 @@ class v1OauthLoginRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1OauthLoginIntent + parameters: v1SetIpAllowlistIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1OauthLoginResult(TurnkeyBaseModel): - session: str = Field( - description="Signed JWT containing an expiry, public key, session type, user id, and organization id" - ) +class v1SetIpAllowlistResult(TurnkeyBaseModel): + pass -class v1OauthProvider(TurnkeyBaseModel): - providerId: str = Field(description="Unique identifier for an OAuth Provider") - providerName: str = Field(description="Human-readable name to identify a Provider.") - issuer: str = Field( - description="The issuer of the token, typically a URL indicating the authentication server, e.g https://accounts.google.com" - ) - audience: str = Field( - description="Expected audience ('aud' attribute of the signed token) which represents the app ID" - ) - subject: str = Field( - description="Expected subject ('sub' attribute of the signed token) which represents the user ID" +class v1SetOrganizationFeatureIntent(TurnkeyBaseModel): + name: v1FeatureName = Field(description="Name of the feature to set") + value: str = Field( + description="Optional value for the feature. Will override existing values if feature is already set." ) - createdAt: externaldatav1Timestamp - updatedAt: externaldatav1Timestamp - - -class v1OauthProviderParams(TurnkeyBaseModel): - providerName: str = Field(description="Human-readable name to identify a Provider.") - oidcToken: str = Field(description="Base64 encoded OIDC token") -class v1OauthRequest(TurnkeyBaseModel): +class v1SetOrganizationFeatureRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -3947,53 +7332,45 @@ class v1OauthRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1OauthIntent + parameters: v1SetOrganizationFeatureIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1OauthResult(TurnkeyBaseModel): - userId: str = Field(description="Unique identifier for the authenticating User.") - apiKeyId: str = Field(description="Unique identifier for the created API key.") - credentialBundle: str = Field(description="HPKE encrypted credential bundle") +class v1SetOrganizationFeatureResult(TurnkeyBaseModel): + features: List[v1Feature] = Field( + description="Resulting list of organization features." + ) -class v1Operator(str, Enum): - OPERATOR_EQUAL = "OPERATOR_EQUAL" - OPERATOR_MORE_THAN = "OPERATOR_MORE_THAN" - OPERATOR_MORE_THAN_OR_EQUAL = "OPERATOR_MORE_THAN_OR_EQUAL" - OPERATOR_LESS_THAN = "OPERATOR_LESS_THAN" - OPERATOR_LESS_THAN_OR_EQUAL = "OPERATOR_LESS_THAN_OR_EQUAL" - OPERATOR_CONTAINS = "OPERATOR_CONTAINS" - OPERATOR_NOT_EQUAL = "OPERATOR_NOT_EQUAL" - OPERATOR_IN = "OPERATOR_IN" - OPERATOR_NOT_IN = "OPERATOR_NOT_IN" - OPERATOR_CONTAINS_ONE = "OPERATOR_CONTAINS_ONE" - OPERATOR_CONTAINS_ALL = "OPERATOR_CONTAINS_ALL" +class v1SignRawPayloadIntent(TurnkeyBaseModel): + privateKeyId: str = Field(description="Unique identifier for a given Private Key.") + payload: str = Field(description="Raw unsigned payload to be signed.") + encoding: v1PayloadEncoding = Field( + description="Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." + ) + hashFunction: v1HashFunction = Field( + description="Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + ) -class v1OtpAuthIntent(TurnkeyBaseModel): - otpId: str = Field( - description="ID representing the result of an init OTP activity." - ) - otpCode: str = Field(description="OTP sent out to a user's contact (email or SMS)") - targetPublicKey: str = Field( - description="Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted." +class v1SignRawPayloadIntentV2(TurnkeyBaseModel): + signWith: str = Field( + description="A Wallet account address, Private Key address, or Private Key identifier." ) - apiKeyName: Optional[str] = Field( - default=None, - description="Optional human-readable name for an API Key. If none provided, default to OTP Auth - ", + payload: str = Field(description="Raw unsigned payload to be signed.") + encoding: v1PayloadEncoding = Field( + description="Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used.", + hashFunction: v1HashFunction = Field( + description="Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." ) - invalidateExisting: Optional[bool] = Field( + externalSignerPubkey: Optional[str] = Field( default=None, - description="Invalidate all other previously generated OTP Auth API keys", + description="The public key of the external signer to use for signing the payload.", ) -class v1OtpAuthRequest(TurnkeyBaseModel): +class v1SignRawPayloadRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -4001,62 +7378,78 @@ class v1OtpAuthRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1OtpAuthIntent + parameters: v1SignRawPayloadIntentV2 generateAppProofs: Optional[bool] = Field(default=None) -class v1OtpAuthResult(TurnkeyBaseModel): - userId: str = Field(description="Unique identifier for the authenticating User.") - apiKeyId: Optional[str] = Field( - default=None, description="Unique identifier for the created API key." +class v1SignRawPayloadResult(TurnkeyBaseModel): + r: str = Field( + description="Component of a cryptographic signature, meaning varies based on signing scheme." ) - credentialBundle: Optional[str] = Field( - default=None, description="HPKE encrypted credential bundle" + s: str = Field( + description="Component of a cryptographic signature, meaning varies based on signing scheme." ) + v: str = Field(description='Recovery ID for ECDSA signatures, "00" otherwise.') -class v1OtpLoginIntent(TurnkeyBaseModel): - verificationToken: str = Field( - description="Signed JWT containing a unique id, expiry, verification type, contact" +class v1SignRawPayloadsIntent(TurnkeyBaseModel): + signWith: str = Field( + description="A Wallet account address, Private Key address, or Private Key identifier." ) - publicKey: str = Field( - description="Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token" + payloads: List[str] = Field( + description="An array of raw unsigned payloads to be signed." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.", + encoding: v1PayloadEncoding = Field( + description="Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." ) - invalidateExisting: Optional[bool] = Field( - default=None, - description="Invalidate all other previously generated Login API keys", + hashFunction: v1HashFunction = Field( + description="Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." ) - clientSignature: Optional[v1ClientSignature] = Field( + externalSignerPubkey: Optional[str] = Field( default=None, - description="Optional signature proving authorization for this login. The signature is over the verification token ID and the public key. Only required if a public key was provided during the verification step.", + description="The public key of the external signer to use for signing the payloads.", ) -class v1OtpLoginIntentV2(TurnkeyBaseModel): - verificationToken: str = Field( - description="Signed Verification Token containing a unique id, expiry, verification type, contact" +class v1SignRawPayloadsRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - publicKey: str = Field( - description="Client-side public key generated by the user, used as the session public key upon successful login" + organizationId: str = Field( + description="Unique identifier for a given Organization." ) - clientSignature: v1ClientSignature = Field( - description="Required signature proving authorization for this login. The signature is over the verification token ID and the public key. Required for secure OTP login process." + parameters: v1SignRawPayloadsIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1SignRawPayloadsResult(TurnkeyBaseModel): + signatures: Optional[List[v1SignRawPayloadResult]] = Field(default=None) + + +class v1SignTransactionIntent(TurnkeyBaseModel): + privateKeyId: str = Field(description="Unique identifier for a given Private Key.") + unsignedTransaction: str = Field( + description="Raw unsigned transaction to be signed by a particular Private Key." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.", + type: v1TransactionType + + +class v1SignTransactionIntentV2(TurnkeyBaseModel): + signWith: str = Field( + description="A Wallet account address, Private Key address, or Private Key identifier." ) - invalidateExisting: Optional[bool] = Field( + unsignedTransaction: str = Field( + description="Raw unsigned transaction to be signed" + ) + type: v1TransactionType + externalSignerPubkey: Optional[str] = Field( default=None, - description="Invalidate all other previously generated Login sessions", + description="The public key of the external signer to use for signing this transaction.", ) -class v1OtpLoginRequest(TurnkeyBaseModel): +class v1SignTransactionRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -4064,150 +7457,89 @@ class v1OtpLoginRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1OtpLoginIntentV2 + parameters: v1SignTransactionIntentV2 generateAppProofs: Optional[bool] = Field(default=None) -class v1OtpLoginResult(TurnkeyBaseModel): - session: str = Field( - description="Signed JWT containing an expiry, public key, session type, user id, and organization id" - ) +class v1SignTransactionResult(TurnkeyBaseModel): + signedTransaction: str -class v1Outcome(str, Enum): - OUTCOME_ALLOW = "OUTCOME_ALLOW" - OUTCOME_DENY_EXPLICIT = "OUTCOME_DENY_EXPLICIT" - OUTCOME_DENY_IMPLICIT = "OUTCOME_DENY_IMPLICIT" - OUTCOME_REQUIRES_CONSENSUS = "OUTCOME_REQUIRES_CONSENSUS" - OUTCOME_REJECTED = "OUTCOME_REJECTED" - OUTCOME_ERROR = "OUTCOME_ERROR" +class v1SignupUsage(TurnkeyBaseModel): + email: Optional[str] = Field(default=None) + phoneNumber: Optional[str] = Field(default=None) + apiKeys: Optional[List[v1ApiKeyParamsV2]] = Field(default=None) + authenticators: Optional[List[v1AuthenticatorParamsV2]] = Field(default=None) + oauthProviders: Optional[List[v1OauthProviderParams]] = Field(default=None) -class v1Pagination(TurnkeyBaseModel): - limit: Optional[str] = Field( - default=None, - description="A limit of the number of object to be returned, between 1 and 100. Defaults to 10.", - ) - before: Optional[str] = Field( - default=None, - description="A pagination cursor. This is an object ID that enables you to fetch all objects before this ID.", - ) - after: Optional[str] = Field( - default=None, - description="A pagination cursor. This is an object ID that enables you to fetch all objects after this ID.", - ) +class v1SignupUsageV2(TurnkeyBaseModel): + email: Optional[str] = Field(default=None) + phoneNumber: Optional[str] = Field(default=None) + apiKeys: Optional[List[v1ApiKeyParamsV2]] = Field(default=None) + authenticators: Optional[List[v1AuthenticatorParamsV2]] = Field(default=None) + oauthProviders: Optional[List[v1OauthProviderParamsV2]] = Field(default=None) -class v1PathFormat(str, Enum): - PATH_FORMAT_BIP32 = "PATH_FORMAT_BIP32" +class v1SimpleClientExtensionResults(TurnkeyBaseModel): + appid: Optional[bool] = Field(default=None) + appidExclude: Optional[bool] = Field(default=None) + credProps: Optional[v1CredPropsAuthenticationExtensionsClientOutputs] = Field( + default=None + ) -class v1PayloadEncoding(str, Enum): - PAYLOAD_ENCODING_HEXADECIMAL = "PAYLOAD_ENCODING_HEXADECIMAL" - PAYLOAD_ENCODING_TEXT_UTF8 = "PAYLOAD_ENCODING_TEXT_UTF8" - PAYLOAD_ENCODING_EIP712 = "PAYLOAD_ENCODING_EIP712" - PAYLOAD_ENCODING_EIP7702_AUTHORIZATION = "PAYLOAD_ENCODING_EIP7702_AUTHORIZATION" +class v1SmartContractInterfaceType(str, Enum): + SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM = "SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM" + SMART_CONTRACT_INTERFACE_TYPE_SOLANA = "SMART_CONTRACT_INTERFACE_TYPE_SOLANA" -class v1Policy(TurnkeyBaseModel): - policyId: str = Field(description="Unique identifier for a given Policy.") - policyName: str = Field(description="Human-readable name for a Policy.") - effect: v1Effect = Field( - description="The instruction to DENY or ALLOW a particular activity following policy selector(s)." - ) - createdAt: externaldatav1Timestamp - updatedAt: externaldatav1Timestamp - notes: str = Field( - description="Human-readable notes added by a User to describe a particular policy." - ) - consensus: str = Field( - description="A consensus expression that evalutes to true or false." - ) - condition: str = Field( - description="A condition expression that evalutes to true or false." +class v1SmsCustomizationParams(TurnkeyBaseModel): + template: Optional[str] = Field( + default=None, + description="Template containing references to .OtpCode i.e Your OTP is {{.OtpCode}}", ) -class v1PrivateKey(TurnkeyBaseModel): - privateKeyId: str = Field(description="Unique identifier for a given Private Key.") - publicKey: str = Field( - description="The public component of a cryptographic key pair used to sign messages and transactions." - ) - privateKeyName: str = Field(description="Human-readable name for a Private Key.") - curve: v1Curve = Field( - description="Cryptographic Curve used to generate a given Private Key." - ) - addresses: List[externaldatav1Address] = Field( - description="Derived cryptocurrency addresses for a given Private Key." - ) - privateKeyTags: List[str] = Field(description="A list of Private Key Tag IDs.") - createdAt: externaldatav1Timestamp - updatedAt: externaldatav1Timestamp - exported: bool = Field( - description="True when a given Private Key is exported, false otherwise." +class v1SolSendTransactionIntent(TurnkeyBaseModel): + unsignedTransaction: str = Field( + description="Hex-encoded serialized unsigned Solana transaction in full wire format. Legacy/V0 transactions allow 1232 bytes. V1 allows 4096 bytes with up to 12 trailing 64-byte signature slots, including the paymaster for sponsored transactions. Fill unsigned slots with zeroes." ) - imported: bool = Field( - description="True when a given Private Key is imported, false otherwise." + signWith: str = Field( + description="A wallet or private key address to sign with. This does not support private key IDs." ) - - -class v1PrivateKeyParams(TurnkeyBaseModel): - privateKeyName: str = Field(description="Human-readable name for a Private Key.") - curve: v1Curve = Field( - description="Cryptographic Curve used to generate a given Private Key." + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." ) - privateKeyTags: List[str] = Field( - description="A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body." + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." ) - addressFormats: List[v1AddressFormat] = Field( - description="Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." + recentBlockhash: Optional[str] = Field( + default=None, + description="user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution", ) -class v1PrivateKeyResult(TurnkeyBaseModel): - privateKeyId: Optional[str] = Field(default=None) - addresses: Optional[List[immutableactivityv1Address]] = Field(default=None) - - -class v1PublicKeyCredentialWithAttestation(TurnkeyBaseModel): - id: str - type: str - rawId: str - authenticatorAttachment: Optional[str] = Field(default=None) - response: v1AuthenticatorAttestationResponse - clientExtensionResults: v1SimpleClientExtensionResults - - -class v1RecoverUserIntent(TurnkeyBaseModel): - authenticator: v1AuthenticatorParamsV2 = Field( - description="The new authenticator to register." +class v1SolSendTransactionIntentV2(TurnkeyBaseModel): + unsignedTransaction: str = Field( + description="Hex-encoded serialized unsigned Solana transaction in full wire format. Legacy/V0 transactions allow 1232 bytes. V1 allows 4096 bytes with up to 12 trailing 64-byte signature slots, including the paymaster for sponsored transactions. Fill unsigned slots with zeroes." ) - userId: str = Field( - description="Unique identifier for the user performing recovery." + signWiths: List[str] = Field( + description="Ordered Solana signer addresses Turnkey signs with. Between 1 and 16 signers for legacy/V0, or up to 12 for V1 (11 when sponsored). For sponsored transactions this must list every required signer of the transaction in transaction order." ) - - -class v1RecoverUserRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." + ) + recentBlockhash: Optional[str] = Field( + default=None, + description="User-provided blockhash for replay protection / deadline control. If provided, it is used as-is, including for sponsored transactions (the transaction is only broadcastable while the blockhash is current). If omitted and sponsor=true, a fresh blockhash is fetched during execution.", ) - parameters: v1RecoverUserIntent - generateAppProofs: Optional[bool] = Field(default=None) - - -class v1RecoverUserResult(TurnkeyBaseModel): - authenticatorId: List[str] = Field(description="ID of the authenticator created.") - - -class v1RejectActivityIntent(TurnkeyBaseModel): - fingerprint: str = Field(description="An artifact verifying a User's action.") -class v1RejectActivityRequest(TurnkeyBaseModel): +class v1SolSendTransactionRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -4215,330 +7547,404 @@ class v1RejectActivityRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1RejectActivityIntent + parameters: v1SolSendTransactionIntentV2 generateAppProofs: Optional[bool] = Field(default=None) -class v1RemoveOrganizationFeatureIntent(TurnkeyBaseModel): - name: v1FeatureName = Field(description="Name of the feature to remove") +class v1SolSendTransactionResult(TurnkeyBaseModel): + sendTransactionStatusId: str = Field( + description="The send_transaction_status ID associated with the transaction submission" + ) -class v1RemoveOrganizationFeatureRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - ) - organizationId: str = Field( - description="Unique identifier for a given Organization." +class v1SolSendTransactionResultV2(TurnkeyBaseModel): + sendTransactionStatusId: str = Field( + description="The send_transaction_status ID associated with the transaction submission" ) - parameters: v1RemoveOrganizationFeatureIntent - generateAppProofs: Optional[bool] = Field(default=None) -class v1RemoveOrganizationFeatureResult(TurnkeyBaseModel): - features: List[v1Feature] = Field( - description="Resulting list of organization features." +class v1SolTransactionHistoryItem(TurnkeyBaseModel): + signature: str = Field(description="Solana transaction signature.") + block: v1TransactionHistoryBlock = Field( + description="Block metadata for the transaction." + ) + status: str = Field(description="Transaction confirmation status.") + origin: str = Field( + description="Origin of the transaction. Examples include TURNKEY." + ) + feePayer: str = Field( + description="Address that paid the Solana transaction fee. This is the first signer in the transaction message." + ) + signers: List[v1SolTransactionHistorySigner] = Field( + description="Addresses that signed the Solana transaction, in message order." + ) + fee: v1TransactionHistoryFee = Field(description="Transaction fee information.") + transfers: List[v1TransactionHistoryTransfer] = Field( + description="Asset transfers associated with the transaction." + ) + turnkey: Optional[v1TransactionHistoryTurnkey] = Field( + default=None, + description="Turnkey-specific metadata for transactions originated by Turnkey.", + ) + executionFailed: Optional[bool] = Field( + default=None, + description="Whether the transaction failed during on-chain execution. Omitted when execution outcome is unavailable.", ) -class v1Result(TurnkeyBaseModel): - createOrganizationResult: Optional[v1CreateOrganizationResult] = Field(default=None) - createAuthenticatorsResult: Optional[v1CreateAuthenticatorsResult] = Field( - default=None - ) - createUsersResult: Optional[v1CreateUsersResult] = Field(default=None) - createPrivateKeysResult: Optional[v1CreatePrivateKeysResult] = Field(default=None) - createInvitationsResult: Optional[v1CreateInvitationsResult] = Field(default=None) - acceptInvitationResult: Optional[v1AcceptInvitationResult] = Field(default=None) - signRawPayloadResult: Optional[v1SignRawPayloadResult] = Field(default=None) - createPolicyResult: Optional[v1CreatePolicyResult] = Field(default=None) - disablePrivateKeyResult: Optional[v1DisablePrivateKeyResult] = Field(default=None) - deleteUsersResult: Optional[v1DeleteUsersResult] = Field(default=None) - deleteAuthenticatorsResult: Optional[v1DeleteAuthenticatorsResult] = Field( - default=None +class v1SolTransactionHistorySigner(TurnkeyBaseModel): + address: str = Field(description="Address of the Solana transaction signer.") + writable: bool = Field( + description="Whether the signer account was writable in the Solana transaction message." ) - deleteInvitationResult: Optional[v1DeleteInvitationResult] = Field(default=None) - deleteOrganizationResult: Optional[v1DeleteOrganizationResult] = Field(default=None) - deletePolicyResult: Optional[v1DeletePolicyResult] = Field(default=None) - createUserTagResult: Optional[v1CreateUserTagResult] = Field(default=None) - deleteUserTagsResult: Optional[v1DeleteUserTagsResult] = Field(default=None) - signTransactionResult: Optional[v1SignTransactionResult] = Field(default=None) - deleteApiKeysResult: Optional[v1DeleteApiKeysResult] = Field(default=None) - createApiKeysResult: Optional[v1CreateApiKeysResult] = Field(default=None) - createPrivateKeyTagResult: Optional[v1CreatePrivateKeyTagResult] = Field( - default=None + + +class v1SolanaConfig(TurnkeyBaseModel): + rentPrefundEnabled: Optional[bool] = Field( + default=None, + description="Whether Solana rent prefunding is enabled for the organization. When omitted, the existing rent-prefund state is left unchanged.", ) - deletePrivateKeyTagsResult: Optional[v1DeletePrivateKeyTagsResult] = Field( - default=None + + +class v1SolanaFailureDetails(TurnkeyBaseModel): + source: Optional[str] = Field( + default=None, + description="Where the Solana failure occurred, such as simulation or preflight.", ) - setPaymentMethodResult: Optional[billingSetPaymentMethodResult] = Field( - default=None + rpcCode: Optional[int] = Field( + default=None, description="The Solana JSON-RPC error code, if available." ) - activateBillingTierResult: Optional[billingActivateBillingTierResult] = Field( - default=None + rpcMessage: Optional[str] = Field( + default=None, description="The Solana JSON-RPC error message, if available." ) - deletePaymentMethodResult: Optional[billingDeletePaymentMethodResult] = Field( - default=None + transactionErrorJson: Optional[str] = Field( + default=None, + description="The raw Solana transaction error object serialized as JSON, if available.", ) - createApiOnlyUsersResult: Optional[v1CreateApiOnlyUsersResult] = Field(default=None) - updateRootQuorumResult: Optional[v1UpdateRootQuorumResult] = Field(default=None) - updateUserTagResult: Optional[v1UpdateUserTagResult] = Field(default=None) - updatePrivateKeyTagResult: Optional[v1UpdatePrivateKeyTagResult] = Field( - default=None + logs: Optional[List[str]] = Field( + default=None, + description="Program logs returned by Solana simulation or preflight, if available.", ) - createSubOrganizationResult: Optional[v1CreateSubOrganizationResult] = Field( - default=None + unitsConsumed: Optional[str] = Field( + default=None, + description="Compute units consumed during simulation or preflight, if available.", ) - updateAllowedOriginsResult: Optional[v1UpdateAllowedOriginsResult] = Field( - default=None + innerInstructionsJson: Optional[str] = Field( + default=None, + description="The raw Solana inner instructions payload serialized as JSON, if available.", ) - createPrivateKeysResultV2: Optional[v1CreatePrivateKeysResultV2] = Field( - default=None + + +class v1SolanaSendTransactionStatus(TurnkeyBaseModel): + signature: Optional[str] = Field( + default=None, description="The Solana transaction signature, if available." ) - updateUserResult: Optional[v1UpdateUserResult] = Field(default=None) - updatePolicyResult: Optional[v1UpdatePolicyResult] = Field(default=None) - createSubOrganizationResultV3: Optional[v1CreateSubOrganizationResultV3] = Field( - default=None + + +class v1SparkClaimLeaf(TurnkeyBaseModel): + leafId: str = Field(description="Leaf identifier (UUID).") + ciphertext: str = Field( + description="ECIES ciphertext (hex-encoded) containing the inbound transfer secret. Decrypted inside the enclave using the wallet's Identity key." ) - createWalletResult: Optional[v1CreateWalletResult] = Field(default=None) - createWalletAccountsResult: Optional[v1CreateWalletAccountsResult] = Field( - default=None + senderSignature: str = Field( + description="Hex-encoded 64-byte compact ECDSA signature binding (leaf_id, transfer_id, ciphertext) to the sender's identity key. Verified inside the enclave before decryption." ) - initUserEmailRecoveryResult: Optional[v1InitUserEmailRecoveryResult] = Field( - default=None + + +class v1SparkClaimPackage(TurnkeyBaseModel): + leaves: List[v1SparkClaimLeaf] = Field(description="Leaves being claimed.") + threshold: int = Field( + description="Shamir threshold for reconstructing the per-leaf claim secret." ) - recoverUserResult: Optional[v1RecoverUserResult] = Field(default=None) - setOrganizationFeatureResult: Optional[v1SetOrganizationFeatureResult] = Field( - default=None + operatorRecipients: List[v1SparkOperatorRecipient] = Field( + description="Operators that will receive Shamir shares." ) - removeOrganizationFeatureResult: Optional[v1RemoveOrganizationFeatureResult] = ( - Field(default=None) + transferId: str = Field( + description="Spark transfer identifier (UUID). Used together with each leaf's sender_signature to verify the sender bound this ciphertext to this transfer." ) - exportPrivateKeyResult: Optional[v1ExportPrivateKeyResult] = Field(default=None) - exportWalletResult: Optional[v1ExportWalletResult] = Field(default=None) - createSubOrganizationResultV4: Optional[v1CreateSubOrganizationResultV4] = Field( - default=None + senderIdentityPublicKey: str = Field( + description="Sender's compressed secp256k1 identity public key (hex-encoded, 33 bytes). Used to verify the per-leaf sender_signature fields." ) - emailAuthResult: Optional[v1EmailAuthResult] = Field(default=None) - exportWalletAccountResult: Optional[v1ExportWalletAccountResult] = Field( - default=None + + +class v1SparkClaimTransferIntent(TurnkeyBaseModel): + signWith: str = Field( + description="A Spark wallet account address identifying the wallet." ) - initImportWalletResult: Optional[v1InitImportWalletResult] = Field(default=None) - importWalletResult: Optional[v1ImportWalletResult] = Field(default=None) - initImportPrivateKeyResult: Optional[v1InitImportPrivateKeyResult] = Field( - default=None + claim: v1SparkClaimPackage = Field(description="Claim package parameters.") + + +class v1SparkClaimTransferRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - importPrivateKeyResult: Optional[v1ImportPrivateKeyResult] = Field(default=None) - createPoliciesResult: Optional[v1CreatePoliciesResult] = Field(default=None) - signRawPayloadsResult: Optional[v1SignRawPayloadsResult] = Field(default=None) - createReadOnlySessionResult: Optional[v1CreateReadOnlySessionResult] = Field( - default=None + organizationId: str = Field( + description="Unique identifier for a given Organization." ) - createOauthProvidersResult: Optional[v1CreateOauthProvidersResult] = Field( - default=None + parameters: v1SparkClaimTransferIntent + + +class v1SparkClaimTransferResult(TurnkeyBaseModel): + operatorPackages: List[v1SparkEncryptedOperatorPackage] = Field( + description="Per-operator ECIES-encrypted packages." ) - deleteOauthProvidersResult: Optional[v1DeleteOauthProvidersResult] = Field( - default=None + newLeafPublicKeys: List[v1SparkLeafPublicKey] = Field( + description="Newly-derived SigningLeaf public keys, one per leaf, in input order." ) - createSubOrganizationResultV5: Optional[v1CreateSubOrganizationResultV5] = Field( - default=None + + +class v1SparkDepositDerivation(TurnkeyBaseModel): + pass + + +class v1SparkEncryptedOperatorPackage(TurnkeyBaseModel): + operatorId: str = Field(description="Spark operator identifier (UUID).") + encryptedPackage: str = Field( + description="ECIES ciphertext (hex-encoded) opaque to Turnkey after emission." ) - oauthResult: Optional[v1OauthResult] = Field(default=None) - createReadWriteSessionResult: Optional[v1CreateReadWriteSessionResult] = Field( - default=None + + +class v1SparkFrostCommitment(TurnkeyBaseModel): + id: str = Field( + description="FROST participant identifier, hex-encoded (32-byte scalar)." ) - createSubOrganizationResultV6: Optional[v1CreateSubOrganizationResultV6] = Field( - default=None + hiding: str = Field( + description="Hiding commitment D, hex-encoded compressed secp256k1 point." ) - deletePrivateKeysResult: Optional[v1DeletePrivateKeysResult] = Field(default=None) - deleteWalletsResult: Optional[v1DeleteWalletsResult] = Field(default=None) - createReadWriteSessionResultV2: Optional[v1CreateReadWriteSessionResultV2] = Field( - default=None + binding: str = Field( + description="Binding commitment E, hex-encoded compressed secp256k1 point." ) - deleteSubOrganizationResult: Optional[v1DeleteSubOrganizationResult] = Field( - default=None + + +class v1SparkHtlcPreimageDerivation(TurnkeyBaseModel): + pass + + +class v1SparkIdentityDerivation(TurnkeyBaseModel): + pass + + +class v1SparkKeyDerivation(TurnkeyBaseModel): + identity: Optional[v1SparkIdentityDerivation] = Field( + default=None, description="Spark identity key derivation." ) - initOtpAuthResult: Optional[v1InitOtpAuthResult] = Field(default=None) - otpAuthResult: Optional[v1OtpAuthResult] = Field(default=None) - createSubOrganizationResultV7: Optional[v1CreateSubOrganizationResultV7] = Field( - default=None + signingLeaf: Optional[v1SparkSigningLeafDerivation] = Field( + default=None, + description="Spark signing leaf key derivation, identified by leaf ID.", ) - updateWalletResult: Optional[v1UpdateWalletResult] = Field(default=None) - updatePolicyResultV2: Optional[v1UpdatePolicyResultV2] = Field(default=None) - initOtpAuthResultV2: Optional[v1InitOtpAuthResultV2] = Field(default=None) - initOtpResult: Optional[v1InitOtpResult] = Field(default=None) - verifyOtpResult: Optional[v1VerifyOtpResult] = Field(default=None) - otpLoginResult: Optional[v1OtpLoginResult] = Field(default=None) - stampLoginResult: Optional[v1StampLoginResult] = Field(default=None) - oauthLoginResult: Optional[v1OauthLoginResult] = Field(default=None) - updateUserNameResult: Optional[v1UpdateUserNameResult] = Field(default=None) - updateUserEmailResult: Optional[v1UpdateUserEmailResult] = Field(default=None) - updateUserPhoneNumberResult: Optional[v1UpdateUserPhoneNumberResult] = Field( - default=None + deposit: Optional[v1SparkDepositDerivation] = Field( + default=None, description="Spark deposit key derivation." ) - initFiatOnRampResult: Optional[v1InitFiatOnRampResult] = Field(default=None) - createSmartContractInterfaceResult: Optional[ - v1CreateSmartContractInterfaceResult - ] = Field(default=None) - deleteSmartContractInterfaceResult: Optional[ - v1DeleteSmartContractInterfaceResult - ] = Field(default=None) - enableAuthProxyResult: Optional[v1EnableAuthProxyResult] = Field(default=None) - disableAuthProxyResult: Optional[v1DisableAuthProxyResult] = Field(default=None) - updateAuthProxyConfigResult: Optional[v1UpdateAuthProxyConfigResult] = Field( - default=None + staticDeposit: Optional[v1SparkStaticDepositDerivation] = Field( + default=None, + description="Spark static deposit key derivation, identified by index.", ) - createOauth2CredentialResult: Optional[v1CreateOauth2CredentialResult] = Field( - default=None + htlcPreimage: Optional[v1SparkHtlcPreimageDerivation] = Field( + default=None, description="Spark HTLC preimage key derivation." ) - updateOauth2CredentialResult: Optional[v1UpdateOauth2CredentialResult] = Field( - default=None + + +class v1SparkLeafPublicKey(TurnkeyBaseModel): + leafId: str = Field( + description="The Spark leaf_id this public key was derived for." ) - deleteOauth2CredentialResult: Optional[v1DeleteOauth2CredentialResult] = Field( - default=None + publicKey: str = Field( + description="Hex-encoded compressed secp256k1 point (33 bytes) for the SigningLeaf derivation at leaf_id." ) - oauth2AuthenticateResult: Optional[v1Oauth2AuthenticateResult] = Field(default=None) - deleteWalletAccountsResult: Optional[v1DeleteWalletAccountsResult] = Field( - default=None + + +class v1SparkLightningReceivePackage(TurnkeyBaseModel): + threshold: int = Field( + description="Feldman VSS threshold for reconstructing the preimage." ) - deletePoliciesResult: Optional[v1DeletePoliciesResult] = Field(default=None) - ethSendRawTransactionResult: Optional[v1EthSendRawTransactionResult] = Field( - default=None + operatorRecipients: List[v1SparkOperatorRecipient] = Field( + description="Operators that will receive Feldman shares of the preimage. Order must match the operators' numeric IDs in the Spark operator config - share index is the 1-based position in this list." ) - createFiatOnRampCredentialResult: Optional[v1CreateFiatOnRampCredentialResult] = ( - Field(default=None) + + +class v1SparkOperatorRecipient(TurnkeyBaseModel): + operatorId: str = Field(description="Spark operator identifier (UUID).") + encryptionPublicKey: str = Field( + description="Operator's ECIES encryption pubkey (hex-encoded compressed secp256k1 point)." ) - updateFiatOnRampCredentialResult: Optional[v1UpdateFiatOnRampCredentialResult] = ( - Field(default=None) + + +class v1SparkPartialSignature(TurnkeyBaseModel): + signatureShare: str = Field(description="Hex-encoded FROST partial signature.") + hiding: str = Field( + description="Turnkey's hiding commitment D (hex-encoded compressed secp256k1 point). Forward to the Spark Operator." ) - deleteFiatOnRampCredentialResult: Optional[v1DeleteFiatOnRampCredentialResult] = ( - Field(default=None) + binding: str = Field( + description="Turnkey's binding commitment E (hex-encoded compressed secp256k1 point). Forward to the Spark Operator." ) - ethSendTransactionResult: Optional[v1EthSendTransactionResult] = Field(default=None) - upsertGasUsageConfigResult: Optional[v1UpsertGasUsageConfigResult] = Field( - default=None + + +class v1SparkPrepareLightningReceiveIntent(TurnkeyBaseModel): + signWith: str = Field( + description="A Spark wallet account address identifying the wallet." ) - createTvcAppResult: Optional[v1CreateTvcAppResult] = Field(default=None) - createTvcDeploymentResult: Optional[v1CreateTvcDeploymentResult] = Field( - default=None + lightningReceive: v1SparkLightningReceivePackage = Field( + description="Lightning receive package parameters: threshold and operator recipients." ) - createTvcManifestApprovalsResult: Optional[v1CreateTvcManifestApprovalsResult] = ( - Field(default=None) + + +class v1SparkPrepareLightningReceiveRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - solSendTransactionResult: Optional[v1SolSendTransactionResult] = Field(default=None) - initOtpResultV2: Optional[v1InitOtpResultV2] = Field(default=None) - updateOrganizationNameResult: Optional[v1UpdateOrganizationNameResult] = Field( - default=None + organizationId: str = Field( + description="Unique identifier for a given Organization." ) + parameters: v1SparkPrepareLightningReceiveIntent -class v1RevertChainEntry(TurnkeyBaseModel): - address: Optional[str] = Field( - default=None, description="The contract address where the revert occurred." +class v1SparkPrepareLightningReceiveResult(TurnkeyBaseModel): + operatorPackages: List[v1SparkEncryptedOperatorPackage] = Field( + description="Per-operator ECIES-encrypted Feldman share packages." ) - errorType: Optional[str] = Field( - default=None, description="Type of error: 'unknown', 'native', or 'custom'." + paymentHash: str = Field( + description="Hex-encoded SHA256(preimage). Forward to the Lightning node." ) - displayMessage: Optional[str] = Field( - default=None, description="Human-readable message describing this revert." + + +class v1SparkPrepareTransferIntent(TurnkeyBaseModel): + signWith: str = Field( + description="A Spark wallet account address identifying the wallet." ) - unknown: Optional[v1UnknownRevertError] = Field( - default=None, description="Details for unknown error types." + transfer: v1SparkTransferPackage = Field( + description="Transfer package parameters for HD key tweak splitting." ) - native: Optional[v1NativeRevertError] = Field( - default=None, - description="Details for native Solidity errors (Error, Panic, execution reverted).", + + +class v1SparkPrepareTransferRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - custom: Optional[v1CustomRevertError] = Field( - default=None, description="Details for custom contract errors." + organizationId: str = Field( + description="Unique identifier for a given Organization." ) + parameters: v1SparkPrepareTransferIntent -class v1RootUserParams(TurnkeyBaseModel): - userName: str = Field(description="Human-readable name for a User.") - userEmail: Optional[str] = Field( - default=None, description="The user's email address." +class v1SparkPrepareTransferResult(TurnkeyBaseModel): + operatorPackages: List[v1SparkEncryptedOperatorPackage] = Field( + description="Per-operator ECIES-encrypted packages." ) - apiKeys: List[apiApiKeyParams] = Field( - description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + transferUserSignature: str = Field( + description="Hex-encoded ECDSA-DER signature of the TransferPackage signing payload, signed with the wallet's IDENTITY key." ) - authenticators: List[v1AuthenticatorParamsV2] = Field( - description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + newLeafPublicKeys: List[v1SparkLeafPublicKey] = Field( + description="Newly-derived SigningLeaf public keys, one per leaf, in input order." ) -class v1RootUserParamsV2(TurnkeyBaseModel): - userName: str = Field(description="Human-readable name for a User.") - userEmail: Optional[str] = Field( - default=None, description="The user's email address." +class v1SparkSignFrostIntent(TurnkeyBaseModel): + signWith: str = Field( + description="A Spark wallet account address identifying the wallet to sign with." ) - apiKeys: List[apiApiKeyParams] = Field( - description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + signatures: List[v1SparkSignatureRequest] = Field( + description="Batched sign requests. Each produces a partial signature plus Turnkey's public commitments." ) - authenticators: List[v1AuthenticatorParamsV2] = Field( - description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + + +class v1SparkSignFrostRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." ) - oauthProviders: List[v1OauthProviderParams] = Field( - description="A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + organizationId: str = Field( + description="Unique identifier for a given Organization." ) + parameters: v1SparkSignFrostIntent -class v1RootUserParamsV3(TurnkeyBaseModel): - userName: str = Field(description="Human-readable name for a User.") - userEmail: Optional[str] = Field( - default=None, description="The user's email address." +class v1SparkSignFrostResult(TurnkeyBaseModel): + signatures: List[v1SparkPartialSignature] = Field( + description="Partial signatures plus Turnkey commitments, one per request, in order." ) - apiKeys: List[v1ApiKeyParamsV2] = Field( - description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + + +class v1SparkSignatureRequest(TurnkeyBaseModel): + derivation: v1SparkKeyDerivation = Field(description="Which key to sign with.") + message: str = Field(description="Hex-encoded 32-byte sighash to sign.") + verifyingKey: str = Field( + description="Aggregate group verifying key (hex-encoded compressed secp256k1 point), computed as P_ops + P_user. Bound into the nonce HMAC." ) - authenticators: List[v1AuthenticatorParamsV2] = Field( - description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + operatorCommitments: List[v1SparkFrostCommitment] = Field( + description="Commitments for every non-Turnkey participant. MUST NOT include an entry under Turnkey's identifier. Bound into the nonce HMAC." ) - oauthProviders: List[v1OauthProviderParams] = Field( - description="A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + adaptorPublicKey: Optional[str] = Field( + default=None, + description="Optional adaptor point T (hex-encoded 33-byte compressed secp256k1 pubkey). When set, Turnkey produces a Schnorr adaptor pre-signature with the FROST challenge bound to `R+T` (where `R` is the aggregate group nonce commitment from FROST). The party holding the discrete log `t` completes the pre-sig to a valid BIP-340 signature by adding `t` (or `-t`, for parity) to the signature scalar `s`. This is primarily used by Spark leaves-swap and other adaptor-bound flows; absent or empty leads to plain FROST signing (the typical case).", ) -class v1RootUserParamsV4(TurnkeyBaseModel): - userName: str = Field(description="Human-readable name for a User.") - userEmail: Optional[str] = Field( - default=None, description="The user's email address." +class v1SparkSigningLeafDerivation(TurnkeyBaseModel): + leafId: str = Field(description="Unique identifier for the Spark signing leaf.") + + +class v1SparkStaticDepositDerivation(TurnkeyBaseModel): + index: int = Field(description="Index used to derive the static deposit key.") + + +class v1SparkTransferLeaf(TurnkeyBaseModel): + leafId: str = Field(description="Leaf identifier (UUID).") + oldLeafDerivation: v1SparkKeyDerivation = Field( + description="Derivation for the existing (pre-transfer) leaf key. Always a SigningLeaf derivation." ) - userPhoneNumber: Optional[str] = Field( - default=None, - description="The user's phone number in E.164 format e.g. +13214567890", + newLeafDerivation: v1SparkKeyDerivation = Field( + description="Derivation for the new (post-transfer) leaf key. Always a SigningLeaf derivation. The enclave ECIES-encrypts this private key to receiver_public_key as the per-leaf secret_cipher; HD-derived rather than random so the sender can re-derive on retry (Turnkey's enclave is stateless)." ) - apiKeys: List[v1ApiKeyParamsV2] = Field( - description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + refundSignature: Optional[str] = Field( + default=None, + description="Client-produced CPFP refund signature (hex-encoded), passed through verbatim into the per-operator SendLeafKeyTweak. Empty omits the field from the operator package.", ) - authenticators: List[v1AuthenticatorParamsV2] = Field( - description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + directRefundSignature: Optional[str] = Field( + default=None, + description="Client-produced direct refund signature (hex-encoded). Passed through verbatim.", ) - oauthProviders: List[v1OauthProviderParams] = Field( - description="A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + directFromCpfpRefundSignature: Optional[str] = Field( + default=None, + description="Client-produced direct-from-CPFP refund signature (hex-encoded). Passed through verbatim.", ) -class v1Selector(TurnkeyBaseModel): - subject: Optional[str] = Field(default=None) - operator: Optional[v1Operator] = Field(default=None) - target: Optional[str] = Field(default=None) - - -class v1SelectorV2(TurnkeyBaseModel): - subject: Optional[str] = Field(default=None) - operator: Optional[v1Operator] = Field(default=None) - targets: Optional[List[str]] = Field(default=None) +class v1SparkTransferPackage(TurnkeyBaseModel): + transferId: str = Field(description="Spark transfer identifier (UUID).") + leaves: List[v1SparkTransferLeaf] = Field(description="Leaves being transferred.") + threshold: int = Field( + description="Feldman VSS threshold for reconstructing the per-leaf tweak scalar." + ) + operatorRecipients: List[v1SparkOperatorRecipient] = Field( + description="Operators that will receive Feldman shares of the per-leaf tweak. Order must match the operators' numeric IDs in the Spark operator config - share index is the 1-based position in this list." + ) + receiverPublicKey: str = Field( + description="Recipient's identity pubkey (hex-encoded compressed secp256k1 point). Each leaf's new_priv is ECIES-encrypted to this key and embedded in the per-operator package for claim-time delivery." + ) -class v1SetOrganizationFeatureIntent(TurnkeyBaseModel): - name: v1FeatureName = Field(description="Name of the feature to set") - value: str = Field( - description="Optional value for the feature. Will override existing values if feature is already set." +class v1StampLoginIntent(TurnkeyBaseModel): + publicKey: str = Field( + description="Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request" + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.", + ) + invalidateExisting: Optional[bool] = Field( + default=None, + description="Invalidate all other previously generated Login API keys", + ) + sessionProfileId: Optional[str] = Field( + default=None, + description="Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used.", ) -class v1SetOrganizationFeatureRequest(TurnkeyBaseModel): +class v1StampLoginRequest(TurnkeyBaseModel): type: str timestampMs: str = Field( description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." @@ -4546,238 +7952,329 @@ class v1SetOrganizationFeatureRequest(TurnkeyBaseModel): organizationId: str = Field( description="Unique identifier for a given Organization." ) - parameters: v1SetOrganizationFeatureIntent + parameters: v1StampLoginIntent generateAppProofs: Optional[bool] = Field(default=None) -class v1SetOrganizationFeatureResult(TurnkeyBaseModel): - features: List[v1Feature] = Field( - description="Resulting list of organization features." +class v1StampLoginResult(TurnkeyBaseModel): + session: str = Field( + description="Signed JWT containing an expiry, public key, session type, user id, and organization id" ) -class v1SignRawPayloadIntent(TurnkeyBaseModel): - privateKeyId: str = Field(description="Unique identifier for a given Private Key.") - payload: str = Field(description="Raw unsigned payload to be signed.") - encoding: v1PayloadEncoding = Field( - description="Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." +class v1SwapError(TurnkeyBaseModel): + reason: str = Field( + description="Stable machine-readable failure reason. One of ORIGIN_TRANSACTION_FAILED or PROVIDER_FILL_FAILED." ) - hashFunction: v1HashFunction = Field( - description="Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + message: str = Field(description="Human-readable description of the swap failure.") + originTxError: Optional[v1TxError] = Field( + default=None, + description="Origin-chain transaction failure details, present when reason is ORIGIN_TRANSACTION_FAILED and details are available.", + ) + providerReason: Optional[str] = Field( + default=None, + description="Optional detail from the swap provider about why the fill did not complete, when available.", ) -class v1SignRawPayloadIntentV2(TurnkeyBaseModel): - signWith: str = Field( - description="A Wallet account address, Private Key address, or Private Key identifier." +class v1SwapQuote(TurnkeyBaseModel): + quoteId: str = Field( + description="Identifier for this provider quote. Pass this value to execute_swap_v2 to bind execution to this exact quote. The signer is derived from the quote; clients do not resupply sign_with on execute." ) - payload: str = Field(description="Raw unsigned payload to be signed.") - encoding: v1PayloadEncoding = Field( - description="Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." + provider: str = Field(description="Swap provider that produced this quote.") + outputAmount: str = Field( + description="Estimated base-unit amount of the output asset." ) - hashFunction: v1HashFunction = Field( - description="Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + minOutputAmount: str = Field( + description="Minimum acceptable base-unit amount of the output asset after slippage." + ) + expiresAt: str = Field( + description="Quote expiration as a millisecond epoch string." + ) + slippageBps: Optional[str] = Field( + default=None, + description="Effective total slippage tolerance in basis points for this quote, taken from the provider response when present. When the request omits input slippage_bps, the provider may calculate this value.", + ) + clientFeeBps: str = Field( + description="Client fee in basis points applied for this pair. Informational only; already reflected in output_amount and min_output_amount." + ) + estimatedTimeSeconds: Optional[str] = Field( + default=None, + description="Provider-estimated completion time in seconds, when available.", ) -class v1SignRawPayloadRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." +class v1SwapQuoteV2(TurnkeyBaseModel): + quoteId: str = Field( + description="Identifier for this provider quote. Pass this value to execute_swap_v2 to bind execution to this exact quote. The signer is derived from the quote; clients do not resupply sign_with on execute." ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + provider: str = Field(description="Swap provider that produced this quote.") + outputAmount: str = Field( + description="Estimated base-unit amount of the output asset." + ) + minOutputAmount: str = Field( + description="Minimum acceptable base-unit amount of the output asset after slippage." + ) + expiresAt: str = Field( + description="Quote expiration as a millisecond epoch string." + ) + slippageBps: Optional[str] = Field( + default=None, + description="Effective total slippage tolerance in basis points for this quote, taken from the provider response when present. When the request omits input slippage_bps, the provider may calculate this value.", + ) + clientFeeBps: str = Field( + description="Client fee in basis points applied for this pair. Informational only; already reflected in output_amount and min_output_amount." + ) + estimatedTimeSeconds: Optional[str] = Field( + default=None, + description="Provider-estimated completion time in seconds, when available.", + ) + feeSponsorship: bool = Field( + description="Whether Turnkey pays the provider fees for this quote." + ) + fixedRate: bool = Field(description="Whether this quote uses a 1:1 fixed rate.") + estimatedFixedRateAdjustmentUsd: Optional[str] = Field( + default=None, + description="Estimated USD adjustment for the fixed rate. Present only for fixed-rate quotes. Positive is a cost billed to you; negative is an earning credited against your transaction management charges at the end of the billing period. Informational; the final amount is settled after execution.", ) - parameters: v1SignRawPayloadIntentV2 - generateAppProofs: Optional[bool] = Field(default=None) -class v1SignRawPayloadResult(TurnkeyBaseModel): - r: str = Field(description="Component of an ECSDA signature.") - s: str = Field(description="Component of an ECSDA signature.") - v: str = Field(description="Component of an ECSDA signature.") +class v1SwapRefund(TurnkeyBaseModel): + asset: str = Field( + description="CAIP-19 asset returned by the swap provider after a failed cross-chain fill." + ) + amount: str = Field(description="Base-unit amount returned by the swap provider.") + txHash: Optional[str] = Field( + default=None, + description="Transaction that delivered the provider refund, when applicable.", + ) -class v1SignRawPayloadsIntent(TurnkeyBaseModel): - signWith: str = Field( - description="A Wallet account address, Private Key address, or Private Key identifier." +class v1SwapSpendingWindow(TurnkeyBaseModel): + windowDurationMinutes: int = Field( + description="Rolling window duration in minutes." ) - payloads: List[str] = Field( - description="An array of raw unsigned payloads to be signed." + windowLimitUsd: str = Field( + description="The parent's window limit, or the per-child limit when queried by a sub-organization." ) - encoding: v1PayloadEncoding = Field( - description="Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." + usageUsd: str = Field( + description="Settled spending in the current window. Fixed-rate earnings offset fixed-rate costs, and usage never goes below zero. Fixed-rate usage stays zero until final fixed-rate costs are recorded." ) - hashFunction: v1HashFunction = Field( - description="Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + remainingUsd: str = Field( + description="Remaining spending capacity, clamped to zero. For children, also capped by remaining parent capacity. Zero when the window is disabled. This is not a reservation or a guarantee of feature eligibility." + ) + enabled: bool = Field( + description="Whether the saved spending window permits new swaps." + ) + subOrgWindowLimitUsd: Optional[str] = Field( + default=None, + description="Configured per-child limit. Returned only when querying the billing parent.", ) -class v1SignRawPayloadsRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." +class v1SwapSponsorshipFeature(TurnkeyBaseModel): + permitted: bool = Field( + description="Whether the billing parent holds this feature's signed permission. Quotes can use the feature only when it is permitted and its window is enabled." ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + window: Optional[v1SwapSpendingWindow] = Field( + default=None, + description="Absent until the billing parent saves a spending window.", ) - parameters: v1SignRawPayloadsIntent - generateAppProofs: Optional[bool] = Field(default=None) -class v1SignRawPayloadsResult(TurnkeyBaseModel): - signatures: Optional[List[v1SignRawPayloadResult]] = Field(default=None) +class v1TagType(str, Enum): + TAG_TYPE_USER = "TAG_TYPE_USER" + TAG_TYPE_PRIVATE_KEY = "TAG_TYPE_PRIVATE_KEY" -class v1SignTransactionIntent(TurnkeyBaseModel): - privateKeyId: str = Field(description="Unique identifier for a given Private Key.") - unsignedTransaction: str = Field( - description="Raw unsigned transaction to be signed by a particular Private Key." - ) - type: v1TransactionType +class v1TokenUsage(TurnkeyBaseModel): + type: v1UsageType = Field(description="Type of token usage") + tokenId: str = Field(description="Unique identifier for the verification token") + signup: Optional[v1SignupUsage] = Field(default=None) + login: Optional[v1LoginUsage] = Field(default=None) + signupV2: Optional[v1SignupUsageV2] = Field(default=None) -class v1SignTransactionIntentV2(TurnkeyBaseModel): - signWith: str = Field( - description="A Wallet account address, Private Key address, or Private Key identifier." - ) - unsignedTransaction: str = Field( - description="Raw unsigned transaction to be signed" - ) - type: v1TransactionType +class v1TransactionHistoryAsset(TurnkeyBaseModel): + caip19: str = Field(description="The CAIP-19 asset identifier.") + symbol: str = Field(description="The asset symbol.") + name: str = Field(description="The asset name.") + decimals: int = Field(description="The number of decimals this asset uses.") -class v1SignTransactionRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." +class v1TransactionHistoryBlock(TurnkeyBaseModel): + number: str = Field(description="Block number containing the transaction.") + hash: str = Field(description="Block hash containing the transaction.") + timestamp: str = Field(description="Block timestamp in RFC 3339 format.") + + +class v1TransactionHistoryDisplay(TurnkeyBaseModel): + crypto: Optional[str] = Field( + default=None, + description="Normalized crypto value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise.", ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + usd: Optional[str] = Field( + default=None, + description="USD value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise.", ) - parameters: v1SignTransactionIntentV2 - generateAppProofs: Optional[bool] = Field(default=None) -class v1SignTransactionResult(TurnkeyBaseModel): - signedTransaction: str +class v1TransactionHistoryFee(TurnkeyBaseModel): + amount: str = Field(description="Fee amount in atomic units.") + caip19: str = Field(description="The CAIP-19 asset identifier.") -class v1SignupUsage(TurnkeyBaseModel): - email: Optional[str] = Field(default=None) - phoneNumber: Optional[str] = Field(default=None) - apiKeys: Optional[List[v1ApiKeyParamsV2]] = Field(default=None) - authenticators: Optional[List[v1AuthenticatorParamsV2]] = Field(default=None) - oauthProviders: Optional[List[v1OauthProviderParams]] = Field(default=None) +class v1TransactionHistoryTransfer(TurnkeyBaseModel): + direction: str = Field( + description="Transfer direction relative to the queried address." + ) + asset: Optional[v1TransactionHistoryAsset] = Field( + default=None, + description="Asset metadata for the transfer. Omitted when the asset cannot be determined.", + ) + amount: str = Field(description="Transfer amount in atomic units.") + counterparty: str = Field(description="Counterparty address for the transfer.") + display: Optional[v1TransactionHistoryDisplay] = Field( + default=None, + description="Normalized transfer values for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise. Use the amount field instead.", + ) -class v1SimpleClientExtensionResults(TurnkeyBaseModel): - appid: Optional[bool] = Field(default=None) - appidExclude: Optional[bool] = Field(default=None) - credProps: Optional[v1CredPropsAuthenticationExtensionsClientOutputs] = Field( - default=None +class v1TransactionHistoryTurnkey(TurnkeyBaseModel): + sponsored: bool = Field( + description="Whether the transaction fee was sponsored by Turnkey." + ) + activityFingerprint: Optional[str] = Field( + default=None, + description="Fingerprint of the Turnkey activity that submitted the transaction.", + ) + submittedAt: Optional[str] = Field( + default=None, + description="Timestamp when Turnkey submitted the transaction, in RFC 3339 format.", ) -class v1SmartContractInterfaceType(str, Enum): - SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM = "SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM" - SMART_CONTRACT_INTERFACE_TYPE_SOLANA = "SMART_CONTRACT_INTERFACE_TYPE_SOLANA" +class v1TransactionType(str, Enum): + TRANSACTION_TYPE_ETHEREUM = "TRANSACTION_TYPE_ETHEREUM" + TRANSACTION_TYPE_SOLANA = "TRANSACTION_TYPE_SOLANA" + TRANSACTION_TYPE_TRON = "TRANSACTION_TYPE_TRON" + TRANSACTION_TYPE_BITCOIN = "TRANSACTION_TYPE_BITCOIN" + TRANSACTION_TYPE_TEMPO = "TRANSACTION_TYPE_TEMPO" -class v1SmsCustomizationParams(TurnkeyBaseModel): - template: Optional[str] = Field( - default=None, - description="Template containing references to .OtpCode i.e Your OTP is {{.OtpCode}}", +class v1TransportEncryptionSuite(str, Enum): + TRANSPORT_ENCRYPTION_SUITE_ENCLAVE_ENCRYPT_V1 = ( + "TRANSPORT_ENCRYPTION_SUITE_ENCLAVE_ENCRYPT_V1" ) -class v1SolSendTransactionIntent(TurnkeyBaseModel): - unsignedTransaction: str = Field( - description="Base64-encoded serialized unsigned Solana transaction" +class v1TvcApp(TurnkeyBaseModel): + id: str = Field(description="Unique Identifier for this TVC App.") + organizationId: str = Field( + description="Unique Identifier of the Organization for this TVC App" ) - signWith: str = Field( - description="A wallet or private key address to sign with. This does not support private key IDs." + name: str = Field(description="Name for this TVC App.") + quorumPublicKey: str = Field( + description="Public key for the Quorum Key associated with this TVC App" ) - sponsor: Optional[bool] = Field( - default=None, description="Whether to sponsor this transaction via Gas Station." + manifestSet: v1TvcOperatorSet = Field( + description="Manifest Set (people who can approve manifests)" ) - caip2: str = Field( - description="CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet)." + shareSet: v1TvcOperatorSet = Field( + description="Share Set (people who have a share of the Quorum Key)" ) - recentBlockhash: Optional[str] = Field( + enableEgress: bool = Field( + description="Whether or not this TVC App has network egress enabled." + ) + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + liveDeploymentId: Optional[str] = Field( default=None, - description="user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution", + description="The deployment currently designated to receive traffic. Null if no deployment for this app is deployed.", ) - - -class v1SolSendTransactionRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + publicDomain: str = Field( + description='The public domain for ingress to this TVC App (in the format "app-.turnkey.cloud").' ) - organizationId: str = Field( - description="Unique identifier for a given Organization." + enableDebugModeDeployments: bool = Field( + description="Whether this app permits debug-mode deployments. Set at app creation via CreateTvcAppIntent.enable_debug_mode_deployments and never updated thereafter. Debug-mode deployments expose logs and emit zero'd attestation PCRs, so remote attestation cannot succeed. The app's quorum key is therefore considered permanently insecure once enabled — a new app with a fresh quorum key must be created to return to a secure posture." ) - parameters: v1SolSendTransactionIntent - generateAppProofs: Optional[bool] = Field(default=None) -class v1SolSendTransactionResult(TurnkeyBaseModel): - sendTransactionStatusId: str = Field( - description="The send_transaction_status ID associated with the transaction submission" +class v1TvcContainerSpec(TurnkeyBaseModel): + containerUrl: str = Field(description="The URL for this container image.") + path: str = Field(description="The path (in-container) to the executable binary.") + args: List[str] = Field(description="The arguments to pass to the executable.") + hasPullSecret: bool = Field( + description="Whether or not this container requires a pull secret to access." ) - - -class v1StampLoginIntent(TurnkeyBaseModel): - publicKey: str = Field( - description="Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request" + healthCheckType: v1TvcHealthCheckType = Field( + description="The type of health check to perform against this executable." ) - expirationSeconds: Optional[str] = Field( - default=None, - description="Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used.", + healthCheckPort: int = Field( + description="The port to use for health checks against this executable." ) - invalidateExisting: Optional[bool] = Field( - default=None, - description="Invalidate all other previously generated Login API keys", + publicIngressPort: int = Field( + description="The port to use for public ingress to this executable." ) -class v1StampLoginRequest(TurnkeyBaseModel): - type: str - timestampMs: str = Field( - description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - ) +class v1TvcDeployment(TurnkeyBaseModel): + id: str = Field(description="Unique Identifier for this TVC Deployment.") organizationId: str = Field( - description="Unique identifier for a given Organization." + description="Unique Identifier of the Organization for this TVC Deployment" ) - parameters: v1StampLoginIntent - generateAppProofs: Optional[bool] = Field(default=None) - - -class v1StampLoginResult(TurnkeyBaseModel): - session: str = Field( - description="Signed JWT containing an expiry, public key, session type, user id, and organization id" + appId: str = Field( + description="Unique Identifier of the TVC App for this deployment" + ) + manifestSet: v1TvcOperatorSet = Field( + description="Set of TVC operators who can approve this deployment" + ) + shareSet: v1TvcOperatorSet = Field( + description="Set of TVC operators who have a share of the Quorum Key" + ) + manifest: v1TvcManifest = Field(description="The manifest used for this deployment") + manifestApprovals: List[v1TvcOperatorApproval] = Field( + description="List of operator approvals for this manifest" + ) + qosVersion: str = Field(description="QOS Version used for this deployment") + pivotContainer: v1TvcContainerSpec = Field( + description="The pivot container spec for this deployment" + ) + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + delete: bool = Field( + description="Whether or not the user wants this deployment deleted from the cluster." + ) + debugMode: bool = Field( + description="Whether this deployment is running in debug mode. Debug-mode deployments expose enclave logs and cannot be remotely attested." + ) + instanceSizeCpus: Optional[int] = Field( + default=None, description="The instance cpu count for this enclave." + ) + instanceSizeRam: Optional[int] = Field( + default=None, description="The instance memory size in GiB for this enclave." ) -class v1TagType(str, Enum): - TAG_TYPE_USER = "TAG_TYPE_USER" - TAG_TYPE_PRIVATE_KEY = "TAG_TYPE_PRIVATE_KEY" +class v1TvcDeploymentDebugLogEntry(TurnkeyBaseModel): + line: v1LogLine = Field( + description="Application log line with its platform timestamp." + ) + replicaLabel: str = Field( + description="Public replica label that produced this log line, for example 'replica 2/3'." + ) -class v1TokenUsage(TurnkeyBaseModel): - type: v1UsageType = Field(description="Type of token usage") - tokenId: str = Field(description="Unique identifier for the verification token") - signup: Optional[v1SignupUsage] = Field(default=None) - login: Optional[v1LoginUsage] = Field(default=None) +class v1TvcHealthCheckType(str, Enum): + TVC_HEALTH_CHECK_TYPE_HTTP = "TVC_HEALTH_CHECK_TYPE_HTTP" + TVC_HEALTH_CHECK_TYPE_GRPC = "TVC_HEALTH_CHECK_TYPE_GRPC" -class v1TransactionType(str, Enum): - TRANSACTION_TYPE_ETHEREUM = "TRANSACTION_TYPE_ETHEREUM" - TRANSACTION_TYPE_SOLANA = "TRANSACTION_TYPE_SOLANA" - TRANSACTION_TYPE_TRON = "TRANSACTION_TYPE_TRON" - TRANSACTION_TYPE_BITCOIN = "TRANSACTION_TYPE_BITCOIN" - TRANSACTION_TYPE_TEMPO = "TRANSACTION_TYPE_TEMPO" +class v1TvcManifest(TurnkeyBaseModel): + id: str = Field(description="Unique Identifier for this TVC Manifest.") + manifest: str = Field(description="The manifest content (raw UTF-8 JSON bytes)") + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp class v1TvcManifestApproval(TurnkeyBaseModel): @@ -4789,11 +8286,58 @@ class v1TvcManifestApproval(TurnkeyBaseModel): ) +class v1TvcOperator(TurnkeyBaseModel): + id: str = Field(description="Unique Identifier for this TVC Operator.") + name: str = Field(description="Name of this TVC Operator.") + publicKey: str = Field(description="Public key for this TVC Operator.") + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + encryptPublicKey: str = Field( + description="Encryption public key for this TVC Operator." + ) + signPublicKey: str = Field(description="Signing public key for this TVC Operator.") + keySource: Optional[str] = Field( + default=None, + description="Source of the operator keys: EXTERNAL_KEY or ORG_WALLET_ACCOUNT. Absent for legacy operators whose source was not recorded.", + ) + + +class v1TvcOperatorApproval(TurnkeyBaseModel): + id: str = Field(description="Unique ID for this approval") + manifestId: str = Field( + description="Unique Identifier of the TVC Manifest being approved" + ) + operator: v1TvcOperator = Field( + description="The TVC Operator who made this approval" + ) + approval: str = Field( + description="Signature of the operator over the deployment manifest" + ) + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + + class v1TvcOperatorParams(TurnkeyBaseModel): name: str = Field(description="The name for this new operator") publicKey: str = Field(description="Public key for this operator") +class v1TvcOperatorSet(TurnkeyBaseModel): + id: str = Field(description="Unique Identifier for this TVC Operator Set.") + name: str = Field(description="Name of this TVC Operator Set.") + organizationId: str = Field( + description="Unique Identifier of the Organization for this TVC Operator Set" + ) + operators: List[v1TvcOperator] = Field( + description="List of TVC Operators in this set" + ) + threshold: int = Field( + description="Threshold number of operators required for quorum." + ) + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + + class v1TvcOperatorSetParams(TurnkeyBaseModel): name: str = Field(description="Short description for this new operator set") newOperators: Optional[List[v1TvcOperatorParams]] = Field( @@ -4808,6 +8352,15 @@ class v1TvcOperatorSetParams(TurnkeyBaseModel): ) +class v1TvcQuorumKey(TurnkeyBaseModel): + id: str + publicKey: str + threshold: int + operatorIds: List[str] + createdAt: externaldatav1Timestamp + updatedAt: externaldatav1Timestamp + + class v1TxError(TurnkeyBaseModel): message: Optional[str] = Field( default=None, @@ -4817,6 +8370,13 @@ class v1TxError(TurnkeyBaseModel): default=None, description="Chain of revert errors from nested contract calls, ordered from outermost to innermost.", ) + solana: Optional[v1SolanaFailureDetails] = Field( + default=None, + description="Solana-specific failure details for simulation or preflight errors, if available.", + ) + eth: Optional[v1EthFailureDetails] = Field( + default=None, description="Ethereum-specific failure details, if available." + ) class v1UnknownRevertError(TurnkeyBaseModel): @@ -4894,6 +8454,10 @@ class v1UpdateAuthProxyConfigIntent(TurnkeyBaseModel): default=None, description="Whitelisted OAuth client IDs for social account linking. When a user authenticates via a social provider with an email matching an existing account, the accounts will be linked if the client ID is in this list and the issuer is considered a trusted provider.", ) + captchaEnabled: Optional[bool] = Field( + default=None, + description="Whether captcha verification is required on sign up & otp init.", + ) class v1UpdateAuthProxyConfigResult(TurnkeyBaseModel): @@ -4944,6 +8508,44 @@ class v1UpdateFiatOnRampCredentialResult(TurnkeyBaseModel): ) +class v1UpdateMfaPolicyIntent(TurnkeyBaseModel): + userId: str = Field(description="The ID of the User to update the MFA Policy for.") + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + mfaPolicyName: Optional[str] = Field( + default=None, description="Human-readable name for a Policy." + ) + condition: Optional[str] = Field( + default=None, + description="A condition expression that evaluates to true or false, determining when this MFA policy applies.", + ) + requiredAuthenticationMethods: Optional[ + List[v1RequiredAuthenticationMethodParams] + ] = Field( + default=None, + description="An ordered list of authentication requirements. Each requirement must be satisfied sequentially to complete MFA.", + ) + order: Optional[int] = Field( + default=None, + description="The order in which this MFA policy is evaluated, starting from 0, relative to other MFA policies. Lower order values are evaluated first.", + ) + notes: Optional[str] = Field(default=None, description="Notes for an MFA Policy.") + + +class v1UpdateMfaPolicyRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1UpdateMfaPolicyIntent + + +class v1UpdateMfaPolicyResult(TurnkeyBaseModel): + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + + class v1UpdateOauth2CredentialIntent(TurnkeyBaseModel): oauth2CredentialId: str = Field( description="The ID of the OAuth 2.0 credential to update" @@ -4986,6 +8588,7 @@ class v1UpdateOrganizationNameRequest(TurnkeyBaseModel): description="Unique identifier for a given Organization." ) parameters: v1UpdateOrganizationNameIntent + generateAppProofs: Optional[bool] = Field(default=None) class v1UpdateOrganizationNameResult(TurnkeyBaseModel): @@ -5035,6 +8638,10 @@ class v1UpdatePolicyIntentV2(TurnkeyBaseModel): policyNotes: Optional[str] = Field( default=None, description="Accompanying notes for a Policy (optional)." ) + time: Optional[str] = Field( + default=None, + description="The time expression that triggers the Effect (optional).", + ) class v1UpdatePolicyRequest(TurnkeyBaseModel): @@ -5116,6 +8723,28 @@ class v1UpdateRootQuorumResult(TurnkeyBaseModel): pass +class v1UpdateTvcAppLiveDeploymentIntent(TurnkeyBaseModel): + deploymentId: str = Field( + description="The unique identifier of the TVC deployment to set as live for the app." + ) + + +class v1UpdateTvcAppLiveDeploymentRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1UpdateTvcAppLiveDeploymentIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1UpdateTvcAppLiveDeploymentResult(TurnkeyBaseModel): + pass + + class v1UpdateUserEmailIntent(TurnkeyBaseModel): userId: str = Field(description="Unique identifier for a given User.") userEmail: str = Field( @@ -5259,6 +8888,19 @@ class v1UpdateUserTagResult(TurnkeyBaseModel): userTagId: str = Field(description="Unique identifier for a given User Tag.") +class v1UpdateWalletAccountNameIntent(TurnkeyBaseModel): + walletAccountId: str = Field( + description="Unique identifier for a given Wallet Account." + ) + name: str = Field(description="Human-readable name for this Wallet Account.") + + +class v1UpdateWalletAccountNameResult(TurnkeyBaseModel): + walletAccountId: str = Field( + description="Unique identifier for a given Wallet Account." + ) + + class v1UpdateWalletIntent(TurnkeyBaseModel): walletId: str = Field(description="Unique identifier for a given Wallet.") walletName: Optional[str] = Field( @@ -5282,25 +8924,163 @@ class v1UpdateWalletResult(TurnkeyBaseModel): walletId: str = Field(description="A Wallet ID.") -class v1UpsertGasUsageConfigIntent(TurnkeyBaseModel): +class v1UpdateWebhookEndpointIntent(TurnkeyBaseModel): + endpointId: str = Field( + description="Unique identifier of the webhook endpoint to update." + ) + url: Optional[str] = Field( + default=None, description="Updated destination URL for webhook delivery." + ) + name: Optional[str] = Field( + default=None, + description="Updated human-readable name for this webhook endpoint.", + ) + isActive: Optional[bool] = Field( + default=None, description="Whether this webhook endpoint is active." + ) + + +class v1UpdateWebhookEndpointRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1UpdateWebhookEndpointIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1UpdateWebhookEndpointResult(TurnkeyBaseModel): + endpointId: str = Field( + description="Unique identifier of the updated webhook endpoint." + ) + webhookEndpoint: v1WebhookEndpointData = Field( + description="The updated webhook endpoint data." + ) + + +class v1UpsertGasUsageConfigIntent(TurnkeyBaseModel): + orgWindowLimitUsd: str = Field( + description="Gas sponsorship USD limit for the billing organization window." + ) + subOrgWindowLimitUsd: str = Field( + description="Gas sponsorship USD limit for sub-organizations under the billing organization." + ) + windowDurationMinutes: str = Field( + description="Rolling sponsorship window duration, expressed in minutes. This value can't exceed 30 days (43200 minutes)." + ) + enabled: Optional[bool] = Field( + default=None, + description="Whether gas sponsorship is enabled for the organization.", + ) + solanaConfig: Optional[v1SolanaConfig] = Field( + default=None, + description="Optional Solana sponsorship settings. If omitted, the existing Solana sponsorship state is left unchanged.", + ) + + +class v1UpsertGasUsageConfigResult(TurnkeyBaseModel): + gasUsageConfigId: str = Field( + description="Unique identifier for the gas usage configuration that was created or updated." + ) + + +class v1UpsertSwapConfigIntent(TurnkeyBaseModel): + feeReceiverWalletAddress: Optional[str] = Field( + default=None, + description="Organization-owned wallet account that receives swap fees. Required when fee_bps is set. Omit together with fee_bps to clear swap fees.", + ) + feeBps: Optional[str] = Field( + default=None, + description="Client fee in basis points applied to swaps; used for all pairs unless stable_fee_bps is set.", + ) + stableFeeBps: Optional[str] = Field( + default=None, + description="Optional Enterprise-only override applied when both swap assets are stablecoins; falls back to fee_bps when unset. Non-Enterprise orgs may only set fee_bps.", + ) + + +class v1UpsertSwapConfigRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1UpsertSwapConfigIntent + generateAppProofs: Optional[bool] = Field(default=None) + + +class v1UpsertSwapConfigResult(TurnkeyBaseModel): + feeReceiverWalletAddress: Optional[str] = Field(default=None) + feeBps: Optional[str] = Field(default=None) + stableFeeBps: Optional[str] = Field(default=None) + + +class v1UpsertSwapFeeSponsorshipLimitConfigIntent(TurnkeyBaseModel): + orgWindowLimitUsd: str = Field( + description="Positive USD limit shared by the billing parent and its sub-organizations. At most 18 integer and 12 fractional digits." + ) + subOrgWindowLimitUsd: str = Field( + description="Positive USD limit for each sub-organization, no greater than the parent limit." + ) + windowDurationMinutes: str = Field( + description="Positive rolling window duration in minutes, at most 153722867." + ) + enabled: bool = Field( + description="Whether this spending window permits new swaps. Setting false only turns the saved window off and keeps its limits; it doesn't require the signed permission. This does not grant or remove the signed organization permission." + ) + + +class v1UpsertSwapFeeSponsorshipLimitConfigRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1UpsertSwapFeeSponsorshipLimitConfigIntent + + +class v1UpsertSwapFeeSponsorshipLimitConfigResult(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier of the organization the limit config was saved for." + ) + + +class v1UpsertSwapFixedRateLimitConfigIntent(TurnkeyBaseModel): orgWindowLimitUsd: str = Field( - description="Gas sponsorship USD limit for the billing organization window." + description="Positive USD limit shared by the billing parent and its sub-organizations. At most 18 integer and 12 fractional digits." ) subOrgWindowLimitUsd: str = Field( - description="Gas sponsorship USD limit for sub-organizations under the billing organization." + description="Positive USD limit for each sub-organization, no greater than the parent limit." ) windowDurationMinutes: str = Field( - description="Rolling sponsorship window duration, expressed in minutes." + description="Positive rolling window duration in minutes, at most 153722867." ) - enabled: Optional[bool] = Field( - default=None, - description="Whether gas sponsorship is enabled for the organization.", + enabled: bool = Field( + description="Whether this spending window permits new swaps. Setting false only turns the saved window off and keeps its limits; it doesn't require the signed permission. This does not grant or remove the signed organization permission." ) -class v1UpsertGasUsageConfigResult(TurnkeyBaseModel): - gasUsageConfigId: str = Field( - description="Unique identifier for the gas usage configuration that was created or updated." +class v1UpsertSwapFixedRateLimitConfigRequest(TurnkeyBaseModel): + type: str + timestampMs: str = Field( + description="Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + ) + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + parameters: v1UpsertSwapFixedRateLimitConfigIntent + + +class v1UpsertSwapFixedRateLimitConfigResult(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier of the organization the limit config was saved for." ) @@ -5331,6 +9111,9 @@ class v1User(TurnkeyBaseModel): ) createdAt: externaldatav1Timestamp updatedAt: externaldatav1Timestamp + mfaPolicies: List[v1MfaPolicy] = Field( + description="A list of MFA Policies that define multi-factor authentication requirements for this user." + ) class v1UserParams(TurnkeyBaseModel): @@ -5391,6 +9174,199 @@ class v1UserParamsV3(TurnkeyBaseModel): ) +class v1UserParamsV4(TurnkeyBaseModel): + userName: str = Field(description="Human-readable name for a User.") + userEmail: Optional[str] = Field( + default=None, description="The user's email address." + ) + userPhoneNumber: Optional[str] = Field( + default=None, + description="The user's phone number in E.164 format e.g. +13214567890", + ) + apiKeys: List[v1ApiKeyParamsV2] = Field( + description="A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + ) + authenticators: List[v1AuthenticatorParamsV2] = Field( + description="A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + ) + oauthProviders: List[v1OauthProviderParamsV2] = Field( + description="A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + ) + userTags: List[str] = Field( + description="A list of User Tag IDs. This field, if not needed, should be an empty array in your request body." + ) + + +class v1ValidateTvcImageRequest(TurnkeyBaseModel): + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + pivotContainerImageUrl: str = Field(description="URL of the container image.") + pivotContainerEncryptedPullSecret: Optional[str] = Field( + default=None, description="HPKE-encrypted pull secret for private images." + ) + + +class v1ValidateTvcImageResponse(TurnkeyBaseModel): + resolvedImageDigest: Optional[str] = Field(default=None) + + +class v1VelocityControlAggregation(TurnkeyBaseModel): + method: v1VelocityControlAggregationMethod = Field( + description="Method that aggregates matching data points." + ) + operator: v1VelocityControlAggregationOperator = Field( + description="Comparison between the aggregate and the threshold." + ) + threshold: str = Field( + description="Non-negative base-10 decimal string with at most 38 total digits and 18 fractional digits." + ) + window: v1VelocityControlAggregationWindow = Field( + description="Time window for the aggregation." + ) + groupBy: v1VelocityControlAggregationGroupBy = Field( + description="Scope that partitions matching data before aggregation." + ) + + +class v1VelocityControlAggregationGroupBy(TurnkeyBaseModel): + organization: Optional[v1VelocityControlAggregationGroupByOrganization] = Field( + default=None, description="Uses one shared bucket for the Organization." + ) + user: Optional[v1VelocityControlAggregationGroupByUser] = Field( + default=None, description="Uses one bucket for each User." + ) + wallet: Optional[v1VelocityControlAggregationGroupByWallet] = Field( + default=None, description="Uses one bucket for each Wallet." + ) + + +class v1VelocityControlAggregationGroupByOrganization(TurnkeyBaseModel): + pass + + +class v1VelocityControlAggregationGroupByUser(TurnkeyBaseModel): + pass + + +class v1VelocityControlAggregationGroupByWallet(TurnkeyBaseModel): + pass + + +class v1VelocityControlAggregationMethod(str, Enum): + VELOCITY_CONTROL_AGGREGATION_METHOD_SUM = "VELOCITY_CONTROL_AGGREGATION_METHOD_SUM" + VELOCITY_CONTROL_AGGREGATION_METHOD_COUNT = ( + "VELOCITY_CONTROL_AGGREGATION_METHOD_COUNT" + ) + + +class v1VelocityControlAggregationOperator(str, Enum): + VELOCITY_CONTROL_AGGREGATION_OPERATOR_LESS_THAN = ( + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_LESS_THAN" + ) + VELOCITY_CONTROL_AGGREGATION_OPERATOR_LESS_THAN_OR_EQUAL = ( + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_LESS_THAN_OR_EQUAL" + ) + VELOCITY_CONTROL_AGGREGATION_OPERATOR_EQUAL = ( + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_EQUAL" + ) + VELOCITY_CONTROL_AGGREGATION_OPERATOR_GREATER_THAN_OR_EQUAL = ( + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_GREATER_THAN_OR_EQUAL" + ) + VELOCITY_CONTROL_AGGREGATION_OPERATOR_GREATER_THAN = ( + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_GREATER_THAN" + ) + + +class v1VelocityControlAggregationWindow(TurnkeyBaseModel): + rolling: Optional[v1VelocityControlAggregationWindowRolling] = Field( + default=None, description="Uses a rolling time window." + ) + infinite: Optional[v1VelocityControlAggregationWindowInfinite] = Field( + default=None, description="Uses all matching data without a time limit." + ) + + +class v1VelocityControlAggregationWindowInfinite(TurnkeyBaseModel): + pass + + +class v1VelocityControlAggregationWindowRolling(TurnkeyBaseModel): + duration: int = Field(description="Duration of the rolling window, in seconds.") + + +class v1VelocityControlDataSource(TurnkeyBaseModel): + chainAssetTransfer: Optional[v1VelocityControlDataSourceChainAssetTransfer] = Field( + default=None, + description="Uses transfers of the listed on-chain assets as input data.", + ) + activityExecution: Optional[v1VelocityControlDataSourceActivityExecution] = Field( + default=None, description="Uses executed Turnkey activities as input data." + ) + + +class v1VelocityControlDataSourceActivityExecution(TurnkeyBaseModel): + filter: Optional[v1VelocityControlDataSourceActivityExecutionFilter] = Field( + default=None, description="Filters activity executions by type." + ) + + +class v1VelocityControlDataSourceActivityExecutionFilter(TurnkeyBaseModel): + activity: Optional[List[v1VelocityControlDataSourceFilterActivity]] = Field( + default=None, description="Activity types whose executions are included." + ) + + +class v1VelocityControlDataSourceChainAssetTransfer(TurnkeyBaseModel): + definition: List[v1VelocityControlDataSourceChainAssetTransferDefinition] = Field( + description="Assets whose transfers are included in the data source." + ) + filter: Optional[v1VelocityControlDataSourceChainAssetTransferFilter] = Field( + default=None, description="Filters asset transfers by activity type." + ) + phase: Optional[v1VelocityControlDataSourcePhase] = Field( + default=None, description="Selects when to measure an asset transfer." + ) + + +class v1VelocityControlDataSourceChainAssetTransferDefinition(TurnkeyBaseModel): + caip19: str = Field(description="CAIP-19 identifier for the asset.") + decimals: int = Field( + description="Integer between 0 and 255 (inclusive) that specifies the number of decimal places for the asset." + ) + + +class v1VelocityControlDataSourceChainAssetTransferFilter(TurnkeyBaseModel): + activity: Optional[List[v1VelocityControlDataSourceFilterActivity]] = Field( + default=None, description="Activity types whose asset transfers are included." + ) + + +class v1VelocityControlDataSourceFilterActivity(TurnkeyBaseModel): + activityType: str = Field( + description="Name of an activity type to include, such as `ACTIVITY_TYPE_SOL_SEND_TRANSACTION`." + ) + + +class v1VelocityControlDataSourcePhase(TurnkeyBaseModel): + signature: Optional[v1VelocityControlDataSourcePhaseSignature] = Field( + default=None, + description="Measures the transfer when Turnkey signs the transaction and returns it to the user.", + ) + submission: Optional[v1VelocityControlDataSourcePhaseSubmission] = Field( + default=None, + description="Reserved for future use. Measures the transfer after the transaction lands on chain.", + ) + + +class v1VelocityControlDataSourcePhaseSignature(TurnkeyBaseModel): + pass + + +class v1VelocityControlDataSourcePhaseSubmission(TurnkeyBaseModel): + pass + + class v1VerifyOtpIntent(TurnkeyBaseModel): otpId: str = Field( description="ID representing the result of an init OTP activity." @@ -5496,6 +9472,14 @@ class v1WalletAccount(TurnkeyBaseModel): default=None, description="Wallet details for this account. This is only present when include_wallet_details=true.", ) + name: Optional[str] = Field( + default=None, + description="Human-readable name for this Wallet Account, unique within the organization.", + ) + caip2Prefix: Optional[str] = Field( + default=None, + description="The CAIP-2 namespace shared by the chains supported by this account (for example, 'eip155' or 'solana').", + ) class v1WalletAccountParams(TurnkeyBaseModel): @@ -5509,6 +9493,9 @@ class v1WalletAccountParams(TurnkeyBaseModel): addressFormat: v1AddressFormat = Field( description="Address format used to generate a wallet Acccount." ) + name: Optional[str] = Field( + default=None, description="Optional human-readable name for the account." + ) class v1WalletKitSettingsParams(TurnkeyBaseModel): @@ -5557,9 +9544,51 @@ class v1WebAuthnStamp(TurnkeyBaseModel): ) +class v1WebhookEndpointData(TurnkeyBaseModel): + endpointId: str = Field(description="Unique identifier of the webhook endpoint.") + organizationId: str = Field( + description="Unique identifier for a given Organization." + ) + url: str = Field(description="The destination URL for webhook delivery.") + name: str = Field(description="Human-readable name for this webhook endpoint.") + isActive: bool = Field(description="Whether this webhook endpoint is active.") + subscriptions: Optional[List[v1WebhookSubscriptionParams]] = Field( + default=None, description="Current subscriptions attached to this endpoint." + ) + + +class v1WebhookSubscriptionParams(TurnkeyBaseModel): + eventType: str = Field( + description="The event type to subscribe to (for example, ACTIVITY_UPDATES, BALANCE_CONFIRMED_UPDATES, or BALANCE_FINALIZED_UPDATES)." + ) + filtersJson: Optional[str] = Field( + default=None, description="JSON-encoded filter criteria for this subscription." + ) + isActive: Optional[bool] = Field( + default=None, description="Whether this subscription is active." + ) + + # --- API Types from Swagger Paths --- +class GetActivePoliciesResponse(TurnkeyBaseModel): + statuses: List[v1ActivePolicyStatus] = Field( + description="The active/inactive status of every policy in the organization." + ) + evaluatedAtMs: str = Field( + description="The enclave's trusted timestamp (Unix epoch milliseconds) used to evaluate every policy." + ) + + +class GetActivePoliciesBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + + +class GetActivePoliciesInput(TurnkeyBaseModel): + body: GetActivePoliciesBody + + class GetActivityResponse(TurnkeyBaseModel): activity: v1Activity = Field( description="An action that can be taken within the Turnkey infrastructure." @@ -5605,6 +9634,19 @@ class GetApiKeysInput(TurnkeyBaseModel): body: GetApiKeysBody +class GetAppStatusResponse(TurnkeyBaseModel): + appStatus: v1AppStatus = Field(description="Live runtime status for the TVC App") + + +class GetAppStatusBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + appId: str = Field(description="Unique identifier for a given TVC App.") + + +class GetAppStatusInput(TurnkeyBaseModel): + body: GetAppStatusBody + + class GetAuthenticatorResponse(TurnkeyBaseModel): authenticator: v1Authenticator = Field(description="An authenticator.") @@ -5648,6 +9690,117 @@ class GetBootProofInput(TurnkeyBaseModel): body: GetBootProofBody +class GetClaimEarnFeesStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the fee claim.") + claimTxHash: Optional[str] = Field( + default=None, description="Transaction hash of the fee claim, once available." + ) + error: Optional[str] = Field( + default=None, + description="Reason the fee claim transaction failed, when status is FAILED.", + ) + + +class GetClaimEarnFeesStatusBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + claimRequestId: str = Field( + description="The claim_request_id returned by ClaimEarnFees." + ) + + +class GetClaimEarnFeesStatusInput(TurnkeyBaseModel): + body: GetClaimEarnFeesStatusBody + + +class GetEarnClaimRewardsStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the rewards claim.") + claimTxHash: Optional[str] = Field( + default=None, + description="Transaction hash of the rewards claim, once available.", + ) + error: Optional[str] = Field( + default=None, + description="Reason the rewards claim transaction failed, when status is FAILED.", + ) + + +class GetEarnClaimRewardsStatusBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + claimRequestId: str = Field( + description="The claim_request_id returned by EarnClaimRewards." + ) + + +class GetEarnClaimRewardsStatusInput(TurnkeyBaseModel): + body: GetEarnClaimRewardsStatusBody + + +class GetEarnDeployStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the wrapper deployment.") + deployTxHash: Optional[str] = Field( + default=None, description="Transaction hash of the deployment, once available." + ) + error: Optional[str] = Field( + default=None, + description="Reason the deployment transaction failed, when status is FAILED.", + ) + + +class GetEarnDeployStatusBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + deployRequestId: str = Field( + description="The deploy_request_id returned by EarnDeployWrapper." + ) + + +class GetEarnDeployStatusInput(TurnkeyBaseModel): + body: GetEarnDeployStatusBody + + +class GetEarnDepositStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the deposit.") + depositTxHash: Optional[str] = Field( + default=None, description="Transaction hash of the deposit, once available." + ) + error: Optional[str] = Field( + default=None, + description="Reason the deposit transaction failed, when status is FAILED.", + ) + + +class GetEarnDepositStatusBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + depositRequestId: str = Field( + description="The deposit_request_id returned by EarnDeposit." + ) + + +class GetEarnDepositStatusInput(TurnkeyBaseModel): + body: GetEarnDepositStatusBody + + +class GetEarnWithdrawStatusResponse(TurnkeyBaseModel): + status: str = Field(description="Status of the withdrawal.") + withdrawTxHash: Optional[str] = Field( + default=None, description="Transaction hash of the withdrawal, once available." + ) + error: Optional[str] = Field( + default=None, + description="Reason the withdrawal transaction failed, when status is FAILED.", + ) + + +class GetEarnWithdrawStatusBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + withdrawRequestId: str = Field( + description="The withdraw_request_id returned by EarnWithdraw." + ) + + +class GetEarnWithdrawStatusInput(TurnkeyBaseModel): + body: GetEarnWithdrawStatusBody + + class GetGasUsageResponse(TurnkeyBaseModel): windowDurationMinutes: int = Field( description="The window duration (in minutes) for the organization or sub-organization." @@ -5668,17 +9821,85 @@ class GetGasUsageInput(TurnkeyBaseModel): body: GetGasUsageBody -class GetLatestBootProofResponse(TurnkeyBaseModel): - bootProof: v1BootProof +class GetIpAllowlistResponse(TurnkeyBaseModel): + allowlist: v1IpAllowlist + + +class GetIpAllowlistBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + publicKey: Optional[str] = Field( + default=None, + description="If provided, return only the allowlist for this specific API key.", + ) + + +class GetIpAllowlistInput(TurnkeyBaseModel): + body: GetIpAllowlistBody + + +class GetLatestBootProofResponse(TurnkeyBaseModel): + bootProof: v1BootProof + + +class GetLatestBootProofBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + appName: str = Field(description="Unique identifier (UUID) of the enclave app.") + + +class GetLatestBootProofInput(TurnkeyBaseModel): + body: GetLatestBootProofBody + + +class GetMfaPoliciesResponse(TurnkeyBaseModel): + mfaPolicies: List[v1MfaPolicy] = Field( + description="A list of multi-factor authentication policies for a user." + ) + + +class GetMfaPoliciesBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + userId: str = Field(description="Unique identifier for a given user.") + + +class GetMfaPoliciesInput(TurnkeyBaseModel): + body: GetMfaPoliciesBody + + +class GetMfaPolicyResponse(TurnkeyBaseModel): + mfaPolicy: v1MfaPolicy = Field( + description="Multi-factor authentication policy for a user." + ) + + +class GetMfaPolicyBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + userId: str = Field(description="Unique identifier for a given user.") + mfaPolicyId: str = Field(description="Unique identifier for a given MFA policy.") + + +class GetMfaPolicyInput(TurnkeyBaseModel): + body: GetMfaPolicyBody + + +class GetMfaStatusResponse(TurnkeyBaseModel): + mfaStatuses: List[v1MfaStatus] = Field( + description="A list of MFA statuses for the activity's votes." + ) -class GetLatestBootProofBody(TurnkeyBaseModel): +class GetMfaStatusBody(TurnkeyBaseModel): organizationId: Optional[str] = None - appName: str = Field(description="Name of enclave app.") + activityId: str = Field( + description="The unique identifier of the activity to get MFA status for." + ) + userId: Optional[str] = Field( + default=None, + description="Optional user ID to filter MFA status for a specific user.", + ) -class GetLatestBootProofInput(TurnkeyBaseModel): - body: GetLatestBootProofBody +class GetMfaStatusInput(TurnkeyBaseModel): + body: GetMfaStatusBody class GetNoncesResponse(TurnkeyBaseModel): @@ -5826,6 +10047,9 @@ class GetSendTransactionStatusResponse(TurnkeyBaseModel): eth: Optional[v1EthSendTransactionStatus] = Field( default=None, description="Ethereum-specific transaction status." ) + solana: Optional[v1SolanaSendTransactionStatus] = Field( + default=None, description="Solana-specific transaction status." + ) txError: Optional[str] = Field( default=None, description="The error encountered when broadcasting or confirming the transaction, if any.", @@ -5847,6 +10071,37 @@ class GetSendTransactionStatusInput(TurnkeyBaseModel): body: GetSendTransactionStatusBody +class GetSessionProfileResponse(TurnkeyBaseModel): + sessionProfile: v1SessionProfile = Field( + description="Session profile for a user, including details about the user's authenticators, Oauth providers, API keys, and MFA policies." + ) + + +class GetSessionProfileBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + sessionProfileId: str = Field( + description="Unique identifier for a session profile." + ) + + +class GetSessionProfileInput(TurnkeyBaseModel): + body: GetSessionProfileBody + + +class GetSessionProfilesResponse(TurnkeyBaseModel): + sessionProfiles: List[v1SessionProfile] = Field( + description="A list of session profiles for users in the organization." + ) + + +class GetSessionProfilesBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + + +class GetSessionProfilesInput(TurnkeyBaseModel): + body: GetSessionProfilesBody + + class GetSmartContractInterfaceResponse(TurnkeyBaseModel): smartContractInterface: externaldatav1SmartContractInterface = Field( description="Object to be used in conjunction with policies to guard transaction signing." @@ -5864,6 +10119,164 @@ class GetSmartContractInterfaceInput(TurnkeyBaseModel): body: GetSmartContractInterfaceBody +class GetSwapSponsorshipUsageResponse(TurnkeyBaseModel): + feeSponsorship: v1SwapSponsorshipFeature + fixedRate: v1SwapSponsorshipFeature + + +class GetSwapSponsorshipUsageBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + + +class GetSwapSponsorshipUsageInput(TurnkeyBaseModel): + body: GetSwapSponsorshipUsageBody + + +class GetSwapStatusResponse(TurnkeyBaseModel): + status: str = Field( + description="Normalized swap status. One of PENDING, COMPLETED, FAILED." + ) + swapKind: str = Field(description="SAME_CHAIN or CROSS_CHAIN.") + provider: str = Field(description="Swap provider that executed the swap.") + inputToken: str = Field(description="CAIP-19 asset ID for the input asset.") + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + inputAmount: str = Field(description="Base-unit amount of the input asset.") + originTxHash: Optional[str] = Field( + default=None, + description="Final included origin-chain transaction hash, when known.", + ) + destinationTxHashes: Optional[List[str]] = Field( + default=None, + description="Provider-reported destination-chain transaction hashes; cross-chain COMPLETED only.", + ) + outputAmount: Optional[str] = Field( + default=None, + description="Actual base-unit output amount on COMPLETED, when known. Unset on FAILED.", + ) + refund: Optional[v1SwapRefund] = Field( + default=None, + description="Funds returned by the provider after a successful origin transfer and failed cross-chain fill. Omitted for origin transaction failures and same-chain swaps.", + ) + updatedAt: str = Field( + description="Timestamp of the last swap status change, as millisecond epoch string." + ) + error: Optional[v1SwapError] = Field( + default=None, + description="Normalized failure details, present whenever status is FAILED.", + ) + destinationAddress: Optional[str] = Field( + default=None, description="Address that receives the output asset." + ) + + +class GetSwapStatusBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + swapRequestId: str = Field( + description="The swap_request_id returned by ExecuteSwap." + ) + + +class GetSwapStatusInput(TurnkeyBaseModel): + body: GetSwapStatusBody + + +class GetTvcAppResponse(TurnkeyBaseModel): + tvcApp: v1TvcApp = Field(description="Details about a single TVC App") + + +class GetTvcAppBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + tvcAppId: str = Field(description="Unique identifier for a given TVC App.") + + +class GetTvcAppInput(TurnkeyBaseModel): + body: GetTvcAppBody + + +class GetTvcDeploymentResponse(TurnkeyBaseModel): + tvcDeployment: v1TvcDeployment = Field( + description="Details about a single TVC Deployment" + ) + + +class GetTvcDeploymentBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + deploymentId: str = Field( + description="Unique identifier for a given TVC Deployment." + ) + + +class GetTvcDeploymentInput(TurnkeyBaseModel): + body: GetTvcDeploymentBody + + +class GetTvcDeploymentDebugLogsResponse(TurnkeyBaseModel): + entries: List[v1TvcDeploymentDebugLogEntry] = Field( + description="Application log entries sorted by platform timestamp." + ) + + +class GetTvcDeploymentDebugLogsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + deploymentId: str = Field( + description="Unique identifier for a given TVC Deployment. The deployment must be running in debug mode." + ) + tailLines: Optional[int] = Field( + default=None, + description="Limit returned history to the last N lines per replica. If unset or zero, no tail-line limit is applied.", + ) + sinceSeconds: Optional[str] = Field( + default=None, + description="Return logs newer than this many seconds ago. If unset or zero, no since-time limit is applied. Useful for clients that poll to follow logs.", + ) + + +class GetTvcDeploymentDebugLogsInput(TurnkeyBaseModel): + body: GetTvcDeploymentDebugLogsBody + + +class GetTvcDeploymentProvisioningDetailsResponse(TurnkeyBaseModel): + attestationDocument: Optional[str] = Field( + default=None, + description="The attestation document of the provisioning enclave. Present only when a deployment is awaiting provisioning.", + ) + manifestEnvelope: Optional[str] = Field( + default=None, + description="The manifest envelope containing the TVC deployment's manifest and signatures. Present only when a deployment is awaiting provisioning.", + ) + provisioningState: v1ProvisioningState = Field( + description="Current provisioning state." + ) + + +class GetTvcDeploymentProvisioningDetailsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + deploymentId: str = Field( + description="Unique identifier for a given TVC Deployment." + ) + + +class GetTvcDeploymentProvisioningDetailsInput(TurnkeyBaseModel): + body: GetTvcDeploymentProvisioningDetailsBody + + +class GetTvcQosVersionsResponse(TurnkeyBaseModel): + availableVersions: List[str] = Field( + description="QOS versions supported for new TVC deployments." + ) + latestVersion: str = Field( + description="Latest recommended QOS version for new TVC deployments." + ) + + +class GetTvcQosVersionsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + + +class GetTvcQosVersionsInput(TurnkeyBaseModel): + body: GetTvcQosVersionsBody + + class GetUserResponse(TurnkeyBaseModel): user: v1User = Field(description="Web and/or API user within your organization.") @@ -5919,7 +10332,9 @@ class GetWalletAddressBalancesResponse(TurnkeyBaseModel): class GetWalletAddressBalancesBody(TurnkeyBaseModel): organizationId: Optional[str] = None - address: str = Field(description="Address corresponding to a wallet account.") + address: str = Field( + description="Address corresponding to a wallet account. Private key addresses are not supported." + ) caip2: str = Field( description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." ) @@ -5965,6 +10380,146 @@ class GetAppProofsInput(TurnkeyBaseModel): body: GetAppProofsBody +class ListEarnEnabledVaultsResponse(TurnkeyBaseModel): + enabledVaults: Optional[List[v1EarnEnabledVault]] = Field( + default=None, description="The organization's deployed wrappers." + ) + + +class ListEarnEnabledVaultsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + provider: Optional[v1EarnProvider] = Field( + default=None, + description="Optional filter: only return enabled vaults from this provider. Leave EARN_PROVIDER_UNSPECIFIED to return all providers.", + ) + caip19: Optional[str] = Field( + default=None, + description="Optional filter: only return enabled vaults whose underlying asset matches this CAIP-19 asset ID (e.g. 'eip155:8453/erc20:0x833589...'). The chain is taken from the CAIP-19 identifier.", + ) + includeExposure: Optional[bool] = Field( + default=None, + description="When true, populate each vault's exposures (the underlying markets it allocates into). This costs an extra provider query per vault, so leave it off for list views.", + ) + + +class ListEarnEnabledVaultsInput(TurnkeyBaseModel): + body: ListEarnEnabledVaultsBody + + +class ListEarnPositionsResponse(TurnkeyBaseModel): + positions: Optional[List[v1EarnPosition]] = Field( + default=None, description="The wallet's active Earn positions." + ) + + +class ListEarnPositionsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + walletAddress: str = Field( + description="The wallet address to return positions for." + ) + + +class ListEarnPositionsInput(TurnkeyBaseModel): + body: ListEarnPositionsBody + + +class ListEarnRewardsResponse(TurnkeyBaseModel): + rewards: Optional[List[v1EarnReward]] = Field( + default=None, + description="The wallet's rewards, one entry per (chain, reward token), sorted by chain then token. Entries where every amount is zero are omitted.", + ) + + +class ListEarnRewardsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + walletAddress: str = Field(description="The wallet address to return rewards for.") + caip2: Optional[str] = Field( + default=None, + description="Optional filter: only return rewards on this chain (e.g. 'eip155:8453'). When unset, every chain the organization has deployed Earn wrappers on is queried.", + ) + + +class ListEarnRewardsInput(TurnkeyBaseModel): + body: ListEarnRewardsBody + + +class ListEarnVaultsResponse(TurnkeyBaseModel): + vaults: Optional[List[v1EarnVault]] = Field( + default=None, + description="The catalog of wrappable vaults, sorted by TVL (USD) descending. To page, pass page_info.end_cursor as the pagination after cursor.", + ) + pageInfo: Optional[v1PageInfo] = Field( + default=None, + description="Pagination metadata for the returned page. Pass end_cursor as the next request's after cursor (or start_cursor as the before cursor) to page through the catalog. Cursors are opaque; do not parse them.", + ) + + +class ListEarnVaultsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + provider: Optional[v1EarnProvider] = Field( + default=None, + description="Optional filter: only return vaults from this provider. Leave EARN_PROVIDER_UNSPECIFIED to return all providers.", + ) + caip19: str = Field( + description="CAIP-19 asset ID (e.g. 'eip155:8453/erc20:0x833589...') to return vaults for. Only vaults whose underlying asset matches are returned; the chain is taken from the CAIP-19 identifier." + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, + description="Pagination over the TVL-sorted catalog. before/after cursors are a vault_address from a prior page.", + ) + + +class ListEarnVaultsInput(TurnkeyBaseModel): + body: ListEarnVaultsBody + + +class ListEmailEventsResponse(TurnkeyBaseModel): + emailEvents: List[v1EmailEvent] = Field( + description="Email events matching the requested filters, ordered by most recent event first." + ) + + +class ListEmailEventsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + email: str = Field(description="Recipient email address to list email events for") + eventType: Optional[str] = Field( + default=None, + description="Optional email event type to filter by. Examples include Send, Delivery, Bounce, and DeliveryDelay", + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, description="Parameters used for cursor-based pagination" + ) + + +class ListEmailEventsInput(TurnkeyBaseModel): + body: ListEmailEventsBody + + +class ListEthTransactionHistoryResponse(TurnkeyBaseModel): + transactions: List[v1EthTransactionHistoryItem] = Field( + description="EVM transactions for the requested address, ordered by most recent first." + ) + pageInfo: Optional[v1PageInfo] = Field(default=None) + + +class ListEthTransactionHistoryBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + address: str = Field( + description="Address corresponding to a wallet account. Private key addresses are not supported." + ) + caip2: str = Field( + description="EVM CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, + description="Cursor-based pagination options. Cursors are opaque and valid only for the same address and CAIP-2 query.", + ) + + +class ListEthTransactionHistoryInput(TurnkeyBaseModel): + body: ListEthTransactionHistoryBody + + class ListFiatOnRampCredentialsResponse(TurnkeyBaseModel): fiatOnRampCredentials: List[v1FiatOnRampCredential] @@ -6025,6 +10580,23 @@ class GetPrivateKeysInput(TurnkeyBaseModel): body: GetPrivateKeysBody +class ListSecretsResponse(TurnkeyBaseModel): + secrets: List[v1SecretMetadata] = Field( + description="Metadata for each secret in the organization, ordered by most recently created first." + ) + + +class ListSecretsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + paginationOptions: Optional[v1Pagination] = Field( + default=None, description="Parameters used for cursor-based pagination." + ) + + +class ListSecretsInput(TurnkeyBaseModel): + body: ListSecretsBody + + class GetSmartContractInterfacesResponse(TurnkeyBaseModel): smartContractInterfaces: List[externaldatav1SmartContractInterface] = Field( description="A list of smart contract interfaces." @@ -6039,6 +10611,31 @@ class GetSmartContractInterfacesInput(TurnkeyBaseModel): body: GetSmartContractInterfacesBody +class ListSolTransactionHistoryResponse(TurnkeyBaseModel): + transactions: List[v1SolTransactionHistoryItem] = Field( + description="Solana transactions for the requested address, ordered by most recent first." + ) + pageInfo: Optional[v1PageInfo] = Field(default=None) + + +class ListSolTransactionHistoryBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + address: str = Field( + description="Address corresponding to a wallet account. Private key addresses are not supported." + ) + caip2: str = Field( + description="Solana CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." + ) + paginationOptions: Optional[v1Pagination] = Field( + default=None, + description="Cursor-based pagination options. Cursors are opaque and valid only for the same address and CAIP-2 query.", + ) + + +class ListSolTransactionHistoryInput(TurnkeyBaseModel): + body: ListSolTransactionHistoryBody + + class GetSubOrgIdsResponse(TurnkeyBaseModel): organizationIds: List[str] = Field( description="List of unique identifiers for the matching sub-organizations." @@ -6070,15 +10667,70 @@ class ListSupportedAssetsResponse(TurnkeyBaseModel): ) -class ListSupportedAssetsBody(TurnkeyBaseModel): +class ListSupportedAssetsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." + ) + + +class ListSupportedAssetsInput(TurnkeyBaseModel): + body: ListSupportedAssetsBody + + +class GetTvcAppDeploymentsResponse(TurnkeyBaseModel): + tvcDeployments: List[v1TvcDeployment] = Field( + description="List of deployments for this TVC App" + ) + + +class GetTvcAppDeploymentsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + appId: str = Field(description="Unique identifier for a given TVC App.") + + +class GetTvcAppDeploymentsInput(TurnkeyBaseModel): + body: GetTvcAppDeploymentsBody + + +class GetTvcAppsResponse(TurnkeyBaseModel): + tvcApps: List[v1TvcApp] = Field(description="A list of TVC Apps.") + + +class GetTvcAppsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + isLive: Optional[bool] = Field( + default=None, + description="Filter TVC Apps by whether they have a live deployment. If omitted, all TVC Apps are returned.", + ) + + +class GetTvcAppsInput(TurnkeyBaseModel): + body: GetTvcAppsBody + + +class GetTvcOperatorsResponse(TurnkeyBaseModel): + tvcOperators: List[v1TvcOperator] + + +class GetTvcOperatorsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + + +class GetTvcOperatorsInput(TurnkeyBaseModel): + body: GetTvcOperatorsBody + + +class GetTvcQuorumKeysResponse(TurnkeyBaseModel): + tvcQuorumKeys: List[v1TvcQuorumKey] + + +class GetTvcQuorumKeysBody(TurnkeyBaseModel): organizationId: Optional[str] = None - caip2: str = Field( - description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." - ) -class ListSupportedAssetsInput(TurnkeyBaseModel): - body: ListSupportedAssetsBody +class GetTvcQuorumKeysInput(TurnkeyBaseModel): + body: GetTvcQuorumKeysBody class ListUserTagsResponse(TurnkeyBaseModel): @@ -6115,7 +10767,7 @@ class GetVerifiedSubOrgIdsBody(TurnkeyBaseModel): organizationId: Optional[str] = None filterType: Optional[str] = Field( default=None, - description="Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE_NUMBER'.", + description="Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN', 'OAUTH_CLAIM', or 'PUBLIC_KEY'", ) filterValue: Optional[str] = Field( default=None, @@ -6167,9 +10819,37 @@ class GetWalletsInput(TurnkeyBaseModel): body: GetWalletsBody +class ListWebhookEndpointsResponse(TurnkeyBaseModel): + webhookEndpoints: List[v1WebhookEndpointData] + + +class ListWebhookEndpointsBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + + +class ListWebhookEndpointsInput(TurnkeyBaseModel): + body: ListWebhookEndpointsBody + + +class ValidateTvcImageResponse(TurnkeyBaseModel): + resolvedImageDigest: Optional[str] = Field(default=None) + + +class ValidateTvcImageBody(TurnkeyBaseModel): + organizationId: Optional[str] = None + pivotContainerImageUrl: str = Field(description="URL of the container image.") + pivotContainerEncryptedPullSecret: Optional[str] = Field( + default=None, description="HPKE-encrypted pull secret for private images." + ) + + +class ValidateTvcImageInput(TurnkeyBaseModel): + body: ValidateTvcImageBody + + class GetWhoamiResponse(TurnkeyBaseModel): organizationId: str = Field( - description="Unique identifier for a given organization." + description="Unique identifier for a given Organization." ) organizationName: str = Field( description="Human-readable name for an organization." @@ -6202,6 +10882,41 @@ class ApproveActivityInput(TurnkeyBaseModel): body: ApproveActivityBody +class ClaimEarnFeesResponse(TurnkeyBaseModel): + activity: v1Activity + claimRequestId: str = Field( + description="Identifier to poll claim status and tx hash via GetClaimEarnFeesStatus." + ) + + +class ClaimEarnFeesBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + wrapperAddress: str = Field( + description="Address of the deployed Earn wrapper to claim fees for. Must be one of the org's deployed wrappers." + ) + + +class ClaimEarnFeesInput(TurnkeyBaseModel): + body: ClaimEarnFeesBody + + +class ClaimSwapFeesResponse(TurnkeyBaseModel): + activity: v1Activity + requestId: str = Field( + description="Relay claim request ID submitted through the permit endpoint." + ) + + +class ClaimSwapFeesBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + + +class ClaimSwapFeesInput(TurnkeyBaseModel): + body: ClaimSwapFeesBody + + class CreateApiKeysResponse(TurnkeyBaseModel): activity: v1Activity apiKeyIds: List[str] = Field(description="A list of API Key IDs.") @@ -6287,6 +11002,32 @@ class CreateInvitationsInput(TurnkeyBaseModel): body: CreateInvitationsBody +class CreateMfaPolicyResponse(TurnkeyBaseModel): + activity: v1Activity + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + + +class CreateMfaPolicyBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + userId: str = Field(description="The ID of the User to add the MFA Policy to.") + mfaPolicyName: str = Field(description="Human-readable name for a Policy.") + condition: str = Field( + description="A condition expression that evaluates to true or false, determining when this MFA policy applies." + ) + requiredAuthenticationMethods: List[v1RequiredAuthenticationMethodParams] = Field( + description="An ordered list of authentication requirements. Each requirement must be satisfied sequentially to complete MFA." + ) + order: int = Field( + description="The order in which this MFA policy is evaluated, starting from 0, relative to other MFA policies. Lower order values are evaluated first." + ) + notes: Optional[str] = Field(default=None, description="Notes for an MFA Policy.") + + +class CreateMfaPolicyInput(TurnkeyBaseModel): + body: CreateMfaPolicyBody + + class CreateOauth2CredentialResponse(TurnkeyBaseModel): activity: v1Activity oauth2CredentialId: str = Field( @@ -6319,7 +11060,7 @@ class CreateOauthProvidersBody(TurnkeyBaseModel): timestampMs: Optional[str] = None organizationId: Optional[str] = None userId: str = Field(description="The ID of the User to add an Oauth provider to") - oauthProviders: List[v1OauthProviderParams] = Field( + oauthProviders: List[v1OauthProviderParamsV2] = Field( description="A list of Oauth providers." ) @@ -6366,6 +11107,9 @@ class CreatePolicyBody(TurnkeyBaseModel): default=None, description="The consensus expression that triggers the Effect" ) notes: str = Field(description="Notes for a Policy.") + time: Optional[str] = Field( + default=None, description="The time expression that triggers the Effect" + ) class CreatePolicyInput(TurnkeyBaseModel): @@ -6404,6 +11148,10 @@ class CreatePrivateKeysBody(TurnkeyBaseModel): timestampMs: Optional[str] = None organizationId: Optional[str] = None privateKeys: List[v1PrivateKeyParams] = Field(description="A list of Private Keys.") + externalSignerPubkey: Optional[str] = Field( + default=None, + description="The public key of the external signer to use for creating the private keys.", + ) class CreatePrivateKeysInput(TurnkeyBaseModel): @@ -6456,7 +11204,8 @@ class CreateReadWriteSessionBody(TurnkeyBaseModel): description="Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted." ) userId: Optional[str] = Field( - default=None, description="Unique identifier for a given User." + default=None, + description="Optional unique identifier for a given User. If none provided, the read write session will be created for the user who is making the request.", ) apiKeyName: Optional[str] = Field( default=None, @@ -6476,6 +11225,35 @@ class CreateReadWriteSessionInput(TurnkeyBaseModel): body: CreateReadWriteSessionBody +class CreateSessionProfileResponse(TurnkeyBaseModel): + activity: v1Activity + sessionProfileId: str = Field( + description="Unique identifier for a given Session Profile." + ) + + +class CreateSessionProfileBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + sessionProfileName: str = Field( + description="Human-readable name for a Session Profile." + ) + scope: str = Field( + description="The scope string that defines the permissions for this Session Profile." + ) + expirationSeconds: Optional[str] = Field( + default=None, + description="The duration in seconds for which sessions created with this Session Profile are valid. If not set, expiration will be determined by the value passed in to the intent of login activities.", + ) + notes: Optional[str] = Field( + default=None, description="Notes for a Session Profile." + ) + + +class CreateSessionProfileInput(TurnkeyBaseModel): + body: CreateSessionProfileBody + + class CreateSmartContractInterfaceResponse(TurnkeyBaseModel): activity: v1Activity smartContractInterfaceId: str = Field( @@ -6551,6 +11329,246 @@ class CreateSubOrganizationInput(TurnkeyBaseModel): body: CreateSubOrganizationBody +class CreateSwapQuoteResponse(TurnkeyBaseModel): + activity: v1Activity + quotes: List[v1SwapQuoteV2] = Field( + description="One or more provider quotes for this request. Today this contains a single Relay quote; pass quotes[i].quoteId to execute_swap to bind execution." + ) + + +class CreateSwapQuoteBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + signWith: str = Field( + description="Wallet account address used to price the executable provider quote. Private Key identifiers are not supported." + ) + inputToken: str = Field( + description="CAIP-19 asset ID for the input asset. The chain is derived from this value." + ) + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + inputAmount: str = Field(description="Base-unit amount of the input asset.") + slippageBps: Optional[str] = Field( + default=None, + description="Provider-neutral maximum allowed slippage in basis points. Turnkey converts this value to each provider's request format. When omitted, each provider applies its default slippage behavior.", + ) + destinationAddress: Optional[str] = Field( + default=None, + description="Raw public address that receives the output asset. Required for cross-protocol swaps. The address must match the output token protocol. Wallet account IDs, private key IDs, and CAIP account or asset identifiers are not supported.", + ) + feeSponsorship: Optional[bool] = Field( + default=None, + description="When true, Turnkey pays the provider fees for this swap and invoices them to the billing parent organization. Requires the FEATURE_NAME_SWAP_FEE_SPONSORSHIP organization feature. Defaults to false.", + ) + fixedRate: Optional[bool] = Field( + default=None, + description="When true, requests a 1:1 conversion before fees between supported stablecoins. Requires the FEATURE_NAME_SWAP_FIXED_RATE organization feature. Defaults to false.", + ) + + +class CreateSwapQuoteInput(TurnkeyBaseModel): + body: CreateSwapQuoteBody + + +class CreateTvcAppResponse(TurnkeyBaseModel): + activity: v1Activity + appId: str = Field(description="The unique identifier for the TVC application") + manifestSetId: str = Field( + description="The unique identifier for the TVC manifest set" + ) + manifestSetOperatorIds: List[str] = Field( + description="The unique identifier(s) of the manifest set operators" + ) + manifestSetThreshold: int = Field( + description="The required number of approvals for the manifest set" + ) + shareSetId: str = Field(description="The unique identifier for the TVC share set") + shareSetOperatorIds: List[str] = Field( + description="The unique identifiers of the share set operators" + ) + shareSetThreshold: int = Field( + description="The required number of approvals for the share set" + ) + + +class CreateTvcAppBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + name: str = Field(description="The name of the new TVC application") + quorumPublicKey: str = Field( + description="Quorum public key to use for this application" + ) + manifestSetId: Optional[str] = Field( + default=None, + description="Unique identifier for an existing TVC operator set to use as the Manifest Set for this TVC application. If left empty, a new Manifest Set configuration is required", + ) + manifestSetParams: Optional[v1TvcOperatorSetParams] = Field( + default=None, + description="Configuration to create a new TVC operator set, used as the Manifest Set for this TVC application. If left empty, a Manifest Set ID is required", + ) + shareSetId: Optional[str] = Field( + default=None, + description="Unique identifier for an existing TVC operator set to use as the Share Set for this TVC application. If left empty, a new Share Set configuration is required", + ) + shareSetParams: Optional[v1TvcOperatorSetParams] = Field( + default=None, + description="Configuration to create a new TVC operator set, used as the Share Set for this TVC application. If left empty, a Share Set ID is required", + ) + enableEgress: Optional[bool] = Field( + default=None, + description="Enables network egress for this TVC app. Default if not provided: false.", + ) + enableDebugModeDeployments: Optional[bool] = Field( + default=None, + description="When true, this app may create deployments in debug-mode. Debug-mode deployments expose logs and emit zero'd attestation PCRs, so remote attestation cannot succeed. Cannot be changed after app creation. Setting this true means the app's quorum key is considered permanently insecure, and a new app with a fresh quorum key must be created. Default if not provided: false.", + ) + + +class CreateTvcAppInput(TurnkeyBaseModel): + body: CreateTvcAppBody + + +class CreateTvcDeploymentResponse(TurnkeyBaseModel): + activity: v1Activity + deploymentId: str = Field( + description="The unique identifier for the TVC deployment" + ) + manifestId: str = Field(description="The unique identifier for the TVC manifest") + + +class CreateTvcDeploymentBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + appId: str = Field( + description="The unique identifier of the to-be-deployed TVC application" + ) + qosVersion: str = Field( + description="The QuorumOS version to use to deploy this application" + ) + pivotContainerImageUrl: str = Field( + description="URL of the container containing the pivot binary" + ) + pivotPath: str = Field(description="Location of the binary in the pivot container") + pivotArgs: List[str] = Field( + description='Arguments to pass to the pivot binary at startup. Encoded as a list of strings, for example ["--foo", "bar"]' + ) + expectedPivotDigest: str = Field( + description="Digest of the pivot binary in the pivot container. This value will be inserted in the QOS manifest to ensure application integrity." + ) + nonce: Optional[int] = Field( + default=None, + description="Optional nonce to ensure uniqueness of the deployment manifest. If not provided, it defaults to the current Unix timestamp in seconds.", + ) + pivotContainerEncryptedPullSecret: Optional[str] = Field( + default=None, + description="Optional encrypted pull secret to authorize Turnkey to pull the pivot container image. If your image is public, leave this empty.", + ) + debugMode: Optional[bool] = Field( + default=None, + description="Optional flag to indicate whether to deploy the TVC app in debug mode, which includes additional logging and debugging tools. Default is false.", + ) + healthCheckType: v1TvcHealthCheckType = Field( + description="Health check type (TVC_HEALTH_CHECK_TYPE_HTTP or TVC_HEALTH_CHECK_TYPE_GRPC). HTTP health checks are made with a GET request on /health, and gRPC health checks follow the standard gRPC health checking protocol." + ) + healthCheckPort: int = Field(description="Port to use for health checks.") + publicIngressPort: int = Field(description="Port to use for public ingress.") + replicas: Optional[int] = Field( + default=None, description="Optional desired replica count for this deployment." + ) + instanceSizeCpus: Optional[int] = Field( + default=None, description="Optional desired instance cpu count." + ) + instanceSizeRam: Optional[int] = Field( + default=None, description="Optional desired instance memory size in GiB." + ) + + +class CreateTvcDeploymentInput(TurnkeyBaseModel): + body: CreateTvcDeploymentBody + + +class CreateTvcManifestApprovalsResponse(TurnkeyBaseModel): + activity: v1Activity + approvalIds: List[str] = Field( + description="The unique identifier(s) for the manifest approvals" + ) + + +class CreateTvcManifestApprovalsBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + manifestId: str = Field( + description="Unique identifier of the TVC deployment to approve" + ) + approvals: List[v1TvcManifestApproval] = Field( + description="List of manifest approvals" + ) + + +class CreateTvcManifestApprovalsInput(TurnkeyBaseModel): + body: CreateTvcManifestApprovalsBody + + +class CreateTvcOperatorResponse(TurnkeyBaseModel): + activity: v1Activity + walletId: str = Field( + description="The unique identifier for the wallet containing TVC operator accounts" + ) + operatorId: str = Field(description="The unique identifier for the TVC operator") + encryptPublicKey: str = Field( + description="Public encryption key for this TVC operator" + ) + signPublicKey: str = Field(description="Public signing key for this TVC operator") + + +class CreateTvcOperatorBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + walletName: Optional[str] = Field( + default=None, + description="Human-readable name for a new wallet created for this TVC operator", + ) + walletId: Optional[str] = Field( + default=None, + description="Unique identifier for an existing wallet to reuse for this TVC operator", + ) + path: str = Field( + description="Base derivation path for creating TVC operator wallet accounts" + ) + operatorName: str = Field( + description="Human-readable name for this new TVC operator" + ) + + +class CreateTvcOperatorInput(TurnkeyBaseModel): + body: CreateTvcOperatorBody + + +class CreateTvcQuorumKeyResponse(TurnkeyBaseModel): + activity: v1Activity + quorumKeyId: str = Field(description="The unique identifier for the TVC quorum key") + quorumPublicKey: str = Field( + description="Public key for the generated TVC quorum key" + ) + shareIds: List[str] = Field( + description="The unique identifier(s) for the generated TVC quorum key shares" + ) + + +class CreateTvcQuorumKeyBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + threshold: int = Field( + description="The threshold of operators needed to reassemble this TVC quorum key" + ) + operatorEncryptKeys: List[str] = Field( + description="Operator public keys used to encrypt and later approve the generated TVC quorum key shares" + ) + + +class CreateTvcQuorumKeyInput(TurnkeyBaseModel): + body: CreateTvcQuorumKeyBody + + class CreateUserTagResponse(TurnkeyBaseModel): activity: v1Activity userTagId: str = Field(description="Unique identifier for a given User Tag.") @@ -6624,8 +11642,32 @@ class CreateWalletAccountsBody(TurnkeyBaseModel): ) -class CreateWalletAccountsInput(TurnkeyBaseModel): - body: CreateWalletAccountsBody +class CreateWalletAccountsInput(TurnkeyBaseModel): + body: CreateWalletAccountsBody + + +class CreateWebhookEndpointResponse(TurnkeyBaseModel): + activity: v1Activity + endpointId: str = Field( + description="Unique identifier of the created webhook endpoint." + ) + webhookEndpoint: v1WebhookEndpointData = Field( + description="The created webhook endpoint data." + ) + + +class CreateWebhookEndpointBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + url: str = Field(description="The destination URL for webhook delivery.") + name: str = Field(description="Human-readable name for this webhook endpoint.") + subscriptions: Optional[List[v1WebhookSubscriptionParams]] = Field( + default=None, description="Event subscriptions to create for this endpoint." + ) + + +class CreateWebhookEndpointInput(TurnkeyBaseModel): + body: CreateWebhookEndpointBody class DeleteApiKeysResponse(TurnkeyBaseModel): @@ -6698,6 +11740,22 @@ class DeleteInvitationInput(TurnkeyBaseModel): body: DeleteInvitationBody +class DeleteMfaPolicyResponse(TurnkeyBaseModel): + activity: v1Activity + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + + +class DeleteMfaPolicyBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + userId: str = Field(description="The ID of the User to delete the MFA Policy from.") + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + + +class DeleteMfaPolicyInput(TurnkeyBaseModel): + body: DeleteMfaPolicyBody + + class DeleteOauth2CredentialResponse(TurnkeyBaseModel): activity: v1Activity oauth2CredentialId: str = Field( @@ -6812,6 +11870,25 @@ class DeletePrivateKeysInput(TurnkeyBaseModel): body: DeletePrivateKeysBody +class DeleteSecretsResponse(TurnkeyBaseModel): + activity: v1Activity + secretIds: List[str] = Field( + description="Unique identifiers of the deleted secrets, in the order requested." + ) + + +class DeleteSecretsBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + secretIds: List[str] = Field( + description="Unique identifiers of the secrets to delete. Must contain between 1 and 32 distinct UUIDs. All secrets must belong to the organization." + ) + + +class DeleteSecretsInput(TurnkeyBaseModel): + body: DeleteSecretsBody + + class DeleteSmartContractInterfaceResponse(TurnkeyBaseModel): activity: v1Activity smartContractInterfaceId: str = Field( @@ -6851,6 +11928,42 @@ class DeleteSubOrganizationInput(TurnkeyBaseModel): body: DeleteSubOrganizationBody +class DeleteTvcAppAndDeploymentsResponse(TurnkeyBaseModel): + activity: v1Activity + appId: str = Field(description="The unique identifier of the deleted TVC app.") + + +class DeleteTvcAppAndDeploymentsBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + appId: str = Field( + description="The unique identifier of the TVC app to delete. The app and all associated deployments will be removed." + ) + + +class DeleteTvcAppAndDeploymentsInput(TurnkeyBaseModel): + body: DeleteTvcAppAndDeploymentsBody + + +class DeleteTvcDeploymentResponse(TurnkeyBaseModel): + activity: v1Activity + deploymentId: str = Field( + description="The unique identifier of the deleted TVC deployment." + ) + + +class DeleteTvcDeploymentBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + deploymentId: str = Field( + description="The unique identifier of the TVC deployment to delete." + ) + + +class DeleteTvcDeploymentInput(TurnkeyBaseModel): + body: DeleteTvcDeploymentBody + + class DeleteUserTagsResponse(TurnkeyBaseModel): activity: v1Activity userTagIds: List[str] = Field(description="A list of User Tag IDs.") @@ -6928,6 +12041,167 @@ class DeleteWalletsInput(TurnkeyBaseModel): body: DeleteWalletsBody +class DeleteWebhookEndpointResponse(TurnkeyBaseModel): + activity: v1Activity + endpointId: str = Field( + description="Unique identifier of the deleted webhook endpoint." + ) + + +class DeleteWebhookEndpointBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + endpointId: str = Field( + description="Unique identifier of the webhook endpoint to delete." + ) + + +class DeleteWebhookEndpointInput(TurnkeyBaseModel): + body: DeleteWebhookEndpointBody + + +class EarnClaimRewardsResponse(TurnkeyBaseModel): + activity: v1Activity + claimRequestId: str = Field( + description="Identifier to poll claim status and tx hash via GetEarnClaimRewardsStatus." + ) + + +class EarnClaimRewardsBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + signWith: str = Field( + description="A Turnkey-managed wallet address the rewards are attributed to. The claim transaction is signed by this wallet and the Merkl Distributor transfers every reward token to it." + ) + caip2: str = Field( + description="CAIP-2 chain to claim rewards on (e.g. 'eip155:8453'). Rewards accrue per chain; see ListEarnRewards." + ) + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." + ) + + +class EarnClaimRewardsInput(TurnkeyBaseModel): + body: EarnClaimRewardsBody + + +class EarnDeployWrapperResponse(TurnkeyBaseModel): + activity: v1Activity + wrapperAddress: str = Field( + description="Address of the deployed fee wrapper (the deposit target)." + ) + splitterAddress: str = Field( + description="Address of the deployed fee splitter (PaymentSplitter for Morpho, RevenueSplitterOwner for Aave)." + ) + deployRequestId: str = Field(description="Identifier to poll deploy status.") + + +class EarnDeployWrapperBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + vaultAddress: str = Field( + description="Address of the underlying yield vault to wrap (from the ListEarnVaults catalog)." + ) + caip2: str = Field( + description="CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." + ) + clientFeeBps: str = Field( + description="Your fee on gross yield, in basis points (e.g., '2000' for 20%). Maximum is 4000 (40%)." + ) + clientFeeWallet: str = Field( + description="The wallet address that receives the client's fee payouts on-chain. Must be a Turnkey-managed wallet address." + ) + + +class EarnDeployWrapperInput(TurnkeyBaseModel): + body: EarnDeployWrapperBody + + +class EarnDepositResponse(TurnkeyBaseModel): + activity: v1Activity + depositRequestId: str = Field( + description="Identifier to poll deposit status and tx hash via GetEarnDepositStatus." + ) + + +class EarnDepositBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + wrapperAddress: str = Field( + description="Address of the deployed Earn wrapper to deposit into, from ListEarnVaults/ListEarnPositions. Must be one of the org's deployed wrappers." + ) + signWith: str = Field( + description="A Wallet account address or Private Key address to deposit from and sign with. Must be an on-chain address; Private Key identifiers are not supported." + ) + assets: str = Field( + description="Amount of the underlying asset to deposit, in raw on-chain units (e.g., '1000000' for 1 USDC at 6 decimals)." + ) + caip2: str = Field( + description="CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." + ) + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." + ) + + +class EarnDepositInput(TurnkeyBaseModel): + body: EarnDepositBody + + +class EarnSetWrapperStateResponse(TurnkeyBaseModel): + activity: v1Activity + wrapperAddress: str = Field(description="Address of the updated Earn wrapper.") + depositsDisabled: bool = Field( + description="The wrapper's deposit state after this activity." + ) + + +class EarnSetWrapperStateBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + wrapperAddress: str = Field( + description="Address of the deployed Earn wrapper to update, from ListEarnVaults/ListEarnPositions. Must be one of the org's deployed wrappers." + ) + depositsDisabled: bool = Field( + description="When true, deposits to this wrapper are rejected; withdrawals are unaffected. Set to false to re-enable deposits." + ) + + +class EarnSetWrapperStateInput(TurnkeyBaseModel): + body: EarnSetWrapperStateBody + + +class EarnWithdrawResponse(TurnkeyBaseModel): + activity: v1Activity + withdrawRequestId: str = Field( + description="Identifier to poll withdrawal status and tx hash via GetEarnWithdrawStatus." + ) + + +class EarnWithdrawBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + wrapperAddress: str = Field( + description="Address of the deployed Earn wrapper holding the position to withdraw from, from ListEarnPositions. Must be one of the org's deployed wrappers." + ) + signWith: str = Field( + description="A Wallet account address or Private Key address to withdraw to and sign with. Must be an on-chain address; Private Key identifiers are not supported." + ) + caip2: str = Field( + description="CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." + ) + sponsor: Optional[bool] = Field( + default=None, description="Whether to sponsor this transaction via Gas Station." + ) + amountValue: str = Field( + description="The amount of the underlying asset to withdraw, in raw on-chain units. Pass 'MAX' to withdraw the entire position." + ) + + +class EarnWithdrawInput(TurnkeyBaseModel): + body: EarnWithdrawBody + + class EmailAuthResponse(TurnkeyBaseModel): activity: v1Activity userId: str = Field(description="Unique identifier for the authenticating User.") @@ -6987,38 +12261,38 @@ class EthSendTransactionBody(TurnkeyBaseModel): alias="from", description="A wallet or private key address to sign with. This does not support private key IDs.", ) - sponsor: Optional[bool] = Field( - default=None, description="Whether to sponsor this transaction via Gas Station." - ) caip2: str = Field( description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." ) - to: str = Field(description="Recipient address as a hex string with 0x prefix.") - value: Optional[str] = Field( - default=None, description="Amount of native asset to send in wei." - ) - data: Optional[str] = Field( - default=None, description="Hex-encoded call data for contract interactions." + sponsor: Optional[bool] = Field( + default=None, + description="Whether to sponsor this transaction via Gas Station. If false or unset, the EOA pays gas. A single call uses EIP-1559; multiple calls use EIP-7702 batch execution via Gas Station.", ) nonce: Optional[str] = Field( - default=None, - description="Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations.", + default=None, description="Outer transaction nonce. Omit to auto-fetch." ) gasLimit: Optional[str] = Field( default=None, - description="Maximum amount of gas to use for this transaction, for EIP-1559 transactions.", + description="Maximum amount of gas for the outer transaction. Omit to auto-estimate.", ) maxFeePerGas: Optional[str] = Field( default=None, - description="Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions.", + description="Maximum total fee per gas unit (base fee + priority fee) in wei. Omit to auto-estimate.", ) maxPriorityFeePerGas: Optional[str] = Field( default=None, - description="Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions.", + description="Maximum priority fee (tip) per gas unit in wei. Omit to auto-estimate.", + ) + deadline: Optional[str] = Field( + default=None, + description="Unix timestamp in seconds for EIP-712 execution deadline. Only used when sponsor=true.", ) gasStationNonce: Optional[str] = Field( default=None, - description="The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture.", + description="The gas station delegate contract nonce used in the BatchExecution EIP-712 message. Valid for sponsored transactions and non-sponsored multi-call batches. Omit to auto-fetch. Use the nonces endpoint for replay protection.", + ) + calls: List[v1EthCallParams] = Field( + description="Ordered list of calls to execute. Must contain between 1 and 50 entries. A single entry with sponsor=false uses EIP-1559; multiple entries use EIP-7702 batch execution via Gas Station." ) @@ -7026,6 +12300,97 @@ class EthSendTransactionInput(TurnkeyBaseModel): body: EthSendTransactionBody +class EthUndelegate7702Response(TurnkeyBaseModel): + activity: v1Activity + sendTransactionStatusId: str = Field( + description="The send_transaction_status ID associated with the undelegation transaction submission" + ) + + +class EthUndelegate7702Body(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + from_: str = Field( + alias="from", + description="A wallet or private key address to undelegate. This does not support private key IDs.", + ) + caip2: str = Field( + description="CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + ) + nonce: Optional[str] = Field( + default=None, description="Outer transaction nonce. Omit to auto-fetch." + ) + gasLimit: Optional[str] = Field( + default=None, + description="Maximum amount of gas for the undelegation transaction. Omit to use the fixed undelegation gas limit.", + ) + maxFeePerGas: Optional[str] = Field( + default=None, + description="Maximum total fee per gas unit (base fee + priority fee) in wei. Omit to auto-estimate.", + ) + maxPriorityFeePerGas: Optional[str] = Field( + default=None, + description="Maximum priority fee (tip) per gas unit in wei. Omit to auto-estimate.", + ) + + +class EthUndelegate7702Input(TurnkeyBaseModel): + body: EthUndelegate7702Body + + +class ExecuteSwapResponse(TurnkeyBaseModel): + activity: v1Activity + swapRequestId: str = Field( + description="Identifier to poll swap status via GetSwapStatus." + ) + provider: Optional[str] = Field( + default=None, description="Swap provider used to build the transaction." + ) + quoteId: Optional[str] = Field( + default=None, description="Quote identifier used for execution, if any." + ) + + +class ExecuteSwapBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + quoteId: str = Field( + description="Quote identifier returned by create_swap_quote. Execution is bound to this quote; the signer is derived from the quote and must not be resupplied." + ) + inputToken: str = Field(description="CAIP-19 asset ID for the input asset.") + inputAmount: str = Field( + description="Exact base-unit amount of the input asset committed by the quote." + ) + outputToken: str = Field(description="CAIP-19 asset ID for the output asset.") + quotedOutputAmount: str = Field( + description="Exact quoted base-unit output amount committed by the quote." + ) + minOutputAmount: str = Field( + description="Exact minimum base-unit output committed by the quote." + ) + sponsor: bool = Field(description="Whether the quoted transaction is sponsored.") + evmNonce: Optional[str] = Field( + default=None, + description="Exact EVM sender (EOA account) nonce. Valid only for a non-sponsored EVM swap. Honored for already-delegated (Type-2) batch swaps and single-call swaps; ignored for not-yet-delegated EIP-7702 (Type-4) batches where the outer nonce is derived from the authorization. Prefer gas_station_nonce for batch replay protection and use the nonces endpoint to fetch it. Omit to auto-fetch.", + ) + recentBlockhash: Optional[str] = Field( + default=None, + description="Exact Solana recent blockhash. Valid only for a Solana swap, including sponsored swaps. Omit to auto-fetch.", + ) + gasStationNonce: Optional[str] = Field( + default=None, + description="Exact gas station delegate contract nonce used in the BatchExecution EIP-712 message. Valid for sponsored EVM swaps and non-sponsored EVM swaps that execute as a multi-call batch (for example ERC-20 approve + swap). This is the replay-protection nonce for gas-station batches; use the nonces endpoint to fetch it. Omit to auto-fetch.", + ) + destinationAddress: Optional[str] = Field( + default=None, + description="Raw public address that receives the output asset. Required for cross-protocol swaps. The address must match the output token protocol. Wallet account IDs, private key IDs, and CAIP account or asset identifiers are not supported.", + ) + + +class ExecuteSwapInput(TurnkeyBaseModel): + body: ExecuteSwapBody + + class ExportPrivateKeyResponse(TurnkeyBaseModel): activity: v1Activity privateKeyId: str = Field(description="Unique identifier for a given Private Key.") @@ -7047,6 +12412,25 @@ class ExportPrivateKeyInput(TurnkeyBaseModel): body: ExportPrivateKeyBody +class ExportSecretsResponse(TurnkeyBaseModel): + activity: v1Activity + secretPayloads: List[str] = Field( + description="Encryption suite specific payload containing each secret ciphertext, in the order the params were specified. For enclave encrypt v1 each entry is a JSON-encoded ServerSendMsg." + ) + + +class ExportSecretsBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + secrets: List[v1ExportSecretParams] = Field( + description="A list of secrets to export." + ) + + +class ExportSecretsInput(TurnkeyBaseModel): + body: ExportSecretsBody + + class ExportWalletResponse(TurnkeyBaseModel): activity: v1Activity walletId: str = Field(description="Unique identifier for a given Wallet.") @@ -7121,6 +12505,25 @@ class ImportPrivateKeyInput(TurnkeyBaseModel): body: ImportPrivateKeyBody +class ImportSecretsResponse(TurnkeyBaseModel): + activity: v1Activity + secretIds: List[str] = Field( + description="Unique identifier for each imported secret, in the order the params were specified." + ) + + +class ImportSecretsBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + secrets: List[v1ImportSecretParams] = Field( + description="A list of secrets to import." + ) + + +class ImportSecretsInput(TurnkeyBaseModel): + body: ImportSecretsBody + + class ImportWalletResponse(TurnkeyBaseModel): activity: v1Activity walletId: str = Field(description="Unique identifier for a Wallet.") @@ -7160,7 +12563,7 @@ class InitFiatOnRampBody(TurnkeyBaseModel): timestampMs: Optional[str] = None organizationId: Optional[str] = None onrampProvider: v1FiatOnRampProvider = Field( - description="Enum to specifiy which on-ramp provider to use" + description="Enum to specify which on-ramp provider to use" ) walletAddress: str = Field( description="Destination wallet address for the buy transaction." @@ -7205,21 +12608,43 @@ class InitFiatOnRampInput(TurnkeyBaseModel): body: InitFiatOnRampBody -class InitImportPrivateKeyResponse(TurnkeyBaseModel): +class InitImportPrivateKeyResponse(TurnkeyBaseModel): + activity: v1Activity + importBundle: str = Field( + description="Import bundle containing a public key and signature to use for importing client data." + ) + + +class InitImportPrivateKeyBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + userId: str = Field(description="The ID of the User importing a Private Key.") + + +class InitImportPrivateKeyInput(TurnkeyBaseModel): + body: InitImportPrivateKeyBody + + +class InitImportSecretsResponse(TurnkeyBaseModel): activity: v1Activity - importBundle: str = Field( - description="Import bundle containing a public key and signature to use for importing client data." + enclaveTargetMessages: List[str] = Field( + description="Enclave ingress target keys along with metadata specific to the encryption suite. For enclave encrypt v1 this will be ServerTargetMsgV1." ) -class InitImportPrivateKeyBody(TurnkeyBaseModel): +class InitImportSecretsBody(TurnkeyBaseModel): timestampMs: Optional[str] = None organizationId: Optional[str] = None - userId: str = Field(description="The ID of the User importing a Private Key.") + encryptionSuite: v1TransportEncryptionSuite = Field( + description="Transport encryption suite used for ingress secrets." + ) + numSecrets: int = Field( + description="The number of secrets the user intends to import." + ) -class InitImportPrivateKeyInput(TurnkeyBaseModel): - body: InitImportPrivateKeyBody +class InitImportSecretsInput(TurnkeyBaseModel): + body: InitImportSecretsBody class InitImportWalletResponse(TurnkeyBaseModel): @@ -7251,7 +12676,7 @@ class InitOtpBody(TurnkeyBaseModel): timestampMs: Optional[str] = None organizationId: Optional[str] = None otpType: str = Field( - description="Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" + description="Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" ) contact: str = Field(description="Email or phone number to send the OTP code to") appName: str = Field(description="The name of the application.") @@ -7304,7 +12729,7 @@ class InitOtpAuthBody(TurnkeyBaseModel): timestampMs: Optional[str] = None organizationId: Optional[str] = None otpType: str = Field( - description="Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" + description="Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" ) contact: str = Field(description="Email or phone number to send the OTP code to") otpLength: Optional[int] = Field( @@ -7440,9 +12865,8 @@ class Oauth2AuthenticateBody(TurnkeyBaseModel): codeVerifier: str = Field( description="The code verifier used by OAuth 2.0 PKCE providers" ) - nonce: Optional[str] = Field( - default=None, - description="An optional nonce used by the client to prevent replay/substitution of an ID token", + nonce: str = Field( + description="A nonce value set to sha256(publicKey), used to bind the OIDC token to a specific public key" ) bearerTokenTargetPublicKey: Optional[str] = Field( default=None, @@ -7476,6 +12900,10 @@ class OauthLoginBody(TurnkeyBaseModel): default=None, description="Invalidate all other previously generated Login API keys", ) + sessionProfileId: Optional[str] = Field( + default=None, + description="Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used.", + ) class OauthLoginInput(TurnkeyBaseModel): @@ -7548,12 +12976,73 @@ class OtpLoginBody(TurnkeyBaseModel): default=None, description="Invalidate all other previously generated Login sessions", ) + sessionProfileId: Optional[str] = Field( + default=None, + description="Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used.", + ) class OtpLoginInput(TurnkeyBaseModel): body: OtpLoginBody +class PostTvcQuorumKeyShareResponse(TurnkeyBaseModel): + activity: v1Activity + provisioningShareId: str = Field( + description="The unique identifier for the provisioning quorum key share" + ) + + +class PostTvcQuorumKeyShareBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + deploymentId: str = Field( + description="Unique identifier of the TVC deployment receiving quorum key share" + ) + ephemeralPublicKeyHex: str = Field( + description="Hex-encoded ephemeral public key used to encrypt the quorum key share" + ) + shareApprovalBundle: v1QuorumKeyShareApprovalBundle = Field( + description="Re-encrypted quorum key share and approval" + ) + + +class PostTvcQuorumKeyShareInput(TurnkeyBaseModel): + body: PostTvcQuorumKeyShareBody + + +class ReEncryptTvcQuorumKeyShareResponse(TurnkeyBaseModel): + activity: v1Activity + provisioningShareId: str = Field( + description="The unique identifier for the provisioning quorum key share" + ) + + +class ReEncryptTvcQuorumKeyShareBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + attestationDocB64: str = Field( + description="Base64-encoded attestation document for the TVC deployment provisioning enclave" + ) + manifestB64: str = Field( + description="Base64-encoded manifest for the TVC deployment" + ) + operatorEncryptKey: str = Field( + description="Operator encryption public key used to encrypt the hosted TVC quorum key share" + ) + operatorSignKey: str = Field( + description="Operator signing public key used to approve the TVC manifest" + ) + deploymentId: str = Field( + description="Unique identifier of the TVC deployment receiving the re-encrypted quorum key share" + ) + appQuorumKey: str = Field(description="Quorum key for the TVC application") + + +class ReEncryptTvcQuorumKeyShareInput(TurnkeyBaseModel): + body: ReEncryptTvcQuorumKeyShareBody + + class RecoverUserResponse(TurnkeyBaseModel): activity: v1Activity authenticatorId: List[str] = Field(description="ID of the authenticator created.") @@ -7590,6 +13079,23 @@ class RejectActivityInput(TurnkeyBaseModel): body: RejectActivityBody +class RemoveIpAllowlistResponse(TurnkeyBaseModel): + activity: v1Activity + + +class RemoveIpAllowlistBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + publicKey: Optional[str] = Field( + default=None, + description="The public component of an API key. If null, removes the organization-level IP allowlist. If set, removes the IP allowlist for this specific API key.", + ) + + +class RemoveIpAllowlistInput(TurnkeyBaseModel): + body: RemoveIpAllowlistBody + + class RemoveOrganizationFeatureResponse(TurnkeyBaseModel): activity: v1Activity features: List[v1Feature] = Field( @@ -7607,6 +13113,54 @@ class RemoveOrganizationFeatureInput(TurnkeyBaseModel): body: RemoveOrganizationFeatureBody +class RestoreTvcDeploymentResponse(TurnkeyBaseModel): + activity: v1Activity + deploymentId: str = Field( + description="The unique identifier of the restored TVC deployment." + ) + + +class RestoreTvcDeploymentBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + deploymentId: str = Field( + description="The unique identifier of the TVC deployment to restore." + ) + + +class RestoreTvcDeploymentInput(TurnkeyBaseModel): + body: RestoreTvcDeploymentBody + + +class SetIpAllowlistResponse(TurnkeyBaseModel): + activity: v1Activity + + +class SetIpAllowlistBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + publicKey: Optional[str] = Field( + default=None, + description="The public component of an API key. If null, the IP allowlist applies at the organization level. If set, it applies only to this specific API key.", + ) + enabled: Optional[bool] = Field( + default=None, + description="Whether the IP allowlist is enabled. Only meaningful for organization-level allowlists. Omit for API key-level allowlists.", + ) + rules: Optional[List[v1IpAllowlistIntentRule]] = Field( + default=None, + description="List of IP allowlist rules with CIDR blocks and optional labels.", + ) + onEvaluationError: Optional[str] = Field( + default=None, + description="Behavior when an error occurs during IP allowlist evaluation. Valid values: ALLOW, DENY. Defaults to DENY.", + ) + + +class SetIpAllowlistInput(TurnkeyBaseModel): + body: SetIpAllowlistBody + + class SetOrganizationFeatureResponse(TurnkeyBaseModel): activity: v1Activity features: List[v1Feature] = Field( @@ -7627,11 +13181,31 @@ class SetOrganizationFeatureInput(TurnkeyBaseModel): body: SetOrganizationFeatureBody +class UpdateTvcAppLiveDeploymentResponse(TurnkeyBaseModel): + activity: v1Activity + + +class UpdateTvcAppLiveDeploymentBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + deploymentId: str = Field( + description="The unique identifier of the TVC deployment to set as live for the app." + ) + + +class UpdateTvcAppLiveDeploymentInput(TurnkeyBaseModel): + body: UpdateTvcAppLiveDeploymentBody + + class SignRawPayloadResponse(TurnkeyBaseModel): activity: v1Activity - r: str = Field(description="Component of an ECSDA signature.") - s: str = Field(description="Component of an ECSDA signature.") - v: str = Field(description="Component of an ECSDA signature.") + r: str = Field( + description="Component of a cryptographic signature, meaning varies based on signing scheme." + ) + s: str = Field( + description="Component of a cryptographic signature, meaning varies based on signing scheme." + ) + v: str = Field(description='Recovery ID for ECDSA signatures, "00" otherwise.') class SignRawPayloadBody(TurnkeyBaseModel): @@ -7647,6 +13221,10 @@ class SignRawPayloadBody(TurnkeyBaseModel): hashFunction: v1HashFunction = Field( description="Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." ) + externalSignerPubkey: Optional[str] = Field( + default=None, + description="The public key of the external signer to use for signing the payload.", + ) class SignRawPayloadInput(TurnkeyBaseModel): @@ -7673,6 +13251,10 @@ class SignRawPayloadsBody(TurnkeyBaseModel): hashFunction: v1HashFunction = Field( description="Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." ) + externalSignerPubkey: Optional[str] = Field( + default=None, + description="The public key of the external signer to use for signing the payloads.", + ) class SignRawPayloadsInput(TurnkeyBaseModel): @@ -7694,6 +13276,10 @@ class SignTransactionBody(TurnkeyBaseModel): description="Raw unsigned transaction to be signed" ) type: v1TransactionType + externalSignerPubkey: Optional[str] = Field( + default=None, + description="The public key of the external signer to use for signing this transaction.", + ) class SignTransactionInput(TurnkeyBaseModel): @@ -7711,20 +13297,20 @@ class SolSendTransactionBody(TurnkeyBaseModel): timestampMs: Optional[str] = None organizationId: Optional[str] = None unsignedTransaction: str = Field( - description="Base64-encoded serialized unsigned Solana transaction" + description="Hex-encoded serialized unsigned Solana transaction in full wire format. Legacy/V0 transactions allow 1232 bytes. V1 allows 4096 bytes with up to 12 trailing 64-byte signature slots, including the paymaster for sponsored transactions. Fill unsigned slots with zeroes." ) - signWith: str = Field( - description="A wallet or private key address to sign with. This does not support private key IDs." + signWiths: List[str] = Field( + description="Ordered Solana signer addresses Turnkey signs with. Between 1 and 16 signers for legacy/V0, or up to 12 for V1 (11 when sponsored). For sponsored transactions this must list every required signer of the transaction in transaction order." ) sponsor: Optional[bool] = Field( default=None, description="Whether to sponsor this transaction via Gas Station." ) caip2: str = Field( - description="CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet)." + description="CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." ) recentBlockhash: Optional[str] = Field( default=None, - description="user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution", + description="User-provided blockhash for replay protection / deadline control. If provided, it is used as-is, including for sponsored transactions (the transaction is only broadcastable while the blockhash is current). If omitted and sponsor=true, a fresh blockhash is fetched during execution.", ) @@ -7732,6 +13318,104 @@ class SolSendTransactionInput(TurnkeyBaseModel): body: SolSendTransactionBody +class SparkClaimTransferResponse(TurnkeyBaseModel): + activity: v1Activity + operatorPackages: List[v1SparkEncryptedOperatorPackage] = Field( + description="Per-operator ECIES-encrypted packages." + ) + newLeafPublicKeys: List[v1SparkLeafPublicKey] = Field( + description="Newly-derived SigningLeaf public keys, one per leaf, in input order." + ) + + +class SparkClaimTransferBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + signWith: str = Field( + description="A Spark wallet account address identifying the wallet." + ) + claim: v1SparkClaimPackage = Field(description="Claim package parameters.") + + +class SparkClaimTransferInput(TurnkeyBaseModel): + body: SparkClaimTransferBody + + +class SparkPrepareLightningReceiveResponse(TurnkeyBaseModel): + activity: v1Activity + operatorPackages: List[v1SparkEncryptedOperatorPackage] = Field( + description="Per-operator ECIES-encrypted Feldman share packages." + ) + paymentHash: str = Field( + description="Hex-encoded SHA256(preimage). Forward to the Lightning node." + ) + + +class SparkPrepareLightningReceiveBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + signWith: str = Field( + description="A Spark wallet account address identifying the wallet." + ) + lightningReceive: v1SparkLightningReceivePackage = Field( + description="Lightning receive package parameters: threshold and operator recipients." + ) + + +class SparkPrepareLightningReceiveInput(TurnkeyBaseModel): + body: SparkPrepareLightningReceiveBody + + +class SparkPrepareTransferResponse(TurnkeyBaseModel): + activity: v1Activity + operatorPackages: List[v1SparkEncryptedOperatorPackage] = Field( + description="Per-operator ECIES-encrypted packages." + ) + transferUserSignature: str = Field( + description="Hex-encoded ECDSA-DER signature of the TransferPackage signing payload, signed with the wallet's IDENTITY key." + ) + newLeafPublicKeys: List[v1SparkLeafPublicKey] = Field( + description="Newly-derived SigningLeaf public keys, one per leaf, in input order." + ) + + +class SparkPrepareTransferBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + signWith: str = Field( + description="A Spark wallet account address identifying the wallet." + ) + transfer: v1SparkTransferPackage = Field( + description="Transfer package parameters for HD key tweak splitting." + ) + + +class SparkPrepareTransferInput(TurnkeyBaseModel): + body: SparkPrepareTransferBody + + +class SparkSignFrostResponse(TurnkeyBaseModel): + activity: v1Activity + signatures: List[v1SparkPartialSignature] = Field( + description="Partial signatures plus Turnkey commitments, one per request, in order." + ) + + +class SparkSignFrostBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + signWith: str = Field( + description="A Spark wallet account address identifying the wallet to sign with." + ) + signatures: List[v1SparkSignatureRequest] = Field( + description="Batched sign requests. Each produces a partial signature plus Turnkey's public commitments." + ) + + +class SparkSignFrostInput(TurnkeyBaseModel): + body: SparkSignFrostBody + + class StampLoginResponse(TurnkeyBaseModel): activity: v1Activity session: str = Field( @@ -7753,6 +13437,10 @@ class StampLoginBody(TurnkeyBaseModel): default=None, description="Invalidate all other previously generated Login API keys", ) + sessionProfileId: Optional[str] = Field( + default=None, + description="Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used.", + ) class StampLoginInput(TurnkeyBaseModel): @@ -7795,6 +13483,40 @@ class UpdateFiatOnRampCredentialInput(TurnkeyBaseModel): body: UpdateFiatOnRampCredentialBody +class UpdateMfaPolicyResponse(TurnkeyBaseModel): + activity: v1Activity + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + + +class UpdateMfaPolicyBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + userId: str = Field(description="The ID of the User to update the MFA Policy for.") + mfaPolicyId: str = Field(description="Unique identifier for a given MFA Policy.") + mfaPolicyName: Optional[str] = Field( + default=None, description="Human-readable name for a Policy." + ) + condition: Optional[str] = Field( + default=None, + description="A condition expression that evaluates to true or false, determining when this MFA policy applies.", + ) + requiredAuthenticationMethods: Optional[ + List[v1RequiredAuthenticationMethodParams] + ] = Field( + default=None, + description="An ordered list of authentication requirements. Each requirement must be satisfied sequentially to complete MFA.", + ) + order: Optional[int] = Field( + default=None, + description="The order in which this MFA policy is evaluated, starting from 0, relative to other MFA policies. Lower order values are evaluated first.", + ) + notes: Optional[str] = Field(default=None, description="Notes for an MFA Policy.") + + +class UpdateMfaPolicyInput(TurnkeyBaseModel): + body: UpdateMfaPolicyBody + + class UpdateOauth2CredentialResponse(TurnkeyBaseModel): activity: v1Activity oauth2CredentialId: str = Field( @@ -7862,6 +13584,10 @@ class UpdatePolicyBody(TurnkeyBaseModel): policyNotes: Optional[str] = Field( default=None, description="Accompanying notes for a Policy (optional)." ) + time: Optional[str] = Field( + default=None, + description="The time expression that triggers the Effect (optional).", + ) class UpdatePolicyInput(TurnkeyBaseModel): @@ -8052,6 +13778,122 @@ class UpdateWalletInput(TurnkeyBaseModel): body: UpdateWalletBody +class UpdateWebhookEndpointResponse(TurnkeyBaseModel): + activity: v1Activity + endpointId: str = Field( + description="Unique identifier of the updated webhook endpoint." + ) + webhookEndpoint: v1WebhookEndpointData = Field( + description="The updated webhook endpoint data." + ) + + +class UpdateWebhookEndpointBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + endpointId: str = Field( + description="Unique identifier of the webhook endpoint to update." + ) + url: Optional[str] = Field( + default=None, description="Updated destination URL for webhook delivery." + ) + name: Optional[str] = Field( + default=None, + description="Updated human-readable name for this webhook endpoint.", + ) + isActive: Optional[bool] = Field( + default=None, description="Whether this webhook endpoint is active." + ) + + +class UpdateWebhookEndpointInput(TurnkeyBaseModel): + body: UpdateWebhookEndpointBody + + +class UpsertSwapConfigResponse(TurnkeyBaseModel): + activity: v1Activity + feeReceiverWalletAddress: Optional[str] = Field(default=None) + feeBps: Optional[str] = Field(default=None) + stableFeeBps: Optional[str] = Field(default=None) + + +class UpsertSwapConfigBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + feeReceiverWalletAddress: Optional[str] = Field( + default=None, + description="Organization-owned wallet account that receives swap fees. Required when fee_bps is set. Omit together with fee_bps to clear swap fees.", + ) + feeBps: Optional[str] = Field( + default=None, + description="Client fee in basis points applied to swaps; used for all pairs unless stable_fee_bps is set.", + ) + stableFeeBps: Optional[str] = Field( + default=None, + description="Optional Enterprise-only override applied when both swap assets are stablecoins; falls back to fee_bps when unset. Non-Enterprise orgs may only set fee_bps.", + ) + + +class UpsertSwapConfigInput(TurnkeyBaseModel): + body: UpsertSwapConfigBody + + +class UpsertSwapFeeSponsorshipLimitConfigResponse(TurnkeyBaseModel): + activity: v1Activity + organizationId: str = Field( + description="Unique identifier of the organization the limit config was saved for." + ) + + +class UpsertSwapFeeSponsorshipLimitConfigBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + orgWindowLimitUsd: str = Field( + description="Positive USD limit shared by the billing parent and its sub-organizations. At most 18 integer and 12 fractional digits." + ) + subOrgWindowLimitUsd: str = Field( + description="Positive USD limit for each sub-organization, no greater than the parent limit." + ) + windowDurationMinutes: str = Field( + description="Positive rolling window duration in minutes, at most 153722867." + ) + enabled: bool = Field( + description="Whether this spending window permits new swaps. Setting false only turns the saved window off and keeps its limits; it doesn't require the signed permission. This does not grant or remove the signed organization permission." + ) + + +class UpsertSwapFeeSponsorshipLimitConfigInput(TurnkeyBaseModel): + body: UpsertSwapFeeSponsorshipLimitConfigBody + + +class UpsertSwapFixedRateLimitConfigResponse(TurnkeyBaseModel): + activity: v1Activity + organizationId: str = Field( + description="Unique identifier of the organization the limit config was saved for." + ) + + +class UpsertSwapFixedRateLimitConfigBody(TurnkeyBaseModel): + timestampMs: Optional[str] = None + organizationId: Optional[str] = None + orgWindowLimitUsd: str = Field( + description="Positive USD limit shared by the billing parent and its sub-organizations. At most 18 integer and 12 fractional digits." + ) + subOrgWindowLimitUsd: str = Field( + description="Positive USD limit for each sub-organization, no greater than the parent limit." + ) + windowDurationMinutes: str = Field( + description="Positive rolling window duration in minutes, at most 153722867." + ) + enabled: bool = Field( + description="Whether this spending window permits new swaps. Setting false only turns the saved window off and keeps its limits; it doesn't require the signed permission. This does not grant or remove the signed organization permission." + ) + + +class UpsertSwapFixedRateLimitConfigInput(TurnkeyBaseModel): + body: UpsertSwapFixedRateLimitConfigBody + + class VerifyOtpResponse(TurnkeyBaseModel): activity: v1Activity verificationToken: str = Field( diff --git a/packages/sdk-types/tests/test_pydantic_aliases.py b/packages/sdk-types/tests/test_pydantic_aliases.py index 7b59938..b130aed 100644 --- a/packages/sdk-types/tests/test_pydantic_aliases.py +++ b/packages/sdk-types/tests/test_pydantic_aliases.py @@ -28,7 +28,7 @@ def test_pydantic_aliases(): organizationId="test-org", from_="0x1234567890123456789012345678901234567890", # Python name with underscore caip2="eip155:1", - to="0xabcdefabcdefabcdefabcdefabcdefabcdefabcd", + calls=[{"to": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"}], ) json_dict = eth_tx.model_dump(by_alias=True, exclude_none=True) @@ -48,14 +48,14 @@ def test_pydantic_aliases(): "organizationId": "test-org", "from": "0x9999999999999999999999999999999999999999", "caip2": "eip155:137", - "to": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "calls": [{"to": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"}], } parsed = EthSendTransactionBody.model_validate(json_input) print(f" JSON: {json.dumps(json_input, indent=2)}") - print(f" Python: from_='{parsed.from_}', to='{parsed.to}'") + print(f" Python: from_='{parsed.from_}', to='{parsed.calls[0].to}'") assert parsed.from_ == "0x9999999999999999999999999999999999999999" - assert parsed.to == "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" + assert parsed.calls[0].to == "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" print(" ✅ JSON 'from' correctly parsed to Python 'from_' field") # Test 3: populate_by_name allows both names @@ -65,7 +65,7 @@ def test_pydantic_aliases(): "organizationId": "test-org", "from_": "0x7777777777777777777777777777777777777777", # Using Python name in JSON "caip2": "eip155:1", - "to": "0x8888888888888888888888888888888888888888", + "calls": [{"to": "0x8888888888888888888888888888888888888888"}], } parsed2 = EthSendTransactionBody.model_validate(json_with_python_name) print(f" JSON (Python name): {json.dumps(json_with_python_name, indent=2)}") diff --git a/pyproject.toml b/pyproject.toml index 7dbc563..c7e1b48 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,11 @@ dev = [ "pytest>=7.0.0", ] +[tool.ruff] +# Markdown formatting arrived in a later ruff than this repo was written for. +# Python in the READMEs is prose, not code, so leave it alone. +extend-exclude = ["*.md"] + [tool.mypy] python_version = "3.10" warn_return_any = false diff --git a/schema/public_api.swagger.json b/schema/public_api.swagger.json index f659965..1f84049 100644 --- a/schema/public_api.swagger.json +++ b/schema/public_api.swagger.json @@ -14,6 +14,10 @@ "name": "Organizations", "description": "An Organization is the highest level of hierarchy in Turnkey. It can contain many Users, Private Keys, and Policies managed by a Root Quorum. The Root Quorum consists of a set of Users with a consensus threshold. This consensus threshold must be reached by Quorum members in order for any actions to take place.\n\nSee [Root Quorum](../concepts/users/root-quorum) for more information" }, + { + "name": "Webhooks", + "description": "Webhooks let you subscribe to events on your Organization and receive HTTP notifications when they occur, such as when an Activity completes." + }, { "name": "Invitations", "description": "Invitations allow you to invite Users into your Organization via email. Alternatively, Users can be added directly without an Invitation if their ApiKey or Authenticator credentials are known ahead of time.\n\nSee [Users](./api#tag/Users) for more information" @@ -30,6 +34,10 @@ "name": "Signing", "description": "Signers allow you to create digital signatures. Signatures are used to validate the authenticity and integrity of a digital message. Turnkey makes it easy to produce signatures by allowing you to sign with an address. If Turnkey doesn't yet support an address format you need, you can generate and sign with the public key instead by using the address format `ADDRESS_FORMAT_COMPRESSED`." }, + { + "name": "Spark", + "description": "Spark operations support the Spark Bitcoin protocol, including preparing and claiming encrypted transfers and preparing Lightning receives.\n\nFROST partial signing for Spark wallets is performed via the Signing operations. See [Signing](./api#tag/Signing) for more information" + }, { "name": "Private Keys", "description": "Private Keys are cryptographic public / private key pairs that can be used for cryptocurrency needs or more generalized encryption. Turnkey securely holds all private key materials for you, but only you can access them.\n\nThe Private Key ID or any derived address can be used to create digital signatures. See [Signing](./api#tag/Signing) for more information" @@ -51,8 +59,8 @@ "description": "Authenticators are WebAuthN hardware devices, such as a Macbook TouchID or Yubikey, that can be used to authenticate requests." }, { - "name": "API Keys", - "description": "API Keys are used to authenticate requests\n\nSee our [CLI](https://github.com/tkhq/tkcli) for instructions on generating API Keys" + "name": "API keys", + "description": "API keys are used to authenticate requests\n\nSee our [CLI](https://github.com/tkhq/tkcli) for instructions on generating API keys" }, { "name": "Activities", @@ -61,6 +69,10 @@ { "name": "Consensus", "description": "Policies can enforce consensus requirements for Activities. For example, adding a new user requires two admins to approve the request.\n\nActivities that have been proposed, but don't yet meet the Consensus requirements will have the status: `REQUIRES_CONSENSUS`. Activities in this state can be approved or rejected using the unique fingerprint generated when an Activity is created." + }, + { + "name": "IP Allowlist", + "description": "IP Allowlists restrict API access to specific CIDR blocks. They can be configured at the organization level (applying to all API keys) or at the individual API key level (overriding organization-level allowlists).\n\nWhen no IP allowlist is configured, all IP addresses are allowed. Organization-level allowlists can be enabled or disabled, while API key-level allowlists are always enforced when present." } ], "host": "api.turnkey.com", @@ -68,6 +80,38 @@ "consumes": ["application/json"], "produces": ["application/json"], "paths": { + "/public/v1/query/get_active_policies": { + "post": { + "summary": "Get active policies", + "description": "For each policy in an organization, report whether it is currently active based on the enclave's trusted timestamp and the policy's time window (if any). Policies without a time field are always active.", + "operationId": "PublicApiService_GetActivePolicies", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1GetActivePoliciesResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1GetActivePoliciesRequest" + } + } + ], + "tags": ["Policies"] + } + }, "/public/v1/query/get_activity": { "post": { "summary": "Get activity", @@ -164,6 +208,38 @@ "tags": ["API keys"] } }, + "/public/v1/query/get_app_status": { + "post": { + "summary": "Get TVC app status", + "description": "Get live runtime status for a TVC app from the cluster.", + "operationId": "PublicApiService_GetAppStatus", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1GetAppStatusResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1GetAppStatusRequest" + } + } + ], + "tags": ["TVC"] + } + }, "/public/v1/query/get_authenticator": { "post": { "summary": "Get authenticator", @@ -230,8 +306,8 @@ }, "/public/v1/query/get_boot_proof": { "post": { - "summary": "Get a specific boot proof", - "description": "Get the boot proof for a given ephemeral key.", + "summary": "Get a specific Boot Proof", + "description": "Get the Boot Proof for a given ephemeral key.", "operationId": "PublicApiService_GetBootProof", "responses": { "200": { @@ -260,16 +336,16 @@ "tags": ["Boot Proof"] } }, - "/public/v1/query/get_gas_usage": { + "/public/v1/query/get_claim_earn_fees_status": { "post": { - "summary": "Get gas usage", - "description": "Get gas usage and gas limits for either the parent organization or a sub-organization.", - "operationId": "PublicApiService_GetGasUsage", + "summary": "Get Earn claim fees status", + "description": "Poll the status of a fee claim by its claim_request_id.", + "operationId": "PublicApiService_GetClaimEarnFeesStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetGasUsageResponse" + "$ref": "#/definitions/v1GetClaimEarnFeesStatusResponse" } }, "default": { @@ -285,23 +361,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetGasUsageRequest" + "$ref": "#/definitions/v1GetClaimEarnFeesStatusRequest" } } ], - "tags": ["Broadcasting"] + "tags": ["Earn"] } }, - "/public/v1/query/get_latest_boot_proof": { + "/public/v1/query/get_earn_claim_rewards_status": { "post": { - "summary": "Get the latest boot proof for an app", - "description": "Get the latest boot proof for a given enclave app name.", - "operationId": "PublicApiService_GetLatestBootProof", + "summary": "Get Earn claim rewards status", + "description": "Poll the status of a rewards claim by its claim_request_id.", + "operationId": "PublicApiService_GetEarnClaimRewardsStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1BootProofResponse" + "$ref": "#/definitions/v1GetEarnClaimRewardsStatusResponse" } }, "default": { @@ -317,23 +393,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetLatestBootProofRequest" + "$ref": "#/definitions/v1GetEarnClaimRewardsStatusRequest" } } ], - "tags": ["Boot Proof"] + "tags": ["Earn"] } }, - "/public/v1/query/get_nonces": { + "/public/v1/query/get_earn_deploy_status": { "post": { - "summary": "Get nonces", - "description": "Get nonce values for an address on a given network. Can fetch the standard on-chain nonce and/or the gas station nonce used for sponsored transactions.", - "operationId": "PublicApiService_GetNonces", + "summary": "Get Earn deploy status", + "description": "Poll the status of a wrapper deployment by its deploy_request_id.", + "operationId": "PublicApiService_GetEarnDeployStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetNoncesResponse" + "$ref": "#/definitions/v1GetEarnDeployStatusResponse" } }, "default": { @@ -349,23 +425,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetNoncesRequest" + "$ref": "#/definitions/v1GetEarnDeployStatusRequest" } } ], - "tags": ["Broadcasting"] + "tags": ["Earn"] } }, - "/public/v1/query/get_oauth2_credential": { + "/public/v1/query/get_earn_deposit_status": { "post": { - "summary": "Get OAuth 2.0 credential", - "description": "Get details about an OAuth 2.0 credential.", - "operationId": "PublicApiService_GetOauth2Credential", + "summary": "Get Earn deposit status", + "description": "Poll the status of a deposit by its deposit_request_id (for the async/sponsored deposit path).", + "operationId": "PublicApiService_GetEarnDepositStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetOauth2CredentialResponse" + "$ref": "#/definitions/v1GetEarnDepositStatusResponse" } }, "default": { @@ -381,23 +457,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetOauth2CredentialRequest" + "$ref": "#/definitions/v1GetEarnDepositStatusRequest" } } ], - "tags": ["PublicApiService"] + "tags": ["Earn"] } }, - "/public/v1/query/get_oauth_providers": { + "/public/v1/query/get_earn_withdraw_status": { "post": { - "summary": "Get Oauth providers", - "description": "Get details about Oauth providers for a user.", - "operationId": "PublicApiService_GetOauthProviders", + "summary": "Get Earn withdraw status", + "description": "Poll the status of a withdrawal by its withdraw_request_id.", + "operationId": "PublicApiService_GetEarnWithdrawStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetOauthProvidersResponse" + "$ref": "#/definitions/v1GetEarnWithdrawStatusResponse" } }, "default": { @@ -413,23 +489,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetOauthProvidersRequest" + "$ref": "#/definitions/v1GetEarnWithdrawStatusRequest" } } ], - "tags": ["User Auth"] + "tags": ["Earn"] } }, - "/public/v1/query/get_onramp_transaction_status": { + "/public/v1/query/get_gas_usage": { "post": { - "summary": "Get On Ramp transaction status", - "description": "Get the status of an on ramp transaction.", - "operationId": "PublicApiService_GetOnRampTransactionStatus", + "summary": "Get gas usage", + "description": "Get gas usage and gas limits for either the parent organization or a sub-organization.", + "operationId": "PublicApiService_GetGasUsage", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetOnRampTransactionStatusResponse" + "$ref": "#/definitions/v1GetGasUsageResponse" } }, "default": { @@ -445,23 +521,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetOnRampTransactionStatusRequest" + "$ref": "#/definitions/v1GetGasUsageRequest" } } ], - "tags": ["On Ramp"] + "tags": ["Broadcasting"] } }, - "/public/v1/query/get_organization_configs": { + "/public/v1/query/get_ip_allowlist": { "post": { - "summary": "Get configs", - "description": "Get quorum settings and features for an organization.", - "operationId": "PublicApiService_GetOrganizationConfigs", + "summary": "Get IP Allowlist", + "description": "Get IP allowlist and rules for an organization.", + "operationId": "PublicApiService_GetIpAllowlist", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetOrganizationConfigsResponse" + "$ref": "#/definitions/v1GetIpAllowlistResponse" } }, "default": { @@ -477,23 +553,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetOrganizationConfigsRequest" + "$ref": "#/definitions/v1GetIpAllowlistRequest" } } ], - "tags": ["Organizations"] + "tags": ["IP Allowlist"] } }, - "/public/v1/query/get_policy": { + "/public/v1/query/get_latest_boot_proof": { "post": { - "summary": "Get policy", - "description": "Get details about a policy.", - "operationId": "PublicApiService_GetPolicy", + "summary": "Get the latest Boot Proof for an app", + "description": "Get the latest Boot Proof for a given enclave app name.", + "operationId": "PublicApiService_GetLatestBootProof", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetPolicyResponse" + "$ref": "#/definitions/v1BootProofResponse" } }, "default": { @@ -509,23 +585,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetPolicyRequest" + "$ref": "#/definitions/v1GetLatestBootProofRequest" } } ], - "tags": ["Policies"] + "tags": ["Boot Proof"] } }, - "/public/v1/query/get_policy_evaluations": { + "/public/v1/query/get_mfa_policies": { "post": { - "summary": "Get policy evaluations", - "description": "Get the policy evaluations for an activity.", - "operationId": "PublicApiService_GetPolicyEvaluations", + "summary": "Get MFA policies", + "description": "Get all MFA policies for a user.", + "operationId": "PublicApiService_GetMfaPolicies", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetPolicyEvaluationsResponse" + "$ref": "#/definitions/v1GetMfaPoliciesResponse" } }, "default": { @@ -541,23 +617,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetPolicyEvaluationsRequest" + "$ref": "#/definitions/v1GetMfaPoliciesRequest" } } ], - "tags": ["Activities"] + "tags": ["MFA Policies"] } }, - "/public/v1/query/get_private_key": { + "/public/v1/query/get_mfa_policy": { "post": { - "summary": "Get private key", - "description": "Get details about a private key.", - "operationId": "PublicApiService_GetPrivateKey", + "summary": "Get MFA policy", + "description": "Get a single MFA policy for a user.", + "operationId": "PublicApiService_GetMfaPolicy", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetPrivateKeyResponse" + "$ref": "#/definitions/v1GetMfaPolicyResponse" } }, "default": { @@ -573,23 +649,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetPrivateKeyRequest" + "$ref": "#/definitions/v1GetMfaPolicyRequest" } } ], - "tags": ["Private Keys"] + "tags": ["MFA Policies"] } }, - "/public/v1/query/get_send_transaction_status": { + "/public/v1/query/get_mfa_status": { "post": { - "summary": "Get send transaction status", - "description": "Get the status of a send transaction request.", - "operationId": "PublicApiService_GetSendTransactionStatus", + "summary": "Get MFA status", + "description": "Get the MFA status of an activity for a specific user or all voting users.", + "operationId": "PublicApiService_GetMfaStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetSendTransactionStatusResponse" + "$ref": "#/definitions/v1GetMfaStatusResponse" } }, "default": { @@ -605,23 +681,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetSendTransactionStatusRequest" + "$ref": "#/definitions/v1GetMfaStatusRequest" } } ], - "tags": ["Send Transactions"] + "tags": ["MFA Policies"] } }, - "/public/v1/query/get_smart_contract_interface": { + "/public/v1/query/get_nonces": { "post": { - "summary": "Get smart contract interface", - "description": "Get details about a smart contract interface.", - "operationId": "PublicApiService_GetSmartContractInterface", + "summary": "Get nonces", + "description": "Get nonce values for an address on a given network. Can fetch the standard on-chain nonce and/or the gas station nonce used for sponsored transactions.", + "operationId": "PublicApiService_GetNonces", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetSmartContractInterfaceResponse" + "$ref": "#/definitions/v1GetNoncesResponse" } }, "default": { @@ -637,23 +713,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetSmartContractInterfaceRequest" + "$ref": "#/definitions/v1GetNoncesRequest" } } ], - "tags": ["Policies"] + "tags": ["Broadcasting"] } }, - "/public/v1/query/get_user": { + "/public/v1/query/get_oauth2_credential": { "post": { - "summary": "Get user", - "description": "Get details about a user.", - "operationId": "PublicApiService_GetUser", + "summary": "Get OAuth 2.0 credential", + "description": "Get details about an OAuth 2.0 credential.", + "operationId": "PublicApiService_GetOauth2Credential", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetUserResponse" + "$ref": "#/definitions/v1GetOauth2CredentialResponse" } }, "default": { @@ -669,23 +745,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetUserRequest" + "$ref": "#/definitions/v1GetOauth2CredentialRequest" } } ], - "tags": ["Users"] + "tags": ["User Auth"] } }, - "/public/v1/query/get_wallet": { + "/public/v1/query/get_oauth_providers": { "post": { - "summary": "Get wallet", - "description": "Get details about a wallet.", - "operationId": "PublicApiService_GetWallet", + "summary": "Get OAuth providers", + "description": "Get details about Oauth providers for a user.", + "operationId": "PublicApiService_GetOauthProviders", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetWalletResponse" + "$ref": "#/definitions/v1GetOauthProvidersResponse" } }, "default": { @@ -701,23 +777,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetWalletRequest" + "$ref": "#/definitions/v1GetOauthProvidersRequest" } } ], - "tags": ["Wallets"] + "tags": ["User Auth"] } }, - "/public/v1/query/get_wallet_account": { + "/public/v1/query/get_onramp_transaction_status": { "post": { - "summary": "Get wallet account", - "description": "Get a single wallet account.", - "operationId": "PublicApiService_GetWalletAccount", + "summary": "Get On Ramp transaction status", + "description": "Get the status of an on ramp transaction.", + "operationId": "PublicApiService_GetOnRampTransactionStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetWalletAccountResponse" + "$ref": "#/definitions/v1GetOnRampTransactionStatusResponse" } }, "default": { @@ -733,23 +809,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetWalletAccountRequest" + "$ref": "#/definitions/v1GetOnRampTransactionStatusRequest" } } ], - "tags": ["Wallets"] + "tags": ["On Ramp"] } }, - "/public/v1/query/get_wallet_address_balances": { + "/public/v1/query/get_organization_configs": { "post": { - "summary": "Get balances", - "description": "Get balances of supported assets for an address on the specified network. Only non-zero balances are returned. This feature is in beta - please contact support for access.", - "operationId": "PublicApiService_GetWalletAddressBalances", + "summary": "Get configs", + "description": "Get quorum settings and features for an organization.", + "operationId": "PublicApiService_GetOrganizationConfigs", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetWalletAddressBalancesResponse" + "$ref": "#/definitions/v1GetOrganizationConfigsResponse" } }, "default": { @@ -765,23 +841,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetWalletAddressBalancesRequest" + "$ref": "#/definitions/v1GetOrganizationConfigsRequest" } } ], - "tags": ["Wallets"] + "tags": ["Organizations"] } }, - "/public/v1/query/list_activities": { + "/public/v1/query/get_policy": { "post": { - "summary": "List activities", - "description": "List all activities within an organization.", - "operationId": "PublicApiService_GetActivities", + "summary": "Get policy", + "description": "Get details about a policy.", + "operationId": "PublicApiService_GetPolicy", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetActivitiesResponse" + "$ref": "#/definitions/v1GetPolicyResponse" } }, "default": { @@ -797,23 +873,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetActivitiesRequest" + "$ref": "#/definitions/v1GetPolicyRequest" } } ], - "tags": ["Activities"] + "tags": ["Policies"] } }, - "/public/v1/query/list_app_proofs": { + "/public/v1/query/get_policy_evaluations": { "post": { - "summary": "List App Proofs for an activity", - "description": "List the App Proofs for the given activity.", - "operationId": "PublicApiService_GetAppProofs", + "summary": "Get policy evaluations", + "description": "Get the policy evaluations for an activity.", + "operationId": "PublicApiService_GetPolicyEvaluations", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetAppProofsResponse" + "$ref": "#/definitions/v1GetPolicyEvaluationsResponse" } }, "default": { @@ -829,23 +905,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetAppProofsRequest" + "$ref": "#/definitions/v1GetPolicyEvaluationsRequest" } } ], - "tags": ["App Proof"] + "tags": ["Activities"] } }, - "/public/v1/query/list_fiat_on_ramp_credentials": { + "/public/v1/query/get_private_key": { "post": { - "summary": "List Fiat On Ramp Credentials", - "description": "List all fiat on ramp provider credentials within an organization.", - "operationId": "PublicApiService_ListFiatOnRampCredentials", + "summary": "Get private key", + "description": "Get details about a private key.", + "operationId": "PublicApiService_GetPrivateKey", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ListFiatOnRampCredentialsResponse" + "$ref": "#/definitions/v1GetPrivateKeyResponse" } }, "default": { @@ -861,23 +937,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ListFiatOnRampCredentialsRequest" + "$ref": "#/definitions/v1GetPrivateKeyRequest" } } ], - "tags": ["On Ramp"] + "tags": ["Private Keys"] } }, - "/public/v1/query/list_oauth2_credentials": { + "/public/v1/query/get_send_transaction_status": { "post": { - "summary": "List OAuth 2.0 Credentials", - "description": "List all OAuth 2.0 credentials within an organization.", - "operationId": "PublicApiService_ListOauth2Credentials", - "responses": { + "summary": "Get send transaction status", + "description": "Get the status of a send transaction request.", + "operationId": "PublicApiService_GetSendTransactionStatus", + "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ListOauth2CredentialsResponse" + "$ref": "#/definitions/v1GetSendTransactionStatusResponse" } }, "default": { @@ -893,23 +969,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ListOauth2CredentialsRequest" + "$ref": "#/definitions/v1GetSendTransactionStatusRequest" } } ], - "tags": ["User Auth"] + "tags": ["Send Transactions"] } }, - "/public/v1/query/list_policies": { + "/public/v1/query/get_session_profile": { "post": { - "summary": "List policies", - "description": "List all policies within an organization.", - "operationId": "PublicApiService_GetPolicies", + "summary": "Get session profile", + "description": "Get a single session profile for an organization.", + "operationId": "PublicApiService_GetSessionProfile", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetPoliciesResponse" + "$ref": "#/definitions/v1GetSessionProfileResponse" } }, "default": { @@ -925,23 +1001,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetPoliciesRequest" + "$ref": "#/definitions/v1GetSessionProfileRequest" } } ], - "tags": ["Policies"] + "tags": ["Session Profiles"] } }, - "/public/v1/query/list_private_key_tags": { + "/public/v1/query/get_session_profiles": { "post": { - "summary": "List private key tags", - "description": "List all private key tags within an organization.", - "operationId": "PublicApiService_ListPrivateKeyTags", + "summary": "Get session profiles", + "description": "Get all session profiles for an organization.", + "operationId": "PublicApiService_GetSessionProfiles", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ListPrivateKeyTagsResponse" + "$ref": "#/definitions/v1GetSessionProfilesResponse" } }, "default": { @@ -957,23 +1033,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ListPrivateKeyTagsRequest" + "$ref": "#/definitions/v1GetSessionProfilesRequest" } } ], - "tags": ["Private Key Tags"] + "tags": ["Session Profiles"] } }, - "/public/v1/query/list_private_keys": { + "/public/v1/query/get_smart_contract_interface": { "post": { - "summary": "List private keys", - "description": "List all private keys within an organization.", - "operationId": "PublicApiService_GetPrivateKeys", + "summary": "Get smart contract interface", + "description": "Get details about a smart contract interface.", + "operationId": "PublicApiService_GetSmartContractInterface", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetPrivateKeysResponse" + "$ref": "#/definitions/v1GetSmartContractInterfaceResponse" } }, "default": { @@ -989,23 +1065,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetPrivateKeysRequest" + "$ref": "#/definitions/v1GetSmartContractInterfaceRequest" } } ], - "tags": ["Private Keys"] + "tags": ["Policies"] } }, - "/public/v1/query/list_smart_contract_interfaces": { + "/public/v1/query/get_swap_sponsorship_usage": { "post": { - "summary": "List smart contract interfaces", - "description": "List all smart contract interfaces within an organization.", - "operationId": "PublicApiService_GetSmartContractInterfaces", + "summary": "Get swap sponsorship usage", + "description": "Read each swap sponsorship feature's spending window and settled spending in the current rolling window. Parents see aggregate spending; children see their own spending. Pending swaps are not reserved.", + "operationId": "PublicApiService_GetSwapSponsorshipUsage", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetSmartContractInterfacesResponse" + "$ref": "#/definitions/v1GetSwapSponsorshipUsageResponse" } }, "default": { @@ -1021,23 +1097,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetSmartContractInterfacesRequest" + "$ref": "#/definitions/v1GetSwapSponsorshipUsageRequest" } } ], - "tags": ["Policies"] + "tags": ["Swaps"] } }, - "/public/v1/query/list_suborgs": { + "/public/v1/query/get_swap_status": { "post": { - "summary": "Get sub-organizations", - "description": "Get all suborg IDs associated given a parent org ID and an optional filter.", - "operationId": "PublicApiService_GetSubOrgIds", + "summary": "Get Swap status", + "description": "Poll the status of a swap by its swap_request_id. Covers same-chain and cross-chain swaps.", + "operationId": "PublicApiService_GetSwapStatus", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetSubOrgIdsResponse" + "$ref": "#/definitions/v1GetSwapStatusResponse" } }, "default": { @@ -1053,23 +1129,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetSubOrgIdsRequest" + "$ref": "#/definitions/v1GetSwapStatusRequest" } } ], - "tags": ["Organizations"] + "tags": ["Swaps"] } }, - "/public/v1/query/list_supported_assets": { + "/public/v1/query/get_tvc_app": { "post": { - "summary": "List supported assets", - "description": "List supported assets for the specified network. This feature is in beta - please contact support for access.", - "operationId": "PublicApiService_ListSupportedAssets", + "summary": "Get TVC app", + "description": "Get details about a single TVC app.", + "operationId": "PublicApiService_GetTvcApp", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ListSupportedAssetsResponse" + "$ref": "#/definitions/v1GetTvcAppResponse" } }, "default": { @@ -1085,23 +1161,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ListSupportedAssetsRequest" + "$ref": "#/definitions/v1GetTvcAppRequest" } } ], - "tags": ["Wallets"] + "tags": ["TVC"] } }, - "/public/v1/query/list_user_tags": { + "/public/v1/query/get_tvc_deployment": { "post": { - "summary": "List user tags", - "description": "List all user tags within an organization.", - "operationId": "PublicApiService_ListUserTags", + "summary": "Get TVC deployment", + "description": "Get details about a single TVC deployment.", + "operationId": "PublicApiService_GetTvcDeployment", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ListUserTagsResponse" + "$ref": "#/definitions/v1GetTvcDeploymentResponse" } }, "default": { @@ -1117,23 +1193,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ListUserTagsRequest" + "$ref": "#/definitions/v1GetTvcDeploymentRequest" } } ], - "tags": ["User Tags"] + "tags": ["TVC"] } }, - "/public/v1/query/list_users": { + "/public/v1/query/get_tvc_deployment_debug_logs": { "post": { - "summary": "List users", - "description": "List all users within an organization.", - "operationId": "PublicApiService_GetUsers", + "summary": "Get TVC deployment debug logs", + "description": "Get a bounded window of application logs from a debug-mode TVC deployment. Returned lines are collected from every running replica and sorted by platform timestamp.", + "operationId": "PublicApiService_GetTvcDeploymentDebugLogs", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetUsersResponse" + "$ref": "#/definitions/v1GetTvcDeploymentDebugLogsResponse" } }, "default": { @@ -1149,23 +1225,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetUsersRequest" + "$ref": "#/definitions/v1GetTvcDeploymentDebugLogsRequest" } } ], - "tags": ["Users"] + "tags": ["TVC"] } }, - "/public/v1/query/list_verified_suborgs": { + "/public/v1/query/get_tvc_deployment_provisioning_details": { "post": { - "summary": "Get verified sub-organizations", - "description": "Get all email or phone verified suborg IDs associated given a parent org ID.", - "operationId": "PublicApiService_GetVerifiedSubOrgIds", + "summary": "Get TVC deployment's provisioning details", + "description": "Get the attestation document and manifest envelope of the provisioning enclave for a TVC deployment.", + "operationId": "PublicApiService_GetTvcDeploymentProvisioningDetails", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetVerifiedSubOrgIdsResponse" + "$ref": "#/definitions/v1GetTvcDeploymentProvisioningDetailsResponse" } }, "default": { @@ -1181,23 +1257,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetVerifiedSubOrgIdsRequest" + "$ref": "#/definitions/v1GetTvcDeploymentProvisioningDetailsRequest" } } ], - "tags": ["Organizations"] + "tags": ["TVC"] } }, - "/public/v1/query/list_wallet_accounts": { + "/public/v1/query/get_tvc_qos_versions": { "post": { - "summary": "List wallets accounts", - "description": "List all accounts within a wallet.", - "operationId": "PublicApiService_GetWalletAccounts", + "summary": "Get TVC QOS versions", + "description": "List QOS versions supported for new TVC deployments and the latest recommended QOS version.", + "operationId": "PublicApiService_GetTvcQosVersions", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetWalletAccountsResponse" + "$ref": "#/definitions/v1GetTvcQosVersionsResponse" } }, "default": { @@ -1213,23 +1289,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetWalletAccountsRequest" + "$ref": "#/definitions/v1GetTvcQosVersionsRequest" } } ], - "tags": ["Wallets"] + "tags": ["TVC"] } }, - "/public/v1/query/list_wallets": { + "/public/v1/query/get_user": { "post": { - "summary": "List wallets", - "description": "List all wallets within an organization.", - "operationId": "PublicApiService_GetWallets", + "summary": "Get user", + "description": "Get details about a user.", + "operationId": "PublicApiService_GetUser", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetWalletsResponse" + "$ref": "#/definitions/v1GetUserResponse" } }, "default": { @@ -1245,23 +1321,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetWalletsRequest" + "$ref": "#/definitions/v1GetUserRequest" } } ], - "tags": ["Wallets"] + "tags": ["Users"] } }, - "/public/v1/query/whoami": { + "/public/v1/query/get_wallet": { "post": { - "summary": "Who am I?", - "description": "Get basic information about your current API or WebAuthN user and their organization. Affords sub-organization look ups via parent organization for WebAuthN or API key users.", - "operationId": "PublicApiService_GetWhoami", + "summary": "Get wallet", + "description": "Get details about a wallet.", + "operationId": "PublicApiService_GetWallet", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1GetWhoamiResponse" + "$ref": "#/definitions/v1GetWalletResponse" } }, "default": { @@ -1277,23 +1353,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1GetWhoamiRequest" + "$ref": "#/definitions/v1GetWalletRequest" } } ], - "tags": ["Sessions"] + "tags": ["Wallets"] } }, - "/public/v1/submit/approve_activity": { + "/public/v1/query/get_wallet_account": { "post": { - "summary": "Approve activity", - "description": "Approve an activity.", - "operationId": "PublicApiService_ApproveActivity", + "summary": "Get wallet account", + "description": "Get a single wallet account.", + "operationId": "PublicApiService_GetWalletAccount", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetWalletAccountResponse" } }, "default": { @@ -1309,23 +1385,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ApproveActivityRequest" + "$ref": "#/definitions/v1GetWalletAccountRequest" } } ], - "tags": ["Consensus"] + "tags": ["Wallets"] } }, - "/public/v1/submit/create_api_keys": { + "/public/v1/query/get_wallet_address_balances": { "post": { - "summary": "Create API keys", - "description": "Add API keys to an existing user.", - "operationId": "PublicApiService_CreateApiKeys", + "summary": "Get balances", + "description": "Get balances of supported assets for an address on the specified network. Only non-zero balances are returned.", + "operationId": "PublicApiService_GetWalletAddressBalances", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetWalletAddressBalancesResponse" } }, "default": { @@ -1341,23 +1417,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateApiKeysRequest" + "$ref": "#/definitions/v1GetWalletAddressBalancesRequest" } } ], - "tags": ["API Keys"] + "tags": ["Wallets"] } }, - "/public/v1/submit/create_authenticators": { + "/public/v1/query/list_activities": { "post": { - "summary": "Create authenticators", - "description": "Create authenticators to authenticate requests to Turnkey.", - "operationId": "PublicApiService_CreateAuthenticators", + "summary": "List activities", + "description": "List all activities within an organization.", + "operationId": "PublicApiService_GetActivities", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetActivitiesResponse" } }, "default": { @@ -1373,23 +1449,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateAuthenticatorsRequest" + "$ref": "#/definitions/v1GetActivitiesRequest" } } ], - "tags": ["Authenticators"] + "tags": ["Activities"] } }, - "/public/v1/submit/create_fiat_on_ramp_credential": { + "/public/v1/query/list_app_proofs": { "post": { - "summary": "Create a Fiat On Ramp Credential", - "description": "Create a fiat on ramp provider credential", - "operationId": "PublicApiService_CreateFiatOnRampCredential", + "summary": "List App Proofs for an activity", + "description": "List the App Proofs for the given activity.", + "operationId": "PublicApiService_GetAppProofs", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetAppProofsResponse" } }, "default": { @@ -1405,23 +1481,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateFiatOnRampCredentialRequest" + "$ref": "#/definitions/v1GetAppProofsRequest" } } ], - "tags": ["On Ramp"] + "tags": ["App Proof"] } }, - "/public/v1/submit/create_invitations": { + "/public/v1/query/list_earn_enabled_vaults": { "post": { - "summary": "Create invitations", - "description": "Create invitations to join an existing organization.", - "operationId": "PublicApiService_CreateInvitations", + "summary": "Get Earn enabled vaults", + "description": "Get the organization's deployed wrappers with on-chain total deposited and live APY. The management view, distinct from per-wallet positions.", + "operationId": "PublicApiService_ListEarnEnabledVaults", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListEarnEnabledVaultsResponse" } }, "default": { @@ -1437,23 +1513,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateInvitationsRequest" + "$ref": "#/definitions/v1ListEarnEnabledVaultsRequest" } } ], - "tags": ["Invitations"] + "tags": ["Earn"] } }, - "/public/v1/submit/create_oauth2_credential": { + "/public/v1/query/list_earn_positions": { "post": { - "summary": "Create an OAuth 2.0 Credential", - "description": "Enable authentication for end users with an OAuth 2.0 provider", - "operationId": "PublicApiService_CreateOauth2Credential", + "summary": "Get Earn positions", + "description": "Get the active Earn positions for a specific wallet, including current value, cost basis, yield, and projected fees.", + "operationId": "PublicApiService_ListEarnPositions", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListEarnPositionsResponse" } }, "default": { @@ -1469,23 +1545,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateOauth2CredentialRequest" + "$ref": "#/definitions/v1ListEarnPositionsRequest" } } ], - "tags": ["User Auth"] + "tags": ["Earn"] } }, - "/public/v1/submit/create_oauth_providers": { + "/public/v1/query/list_earn_rewards": { "post": { - "summary": "Create Oauth providers", - "description": "Create Oauth providers for a specified user.", - "operationId": "PublicApiService_CreateOauthProviders", + "summary": "List Earn rewards", + "description": "List the protocol rewards (e.g. MORPHO and third-party campaign tokens, distributed off-chain via Merkl) attributed to a wallet: claimable, lifetime claimed, and pending amounts per reward token.", + "operationId": "PublicApiService_ListEarnRewards", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListEarnRewardsResponse" } }, "default": { @@ -1501,23 +1577,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateOauthProvidersRequest" + "$ref": "#/definitions/v1ListEarnRewardsRequest" } } ], - "tags": ["User Auth"] + "tags": ["Earn"] } }, - "/public/v1/submit/create_policies": { + "/public/v1/query/list_earn_vaults": { "post": { - "summary": "Create policies", - "description": "Create new policies.", - "operationId": "PublicApiService_CreatePolicies", + "summary": "Get Earn vault catalog", + "description": "Get the catalog of all wrappable yield vaults across supported chains, enriched with live TVL and APY. Annotates which vaults the organization has already enabled.", + "operationId": "PublicApiService_ListEarnVaults", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListEarnVaultsResponse" } }, "default": { @@ -1533,23 +1609,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreatePoliciesRequest" + "$ref": "#/definitions/v1ListEarnVaultsRequest" } } ], - "tags": ["Policies"] + "tags": ["Earn"] } }, - "/public/v1/submit/create_policy": { + "/public/v1/query/list_email_events": { "post": { - "summary": "Create policy", - "description": "Create a new policy.", - "operationId": "PublicApiService_CreatePolicy", + "summary": "List email events", + "description": "List email events for the organization.", + "operationId": "PublicApiService_ListEmailEvents", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListEmailEventsResponse" } }, "default": { @@ -1565,23 +1641,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreatePolicyRequest" + "$ref": "#/definitions/v1ListEmailEventsRequest" } } ], - "tags": ["Policies"] + "tags": ["Email"] } }, - "/public/v1/submit/create_private_key_tag": { + "/public/v1/query/list_eth_transaction_history": { "post": { - "summary": "Create private key tag", - "description": "Create a private key tag and add it to private keys.", - "operationId": "PublicApiService_CreatePrivateKeyTag", + "summary": "List Eth transaction history", + "description": "List Ethereum transaction history for a wallet address on the specified network.", + "operationId": "PublicApiService_ListEthTransactionHistory", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListEthTransactionHistoryResponse" } }, "default": { @@ -1597,23 +1673,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreatePrivateKeyTagRequest" + "$ref": "#/definitions/v1ListEthTransactionHistoryRequest" } } ], - "tags": ["Private Key Tags"] + "tags": ["Wallets"] } }, - "/public/v1/submit/create_private_keys": { + "/public/v1/query/list_fiat_on_ramp_credentials": { "post": { - "summary": "Create private keys", - "description": "Create new private keys.", - "operationId": "PublicApiService_CreatePrivateKeys", + "summary": "List Fiat On Ramp credentials", + "description": "List all fiat on ramp provider credentials within an organization.", + "operationId": "PublicApiService_ListFiatOnRampCredentials", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListFiatOnRampCredentialsResponse" } }, "default": { @@ -1629,23 +1705,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreatePrivateKeysRequest" + "$ref": "#/definitions/v1ListFiatOnRampCredentialsRequest" } } ], - "tags": ["Private Keys"] + "tags": ["On Ramp"] } }, - "/public/v1/submit/create_read_only_session": { + "/public/v1/query/list_oauth2_credentials": { "post": { - "summary": "Create read only session", - "description": "Create a read only session for a user (valid for 1 hour).", - "operationId": "PublicApiService_CreateReadOnlySession", + "summary": "List OAuth 2.0 credentials", + "description": "List all OAuth 2.0 credentials within an organization.", + "operationId": "PublicApiService_ListOauth2Credentials", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListOauth2CredentialsResponse" } }, "default": { @@ -1661,23 +1737,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateReadOnlySessionRequest" + "$ref": "#/definitions/v1ListOauth2CredentialsRequest" } } ], - "tags": ["Sessions"] + "tags": ["User Auth"] } }, - "/public/v1/submit/create_read_write_session": { + "/public/v1/query/list_policies": { "post": { - "summary": "Create read write session", - "description": "Create a read write session for a user.", - "operationId": "PublicApiService_CreateReadWriteSession", + "summary": "List policies", + "description": "List all policies within an organization.", + "operationId": "PublicApiService_GetPolicies", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetPoliciesResponse" } }, "default": { @@ -1693,23 +1769,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateReadWriteSessionRequest" + "$ref": "#/definitions/v1GetPoliciesRequest" } } ], - "tags": ["Sessions"] + "tags": ["Policies"] } }, - "/public/v1/submit/create_smart_contract_interface": { + "/public/v1/query/list_private_key_tags": { "post": { - "summary": "Create smart contract interface", - "description": "Create an ABI/IDL in JSON.", - "operationId": "PublicApiService_CreateSmartContractInterface", + "summary": "List private key tags", + "description": "List all private key tags within an organization.", + "operationId": "PublicApiService_ListPrivateKeyTags", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListPrivateKeyTagsResponse" } }, "default": { @@ -1725,23 +1801,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateSmartContractInterfaceRequest" + "$ref": "#/definitions/v1ListPrivateKeyTagsRequest" } } ], - "tags": ["Policies"] + "tags": ["Private Key Tags"] } }, - "/public/v1/submit/create_sub_organization": { + "/public/v1/query/list_private_keys": { "post": { - "summary": "Create sub-organization", - "description": "Create a new sub-organization.", - "operationId": "PublicApiService_CreateSubOrganization", + "summary": "List private keys", + "description": "List all private keys within an organization.", + "operationId": "PublicApiService_GetPrivateKeys", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetPrivateKeysResponse" } }, "default": { @@ -1757,23 +1833,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateSubOrganizationRequest" + "$ref": "#/definitions/v1GetPrivateKeysRequest" } } ], - "tags": ["Organizations"] + "tags": ["Private Keys"] } }, - "/public/v1/submit/create_user_tag": { + "/public/v1/query/list_secrets": { "post": { - "summary": "Create user tag", - "description": "Create a user tag and add it to users.", - "operationId": "PublicApiService_CreateUserTag", + "summary": "List secrets", + "description": "List secret metadata for an organization.", + "operationId": "PublicApiService_ListSecrets", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListSecretsResponse" } }, "default": { @@ -1789,23 +1865,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateUserTagRequest" + "$ref": "#/definitions/v1ListSecretsRequest" } } ], - "tags": ["User Tags"] + "tags": ["Secrets"] } }, - "/public/v1/submit/create_users": { + "/public/v1/query/list_smart_contract_interfaces": { "post": { - "summary": "Create users", - "description": "Create users in an existing organization.", - "operationId": "PublicApiService_CreateUsers", + "summary": "List smart contract interfaces", + "description": "List all smart contract interfaces within an organization.", + "operationId": "PublicApiService_GetSmartContractInterfaces", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetSmartContractInterfacesResponse" } }, "default": { @@ -1821,23 +1897,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateUsersRequest" + "$ref": "#/definitions/v1GetSmartContractInterfacesRequest" } } ], - "tags": ["Users"] + "tags": ["Policies"] } }, - "/public/v1/submit/create_wallet": { + "/public/v1/query/list_sol_transaction_history": { "post": { - "summary": "Create wallet", - "description": "Create a wallet and derive addresses.", - "operationId": "PublicApiService_CreateWallet", + "summary": "List Sol transaction history", + "description": "List Solana transaction history for a wallet address on the specified network.", + "operationId": "PublicApiService_ListSolTransactionHistory", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListSolTransactionHistoryResponse" } }, "default": { @@ -1853,23 +1929,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateWalletRequest" + "$ref": "#/definitions/v1ListSolTransactionHistoryRequest" } } ], "tags": ["Wallets"] } }, - "/public/v1/submit/create_wallet_accounts": { + "/public/v1/query/list_suborgs": { "post": { - "summary": "Create wallet accounts", - "description": "Derive additional addresses using an existing wallet.", - "operationId": "PublicApiService_CreateWalletAccounts", + "summary": "Get sub-organizations", + "description": "Get all suborg IDs (verified and unverified) associated with a given parent organization ID and an optional filter.", + "operationId": "PublicApiService_GetSubOrgIds", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetSubOrgIdsResponse" } }, "default": { @@ -1885,23 +1961,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1CreateWalletAccountsRequest" + "$ref": "#/definitions/v1GetSubOrgIdsRequest" } } ], - "tags": ["Wallets"] + "tags": ["Organizations"] } }, - "/public/v1/submit/delete_api_keys": { + "/public/v1/query/list_supported_assets": { "post": { - "summary": "Delete API keys", - "description": "Remove api keys from a user.", - "operationId": "PublicApiService_DeleteApiKeys", + "summary": "List supported assets", + "description": "List supported assets for the specified network.", + "operationId": "PublicApiService_ListSupportedAssets", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListSupportedAssetsResponse" } }, "default": { @@ -1917,23 +1993,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteApiKeysRequest" + "$ref": "#/definitions/v1ListSupportedAssetsRequest" } } ], - "tags": ["API Keys"] + "tags": ["Wallets"] } }, - "/public/v1/submit/delete_authenticators": { + "/public/v1/query/list_tvc_app_deployments": { "post": { - "summary": "Delete authenticators", - "description": "Remove authenticators from a user.", - "operationId": "PublicApiService_DeleteAuthenticators", + "summary": "List TVC deployments", + "description": "List all deployments for a given TVC app.", + "operationId": "PublicApiService_GetTvcAppDeployments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetTvcAppDeploymentsResponse" } }, "default": { @@ -1949,23 +2025,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteAuthenticatorsRequest" + "$ref": "#/definitions/v1GetTvcAppDeploymentsRequest" } } ], - "tags": ["Authenticators"] + "tags": ["TVC"] } }, - "/public/v1/submit/delete_fiat_on_ramp_credential": { + "/public/v1/query/list_tvc_apps": { "post": { - "summary": "Delete a Fiat On Ramp Credential", - "description": "Delete a fiat on ramp provider credential", - "operationId": "PublicApiService_DeleteFiatOnRampCredential", + "summary": "List TVC apps", + "description": "List all TVC apps within an organization.", + "operationId": "PublicApiService_GetTvcApps", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetTvcAppsResponse" } }, "default": { @@ -1981,23 +2057,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteFiatOnRampCredentialRequest" + "$ref": "#/definitions/v1GetTvcAppsRequest" } } ], - "tags": ["On Ramp"] + "tags": ["TVC"] } }, - "/public/v1/submit/delete_invitation": { + "/public/v1/query/list_tvc_operators": { "post": { - "summary": "Delete invitation", - "description": "Delete an existing invitation.", - "operationId": "PublicApiService_DeleteInvitation", + "summary": "List TVC operators", + "description": "List all TVC operators within an organization, newest first.", + "operationId": "PublicApiService_GetTvcOperators", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetTvcOperatorsResponse" } }, "default": { @@ -2013,23 +2089,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteInvitationRequest" + "$ref": "#/definitions/v1GetTvcOperatorsRequest" } } ], - "tags": ["Invitations"] + "tags": ["TVC"] } }, - "/public/v1/submit/delete_oauth2_credential": { + "/public/v1/query/list_tvc_quorum_keys": { "post": { - "summary": "Delete an OAuth 2.0 Credential", - "description": "Disable authentication for end users with an OAuth 2.0 provider", - "operationId": "PublicApiService_DeleteOauth2Credential", + "summary": "List TVC Quorum Keys", + "description": "List all hosted TVC Quorum Keys within an organization, newest first.", + "operationId": "PublicApiService_GetTvcQuorumKeys", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetTvcQuorumKeysResponse" } }, "default": { @@ -2045,23 +2121,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteOauth2CredentialRequest" + "$ref": "#/definitions/v1GetTvcQuorumKeysRequest" } } ], - "tags": ["User Auth"] + "tags": ["TVC"] } }, - "/public/v1/submit/delete_oauth_providers": { + "/public/v1/query/list_user_tags": { "post": { - "summary": "Delete Oauth providers", - "description": "Remove Oauth providers for a specified user.", - "operationId": "PublicApiService_DeleteOauthProviders", + "summary": "List user tags", + "description": "List all user tags within an organization.", + "operationId": "PublicApiService_ListUserTags", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListUserTagsResponse" } }, "default": { @@ -2077,23 +2153,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteOauthProvidersRequest" + "$ref": "#/definitions/v1ListUserTagsRequest" } } ], - "tags": ["User Auth"] + "tags": ["User Tags"] } }, - "/public/v1/submit/delete_policies": { + "/public/v1/query/list_users": { "post": { - "summary": "Delete policies", - "description": "Delete existing policies.", - "operationId": "PublicApiService_DeletePolicies", + "summary": "List users", + "description": "List all users within an organization.", + "operationId": "PublicApiService_GetUsers", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetUsersResponse" } }, "default": { @@ -2109,23 +2185,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeletePoliciesRequest" + "$ref": "#/definitions/v1GetUsersRequest" } } ], - "tags": ["Policies"] + "tags": ["Users"] } }, - "/public/v1/submit/delete_policy": { + "/public/v1/query/list_verified_suborgs": { "post": { - "summary": "Delete policy", - "description": "Delete an existing policy.", - "operationId": "PublicApiService_DeletePolicy", + "summary": "Get verified sub-organizations", + "description": "Get all verified suborg IDs associated with a given parent organization ID and an optional filter.", + "operationId": "PublicApiService_GetVerifiedSubOrgIds", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetVerifiedSubOrgIdsResponse" } }, "default": { @@ -2141,23 +2217,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeletePolicyRequest" + "$ref": "#/definitions/v1GetVerifiedSubOrgIdsRequest" } } ], - "tags": ["Policies"] + "tags": ["Organizations"] } }, - "/public/v1/submit/delete_private_key_tags": { + "/public/v1/query/list_wallet_accounts": { "post": { - "summary": "Delete private key tags", - "description": "Delete private key tags within an organization.", - "operationId": "PublicApiService_DeletePrivateKeyTags", + "summary": "List wallet accounts", + "description": "List all accounts within a wallet.", + "operationId": "PublicApiService_GetWalletAccounts", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetWalletAccountsResponse" } }, "default": { @@ -2173,23 +2249,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeletePrivateKeyTagsRequest" + "$ref": "#/definitions/v1GetWalletAccountsRequest" } } ], - "tags": ["Private Key Tags"] + "tags": ["Wallets"] } }, - "/public/v1/submit/delete_private_keys": { + "/public/v1/query/list_wallets": { "post": { - "summary": "Delete private keys", - "description": "Delete private keys for an organization.", - "operationId": "PublicApiService_DeletePrivateKeys", + "summary": "List wallets", + "description": "List all wallets within an organization.", + "operationId": "PublicApiService_GetWallets", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetWalletsResponse" } }, "default": { @@ -2205,23 +2281,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeletePrivateKeysRequest" + "$ref": "#/definitions/v1GetWalletsRequest" } } ], - "tags": ["Private Keys"] + "tags": ["Wallets"] } }, - "/public/v1/submit/delete_smart_contract_interface": { + "/public/v1/query/list_webhook_endpoints": { "post": { - "summary": "Delete smart contract interface", - "description": "Delete a smart contract interface.", - "operationId": "PublicApiService_DeleteSmartContractInterface", + "summary": "List webhook endpoints", + "description": "List webhook endpoints within an organization.", + "operationId": "PublicApiService_ListWebhookEndpoints", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ListWebhookEndpointsResponse" } }, "default": { @@ -2237,23 +2313,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteSmartContractInterfaceRequest" + "$ref": "#/definitions/v1ListWebhookEndpointsRequest" } } ], - "tags": ["Policies"] + "tags": ["Webhooks"] } }, - "/public/v1/submit/delete_sub_organization": { + "/public/v1/query/validate_tvc_image": { "post": { - "summary": "Delete sub-organization", - "description": "Delete a sub-organization.", - "operationId": "PublicApiService_DeleteSubOrganization", + "summary": "Validate container image for TVC", + "description": "Validate a container image URL and pull secret for TVC deployment.", + "operationId": "PublicApiService_ValidateTvcImage", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1ValidateTvcImageResponse" } }, "default": { @@ -2269,23 +2345,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteSubOrganizationRequest" + "$ref": "#/definitions/v1ValidateTvcImageRequest" } } ], - "tags": ["Organizations"] + "tags": ["TVC"] } }, - "/public/v1/submit/delete_user_tags": { + "/public/v1/query/whoami": { "post": { - "summary": "Delete user tags", - "description": "Delete user tags within an organization.", - "operationId": "PublicApiService_DeleteUserTags", + "summary": "Who am I?", + "description": "Get basic information about your current API or WebAuthn user and their organization. Affords sub-organization lookups via parent organization for WebAuthn or API key users.", + "operationId": "PublicApiService_GetWhoami", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1ActivityResponse" + "$ref": "#/definitions/v1GetWhoamiResponse" } }, "default": { @@ -2301,18 +2377,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteUserTagsRequest" + "$ref": "#/definitions/v1GetWhoamiRequest" } } ], - "tags": ["User Tags"] + "tags": ["Sessions"] } }, - "/public/v1/submit/delete_users": { + "/public/v1/submit/approve_activity": { "post": { - "summary": "Delete users", - "description": "Delete users within an organization.", - "operationId": "PublicApiService_DeleteUsers", + "summary": "Approve activity", + "description": "Approve an activity.", + "operationId": "PublicApiService_ApproveActivity", "responses": { "200": { "description": "A successful response.", @@ -2333,18 +2409,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteUsersRequest" + "$ref": "#/definitions/v1ApproveActivityRequest" } } ], - "tags": ["Users"] + "tags": ["Consensus"] } }, - "/public/v1/submit/delete_wallet_accounts": { + "/public/v1/submit/claim_earn_fees": { "post": { - "summary": "Delete wallet accounts", - "description": "Delete wallet accounts for an organization.", - "operationId": "PublicApiService_DeleteWalletAccounts", + "summary": "Claim Earn fees", + "description": "Claim earn fees through the activity pipeline.", + "operationId": "PublicApiService_ClaimEarnFees", "responses": { "200": { "description": "A successful response.", @@ -2365,18 +2441,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteWalletAccountsRequest" + "$ref": "#/definitions/v1ClaimEarnFeesRequest" } } ], - "tags": ["Wallets"] + "tags": ["Earn"] } }, - "/public/v1/submit/delete_wallets": { + "/public/v1/submit/claim_swap_fees": { "post": { - "summary": "Delete wallets", - "description": "Delete wallets for an organization.", - "operationId": "PublicApiService_DeleteWallets", + "summary": "Claim Swap fees", + "description": "Claim swap fees through the activity pipeline.", + "operationId": "PublicApiService_ClaimSwapFees", "responses": { "200": { "description": "A successful response.", @@ -2397,18 +2473,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DeleteWalletsRequest" + "$ref": "#/definitions/v1ClaimSwapFeesRequest" } } ], - "tags": ["Wallets"] + "tags": ["Swaps"] } }, - "/public/v1/submit/email_auth": { + "/public/v1/submit/create_api_keys": { "post": { - "summary": "Perform email auth", - "description": "Authenticate a user via email.", - "operationId": "PublicApiService_EmailAuth", + "summary": "Create API keys", + "description": "Add API keys to an existing user.", + "operationId": "PublicApiService_CreateApiKeys", "responses": { "200": { "description": "A successful response.", @@ -2429,18 +2505,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1EmailAuthRequest" + "$ref": "#/definitions/v1CreateApiKeysRequest" } } ], - "tags": ["User Auth"] + "tags": ["API keys"] } }, - "/public/v1/submit/eth_send_transaction": { + "/public/v1/submit/create_authenticators": { "post": { - "summary": "Broadcast EVM transaction", - "description": "Submit a transaction intent describing an EVM transaction you would like to broadcast.", - "operationId": "PublicApiService_EthSendTransaction", + "summary": "Create authenticators", + "description": "Create authenticators to authenticate requests to Turnkey.", + "operationId": "PublicApiService_CreateAuthenticators", "responses": { "200": { "description": "A successful response.", @@ -2461,18 +2537,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1EthSendTransactionRequest" + "$ref": "#/definitions/v1CreateAuthenticatorsRequest" } } ], - "tags": ["Broadcasting"] + "tags": ["Authenticators"] } }, - "/public/v1/submit/export_private_key": { + "/public/v1/submit/create_fiat_on_ramp_credential": { "post": { - "summary": "Export private key", - "description": "Export a private key.", - "operationId": "PublicApiService_ExportPrivateKey", + "summary": "Create a Fiat On Ramp credential", + "description": "Create a fiat on ramp provider credential.", + "operationId": "PublicApiService_CreateFiatOnRampCredential", "responses": { "200": { "description": "A successful response.", @@ -2493,18 +2569,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ExportPrivateKeyRequest" + "$ref": "#/definitions/v1CreateFiatOnRampCredentialRequest" } } ], - "tags": ["Private Keys"] + "tags": ["On Ramp"] } }, - "/public/v1/submit/export_wallet": { + "/public/v1/submit/create_invitations": { "post": { - "summary": "Export wallet", - "description": "Export a wallet.", - "operationId": "PublicApiService_ExportWallet", + "summary": "Create invitations", + "description": "Create invitations to join an existing organization.", + "operationId": "PublicApiService_CreateInvitations", "responses": { "200": { "description": "A successful response.", @@ -2525,18 +2601,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ExportWalletRequest" + "$ref": "#/definitions/v1CreateInvitationsRequest" } } ], - "tags": ["Wallets"] + "tags": ["Invitations"] } }, - "/public/v1/submit/export_wallet_account": { + "/public/v1/submit/create_mfa_policy": { "post": { - "summary": "Export wallet account", - "description": "Export a wallet account.", - "operationId": "PublicApiService_ExportWalletAccount", + "summary": "Create MFA policy", + "description": "Create a new MFA policy for a user.", + "operationId": "PublicApiService_CreateMfaPolicy", "responses": { "200": { "description": "A successful response.", @@ -2557,18 +2633,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ExportWalletAccountRequest" + "$ref": "#/definitions/v1CreateMfaPolicyRequest" } } ], - "tags": ["Wallets"] + "tags": ["MFA Policies"] } }, - "/public/v1/submit/import_private_key": { + "/public/v1/submit/create_oauth2_credential": { "post": { - "summary": "Import private key", - "description": "Import a private key.", - "operationId": "PublicApiService_ImportPrivateKey", + "summary": "Create an OAuth 2.0 credential", + "description": "Enable authentication for end users with an OAuth 2.0 provider.", + "operationId": "PublicApiService_CreateOauth2Credential", "responses": { "200": { "description": "A successful response.", @@ -2589,18 +2665,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ImportPrivateKeyRequest" + "$ref": "#/definitions/v1CreateOauth2CredentialRequest" } } ], - "tags": ["Private Keys"] + "tags": ["User Auth"] } }, - "/public/v1/submit/import_wallet": { + "/public/v1/submit/create_oauth_providers": { "post": { - "summary": "Import wallet", - "description": "Import a wallet.", - "operationId": "PublicApiService_ImportWallet", + "summary": "Create OAuth providers", + "description": "Create Oauth providers for a specified user.", + "operationId": "PublicApiService_CreateOauthProviders", "responses": { "200": { "description": "A successful response.", @@ -2621,18 +2697,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1ImportWalletRequest" + "$ref": "#/definitions/v1CreateOauthProvidersRequest" } } ], - "tags": ["Wallets"] + "tags": ["User Auth"] } }, - "/public/v1/submit/init_fiat_on_ramp": { + "/public/v1/submit/create_policies": { "post": { - "summary": "Init fiat on ramp", - "description": "Initiate a fiat on ramp flow.", - "operationId": "PublicApiService_InitFiatOnRamp", + "summary": "Create policies", + "description": "Create new policies.", + "operationId": "PublicApiService_CreatePolicies", "responses": { "200": { "description": "A successful response.", @@ -2653,18 +2729,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1InitFiatOnRampRequest" + "$ref": "#/definitions/v1CreatePoliciesRequest" } } ], - "tags": ["On Ramp"] + "tags": ["Policies"] } }, - "/public/v1/submit/init_import_private_key": { + "/public/v1/submit/create_policy": { "post": { - "summary": "Init import private key", - "description": "Initialize a new private key import.", - "operationId": "PublicApiService_InitImportPrivateKey", + "summary": "Create policy", + "description": "Create a new policy.", + "operationId": "PublicApiService_CreatePolicy", "responses": { "200": { "description": "A successful response.", @@ -2685,18 +2761,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1InitImportPrivateKeyRequest" + "$ref": "#/definitions/v1CreatePolicyRequest" } } ], - "tags": ["Private Keys"] + "tags": ["Policies"] } }, - "/public/v1/submit/init_import_wallet": { + "/public/v1/submit/create_private_key_tag": { "post": { - "summary": "Init import wallet", - "description": "Initialize a new wallet import.", - "operationId": "PublicApiService_InitImportWallet", + "summary": "Create private key tag", + "description": "Create a private key tag and add it to private keys.", + "operationId": "PublicApiService_CreatePrivateKeyTag", "responses": { "200": { "description": "A successful response.", @@ -2717,18 +2793,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1InitImportWalletRequest" + "$ref": "#/definitions/v1CreatePrivateKeyTagRequest" } } ], - "tags": ["Wallets"] + "tags": ["Private Key Tags"] } }, - "/public/v1/submit/init_otp": { + "/public/v1/submit/create_private_keys": { "post": { - "summary": "Init generic OTP", - "description": "Initiate a generic OTP activity.", - "operationId": "PublicApiService_InitOtp", + "summary": "Create private keys", + "description": "Create new private keys.", + "operationId": "PublicApiService_CreatePrivateKeys", "responses": { "200": { "description": "A successful response.", @@ -2749,18 +2825,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1InitOtpRequest" + "$ref": "#/definitions/v1CreatePrivateKeysRequest" } } ], - "tags": ["User Verification"] + "tags": ["Private Keys"] } }, - "/public/v1/submit/init_otp_auth": { + "/public/v1/submit/create_read_only_session": { "post": { - "summary": "Init OTP auth", - "description": "Initiate an OTP auth activity.", - "operationId": "PublicApiService_InitOtpAuth", + "summary": "Create read only session", + "description": "Create a read only session for a user (valid for 1 hour).", + "operationId": "PublicApiService_CreateReadOnlySession", "responses": { "200": { "description": "A successful response.", @@ -2781,18 +2857,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1InitOtpAuthRequest" + "$ref": "#/definitions/v1CreateReadOnlySessionRequest" } } ], - "tags": ["User Auth"] + "tags": ["Sessions"] } }, - "/public/v1/submit/init_user_email_recovery": { + "/public/v1/submit/create_read_write_session": { "post": { - "summary": "Init email recovery", - "description": "Initialize a new email recovery.", - "operationId": "PublicApiService_InitUserEmailRecovery", + "summary": "Create read write session", + "description": "Create a read write session for a user.", + "operationId": "PublicApiService_CreateReadWriteSession", "responses": { "200": { "description": "A successful response.", @@ -2813,18 +2889,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1InitUserEmailRecoveryRequest" + "$ref": "#/definitions/v1CreateReadWriteSessionRequest" } } ], - "tags": ["User Recovery"] + "tags": ["Sessions"] } }, - "/public/v1/submit/oauth": { + "/public/v1/submit/create_session_profile": { "post": { - "summary": "Oauth", - "description": "Authenticate a user with an OIDC token (Oauth).", - "operationId": "PublicApiService_Oauth", + "summary": "Create session profile", + "description": "Create a new session profile for an organization.", + "operationId": "PublicApiService_CreateSessionProfile", "responses": { "200": { "description": "A successful response.", @@ -2845,18 +2921,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1OauthRequest" + "$ref": "#/definitions/v1CreateSessionProfileRequest" } } ], - "tags": ["User Auth"] + "tags": ["Session Profiles"] } }, - "/public/v1/submit/oauth2_authenticate": { + "/public/v1/submit/create_smart_contract_interface": { "post": { - "summary": "OAuth 2.0 authentication", - "description": "Authenticate a user with an OAuth 2.0 provider and receive an OIDC token to use with the LoginWithOAuth or CreateSubOrganization activities", - "operationId": "PublicApiService_Oauth2Authenticate", + "summary": "Create smart contract interface", + "description": "Create an ABI/IDL in JSON.", + "operationId": "PublicApiService_CreateSmartContractInterface", "responses": { "200": { "description": "A successful response.", @@ -2877,18 +2953,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1Oauth2AuthenticateRequest" + "$ref": "#/definitions/v1CreateSmartContractInterfaceRequest" } } ], - "tags": ["User Auth"] + "tags": ["Policies"] } }, - "/public/v1/submit/oauth_login": { + "/public/v1/submit/create_sub_organization": { "post": { - "summary": "Login with Oauth", - "description": "Create an Oauth session for a user.", - "operationId": "PublicApiService_OauthLogin", + "summary": "Create sub-organization", + "description": "Create a new sub-organization. Each root user must have at least one valid credential: an API key, an authenticator, an OAuth provider, or an email or phone number with a login method enabled on the sub-organization (email, email OTP, or SMS).", + "operationId": "PublicApiService_CreateSubOrganization", "responses": { "200": { "description": "A successful response.", @@ -2909,18 +2985,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1OauthLoginRequest" + "$ref": "#/definitions/v1CreateSubOrganizationRequest" } } ], - "tags": ["Sessions"] + "tags": ["Organizations"] } }, - "/public/v1/submit/otp_auth": { + "/public/v1/submit/create_swap_quote": { "post": { - "summary": "OTP auth", - "description": "Authenticate a user with an OTP code sent via email or SMS.", - "operationId": "PublicApiService_OtpAuth", + "summary": "Create Swap quote", + "description": "Create a swap quote. Asset chains are derived from CAIP-19 asset IDs; cross-chain quotes are supported. Requests must use ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V3.", + "operationId": "PublicApiService_CreateSwapQuote", "responses": { "200": { "description": "A successful response.", @@ -2941,18 +3017,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1OtpAuthRequest" + "$ref": "#/definitions/v1CreateSwapQuoteRequest" } } ], - "tags": ["User Auth"] + "tags": ["Swaps"] } }, - "/public/v1/submit/otp_login": { + "/public/v1/submit/create_tvc_app": { "post": { - "summary": "Login with OTP", - "description": "Create an OTP session for a user.", - "operationId": "PublicApiService_OtpLogin", + "summary": "Create a TVC app", + "description": "Create a new TVC application.", + "operationId": "PublicApiService_CreateTvcApp", "responses": { "200": { "description": "A successful response.", @@ -2973,18 +3049,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1OtpLoginRequest" + "$ref": "#/definitions/v1CreateTvcAppRequest" } } ], - "tags": ["Sessions"] + "tags": ["TVC"] } }, - "/public/v1/submit/recover_user": { + "/public/v1/submit/create_tvc_deployment": { "post": { - "summary": "Recover a user", - "description": "Complete the process of recovering a user by adding an authenticator.", - "operationId": "PublicApiService_RecoverUser", + "summary": "Create a TVC deployment", + "description": "Create a new TVC deployment.", + "operationId": "PublicApiService_CreateTvcDeployment", "responses": { "200": { "description": "A successful response.", @@ -3005,18 +3081,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1RecoverUserRequest" + "$ref": "#/definitions/v1CreateTvcDeploymentRequest" } } ], - "tags": ["User Recovery"] + "tags": ["TVC"] } }, - "/public/v1/submit/reject_activity": { + "/public/v1/submit/create_tvc_manifest_approvals": { "post": { - "summary": "Reject activity", - "description": "Reject an activity.", - "operationId": "PublicApiService_RejectActivity", + "summary": "Create TVC manifest approvals", + "description": "Post one or more manifest approvals for a TVC manifest.", + "operationId": "PublicApiService_CreateTvcManifestApprovals", "responses": { "200": { "description": "A successful response.", @@ -3037,18 +3113,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1RejectActivityRequest" + "$ref": "#/definitions/v1CreateTvcManifestApprovalsRequest" } } ], - "tags": ["Consensus"] + "tags": ["TVC"] } }, - "/public/v1/submit/remove_organization_feature": { + "/public/v1/submit/create_tvc_operator": { "post": { - "summary": "Remove organization feature", - "description": "Remove an organization feature. This activity must be approved by the current root quorum.", - "operationId": "PublicApiService_RemoveOrganizationFeature", + "summary": "Create TVC operator", + "description": "Create a TVC operator backed by uncompressed P-256 Turnkey wallet accounts.", + "operationId": "PublicApiService_CreateTvcOperator", "responses": { "200": { "description": "A successful response.", @@ -3069,18 +3145,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1RemoveOrganizationFeatureRequest" + "$ref": "#/definitions/v1CreateTvcOperatorRequest" } } ], - "tags": ["Features"] + "tags": ["TVC"] } }, - "/public/v1/submit/set_organization_feature": { + "/public/v1/submit/create_tvc_quorum_key": { "post": { - "summary": "Set organization feature", - "description": "Set an organization feature. This activity must be approved by the current root quorum.", - "operationId": "PublicApiService_SetOrganizationFeature", + "summary": "Create TVC Quorum Key", + "description": "Create a hosted TVC Quorum Key and encrypted shares.", + "operationId": "PublicApiService_CreateTvcQuorumKey", "responses": { "200": { "description": "A successful response.", @@ -3101,18 +3177,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1SetOrganizationFeatureRequest" + "$ref": "#/definitions/v1CreateTvcQuorumKeyRequest" } } ], - "tags": ["Features"] + "tags": ["TVC"] } }, - "/public/v1/submit/sign_raw_payload": { + "/public/v1/submit/create_user_tag": { "post": { - "summary": "Sign raw payload", - "description": "Sign a raw payload.", - "operationId": "PublicApiService_SignRawPayload", + "summary": "Create user tag", + "description": "Create a user tag and add it to users.", + "operationId": "PublicApiService_CreateUserTag", "responses": { "200": { "description": "A successful response.", @@ -3133,18 +3209,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1SignRawPayloadRequest" + "$ref": "#/definitions/v1CreateUserTagRequest" } } ], - "tags": ["Signing"] + "tags": ["User Tags"] } }, - "/public/v1/submit/sign_raw_payloads": { + "/public/v1/submit/create_users": { "post": { - "summary": "Sign raw payloads", - "description": "Sign multiple raw payloads with the same signing parameters.", - "operationId": "PublicApiService_SignRawPayloads", + "summary": "Create users", + "description": "Create users in an existing organization. Each user must have at least one valid credential: an API key, an authenticator, an OAuth provider, or an email or phone number with a login method enabled on the organization (email, email OTP, or SMS).", + "operationId": "PublicApiService_CreateUsers", "responses": { "200": { "description": "A successful response.", @@ -3165,18 +3241,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1SignRawPayloadsRequest" + "$ref": "#/definitions/v1CreateUsersRequest" } } ], - "tags": ["Signing"] + "tags": ["Users"] } }, - "/public/v1/submit/sign_transaction": { + "/public/v1/submit/create_wallet": { "post": { - "summary": "Sign transaction", - "description": "Sign a transaction.", - "operationId": "PublicApiService_SignTransaction", + "summary": "Create wallet", + "description": "Create a wallet and derive addresses.", + "operationId": "PublicApiService_CreateWallet", "responses": { "200": { "description": "A successful response.", @@ -3197,18 +3273,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1SignTransactionRequest" + "$ref": "#/definitions/v1CreateWalletRequest" } } ], - "tags": ["Signing"] + "tags": ["Wallets"] } }, - "/public/v1/submit/sol_send_transaction": { + "/public/v1/submit/create_wallet_accounts": { "post": { - "summary": "Broadcast SVM transaction", - "description": "Submit a transaction intent describing an SVM transaction you would like to broadcast.", - "operationId": "PublicApiService_SolSendTransaction", + "summary": "Create wallet accounts", + "description": "Derive additional addresses using an existing wallet.", + "operationId": "PublicApiService_CreateWalletAccounts", "responses": { "200": { "description": "A successful response.", @@ -3229,18 +3305,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1SolSendTransactionRequest" + "$ref": "#/definitions/v1CreateWalletAccountsRequest" } } ], - "tags": ["Broadcasting"] + "tags": ["Wallets"] } }, - "/public/v1/submit/stamp_login": { + "/public/v1/submit/create_webhook_endpoint": { "post": { - "summary": "Login with a stamp", - "description": "Create a session for a user through stamping client side (API key, wallet client, or passkey client).", - "operationId": "PublicApiService_StampLogin", + "summary": "Create webhook endpoint", + "description": "Create a webhook endpoint for an organization.", + "operationId": "PublicApiService_CreateWebhookEndpoint", "responses": { "200": { "description": "A successful response.", @@ -3261,18 +3337,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1StampLoginRequest" + "$ref": "#/definitions/v1CreateWebhookEndpointRequest" } } ], - "tags": ["Sessions"] + "tags": ["Webhooks"] } }, - "/public/v1/submit/update_fiat_on_ramp_credential": { + "/public/v1/submit/delete_api_keys": { "post": { - "summary": "Update a Fiat On Ramp Credential", - "description": "Update a fiat on ramp provider credential", - "operationId": "PublicApiService_UpdateFiatOnRampCredential", + "summary": "Delete API keys", + "description": "Remove API keys from a user.", + "operationId": "PublicApiService_DeleteApiKeys", "responses": { "200": { "description": "A successful response.", @@ -3293,18 +3369,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateFiatOnRampCredentialRequest" + "$ref": "#/definitions/v1DeleteApiKeysRequest" } } ], - "tags": ["On Ramp"] + "tags": ["API keys"] } }, - "/public/v1/submit/update_oauth2_credential": { + "/public/v1/submit/delete_authenticators": { "post": { - "summary": "Update an OAuth 2.0 Credential", - "description": "Update an OAuth 2.0 provider credential", - "operationId": "PublicApiService_UpdateOauth2Credential", + "summary": "Delete authenticators", + "description": "Remove authenticators from a user.", + "operationId": "PublicApiService_DeleteAuthenticators", "responses": { "200": { "description": "A successful response.", @@ -3325,18 +3401,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateOauth2CredentialRequest" + "$ref": "#/definitions/v1DeleteAuthenticatorsRequest" } } ], - "tags": ["User Auth"] + "tags": ["Authenticators"] } }, - "/public/v1/submit/update_organization_name": { + "/public/v1/submit/delete_fiat_on_ramp_credential": { "post": { - "summary": "Update organization name", - "description": "Update the name of an organization.", - "operationId": "PublicApiService_UpdateOrganizationName", + "summary": "Delete a Fiat On Ramp credential", + "description": "Delete a fiat on ramp provider credential.", + "operationId": "PublicApiService_DeleteFiatOnRampCredential", "responses": { "200": { "description": "A successful response.", @@ -3357,18 +3433,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateOrganizationNameRequest" + "$ref": "#/definitions/v1DeleteFiatOnRampCredentialRequest" } } ], - "tags": ["Organizations"] + "tags": ["On Ramp"] } }, - "/public/v1/submit/update_policy": { + "/public/v1/submit/delete_invitation": { "post": { - "summary": "Update policy", - "description": "Update an existing policy.", - "operationId": "PublicApiService_UpdatePolicy", + "summary": "Delete invitation", + "description": "Delete an existing invitation.", + "operationId": "PublicApiService_DeleteInvitation", "responses": { "200": { "description": "A successful response.", @@ -3389,18 +3465,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdatePolicyRequest" + "$ref": "#/definitions/v1DeleteInvitationRequest" } } ], - "tags": ["Policies"] + "tags": ["Invitations"] } }, - "/public/v1/submit/update_private_key_tag": { + "/public/v1/submit/delete_mfa_policy": { "post": { - "summary": "Update private key tag", - "description": "Update human-readable name or associated private keys. Note that this activity is atomic: all of the updates will succeed at once, or all of them will fail.", - "operationId": "PublicApiService_UpdatePrivateKeyTag", + "summary": "Delete MFA policy", + "description": "Delete an MFA policy for a user.", + "operationId": "PublicApiService_DeleteMfaPolicy", "responses": { "200": { "description": "A successful response.", @@ -3421,18 +3497,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdatePrivateKeyTagRequest" + "$ref": "#/definitions/v1DeleteMfaPolicyRequest" } } ], - "tags": ["Private Key Tags"] + "tags": ["MFA Policies"] } }, - "/public/v1/submit/update_root_quorum": { + "/public/v1/submit/delete_oauth2_credential": { "post": { - "summary": "Update root quorum", - "description": "Set the threshold and members of the root quorum. This activity must be approved by the current root quorum.", - "operationId": "PublicApiService_UpdateRootQuorum", + "summary": "Delete an OAuth 2.0 credential", + "description": "Disable authentication for end users with an OAuth 2.0 provider.", + "operationId": "PublicApiService_DeleteOauth2Credential", "responses": { "200": { "description": "A successful response.", @@ -3453,18 +3529,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateRootQuorumRequest" + "$ref": "#/definitions/v1DeleteOauth2CredentialRequest" } } ], - "tags": ["Organizations"] + "tags": ["User Auth"] } }, - "/public/v1/submit/update_user": { + "/public/v1/submit/delete_oauth_providers": { "post": { - "summary": "Update user", - "description": "Update a user in an existing organization.", - "operationId": "PublicApiService_UpdateUser", + "summary": "Delete OAuth providers", + "description": "Remove Oauth providers for a specified user.", + "operationId": "PublicApiService_DeleteOauthProviders", "responses": { "200": { "description": "A successful response.", @@ -3485,18 +3561,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateUserRequest" + "$ref": "#/definitions/v1DeleteOauthProvidersRequest" } } ], - "tags": ["Users"] + "tags": ["User Auth"] } }, - "/public/v1/submit/update_user_email": { + "/public/v1/submit/delete_policies": { "post": { - "summary": "Update user's email", - "description": "Update a user's email in an existing organization.", - "operationId": "PublicApiService_UpdateUserEmail", + "summary": "Delete policies", + "description": "Delete existing policies.", + "operationId": "PublicApiService_DeletePolicies", "responses": { "200": { "description": "A successful response.", @@ -3517,18 +3593,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateUserEmailRequest" + "$ref": "#/definitions/v1DeletePoliciesRequest" } } ], - "tags": ["Users"] + "tags": ["Policies"] } }, - "/public/v1/submit/update_user_name": { + "/public/v1/submit/delete_policy": { "post": { - "summary": "Update user's name", - "description": "Update a user's name in an existing organization.", - "operationId": "PublicApiService_UpdateUserName", + "summary": "Delete policy", + "description": "Delete an existing policy.", + "operationId": "PublicApiService_DeletePolicy", "responses": { "200": { "description": "A successful response.", @@ -3549,18 +3625,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateUserNameRequest" + "$ref": "#/definitions/v1DeletePolicyRequest" } } ], - "tags": ["Users"] + "tags": ["Policies"] } }, - "/public/v1/submit/update_user_phone_number": { + "/public/v1/submit/delete_private_key_tags": { "post": { - "summary": "Update user's phone number", - "description": "Update a user's phone number in an existing organization.", - "operationId": "PublicApiService_UpdateUserPhoneNumber", + "summary": "Delete private key tags", + "description": "Delete private key tags within an organization.", + "operationId": "PublicApiService_DeletePrivateKeyTags", "responses": { "200": { "description": "A successful response.", @@ -3581,18 +3657,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateUserPhoneNumberRequest" + "$ref": "#/definitions/v1DeletePrivateKeyTagsRequest" } } ], - "tags": ["Users"] + "tags": ["Private Key Tags"] } }, - "/public/v1/submit/update_user_tag": { + "/public/v1/submit/delete_private_keys": { "post": { - "summary": "Update user tag", - "description": "Update human-readable name or associated users. Note that this activity is atomic: all of the updates will succeed at once, or all of them will fail.", - "operationId": "PublicApiService_UpdateUserTag", + "summary": "Delete private keys", + "description": "Delete private keys for an organization.", + "operationId": "PublicApiService_DeletePrivateKeys", "responses": { "200": { "description": "A successful response.", @@ -3613,18 +3689,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateUserTagRequest" + "$ref": "#/definitions/v1DeletePrivateKeysRequest" } } ], - "tags": ["User Tags"] + "tags": ["Private Keys"] } }, - "/public/v1/submit/update_wallet": { + "/public/v1/submit/delete_secrets": { "post": { - "summary": "Update wallet", - "description": "Update a wallet for an organization.", - "operationId": "PublicApiService_UpdateWallet", + "summary": "Delete secrets", + "description": "Delete secrets by their unique identifiers. All secrets must belong to the organization.", + "operationId": "PublicApiService_DeleteSecrets", "responses": { "200": { "description": "A successful response.", @@ -3645,18 +3721,18 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1UpdateWalletRequest" + "$ref": "#/definitions/v1DeleteSecretsRequest" } } ], - "tags": ["Wallets"] + "tags": ["Secrets"] } }, - "/public/v1/submit/verify_otp": { + "/public/v1/submit/delete_smart_contract_interface": { "post": { - "summary": "Verify generic OTP", - "description": "Verify a generic OTP.", - "operationId": "PublicApiService_VerifyOtp", + "summary": "Delete smart contract interface", + "description": "Delete a smart contract interface.", + "operationId": "PublicApiService_DeleteSmartContractInterface", "responses": { "200": { "description": "A successful response.", @@ -3677,21 +3753,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1VerifyOtpRequest" + "$ref": "#/definitions/v1DeleteSmartContractInterfaceRequest" } } ], - "tags": ["User Verification"] + "tags": ["Policies"] } }, - "/tkhq/api/v1/noop-codegen-anchor": { + "/public/v1/submit/delete_sub_organization": { "post": { - "operationId": "PublicApiService_NOOPCodegenAnchor", + "summary": "Delete sub-organization", + "description": "Delete a sub-organization.", + "operationId": "PublicApiService_DeleteSubOrganization", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1NOOPCodegenAnchorResponse" + "$ref": "#/definitions/v1ActivityResponse" } }, "default": { @@ -3701,816 +3779,8922 @@ } } }, - "tags": ["PublicApiService"] + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DeleteSubOrganizationRequest" + } + } + ], + "tags": ["Organizations"] } - } - }, - "definitions": { - "apiApiKeyParams": { - "type": "object", - "properties": { - "apiKeyName": { - "type": "string", - "description": "Human-readable name for an API Key." + }, + "/public/v1/submit/delete_tvc_app_and_deployments": { + "post": { + "summary": "Delete a TVC app and all of its deployments", + "description": "Delete a TVC app and all of its deployments.", + "operationId": "PublicApiService_DeleteTvcAppAndDeployments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } }, - "publicKey": { - "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DeleteTvcAppAndDeploymentsRequest" + } + } + ], + "tags": ["TVC"] + } + }, + "/public/v1/submit/delete_tvc_deployment": { + "post": { + "summary": "Delete a TVC deployment", + "description": "Delete a TVC deployment.", + "operationId": "PublicApiService_DeleteTvcDeployment", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } }, - "expirationSeconds": { - "type": "string", - "description": "Optional window (in seconds) indicating how long the API Key should last." - } - }, - "required": ["apiKeyName", "publicKey"] + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DeleteTvcDeploymentRequest" + } + } + ], + "tags": ["TVC"] + } }, - "billingActivateBillingTierIntent": { - "type": "object", - "properties": { - "productId": { - "type": "string", - "description": "The product that the customer wants to subscribe to." - } - }, - "required": ["productId"] + "/public/v1/submit/delete_user_tags": { + "post": { + "summary": "Delete user tags", + "description": "Delete user tags within an organization.", + "operationId": "PublicApiService_DeleteUserTags", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DeleteUserTagsRequest" + } + } + ], + "tags": ["User Tags"] + } }, - "billingActivateBillingTierResult": { - "type": "object", - "properties": { - "productId": { - "type": "string", - "description": "The id of the product being subscribed to." - } - }, - "required": ["productId"] + "/public/v1/submit/delete_users": { + "post": { + "summary": "Delete users", + "description": "Delete users within an organization.", + "operationId": "PublicApiService_DeleteUsers", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DeleteUsersRequest" + } + } + ], + "tags": ["Users"] + } }, - "billingDeletePaymentMethodIntent": { - "type": "object", - "properties": { - "paymentMethodId": { + "/public/v1/submit/delete_wallet_accounts": { + "post": { + "summary": "Delete wallet accounts", + "description": "Delete wallet accounts for an organization.", + "operationId": "PublicApiService_DeleteWalletAccounts", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DeleteWalletAccountsRequest" + } + } + ], + "tags": ["Wallets"] + } + }, + "/public/v1/submit/delete_wallets": { + "post": { + "summary": "Delete wallets", + "description": "Delete wallets for an organization.", + "operationId": "PublicApiService_DeleteWallets", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DeleteWalletsRequest" + } + } + ], + "tags": ["Wallets"] + } + }, + "/public/v1/submit/delete_webhook_endpoint": { + "post": { + "summary": "Delete webhook endpoint", + "description": "Delete a webhook endpoint for an organization.", + "operationId": "PublicApiService_DeleteWebhookEndpoint", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DeleteWebhookEndpointRequest" + } + } + ], + "tags": ["Webhooks"] + } + }, + "/public/v1/submit/earn_claim_rewards": { + "post": { + "summary": "Claim Earn rewards", + "description": "Claim the Merkl protocol rewards attributed to a wallet's Earn positions. The claim is signed by the wallet itself and every reward token is transferred to it; see ListEarnRewards for what is claimable.", + "operationId": "PublicApiService_EarnClaimRewards", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1EarnClaimRewardsRequest" + } + } + ], + "tags": ["Earn"] + } + }, + "/public/v1/submit/earn_deploy_wrapper": { + "post": { + "summary": "Deploy Earn wrapper", + "description": "Enable a yield vault for an organization by deploying its fee wrapper. Must be called before any deposits into the vault.", + "operationId": "PublicApiService_EarnDeployWrapper", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1EarnDeployWrapperRequest" + } + } + ], + "tags": ["Earn"] + } + }, + "/public/v1/submit/earn_deposit": { + "post": { + "summary": "Deposit into Earn vault", + "description": "Deposit assets from a wallet into an enabled yield vault.", + "operationId": "PublicApiService_EarnDeposit", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1EarnDepositRequest" + } + } + ], + "tags": ["Earn"] + } + }, + "/public/v1/submit/earn_set_wrapper_state": { + "post": { + "summary": "Set Earn wrapper state", + "description": "Enable or disable deposits to a deployed Earn wrapper. Withdrawals are always allowed.", + "operationId": "PublicApiService_EarnSetWrapperState", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1EarnSetWrapperStateRequest" + } + } + ], + "tags": ["Earn"] + } + }, + "/public/v1/submit/earn_withdraw": { + "post": { + "summary": "Withdraw from Earn vault", + "description": "Withdraw assets or redeem shares from an enabled yield vault.", + "operationId": "PublicApiService_EarnWithdraw", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1EarnWithdrawRequest" + } + } + ], + "tags": ["Earn"] + } + }, + "/public/v1/submit/email_auth": { + "post": { + "summary": "Perform email auth", + "description": "Authenticate a user via email.", + "operationId": "PublicApiService_EmailAuth", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1EmailAuthRequest" + } + } + ], + "tags": ["User Auth"] + } + }, + "/public/v1/submit/eth_send_transaction": { + "post": { + "summary": "Broadcast EVM transaction", + "description": "Submit a transaction intent describing an EVM transaction you would like to broadcast.", + "operationId": "PublicApiService_EthSendTransaction", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1EthSendTransactionRequest" + } + } + ], + "tags": ["Broadcasting"] + } + }, + "/public/v1/submit/eth_undelegate_7702": { + "post": { + "summary": "Undelegate an EVM account", + "description": "Submit an EIP-7702 undelegation transaction.", + "operationId": "PublicApiService_EthUndelegate7702", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1EthUndelegate7702Request" + } + } + ], + "tags": ["Broadcasting"] + } + }, + "/public/v1/submit/execute_swap": { + "post": { + "summary": "Execute Swap", + "description": "Execute the exact provider quote identified by quote_id through the activity pipeline and Turnkey broadcasting. Requests must use ACTIVITY_TYPE_EXECUTE_SWAP_V3.", + "operationId": "PublicApiService_ExecuteSwap", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ExecuteSwapRequest" + } + } + ], + "tags": ["Swaps"] + } + }, + "/public/v1/submit/export_private_key": { + "post": { + "summary": "Export private key", + "description": "Export a private key.", + "operationId": "PublicApiService_ExportPrivateKey", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ExportPrivateKeyRequest" + } + } + ], + "tags": ["Private Keys"] + } + }, + "/public/v1/submit/export_secrets": { + "post": { + "summary": "Export secrets", + "description": "Export secrets encrypted to client-provided target public keys.", + "operationId": "PublicApiService_ExportSecrets", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ExportSecretsRequest" + } + } + ], + "tags": ["Secrets"] + } + }, + "/public/v1/submit/export_wallet": { + "post": { + "summary": "Export wallet", + "description": "Export a wallet.", + "operationId": "PublicApiService_ExportWallet", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ExportWalletRequest" + } + } + ], + "tags": ["Wallets"] + } + }, + "/public/v1/submit/export_wallet_account": { + "post": { + "summary": "Export wallet account", + "description": "Export a wallet account.", + "operationId": "PublicApiService_ExportWalletAccount", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ExportWalletAccountRequest" + } + } + ], + "tags": ["Wallets"] + } + }, + "/public/v1/submit/import_private_key": { + "post": { + "summary": "Import private key", + "description": "Import a private key.", + "operationId": "PublicApiService_ImportPrivateKey", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ImportPrivateKeyRequest" + } + } + ], + "tags": ["Private Keys"] + } + }, + "/public/v1/submit/import_secrets": { + "post": { + "summary": "Import secrets", + "description": "Import secrets encrypted to target keys returned from InitImportSecrets.", + "operationId": "PublicApiService_ImportSecrets", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ImportSecretsRequest" + } + } + ], + "tags": ["Secrets"] + } + }, + "/public/v1/submit/import_wallet": { + "post": { + "summary": "Import wallet", + "description": "Import a wallet.", + "operationId": "PublicApiService_ImportWallet", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ImportWalletRequest" + } + } + ], + "tags": ["Wallets"] + } + }, + "/public/v1/submit/init_fiat_on_ramp": { + "post": { + "summary": "Init Fiat On Ramp", + "description": "Initiate a fiat on ramp flow.", + "operationId": "PublicApiService_InitFiatOnRamp", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1InitFiatOnRampRequest" + } + } + ], + "tags": ["On Ramp"] + } + }, + "/public/v1/submit/init_import_private_key": { + "post": { + "summary": "Init import private key", + "description": "Initialize a new private key import.", + "operationId": "PublicApiService_InitImportPrivateKey", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1InitImportPrivateKeyRequest" + } + } + ], + "tags": ["Private Keys"] + } + }, + "/public/v1/submit/init_import_secrets": { + "post": { + "summary": "Init import secrets", + "description": "Initialize secret imports by generating Ingress Encryption Target Keys.", + "operationId": "PublicApiService_InitImportSecrets", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1InitImportSecretsRequest" + } + } + ], + "tags": ["Secrets"] + } + }, + "/public/v1/submit/init_import_wallet": { + "post": { + "summary": "Init import wallet", + "description": "Initialize a new wallet import.", + "operationId": "PublicApiService_InitImportWallet", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1InitImportWalletRequest" + } + } + ], + "tags": ["Wallets"] + } + }, + "/public/v1/submit/init_otp": { + "post": { + "summary": "Init generic OTP", + "description": "Initiate a generic OTP activity.", + "operationId": "PublicApiService_InitOtp", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1InitOtpRequest" + } + } + ], + "tags": ["User Verification"] + } + }, + "/public/v1/submit/init_otp_auth": { + "post": { + "summary": "Init OTP auth", + "description": "Initiate an OTP auth activity.", + "operationId": "PublicApiService_InitOtpAuth", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1InitOtpAuthRequest" + } + } + ], + "tags": ["User Auth"] + } + }, + "/public/v1/submit/init_user_email_recovery": { + "post": { + "summary": "Init email recovery", + "description": "Initialize a new email recovery.", + "operationId": "PublicApiService_InitUserEmailRecovery", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1InitUserEmailRecoveryRequest" + } + } + ], + "tags": ["User Recovery"] + } + }, + "/public/v1/submit/oauth": { + "post": { + "summary": "OAuth", + "description": "Authenticate a user with an OIDC token (Oauth).", + "operationId": "PublicApiService_Oauth", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OauthRequest" + } + } + ], + "tags": ["User Auth"] + } + }, + "/public/v1/submit/oauth2_authenticate": { + "post": { + "summary": "OAuth 2.0 authentication", + "description": "Authenticate a user with an OAuth 2.0 provider and receive an OIDC token to use with the LoginWithOAuth or CreateSubOrganization activities.", + "operationId": "PublicApiService_Oauth2Authenticate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1Oauth2AuthenticateRequest" + } + } + ], + "tags": ["User Auth"] + } + }, + "/public/v1/submit/oauth_login": { + "post": { + "summary": "Login with OAuth", + "description": "Create an Oauth session for a user.", + "operationId": "PublicApiService_OauthLogin", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OauthLoginRequest" + } + } + ], + "tags": ["Sessions"] + } + }, + "/public/v1/submit/otp_auth": { + "post": { + "summary": "OTP auth", + "description": "Authenticate a user with an OTP code sent via email or SMS.", + "operationId": "PublicApiService_OtpAuth", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OtpAuthRequest" + } + } + ], + "tags": ["User Auth"] + } + }, + "/public/v1/submit/otp_login": { + "post": { + "summary": "Login with OTP", + "description": "Create an OTP session for a user.", + "operationId": "PublicApiService_OtpLogin", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OtpLoginRequest" + } + } + ], + "tags": ["Sessions"] + } + }, + "/public/v1/submit/post_tvc_quorum_key_share": { + "post": { + "summary": "Post TVC Quorum Key share", + "description": "Post re-encrypted Quorum Key share for a TVC deployment.", + "operationId": "PublicApiService_PostTvcQuorumKeyShare", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1PostTvcQuorumKeyShareRequest" + } + } + ], + "tags": ["TVC"] + } + }, + "/public/v1/submit/re_encrypt_tvc_quorum_key_share": { + "post": { + "summary": "Re-encrypt TVC Quorum Key share", + "description": "Re-encrypt a hosted TVC Quorum Key share for a deployment.", + "operationId": "PublicApiService_ReEncryptTvcQuorumKeyShare", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ReEncryptTvcQuorumKeyShareRequest" + } + } + ], + "tags": ["TVC"] + } + }, + "/public/v1/submit/recover_user": { + "post": { + "summary": "Recover a user", + "description": "Complete the process of recovering a user by adding an authenticator.", + "operationId": "PublicApiService_RecoverUser", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1RecoverUserRequest" + } + } + ], + "tags": ["User Recovery"] + } + }, + "/public/v1/submit/reject_activity": { + "post": { + "summary": "Reject activity", + "description": "Reject an activity.", + "operationId": "PublicApiService_RejectActivity", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1RejectActivityRequest" + } + } + ], + "tags": ["Consensus"] + } + }, + "/public/v1/submit/remove_ip_allowlist": { + "post": { + "summary": "Remove IP Allowlist", + "description": "Delete IP allowlist and all associated rules for organization or API key. After removal, access will be determined by organization-level allowlist (for API keys) or allowed from all IPs (for organizations).", + "operationId": "PublicApiService_RemoveIpAllowlist", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1RemoveIpAllowlistRequest" + } + } + ], + "tags": ["IP Allowlist"] + } + }, + "/public/v1/submit/remove_organization_feature": { + "post": { + "summary": "Remove organization feature", + "description": "Remove an organization feature. This activity must be approved by the current root quorum.", + "operationId": "PublicApiService_RemoveOrganizationFeature", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1RemoveOrganizationFeatureRequest" + } + } + ], + "tags": ["Features"] + } + }, + "/public/v1/submit/restore_tvc_deployment": { + "post": { + "summary": "Restore a TVC deployment", + "description": "Restore a deleted TVC deployment.", + "operationId": "PublicApiService_RestoreTvcDeployment", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1RestoreTvcDeploymentRequest" + } + } + ], + "tags": ["TVC"] + } + }, + "/public/v1/submit/set_ip_allowlist": { + "post": { + "summary": "Set IP Allowlist", + "description": "Create or update IP allowlist and rules for organization or API key. The IP allowlist restricts API access to specific CIDR blocks. Organization-level allowlists apply to all API keys unless overridden by a key-specific allowlist.", + "operationId": "PublicApiService_SetIpAllowlist", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SetIpAllowlistRequest" + } + } + ], + "tags": ["IP Allowlist"] + } + }, + "/public/v1/submit/set_organization_feature": { + "post": { + "summary": "Set organization feature", + "description": "Set an organization feature. This activity must be approved by the current root quorum.", + "operationId": "PublicApiService_SetOrganizationFeature", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SetOrganizationFeatureRequest" + } + } + ], + "tags": ["Features"] + } + }, + "/public/v1/submit/set_tvc_app_live_deployment": { + "post": { + "summary": "Set TVC app live deployment", + "description": "Set the live deployment for a TVC app.", + "operationId": "PublicApiService_UpdateTvcAppLiveDeployment", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateTvcAppLiveDeploymentRequest" + } + } + ], + "tags": ["TVC"] + } + }, + "/public/v1/submit/sign_raw_payload": { + "post": { + "summary": "Sign raw payload", + "description": "Sign a raw payload.", + "operationId": "PublicApiService_SignRawPayload", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SignRawPayloadRequest" + } + } + ], + "tags": ["Signing"] + } + }, + "/public/v1/submit/sign_raw_payloads": { + "post": { + "summary": "Sign raw payloads", + "description": "Sign multiple raw payloads with the same signing parameters.", + "operationId": "PublicApiService_SignRawPayloads", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SignRawPayloadsRequest" + } + } + ], + "tags": ["Signing"] + } + }, + "/public/v1/submit/sign_transaction": { + "post": { + "summary": "Sign transaction", + "description": "Sign a transaction.", + "operationId": "PublicApiService_SignTransaction", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SignTransactionRequest" + } + } + ], + "tags": ["Signing"] + } + }, + "/public/v1/submit/sol_send_transaction": { + "post": { + "summary": "Broadcast SVM transaction", + "description": "Submit a transaction intent describing an SVM transaction you would like to broadcast. Supports single- and multi-signer intents via activity type versioning.", + "operationId": "PublicApiService_SolSendTransaction", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SolSendTransactionRequest" + } + } + ], + "tags": ["Broadcasting"] + } + }, + "/public/v1/submit/spark_claim_transfer": { + "post": { + "summary": "Claim Spark transfer", + "description": "Construct receiver-side encrypted operator packages to claim a Spark transfer. Does not perform FROST signing.", + "operationId": "PublicApiService_SparkClaimTransfer", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SparkClaimTransferRequest" + } + } + ], + "tags": ["Spark"] + } + }, + "/public/v1/submit/spark_prepare_lightning_receive": { + "post": { + "summary": "Spark prepare Lightning receive", + "description": "Generate a Lightning preimage and distribute Feldman shares to operators for a Spark Lightning receive. Does not perform FROST signing.", + "operationId": "PublicApiService_SparkPrepareLightningReceive", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SparkPrepareLightningReceiveRequest" + } + } + ], + "tags": ["Spark"] + } + }, + "/public/v1/submit/spark_prepare_transfer": { + "post": { + "summary": "Prepare Spark transfer", + "description": "Construct sender-side encrypted operator packages for a Spark BTC transfer. Does not perform FROST signing.", + "operationId": "PublicApiService_SparkPrepareTransfer", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SparkPrepareTransferRequest" + } + } + ], + "tags": ["Spark"] + } + }, + "/public/v1/submit/spark_sign_frost": { + "post": { + "summary": "Sign Frost Spark", + "description": "Perform pure FROST partial signing for a Spark wallet. Produces partial signatures without constructing operator packages.", + "operationId": "PublicApiService_SparkSignFrost", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1SparkSignFrostRequest" + } + } + ], + "tags": ["Signing"] + } + }, + "/public/v1/submit/stamp_login": { + "post": { + "summary": "Login with a stamp", + "description": "Create a session for a user through stamping client side (API key, wallet client, or passkey client).", + "operationId": "PublicApiService_StampLogin", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1StampLoginRequest" + } + } + ], + "tags": ["Sessions"] + } + }, + "/public/v1/submit/update_fiat_on_ramp_credential": { + "post": { + "summary": "Update a Fiat On Ramp credential", + "description": "Update a fiat on ramp provider credential.", + "operationId": "PublicApiService_UpdateFiatOnRampCredential", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateFiatOnRampCredentialRequest" + } + } + ], + "tags": ["On Ramp"] + } + }, + "/public/v1/submit/update_mfa_policy": { + "post": { + "summary": "Update MFA policy", + "description": "Update an MFA policy for a user.", + "operationId": "PublicApiService_UpdateMfaPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateMfaPolicyRequest" + } + } + ], + "tags": ["MFA Policies"] + } + }, + "/public/v1/submit/update_oauth2_credential": { + "post": { + "summary": "Update an OAuth 2.0 credential", + "description": "Update an OAuth 2.0 provider credential.", + "operationId": "PublicApiService_UpdateOauth2Credential", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateOauth2CredentialRequest" + } + } + ], + "tags": ["User Auth"] + } + }, + "/public/v1/submit/update_organization_name": { + "post": { + "summary": "Update organization name", + "description": "Update the name of an organization.", + "operationId": "PublicApiService_UpdateOrganizationName", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateOrganizationNameRequest" + } + } + ], + "tags": ["Organizations"] + } + }, + "/public/v1/submit/update_policy": { + "post": { + "summary": "Update policy", + "description": "Update an existing policy.", + "operationId": "PublicApiService_UpdatePolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdatePolicyRequest" + } + } + ], + "tags": ["Policies"] + } + }, + "/public/v1/submit/update_private_key_tag": { + "post": { + "summary": "Update private key tag", + "description": "Update human-readable name or associated private keys. Note that this activity is atomic: all of the updates will succeed at once, or all of them will fail.", + "operationId": "PublicApiService_UpdatePrivateKeyTag", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdatePrivateKeyTagRequest" + } + } + ], + "tags": ["Private Key Tags"] + } + }, + "/public/v1/submit/update_root_quorum": { + "post": { + "summary": "Update root quorum", + "description": "Set the threshold and members of the root quorum. This activity must be approved by the current root quorum.", + "operationId": "PublicApiService_UpdateRootQuorum", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateRootQuorumRequest" + } + } + ], + "tags": ["Organizations"] + } + }, + "/public/v1/submit/update_user": { + "post": { + "summary": "Update user", + "description": "Update a user in an existing organization.", + "operationId": "PublicApiService_UpdateUser", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateUserRequest" + } + } + ], + "tags": ["Users"] + } + }, + "/public/v1/submit/update_user_email": { + "post": { + "summary": "Update user's email", + "description": "Update a user's email in an existing organization.", + "operationId": "PublicApiService_UpdateUserEmail", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateUserEmailRequest" + } + } + ], + "tags": ["Users"] + } + }, + "/public/v1/submit/update_user_name": { + "post": { + "summary": "Update user's name", + "description": "Update a user's name in an existing organization.", + "operationId": "PublicApiService_UpdateUserName", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateUserNameRequest" + } + } + ], + "tags": ["Users"] + } + }, + "/public/v1/submit/update_user_phone_number": { + "post": { + "summary": "Update user's phone number", + "description": "Update a user's phone number in an existing organization.", + "operationId": "PublicApiService_UpdateUserPhoneNumber", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateUserPhoneNumberRequest" + } + } + ], + "tags": ["Users"] + } + }, + "/public/v1/submit/update_user_tag": { + "post": { + "summary": "Update user tag", + "description": "Update human-readable name or associated users. Note that this activity is atomic: all of the updates will succeed at once, or all of them will fail.", + "operationId": "PublicApiService_UpdateUserTag", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateUserTagRequest" + } + } + ], + "tags": ["User Tags"] + } + }, + "/public/v1/submit/update_wallet": { + "post": { + "summary": "Update wallet", + "description": "Update a wallet for an organization.", + "operationId": "PublicApiService_UpdateWallet", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateWalletRequest" + } + } + ], + "tags": ["Wallets"] + } + }, + "/public/v1/submit/update_webhook_endpoint": { + "post": { + "summary": "Update webhook endpoint", + "description": "Update a webhook endpoint for an organization.", + "operationId": "PublicApiService_UpdateWebhookEndpoint", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateWebhookEndpointRequest" + } + } + ], + "tags": ["Webhooks"] + } + }, + "/public/v1/submit/upsert_swap_config": { + "post": { + "summary": "Upsert Swap config", + "description": "Enable or disable swap configuration for an organization.", + "operationId": "PublicApiService_UpsertSwapConfig", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpsertSwapConfigRequest" + } + } + ], + "tags": ["Swaps"] + } + }, + "/public/v1/submit/upsert_swap_fee_sponsorship_limit_config": { + "post": { + "summary": "Upsert swap fee sponsorship limits", + "description": "Replace this feature's spending window. Requires the billing parent's signed permission and activity authorization.", + "operationId": "PublicApiService_UpsertSwapFeeSponsorshipLimitConfig", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpsertSwapFeeSponsorshipLimitConfigRequest" + } + } + ], + "tags": ["Swaps"] + } + }, + "/public/v1/submit/upsert_swap_fixed_rate_limit_config": { + "post": { + "summary": "Upsert swap fixed rate limits", + "description": "Replace this feature's spending window. Requires the billing parent's signed permission and activity authorization.", + "operationId": "PublicApiService_UpsertSwapFixedRateLimitConfig", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpsertSwapFixedRateLimitConfigRequest" + } + } + ], + "tags": ["Swaps"] + } + }, + "/public/v1/submit/verify_otp": { + "post": { + "summary": "Verify generic OTP", + "description": "Verify a generic OTP.", + "operationId": "PublicApiService_VerifyOtp", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ActivityResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1VerifyOtpRequest" + } + } + ], + "tags": ["User Verification"] + } + }, + "/tkhq/api/v1/noop-codegen-anchor": { + "post": { + "summary": "Internal codegen anchor (no-op)", + "description": "Internal no-op endpoint used to force generation of types not otherwise referenced by a public request or response. Not intended for use.", + "operationId": "PublicApiService_NOOPCodegenAnchor", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1NOOPCodegenAnchorResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "tags": ["Internal"] + } + } + }, + "definitions": { + "apiApiKeyParams": { + "type": "object", + "properties": { + "apiKeyName": { + "type": "string", + "description": "Human-readable name for an API Key." + }, + "publicKey": { + "type": "string", + "description": "The public component of a cryptographic key pair used to sign messages and transactions." + }, + "expirationSeconds": { + "type": "string", + "description": "Optional window (in seconds) indicating how long the API Key should last." + } + }, + "required": ["apiKeyName", "publicKey"] + }, + "billingActivateBillingTierIntent": { + "type": "object", + "properties": { + "productId": { + "type": "string", + "description": "The product that the customer wants to subscribe to." + }, + "orbPlanId": { + "type": "string" + } + }, + "required": ["productId"] + }, + "billingActivateBillingTierResult": { + "type": "object", + "properties": { + "productId": { + "type": "string", + "description": "The id of the product being subscribed to." + } + }, + "required": ["productId"] + }, + "billingDeletePaymentMethodIntent": { + "type": "object", + "properties": { + "paymentMethodId": { + "type": "string", + "description": "The payment method that the customer wants to remove." + } + }, + "required": ["paymentMethodId"] + }, + "billingDeletePaymentMethodResult": { + "type": "object", + "properties": { + "paymentMethodId": { + "type": "string", + "description": "The payment method that was removed." + } + }, + "required": ["paymentMethodId"] + }, + "billingSetPaymentMethodIntent": { + "type": "object", + "properties": { + "number": { + "type": "string", + "description": "The account number of the customer's credit card." + }, + "cvv": { + "type": "string", + "description": "The verification digits of the customer's credit card." + }, + "expiryMonth": { + "type": "string", + "description": "The month that the credit card expires." + }, + "expiryYear": { + "type": "string", + "description": "The year that the credit card expires." + }, + "cardHolderEmail": { + "type": "string", + "description": "The email that will receive invoices for the credit card." + }, + "cardHolderName": { + "type": "string", + "description": "The name associated with the credit card." + } + }, + "required": [ + "number", + "cvv", + "expiryMonth", + "expiryYear", + "cardHolderEmail", + "cardHolderName" + ] + }, + "billingSetPaymentMethodIntentV2": { + "type": "object", + "properties": { + "paymentMethodId": { + "type": "string", + "description": "The id of the payment method that was created clientside." + }, + "cardHolderEmail": { + "type": "string", + "description": "The email that will receive invoices for the credit card." + }, + "cardHolderName": { + "type": "string", + "description": "The name associated with the credit card." + } + }, + "required": ["paymentMethodId", "cardHolderEmail", "cardHolderName"] + }, + "billingSetPaymentMethodResult": { + "type": "object", + "properties": { + "lastFour": { + "type": "string", + "description": "The last four digits of the credit card added." + }, + "cardHolderName": { + "type": "string", + "description": "The name associated with the payment method." + }, + "cardHolderEmail": { + "type": "string", + "description": "The email address associated with the payment method." + } + }, + "required": ["lastFour", "cardHolderName", "cardHolderEmail"] + }, + "billingUpdatePaymentMethodIntent": { + "type": "object", + "properties": { + "paymentEmail": { + "type": "string", + "description": "The email that will receive invoices for the payment method." + } + }, + "required": ["paymentEmail"] + }, + "billingUpdatePaymentMethodResult": { + "type": "object", + "properties": { + "paymentEmail": { + "type": "string", + "description": "The email address associated with the payment method." + } + }, + "required": ["paymentEmail"] + }, + "datav1Tag": { + "type": "object", + "properties": { + "tagId": { + "type": "string", + "description": "Unique identifier for a given Tag." + }, + "tagName": { + "type": "string", + "description": "Human-readable name for a Tag." + }, + "tagType": { + "$ref": "#/definitions/v1TagType" + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + } + }, + "required": ["tagId", "tagName", "tagType", "createdAt", "updatedAt"] + }, + "externalactivityv1PolicyEvaluation": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for a given policy evaluation." + }, + "activityId": { + "type": "string", + "description": "Unique identifier for a given Activity." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for the Organization the Activity belongs to." + }, + "voteId": { + "type": "string", + "description": "Unique identifier for the Vote associated with this policy evaluation." + }, + "policyEvaluations": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/immutablecommonv1PolicyEvaluation" + }, + "description": "Detailed evaluation result for each Policy that was run." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + } + }, + "required": [ + "id", + "activityId", + "organizationId", + "voteId", + "policyEvaluations", + "createdAt" + ] + }, + "externaldatav1Address": { + "type": "object", + "properties": { + "format": { + "$ref": "#/definitions/v1AddressFormat" + }, + "address": { + "type": "string" + } + } + }, + "externaldatav1Credential": { + "type": "object", + "properties": { + "publicKey": { + "type": "string", + "description": "The public component of a cryptographic key pair used to sign messages and transactions." + }, + "type": { + "$ref": "#/definitions/v1CredentialType" + }, + "sessionProfileId": { + "type": "string", + "description": "The session profile associated with this credential, if any. This field is only applicable for credentials of type CREDENTIAL_TYPE_LOGIN." + } + }, + "required": ["publicKey", "type"] + }, + "externaldatav1Quorum": { + "type": "object", + "properties": { + "threshold": { + "type": "integer", + "format": "int32", + "description": "Count of unique approvals required to meet quorum." + }, + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Unique identifiers of quorum set members." + } + }, + "required": ["threshold", "userIds"] + }, + "externaldatav1SignatureScheme": { + "type": "string", + "enum": ["SIGNATURE_SCHEME_EPHEMERAL_KEY_P256"] + }, + "externaldatav1SmartContractInterface": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "The Organization the Smart Contract Interface belongs to." + }, + "smartContractInterfaceId": { + "type": "string", + "description": "Unique identifier for a given Smart Contract Interface (ABI or IDL)." + }, + "smartContractAddress": { + "type": "string", + "description": "The address corresponding to the Smart Contract or Program." + }, + "smartContractInterface": { + "type": "string", + "description": "The JSON corresponding to the Smart Contract Interface (ABI or IDL)." + }, + "type": { + "type": "string", + "description": "The type corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA)." + }, + "label": { + "type": "string", + "description": "The label corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA)." + }, + "notes": { + "type": "string", + "description": "The notes corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA)." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + } + }, + "required": [ + "organizationId", + "smartContractInterfaceId", + "smartContractAddress", + "smartContractInterface", + "type", + "label", + "notes", + "createdAt", + "updatedAt" + ] + }, + "externaldatav1Timestamp": { + "type": "object", + "properties": { + "seconds": { + "type": "string" + }, + "nanos": { + "type": "string" + } + }, + "required": ["seconds", "nanos"] + }, + "immutableactivityv1Address": { + "type": "object", + "properties": { + "format": { + "$ref": "#/definitions/v1AddressFormat" + }, + "address": { + "type": "string" + } + } + }, + "immutablecommonv1PolicyEvaluation": { + "type": "object", + "properties": { + "policyId": { + "type": "string" + }, + "outcome": { + "$ref": "#/definitions/v1Outcome" + } + } + }, + "protobufAny": { + "type": "object", + "properties": { + "@type": { + "type": "string" + } + }, + "additionalProperties": {} + }, + "rpcStatus": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/protobufAny" + } + } + } + }, + "v1AcceptInvitationIntent": { + "type": "object", + "properties": { + "invitationId": { + "type": "string", + "description": "Unique identifier for a given Invitation object." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + }, + "authenticator": { + "$ref": "#/definitions/v1AuthenticatorParams", + "description": "WebAuthN hardware devices that can be used to log in to the Turnkey web app." + } + }, + "required": ["invitationId", "userId", "authenticator"] + }, + "v1AcceptInvitationIntentV2": { + "type": "object", + "properties": { + "invitationId": { + "type": "string", + "description": "Unique identifier for a given Invitation object." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + }, + "authenticator": { + "$ref": "#/definitions/v1AuthenticatorParamsV2", + "description": "WebAuthN hardware devices that can be used to log in to the Turnkey web app." + } + }, + "required": ["invitationId", "userId", "authenticator"] + }, + "v1AcceptInvitationResult": { + "type": "object", + "properties": { + "invitationId": { + "type": "string", + "description": "Unique identifier for a given Invitation." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + } + }, + "required": ["invitationId", "userId"] + }, + "v1AccessType": { + "type": "string", + "enum": ["ACCESS_TYPE_WEB", "ACCESS_TYPE_API", "ACCESS_TYPE_ALL"] + }, + "v1ActivePolicyStatus": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for the organization the policy belongs to." + }, + "policyId": { + "type": "string", + "description": "Unique identifier for a given policy." + }, + "active": { + "type": "boolean", + "description": "Whether the policy is currently active. A policy without a time window is always active." + }, + "timeExpr": { + "type": "string", + "description": "The policy's time expression, absent when the policy has no time window." + }, + "error": { + "type": "string", + "description": "Set when the policy's time expression could not be evaluated; the policy is reported inactive." + } + }, + "required": ["organizationId", "policyId", "active"] + }, + "v1Activity": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for a given Activity object." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "status": { + "$ref": "#/definitions/v1ActivityStatus", + "description": "The current processing status of a specified Activity." + }, + "type": { + "$ref": "#/definitions/v1ActivityType", + "description": "Type of Activity, such as Add User, or Sign Transaction." + }, + "intent": { + "$ref": "#/definitions/v1Intent", + "description": "Intent object crafted by Turnkey based on the user request, used to assess the permissibility of an action." + }, + "result": { + "$ref": "#/definitions/v1Result", + "description": "Result of the intended action." + }, + "votes": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1Vote" + }, + "description": "A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata." + }, + "appProofs": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AppProof" + }, + "description": "A list of App Proofs generated by enclaves during activity execution, providing verifiable attestations of performed operations." + }, + "fingerprint": { + "type": "string", + "description": "An artifact verifying a User's action." + }, + "canApprove": { + "type": "boolean" + }, + "canReject": { + "type": "boolean" + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "failure": { + "$ref": "#/definitions/rpcStatus", + "description": "Failure reason of the intended action." + } + }, + "required": [ + "id", + "organizationId", + "status", + "type", + "intent", + "result", + "votes", + "fingerprint", + "canApprove", + "canReject", + "createdAt", + "updatedAt" + ] + }, + "v1ActivityResponse": { + "type": "object", + "properties": { + "activity": { + "$ref": "#/definitions/v1Activity", + "description": "An action that can be taken within the Turnkey infrastructure." + } + }, + "required": ["activity"] + }, + "v1ActivityStatus": { + "type": "string", + "enum": [ + "ACTIVITY_STATUS_CREATED", + "ACTIVITY_STATUS_PENDING", + "ACTIVITY_STATUS_COMPLETED", + "ACTIVITY_STATUS_FAILED", + "ACTIVITY_STATUS_CONSENSUS_NEEDED", + "ACTIVITY_STATUS_REJECTED", + "ACTIVITY_STATUS_AUTHENTICATORS_NEEDED" + ] + }, + "v1ActivityType": { + "type": "string", + "enum": [ + "ACTIVITY_TYPE_CREATE_API_KEYS", + "ACTIVITY_TYPE_CREATE_USERS", + "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS", + "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD", + "ACTIVITY_TYPE_CREATE_INVITATIONS", + "ACTIVITY_TYPE_ACCEPT_INVITATION", + "ACTIVITY_TYPE_CREATE_POLICY", + "ACTIVITY_TYPE_DISABLE_PRIVATE_KEY", + "ACTIVITY_TYPE_DELETE_USERS", + "ACTIVITY_TYPE_DELETE_API_KEYS", + "ACTIVITY_TYPE_DELETE_INVITATION", + "ACTIVITY_TYPE_DELETE_ORGANIZATION", + "ACTIVITY_TYPE_DELETE_POLICY", + "ACTIVITY_TYPE_CREATE_USER_TAG", + "ACTIVITY_TYPE_DELETE_USER_TAGS", + "ACTIVITY_TYPE_CREATE_ORGANIZATION", + "ACTIVITY_TYPE_SIGN_TRANSACTION", + "ACTIVITY_TYPE_APPROVE_ACTIVITY", + "ACTIVITY_TYPE_REJECT_ACTIVITY", + "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", + "ACTIVITY_TYPE_CREATE_AUTHENTICATORS", + "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", + "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", + "ACTIVITY_TYPE_SET_PAYMENT_METHOD", + "ACTIVITY_TYPE_ACTIVATE_BILLING_TIER", + "ACTIVITY_TYPE_DELETE_PAYMENT_METHOD", + "ACTIVITY_TYPE_CREATE_POLICY_V2", + "ACTIVITY_TYPE_CREATE_POLICY_V3", + "ACTIVITY_TYPE_CREATE_API_ONLY_USERS", + "ACTIVITY_TYPE_UPDATE_ROOT_QUORUM", + "ACTIVITY_TYPE_UPDATE_USER_TAG", + "ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG", + "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", + "ACTIVITY_TYPE_CREATE_ORGANIZATION_V2", + "ACTIVITY_TYPE_CREATE_USERS_V2", + "ACTIVITY_TYPE_ACCEPT_INVITATION_V2", + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION", + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V2", + "ACTIVITY_TYPE_UPDATE_ALLOWED_ORIGINS", + "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", + "ACTIVITY_TYPE_UPDATE_USER", + "ACTIVITY_TYPE_UPDATE_POLICY", + "ACTIVITY_TYPE_SET_PAYMENT_METHOD_V2", + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V3", + "ACTIVITY_TYPE_CREATE_WALLET", + "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", + "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY", + "ACTIVITY_TYPE_RECOVER_USER", + "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", + "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", + "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", + "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", + "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", + "ACTIVITY_TYPE_EXPORT_WALLET", + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V4", + "ACTIVITY_TYPE_EMAIL_AUTH", + "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", + "ACTIVITY_TYPE_INIT_IMPORT_WALLET", + "ACTIVITY_TYPE_IMPORT_WALLET", + "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", + "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", + "ACTIVITY_TYPE_CREATE_POLICIES", + "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", + "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", + "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS", + "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V5", + "ACTIVITY_TYPE_OAUTH", + "ACTIVITY_TYPE_CREATE_API_KEYS_V2", + "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION", + "ACTIVITY_TYPE_EMAIL_AUTH_V2", + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V6", + "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", + "ACTIVITY_TYPE_DELETE_WALLETS", + "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", + "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", + "ACTIVITY_TYPE_INIT_OTP_AUTH", + "ACTIVITY_TYPE_OTP_AUTH", + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", + "ACTIVITY_TYPE_UPDATE_WALLET", + "ACTIVITY_TYPE_UPDATE_POLICY_V2", + "ACTIVITY_TYPE_CREATE_USERS_V3", + "ACTIVITY_TYPE_INIT_OTP_AUTH_V2", + "ACTIVITY_TYPE_INIT_OTP", + "ACTIVITY_TYPE_VERIFY_OTP", + "ACTIVITY_TYPE_OTP_LOGIN", + "ACTIVITY_TYPE_STAMP_LOGIN", + "ACTIVITY_TYPE_OAUTH_LOGIN", + "ACTIVITY_TYPE_UPDATE_USER_NAME", + "ACTIVITY_TYPE_UPDATE_USER_EMAIL", + "ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER", + "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", + "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", + "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", + "ACTIVITY_TYPE_ENABLE_AUTH_PROXY", + "ACTIVITY_TYPE_DISABLE_AUTH_PROXY", + "ACTIVITY_TYPE_UPDATE_AUTH_PROXY_CONFIG", + "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", + "ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL", + "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", + "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", + "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", + "ACTIVITY_TYPE_DELETE_POLICIES", + "ACTIVITY_TYPE_ETH_SEND_RAW_TRANSACTION", + "ACTIVITY_TYPE_ETH_SEND_TRANSACTION", + "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", + "ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL", + "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", + "ACTIVITY_TYPE_EMAIL_AUTH_V3", + "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", + "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", + "ACTIVITY_TYPE_INIT_OTP_V2", + "ACTIVITY_TYPE_UPSERT_GAS_USAGE_CONFIG", + "ACTIVITY_TYPE_CREATE_TVC_APP", + "ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT", + "ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS", + "ACTIVITY_TYPE_SOL_SEND_TRANSACTION", + "ACTIVITY_TYPE_INIT_OTP_V3", + "ACTIVITY_TYPE_VERIFY_OTP_V2", + "ACTIVITY_TYPE_OTP_LOGIN_V2", + "ACTIVITY_TYPE_UPDATE_ORGANIZATION_NAME", + "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V8", + "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS_V2", + "ACTIVITY_TYPE_CREATE_USERS_V4", + "ACTIVITY_TYPE_CREATE_WEBHOOK_ENDPOINT", + "ACTIVITY_TYPE_UPDATE_WEBHOOK_ENDPOINT", + "ACTIVITY_TYPE_DELETE_WEBHOOK_ENDPOINT", + "ACTIVITY_TYPE_SET_IP_ALLOWLIST", + "ACTIVITY_TYPE_REMOVE_IP_ALLOWLIST", + "ACTIVITY_TYPE_UPDATE_TVC_APP_LIVE_DEPLOYMENT", + "ACTIVITY_TYPE_DELETE_TVC_DEPLOYMENT", + "ACTIVITY_TYPE_DELETE_TVC_APP_AND_DEPLOYMENTS", + "ACTIVITY_TYPE_RESTORE_TVC_DEPLOYMENT", + "ACTIVITY_TYPE_SPARK_SIGN_FROST", + "ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER", + "ACTIVITY_TYPE_SPARK_CLAIM_TRANSFER", + "ACTIVITY_TYPE_SPARK_PREPARE_LIGHTNING_RECEIVE", + "ACTIVITY_TYPE_POST_TVC_QUORUM_KEY_SHARE", + "ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2", + "ACTIVITY_TYPE_CREATE_MFA_POLICY", + "ACTIVITY_TYPE_UPDATE_MFA_POLICY", + "ACTIVITY_TYPE_DELETE_MFA_POLICY", + "ACTIVITY_TYPE_CREATE_SESSION_PROFILE", + "ACTIVITY_TYPE_EARN_DEPLOY_WRAPPER", + "ACTIVITY_TYPE_EARN_DEPOSIT", + "ACTIVITY_TYPE_EARN_WITHDRAW", + "ACTIVITY_TYPE_EXECUTE_SWAP", + "ACTIVITY_TYPE_UPSERT_SWAP_CONFIG", + "ACTIVITY_TYPE_CREATE_TVC_OPERATOR", + "ACTIVITY_TYPE_CREATE_TVC_QUORUM_KEY", + "ACTIVITY_TYPE_RE_ENCRYPT_TVC_QUORUM_KEY_SHARE", + "ACTIVITY_TYPE_INIT_IMPORT_SECRETS", + "ACTIVITY_TYPE_SOL_SEND_TRANSACTION_V2", + "ACTIVITY_TYPE_CLAIM_SWAP_FEES", + "ACTIVITY_TYPE_EARN_SET_WRAPPER_STATE", + "ACTIVITY_TYPE_CLAIM_EARN_FEES", + "ACTIVITY_TYPE_UPDATE_WALLET_ACCOUNT_NAME", + "ACTIVITY_TYPE_ETH_UNDELEGATE_7702", + "ACTIVITY_TYPE_EXECUTE_SWAP_V2", + "ACTIVITY_TYPE_CREATE_SWAP_QUOTE", + "ACTIVITY_TYPE_IMPORT_SECRETS", + "ACTIVITY_TYPE_EXPORT_SECRETS", + "ACTIVITY_TYPE_CREATE_VELOCITY_CONTROL", + "ACTIVITY_TYPE_DELETE_VELOCITY_CONTROLS", + "ACTIVITY_TYPE_UPDATE_PAYMENT_METHOD", + "ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V2", + "ACTIVITY_TYPE_EXECUTE_SWAP_V3", + "ACTIVITY_TYPE_DELETE_SECRETS", + "ACTIVITY_TYPE_EARN_CLAIM_REWARDS", + "ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V3", + "ACTIVITY_TYPE_UPSERT_SWAP_FEE_SPONSORSHIP_LIMIT_CONFIG", + "ACTIVITY_TYPE_UPSERT_SWAP_FIXED_RATE_LIMIT_CONFIG", + "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_SESSION" + ] + }, + "v1AddressFormat": { + "type": "string", + "enum": [ + "ADDRESS_FORMAT_UNCOMPRESSED", + "ADDRESS_FORMAT_COMPRESSED", + "ADDRESS_FORMAT_ETHEREUM", + "ADDRESS_FORMAT_SOLANA", + "ADDRESS_FORMAT_COSMOS", + "ADDRESS_FORMAT_TRON", + "ADDRESS_FORMAT_SUI", + "ADDRESS_FORMAT_APTOS", + "ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH", + "ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH", + "ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH", + "ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH", + "ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR", + "ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH", + "ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH", + "ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH", + "ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH", + "ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR", + "ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH", + "ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH", + "ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH", + "ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH", + "ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR", + "ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH", + "ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH", + "ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH", + "ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH", + "ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR", + "ADDRESS_FORMAT_SEI", + "ADDRESS_FORMAT_XLM", + "ADDRESS_FORMAT_DOGE_MAINNET", + "ADDRESS_FORMAT_DOGE_TESTNET", + "ADDRESS_FORMAT_TON_V3R2", + "ADDRESS_FORMAT_TON_V4R2", + "ADDRESS_FORMAT_TON_V5R1", + "ADDRESS_FORMAT_XRP", + "ADDRESS_FORMAT_SPARK_MAINNET", + "ADDRESS_FORMAT_SPARK_REGTEST" + ] + }, + "v1ApiKey": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/definitions/externaldatav1Credential", + "description": "A User credential that can be used to authenticate to Turnkey." + }, + "apiKeyId": { + "type": "string", + "description": "Unique identifier for a given API Key." + }, + "apiKeyName": { + "type": "string", + "description": "Human-readable name for an API Key." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "expirationSeconds": { + "type": "string", + "format": "uint64", + "description": "Optional window (in seconds) indicating how long the API Key should last." + } + }, + "required": [ + "credential", + "apiKeyId", + "apiKeyName", + "createdAt", + "updatedAt" + ] + }, + "v1ApiKeyCurve": { + "type": "string", + "enum": [ + "API_KEY_CURVE_P256", + "API_KEY_CURVE_SECP256K1", + "API_KEY_CURVE_ED25519" + ] + }, + "v1ApiKeyParamsV2": { + "type": "object", + "properties": { + "apiKeyName": { + "type": "string", + "description": "Human-readable name for an API Key." + }, + "publicKey": { + "type": "string", + "description": "The public component of a cryptographic key pair used to sign messages and transactions." + }, + "curveType": { + "$ref": "#/definitions/v1ApiKeyCurve", + "description": "The curve type to be used for processing API key signatures." + }, + "expirationSeconds": { + "type": "string", + "description": "Optional window (in seconds) indicating how long the API Key should last." + } + }, + "required": ["apiKeyName", "publicKey", "curveType"] + }, + "v1ApiOnlyUserParams": { + "type": "object", + "properties": { + "userName": { + "type": "string", + "description": "The name of the new API-only User." + }, + "userEmail": { + "type": "string", + "description": "The email address for this API-only User (optional)." + }, + "userTags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of tags assigned to the new API-only User. This field, if not needed, should be an empty array in your request body." + }, + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiApiKeyParams" + }, + "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + } + }, + "required": ["userName", "userTags", "apiKeys"] + }, + "v1AppProof": { + "type": "object", + "properties": { + "scheme": { + "$ref": "#/definitions/externaldatav1SignatureScheme", + "description": "Scheme of signing key." + }, + "publicKey": { + "type": "string", + "description": "Ephemeral public key." + }, + "proofPayload": { + "type": "string", + "description": "JSON serialized AppProofPayload." + }, + "signature": { + "type": "string", + "description": "Signature over hashed proof_payload." + } + }, + "required": ["scheme", "publicKey", "proofPayload", "signature"] + }, + "v1AppStatus": { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "Unique identifier for this TVC App" + }, + "deployments": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1DeploymentStatus" + }, + "description": "List of deployment statuses for this app" + }, + "targetedDeploymentId": { + "type": "string", + "description": "The deployment ID currently serving traffic for this app" + } + }, + "required": ["appId", "deployments", "targetedDeploymentId"] + }, + "v1ApproveActivityIntent": { + "type": "object", + "properties": { + "fingerprint": { + "type": "string", + "description": "An artifact verifying a User's action." + } + }, + "required": ["fingerprint"] + }, + "v1ApproveActivityRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_APPROVE_ACTIVITY"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1ApproveActivityIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1AssetBalance": { + "type": "object", + "properties": { + "caip19": { + "type": "string", + "description": "The caip-19 asset identifier" + }, + "symbol": { + "type": "string", + "description": "The asset symbol" + }, + "balance": { + "type": "string", + "description": "The balance in atomic units" + }, + "decimals": { + "type": "integer", + "format": "int32", + "description": "The number of decimals this asset uses" + }, + "display": { + "$ref": "#/definitions/v1AssetBalanceDisplay", + "description": "Normalized balance values for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise. Use the balance field instead." + }, + "name": { + "type": "string", + "description": "The asset name" + }, + "tokenProgram": { + "type": "string", + "description": "Solana token program address that owns this mint, inferred from getTokenAccountsByOwner. TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA for classic SPL Token, TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb for Token-2022. Empty for native SOL and non-Solana assets." + } + } + }, + "v1AssetBalanceDisplay": { + "type": "object", + "properties": { + "usd": { + "type": "string", + "description": "USD value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise." + }, + "crypto": { + "type": "string", + "description": "Normalized crypto value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise." + } + } + }, + "v1AssetMetadata": { + "type": "object", + "properties": { + "caip19": { + "type": "string", + "description": "The caip-19 asset identifier" + }, + "symbol": { + "type": "string", + "description": "The asset symbol" + }, + "decimals": { + "type": "integer", + "format": "int32", + "description": "The number of decimals this asset uses" + }, + "logoUrl": { + "type": "string", + "description": "The url of the asset logo" + }, + "name": { + "type": "string", + "description": "The asset name" + }, + "stable": { + "type": "boolean", + "description": "Whether this asset is on Turnkey's stablecoin list (used for stablepair swap fee pricing)." + }, + "earnProviders": { + "type": "array", + "items": { + "$ref": "#/definitions/v1EarnProvider" + }, + "description": "Earn yield providers with vaults denominated in this asset. Empty when the asset is not supported by Earn." + } + } + }, + "v1Attestation": { + "type": "object", + "properties": { + "credentialId": { + "type": "string", + "description": "The cbor encoded then base64 url encoded id of the credential." + }, + "clientDataJson": { + "type": "string", + "description": "A base64 url encoded payload containing metadata about the signing context and the challenge." + }, + "attestationObject": { + "type": "string", + "description": "A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses." + }, + "transports": { + "type": "array", + "items": { + "$ref": "#/definitions/v1AuthenticatorTransport" + }, + "description": "The type of authenticator transports." + } + }, + "required": [ + "credentialId", + "clientDataJson", + "attestationObject", + "transports" + ] + }, + "v1AuthenticationMethod": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1AuthenticationType", + "description": "The type of authenticator (e.g., AUTHENTICATION_TYPE_EMAIL, AUTHENTICATION_TYPE_SESSION) required for this MFA step." + }, + "id": { + "type": "string", + "description": "Optional specific authenticator ID required (e.g., for requiring a specific session profile id)" + } + }, + "required": ["type"] + }, + "v1AuthenticationMethodParams": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1AuthenticationType", + "description": "The type of authenticator (e.g., AUTHENTICATION_TYPE_PASSKEY for passkey authentication)." + }, + "id": { + "type": "string", + "description": "Optional specific authenticator ID required (e.g., UUID of a passkey authenticator). If not provided, any authenticator of the specified type can be used." + } + }, + "required": ["type"] + }, + "v1AuthenticationType": { + "type": "string", + "enum": [ + "AUTHENTICATION_TYPE_EMAIL_OTP", + "AUTHENTICATION_TYPE_SMS_OTP", + "AUTHENTICATION_TYPE_PASSKEY", + "AUTHENTICATION_TYPE_API_KEY", + "AUTHENTICATION_TYPE_OAUTH", + "AUTHENTICATION_TYPE_SESSION" + ] + }, + "v1Authenticator": { + "type": "object", + "properties": { + "transports": { + "type": "array", + "items": { + "$ref": "#/definitions/v1AuthenticatorTransport" + }, + "description": "Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE)." + }, + "attestationType": { + "type": "string" + }, + "aaguid": { + "type": "string", + "description": "Identifier indicating the type of the Security Key." + }, + "credentialId": { + "type": "string", + "description": "Unique identifier for a WebAuthn credential." + }, + "model": { + "type": "string", + "description": "The type of Authenticator device." + }, + "credential": { + "$ref": "#/definitions/externaldatav1Credential", + "description": "A User credential that can be used to authenticate to Turnkey." + }, + "authenticatorId": { + "type": "string", + "description": "Unique identifier for a given Authenticator." + }, + "authenticatorName": { + "type": "string", + "description": "Human-readable name for an Authenticator." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + } + }, + "required": [ + "transports", + "attestationType", + "aaguid", + "credentialId", + "model", + "credential", + "authenticatorId", + "authenticatorName", + "createdAt", + "updatedAt" + ] + }, + "v1AuthenticatorAttestationResponse": { + "type": "object", + "properties": { + "clientDataJson": { + "type": "string" + }, + "attestationObject": { + "type": "string" + }, + "transports": { + "type": "array", + "items": { + "$ref": "#/definitions/v1AuthenticatorTransport" + } + }, + "authenticatorAttachment": { + "type": "string", + "enum": ["cross-platform", "platform"], + "x-nullable": true + } + }, + "required": ["clientDataJson", "attestationObject"] + }, + "v1AuthenticatorParams": { + "type": "object", + "properties": { + "authenticatorName": { + "type": "string", + "description": "Human-readable name for an Authenticator." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + }, + "attestation": { + "$ref": "#/definitions/v1PublicKeyCredentialWithAttestation" + }, + "challenge": { + "type": "string", + "description": "Challenge presented for authentication purposes." + } + }, + "required": ["authenticatorName", "userId", "attestation", "challenge"] + }, + "v1AuthenticatorParamsV2": { + "type": "object", + "properties": { + "authenticatorName": { + "type": "string", + "description": "Human-readable name for an Authenticator." + }, + "challenge": { + "type": "string", + "description": "Challenge presented for authentication purposes." + }, + "attestation": { + "$ref": "#/definitions/v1Attestation", + "description": "The attestation that proves custody of the authenticator and provides metadata about it." + } + }, + "required": ["authenticatorName", "challenge", "attestation"] + }, + "v1AuthenticatorTransport": { + "type": "string", + "enum": [ + "AUTHENTICATOR_TRANSPORT_BLE", + "AUTHENTICATOR_TRANSPORT_INTERNAL", + "AUTHENTICATOR_TRANSPORT_NFC", + "AUTHENTICATOR_TRANSPORT_USB", + "AUTHENTICATOR_TRANSPORT_HYBRID" + ] + }, + "v1BootProof": { + "type": "object", + "properties": { + "ephemeralPublicKeyHex": { + "type": "string", + "description": "The hex encoded Ephemeral Public Key." + }, + "awsAttestationDocB64": { + "type": "string", + "description": "The DER encoded COSE Sign1 struct Attestation doc." + }, + "qosManifestB64": { + "type": "string", + "description": "The base64 encoded QOS manifest. Encoding depends on qos_manifest_version." + }, + "qosManifestEnvelopeB64": { + "type": "string", + "description": "The base64 encoded QOS manifest envelope. Encoding depends on qos_manifest_version." + }, + "deploymentLabel": { + "type": "string", + "description": "The label under which the enclave app was deployed." + }, + "enclaveApp": { + "type": "string", + "description": "Name of the enclave app" + }, + "owner": { + "type": "string", + "description": "Owner of the app i.e. 'tkhq'" + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "qosManifestVersion": { + "type": "string", + "description": "QOS manifest schema version." + } + }, + "required": [ + "ephemeralPublicKeyHex", + "awsAttestationDocB64", + "qosManifestB64", + "qosManifestEnvelopeB64", + "deploymentLabel", + "enclaveApp", + "owner", + "createdAt" + ] + }, + "v1BootProofResponse": { + "type": "object", + "properties": { + "bootProof": { + "$ref": "#/definitions/v1BootProof" + } + }, + "required": ["bootProof"] + }, + "v1ClaimEarnFeesIntent": { + "type": "object", + "properties": { + "wrapperAddress": { + "type": "string", + "description": "Address of the deployed Earn wrapper to claim fees for. Must be one of the org's deployed wrappers." + } + }, + "required": ["wrapperAddress"] + }, + "v1ClaimEarnFeesRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CLAIM_EARN_FEES"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1ClaimEarnFeesIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1ClaimEarnFeesResult": { + "type": "object", + "properties": { + "claimRequestId": { + "type": "string", + "description": "Identifier to poll claim status and tx hash via GetClaimEarnFeesStatus." + } + }, + "required": ["claimRequestId"] + }, + "v1ClaimSwapFeesIntent": { + "type": "object" + }, + "v1ClaimSwapFeesRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CLAIM_SWAP_FEES"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1ClaimSwapFeesIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1ClaimSwapFeesResult": { + "type": "object", + "properties": { + "requestId": { + "type": "string", + "description": "Relay claim request ID submitted through the permit endpoint." + } + }, + "required": ["requestId"] + }, + "v1ClientSignature": { + "type": "object", + "properties": { + "publicKey": { + "type": "string", + "description": "The public component of a cryptographic key pair used to create the signature." + }, + "scheme": { + "$ref": "#/definitions/v1ClientSignatureScheme", + "description": "The signature scheme used to generate the client signature." + }, + "message": { + "type": "string", + "description": "The message that was signed." + }, + "signature": { + "type": "string", + "description": "The cryptographic signature over the message." + } + }, + "required": ["publicKey", "scheme", "message", "signature"] + }, + "v1ClientSignatureScheme": { + "type": "string", + "enum": ["CLIENT_SIGNATURE_SCHEME_API_P256"] + }, + "v1Config": { + "type": "object", + "properties": { + "features": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1Feature" + } + }, + "quorum": { + "$ref": "#/definitions/externaldatav1Quorum" + } + } + }, + "v1CreateApiKeysIntent": { + "type": "object", + "properties": { + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiApiKeyParams" + }, + "description": "A list of API Keys." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + } + }, + "required": ["apiKeys", "userId"] + }, + "v1CreateApiKeysIntentV2": { + "type": "object", + "properties": { + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ApiKeyParamsV2" + }, + "description": "A list of API Keys." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + } + }, + "required": ["apiKeys", "userId"] + }, + "v1CreateApiKeysRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_API_KEYS_V2"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateApiKeysIntentV2" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateApiKeysResult": { + "type": "object", + "properties": { + "apiKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of API Key IDs." + } + }, + "required": ["apiKeyIds"] + }, + "v1CreateApiOnlyUsersIntent": { + "type": "object", + "properties": { + "apiOnlyUsers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ApiOnlyUserParams" + }, + "description": "A list of API-only Users to create." + } + }, + "required": ["apiOnlyUsers"] + }, + "v1CreateApiOnlyUsersResult": { + "type": "object", + "properties": { + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of API-only User IDs." + } + }, + "required": ["userIds"] + }, + "v1CreateAuthenticatorsIntent": { + "type": "object", + "properties": { + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParams" + }, + "description": "A list of Authenticators." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + } + }, + "required": ["authenticators", "userId"] + }, + "v1CreateAuthenticatorsIntentV2": { + "type": "object", + "properties": { + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + }, + "description": "A list of Authenticators." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + } + }, + "required": ["authenticators", "userId"] + }, + "v1CreateAuthenticatorsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateAuthenticatorsIntentV2" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateAuthenticatorsResult": { + "type": "object", + "properties": { + "authenticatorIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Authenticator IDs." + } + }, + "required": ["authenticatorIds"] + }, + "v1CreateFiatOnRampCredentialIntent": { + "type": "object", + "properties": { + "onrampProvider": { + "$ref": "#/definitions/v1FiatOnRampProvider", + "description": "The fiat on-ramp provider" + }, + "projectId": { + "type": "string", + "description": "Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier" + }, + "publishableApiKey": { + "type": "string", + "description": "Publishable API key for the on-ramp provider" + }, + "encryptedSecretApiKey": { + "type": "string", + "description": "Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key" + }, + "encryptedPrivateApiKey": { + "type": "string", + "description": "Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key." + }, + "sandboxMode": { + "type": "boolean", + "description": "If the on-ramp credential is a sandbox credential" + } + }, + "required": [ + "onrampProvider", + "publishableApiKey", + "encryptedSecretApiKey" + ] + }, + "v1CreateFiatOnRampCredentialRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateFiatOnRampCredentialIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateFiatOnRampCredentialResult": { + "type": "object", + "properties": { + "fiatOnRampCredentialId": { + "type": "string", + "description": "Unique identifier of the Fiat On-Ramp credential that was created" + } + }, + "required": ["fiatOnRampCredentialId"] + }, + "v1CreateFiatOnRampSessionIntent": { + "type": "object", + "properties": { + "quoteId": { + "type": "string", + "description": "Identifier of a saved fiat on-ramp quote. Returned by GetFiatOnRampQuote." + }, + "walletAddress": { + "type": "string", + "description": "Destination wallet address for the buy transaction." + } + }, + "required": ["quoteId", "walletAddress"] + }, + "v1CreateFiatOnRampSessionResult": { + "type": "object", + "properties": { + "onRampUrl": { + "type": "string", + "description": "URL of the fiat on-ramp session for the saved quote." + }, + "onRampTransactionId": { + "type": "string", + "description": "Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow." + } + }, + "required": ["onRampUrl", "onRampTransactionId"] + }, + "v1CreateInvitationsIntent": { + "type": "object", + "properties": { + "invitations": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1InvitationParams" + }, + "description": "A list of Invitations." + } + }, + "required": ["invitations"] + }, + "v1CreateInvitationsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_INVITATIONS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateInvitationsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateInvitationsResult": { + "type": "object", + "properties": { + "invitationIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Invitation IDs" + } + }, + "required": ["invitationIds"] + }, + "v1CreateMfaPolicyIntent": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "The ID of the User to add the MFA Policy to." + }, + "mfaPolicyName": { + "type": "string", + "description": "Human-readable name for a Policy." + }, + "condition": { + "type": "string", + "description": "A condition expression that evaluates to true or false, determining when this MFA policy applies." + }, + "requiredAuthenticationMethods": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RequiredAuthenticationMethodParams" + }, + "description": "An ordered list of authentication requirements. Each requirement must be satisfied sequentially to complete MFA." + }, + "order": { + "type": "integer", + "format": "int64", + "description": "The order in which this MFA policy is evaluated, starting from 0, relative to other MFA policies. Lower order values are evaluated first." + }, + "notes": { + "type": "string", + "description": "Notes for an MFA Policy." + } + }, + "required": [ + "userId", + "mfaPolicyName", + "condition", + "requiredAuthenticationMethods", + "order" + ] + }, + "v1CreateMfaPolicyRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_MFA_POLICY"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateMfaPolicyIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateMfaPolicyResult": { + "type": "object", + "properties": { + "mfaPolicyId": { + "type": "string", + "description": "Unique identifier for a given MFA Policy." + } + }, + "required": ["mfaPolicyId"] + }, + "v1CreateOauth2CredentialIntent": { + "type": "object", + "properties": { + "provider": { + "$ref": "#/definitions/v1Oauth2Provider", + "description": "The OAuth 2.0 provider" + }, + "clientId": { + "type": "string", + "description": "The Client ID issued by the OAuth 2.0 provider" + }, + "encryptedClientSecret": { + "type": "string", + "description": "The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key" + } + }, + "required": ["provider", "clientId", "encryptedClientSecret"] + }, + "v1CreateOauth2CredentialRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateOauth2CredentialIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateOauth2CredentialResult": { + "type": "object", + "properties": { + "oauth2CredentialId": { + "type": "string", + "description": "Unique identifier of the OAuth 2.0 credential that was created" + } + }, + "required": ["oauth2CredentialId"] + }, + "v1CreateOauthProvidersIntent": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "The ID of the User to add an Oauth provider to" + }, + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProviderParams" + }, + "description": "A list of Oauth providers." + } + }, + "required": ["userId", "oauthProviders"] + }, + "v1CreateOauthProvidersIntentV2": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "The ID of the User to add an Oauth provider to" + }, + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProviderParamsV2" + }, + "description": "A list of Oauth providers." + } + }, + "required": ["userId", "oauthProviders"] + }, + "v1CreateOauthProvidersRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS_V2"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateOauthProvidersIntentV2" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateOauthProvidersResult": { + "type": "object", + "properties": { + "providerIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of unique identifiers for Oauth Providers" + } + }, + "required": ["providerIds"] + }, + "v1CreateOauthProvidersResultV2": { + "type": "object", + "properties": { + "providerIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of unique identifiers for Oauth Providers" + } + }, + "required": ["providerIds"] + }, + "v1CreateOrganizationIntent": { + "type": "object", + "properties": { + "organizationName": { + "type": "string", + "description": "Human-readable name for an Organization." + }, + "rootEmail": { + "type": "string", + "description": "The root user's email address." + }, + "rootAuthenticator": { + "$ref": "#/definitions/v1AuthenticatorParams", + "description": "The root user's Authenticator." + }, + "rootUserId": { + "type": "string", + "description": "Unique identifier for the root user object." + } + }, + "required": ["organizationName", "rootEmail", "rootAuthenticator"] + }, + "v1CreateOrganizationIntentV2": { + "type": "object", + "properties": { + "organizationName": { + "type": "string", + "description": "Human-readable name for an Organization." + }, + "rootEmail": { + "type": "string", + "description": "The root user's email address." + }, + "rootAuthenticator": { + "$ref": "#/definitions/v1AuthenticatorParamsV2", + "description": "The root user's Authenticator." + }, + "rootUserId": { + "type": "string", + "description": "Unique identifier for the root user object." + } + }, + "required": ["organizationName", "rootEmail", "rootAuthenticator"] + }, + "v1CreateOrganizationResult": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] + }, + "v1CreatePoliciesIntent": { + "type": "object", + "properties": { + "policies": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1CreatePolicyIntentV3" + }, + "description": "An array of policy intents to be created." + } + }, + "required": ["policies"] + }, + "v1CreatePoliciesRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_POLICIES"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreatePoliciesIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreatePoliciesResult": { + "type": "object", + "properties": { + "policyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of unique identifiers for the created policies." + } + }, + "required": ["policyIds"] + }, + "v1CreatePolicyIntent": { + "type": "object", + "properties": { + "policyName": { + "type": "string", + "description": "Human-readable name for a Policy." + }, + "selectors": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1Selector" + }, + "description": "A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details." + }, + "effect": { + "$ref": "#/definitions/v1Effect", + "description": "The instruction to DENY or ALLOW a particular activity following policy selector(s)." + }, + "notes": { + "type": "string" + } + }, + "required": ["policyName", "selectors", "effect"] + }, + "v1CreatePolicyIntentV2": { + "type": "object", + "properties": { + "policyName": { + "type": "string", + "description": "Human-readable name for a Policy." + }, + "selectors": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SelectorV2" + }, + "description": "A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details." + }, + "effect": { + "$ref": "#/definitions/v1Effect", + "description": "Whether to ALLOW or DENY requests that match the condition and consensus requirements." + }, + "notes": { + "type": "string" + } + }, + "required": ["policyName", "selectors", "effect"] + }, + "v1CreatePolicyIntentV3": { + "type": "object", + "properties": { + "policyName": { + "type": "string", + "description": "Human-readable name for a Policy." + }, + "effect": { + "$ref": "#/definitions/v1Effect", + "description": "The instruction to DENY or ALLOW an activity." + }, + "condition": { + "type": "string", + "description": "The condition expression that triggers the Effect" + }, + "consensus": { + "type": "string", + "description": "The consensus expression that triggers the Effect" + }, + "notes": { + "type": "string", + "description": "Notes for a Policy." + }, + "time": { + "type": "string", + "description": "The time expression that triggers the Effect" + } + }, + "required": ["policyName", "effect", "notes"] + }, + "v1CreatePolicyRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_POLICY_V3"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreatePolicyIntentV3" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreatePolicyResult": { + "type": "object", + "properties": { + "policyId": { + "type": "string", + "description": "Unique identifier for a given Policy." + } + }, + "required": ["policyId"] + }, + "v1CreatePrivateKeyTagIntent": { + "type": "object", + "properties": { + "privateKeyTagName": { + "type": "string", + "description": "Human-readable name for a Private Key Tag." + }, + "privateKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Private Key IDs." + } + }, + "required": ["privateKeyTagName", "privateKeyIds"] + }, + "v1CreatePrivateKeyTagRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreatePrivateKeyTagIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreatePrivateKeyTagResult": { + "type": "object", + "properties": { + "privateKeyTagId": { + "type": "string", + "description": "Unique identifier for a given Private Key Tag." + }, + "privateKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Private Key IDs." + } + }, + "required": ["privateKeyTagId", "privateKeyIds"] + }, + "v1CreatePrivateKeysIntent": { + "type": "object", + "properties": { + "privateKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1PrivateKeyParams" + }, + "description": "A list of Private Keys." + } + }, + "required": ["privateKeys"] + }, + "v1CreatePrivateKeysIntentV2": { + "type": "object", + "properties": { + "privateKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1PrivateKeyParams" + }, + "description": "A list of Private Keys." + }, + "externalSignerPubkey": { + "type": "string", + "description": "The public key of the external signer to use for creating the private keys." + } + }, + "required": ["privateKeys"] + }, + "v1CreatePrivateKeysRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreatePrivateKeysIntentV2" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreatePrivateKeysResult": { + "type": "object", + "properties": { + "privateKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Private Key IDs." + } + }, + "required": ["privateKeyIds"] + }, + "v1CreatePrivateKeysResultV2": { + "type": "object", + "properties": { + "privateKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1PrivateKeyResult" + }, + "description": "A list of Private Key IDs and addresses." + } + }, + "required": ["privateKeys"] + }, + "v1CreateReadOnlySessionIntent": { + "type": "object" + }, + "v1CreateReadOnlySessionRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateReadOnlySessionIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateReadOnlySessionResult": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." + }, + "organizationName": { + "type": "string", + "description": "Human-readable name for an Organization." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + }, + "username": { + "type": "string", + "description": "Human-readable name for a User." + }, + "session": { + "type": "string", + "description": "String representing a read only session" + }, + "sessionExpiry": { + "type": "string", + "format": "uint64", + "description": "UTC timestamp in seconds representing the expiry time for the read only session." + } + }, + "required": [ + "organizationId", + "organizationName", + "userId", + "username", + "session", + "sessionExpiry" + ] + }, + "v1CreateReadWriteSessionIntent": { + "type": "object", + "properties": { + "targetPublicKey": { + "type": "string", + "description": "Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted." + }, + "email": { + "type": "string", + "description": "Email of the user to create a read write session for" + }, + "apiKeyName": { + "type": "string", + "description": "Optional human-readable name for an API Key. If none provided, default to Read Write Session - \u003cTimestamp\u003e" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + } + }, + "required": ["targetPublicKey", "email"] + }, + "v1CreateReadWriteSessionIntentV2": { + "type": "object", + "properties": { + "targetPublicKey": { + "type": "string", + "description": "Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted." + }, + "userId": { + "type": "string", + "description": "Optional unique identifier for a given User. If none provided, the read write session will be created for the user who is making the request." + }, + "apiKeyName": { + "type": "string", + "description": "Optional human-readable name for an API Key. If none provided, default to Read Write Session - \u003cTimestamp\u003e" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated ReadWriteSession API keys" + } + }, + "required": ["targetPublicKey"] + }, + "v1CreateReadWriteSessionRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateReadWriteSessionIntentV2" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateReadWriteSessionResult": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." + }, + "organizationName": { + "type": "string", + "description": "Human-readable name for an Organization." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + }, + "username": { + "type": "string", + "description": "Human-readable name for a User." + }, + "apiKeyId": { + "type": "string", + "description": "Unique identifier for the created API key." + }, + "credentialBundle": { + "type": "string", + "description": "HPKE encrypted credential bundle" + } + }, + "required": [ + "organizationId", + "organizationName", + "userId", + "username", + "apiKeyId", + "credentialBundle" + ] + }, + "v1CreateReadWriteSessionResultV2": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." + }, + "organizationName": { + "type": "string", + "description": "Human-readable name for an Organization." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + }, + "username": { + "type": "string", + "description": "Human-readable name for a User." + }, + "apiKeyId": { + "type": "string", + "description": "Unique identifier for the created API key." + }, + "credentialBundle": { + "type": "string", + "description": "HPKE encrypted credential bundle" + } + }, + "required": [ + "organizationId", + "organizationName", + "userId", + "username", + "apiKeyId", + "credentialBundle" + ] + }, + "v1CreateSessionProfileIntent": { + "type": "object", + "properties": { + "sessionProfileName": { + "type": "string", + "description": "Human-readable name for a Session Profile." + }, + "scope": { + "type": "string", + "description": "The scope string that defines the permissions for this Session Profile." + }, + "expirationSeconds": { + "type": "string", + "description": "The duration in seconds for which sessions created with this Session Profile are valid. If not set, expiration will be determined by the value passed in to the intent of login activities." + }, + "notes": { + "type": "string", + "description": "Notes for a Session Profile." + } + }, + "required": ["sessionProfileName", "scope"] + }, + "v1CreateSessionProfileRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_SESSION_PROFILE"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateSessionProfileIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateSessionProfileResult": { + "type": "object", + "properties": { + "sessionProfileId": { + "type": "string", + "description": "Unique identifier for a given Session Profile." + } + }, + "required": ["sessionProfileId"] + }, + "v1CreateSmartContractInterfaceIntent": { + "type": "object", + "properties": { + "smartContractAddress": { + "type": "string", + "description": "Corresponding contract address or program ID" + }, + "smartContractInterface": { + "type": "string", + "description": "ABI/IDL as a JSON string. Limited to 400kb" + }, + "type": { + "$ref": "#/definitions/v1SmartContractInterfaceType" + }, + "label": { + "type": "string", + "description": "Human-readable name for a Smart Contract Interface." + }, + "notes": { + "type": "string", + "description": "Notes for a Smart Contract Interface." + } + }, + "required": [ + "smartContractAddress", + "smartContractInterface", + "type", + "label" + ] + }, + "v1CreateSmartContractInterfaceRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateSmartContractInterfaceIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateSmartContractInterfaceResult": { + "type": "object", + "properties": { + "smartContractInterfaceId": { + "type": "string", + "description": "The ID of the created Smart Contract Interface." + } + }, + "required": ["smartContractInterfaceId"] + }, + "v1CreateSubOrganizationIntent": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name for this sub-organization" + }, + "rootAuthenticator": { + "$ref": "#/definitions/v1AuthenticatorParamsV2", + "description": "Root User authenticator for this new sub-organization" + } + }, + "required": ["name", "rootAuthenticator"] + }, + "v1CreateSubOrganizationIntentV2": { + "type": "object", + "properties": { + "subOrganizationName": { + "type": "string", + "description": "Name for this sub-organization" + }, + "rootUsers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RootUserParams" + }, + "description": "Root users to create within this sub-organization" + }, + "rootQuorumThreshold": { + "type": "integer", + "format": "int32", + "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + } + }, + "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + }, + "v1CreateSubOrganizationIntentV3": { + "type": "object", + "properties": { + "subOrganizationName": { + "type": "string", + "description": "Name for this sub-organization" + }, + "rootUsers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RootUserParams" + }, + "description": "Root users to create within this sub-organization" + }, + "rootQuorumThreshold": { + "type": "integer", + "format": "int32", + "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + }, + "privateKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1PrivateKeyParams" + }, + "description": "A list of Private Keys." + } + }, + "required": [ + "subOrganizationName", + "rootUsers", + "rootQuorumThreshold", + "privateKeys" + ] + }, + "v1CreateSubOrganizationIntentV4": { + "type": "object", + "properties": { + "subOrganizationName": { + "type": "string", + "description": "Name for this sub-organization" + }, + "rootUsers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RootUserParams" + }, + "description": "Root users to create within this sub-organization" + }, + "rootQuorumThreshold": { + "type": "integer", + "format": "int32", + "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + }, + "wallet": { + "$ref": "#/definitions/v1WalletParams", + "description": "The wallet to create for the sub-organization" + }, + "disableEmailRecovery": { + "type": "boolean", + "description": "Disable email recovery for the sub-organization" + }, + "disableEmailAuth": { + "type": "boolean", + "description": "Disable email auth for the sub-organization" + } + }, + "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + }, + "v1CreateSubOrganizationIntentV5": { + "type": "object", + "properties": { + "subOrganizationName": { + "type": "string", + "description": "Name for this sub-organization" + }, + "rootUsers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RootUserParamsV2" + }, + "description": "Root users to create within this sub-organization" + }, + "rootQuorumThreshold": { + "type": "integer", + "format": "int32", + "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + }, + "wallet": { + "$ref": "#/definitions/v1WalletParams", + "description": "The wallet to create for the sub-organization" + }, + "disableEmailRecovery": { + "type": "boolean", + "description": "Disable email recovery for the sub-organization" + }, + "disableEmailAuth": { + "type": "boolean", + "description": "Disable email auth for the sub-organization" + } + }, + "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + }, + "v1CreateSubOrganizationIntentV6": { + "type": "object", + "properties": { + "subOrganizationName": { + "type": "string", + "description": "Name for this sub-organization" + }, + "rootUsers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RootUserParamsV3" + }, + "description": "Root users to create within this sub-organization" + }, + "rootQuorumThreshold": { + "type": "integer", + "format": "int32", + "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + }, + "wallet": { + "$ref": "#/definitions/v1WalletParams", + "description": "The wallet to create for the sub-organization" + }, + "disableEmailRecovery": { + "type": "boolean", + "description": "Disable email recovery for the sub-organization" + }, + "disableEmailAuth": { + "type": "boolean", + "description": "Disable email auth for the sub-organization" + } + }, + "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + }, + "v1CreateSubOrganizationIntentV7": { + "type": "object", + "properties": { + "subOrganizationName": { + "type": "string", + "description": "Name for this sub-organization" + }, + "rootUsers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RootUserParamsV4" + }, + "description": "Root users to create within this sub-organization" + }, + "rootQuorumThreshold": { + "type": "integer", + "format": "int32", + "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + }, + "wallet": { + "$ref": "#/definitions/v1WalletParams", + "description": "The wallet to create for the sub-organization" + }, + "disableEmailRecovery": { + "type": "boolean", + "description": "Disable email recovery for the sub-organization" + }, + "disableEmailAuth": { + "type": "boolean", + "description": "Disable email auth for the sub-organization" + }, + "disableSmsAuth": { + "type": "boolean", + "description": "Disable OTP SMS auth for the sub-organization" + }, + "disableOtpEmailAuth": { + "type": "boolean", + "description": "Disable OTP email auth for the sub-organization" + }, + "verificationToken": { + "type": "string", + "description": "Signed JWT containing a unique id, expiry, verification type, contact" + }, + "clientSignature": { + "$ref": "#/definitions/v1ClientSignature", + "description": "Optional signature proving authorization for this sub-organization creation. The signature is over the verification token ID and the root user parameters for the root user associated with the verification token. Only required if a public key was provided during the verification step." + } + }, + "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + }, + "v1CreateSubOrganizationIntentV8": { + "type": "object", + "properties": { + "subOrganizationName": { + "type": "string", + "description": "Name for this sub-organization" + }, + "rootUsers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RootUserParamsV5" + }, + "description": "Root users to create within this sub-organization" + }, + "rootQuorumThreshold": { + "type": "integer", + "format": "int32", + "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + }, + "wallet": { + "$ref": "#/definitions/v1WalletParams", + "description": "The wallet to create for the sub-organization" + }, + "disableEmailRecovery": { + "type": "boolean", + "description": "Disable email recovery for the sub-organization" + }, + "disableEmailAuth": { + "type": "boolean", + "description": "Disable email auth for the sub-organization" + }, + "disableSmsAuth": { + "type": "boolean", + "description": "Disable OTP SMS auth for the sub-organization" + }, + "disableOtpEmailAuth": { + "type": "boolean", + "description": "Disable OTP email auth for the sub-organization" + }, + "verificationToken": { + "type": "string", + "description": "Signed JWT containing a unique id, expiry, verification type, contact" + }, + "clientSignature": { + "$ref": "#/definitions/v1ClientSignature", + "description": "Optional signature proving authorization for this sub-organization creation. The signature is over the verification token ID and the root user parameters for the root user associated with the verification token. Only required if a public key was provided during the verification step." + } + }, + "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + }, + "v1CreateSubOrganizationRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V8"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateSubOrganizationIntentV8" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateSubOrganizationResult": { + "type": "object", + "properties": { + "subOrganizationId": { + "type": "string" + }, + "rootUserIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["subOrganizationId"] + }, + "v1CreateSubOrganizationResultV3": { + "type": "object", + "properties": { + "subOrganizationId": { + "type": "string" + }, + "privateKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1PrivateKeyResult" + }, + "description": "A list of Private Key IDs and addresses." + }, + "rootUserIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["subOrganizationId", "privateKeys"] + }, + "v1CreateSubOrganizationResultV4": { + "type": "object", + "properties": { + "subOrganizationId": { + "type": "string" + }, + "wallet": { + "$ref": "#/definitions/v1WalletResult" + }, + "rootUserIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["subOrganizationId"] + }, + "v1CreateSubOrganizationResultV5": { + "type": "object", + "properties": { + "subOrganizationId": { + "type": "string" + }, + "wallet": { + "$ref": "#/definitions/v1WalletResult" + }, + "rootUserIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["subOrganizationId"] + }, + "v1CreateSubOrganizationResultV6": { + "type": "object", + "properties": { + "subOrganizationId": { + "type": "string" + }, + "wallet": { + "$ref": "#/definitions/v1WalletResult" + }, + "rootUserIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["subOrganizationId"] + }, + "v1CreateSubOrganizationResultV7": { + "type": "object", + "properties": { + "subOrganizationId": { + "type": "string" + }, + "wallet": { + "$ref": "#/definitions/v1WalletResult" + }, + "rootUserIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["subOrganizationId"] + }, + "v1CreateSubOrganizationResultV8": { + "type": "object", + "properties": { + "subOrganizationId": { + "type": "string" + }, + "wallet": { + "$ref": "#/definitions/v1WalletResult" + }, + "rootUserIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["subOrganizationId"] + }, + "v1CreateSwapQuoteIntent": { + "type": "object", + "properties": { + "signWith": { + "type": "string", + "description": "Wallet account or Private Key address used to price the executable provider quote. Private Key identifiers are not supported." + }, + "inputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the input asset. The chain is derived from this value." + }, + "outputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the output asset." + }, + "inputAmount": { + "type": "string", + "description": "Base-unit amount of the input asset." + }, + "slippageBps": { + "type": "string", + "description": "Provider-neutral maximum allowed slippage in basis points. Turnkey converts this value to each provider's request format. When omitted, each provider applies its default slippage behavior." + } + }, + "required": ["signWith", "inputToken", "outputToken", "inputAmount"] + }, + "v1CreateSwapQuoteIntentV2": { + "type": "object", + "properties": { + "signWith": { + "type": "string", + "description": "Wallet account address used to price the executable provider quote. Private Key identifiers are not supported." + }, + "inputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the input asset. The chain is derived from this value." + }, + "outputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the output asset." + }, + "inputAmount": { + "type": "string", + "description": "Base-unit amount of the input asset." + }, + "slippageBps": { + "type": "string", + "description": "Provider-neutral maximum allowed slippage in basis points. Turnkey converts this value to each provider's request format. When omitted, each provider applies its default slippage behavior." + }, + "destinationAddress": { + "type": "string", + "description": "Raw public address that receives the output asset. Required for cross-protocol swaps. The address must match the output token protocol. Wallet account IDs, private key IDs, and CAIP account or asset identifiers are not supported." + } + }, + "required": ["signWith", "inputToken", "outputToken", "inputAmount"] + }, + "v1CreateSwapQuoteIntentV3": { + "type": "object", + "properties": { + "signWith": { + "type": "string", + "description": "Wallet account address used to price the executable provider quote. Private Key identifiers are not supported." + }, + "inputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the input asset. The chain is derived from this value." + }, + "outputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the output asset." + }, + "inputAmount": { + "type": "string", + "description": "Base-unit amount of the input asset." + }, + "slippageBps": { + "type": "string", + "description": "Provider-neutral maximum allowed slippage in basis points. Turnkey converts this value to each provider's request format. When omitted, each provider applies its default slippage behavior." + }, + "destinationAddress": { + "type": "string", + "description": "Raw public address that receives the output asset. Required for cross-protocol swaps. The address must match the output token protocol. Wallet account IDs, private key IDs, and CAIP account or asset identifiers are not supported." + }, + "feeSponsorship": { + "type": "boolean", + "description": "When true, Turnkey pays the provider fees for this swap and invoices them to the billing parent organization. Requires the FEATURE_NAME_SWAP_FEE_SPONSORSHIP organization feature. Defaults to false." + }, + "fixedRate": { + "type": "boolean", + "description": "When true, requests a 1:1 conversion before fees between supported stablecoins. Requires the FEATURE_NAME_SWAP_FIXED_RATE organization feature. Defaults to false." + } + }, + "required": ["signWith", "inputToken", "outputToken", "inputAmount"] + }, + "v1CreateSwapQuoteRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_SWAP_QUOTE_V3"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateSwapQuoteIntentV3" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateSwapQuoteResult": { + "type": "object", + "properties": { + "quotes": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SwapQuote" + }, + "description": "One or more provider quotes for this request. Today this contains a single Relay quote; pass quotes[i].quoteId to execute_swap_v2 to bind execution." + } + }, + "required": ["quotes"] + }, + "v1CreateSwapQuoteResultV2": { + "type": "object", + "properties": { + "quotes": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SwapQuoteV2" + }, + "description": "One or more provider quotes for this request. Today this contains a single Relay quote; pass quotes[i].quoteId to execute_swap to bind execution." + } + }, + "required": ["quotes"] + }, + "v1CreateTvcAppIntent": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the new TVC application" + }, + "quorumPublicKey": { + "type": "string", + "description": "Quorum public key to use for this application" + }, + "manifestSetId": { + "type": "string", + "description": "Unique identifier for an existing TVC operator set to use as the Manifest Set for this TVC application. If left empty, a new Manifest Set configuration is required" + }, + "manifestSetParams": { + "$ref": "#/definitions/v1TvcOperatorSetParams", + "description": "Configuration to create a new TVC operator set, used as the Manifest Set for this TVC application. If left empty, a Manifest Set ID is required" + }, + "shareSetId": { + "type": "string", + "description": "Unique identifier for an existing TVC operator set to use as the Share Set for this TVC application. If left empty, a new Share Set configuration is required" + }, + "shareSetParams": { + "$ref": "#/definitions/v1TvcOperatorSetParams", + "description": "Configuration to create a new TVC operator set, used as the Share Set for this TVC application. If left empty, a Share Set ID is required" + }, + "enableEgress": { + "type": "boolean", + "description": "Enables network egress for this TVC app. Default if not provided: false." + }, + "enableDebugModeDeployments": { + "type": "boolean", + "description": "When true, this app may create deployments in debug-mode. Debug-mode deployments expose logs and emit zero'd attestation PCRs, so remote attestation cannot succeed. Cannot be changed after app creation. Setting this true means the app's quorum key is considered permanently insecure, and a new app with a fresh quorum key must be created. Default if not provided: false." + } + }, + "required": ["name", "quorumPublicKey"] + }, + "v1CreateTvcAppRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_TVC_APP"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateTvcAppIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateTvcAppResult": { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "The unique identifier for the TVC application" + }, + "manifestSetId": { + "type": "string", + "description": "The unique identifier for the TVC manifest set" + }, + "manifestSetOperatorIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The unique identifier(s) of the manifest set operators" + }, + "manifestSetThreshold": { + "type": "integer", + "format": "int64", + "description": "The required number of approvals for the manifest set" + }, + "shareSetId": { + "type": "string", + "description": "The unique identifier for the TVC share set" + }, + "shareSetOperatorIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The unique identifiers of the share set operators" + }, + "shareSetThreshold": { + "type": "integer", + "format": "int64", + "description": "The required number of approvals for the share set" + } + }, + "required": [ + "appId", + "manifestSetId", + "manifestSetOperatorIds", + "manifestSetThreshold", + "shareSetId", + "shareSetOperatorIds", + "shareSetThreshold" + ] + }, + "v1CreateTvcDeploymentIntent": { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "The unique identifier of the to-be-deployed TVC application" + }, + "qosVersion": { + "type": "string", + "description": "The QuorumOS version to use to deploy this application" + }, + "pivotContainerImageUrl": { + "type": "string", + "description": "URL of the container containing the pivot binary" + }, + "pivotPath": { + "type": "string", + "description": "Location of the binary in the pivot container" + }, + "pivotArgs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Arguments to pass to the pivot binary at startup. Encoded as a list of strings, for example [\"--foo\", \"bar\"]" + }, + "expectedPivotDigest": { + "type": "string", + "description": "Digest of the pivot binary in the pivot container. This value will be inserted in the QOS manifest to ensure application integrity." + }, + "nonce": { + "type": "integer", + "format": "int64", + "description": "Optional nonce to ensure uniqueness of the deployment manifest. If not provided, it defaults to the current Unix timestamp in seconds." + }, + "pivotContainerEncryptedPullSecret": { + "type": "string", + "description": "Optional encrypted pull secret to authorize Turnkey to pull the pivot container image. If your image is public, leave this empty." + }, + "debugMode": { + "type": "boolean", + "description": "Optional flag to indicate whether to deploy the TVC app in debug mode, which includes additional logging and debugging tools. Default is false." + }, + "healthCheckType": { + "$ref": "#/definitions/v1TvcHealthCheckType", + "description": "Health check type (TVC_HEALTH_CHECK_TYPE_HTTP or TVC_HEALTH_CHECK_TYPE_GRPC). HTTP health checks are made with a GET request on /health, and gRPC health checks follow the standard gRPC health checking protocol." + }, + "healthCheckPort": { + "type": "integer", + "format": "int64", + "description": "Port to use for health checks." + }, + "publicIngressPort": { + "type": "integer", + "format": "int64", + "description": "Port to use for public ingress." + }, + "replicas": { + "type": "integer", + "format": "int64", + "description": "Optional desired replica count for this deployment." + }, + "instanceSizeCpus": { + "type": "integer", + "format": "int64", + "description": "Optional desired instance cpu count." + }, + "instanceSizeRam": { + "type": "integer", + "format": "int64", + "description": "Optional desired instance memory size in GiB." + } + }, + "required": [ + "appId", + "qosVersion", + "pivotContainerImageUrl", + "pivotPath", + "pivotArgs", + "expectedPivotDigest", + "healthCheckType", + "healthCheckPort", + "publicIngressPort" + ] + }, + "v1CreateTvcDeploymentRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateTvcDeploymentIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateTvcDeploymentResult": { + "type": "object", + "properties": { + "deploymentId": { + "type": "string", + "description": "The unique identifier for the TVC deployment" + }, + "manifestId": { + "type": "string", + "description": "The unique identifier for the TVC manifest" + } + }, + "required": ["deploymentId", "manifestId"] + }, + "v1CreateTvcManifestApprovalsIntent": { + "type": "object", + "properties": { + "manifestId": { + "type": "string", + "description": "Unique identifier of the TVC deployment to approve" + }, + "approvals": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1TvcManifestApproval" + }, + "description": "List of manifest approvals" + } + }, + "required": ["manifestId", "approvals"] + }, + "v1CreateTvcManifestApprovalsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateTvcManifestApprovalsIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateTvcManifestApprovalsResult": { + "type": "object", + "properties": { + "approvalIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The unique identifier(s) for the manifest approvals" + } + }, + "required": ["approvalIds"] + }, + "v1CreateTvcOperatorIntent": { + "type": "object", + "properties": { + "walletName": { + "type": "string", + "description": "Human-readable name for a new wallet created for this TVC operator" + }, + "walletId": { + "type": "string", + "description": "Unique identifier for an existing wallet to reuse for this TVC operator" + }, + "path": { + "type": "string", + "description": "Base derivation path for creating TVC operator wallet accounts" + }, + "operatorName": { + "type": "string", + "description": "Human-readable name for this new TVC operator" + } + }, + "required": ["path", "operatorName"] + }, + "v1CreateTvcOperatorRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_TVC_OPERATOR"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateTvcOperatorIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateTvcOperatorResult": { + "type": "object", + "properties": { + "walletId": { + "type": "string", + "description": "The unique identifier for the wallet containing TVC operator accounts" + }, + "operatorId": { + "type": "string", + "description": "The unique identifier for the TVC operator" + }, + "encryptPublicKey": { + "type": "string", + "description": "Public encryption key for this TVC operator" + }, + "signPublicKey": { + "type": "string", + "description": "Public signing key for this TVC operator" + } + }, + "required": [ + "walletId", + "operatorId", + "encryptPublicKey", + "signPublicKey" + ] + }, + "v1CreateTvcQuorumKeyIntent": { + "type": "object", + "properties": { + "threshold": { + "type": "integer", + "format": "int64", + "description": "The threshold of operators needed to reassemble this TVC quorum key" + }, + "operatorEncryptKeys": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Operator public keys used to encrypt and later approve the generated TVC quorum key shares" + } + }, + "required": ["threshold", "operatorEncryptKeys"] + }, + "v1CreateTvcQuorumKeyRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_TVC_QUORUM_KEY"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateTvcQuorumKeyIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateTvcQuorumKeyResult": { + "type": "object", + "properties": { + "quorumKeyId": { + "type": "string", + "description": "The unique identifier for the TVC quorum key" + }, + "quorumPublicKey": { + "type": "string", + "description": "Public key for the generated TVC quorum key" + }, + "shareIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The unique identifier(s) for the generated TVC quorum key shares" + } + }, + "required": ["quorumKeyId", "quorumPublicKey", "shareIds"] + }, + "v1CreateUserTagIntent": { + "type": "object", + "properties": { + "userTagName": { + "type": "string", + "description": "Human-readable name for a User Tag." + }, + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User IDs." + } + }, + "required": ["userTagName", "userIds"] + }, + "v1CreateUserTagRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_USER_TAG"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateUserTagIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateUserTagResult": { + "type": "object", + "properties": { + "userTagId": { + "type": "string", + "description": "Unique identifier for a given User Tag." + }, + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User IDs." + } + }, + "required": ["userTagId", "userIds"] + }, + "v1CreateUsersIntent": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1UserParams" + }, + "description": "A list of Users." + } + }, + "required": ["users"] + }, + "v1CreateUsersIntentV2": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1UserParamsV2" + }, + "description": "A list of Users." + } + }, + "required": ["users"] + }, + "v1CreateUsersIntentV3": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1UserParamsV3" + }, + "description": "A list of Users." + } + }, + "required": ["users"] + }, + "v1CreateUsersIntentV4": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1UserParamsV4" + }, + "description": "A list of Users." + } + }, + "required": ["users"] + }, + "v1CreateUsersRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_USERS_V4"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateUsersIntentV4" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateUsersResult": { + "type": "object", + "properties": { + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User IDs." + } + }, + "required": ["userIds"] + }, + "v1CreateVelocityControlIntent": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable name for the Velocity Control." + }, + "dataSource": { + "$ref": "#/definitions/v1VelocityControlDataSource", + "description": "Data source for the Velocity Control." + }, + "aggregation": { + "$ref": "#/definitions/v1VelocityControlAggregation", + "description": "Aggregation expression that the Velocity Control evaluates." + }, + "identifier": { + "type": "string", + "description": "Identifier for the Velocity Control. Policies reference it as `controls.\u003cidentifier\u003e`. It must be unique within the Organization." + } + }, + "required": ["name", "dataSource", "aggregation", "identifier"] + }, + "v1CreateVelocityControlResult": { + "type": "object", + "properties": { + "velocityControlId": { + "type": "string" + } + }, + "required": ["velocityControlId"] + }, + "v1CreateWalletAccountsIntent": { + "type": "object", + "properties": { + "walletId": { + "type": "string", + "description": "Unique identifier for a given Wallet." + }, + "accounts": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1WalletAccountParams" + }, + "description": "A list of wallet Accounts." + }, + "persist": { + "type": "boolean", + "description": "Indicates if the wallet accounts should be persisted. This is helpful if you'd like to see the addresses of different derivation paths without actually creating the accounts. Defaults to true." + } + }, + "required": ["walletId", "accounts"] + }, + "v1CreateWalletAccountsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateWalletAccountsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateWalletAccountsResult": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of derived addresses." + } + }, + "required": ["addresses"] + }, + "v1CreateWalletIntent": { + "type": "object", + "properties": { + "walletName": { + "type": "string", + "description": "Human-readable name for a Wallet." + }, + "accounts": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1WalletAccountParams" + }, + "description": "A list of wallet Accounts. This field, if not needed, should be an empty array in your request body." + }, + "mnemonicLength": { + "type": "integer", + "format": "int32", + "description": "Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24." + } + }, + "required": ["walletName", "accounts"] + }, + "v1CreateWalletRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_WALLET"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateWalletIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateWalletResult": { + "type": "object", + "properties": { + "walletId": { + "type": "string", + "description": "Unique identifier for a Wallet." + }, + "addresses": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of account addresses." + } + }, + "required": ["walletId", "addresses"] + }, + "v1CreateWebhookEndpointIntent": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The destination URL for webhook delivery." + }, + "name": { + "type": "string", + "description": "Human-readable name for this webhook endpoint." + }, + "subscriptions": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1WebhookSubscriptionParams" + }, + "description": "Event subscriptions to create for this endpoint." + } + }, + "required": ["url", "name"] + }, + "v1CreateWebhookEndpointRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_CREATE_WEBHOOK_ENDPOINT"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1CreateWebhookEndpointIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1CreateWebhookEndpointResult": { + "type": "object", + "properties": { + "endpointId": { + "type": "string", + "description": "Unique identifier of the created webhook endpoint." + }, + "webhookEndpoint": { + "$ref": "#/definitions/v1WebhookEndpointData", + "description": "The created webhook endpoint data." + } + }, + "required": ["endpointId", "webhookEndpoint"] + }, + "v1CredPropsAuthenticationExtensionsClientOutputs": { + "type": "object", + "properties": { + "rk": { + "type": "boolean" + } + }, + "required": ["rk"] + }, + "v1CredentialType": { + "type": "string", + "enum": [ + "CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR", + "CREDENTIAL_TYPE_API_KEY_P256", + "CREDENTIAL_TYPE_RECOVER_USER_KEY_P256", + "CREDENTIAL_TYPE_API_KEY_SECP256K1", + "CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256", + "CREDENTIAL_TYPE_API_KEY_ED25519", + "CREDENTIAL_TYPE_OTP_AUTH_KEY_P256", + "CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256", + "CREDENTIAL_TYPE_OAUTH_KEY_P256", + "CREDENTIAL_TYPE_LOGIN" + ] + }, + "v1Curve": { + "type": "string", + "enum": ["CURVE_SECP256K1", "CURVE_ED25519", "CURVE_P256"] + }, + "v1CustomRevertError": { + "type": "object", + "properties": { + "errorName": { + "type": "string", + "description": "The name of the custom error." + }, + "paramsJson": { + "type": "string", + "description": "The decoded parameters as a JSON object." + } + } + }, + "v1DeleteApiKeysIntent": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + }, + "apiKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of API Key IDs." + } + }, + "required": ["userId", "apiKeyIds"] + }, + "v1DeleteApiKeysRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_API_KEYS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteApiKeysIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteApiKeysResult": { + "type": "object", + "properties": { + "apiKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of API Key IDs." + } + }, + "required": ["apiKeyIds"] + }, + "v1DeleteAuthenticatorsIntent": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "Unique identifier for a given User." + }, + "authenticatorIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Authenticator IDs." + } + }, + "required": ["userId", "authenticatorIds"] + }, + "v1DeleteAuthenticatorsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_AUTHENTICATORS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteAuthenticatorsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteAuthenticatorsResult": { + "type": "object", + "properties": { + "authenticatorIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Unique identifier for a given Authenticator." + } + }, + "required": ["authenticatorIds"] + }, + "v1DeleteFiatOnRampCredentialIntent": { + "type": "object", + "properties": { + "fiatOnrampCredentialId": { + "type": "string", + "description": "The ID of the fiat on-ramp credential to delete" + } + }, + "required": ["fiatOnrampCredentialId"] + }, + "v1DeleteFiatOnRampCredentialRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteFiatOnRampCredentialIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteFiatOnRampCredentialResult": { + "type": "object", + "properties": { + "fiatOnRampCredentialId": { + "type": "string", + "description": "Unique identifier of the Fiat On-Ramp credential that was deleted" + } + }, + "required": ["fiatOnRampCredentialId"] + }, + "v1DeleteInvitationIntent": { + "type": "object", + "properties": { + "invitationId": { + "type": "string", + "description": "Unique identifier for a given Invitation object." + } + }, + "required": ["invitationId"] + }, + "v1DeleteInvitationRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_INVITATION"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteInvitationIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteInvitationResult": { + "type": "object", + "properties": { + "invitationId": { + "type": "string", + "description": "Unique identifier for a given Invitation." + } + }, + "required": ["invitationId"] + }, + "v1DeleteMfaPolicyIntent": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "The ID of the User to delete the MFA Policy from." + }, + "mfaPolicyId": { + "type": "string", + "description": "Unique identifier for a given MFA Policy." + } + }, + "required": ["userId", "mfaPolicyId"] + }, + "v1DeleteMfaPolicyRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_MFA_POLICY"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteMfaPolicyIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteMfaPolicyResult": { + "type": "object", + "properties": { + "mfaPolicyId": { + "type": "string", + "description": "Unique identifier for a given MFA Policy." + } + }, + "required": ["mfaPolicyId"] + }, + "v1DeleteOauth2CredentialIntent": { + "type": "object", + "properties": { + "oauth2CredentialId": { + "type": "string", + "description": "The ID of the OAuth 2.0 credential to delete" + } + }, + "required": ["oauth2CredentialId"] + }, + "v1DeleteOauth2CredentialRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteOauth2CredentialIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteOauth2CredentialResult": { + "type": "object", + "properties": { + "oauth2CredentialId": { + "type": "string", + "description": "Unique identifier of the OAuth 2.0 credential that was deleted" + } + }, + "required": ["oauth2CredentialId"] + }, + "v1DeleteOauthProvidersIntent": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "The ID of the User to remove an Oauth provider from" + }, + "providerIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Unique identifier for a given Provider." + } + }, + "required": ["userId", "providerIds"] + }, + "v1DeleteOauthProvidersRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteOauthProvidersIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteOauthProvidersResult": { + "type": "object", + "properties": { + "providerIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of unique identifiers for Oauth Providers" + } + }, + "required": ["providerIds"] + }, + "v1DeleteOrganizationIntent": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] + }, + "v1DeleteOrganizationResult": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] + }, + "v1DeletePoliciesIntent": { + "type": "object", + "properties": { + "policyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of unique identifiers for policies within an organization" + } + }, + "required": ["policyIds"] + }, + "v1DeletePoliciesRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_POLICIES"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeletePoliciesIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeletePoliciesResult": { + "type": "object", + "properties": { + "policyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of unique identifiers for the deleted policies." + } + }, + "required": ["policyIds"] + }, + "v1DeletePolicyIntent": { + "type": "object", + "properties": { + "policyId": { + "type": "string", + "description": "Unique identifier for a given Policy." + } + }, + "required": ["policyId"] + }, + "v1DeletePolicyRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_POLICY"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeletePolicyIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeletePolicyResult": { + "type": "object", + "properties": { + "policyId": { + "type": "string", + "description": "Unique identifier for a given Policy." + } + }, + "required": ["policyId"] + }, + "v1DeletePrivateKeyTagsIntent": { + "type": "object", + "properties": { + "privateKeyTagIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Private Key Tag IDs." + } + }, + "required": ["privateKeyTagIds"] + }, + "v1DeletePrivateKeyTagsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeletePrivateKeyTagsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeletePrivateKeyTagsResult": { + "type": "object", + "properties": { + "privateKeyTagIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Private Key Tag IDs." + }, + "privateKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Private Key IDs." + } + }, + "required": ["privateKeyTagIds", "privateKeyIds"] + }, + "v1DeletePrivateKeysIntent": { + "type": "object", + "properties": { + "privateKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of unique identifiers for private keys within an organization" + }, + "deleteWithoutExport": { + "type": "boolean", + "description": "Optional parameter for deleting the private keys, even if any have not been previously exported. If they have been exported, this field is ignored." + } + }, + "required": ["privateKeyIds"] + }, + "v1DeletePrivateKeysRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_PRIVATE_KEYS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeletePrivateKeysIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeletePrivateKeysResult": { + "type": "object", + "properties": { + "privateKeyIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of private key unique identifiers that were removed" + } + }, + "required": ["privateKeyIds"] + }, + "v1DeleteSecretsIntent": { + "type": "object", + "properties": { + "secretIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Unique identifiers of the secrets to delete. Must contain between 1 and 32 distinct UUIDs. All secrets must belong to the organization." + } + }, + "required": ["secretIds"] + }, + "v1DeleteSecretsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_SECRETS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteSecretsIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteSecretsResult": { + "type": "object", + "properties": { + "secretIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Unique identifiers of the deleted secrets, in the order requested." + } + }, + "required": ["secretIds"] + }, + "v1DeleteSmartContractInterfaceIntent": { + "type": "object", + "properties": { + "smartContractInterfaceId": { + "type": "string", + "description": "The ID of a Smart Contract Interface intended for deletion." + } + }, + "required": ["smartContractInterfaceId"] + }, + "v1DeleteSmartContractInterfaceRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteSmartContractInterfaceIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteSmartContractInterfaceResult": { + "type": "object", + "properties": { + "smartContractInterfaceId": { + "type": "string", + "description": "The ID of the deleted Smart Contract Interface." + } + }, + "required": ["smartContractInterfaceId"] + }, + "v1DeleteSubOrganizationIntent": { + "type": "object", + "properties": { + "deleteWithoutExport": { + "type": "boolean", + "description": "Sub-organization deletion, by default, requires associated wallets and private keys to be exported for security reasons. Set this boolean to true to force sub-organization deletion even if some wallets or private keys within it have not been exported yet. Default: false." + } + } + }, + "v1DeleteSubOrganizationRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteSubOrganizationIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteSubOrganizationResult": { + "type": "object", + "properties": { + "subOrganizationUuid": { + "type": "string", + "description": "Unique identifier of the sub organization that was removed" + } + }, + "required": ["subOrganizationUuid"] + }, + "v1DeleteTvcAppAndDeploymentsIntent": { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "The unique identifier of the TVC app to delete. The app and all associated deployments will be removed." + } + }, + "required": ["appId"] + }, + "v1DeleteTvcAppAndDeploymentsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_TVC_APP_AND_DEPLOYMENTS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteTvcAppAndDeploymentsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteTvcAppAndDeploymentsResult": { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "The unique identifier of the deleted TVC app." + } + }, + "required": ["appId"] + }, + "v1DeleteTvcDeploymentIntent": { + "type": "object", + "properties": { + "deploymentId": { + "type": "string", + "description": "The unique identifier of the TVC deployment to delete." + } + }, + "required": ["deploymentId"] + }, + "v1DeleteTvcDeploymentRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_TVC_DEPLOYMENT"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteTvcDeploymentIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteTvcDeploymentResult": { + "type": "object", + "properties": { + "deploymentId": { + "type": "string", + "description": "The unique identifier of the deleted TVC deployment." + } + }, + "required": ["deploymentId"] + }, + "v1DeleteUserTagsIntent": { + "type": "object", + "properties": { + "userTagIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User Tag IDs." + } + }, + "required": ["userTagIds"] + }, + "v1DeleteUserTagsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_USER_TAGS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteUserTagsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteUserTagsResult": { + "type": "object", + "properties": { + "userTagIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User Tag IDs." + }, + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User IDs." + } + }, + "required": ["userTagIds", "userIds"] + }, + "v1DeleteUsersIntent": { + "type": "object", + "properties": { + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User IDs." + } + }, + "required": ["userIds"] + }, + "v1DeleteUsersRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_USERS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteUsersIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteUsersResult": { + "type": "object", + "properties": { + "userIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User IDs." + } + }, + "required": ["userIds"] + }, + "v1DeleteVelocityControlsIntent": { + "type": "object", + "properties": { + "velocityControlIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of 1 to 32 unique identifiers for Velocity Controls within an Organization." + } + }, + "required": ["velocityControlIds"] + }, + "v1DeleteVelocityControlsResult": { + "type": "object", + "properties": { + "velocityControlIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of unique identifiers for the deleted Velocity Controls." + } + }, + "required": ["velocityControlIds"] + }, + "v1DeleteWalletAccountsIntent": { + "type": "object", + "properties": { + "walletAccountIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of unique identifiers for wallet accounts within an organization" + }, + "deleteWithoutExport": { + "type": "boolean", + "description": "Optional parameter for deleting the wallet accounts, even if any have not been previously exported. If they have been exported, this field is ignored." + } + }, + "required": ["walletAccountIds"] + }, + "v1DeleteWalletAccountsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteWalletAccountsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteWalletAccountsResult": { + "type": "object", + "properties": { + "walletAccountIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of wallet account unique identifiers that were removed" + } + }, + "required": ["walletAccountIds"] + }, + "v1DeleteWalletsIntent": { + "type": "object", + "properties": { + "walletIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of unique identifiers for wallets within an organization" + }, + "deleteWithoutExport": { + "type": "boolean", + "description": "Optional parameter for deleting the wallets, even if any have not been previously exported. If they have been exported, this field is ignored." + } + }, + "required": ["walletIds"] + }, + "v1DeleteWalletsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_WALLETS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteWalletsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteWalletsResult": { + "type": "object", + "properties": { + "walletIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of wallet unique identifiers that were removed" + } + }, + "required": ["walletIds"] + }, + "v1DeleteWebhookEndpointIntent": { + "type": "object", + "properties": { + "endpointId": { + "type": "string", + "description": "Unique identifier of the webhook endpoint to delete." + } + }, + "required": ["endpointId"] + }, + "v1DeleteWebhookEndpointRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_DELETE_WEBHOOK_ENDPOINT"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1DeleteWebhookEndpointIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1DeleteWebhookEndpointResult": { + "type": "object", + "properties": { + "endpointId": { + "type": "string", + "description": "Unique identifier of the deleted webhook endpoint." + } + }, + "required": ["endpointId"] + }, + "v1DeploymentStatus": { + "type": "object", + "properties": { + "deploymentId": { + "type": "string", + "description": "Unique identifier for this deployment (corresponds to k8s deployment label)" + }, + "readyReplicas": { + "type": "integer", + "format": "int32", + "description": "Number of ready replicas" + }, + "desiredReplicas": { + "type": "integer", + "format": "int32", + "description": "Desired number of replicas" + }, + "lastUpdatedTime": { + "$ref": "#/definitions/externaldatav1Timestamp", + "description": "Last time this deployment was updated" + }, + "provisioningState": { + "$ref": "#/definitions/v1ProvisioningState", + "description": "Current quorum-key provisioning state for this deployment" + } + }, + "required": [ + "deploymentId", + "readyReplicas", + "desiredReplicas", + "lastUpdatedTime", + "provisioningState" + ] + }, + "v1DisableAuthProxyIntent": { + "type": "object" + }, + "v1DisableAuthProxyResult": { + "type": "object" + }, + "v1DisablePrivateKeyIntent": { + "type": "object", + "properties": { + "privateKeyId": { + "type": "string", + "description": "Unique identifier for a given Private Key." + } + }, + "required": ["privateKeyId"] + }, + "v1DisablePrivateKeyResult": { + "type": "object", + "properties": { + "privateKeyId": { + "type": "string", + "description": "Unique identifier for a given Private Key." + } + }, + "required": ["privateKeyId"] + }, + "v1EarnClaimRewardsIntent": { + "type": "object", + "properties": { + "signWith": { + "type": "string", + "description": "A Turnkey-managed wallet address the rewards are attributed to. The claim transaction is signed by this wallet and the Merkl Distributor transfers every reward token to it." + }, + "caip2": { + "type": "string", + "description": "CAIP-2 chain to claim rewards on (e.g. 'eip155:8453'). Rewards accrue per chain; see ListEarnRewards." + }, + "sponsor": { + "type": "boolean", + "description": "Whether to sponsor this transaction via Gas Station." + } + }, + "required": ["signWith", "caip2"] + }, + "v1EarnClaimRewardsRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_EARN_CLAIM_REWARDS"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1EarnClaimRewardsIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1EarnClaimRewardsResult": { + "type": "object", + "properties": { + "claimRequestId": { + "type": "string", + "description": "Identifier to poll claim status and tx hash via GetEarnClaimRewardsStatus." + } + }, + "required": ["claimRequestId"] + }, + "v1EarnDeployWrapperIntent": { + "type": "object", + "properties": { + "vaultAddress": { + "type": "string", + "description": "Address of the underlying yield vault to wrap (from the ListEarnVaults catalog)." + }, + "caip2": { + "type": "string", + "enum": [ + "eip155:1", + "eip155:8453", + "eip155:42161", + "eip155:137", + "eip155:56", + "eip155:4217", + "solana:mainnet", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", + "solana:devnet", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" + ], + "description": "CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." + }, + "clientFeeBps": { + "type": "string", + "description": "Your fee on gross yield, in basis points (e.g., '2000' for 20%). Maximum is 4000 (40%)." + }, + "clientFeeWallet": { + "type": "string", + "description": "The wallet address that receives the client's fee payouts on-chain. Must be a Turnkey-managed wallet address." + } + }, + "required": ["vaultAddress", "caip2", "clientFeeBps", "clientFeeWallet"] + }, + "v1EarnDeployWrapperRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_EARN_DEPLOY_WRAPPER"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1EarnDeployWrapperIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1EarnDeployWrapperResult": { + "type": "object", + "properties": { + "wrapperAddress": { + "type": "string", + "description": "Address of the deployed fee wrapper (the deposit target)." + }, + "splitterAddress": { + "type": "string", + "description": "Address of the deployed fee splitter (PaymentSplitter for Morpho, RevenueSplitterOwner for Aave)." + }, + "deployRequestId": { + "type": "string", + "description": "Identifier to poll deploy status." + } + }, + "required": ["wrapperAddress", "splitterAddress", "deployRequestId"] + }, + "v1EarnDepositIntent": { + "type": "object", + "properties": { + "wrapperAddress": { + "type": "string", + "description": "Address of the deployed Earn wrapper to deposit into, from ListEarnVaults/ListEarnPositions. Must be one of the org's deployed wrappers." + }, + "signWith": { + "type": "string", + "description": "A Wallet account address or Private Key address to deposit from and sign with. Must be an on-chain address; Private Key identifiers are not supported." + }, + "assets": { + "type": "string", + "description": "Amount of the underlying asset to deposit, in raw on-chain units (e.g., '1000000' for 1 USDC at 6 decimals)." + }, + "caip2": { + "type": "string", + "enum": [ + "eip155:1", + "eip155:8453", + "eip155:42161", + "eip155:137", + "eip155:56", + "eip155:4217", + "solana:mainnet", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", + "solana:devnet", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" + ], + "description": "CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." + }, + "sponsor": { + "type": "boolean", + "description": "Whether to sponsor this transaction via Gas Station." + } + }, + "required": ["wrapperAddress", "signWith", "assets", "caip2"] + }, + "v1EarnDepositRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_EARN_DEPOSIT"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1EarnDepositIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1EarnDepositResult": { + "type": "object", + "properties": { + "depositRequestId": { + "type": "string", + "description": "Identifier to poll deposit status and tx hash via GetEarnDepositStatus." + } + }, + "required": ["depositRequestId"] + }, + "v1EarnEnabledVault": { + "type": "object", + "properties": { + "vaultAddress": { + "type": "string", + "description": "Address of the underlying yield vault." + }, + "wrapperAddress": { + "type": "string", + "description": "Address of the deployed fee wrapper (the deposit target)." + }, + "provider": { + "$ref": "#/definitions/v1EarnProvider", + "description": "Yield provider for the vault." + }, + "caip19": { + "type": "string", + "description": "CAIP-19 asset ID of the vault's underlying asset (e.g. 'eip155:8453/erc20:0x833589...'); the chain is encoded in the identifier." + }, + "apyPct": { + "type": "string", + "description": "Gross annual percentage yield, expressed as a decimal fraction (before fees)." + }, + "totalDeposited": { + "type": "string", + "description": "Total deposited through this wrapper (wrapper TVL), in raw on-chain units of the underlying asset." + }, + "display": { + "$ref": "#/definitions/v1EarnValueDisplay", + "description": "Normalized total-deposited values for display only (usd + crypto). Do not do arithmetic with these; use total_deposited instead." + }, + "netApyPct": { + "type": "string", + "description": "Annual percentage yield net of fees, expressed as a decimal fraction." + }, + "clientFeeBps": { + "type": "string", + "description": "Client fee taken on yield, in basis points." + }, + "depositsDisabled": { + "type": "boolean", + "description": "When true, deposits to this wrapper are rejected; withdrawals are unaffected. Toggled via EarnSetWrapperState." + }, + "name": { + "type": "string", + "description": "Human-readable vault name from the provider (e.g. 'Steakhouse Prime USDC' for Morpho; the reserve symbol for Aave)." + }, + "curator": { + "type": "string", + "description": "Vault curator name(s), comma-separated when a vault has multiple. Empty for providers without curators (e.g. Aave)." + }, + "claimableClientFee": { + "type": "string", + "description": "The client's claimable fee (releasable now), in raw on-chain units of the underlying asset (the caip19 asset). Turnkey's fee is excluded. Only returned to the parent org; unset when a sub-org queries." + }, + "claimableClientFeeDisplay": { + "$ref": "#/definitions/v1EarnValueDisplay", + "description": "Normalized claimable_client_fee for display only (usd + crypto). Do not do arithmetic with these; use claimable_client_fee. Unset when a sub-org queries." + }, + "clientFeeWallet": { + "type": "string", + "description": "The wallet address that receives the client's fee payouts on-chain. Unset when a sub-org queries." + }, + "liquidity": { + "type": "string", + "description": "Assets currently withdrawable from the underlying vault without a reallocation, in raw on-chain units of the underlying asset. This is the vault's liquidity, not the wrapper's balance. Empty when the provider does not report it." + }, + "liquidityDisplay": { + "$ref": "#/definitions/v1EarnValueDisplay", + "description": "Normalized liquidity values for display purposes only (usd + crypto). Do not do arithmetic with these; use liquidity instead." + }, + "exposures": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1EarnVaultExposure" + }, + "description": "The underlying markets the vault allocates into, ranked by supplied amount descending. Only populated when the request sets include_exposure, and only for providers that expose an allocation breakdown (Morpho)." + }, + "forceDeallocatableLiquidity": { + "type": "string", + "description": "Additional assets withdrawable from the underlying vault by force-deallocating its non-liquidity adapters at zero penalty, in raw on-chain units of the underlying asset. Additive to liquidity. Empty when the provider does not report it." + }, + "forceDeallocatableLiquidityDisplay": { + "$ref": "#/definitions/v1EarnValueDisplay", + "description": "Normalized force-deallocatable liquidity values for display purposes only (usd + crypto). Do not do arithmetic with these; use force_deallocatable_liquidity instead." + }, + "deployStatus": { + "type": "string", + "description": "On-chain status of the wrapper deployment: PENDING, COMPLETED, or FAILED. Only a COMPLETED wrapper is usable. Empty when no deploy is recorded for the wrapper." + }, + "deployRequestId": { + "type": "string", + "description": "Request id of the wrapper's most recent deploy, for polling GetEarnDeployStatus. Empty when no deploy is recorded." + }, + "deployError": { + "type": "string", + "description": "Failure detail when deploy_status is FAILED." + } + } + }, + "v1EarnPosition": { + "type": "object", + "properties": { + "vaultAddress": { + "type": "string", + "description": "Address of the underlying yield vault." + }, + "wrapperAddress": { + "type": "string", + "description": "Address of the fee wrapper holding the position." + }, + "provider": { + "$ref": "#/definitions/v1EarnProvider", + "description": "Yield provider for the vault." + }, + "caip19": { + "type": "string", + "description": "CAIP-19 asset ID of the vault's underlying asset (e.g. 'eip155:8453/erc20:0x833589...'); the chain is encoded in the identifier." + }, + "currentValue": { + "type": "string", + "description": "Current value of the position in the underlying asset, in raw on-chain units (already net of the wrapper fee)." + }, + "totalDeposited": { + "type": "string", + "description": "Lifetime total deposited into this position, in raw on-chain units." + }, + "totalWithdrawn": { + "type": "string", + "description": "Lifetime total withdrawn from this position, in raw on-chain units." + }, + "display": { + "$ref": "#/definitions/v1EarnPositionDisplay", + "description": "USD + crypto renderings for display only. Do not do arithmetic with these." + }, + "depositsDisabled": { + "type": "boolean", + "description": "When true, deposits to this wrapper are rejected; withdrawals are unaffected. Toggled via EarnSetWrapperState." + } + } + }, + "v1EarnPositionDisplay": { + "type": "object", + "properties": { + "currentValueUsd": { + "type": "string", + "description": "Current value in USD, for display only." + }, + "totalDepositedUsd": { + "type": "string", + "description": "Total deposited in USD, for display only." + }, + "totalWithdrawnUsd": { + "type": "string", + "description": "Total withdrawn in USD, for display only." + }, + "currentValueCrypto": { + "type": "string", + "description": "Current value in the asset's own units, for display only." + }, + "totalDepositedCrypto": { + "type": "string", + "description": "Total deposited in the asset's own units, for display only." + }, + "totalWithdrawnCrypto": { + "type": "string", + "description": "Total withdrawn in the asset's own units, for display only." + } + } + }, + "v1EarnProvider": { + "type": "string", + "enum": [ + "EARN_PROVIDER_MORPHO", + "EARN_PROVIDER_AAVE", + "EARN_PROVIDER_KAMINO" + ] + }, + "v1EarnReward": { + "type": "object", + "properties": { + "caip2": { + "type": "string", + "description": "CAIP-2 chain the reward is claimable on (e.g. 'eip155:8453')." + }, + "caip19": { + "type": "string", + "description": "CAIP-19 asset ID of the reward token (e.g. 'eip155:8453/erc20:0xBAa5...'). Reward tokens are campaign-specific and unrelated to the position's underlying asset." + }, + "symbol": { + "type": "string", + "description": "Symbol of the reward token (e.g. 'MORPHO'), as reported by Merkl." + }, + "decimals": { + "type": "integer", + "format": "int32", + "description": "Decimals of the reward token." + }, + "claimable": { + "type": "string", + "description": "Amount claimable now, in raw on-chain units of the reward token." + }, + "claimed": { + "type": "string", + "description": "Lifetime amount already claimed, in raw on-chain units of the reward token." + }, + "pending": { + "type": "string", + "description": "Amount accrued but not yet claimable (not yet in a live on-chain merkle root; roots update roughly every 8 hours), in raw on-chain units of the reward token." + }, + "display": { + "$ref": "#/definitions/v1EarnRewardDisplay", + "description": "USD + crypto renderings for display only. Do not do arithmetic with these." + } + } + }, + "v1EarnRewardDisplay": { + "type": "object", + "properties": { + "claimableUsd": { + "type": "string", + "description": "Claimable amount in USD, for display only. Empty when the token is unpriced." + }, + "claimableCrypto": { + "type": "string", + "description": "Claimable amount in the reward token's own units, for display only." + }, + "claimedUsd": { + "type": "string", + "description": "Lifetime claimed amount in USD, for display only. Empty when the token is unpriced." + }, + "claimedCrypto": { + "type": "string", + "description": "Lifetime claimed amount in the reward token's own units, for display only." + }, + "pendingUsd": { + "type": "string", + "description": "Pending amount in USD, for display only. Empty when the token is unpriced." + }, + "pendingCrypto": { + "type": "string", + "description": "Pending amount in the reward token's own units, for display only." + } + } + }, + "v1EarnSetWrapperStateIntent": { + "type": "object", + "properties": { + "wrapperAddress": { + "type": "string", + "description": "Address of the deployed Earn wrapper to update, from ListEarnVaults/ListEarnPositions. Must be one of the org's deployed wrappers." + }, + "depositsDisabled": { + "type": "boolean", + "description": "When true, deposits to this wrapper are rejected; withdrawals are unaffected. Set to false to re-enable deposits." + } + }, + "required": ["wrapperAddress", "depositsDisabled"] + }, + "v1EarnSetWrapperStateRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_EARN_SET_WRAPPER_STATE"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1EarnSetWrapperStateIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1EarnSetWrapperStateResult": { + "type": "object", + "properties": { + "wrapperAddress": { + "type": "string", + "description": "Address of the updated Earn wrapper." + }, + "depositsDisabled": { + "type": "boolean", + "description": "The wrapper's deposit state after this activity." + } + }, + "required": ["wrapperAddress", "depositsDisabled"] + }, + "v1EarnValueDisplay": { + "type": "object", + "properties": { + "usd": { + "type": "string", + "description": "USD value, for display only." + }, + "crypto": { + "type": "string", + "description": "Normalized amount in the asset's own units, for display only." + } + } + }, + "v1EarnVault": { + "type": "object", + "properties": { + "vaultAddress": { + "type": "string", + "description": "Address of the underlying yield vault." + }, + "provider": { + "$ref": "#/definitions/v1EarnProvider", + "description": "Yield provider for the vault." + }, + "caip19": { + "type": "string", + "description": "CAIP-19 asset ID of the vault's underlying asset (e.g. 'eip155:8453/erc20:0x833589...'); the chain is encoded in the identifier." + }, + "tvl": { + "type": "string", + "description": "Total value locked in the vault, in raw on-chain units of the underlying asset. The catalog is sorted by the USD value of this." + }, + "apyPct": { + "type": "string", + "description": "Current annual percentage yield, expressed as a decimal fraction (e.g., '0.0812' for 8.12%)." + }, + "enabled": { + "type": "boolean", + "description": "Whether the organization has enabled this vault." + }, + "display": { + "$ref": "#/definitions/v1EarnValueDisplay", + "description": "Normalized TVL values for display purposes only (usd + crypto). Do not do arithmetic with these; use tvl instead." + }, + "name": { + "type": "string", + "description": "Human-readable vault name from the provider (e.g. 'Steakhouse Prime USDC' for Morpho; the reserve symbol for Aave)." + }, + "curator": { + "type": "string", + "description": "Vault curator name(s), comma-separated when a vault has multiple. Empty for providers without curators (e.g. Aave)." + }, + "liquidity": { + "type": "string", + "description": "Assets currently withdrawable from the vault without a reallocation, in raw on-chain units of the underlying asset. Empty when the provider does not report it." + }, + "liquidityDisplay": { + "$ref": "#/definitions/v1EarnValueDisplay", + "description": "Normalized liquidity values for display purposes only (usd + crypto). Do not do arithmetic with these; use liquidity instead." + }, + "forceDeallocatableLiquidity": { + "type": "string", + "description": "Additional assets withdrawable from the vault by force-deallocating its non-liquidity adapters at zero penalty, in raw on-chain units of the underlying asset. Additive to liquidity. Empty when the provider does not report it." + }, + "forceDeallocatableLiquidityDisplay": { + "$ref": "#/definitions/v1EarnValueDisplay", + "description": "Normalized force-deallocatable liquidity values for display purposes only (usd + crypto). Do not do arithmetic with these; use force_deallocatable_liquidity instead." + } + } + }, + "v1EarnVaultExposure": { + "type": "object", + "properties": { + "marketId": { + "type": "string", + "description": "Provider-specific identifier for the market (the Morpho Blue market id)." + }, + "collateralSymbol": { + "type": "string", + "description": "Symbol of the market's collateral asset (e.g. 'cbBTC'). Empty for an idle/uncollateralized market." + }, + "collateralCaip19": { + "type": "string", + "description": "CAIP-19 asset ID of the market's collateral asset. Empty for an idle/uncollateralized market." + }, + "lltvPct": { + "type": "string", + "description": "The market's liquidation loan-to-value, expressed as a decimal fraction (e.g. '0.86' for 86%)." + }, + "supplied": { + "type": "string", + "description": "Assets the vault supplies to this market, in raw on-chain units of the underlying asset." + }, + "display": { + "$ref": "#/definitions/v1EarnValueDisplay", + "description": "Normalized supplied values for display purposes only (usd + crypto). Do not do arithmetic with these; use supplied instead." + }, + "sharePct": { + "type": "string", + "description": "This market's share of the vault's supplied assets, as a decimal fraction (e.g. '0.997' for 99.7%)." + } + } + }, + "v1EarnWithdrawIntent": { + "type": "object", + "properties": { + "wrapperAddress": { + "type": "string", + "description": "Address of the deployed Earn wrapper holding the position to withdraw from, from ListEarnPositions. Must be one of the org's deployed wrappers." + }, + "signWith": { + "type": "string", + "description": "A Wallet account address or Private Key address to withdraw to and sign with. Must be an on-chain address; Private Key identifiers are not supported." + }, + "caip2": { + "type": "string", + "enum": [ + "eip155:1", + "eip155:8453", + "eip155:42161", + "eip155:137", + "eip155:56", + "eip155:4217", + "solana:mainnet", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", + "solana:devnet", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" + ], + "description": "CAIP-2 chain ID the vault lives on (e.g., 'eip155:8453' for Base)." + }, + "sponsor": { + "type": "boolean", + "description": "Whether to sponsor this transaction via Gas Station." + }, + "amountValue": { "type": "string", - "description": "The payment method that the customer wants to remove." + "description": "The amount of the underlying asset to withdraw, in raw on-chain units. Pass 'MAX' to withdraw the entire position." } }, - "required": ["paymentMethodId"] + "required": ["wrapperAddress", "signWith", "caip2", "amountValue"] }, - "billingDeletePaymentMethodResult": { + "v1EarnWithdrawRequest": { "type": "object", "properties": { - "paymentMethodId": { + "type": { "type": "string", - "description": "The payment method that was removed." + "enum": ["ACTIVITY_TYPE_EARN_WITHDRAW"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1EarnWithdrawIntent" + }, + "generateAppProofs": { + "type": "boolean" } }, - "required": ["paymentMethodId"] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "billingSetPaymentMethodIntent": { + "v1EarnWithdrawResult": { "type": "object", "properties": { - "number": { + "withdrawRequestId": { "type": "string", - "description": "The account number of the customer's credit card." - }, - "cvv": { + "description": "Identifier to poll withdrawal status and tx hash via GetEarnWithdrawStatus." + } + }, + "required": ["withdrawRequestId"] + }, + "v1Effect": { + "type": "string", + "enum": ["EFFECT_ALLOW", "EFFECT_DENY"] + }, + "v1EmailAuthCustomizationParams": { + "type": "object", + "properties": { + "appName": { "type": "string", - "description": "The verification digits of the customer's credit card." + "description": "The name of the application. This field is required and will be used in email notifications if an email template is not provided." }, - "expiryMonth": { + "logoUrl": { "type": "string", - "description": "The month that the credit card expires." + "description": "A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px." }, - "expiryYear": { + "magicLinkTemplate": { "type": "string", - "description": "The year that the credit card expires." + "description": "A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`." }, - "cardHolderEmail": { + "templateVariables": { "type": "string", - "description": "The email that will receive invoices for the credit card." + "description": "JSON object containing key/value pairs to be used with custom templates." }, - "cardHolderName": { + "templateId": { "type": "string", - "description": "The name associated with the credit card." + "description": "Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template." } }, - "required": [ - "number", - "cvv", - "expiryMonth", - "expiryYear", - "cardHolderEmail", - "cardHolderName" - ] + "required": ["appName"] }, - "billingSetPaymentMethodIntentV2": { + "v1EmailAuthIntent": { "type": "object", "properties": { - "paymentMethodId": { + "email": { "type": "string", - "description": "The id of the payment method that was created clientside." + "description": "Email of the authenticating user." }, - "cardHolderEmail": { + "targetPublicKey": { "type": "string", - "description": "The email that will receive invoices for the credit card." + "description": "Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." }, - "cardHolderName": { + "apiKeyName": { "type": "string", - "description": "The name associated with the credit card." + "description": "Optional human-readable name for an API Key. If none provided, default to Email Auth - \u003cTimestamp\u003e" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + }, + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParams", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated Email Auth API keys" + }, + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the email" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["paymentMethodId", "cardHolderEmail", "cardHolderName"] + "required": ["email", "targetPublicKey"] }, - "billingSetPaymentMethodResult": { + "v1EmailAuthIntentV2": { "type": "object", "properties": { - "lastFour": { + "email": { "type": "string", - "description": "The last four digits of the credit card added." + "description": "Email of the authenticating user." }, - "cardHolderName": { + "targetPublicKey": { "type": "string", - "description": "The name associated with the payment method." + "description": "Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." }, - "cardHolderEmail": { + "apiKeyName": { "type": "string", - "description": "The email address associated with the payment method." + "description": "Optional human-readable name for an API Key. If none provided, default to Email Auth - \u003cTimestamp\u003e" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + }, + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParams", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated Email Auth API keys" + }, + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the email" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["lastFour", "cardHolderName", "cardHolderEmail"] + "required": ["email", "targetPublicKey"] }, - "datav1Tag": { + "v1EmailAuthIntentV3": { "type": "object", "properties": { - "tagId": { + "email": { "type": "string", - "description": "Unique identifier for a given Tag." + "description": "Email of the authenticating user." }, - "tagName": { + "targetPublicKey": { "type": "string", - "description": "Human-readable name for a Tag." + "description": "Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." }, - "tagType": { - "$ref": "#/definitions/v1TagType" + "apiKeyName": { + "type": "string", + "description": "Optional human-readable name for an API Key. If none provided, default to Email Auth - \u003cTimestamp\u003e" }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "emailCustomization": { + "$ref": "#/definitions/v1EmailAuthCustomizationParams", + "description": "Parameters for customizing emails. If not provided, the default email will be used. Note that app_name is required." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated Email Auth API keys" + }, + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the email" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["tagId", "tagName", "tagType", "createdAt", "updatedAt"] + "required": ["email", "targetPublicKey", "emailCustomization"] }, - "externalactivityv1PolicyEvaluation": { + "v1EmailAuthRequest": { "type": "object", "properties": { - "id": { + "type": { "type": "string", - "description": "Unique identifier for a given policy evaluation." + "enum": ["ACTIVITY_TYPE_EMAIL_AUTH_V3"] }, - "activityId": { + "timestampMs": { "type": "string", - "description": "Unique identifier for a given Activity." + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, "organizationId": { "type": "string", - "description": "Unique identifier for the Organization the Activity belongs to." + "description": "Unique identifier for a given Organization." }, - "voteId": { - "type": "string", - "description": "Unique identifier for the Vote associated with this policy evaluation." + "parameters": { + "$ref": "#/definitions/v1EmailAuthIntentV3" }, - "policyEvaluations": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/immutablecommonv1PolicyEvaluation" - }, - "description": "Detailed evaluation result for each Policy that was run." + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1EmailAuthResult": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "Unique identifier for the authenticating User." }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "apiKeyId": { + "type": "string", + "description": "Unique identifier for the created API key." } }, - "required": [ - "id", - "activityId", - "organizationId", - "voteId", - "policyEvaluations", - "createdAt" - ] + "required": ["userId", "apiKeyId"] }, - "externaldatav1Address": { + "v1EmailCustomizationParams": { "type": "object", "properties": { - "format": { - "$ref": "#/definitions/v1AddressFormat" + "appName": { + "type": "string", + "description": "The name of the application." + }, + "logoUrl": { + "type": "string", + "description": "A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px." + }, + "magicLinkTemplate": { + "type": "string", + "description": "A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`." }, - "address": { - "type": "string" + "templateVariables": { + "type": "string", + "description": "JSON object containing key/value pairs to be used with custom templates." + }, + "templateId": { + "type": "string", + "description": "Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template." } } }, - "externaldatav1Credential": { + "v1EmailCustomizationParamsV2": { "type": "object", "properties": { - "publicKey": { + "logoUrl": { "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." + "description": "A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px." }, - "type": { - "$ref": "#/definitions/v1CredentialType" - } - }, - "required": ["publicKey", "type"] - }, - "externaldatav1Quorum": { - "type": "object", - "properties": { - "threshold": { - "type": "integer", - "format": "int32", - "description": "Count of unique approvals required to meet quorum." + "magicLinkTemplate": { + "type": "string", + "description": "A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`." }, - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Unique identifiers of quorum set members." + "templateVariables": { + "type": "string", + "description": "JSON object containing key/value pairs to be used with custom templates." + }, + "templateId": { + "type": "string", + "description": "Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template." } - }, - "required": ["threshold", "userIds"] - }, - "externaldatav1SignatureScheme": { - "type": "string", - "enum": ["SIGNATURE_SCHEME_EPHEMERAL_KEY_P256"] + } }, - "externaldatav1SmartContractInterface": { + "v1EmailEvent": { "type": "object", "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the email event" + }, "organizationId": { "type": "string", - "description": "The Organization the Smart Contract Interface belongs to." + "description": "Unique identifier for the organization associated with the email event" }, - "smartContractInterfaceId": { + "messageId": { "type": "string", - "description": "Unique identifier for a given Smart Contract Interface (ABI or IDL)." + "description": "Provider message identifier. Multiple events can share the same message ID" }, - "smartContractAddress": { + "eventType": { "type": "string", - "description": "The address corresponding to the Smart Contract or Program." + "description": "Email event type, such as Send, Delivery, Bounce, or DeliveryDelay" }, - "smartContractInterface": { + "fromAddress": { "type": "string", - "description": "The JSON corresponding to the Smart Contract Interface (ABI or IDL)." + "description": "Sender email address" }, - "type": { + "toAddress": { "type": "string", - "description": "The type corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA)." + "description": "Recipient email address" }, - "label": { + "senderTenant": { "type": "string", - "description": "The label corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA)." + "description": "SES tenant that sent the email, when available" }, - "notes": { + "timestamp": { "type": "string", - "description": "The notes corresponding to the Smart Contract Interface (either ETHEREUM or SOLANA)." + "description": "Event timestamp as millisecond epoch string" }, "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "type": "string", + "description": "Creation timestamp as millisecond epoch string" }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "details": { + "$ref": "#/definitions/v1EmailEventDetails", + "description": "Parsed email event details. Fields are populated based on event type and available provider metadata" } }, "required": [ + "id", "organizationId", - "smartContractInterfaceId", - "smartContractAddress", - "smartContractInterface", - "type", - "label", - "notes", + "messageId", + "eventType", + "fromAddress", + "toAddress", + "timestamp", "createdAt", - "updatedAt" + "details" ] }, - "externaldatav1Timestamp": { + "v1EmailEventDetails": { "type": "object", "properties": { - "seconds": { - "type": "string" + "bounceType": { + "type": "string", + "description": "Bounce type for Bounce events" }, - "nanos": { - "type": "string" - } - }, - "required": ["seconds", "nanos"] - }, - "immutableactivityv1Address": { - "type": "object", - "properties": { - "format": { - "$ref": "#/definitions/v1AddressFormat" + "bounceSubType": { + "type": "string", + "description": "Bounce subtype for Bounce events" }, - "address": { - "type": "string" + "diagnosticCode": { + "type": "string", + "description": "Diagnostic text for Bounce or DeliveryDelay events" + }, + "deliverySmtpResponse": { + "type": "string", + "description": "SMTP response for Delivery events" + }, + "deliveryProcessingTimeMillis": { + "type": "string", + "format": "uint64", + "description": "Processing time in milliseconds for Delivery events" + }, + "deliveryDelayType": { + "type": "string", + "description": "Delay type for DeliveryDelay events" + }, + "complaintFeedbackType": { + "type": "string", + "description": "Feedback type for Complaint events" } } }, - "immutablecommonv1PolicyEvaluation": { + "v1EnableAuthProxyIntent": { + "type": "object" + }, + "v1EnableAuthProxyResult": { "type": "object", "properties": { - "policyId": { - "type": "string" - }, - "outcome": { - "$ref": "#/definitions/v1Outcome" + "userId": { + "type": "string", + "description": "A User ID with permission to initiate authentication." } - } + }, + "required": ["userId"] }, - "protobufAny": { + "v1EthCallParams": { "type": "object", "properties": { - "@type": { - "type": "string" + "to": { + "type": "string", + "description": "Recipient address as a hex string with 0x prefix." + }, + "value": { + "type": "string", + "description": "Amount of native asset to send in wei." + }, + "data": { + "type": "string", + "description": "Hex-encoded call data for contract interactions." } }, - "additionalProperties": {} + "required": ["to"] }, - "rpcStatus": { + "v1EthFailureDetails": { "type": "object", "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { + "revertChain": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/protobufAny" - } + "$ref": "#/definitions/v1RevertChainEntry" + }, + "description": "Ethereum revert chain, ordered from outermost to innermost." } } }, - "v1AcceptInvitationIntent": { + "v1EthSendRawTransactionIntent": { "type": "object", "properties": { - "invitationId": { + "signedTransaction": { "type": "string", - "description": "Unique identifier for a given Invitation object." + "description": "The raw, signed transaction to be sent." }, - "userId": { + "caip2": { "type": "string", - "description": "Unique identifier for a given User." - }, - "authenticator": { - "$ref": "#/definitions/v1AuthenticatorParams", - "description": "WebAuthN hardware devices that can be used to log in to the Turnkey web app." + "enum": [ + "eip155:1", + "eip155:11155111", + "eip155:8453", + "eip155:84532", + "eip155:137", + "eip155:80002", + "eip155:56", + "eip155:97", + "eip155:10", + "eip155:11155420", + "eip155:143", + "eip155:10143", + "eip155:42161", + "eip155:4217", + "eip155:42431", + "eip155:421614", + "eip155:4663", + "eip155:46630", + "eip155:5042", + "eip155:5042002" + ], + "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." } }, - "required": ["invitationId", "userId", "authenticator"] + "required": ["signedTransaction", "caip2"] }, - "v1AcceptInvitationIntentV2": { + "v1EthSendRawTransactionResult": { "type": "object", "properties": { - "invitationId": { - "type": "string", - "description": "Unique identifier for a given Invitation object." - }, - "userId": { + "transactionHash": { "type": "string", - "description": "Unique identifier for a given User." - }, - "authenticator": { - "$ref": "#/definitions/v1AuthenticatorParamsV2", - "description": "WebAuthN hardware devices that can be used to log in to the Turnkey web app." + "description": "The transaction hash of the sent transaction" } }, - "required": ["invitationId", "userId", "authenticator"] + "required": ["transactionHash"] }, - "v1AcceptInvitationResult": { + "v1EthSendTransactionIntent": { "type": "object", "properties": { - "invitationId": { + "from": { "type": "string", - "description": "Unique identifier for a given Invitation." + "description": "A wallet or private key address to sign with. This does not support private key IDs." }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["invitationId", "userId"] - }, - "v1AccessType": { - "type": "string", - "enum": ["ACCESS_TYPE_WEB", "ACCESS_TYPE_API", "ACCESS_TYPE_ALL"] - }, - "v1Activity": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Unique identifier for a given Activity object." + "sponsor": { + "type": "boolean", + "description": "Whether to sponsor this transaction via Gas Station." }, - "organizationId": { + "caip2": { "type": "string", - "description": "Unique identifier for a given Organization." - }, - "status": { - "$ref": "#/definitions/v1ActivityStatus", - "description": "The current processing status of a specified Activity." - }, - "type": { - "$ref": "#/definitions/v1ActivityType", - "description": "Type of Activity, such as Add User, or Sign Transaction." - }, - "intent": { - "$ref": "#/definitions/v1Intent", - "description": "Intent object crafted by Turnkey based on the user request, used to assess the permissibility of an action." - }, - "result": { - "$ref": "#/definitions/v1Result", - "description": "Result of the intended action." - }, - "votes": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1Vote" - }, - "description": "A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata." + "enum": [ + "eip155:1", + "eip155:11155111", + "eip155:8453", + "eip155:84532", + "eip155:137", + "eip155:80002", + "eip155:56", + "eip155:97", + "eip155:10", + "eip155:11155420", + "eip155:143", + "eip155:10143", + "eip155:42161", + "eip155:4217", + "eip155:42431", + "eip155:421614", + "eip155:4663", + "eip155:46630", + "eip155:5042", + "eip155:5042002" + ], + "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." }, - "appProofs": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1AppProof" - }, - "description": "A list of App Proofs generated by enclaves during activity execution, providing verifiable attestations of performed operations." + "to": { + "type": "string", + "description": "Recipient address as a hex string with 0x prefix." }, - "fingerprint": { + "value": { "type": "string", - "description": "An artifact verifying a User's action." + "description": "Amount of native asset to send in wei." }, - "canApprove": { - "type": "boolean" + "data": { + "type": "string", + "description": "Hex-encoded call data for contract interactions." }, - "canReject": { - "type": "boolean" + "nonce": { + "type": "string", + "description": "Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations." }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "gasLimit": { + "type": "string", + "description": "Maximum amount of gas to use for this transaction, for EIP-1559 transactions." }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "maxFeePerGas": { + "type": "string", + "description": "Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions." }, - "failure": { - "$ref": "#/definitions/rpcStatus", - "description": "Failure reason of the intended action." - } - }, - "required": [ - "id", - "organizationId", - "status", - "type", - "intent", - "result", - "votes", - "fingerprint", - "canApprove", - "canReject", - "createdAt", - "updatedAt" - ] - }, - "v1ActivityResponse": { - "type": "object", - "properties": { - "activity": { - "$ref": "#/definitions/v1Activity", - "description": "An action that can be taken within the Turnkey infrastructure." + "maxPriorityFeePerGas": { + "type": "string", + "description": "Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions." + }, + "deadline": { + "type": "string", + "description": "Unix timestamp in seconds for EIP-712 execution deadline. Only used when sponsor=true." + }, + "gasStationNonce": { + "type": "string", + "description": "The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture." } }, - "required": ["activity"] - }, - "v1ActivityStatus": { - "type": "string", - "enum": [ - "ACTIVITY_STATUS_CREATED", - "ACTIVITY_STATUS_PENDING", - "ACTIVITY_STATUS_COMPLETED", - "ACTIVITY_STATUS_FAILED", - "ACTIVITY_STATUS_CONSENSUS_NEEDED", - "ACTIVITY_STATUS_REJECTED" - ] - }, - "v1ActivityType": { - "type": "string", - "enum": [ - "ACTIVITY_TYPE_CREATE_API_KEYS", - "ACTIVITY_TYPE_CREATE_USERS", - "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS", - "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD", - "ACTIVITY_TYPE_CREATE_INVITATIONS", - "ACTIVITY_TYPE_ACCEPT_INVITATION", - "ACTIVITY_TYPE_CREATE_POLICY", - "ACTIVITY_TYPE_DISABLE_PRIVATE_KEY", - "ACTIVITY_TYPE_DELETE_USERS", - "ACTIVITY_TYPE_DELETE_API_KEYS", - "ACTIVITY_TYPE_DELETE_INVITATION", - "ACTIVITY_TYPE_DELETE_ORGANIZATION", - "ACTIVITY_TYPE_DELETE_POLICY", - "ACTIVITY_TYPE_CREATE_USER_TAG", - "ACTIVITY_TYPE_DELETE_USER_TAGS", - "ACTIVITY_TYPE_CREATE_ORGANIZATION", - "ACTIVITY_TYPE_SIGN_TRANSACTION", - "ACTIVITY_TYPE_APPROVE_ACTIVITY", - "ACTIVITY_TYPE_REJECT_ACTIVITY", - "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", - "ACTIVITY_TYPE_CREATE_AUTHENTICATORS", - "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", - "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", - "ACTIVITY_TYPE_SET_PAYMENT_METHOD", - "ACTIVITY_TYPE_ACTIVATE_BILLING_TIER", - "ACTIVITY_TYPE_DELETE_PAYMENT_METHOD", - "ACTIVITY_TYPE_CREATE_POLICY_V2", - "ACTIVITY_TYPE_CREATE_POLICY_V3", - "ACTIVITY_TYPE_CREATE_API_ONLY_USERS", - "ACTIVITY_TYPE_UPDATE_ROOT_QUORUM", - "ACTIVITY_TYPE_UPDATE_USER_TAG", - "ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG", - "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", - "ACTIVITY_TYPE_CREATE_ORGANIZATION_V2", - "ACTIVITY_TYPE_CREATE_USERS_V2", - "ACTIVITY_TYPE_ACCEPT_INVITATION_V2", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V2", - "ACTIVITY_TYPE_UPDATE_ALLOWED_ORIGINS", - "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", - "ACTIVITY_TYPE_UPDATE_USER", - "ACTIVITY_TYPE_UPDATE_POLICY", - "ACTIVITY_TYPE_SET_PAYMENT_METHOD_V2", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V3", - "ACTIVITY_TYPE_CREATE_WALLET", - "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", - "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY", - "ACTIVITY_TYPE_RECOVER_USER", - "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", - "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", - "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", - "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", - "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", - "ACTIVITY_TYPE_EXPORT_WALLET", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V4", - "ACTIVITY_TYPE_EMAIL_AUTH", - "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", - "ACTIVITY_TYPE_INIT_IMPORT_WALLET", - "ACTIVITY_TYPE_IMPORT_WALLET", - "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", - "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", - "ACTIVITY_TYPE_CREATE_POLICIES", - "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", - "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", - "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS", - "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V5", - "ACTIVITY_TYPE_OAUTH", - "ACTIVITY_TYPE_CREATE_API_KEYS_V2", - "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION", - "ACTIVITY_TYPE_EMAIL_AUTH_V2", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V6", - "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", - "ACTIVITY_TYPE_DELETE_WALLETS", - "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", - "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", - "ACTIVITY_TYPE_INIT_OTP_AUTH", - "ACTIVITY_TYPE_OTP_AUTH", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", - "ACTIVITY_TYPE_UPDATE_WALLET", - "ACTIVITY_TYPE_UPDATE_POLICY_V2", - "ACTIVITY_TYPE_CREATE_USERS_V3", - "ACTIVITY_TYPE_INIT_OTP_AUTH_V2", - "ACTIVITY_TYPE_INIT_OTP", - "ACTIVITY_TYPE_VERIFY_OTP", - "ACTIVITY_TYPE_OTP_LOGIN", - "ACTIVITY_TYPE_STAMP_LOGIN", - "ACTIVITY_TYPE_OAUTH_LOGIN", - "ACTIVITY_TYPE_UPDATE_USER_NAME", - "ACTIVITY_TYPE_UPDATE_USER_EMAIL", - "ACTIVITY_TYPE_UPDATE_USER_PHONE_NUMBER", - "ACTIVITY_TYPE_INIT_FIAT_ON_RAMP", - "ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE", - "ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE", - "ACTIVITY_TYPE_ENABLE_AUTH_PROXY", - "ACTIVITY_TYPE_DISABLE_AUTH_PROXY", - "ACTIVITY_TYPE_UPDATE_AUTH_PROXY_CONFIG", - "ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL", - "ACTIVITY_TYPE_UPDATE_OAUTH2_CREDENTIAL", - "ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL", - "ACTIVITY_TYPE_OAUTH2_AUTHENTICATE", - "ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS", - "ACTIVITY_TYPE_DELETE_POLICIES", - "ACTIVITY_TYPE_ETH_SEND_RAW_TRANSACTION", - "ACTIVITY_TYPE_ETH_SEND_TRANSACTION", - "ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL", - "ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL", - "ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL", - "ACTIVITY_TYPE_EMAIL_AUTH_V3", - "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2", - "ACTIVITY_TYPE_INIT_OTP_AUTH_V3", - "ACTIVITY_TYPE_INIT_OTP_V2", - "ACTIVITY_TYPE_UPSERT_GAS_USAGE_CONFIG", - "ACTIVITY_TYPE_CREATE_TVC_APP", - "ACTIVITY_TYPE_CREATE_TVC_DEPLOYMENT", - "ACTIVITY_TYPE_CREATE_TVC_MANIFEST_APPROVALS", - "ACTIVITY_TYPE_SOL_SEND_TRANSACTION", - "ACTIVITY_TYPE_INIT_OTP_V3", - "ACTIVITY_TYPE_VERIFY_OTP_V2", - "ACTIVITY_TYPE_OTP_LOGIN_V2", - "ACTIVITY_TYPE_UPDATE_ORGANIZATION_NAME" - ] - }, - "v1AddressFormat": { - "type": "string", - "enum": [ - "ADDRESS_FORMAT_UNCOMPRESSED", - "ADDRESS_FORMAT_COMPRESSED", - "ADDRESS_FORMAT_ETHEREUM", - "ADDRESS_FORMAT_SOLANA", - "ADDRESS_FORMAT_COSMOS", - "ADDRESS_FORMAT_TRON", - "ADDRESS_FORMAT_SUI", - "ADDRESS_FORMAT_APTOS", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR", - "ADDRESS_FORMAT_SEI", - "ADDRESS_FORMAT_XLM", - "ADDRESS_FORMAT_DOGE_MAINNET", - "ADDRESS_FORMAT_DOGE_TESTNET", - "ADDRESS_FORMAT_TON_V3R2", - "ADDRESS_FORMAT_TON_V4R2", - "ADDRESS_FORMAT_TON_V5R1", - "ADDRESS_FORMAT_XRP" - ] + "required": ["from", "caip2", "to"] }, - "v1ApiKey": { + "v1EthSendTransactionIntentV2": { "type": "object", "properties": { - "credential": { - "$ref": "#/definitions/externaldatav1Credential", - "description": "A User credential that can be used to authenticate to Turnkey." + "from": { + "type": "string", + "description": "A wallet or private key address to sign with. This does not support private key IDs." + }, + "caip2": { + "type": "string", + "enum": [ + "eip155:1", + "eip155:11155111", + "eip155:8453", + "eip155:84532", + "eip155:137", + "eip155:80002", + "eip155:56", + "eip155:97", + "eip155:10", + "eip155:11155420", + "eip155:143", + "eip155:10143", + "eip155:42161", + "eip155:4217", + "eip155:42431", + "eip155:421614", + "eip155:4663", + "eip155:46630", + "eip155:5042", + "eip155:5042002" + ], + "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." }, - "apiKeyId": { + "sponsor": { + "type": "boolean", + "description": "Whether to sponsor this transaction via Gas Station. If false or unset, the EOA pays gas. A single call uses EIP-1559; multiple calls use EIP-7702 batch execution via Gas Station." + }, + "nonce": { "type": "string", - "description": "Unique identifier for a given API Key." + "description": "Outer transaction nonce. Omit to auto-fetch." }, - "apiKeyName": { + "gasLimit": { "type": "string", - "description": "Human-readable name for an API Key." + "description": "Maximum amount of gas for the outer transaction. Omit to auto-estimate." }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "maxFeePerGas": { + "type": "string", + "description": "Maximum total fee per gas unit (base fee + priority fee) in wei. Omit to auto-estimate." }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "maxPriorityFeePerGas": { + "type": "string", + "description": "Maximum priority fee (tip) per gas unit in wei. Omit to auto-estimate." }, - "expirationSeconds": { + "deadline": { "type": "string", - "format": "uint64", - "description": "Optional window (in seconds) indicating how long the API Key should last." + "description": "Unix timestamp in seconds for EIP-712 execution deadline. Only used when sponsor=true." + }, + "gasStationNonce": { + "type": "string", + "description": "The gas station delegate contract nonce used in the BatchExecution EIP-712 message. Valid for sponsored transactions and non-sponsored multi-call batches. Omit to auto-fetch. Use the nonces endpoint for replay protection." + }, + "calls": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1EthCallParams" + }, + "description": "Ordered list of calls to execute. Must contain between 1 and 50 entries. A single entry with sponsor=false uses EIP-1559; multiple entries use EIP-7702 batch execution via Gas Station." } }, - "required": [ - "credential", - "apiKeyId", - "apiKeyName", - "createdAt", - "updatedAt" - ] - }, - "v1ApiKeyCurve": { - "type": "string", - "enum": [ - "API_KEY_CURVE_P256", - "API_KEY_CURVE_SECP256K1", - "API_KEY_CURVE_ED25519" - ] + "required": ["from", "caip2", "calls"] }, - "v1ApiKeyParamsV2": { + "v1EthSendTransactionRequest": { "type": "object", "properties": { - "apiKeyName": { + "type": { "type": "string", - "description": "Human-readable name for an API Key." + "enum": ["ACTIVITY_TYPE_ETH_SEND_TRANSACTION_V2"] }, - "publicKey": { + "timestampMs": { "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "curveType": { - "$ref": "#/definitions/v1ApiKeyCurve", - "description": "The curve type to be used for processing API key signatures." + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." }, - "expirationSeconds": { + "parameters": { + "$ref": "#/definitions/v1EthSendTransactionIntentV2" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1EthSendTransactionResult": { + "type": "object", + "properties": { + "sendTransactionStatusId": { "type": "string", - "description": "Optional window (in seconds) indicating how long the API Key should last." + "description": "The send_transaction_status ID associated with the transaction submission" } }, - "required": ["apiKeyName", "publicKey", "curveType"] + "required": ["sendTransactionStatusId"] }, - "v1ApiOnlyUserParams": { + "v1EthSendTransactionResultV2": { "type": "object", "properties": { - "userName": { + "sendTransactionStatusId": { "type": "string", - "description": "The name of the new API-only User." + "description": "The send_transaction_status ID associated with the transaction submission" + } + }, + "required": ["sendTransactionStatusId"] + }, + "v1EthSendTransactionStatus": { + "type": "object", + "properties": { + "txHash": { + "type": "string", + "description": "The Ethereum transaction hash, if available." + } + } + }, + "v1EthTransactionHistoryItem": { + "type": "object", + "properties": { + "transactionHash": { + "type": "string", + "description": "EVM transaction hash." }, - "userEmail": { + "block": { + "$ref": "#/definitions/v1TransactionHistoryBlock", + "description": "Block metadata for the transaction." + }, + "status": { "type": "string", - "description": "The email address for this API-only User (optional)." + "enum": ["CONFIRMED", "FINALIZED"], + "description": "Transaction confirmation status." }, - "userTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of tags assigned to the new API-only User. This field, if not needed, should be an empty array in your request body." + "origin": { + "type": "string", + "description": "Origin of the transaction. Examples include TURNKEY." }, - "apiKeys": { + "from": { + "type": "string", + "description": "EVM sender address for the transaction." + }, + "to": { + "type": "string", + "description": "EVM transaction destination address, such as the called contract or EVM tx.to. Omitted for contract-creation transactions with no destination. Recipients and payers of value transfers are reflected in transfers[].counterparty." + }, + "fee": { + "$ref": "#/definitions/v1TransactionHistoryFee", + "description": "Transaction fee information." + }, + "transfers": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiApiKeyParams" + "$ref": "#/definitions/v1TransactionHistoryTransfer" }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + "description": "Asset transfers associated with the transaction." + }, + "turnkey": { + "$ref": "#/definitions/v1TransactionHistoryTurnkey", + "description": "Turnkey-specific metadata for transactions originated by Turnkey." + }, + "executionFailed": { + "type": "boolean", + "description": "Whether the transaction failed during on-chain execution. Omitted when execution outcome is unavailable." } }, - "required": ["userName", "userTags", "apiKeys"] + "required": [ + "transactionHash", + "block", + "status", + "origin", + "from", + "fee", + "transfers" + ] }, - "v1AppProof": { + "v1EthUndelegate7702Intent": { "type": "object", "properties": { - "scheme": { - "$ref": "#/definitions/externaldatav1SignatureScheme", - "description": "Scheme of signing key." + "from": { + "type": "string", + "description": "A wallet or private key address to undelegate. This does not support private key IDs." }, - "publicKey": { + "caip2": { "type": "string", - "description": "Ephemeral public key." + "enum": [ + "eip155:1", + "eip155:11155111", + "eip155:8453", + "eip155:84532", + "eip155:137", + "eip155:80002", + "eip155:56", + "eip155:97", + "eip155:10", + "eip155:11155420", + "eip155:143", + "eip155:10143", + "eip155:42161", + "eip155:421614", + "eip155:4663", + "eip155:46630", + "eip155:5042", + "eip155:5042002" + ], + "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." }, - "proofPayload": { + "nonce": { "type": "string", - "description": "JSON serialized AppProofPayload." + "description": "Outer transaction nonce. Omit to auto-fetch." }, - "signature": { + "gasLimit": { "type": "string", - "description": "Signature over hashed proof_payload." - } - }, - "required": ["scheme", "publicKey", "proofPayload", "signature"] - }, - "v1ApproveActivityIntent": { - "type": "object", - "properties": { - "fingerprint": { + "description": "Maximum amount of gas for the undelegation transaction. Omit to use the fixed undelegation gas limit." + }, + "maxFeePerGas": { "type": "string", - "description": "An artifact verifying a User's action." + "description": "Maximum total fee per gas unit (base fee + priority fee) in wei. Omit to auto-estimate." + }, + "maxPriorityFeePerGas": { + "type": "string", + "description": "Maximum priority fee (tip) per gas unit in wei. Omit to auto-estimate." } }, - "required": ["fingerprint"] + "required": ["from", "caip2"] }, - "v1ApproveActivityRequest": { + "v1EthUndelegate7702Request": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_APPROVE_ACTIVITY"] + "enum": ["ACTIVITY_TYPE_ETH_UNDELEGATE_7702"] }, "timestampMs": { "type": "string", @@ -4521,7 +12705,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1ApproveActivityIntent" + "$ref": "#/definitions/v1EthUndelegate7702Intent" }, "generateAppProofs": { "type": "boolean" @@ -4529,372 +12713,360 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1AssetBalance": { + "v1EthUndelegate7702Result": { "type": "object", "properties": { - "caip19": { + "sendTransactionStatusId": { "type": "string", - "description": "The caip-19 asset identifier" + "description": "The send_transaction_status ID associated with the undelegation transaction submission" + } + }, + "required": ["sendTransactionStatusId"] + }, + "v1ExecuteSwapIntent": { + "type": "object", + "properties": { + "inputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the input asset. The chain is derived from this value." }, - "symbol": { + "outputToken": { "type": "string", - "description": "The asset symbol" + "description": "CAIP-19 asset ID for the output asset. May be on a different chain than `input_token` for cross-chain swaps." }, - "balance": { + "inputAmount": { "type": "string", - "description": "The balance in atomic units" + "description": "Base-unit amount of the input asset." }, - "decimals": { - "type": "integer", - "format": "int32", - "description": "The number of decimals this asset uses" + "walletAccount": { + "type": "string", + "description": "Wallet account address to sign and submit the swap transaction from. Cross-wallet swaps are not supported." }, - "display": { - "$ref": "#/definitions/v1AssetBalanceDisplay", - "description": "Normalized balance values for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise. Use the balance field instead." + "sponsor": { + "type": "boolean", + "description": "Whether to sponsor the resulting swap transaction via Gas Station when supported by the chain." }, - "name": { + "slippage": { "type": "string", - "description": "The asset name" - } - } - }, - "v1AssetBalanceDisplay": { - "type": "object", - "properties": { - "usd": { + "description": "Maximum allowed slippage in basis points." + }, + "provider": { "type": "string", - "description": "USD value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise." + "description": "Swap provider to execute with, as returned by create_swap_quote. When omitted, execution uses the default provider." }, - "crypto": { + "minOutputAmount": { "type": "string", - "description": "Normalized crypto value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise." + "description": "Minimum acceptable base-unit amount of the output asset. Execution fails if the swap provider's quoted minimum output falls below this floor at execution time." } - } + }, + "required": [ + "inputToken", + "outputToken", + "inputAmount", + "walletAccount", + "minOutputAmount" + ] }, - "v1AssetMetadata": { + "v1ExecuteSwapIntentV2": { "type": "object", "properties": { - "caip19": { + "quoteId": { "type": "string", - "description": "The caip-19 asset identifier" + "description": "Quote identifier returned by create_swap_quote. Execution is bound to this quote; the signer is derived from the quote and must not be resupplied." }, - "symbol": { + "inputToken": { "type": "string", - "description": "The asset symbol" - }, - "decimals": { - "type": "integer", - "format": "int32", - "description": "The number of decimals this asset uses" + "description": "CAIP-19 asset ID for the input asset." }, - "logoUrl": { + "inputAmount": { "type": "string", - "description": "The url of the asset logo" + "description": "Exact base-unit amount of the input asset committed by the quote." }, - "name": { + "outputToken": { "type": "string", - "description": "The asset name" - } - } - }, - "v1Attestation": { - "type": "object", - "properties": { - "credentialId": { + "description": "CAIP-19 asset ID for the output asset." + }, + "quotedOutputAmount": { "type": "string", - "description": "The cbor encoded then base64 url encoded id of the credential." + "description": "Exact quoted base-unit output amount committed by the quote." }, - "clientDataJson": { + "minOutputAmount": { "type": "string", - "description": "A base64 url encoded payload containing metadata about the signing context and the challenge." + "description": "Exact minimum base-unit output committed by the quote." }, - "attestationObject": { + "sponsor": { + "type": "boolean", + "description": "Whether the quoted transaction is sponsored." + }, + "evmNonce": { "type": "string", - "description": "A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses." + "description": "Exact EVM sender (EOA account) nonce. Valid only for a non-sponsored EVM swap. Honored for already-delegated (Type-2) batch swaps and single-call swaps; ignored for not-yet-delegated EIP-7702 (Type-4) batches where the outer nonce is derived from the authorization. Prefer gas_station_nonce for batch replay protection and use the nonces endpoint to fetch it. Omit to auto-fetch." }, - "transports": { - "type": "array", - "items": { - "$ref": "#/definitions/v1AuthenticatorTransport" - }, - "description": "The type of authenticator transports." + "recentBlockhash": { + "type": "string", + "description": "Exact Solana recent blockhash. Valid only for a Solana swap, including sponsored swaps. Omit to auto-fetch." + }, + "gasStationNonce": { + "type": "string", + "description": "Exact gas station delegate contract nonce used in the BatchExecution EIP-712 message. Valid for sponsored EVM swaps and non-sponsored EVM swaps that execute as a multi-call batch (for example ERC-20 approve + swap). This is the replay-protection nonce for gas-station batches; use the nonces endpoint to fetch it. Omit to auto-fetch." } }, "required": [ - "credentialId", - "clientDataJson", - "attestationObject", - "transports" + "quoteId", + "inputToken", + "inputAmount", + "outputToken", + "quotedOutputAmount", + "minOutputAmount", + "sponsor" ] }, - "v1Authenticator": { + "v1ExecuteSwapIntentV3": { "type": "object", "properties": { - "transports": { - "type": "array", - "items": { - "$ref": "#/definitions/v1AuthenticatorTransport" - }, - "description": "Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE)." + "quoteId": { + "type": "string", + "description": "Quote identifier returned by create_swap_quote. Execution is bound to this quote; the signer is derived from the quote and must not be resupplied." }, - "attestationType": { - "type": "string" + "inputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the input asset." }, - "aaguid": { + "inputAmount": { "type": "string", - "description": "Identifier indicating the type of the Security Key." + "description": "Exact base-unit amount of the input asset committed by the quote." }, - "credentialId": { + "outputToken": { "type": "string", - "description": "Unique identifier for a WebAuthn credential." + "description": "CAIP-19 asset ID for the output asset." }, - "model": { + "quotedOutputAmount": { "type": "string", - "description": "The type of Authenticator device." + "description": "Exact quoted base-unit output amount committed by the quote." }, - "credential": { - "$ref": "#/definitions/externaldatav1Credential", - "description": "A User credential that can be used to authenticate to Turnkey." + "minOutputAmount": { + "type": "string", + "description": "Exact minimum base-unit output committed by the quote." }, - "authenticatorId": { + "sponsor": { + "type": "boolean", + "description": "Whether the quoted transaction is sponsored." + }, + "evmNonce": { "type": "string", - "description": "Unique identifier for a given Authenticator." + "description": "Exact EVM sender (EOA account) nonce. Valid only for a non-sponsored EVM swap. Honored for already-delegated (Type-2) batch swaps and single-call swaps; ignored for not-yet-delegated EIP-7702 (Type-4) batches where the outer nonce is derived from the authorization. Prefer gas_station_nonce for batch replay protection and use the nonces endpoint to fetch it. Omit to auto-fetch." }, - "authenticatorName": { + "recentBlockhash": { "type": "string", - "description": "Human-readable name for an Authenticator." + "description": "Exact Solana recent blockhash. Valid only for a Solana swap, including sponsored swaps. Omit to auto-fetch." }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "gasStationNonce": { + "type": "string", + "description": "Exact gas station delegate contract nonce used in the BatchExecution EIP-712 message. Valid for sponsored EVM swaps and non-sponsored EVM swaps that execute as a multi-call batch (for example ERC-20 approve + swap). This is the replay-protection nonce for gas-station batches; use the nonces endpoint to fetch it. Omit to auto-fetch." }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "destinationAddress": { + "type": "string", + "description": "Raw public address that receives the output asset. Required for cross-protocol swaps. The address must match the output token protocol. Wallet account IDs, private key IDs, and CAIP account or asset identifiers are not supported." } }, "required": [ - "transports", - "attestationType", - "aaguid", - "credentialId", - "model", - "credential", - "authenticatorId", - "authenticatorName", - "createdAt", - "updatedAt" + "quoteId", + "inputToken", + "inputAmount", + "outputToken", + "quotedOutputAmount", + "minOutputAmount", + "sponsor" ] }, - "v1AuthenticatorAttestationResponse": { + "v1ExecuteSwapRequest": { "type": "object", "properties": { - "clientDataJson": { - "type": "string" - }, - "attestationObject": { - "type": "string" + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_EXECUTE_SWAP_V3"] }, - "transports": { - "type": "array", - "items": { - "$ref": "#/definitions/v1AuthenticatorTransport" - } + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "authenticatorAttachment": { + "organizationId": { "type": "string", - "enum": ["cross-platform", "platform"], - "x-nullable": true + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1ExecuteSwapIntentV3" + }, + "generateAppProofs": { + "type": "boolean" } }, - "required": ["clientDataJson", "attestationObject"] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1AuthenticatorParams": { + "v1ExecuteSwapResult": { "type": "object", "properties": { - "authenticatorName": { + "swapRequestId": { "type": "string", - "description": "Human-readable name for an Authenticator." + "description": "Identifier to poll swap status via GetSwapStatus." }, - "userId": { + "provider": { "type": "string", - "description": "Unique identifier for a given User." - }, - "attestation": { - "$ref": "#/definitions/v1PublicKeyCredentialWithAttestation" + "description": "Swap provider used to build the transaction." }, - "challenge": { + "quoteId": { "type": "string", - "description": "Challenge presented for authentication purposes." + "description": "Quote identifier used for execution, if any." } }, - "required": ["authenticatorName", "userId", "attestation", "challenge"] + "required": ["swapRequestId"] }, - "v1AuthenticatorParamsV2": { + "v1ExportPrivateKeyIntent": { "type": "object", "properties": { - "authenticatorName": { + "privateKeyId": { "type": "string", - "description": "Human-readable name for an Authenticator." + "description": "Unique identifier for a given Private Key." }, - "challenge": { + "targetPublicKey": { "type": "string", - "description": "Challenge presented for authentication purposes." - }, - "attestation": { - "$ref": "#/definitions/v1Attestation", - "description": "The attestation that proves custody of the authenticator and provides metadata about it." + "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." } }, - "required": ["authenticatorName", "challenge", "attestation"] - }, - "v1AuthenticatorTransport": { - "type": "string", - "enum": [ - "AUTHENTICATOR_TRANSPORT_BLE", - "AUTHENTICATOR_TRANSPORT_INTERNAL", - "AUTHENTICATOR_TRANSPORT_NFC", - "AUTHENTICATOR_TRANSPORT_USB", - "AUTHENTICATOR_TRANSPORT_HYBRID" - ] + "required": ["privateKeyId", "targetPublicKey"] }, - "v1BootProof": { + "v1ExportPrivateKeyRequest": { "type": "object", "properties": { - "ephemeralPublicKeyHex": { - "type": "string", - "description": "The hex encoded Ephemeral Public Key." - }, - "awsAttestationDocB64": { - "type": "string", - "description": "The DER encoded COSE Sign1 struct Attestation doc." - }, - "qosManifestB64": { - "type": "string", - "description": "The borsch serialized base64 encoded Manifest." - }, - "qosManifestEnvelopeB64": { + "type": { "type": "string", - "description": "The borsch serialized base64 encoded Manifest Envelope." + "enum": ["ACTIVITY_TYPE_EXPORT_PRIVATE_KEY"] }, - "deploymentLabel": { + "timestampMs": { "type": "string", - "description": "The label under which the enclave app was deployed." + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "enclaveApp": { + "organizationId": { "type": "string", - "description": "Name of the enclave app" + "description": "Unique identifier for a given Organization." }, - "owner": { - "type": "string", - "description": "Owner of the app i.e. 'tkhq'" + "parameters": { + "$ref": "#/definitions/v1ExportPrivateKeyIntent" }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "generateAppProofs": { + "type": "boolean" } }, - "required": [ - "ephemeralPublicKeyHex", - "awsAttestationDocB64", - "qosManifestB64", - "qosManifestEnvelopeB64", - "deploymentLabel", - "enclaveApp", - "owner", - "createdAt" - ] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1BootProofResponse": { + "v1ExportPrivateKeyResult": { "type": "object", "properties": { - "bootProof": { - "$ref": "#/definitions/v1BootProof" + "privateKeyId": { + "type": "string", + "description": "Unique identifier for a given Private Key." + }, + "exportBundle": { + "type": "string", + "description": "Export bundle containing a private key encrypted to the client's target public key." } }, - "required": ["bootProof"] + "required": ["privateKeyId", "exportBundle"] }, - "v1ClientSignature": { + "v1ExportSecretParams": { "type": "object", "properties": { - "publicKey": { + "secretId": { "type": "string", - "description": "The public component of a cryptographic key pair used to create the signature." - }, - "scheme": { - "$ref": "#/definitions/v1ClientSignatureScheme", - "description": "The signature scheme used to generate the client signature." + "description": "Unique identifier for the secret to export." }, - "message": { + "targetPublicKey": { "type": "string", - "description": "The message that was signed." + "description": "Client-side public key generated by the user, to which the exported secret will be encrypted." }, - "signature": { - "type": "string", - "description": "The cryptographic signature over the message." + "encryptionSuite": { + "$ref": "#/definitions/v1TransportEncryptionSuite", + "description": "Transport encryption suite used for the exported secret." + }, + "requestContext": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1KeyValue" + }, + "description": "Bind metadata to the request." } }, - "required": ["publicKey", "scheme", "message", "signature"] - }, - "v1ClientSignatureScheme": { - "type": "string", - "enum": ["CLIENT_SIGNATURE_SCHEME_API_P256"] + "required": ["secretId", "targetPublicKey", "encryptionSuite"] }, - "v1Config": { + "v1ExportSecretsIntent": { "type": "object", "properties": { - "features": { + "secrets": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1Feature" - } - }, - "quorum": { - "$ref": "#/definitions/externaldatav1Quorum" + "$ref": "#/definitions/v1ExportSecretParams" + }, + "description": "A list of secrets to export." } - } + }, + "required": ["secrets"] }, - "v1CreateApiKeysIntent": { + "v1ExportSecretsRequest": { "type": "object", "properties": { - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/apiApiKeyParams" - }, - "description": "A list of API Keys." + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_EXPORT_SECRETS"] }, - "userId": { + "timestampMs": { "type": "string", - "description": "Unique identifier for a given User." + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1ExportSecretsIntent" } }, - "required": ["apiKeys", "userId"] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1CreateApiKeysIntentV2": { + "v1ExportSecretsResult": { "type": "object", "properties": { - "apiKeys": { + "secretPayloads": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/v1ApiKeyParamsV2" + "type": "string" }, - "description": "A list of API Keys." + "description": "Encryption suite specific payload containing each secret ciphertext, in the order the params were specified. For enclave encrypt v1 each entry is a JSON-encoded ServerSendMsg." + } + }, + "required": ["secretPayloads"] + }, + "v1ExportWalletAccountIntent": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Address to identify Wallet Account." }, - "userId": { + "targetPublicKey": { "type": "string", - "description": "Unique identifier for a given User." + "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." } }, - "required": ["apiKeys", "userId"] + "required": ["address", "targetPublicKey"] }, - "v1CreateApiKeysRequest": { + "v1ExportWalletAccountRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_API_KEYS_V2"] + "enum": ["ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT"] }, "timestampMs": { "type": "string", @@ -4905,7 +13077,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1CreateApiKeysIntentV2" + "$ref": "#/definitions/v1ExportWalletAccountIntent" }, "generateAppProofs": { "type": "boolean" @@ -4913,88 +13085,44 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1CreateApiKeysResult": { - "type": "object", - "properties": { - "apiKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of API Key IDs." - } - }, - "required": ["apiKeyIds"] - }, - "v1CreateApiOnlyUsersIntent": { - "type": "object", - "properties": { - "apiOnlyUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1ApiOnlyUserParams" - }, - "description": "A list of API-only Users to create." - } - }, - "required": ["apiOnlyUsers"] - }, - "v1CreateApiOnlyUsersResult": { - "type": "object", - "properties": { - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of API-only User IDs." - } - }, - "required": ["userIds"] - }, - "v1CreateAuthenticatorsIntent": { + "v1ExportWalletAccountResult": { "type": "object", "properties": { - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1AuthenticatorParams" - }, - "description": "A list of Authenticators." + "address": { + "type": "string", + "description": "Address to identify Wallet Account." }, - "userId": { + "exportBundle": { "type": "string", - "description": "Unique identifier for a given User." + "description": "Export bundle containing a private key encrypted by the client's target public key." } }, - "required": ["authenticators", "userId"] + "required": ["address", "exportBundle"] }, - "v1CreateAuthenticatorsIntentV2": { + "v1ExportWalletIntent": { "type": "object", "properties": { - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1AuthenticatorParamsV2" - }, - "description": "A list of Authenticators." + "walletId": { + "type": "string", + "description": "Unique identifier for a given Wallet." }, - "userId": { + "targetPublicKey": { "type": "string", - "description": "Unique identifier for a given User." + "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." + }, + "language": { + "$ref": "#/definitions/v1MnemonicLanguage", + "description": "The language of the mnemonic to export. Defaults to English." } }, - "required": ["authenticators", "userId"] + "required": ["walletId", "targetPublicKey"] }, - "v1CreateAuthenticatorsRequest": { + "v1ExportWalletRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2"] + "enum": ["ACTIVITY_TYPE_EXPORT_WALLET"] }, "timestampMs": { "type": "string", @@ -5005,7 +13133,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1CreateAuthenticatorsIntentV2" + "$ref": "#/definitions/v1ExportWalletIntent" }, "generateAppProofs": { "type": "boolean" @@ -5013,1729 +13141,1901 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1CreateAuthenticatorsResult": { + "v1ExportWalletResult": { "type": "object", "properties": { - "authenticatorIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Authenticator IDs." + "walletId": { + "type": "string", + "description": "Unique identifier for a given Wallet." + }, + "exportBundle": { + "type": "string", + "description": "Export bundle containing a wallet mnemonic + optional newline passphrase encrypted by the client's target public key." } }, - "required": ["authenticatorIds"] + "required": ["walletId", "exportBundle"] + }, + "v1Feature": { + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/v1FeatureName" + }, + "value": { + "type": "string" + } + } + }, + "v1FeatureName": { + "type": "string", + "enum": [ + "FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY", + "FEATURE_NAME_WEBAUTHN_ORIGINS", + "FEATURE_NAME_EMAIL_AUTH", + "FEATURE_NAME_EMAIL_RECOVERY", + "FEATURE_NAME_WEBHOOK", + "FEATURE_NAME_SMS_AUTH", + "FEATURE_NAME_OTP_EMAIL_AUTH", + "FEATURE_NAME_AUTH_PROXY", + "FEATURE_NAME_SOLANA_RENT_PREFUND_ENABLED", + "FEATURE_NAME_SWAP_CONFIG", + "FEATURE_NAME_EARN_CONFIG", + "FEATURE_NAME_SWAP_FEE_SPONSORSHIP", + "FEATURE_NAME_SWAP_FIXED_RATE" + ] + }, + "v1FiatOnRampBlockchainNetwork": { + "type": "string", + "enum": [ + "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM", + "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA", + "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE" + ] + }, + "v1FiatOnRampCredential": { + "type": "object", + "properties": { + "fiatOnrampCredentialId": { + "type": "string", + "description": "Unique identifier for a given Fiat On-Ramp Credential." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for an Organization." + }, + "onrampProvider": { + "$ref": "#/definitions/v1FiatOnRampProvider", + "description": "The fiat on-ramp provider." + }, + "projectId": { + "type": "string", + "description": "Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier." + }, + "publishableApiKey": { + "type": "string", + "description": "Publishable API key for the on-ramp provider." + }, + "encryptedSecretApiKey": { + "type": "string", + "description": "Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key." + }, + "encryptedPrivateApiKey": { + "type": "string", + "description": "Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key." + }, + "sandboxMode": { + "type": "boolean", + "description": "If the on-ramp credential is a sandbox credential." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + } + }, + "required": [ + "fiatOnrampCredentialId", + "organizationId", + "onrampProvider", + "publishableApiKey", + "encryptedSecretApiKey", + "createdAt", + "updatedAt" + ] + }, + "v1FiatOnRampCryptoCurrency": { + "type": "string", + "enum": [ + "FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC", + "FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH", + "FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL", + "FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC" + ] + }, + "v1FiatOnRampCurrency": { + "type": "string", + "enum": [ + "FIAT_ON_RAMP_CURRENCY_AUD", + "FIAT_ON_RAMP_CURRENCY_BGN", + "FIAT_ON_RAMP_CURRENCY_BRL", + "FIAT_ON_RAMP_CURRENCY_CAD", + "FIAT_ON_RAMP_CURRENCY_CHF", + "FIAT_ON_RAMP_CURRENCY_COP", + "FIAT_ON_RAMP_CURRENCY_CZK", + "FIAT_ON_RAMP_CURRENCY_DKK", + "FIAT_ON_RAMP_CURRENCY_DOP", + "FIAT_ON_RAMP_CURRENCY_EGP", + "FIAT_ON_RAMP_CURRENCY_EUR", + "FIAT_ON_RAMP_CURRENCY_GBP", + "FIAT_ON_RAMP_CURRENCY_HKD", + "FIAT_ON_RAMP_CURRENCY_IDR", + "FIAT_ON_RAMP_CURRENCY_ILS", + "FIAT_ON_RAMP_CURRENCY_JOD", + "FIAT_ON_RAMP_CURRENCY_KES", + "FIAT_ON_RAMP_CURRENCY_KWD", + "FIAT_ON_RAMP_CURRENCY_LKR", + "FIAT_ON_RAMP_CURRENCY_MXN", + "FIAT_ON_RAMP_CURRENCY_NGN", + "FIAT_ON_RAMP_CURRENCY_NOK", + "FIAT_ON_RAMP_CURRENCY_NZD", + "FIAT_ON_RAMP_CURRENCY_OMR", + "FIAT_ON_RAMP_CURRENCY_PEN", + "FIAT_ON_RAMP_CURRENCY_PLN", + "FIAT_ON_RAMP_CURRENCY_RON", + "FIAT_ON_RAMP_CURRENCY_SEK", + "FIAT_ON_RAMP_CURRENCY_THB", + "FIAT_ON_RAMP_CURRENCY_TRY", + "FIAT_ON_RAMP_CURRENCY_TWD", + "FIAT_ON_RAMP_CURRENCY_USD", + "FIAT_ON_RAMP_CURRENCY_VND", + "FIAT_ON_RAMP_CURRENCY_ZAR" + ] + }, + "v1FiatOnRampPaymentMethod": { + "type": "string", + "enum": [ + "FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD", + "FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY", + "FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER", + "FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT", + "FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY", + "FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER", + "FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT", + "FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL", + "FIAT_ON_RAMP_PAYMENT_METHOD_VENMO", + "FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE", + "FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT", + "FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET", + "FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT" + ] }, - "v1CreateFiatOnRampCredentialIntent": { - "type": "object", - "properties": { - "onrampProvider": { - "$ref": "#/definitions/v1FiatOnRampProvider", - "description": "The fiat on-ramp provider" - }, - "projectId": { - "type": "string", - "description": "Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier" - }, - "publishableApiKey": { - "type": "string", - "description": "Publishable API key for the on-ramp provider" - }, - "encryptedSecretApiKey": { - "type": "string", - "description": "Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key" - }, - "encryptedPrivateApiKey": { - "type": "string", - "description": "Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key." - }, - "sandboxMode": { - "type": "boolean", - "description": "If the on-ramp credential is a sandbox credential" - } - }, - "required": [ - "onrampProvider", - "publishableApiKey", - "encryptedSecretApiKey" + "v1FiatOnRampProvider": { + "type": "string", + "enum": [ + "FIAT_ON_RAMP_PROVIDER_COINBASE", + "FIAT_ON_RAMP_PROVIDER_MOONPAY" ] }, - "v1CreateFiatOnRampCredentialRequest": { + "v1GetActivePoliciesRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_FIAT_ON_RAMP_CREDENTIAL"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/v1CreateFiatOnRampCredentialIntent" - }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1CreateFiatOnRampCredentialResult": { - "type": "object", - "properties": { - "fiatOnRampCredentialId": { - "type": "string", - "description": "Unique identifier of the Fiat On-Ramp credential that was created" } }, - "required": ["fiatOnRampCredentialId"] + "required": ["organizationId"] }, - "v1CreateInvitationsIntent": { + "v1GetActivePoliciesResponse": { "type": "object", "properties": { - "invitations": { + "statuses": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1InvitationParams" + "$ref": "#/definitions/v1ActivePolicyStatus" }, - "description": "A list of Invitations." + "description": "The active/inactive status of every policy in the organization." + }, + "evaluatedAtMs": { + "type": "string", + "format": "uint64", + "description": "The enclave's trusted timestamp (Unix epoch milliseconds) used to evaluate every policy." } }, - "required": ["invitations"] + "required": ["statuses", "evaluatedAtMs"] }, - "v1CreateInvitationsRequest": { + "v1GetActivitiesRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_INVITATIONS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateInvitationsIntent" + "filterByStatus": { + "type": "array", + "items": { + "$ref": "#/definitions/v1ActivityStatus" + }, + "description": "Array of activity statuses filtering which activities will be listed in the response." }, - "generateAppProofs": { - "type": "boolean" + "paginationOptions": { + "$ref": "#/definitions/v1Pagination", + "description": "Parameters used for cursor-based pagination." + }, + "filterByType": { + "type": "array", + "items": { + "$ref": "#/definitions/v1ActivityType" + }, + "description": "Array of activity types filtering which activities will be listed in the response." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId"] }, - "v1CreateInvitationsResult": { + "v1GetActivitiesResponse": { "type": "object", "properties": { - "invitationIds": { + "activities": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/v1Activity" }, - "description": "A list of Invitation IDs" + "description": "A list of activities." } }, - "required": ["invitationIds"] + "required": ["activities"] }, - "v1CreateOauth2CredentialIntent": { + "v1GetActivityRequest": { "type": "object", "properties": { - "provider": { - "$ref": "#/definitions/v1Oauth2Provider", - "description": "The OAuth 2.0 provider" - }, - "clientId": { + "organizationId": { "type": "string", - "description": "The Client ID issued by the OAuth 2.0 provider" + "description": "Unique identifier for a given Organization." }, - "encryptedClientSecret": { + "activityId": { "type": "string", - "description": "The client secret issued by the OAuth 2.0 provider encrypted to the TLS Fetcher quorum key" + "description": "Unique identifier for a given activity object." } }, - "required": ["provider", "clientId", "encryptedClientSecret"] + "required": ["organizationId", "activityId"] }, - "v1CreateOauth2CredentialRequest": { + "v1GetApiKeyRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_OAUTH2_CREDENTIAL"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateOauth2CredentialIntent" - }, - "generateAppProofs": { - "type": "boolean" + "apiKeyId": { + "type": "string", + "description": "Unique identifier for a given API key." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "apiKeyId"] }, - "v1CreateOauth2CredentialResult": { + "v1GetApiKeyResponse": { "type": "object", "properties": { - "oauth2CredentialId": { - "type": "string", - "description": "Unique identifier of the OAuth 2.0 credential that was created" + "apiKey": { + "$ref": "#/definitions/v1ApiKey", + "description": "An API key." } }, - "required": ["oauth2CredentialId"] + "required": ["apiKey"] }, - "v1CreateOauthProvidersIntent": { + "v1GetApiKeysRequest": { "type": "object", "properties": { - "userId": { + "organizationId": { "type": "string", - "description": "The ID of the User to add an Oauth provider to" + "description": "Unique identifier for a given Organization." }, - "oauthProviders": { + "userId": { + "type": "string", + "description": "Unique identifier for a given user." + } + }, + "required": ["organizationId"] + }, + "v1GetApiKeysResponse": { + "type": "object", + "properties": { + "apiKeys": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1OauthProviderParams" + "$ref": "#/definitions/v1ApiKey" }, - "description": "A list of Oauth providers." + "description": "A list of API keys." } }, - "required": ["userId", "oauthProviders"] + "required": ["apiKeys"] }, - "v1CreateOauthProvidersRequest": { + "v1GetAppProofsRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateOauthProvidersIntent" - }, - "generateAppProofs": { - "type": "boolean" + "activityId": { + "type": "string", + "description": "Unique identifier for a given activity." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "activityId"] }, - "v1CreateOauthProvidersResult": { + "v1GetAppProofsResponse": { "type": "object", "properties": { - "providerIds": { + "appProofs": { "type": "array", "items": { - "type": "string" - }, - "description": "A list of unique identifiers for Oauth Providers" + "type": "object", + "$ref": "#/definitions/v1AppProof" + } } }, - "required": ["providerIds"] + "required": ["appProofs"] }, - "v1CreateOrganizationIntent": { + "v1GetAppStatusRequest": { "type": "object", "properties": { - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "rootEmail": { + "organizationId": { "type": "string", - "description": "The root user's email address." - }, - "rootAuthenticator": { - "$ref": "#/definitions/v1AuthenticatorParams", - "description": "The root user's Authenticator." + "description": "Unique identifier for a given Organization." }, - "rootUserId": { + "appId": { "type": "string", - "description": "Unique identifier for the root user object." + "description": "Unique identifier for a given TVC App." } }, - "required": ["organizationName", "rootEmail", "rootAuthenticator"] + "required": ["organizationId", "appId"] }, - "v1CreateOrganizationIntentV2": { + "v1GetAppStatusResponse": { "type": "object", "properties": { - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "rootEmail": { + "appStatus": { + "$ref": "#/definitions/v1AppStatus", + "description": "Live runtime status for the TVC App" + } + }, + "required": ["appStatus"] + }, + "v1GetAuthenticatorRequest": { + "type": "object", + "properties": { + "organizationId": { "type": "string", - "description": "The root user's email address." - }, - "rootAuthenticator": { - "$ref": "#/definitions/v1AuthenticatorParamsV2", - "description": "The root user's Authenticator." + "description": "Unique identifier for a given Organization." }, - "rootUserId": { + "authenticatorId": { "type": "string", - "description": "Unique identifier for the root user object." + "description": "Unique identifier for a given authenticator." } }, - "required": ["organizationName", "rootEmail", "rootAuthenticator"] + "required": ["organizationId", "authenticatorId"] }, - "v1CreateOrganizationResult": { + "v1GetAuthenticatorResponse": { + "type": "object", + "properties": { + "authenticator": { + "$ref": "#/definitions/v1Authenticator", + "description": "An authenticator." + } + }, + "required": ["authenticator"] + }, + "v1GetAuthenticatorsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given user." } }, - "required": ["organizationId"] + "required": ["organizationId", "userId"] }, - "v1CreatePoliciesIntent": { + "v1GetAuthenticatorsResponse": { "type": "object", "properties": { - "policies": { + "authenticators": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1CreatePolicyIntentV3" + "$ref": "#/definitions/v1Authenticator" }, - "description": "An array of policy intents to be created." + "description": "A list of authenticators." } }, - "required": ["policies"] + "required": ["authenticators"] }, - "v1CreatePoliciesRequest": { + "v1GetBootProofRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_POLICIES"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreatePoliciesIntent" - }, - "generateAppProofs": { - "type": "boolean" + "ephemeralKey": { + "type": "string", + "description": "Hex encoded ephemeral public key." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "ephemeralKey"] }, - "v1CreatePoliciesResult": { + "v1GetClaimEarnFeesStatusRequest": { "type": "object", "properties": { - "policyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of unique identifiers for the created policies." + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "claimRequestId": { + "type": "string", + "description": "The claim_request_id returned by ClaimEarnFees." } }, - "required": ["policyIds"] + "required": ["organizationId", "claimRequestId"] }, - "v1CreatePolicyIntent": { + "v1GetClaimEarnFeesStatusResponse": { "type": "object", "properties": { - "policyName": { + "status": { "type": "string", - "description": "Human-readable name for a Policy." - }, - "selectors": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1Selector" - }, - "description": "A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details." + "enum": ["PENDING", "COMPLETED", "FAILED"], + "description": "Status of the fee claim." }, - "effect": { - "$ref": "#/definitions/v1Effect", - "description": "The instruction to DENY or ALLOW a particular activity following policy selector(s)." + "claimTxHash": { + "type": "string", + "description": "Transaction hash of the fee claim, once available." }, - "notes": { - "type": "string" + "error": { + "type": "string", + "description": "Reason the fee claim transaction failed, when status is FAILED." } }, - "required": ["policyName", "selectors", "effect"] + "required": ["status"] }, - "v1CreatePolicyIntentV2": { + "v1GetEarnClaimRewardsStatusRequest": { "type": "object", "properties": { - "policyName": { + "organizationId": { "type": "string", - "description": "Human-readable name for a Policy." - }, - "selectors": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1SelectorV2" - }, - "description": "A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details." - }, - "effect": { - "$ref": "#/definitions/v1Effect", - "description": "Whether to ALLOW or DENY requests that match the condition and consensus requirements." + "description": "Unique identifier for a given Organization." }, - "notes": { - "type": "string" + "claimRequestId": { + "type": "string", + "description": "The claim_request_id returned by EarnClaimRewards." } }, - "required": ["policyName", "selectors", "effect"] + "required": ["organizationId", "claimRequestId"] }, - "v1CreatePolicyIntentV3": { + "v1GetEarnClaimRewardsStatusResponse": { "type": "object", "properties": { - "policyName": { + "status": { "type": "string", - "description": "Human-readable name for a Policy." - }, - "effect": { - "$ref": "#/definitions/v1Effect", - "description": "The instruction to DENY or ALLOW an activity." + "enum": ["PENDING", "COMPLETED", "FAILED"], + "description": "Status of the rewards claim." }, - "condition": { + "claimTxHash": { "type": "string", - "description": "The condition expression that triggers the Effect" + "description": "Transaction hash of the rewards claim, once available." }, - "consensus": { + "error": { "type": "string", - "description": "The consensus expression that triggers the Effect" + "description": "Reason the rewards claim transaction failed, when status is FAILED." + } + }, + "required": ["status"] + }, + "v1GetEarnDeployStatusRequest": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." }, - "notes": { + "deployRequestId": { "type": "string", - "description": "Notes for a Policy." + "description": "The deploy_request_id returned by EarnDeployWrapper." } }, - "required": ["policyName", "effect", "notes"] + "required": ["organizationId", "deployRequestId"] }, - "v1CreatePolicyRequest": { + "v1GetEarnDeployStatusResponse": { "type": "object", "properties": { - "type": { + "status": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_POLICY_V3"] + "enum": ["PENDING", "COMPLETED", "FAILED"], + "description": "Status of the wrapper deployment." }, - "timestampMs": { + "deployTxHash": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Transaction hash of the deployment, once available." }, + "error": { + "type": "string", + "description": "Reason the deployment transaction failed, when status is FAILED." + } + }, + "required": ["status"] + }, + "v1GetEarnDepositStatusRequest": { + "type": "object", + "properties": { "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreatePolicyIntentV3" - }, - "generateAppProofs": { - "type": "boolean" + "depositRequestId": { + "type": "string", + "description": "The deposit_request_id returned by EarnDeposit." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "depositRequestId"] }, - "v1CreatePolicyResult": { + "v1GetEarnDepositStatusResponse": { "type": "object", "properties": { - "policyId": { + "status": { "type": "string", - "description": "Unique identifier for a given Policy." + "enum": ["PENDING", "COMPLETED", "FAILED"], + "description": "Status of the deposit." + }, + "depositTxHash": { + "type": "string", + "description": "Transaction hash of the deposit, once available." + }, + "error": { + "type": "string", + "description": "Reason the deposit transaction failed, when status is FAILED." } }, - "required": ["policyId"] + "required": ["status"] }, - "v1CreatePrivateKeyTagIntent": { + "v1GetEarnWithdrawStatusRequest": { "type": "object", "properties": { - "privateKeyTagName": { + "organizationId": { "type": "string", - "description": "Human-readable name for a Private Key Tag." + "description": "Unique identifier for a given Organization." }, - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs." + "withdrawRequestId": { + "type": "string", + "description": "The withdraw_request_id returned by EarnWithdraw." } }, - "required": ["privateKeyTagName", "privateKeyIds"] + "required": ["organizationId", "withdrawRequestId"] }, - "v1CreatePrivateKeyTagRequest": { + "v1GetEarnWithdrawStatusResponse": { "type": "object", "properties": { - "type": { + "status": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG"] + "enum": ["PENDING", "COMPLETED", "FAILED"], + "description": "Status of the withdrawal." }, - "timestampMs": { + "withdrawTxHash": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Transaction hash of the withdrawal, once available." }, + "error": { + "type": "string", + "description": "Reason the withdrawal transaction failed, when status is FAILED." + } + }, + "required": ["status"] + }, + "v1GetGasUsageRequest": { + "type": "object", + "properties": { "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/v1CreatePrivateKeyTagIntent" - }, - "generateAppProofs": { - "type": "boolean" } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId"] }, - "v1CreatePrivateKeyTagResult": { + "v1GetGasUsageResponse": { "type": "object", "properties": { - "privateKeyTagId": { + "windowDurationMinutes": { + "type": "integer", + "format": "int32", + "description": "The window duration (in minutes) for the organization or sub-organization." + }, + "windowLimitUsd": { "type": "string", - "description": "Unique identifier for a given Private Key Tag." + "description": "The window limit (in USD) for the organization or sub-organization." }, - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs." + "usageUsd": { + "type": "string", + "description": "The total gas usage (in USD) of all sponsored transactions processed over the last `window_duration_minutes`" } }, - "required": ["privateKeyTagId", "privateKeyIds"] + "required": ["windowDurationMinutes", "windowLimitUsd", "usageUsd"] }, - "v1CreatePrivateKeysIntent": { + "v1GetIpAllowlistRequest": { "type": "object", "properties": { - "privateKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1PrivateKeyParams" - }, - "description": "A list of Private Keys." + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "publicKey": { + "type": "string", + "description": "If provided, return only the allowlist for this specific API key." } }, - "required": ["privateKeys"] + "required": ["organizationId"] }, - "v1CreatePrivateKeysIntentV2": { + "v1GetIpAllowlistResponse": { "type": "object", "properties": { - "privateKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1PrivateKeyParams" - }, - "description": "A list of Private Keys." + "allowlist": { + "$ref": "#/definitions/v1IpAllowlist" } }, - "required": ["privateKeys"] + "required": ["allowlist"] }, - "v1CreatePrivateKeysRequest": { + "v1GetLatestBootProofRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreatePrivateKeysIntentV2" - }, - "generateAppProofs": { - "type": "boolean" + "appName": { + "type": "string", + "description": "Unique identifier (UUID) of the enclave app." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "appName"] }, - "v1CreatePrivateKeysResult": { + "v1GetMfaPoliciesRequest": { "type": "object", "properties": { - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs." + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given user." } }, - "required": ["privateKeyIds"] + "required": ["organizationId", "userId"] }, - "v1CreatePrivateKeysResultV2": { + "v1GetMfaPoliciesResponse": { "type": "object", "properties": { - "privateKeys": { + "mfaPolicies": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1PrivateKeyResult" + "$ref": "#/definitions/v1MfaPolicy" }, - "description": "A list of Private Key IDs and addresses." + "description": "A list of multi-factor authentication policies for a user." } }, - "required": ["privateKeys"] - }, - "v1CreateReadOnlySessionIntent": { - "type": "object" + "required": ["mfaPolicies"] }, - "v1CreateReadOnlySessionRequest": { + "v1GetMfaPolicyRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateReadOnlySessionIntent" + "userId": { + "type": "string", + "description": "Unique identifier for a given user." }, - "generateAppProofs": { - "type": "boolean" + "mfaPolicyId": { + "type": "string", + "description": "Unique identifier for a given MFA policy." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "userId", "mfaPolicyId"] }, - "v1CreateReadOnlySessionResult": { + "v1GetMfaPolicyResponse": { + "type": "object", + "properties": { + "mfaPolicy": { + "$ref": "#/definitions/v1MfaPolicy", + "description": "Multi-factor authentication policy for a user." + } + }, + "required": ["mfaPolicy"] + }, + "v1GetMfaStatusRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." + "description": "Unique identifier for a given Organization." }, - "organizationName": { + "activityId": { "type": "string", - "description": "Human-readable name for an Organization." + "description": "The unique identifier of the activity to get MFA status for." }, "userId": { "type": "string", - "description": "Unique identifier for a given User." - }, - "username": { - "type": "string", - "description": "Human-readable name for a User." - }, - "session": { - "type": "string", - "description": "String representing a read only session" - }, - "sessionExpiry": { - "type": "string", - "format": "uint64", - "description": "UTC timestamp in seconds representing the expiry time for the read only session." + "description": "Optional user ID to filter MFA status for a specific user." } }, - "required": [ - "organizationId", - "organizationName", - "userId", - "username", - "session", - "sessionExpiry" - ] + "required": ["organizationId", "activityId"] }, - "v1CreateReadWriteSessionIntent": { + "v1GetMfaStatusResponse": { "type": "object", "properties": { - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted." - }, - "email": { - "type": "string", - "description": "Email of the user to create a read write session for" - }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Read Write Session - \u003cTimestamp\u003e" - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + "mfaStatuses": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1MfaStatus" + }, + "description": "A list of MFA statuses for the activity's votes." } }, - "required": ["targetPublicKey", "email"] + "required": ["mfaStatuses"] }, - "v1CreateReadWriteSessionIntentV2": { + "v1GetNoncesRequest": { "type": "object", "properties": { - "targetPublicKey": { + "organizationId": { "type": "string", - "description": "Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted." + "description": "Unique identifier for a given Organization." }, - "userId": { + "address": { "type": "string", - "description": "Unique identifier for a given User." + "description": "The Ethereum address to query nonces for." }, - "apiKeyName": { + "caip2": { "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Read Write Session - \u003cTimestamp\u003e" + "enum": [ + "eip155:1", + "eip155:11155111", + "eip155:8453", + "eip155:84532", + "eip155:137", + "eip155:80002", + "eip155:56", + "eip155:97", + "eip155:10", + "eip155:11155420", + "eip155:143", + "eip155:10143", + "eip155:42161", + "eip155:4217", + "eip155:42431", + "eip155:421614", + "eip155:4663", + "eip155:46630", + "eip155:5042", + "eip155:5042002" + ], + "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + "nonce": { + "type": "boolean", + "description": "Whether to fetch the standard on-chain nonce." }, - "invalidateExisting": { + "gasStationNonce": { "type": "boolean", - "description": "Invalidate all other previously generated ReadWriteSession API keys" + "description": "Whether to fetch the gas station nonce used for sponsored transactions." } }, - "required": ["targetPublicKey"] + "required": ["organizationId", "address", "caip2"] }, - "v1CreateReadWriteSessionRequest": { + "v1GetNoncesResponse": { "type": "object", "properties": { - "type": { + "nonce": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2"] + "format": "uint64", + "description": "The standard on-chain nonce for the address, if requested." }, - "timestampMs": { + "gasStationNonce": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, + "format": "uint64", + "description": "The gas station nonce for sponsored transactions, if requested." + } + } + }, + "v1GetOauth2CredentialRequest": { + "type": "object", + "properties": { "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateReadWriteSessionIntentV2" - }, - "generateAppProofs": { - "type": "boolean" + "oauth2CredentialId": { + "type": "string", + "description": "Unique identifier for a given OAuth 2.0 Credential." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "oauth2CredentialId"] }, - "v1CreateReadWriteSessionResult": { + "v1GetOauth2CredentialResponse": { "type": "object", "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." - }, - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "username": { - "type": "string", - "description": "Human-readable name for a User." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." - }, - "credentialBundle": { - "type": "string", - "description": "HPKE encrypted credential bundle" + "oauth2Credential": { + "$ref": "#/definitions/v1Oauth2Credential" } }, - "required": [ - "organizationId", - "organizationName", - "userId", - "username", - "apiKeyId", - "credentialBundle" - ] + "required": ["oauth2Credential"] }, - "v1CreateReadWriteSessionResultV2": { + "v1GetOauthProvidersRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." - }, - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." + "description": "Unique identifier for a given Organization." }, "userId": { "type": "string", - "description": "Unique identifier for a given User." - }, - "username": { - "type": "string", - "description": "Human-readable name for a User." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." - }, - "credentialBundle": { - "type": "string", - "description": "HPKE encrypted credential bundle" + "description": "Unique identifier for a given user." } }, - "required": [ - "organizationId", - "organizationName", - "userId", - "username", - "apiKeyId", - "credentialBundle" - ] + "required": ["organizationId"] }, - "v1CreateSmartContractInterfaceIntent": { + "v1GetOauthProvidersResponse": { "type": "object", "properties": { - "smartContractAddress": { - "type": "string", - "description": "Corresponding contract address or program ID" - }, - "smartContractInterface": { - "type": "string", - "description": "ABI/IDL as a JSON string. Limited to 400kb" - }, - "type": { - "$ref": "#/definitions/v1SmartContractInterfaceType" - }, - "label": { - "type": "string", - "description": "Human-readable name for a Smart Contract Interface." - }, - "notes": { - "type": "string", - "description": "Notes for a Smart Contract Interface." + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProvider" + }, + "description": "A list of Oauth providers." } }, - "required": [ - "smartContractAddress", - "smartContractInterface", - "type", - "label" - ] + "required": ["oauthProviders"] }, - "v1CreateSmartContractInterfaceRequest": { + "v1GetOnRampTransactionStatusRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_SMART_CONTRACT_INTERFACE"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateSmartContractInterfaceIntent" + "transactionId": { + "type": "string", + "description": "The unique identifier for the fiat on ramp transaction." }, - "generateAppProofs": { - "type": "boolean" + "refresh": { + "type": "boolean", + "description": "Optional flag to specify if the transaction status should be refreshed from the fiat on ramp provider. Default = false." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "transactionId"] }, - "v1CreateSmartContractInterfaceResult": { + "v1GetOnRampTransactionStatusResponse": { "type": "object", "properties": { - "smartContractInterfaceId": { + "transactionStatus": { "type": "string", - "description": "The ID of the created Smart Contract Interface." + "description": "The status of the fiat on ramp transaction." } }, - "required": ["smartContractInterfaceId"] + "required": ["transactionStatus"] }, - "v1CreateSubOrganizationIntent": { + "v1GetOrganizationConfigsRequest": { "type": "object", "properties": { - "name": { + "organizationId": { "type": "string", - "description": "Name for this sub-organization" - }, - "rootAuthenticator": { - "$ref": "#/definitions/v1AuthenticatorParamsV2", - "description": "Root User authenticator for this new sub-organization" + "description": "Unique identifier for a given Organization." } }, - "required": ["name", "rootAuthenticator"] + "required": ["organizationId"] }, - "v1CreateSubOrganizationIntentV2": { + "v1GetOrganizationConfigsResponse": { "type": "object", "properties": { - "subOrganizationName": { + "configs": { + "$ref": "#/definitions/v1Config", + "description": "Organization configs including quorum settings and organization features." + } + }, + "required": ["configs"] + }, + "v1GetPoliciesRequest": { + "type": "object", + "properties": { + "organizationId": { "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] + }, + "v1GetPoliciesResponse": { + "type": "object", + "properties": { + "policies": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1RootUserParams" + "$ref": "#/definitions/v1Policy" }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + "description": "A list of policies." } }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + "required": ["policies"] }, - "v1CreateSubOrganizationIntentV3": { + "v1GetPolicyEvaluationsRequest": { "type": "object", "properties": { - "subOrganizationName": { + "organizationId": { "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1RootUserParams" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" + "description": "Unique identifier for a given Organization." }, - "privateKeys": { + "activityId": { + "type": "string", + "description": "Unique identifier for a given activity." + } + }, + "required": ["organizationId", "activityId"] + }, + "v1GetPolicyEvaluationsResponse": { + "type": "object", + "properties": { + "policyEvaluations": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1PrivateKeyParams" - }, - "description": "A list of Private Keys." + "$ref": "#/definitions/externalactivityv1PolicyEvaluation" + } } }, - "required": [ - "subOrganizationName", - "rootUsers", - "rootQuorumThreshold", - "privateKeys" - ] + "required": ["policyEvaluations"] }, - "v1CreateSubOrganizationIntentV4": { + "v1GetPolicyRequest": { "type": "object", "properties": { - "subOrganizationName": { + "organizationId": { "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1RootUserParams" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "wallet": { - "$ref": "#/definitions/v1WalletParams", - "description": "The wallet to create for the sub-organization" - }, - "disableEmailRecovery": { - "type": "boolean", - "description": "Disable email recovery for the sub-organization" + "description": "Unique identifier for a given Organization." }, - "disableEmailAuth": { - "type": "boolean", - "description": "Disable email auth for the sub-organization" + "policyId": { + "type": "string", + "description": "Unique identifier for a given policy." } }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + "required": ["organizationId", "policyId"] }, - "v1CreateSubOrganizationIntentV5": { + "v1GetPolicyResponse": { "type": "object", "properties": { - "subOrganizationName": { + "policy": { + "$ref": "#/definitions/v1Policy", + "description": "Object that codifies rules defining the actions that are permissible within an organization." + } + }, + "required": ["policy"] + }, + "v1GetPrivateKeyRequest": { + "type": "object", + "properties": { + "organizationId": { "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1RootUserParamsV2" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "wallet": { - "$ref": "#/definitions/v1WalletParams", - "description": "The wallet to create for the sub-organization" - }, - "disableEmailRecovery": { - "type": "boolean", - "description": "Disable email recovery for the sub-organization" + "description": "Unique identifier for a given Organization." }, - "disableEmailAuth": { - "type": "boolean", - "description": "Disable email auth for the sub-organization" + "privateKeyId": { + "type": "string", + "description": "Unique identifier for a given private key." } }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + "required": ["organizationId", "privateKeyId"] }, - "v1CreateSubOrganizationIntentV6": { + "v1GetPrivateKeyResponse": { "type": "object", "properties": { - "subOrganizationName": { + "privateKey": { + "$ref": "#/definitions/v1PrivateKey", + "description": "Cryptographic public/private key pair that can be used for cryptocurrency needs or more generalized encryption." + } + }, + "required": ["privateKey"] + }, + "v1GetPrivateKeysRequest": { + "type": "object", + "properties": { + "organizationId": { "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1RootUserParamsV3" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "wallet": { - "$ref": "#/definitions/v1WalletParams", - "description": "The wallet to create for the sub-organization" - }, - "disableEmailRecovery": { - "type": "boolean", - "description": "Disable email recovery for the sub-organization" - }, - "disableEmailAuth": { - "type": "boolean", - "description": "Disable email auth for the sub-organization" + "description": "Unique identifier for a given Organization." } }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + "required": ["organizationId"] }, - "v1CreateSubOrganizationIntentV7": { + "v1GetPrivateKeysResponse": { "type": "object", "properties": { - "subOrganizationName": { - "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { + "privateKeys": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1RootUserParamsV4" + "$ref": "#/definitions/v1PrivateKey" }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "wallet": { - "$ref": "#/definitions/v1WalletParams", - "description": "The wallet to create for the sub-organization" - }, - "disableEmailRecovery": { - "type": "boolean", - "description": "Disable email recovery for the sub-organization" - }, - "disableEmailAuth": { - "type": "boolean", - "description": "Disable email auth for the sub-organization" - }, - "disableSmsAuth": { - "type": "boolean", - "description": "Disable OTP SMS auth for the sub-organization" - }, - "disableOtpEmailAuth": { - "type": "boolean", - "description": "Disable OTP email auth for the sub-organization" - }, - "verificationToken": { + "description": "A list of private keys." + } + }, + "required": ["privateKeys"] + }, + "v1GetSendTransactionStatusRequest": { + "type": "object", + "properties": { + "organizationId": { "type": "string", - "description": "Signed JWT containing a unique id, expiry, verification type, contact" + "description": "Unique identifier for a given Organization." }, - "clientSignature": { - "$ref": "#/definitions/v1ClientSignature", - "description": "Optional signature proving authorization for this sub-organization creation. The signature is over the verification token ID and the root user parameters for the root user associated with the verification token. Only required if a public key was provided during the verification step." + "sendTransactionStatusId": { + "type": "string", + "description": "The unique identifier of a send transaction request." } }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] + "required": ["organizationId", "sendTransactionStatusId"] }, - "v1CreateSubOrganizationRequest": { + "v1GetSendTransactionStatusResponse": { "type": "object", "properties": { - "type": { + "txStatus": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7"] + "description": "The current status of the send transaction." }, - "timestampMs": { + "eth": { + "$ref": "#/definitions/v1EthSendTransactionStatus", + "description": "Ethereum-specific transaction status." + }, + "solana": { + "$ref": "#/definitions/v1SolanaSendTransactionStatus", + "description": "Solana-specific transaction status." + }, + "txError": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "The error encountered when broadcasting or confirming the transaction, if any." }, + "error": { + "$ref": "#/definitions/v1TxError", + "description": "Structured error information including revert details, if available." + } + }, + "required": ["txStatus"] + }, + "v1GetSessionProfileRequest": { + "type": "object", + "properties": { "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateSubOrganizationIntentV7" - }, - "generateAppProofs": { - "type": "boolean" + "sessionProfileId": { + "type": "string", + "description": "Unique identifier for a session profile." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "sessionProfileId"] }, - "v1CreateSubOrganizationResult": { + "v1GetSessionProfileResponse": { "type": "object", "properties": { - "subOrganizationId": { - "type": "string" - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } + "sessionProfile": { + "$ref": "#/definitions/v1SessionProfile", + "description": "Session profile for a user, including details about the user's authenticators, Oauth providers, API keys, and MFA policies." } }, - "required": ["subOrganizationId"] + "required": ["sessionProfile"] }, - "v1CreateSubOrganizationResultV3": { + "v1GetSessionProfilesRequest": { "type": "object", "properties": { - "subOrganizationId": { - "type": "string" - }, - "privateKeys": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] + }, + "v1GetSessionProfilesResponse": { + "type": "object", + "properties": { + "sessionProfiles": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1PrivateKeyResult" + "$ref": "#/definitions/v1SessionProfile" }, - "description": "A list of Private Key IDs and addresses." - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } + "description": "A list of session profiles for users in the organization." } }, - "required": ["subOrganizationId", "privateKeys"] + "required": ["sessionProfiles"] }, - "v1CreateSubOrganizationResultV4": { + "v1GetSmartContractInterfaceRequest": { "type": "object", "properties": { - "subOrganizationId": { - "type": "string" - }, - "wallet": { - "$ref": "#/definitions/v1WalletResult" + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } + "smartContractInterfaceId": { + "type": "string", + "description": "Unique identifier for a given smart contract interface." } }, - "required": ["subOrganizationId"] + "required": ["organizationId", "smartContractInterfaceId"] }, - "v1CreateSubOrganizationResultV5": { + "v1GetSmartContractInterfaceResponse": { "type": "object", "properties": { - "subOrganizationId": { - "type": "string" - }, - "wallet": { - "$ref": "#/definitions/v1WalletResult" - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } + "smartContractInterface": { + "$ref": "#/definitions/externaldatav1SmartContractInterface", + "description": "Object to be used in conjunction with policies to guard transaction signing." } }, - "required": ["subOrganizationId"] + "required": ["smartContractInterface"] }, - "v1CreateSubOrganizationResultV6": { + "v1GetSmartContractInterfacesRequest": { "type": "object", "properties": { - "subOrganizationId": { - "type": "string" - }, - "wallet": { - "$ref": "#/definitions/v1WalletResult" - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." } }, - "required": ["subOrganizationId"] + "required": ["organizationId"] }, - "v1CreateSubOrganizationResultV7": { + "v1GetSmartContractInterfacesResponse": { "type": "object", "properties": { - "subOrganizationId": { - "type": "string" - }, - "wallet": { - "$ref": "#/definitions/v1WalletResult" - }, - "rootUserIds": { + "smartContractInterfaces": { "type": "array", "items": { - "type": "string" - } + "type": "object", + "$ref": "#/definitions/externaldatav1SmartContractInterface" + }, + "description": "A list of smart contract interfaces." } }, - "required": ["subOrganizationId"] + "required": ["smartContractInterfaces"] }, - "v1CreateTvcAppIntent": { + "v1GetSubOrgIdsRequest": { "type": "object", "properties": { - "name": { - "type": "string", - "description": "The name of the new TVC application" - }, - "quorumPublicKey": { + "organizationId": { "type": "string", - "description": "Quorum public key to use for this application" + "description": "Unique identifier for the parent organization. This is used to find sub-organizations within it." }, - "manifestSetId": { + "filterType": { "type": "string", - "description": "Unique identifier for an existing TVC operator set to use as the Manifest Set for this TVC application. If left empty, a new Manifest Set configuration is required" - }, - "manifestSetParams": { - "$ref": "#/definitions/v1TvcOperatorSetParams", - "description": "Configuration to create a new TVC operator set, used as the Manifest Set for this TVC application. If left empty, a Manifest Set ID is required" + "description": "Specifies the type of filter to apply, i.e 'CREDENTIAL_ID', 'NAME', 'USERNAME', 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN', 'WALLET_ACCOUNT_ADDRESS' or 'PUBLIC_KEY'" }, - "shareSetId": { + "filterValue": { "type": "string", - "description": "Unique identifier for an existing TVC operator set to use as the Share Set for this TVC application. If left empty, a new Share Set configuration is required" - }, - "shareSetParams": { - "$ref": "#/definitions/v1TvcOperatorSetParams", - "description": "Configuration to create a new TVC operator set, used as the Share Set for this TVC application. If left empty, a Share Set ID is required" + "description": "The value of the filter to apply for the specified type. For example, a specific email or name string." }, - "enableEgress": { - "type": "boolean", - "description": "Enables network egress for this TVC app. Default if not provided: false." + "paginationOptions": { + "$ref": "#/definitions/v1Pagination", + "description": "Parameters used for cursor-based pagination." } }, - "required": ["name", "quorumPublicKey"] + "required": ["organizationId"] }, - "v1CreateTvcAppResult": { + "v1GetSubOrgIdsResponse": { "type": "object", "properties": { - "appId": { - "type": "string", - "description": "The unique identifier for the TVC application" - }, - "manifestSetId": { - "type": "string", - "description": "The unique identifier for the TVC manifest set" - }, - "manifestSetOperatorIds": { + "organizationIds": { "type": "array", "items": { "type": "string" }, - "description": "The unique identifier(s) of the manifest set operators" + "description": "List of unique identifiers for the matching sub-organizations." + } + }, + "required": ["organizationIds"] + }, + "v1GetSwapSponsorshipUsageRequest": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given organization." + } + }, + "required": ["organizationId"] + }, + "v1GetSwapSponsorshipUsageResponse": { + "type": "object", + "properties": { + "feeSponsorship": { + "$ref": "#/definitions/v1SwapSponsorshipFeature" + }, + "fixedRate": { + "$ref": "#/definitions/v1SwapSponsorshipFeature" + } + }, + "required": ["feeSponsorship", "fixedRate"] + }, + "v1GetSwapStatusRequest": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." }, - "manifestSetThreshold": { - "type": "integer", - "format": "int64", - "description": "The required number of approvals for the manifest set" + "swapRequestId": { + "type": "string", + "description": "The swap_request_id returned by ExecuteSwap." } }, - "required": [ - "appId", - "manifestSetId", - "manifestSetOperatorIds", - "manifestSetThreshold" - ] + "required": ["organizationId", "swapRequestId"] }, - "v1CreateTvcDeploymentIntent": { + "v1GetSwapStatusResponse": { "type": "object", "properties": { - "appId": { + "status": { "type": "string", - "description": "The unique identifier of the to-be-deployed TVC application" + "description": "Normalized swap status. One of PENDING, COMPLETED, FAILED." }, - "qosVersion": { + "swapKind": { "type": "string", - "description": "The QuorumOS version to use to deploy this application" + "description": "SAME_CHAIN or CROSS_CHAIN." }, - "pivotContainerImageUrl": { + "provider": { "type": "string", - "description": "URL of the container containing the pivot binary" + "description": "Swap provider that executed the swap." }, - "pivotPath": { + "inputToken": { "type": "string", - "description": "Location of the binary in the pivot container" + "description": "CAIP-19 asset ID for the input asset." }, - "pivotArgs": { + "outputToken": { + "type": "string", + "description": "CAIP-19 asset ID for the output asset." + }, + "inputAmount": { + "type": "string", + "description": "Base-unit amount of the input asset." + }, + "originTxHash": { + "type": "string", + "description": "Final included origin-chain transaction hash, when known." + }, + "destinationTxHashes": { "type": "array", "items": { "type": "string" }, - "description": "Arguments to pass to the pivot binary at startup. Encoded as a list of strings, for example [\"--foo\", \"bar\"]" + "description": "Provider-reported destination-chain transaction hashes; cross-chain COMPLETED only." }, - "expectedPivotDigest": { + "outputAmount": { "type": "string", - "description": "Digest of the pivot binary in the pivot container. This value will be inserted in the QOS manifest to ensure application integrity." + "description": "Actual base-unit output amount on COMPLETED, when known. Unset on FAILED." }, - "nonce": { - "type": "integer", - "format": "int64", - "description": "Optional nonce to ensure uniqueness of the deployment manifest. If not provided, it defaults to the current Unix timestamp in seconds." + "refund": { + "$ref": "#/definitions/v1SwapRefund", + "description": "Funds returned by the provider after a successful origin transfer and failed cross-chain fill. Omitted for origin transaction failures and same-chain swaps." }, - "pivotContainerEncryptedPullSecret": { + "updatedAt": { "type": "string", - "description": "Optional encrypted pull secret to authorize Turnkey to pull the pivot container image. If your image is public, leave this empty." + "description": "Timestamp of the last swap status change, as millisecond epoch string." }, - "pivotBindAddresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Address(es) on which the pivot binary listens. A bind address can be a port alone (e.g. \"3000\") or an ip:port (e.g. \"127.0.0.1:3000\"). If provided as a port alone, the IP is assumed to be 0.0.0.0" + "error": { + "$ref": "#/definitions/v1SwapError", + "description": "Normalized failure details, present whenever status is FAILED." }, - "debugMode": { - "type": "boolean", - "description": "Optional flag to indicate whether to deploy the TVC app in debug mode, which includes additional logging and debugging tools. Default is false." + "destinationAddress": { + "type": "string", + "description": "Address that receives the output asset." } }, "required": [ - "appId", - "qosVersion", - "pivotContainerImageUrl", - "pivotPath", - "pivotArgs", - "expectedPivotDigest" + "status", + "swapKind", + "provider", + "inputToken", + "outputToken", + "inputAmount", + "updatedAt" ] }, - "v1CreateTvcDeploymentResult": { + "v1GetTvcAppDeploymentsRequest": { "type": "object", "properties": { - "deploymentId": { + "organizationId": { "type": "string", - "description": "The unique identifier for the TVC deployment" + "description": "Unique identifier for a given Organization." }, - "manifestId": { + "appId": { "type": "string", - "description": "The unique identifier for the TVC manifest" + "description": "Unique identifier for a given TVC App." } }, - "required": ["deploymentId", "manifestId"] + "required": ["organizationId", "appId"] }, - "v1CreateTvcManifestApprovalsIntent": { + "v1GetTvcAppDeploymentsResponse": { "type": "object", "properties": { - "manifestId": { - "type": "string", - "description": "Unique identifier of the TVC deployment to approve" - }, - "approvals": { + "tvcDeployments": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1TvcManifestApproval" + "$ref": "#/definitions/v1TvcDeployment" }, - "description": "List of manifest approvals" + "description": "List of deployments for this TVC App" } }, - "required": ["manifestId", "approvals"] + "required": ["tvcDeployments"] }, - "v1CreateTvcManifestApprovalsResult": { + "v1GetTvcAppRequest": { "type": "object", "properties": { - "approvalIds": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "tvcAppId": { + "type": "string", + "description": "Unique identifier for a given TVC App." + } + }, + "required": ["organizationId", "tvcAppId"] + }, + "v1GetTvcAppResponse": { + "type": "object", + "properties": { + "tvcApp": { + "$ref": "#/definitions/v1TvcApp", + "description": "Details about a single TVC App" + } + }, + "required": ["tvcApp"] + }, + "v1GetTvcAppsRequest": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "isLive": { + "type": "boolean", + "description": "Filter TVC Apps by whether they have a live deployment. If omitted, all TVC Apps are returned." + } + }, + "required": ["organizationId"] + }, + "v1GetTvcAppsResponse": { + "type": "object", + "properties": { + "tvcApps": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/v1TvcApp" }, - "description": "The unique identifier(s) for the manifest approvals" + "description": "A list of TVC Apps." } }, - "required": ["approvalIds"] + "required": ["tvcApps"] }, - "v1CreateUserTagIntent": { + "v1GetTvcDeploymentDebugLogsRequest": { "type": "object", "properties": { - "userTagName": { + "organizationId": { "type": "string", - "description": "Human-readable name for a User Tag." + "description": "Unique identifier for a given Organization." }, - "userIds": { + "deploymentId": { + "type": "string", + "description": "Unique identifier for a given TVC Deployment. The deployment must be running in debug mode." + }, + "tailLines": { + "type": "integer", + "format": "int32", + "description": "Limit returned history to the last N lines per replica. If unset or zero, no tail-line limit is applied." + }, + "sinceSeconds": { + "type": "string", + "format": "int64", + "description": "Return logs newer than this many seconds ago. If unset or zero, no since-time limit is applied. Useful for clients that poll to follow logs." + } + }, + "required": ["organizationId", "deploymentId"] + }, + "v1GetTvcDeploymentDebugLogsResponse": { + "type": "object", + "properties": { + "entries": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/v1TvcDeploymentDebugLogEntry" }, - "description": "A list of User IDs." + "description": "Application log entries sorted by platform timestamp." } }, - "required": ["userTagName", "userIds"] + "required": ["entries"] }, - "v1CreateUserTagRequest": { + "v1GetTvcDeploymentProvisioningDetailsRequest": { "type": "object", "properties": { - "type": { + "organizationId": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_USER_TAG"] + "description": "Unique identifier for a given Organization." }, - "timestampMs": { + "deploymentId": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Unique identifier for a given TVC Deployment." + } + }, + "required": ["organizationId", "deploymentId"] + }, + "v1GetTvcDeploymentProvisioningDetailsResponse": { + "type": "object", + "properties": { + "attestationDocument": { + "type": "string", + "format": "byte", + "description": "The attestation document of the provisioning enclave. Present only when a deployment is awaiting provisioning." + }, + "manifestEnvelope": { + "type": "string", + "format": "byte", + "description": "The manifest envelope containing the TVC deployment's manifest and signatures. Present only when a deployment is awaiting provisioning." }, + "provisioningState": { + "$ref": "#/definitions/v1ProvisioningState", + "description": "Current provisioning state." + } + }, + "required": ["provisioningState"] + }, + "v1GetTvcDeploymentRequest": { + "type": "object", + "properties": { "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateUserTagIntent" - }, - "generateAppProofs": { - "type": "boolean" + "deploymentId": { + "type": "string", + "description": "Unique identifier for a given TVC Deployment." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId", "deploymentId"] }, - "v1CreateUserTagResult": { + "v1GetTvcDeploymentResponse": { "type": "object", "properties": { - "userTagId": { + "tvcDeployment": { + "$ref": "#/definitions/v1TvcDeployment", + "description": "Details about a single TVC Deployment" + } + }, + "required": ["tvcDeployment"] + }, + "v1GetTvcOperatorsRequest": { + "type": "object", + "properties": { + "organizationId": { "type": "string", - "description": "Unique identifier for a given User Tag." - }, - "userIds": { + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] + }, + "v1GetTvcOperatorsResponse": { + "type": "object", + "properties": { + "tvcOperators": { "type": "array", "items": { - "type": "string" - }, - "description": "A list of User IDs." + "type": "object", + "$ref": "#/definitions/v1TvcOperator" + } } }, - "required": ["userTagId", "userIds"] + "required": ["tvcOperators"] }, - "v1CreateUsersIntent": { + "v1GetTvcQosVersionsRequest": { "type": "object", "properties": { - "users": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] + }, + "v1GetTvcQosVersionsResponse": { + "type": "object", + "properties": { + "availableVersions": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/v1UserParams" + "type": "string" }, - "description": "A list of Users." + "description": "QOS versions supported for new TVC deployments." + }, + "latestVersion": { + "type": "string", + "description": "Latest recommended QOS version for new TVC deployments." } }, - "required": ["users"] + "required": ["availableVersions", "latestVersion"] }, - "v1CreateUsersIntentV2": { + "v1GetTvcQuorumKeysRequest": { "type": "object", "properties": { - "users": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] + }, + "v1GetTvcQuorumKeysResponse": { + "type": "object", + "properties": { + "tvcQuorumKeys": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1UserParamsV2" - }, - "description": "A list of Users." + "$ref": "#/definitions/v1TvcQuorumKey" + } } }, - "required": ["users"] + "required": ["tvcQuorumKeys"] + }, + "v1GetUserRequest": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given user." + } + }, + "required": ["organizationId", "userId"] + }, + "v1GetUserResponse": { + "type": "object", + "properties": { + "user": { + "$ref": "#/definitions/v1User", + "description": "Web and/or API user within your organization." + } + }, + "required": ["user"] + }, + "v1GetUsersRequest": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + } + }, + "required": ["organizationId"] }, - "v1CreateUsersIntentV3": { + "v1GetUsersResponse": { "type": "object", "properties": { "users": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1UserParamsV3" + "$ref": "#/definitions/v1User" }, - "description": "A list of Users." + "description": "A list of users." } }, "required": ["users"] }, - "v1CreateUsersRequest": { + "v1GetVerifiedSubOrgIdsRequest": { "type": "object", "properties": { - "type": { + "organizationId": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_USERS_V3"] + "description": "Unique identifier for the parent organization. This is used to find sub-organizations within it." }, - "timestampMs": { + "filterType": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN', 'OAUTH_CLAIM', or 'PUBLIC_KEY'" }, - "organizationId": { + "filterValue": { "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/v1CreateUsersIntentV3" + "description": "The value of the filter to apply for the specified type. For example, a specific email or phone number string." }, - "generateAppProofs": { - "type": "boolean" + "paginationOptions": { + "$ref": "#/definitions/v1Pagination", + "description": "Parameters used for cursor-based pagination." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId"] }, - "v1CreateUsersResult": { + "v1GetVerifiedSubOrgIdsResponse": { "type": "object", "properties": { - "userIds": { + "organizationIds": { "type": "array", "items": { "type": "string" }, - "description": "A list of User IDs." + "description": "List of unique identifiers for the matching sub-organizations." } }, - "required": ["userIds"] + "required": ["organizationIds"] }, - "v1CreateWalletAccountsIntent": { + "v1GetWalletAccountRequest": { "type": "object", "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, "walletId": { "type": "string", - "description": "Unique identifier for a given Wallet." + "description": "Unique identifier for a given wallet." }, - "accounts": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1WalletAccountParams" - }, - "description": "A list of wallet Accounts." + "address": { + "type": "string", + "description": "Address corresponding to a wallet account." }, - "persist": { - "type": "boolean", - "description": "Indicates if the wallet accounts should be persisted. This is helpful if you'd like to see the addresses of different derivation paths without actually creating the accounts. Defaults to true." + "path": { + "type": "string", + "description": "Path corresponding to a wallet account." } }, - "required": ["walletId", "accounts"] + "required": ["organizationId", "walletId"] }, - "v1CreateWalletAccountsRequest": { + "v1GetWalletAccountResponse": { + "type": "object", + "properties": { + "account": { + "$ref": "#/definitions/v1WalletAccount", + "description": "The resulting wallet account." + } + }, + "required": ["account"] + }, + "v1GetWalletAccountsRequest": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "parameters": { - "$ref": "#/definitions/v1CreateWalletAccountsIntent" + "walletId": { + "type": "string", + "description": "Unique identifier for a given wallet. If not provided, all accounts for the organization will be returned." }, - "generateAppProofs": { - "type": "boolean" + "includeWalletDetails": { + "type": "boolean", + "description": "Optional flag to specify if the wallet details should be included in the response. Default = false." + }, + "paginationOptions": { + "$ref": "#/definitions/v1Pagination", + "description": "Parameters used for cursor-based pagination." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId"] }, - "v1CreateWalletAccountsResult": { + "v1GetWalletAccountsResponse": { "type": "object", "properties": { - "addresses": { + "accounts": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/v1WalletAccount" }, - "description": "A list of derived addresses." + "description": "A list of accounts generated from a wallet that share a common seed." } }, - "required": ["addresses"] + "required": ["accounts"] }, - "v1CreateWalletIntent": { + "v1GetWalletAddressBalancesRequest": { "type": "object", "properties": { - "walletName": { + "organizationId": { "type": "string", - "description": "Human-readable name for a Wallet." + "description": "Unique identifier for a given Organization." }, - "accounts": { + "address": { + "type": "string", + "description": "Address corresponding to a wallet account. Private key addresses are not supported." + }, + "caip2": { + "type": "string", + "enum": [ + "eip155:1", + "eip155:11155111", + "eip155:8453", + "eip155:84532", + "eip155:137", + "eip155:80002", + "eip155:56", + "eip155:97", + "eip155:10", + "eip155:11155420", + "eip155:143", + "eip155:10143", + "eip155:42161", + "eip155:4217", + "eip155:42431", + "eip155:421614", + "eip155:4663", + "eip155:46630", + "eip155:5042", + "eip155:5042002", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" + ], + "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." + } + }, + "required": ["organizationId", "address", "caip2"] + }, + "v1GetWalletAddressBalancesResponse": { + "type": "object", + "properties": { + "balances": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1WalletAccountParams" + "$ref": "#/definitions/v1AssetBalance" }, - "description": "A list of wallet Accounts. This field, if not needed, should be an empty array in your request body." - }, - "mnemonicLength": { - "type": "integer", - "format": "int32", - "description": "Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24." + "description": "List of asset balances" } - }, - "required": ["walletName", "accounts"] + } }, - "v1CreateWalletRequest": { + "v1GetWalletRequest": { "type": "object", "properties": { - "type": { + "organizationId": { "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_WALLET"] + "description": "Unique identifier for a given Organization." }, - "timestampMs": { + "walletId": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, + "description": "Unique identifier for a given wallet." + } + }, + "required": ["organizationId", "walletId"] + }, + "v1GetWalletResponse": { + "type": "object", + "properties": { + "wallet": { + "$ref": "#/definitions/v1Wallet", + "description": "A collection of deterministically generated cryptographic public / private key pairs that share a common seed." + } + }, + "required": ["wallet"] + }, + "v1GetWalletsRequest": { + "type": "object", + "properties": { "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/v1CreateWalletIntent" - }, - "generateAppProofs": { - "type": "boolean" } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["organizationId"] }, - "v1CreateWalletResult": { + "v1GetWalletsResponse": { "type": "object", "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a Wallet." - }, - "addresses": { + "wallets": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/v1Wallet" }, - "description": "A list of account addresses." + "description": "A list of wallets." } }, - "required": ["walletId", "addresses"] + "required": ["wallets"] }, - "v1CredPropsAuthenticationExtensionsClientOutputs": { + "v1GetWhoamiRequest": { "type": "object", "properties": { - "rk": { - "type": "boolean" + "organizationId": { + "type": "string", + "description": "Unique identifier for a given organization. If the request is being made by a WebAuthN user and their sub-organization ID is unknown, this can be the parent organization ID; using the sub-organization ID when possible is preferred due to performance reasons." } }, - "required": ["rk"] + "required": ["organizationId"] }, - "v1CredentialType": { - "type": "string", - "enum": [ - "CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR", - "CREDENTIAL_TYPE_API_KEY_P256", - "CREDENTIAL_TYPE_RECOVER_USER_KEY_P256", - "CREDENTIAL_TYPE_API_KEY_SECP256K1", - "CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256", - "CREDENTIAL_TYPE_API_KEY_ED25519", - "CREDENTIAL_TYPE_OTP_AUTH_KEY_P256", - "CREDENTIAL_TYPE_READ_WRITE_SESSION_KEY_P256", - "CREDENTIAL_TYPE_OAUTH_KEY_P256", - "CREDENTIAL_TYPE_LOGIN" - ] + "v1GetWhoamiResponse": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "organizationName": { + "type": "string", + "description": "Human-readable name for an organization." + }, + "userId": { + "type": "string", + "description": "Unique identifier for a given user." + }, + "username": { + "type": "string", + "description": "Human-readable name for a user." + } + }, + "required": ["organizationId", "organizationName", "userId", "username"] }, - "v1Curve": { + "v1HashFunction": { "type": "string", - "enum": ["CURVE_SECP256K1", "CURVE_ED25519", "CURVE_P256"] + "enum": [ + "HASH_FUNCTION_NO_OP", + "HASH_FUNCTION_SHA256", + "HASH_FUNCTION_KECCAK256", + "HASH_FUNCTION_NOT_APPLICABLE" + ] }, - "v1CustomRevertError": { + "v1ImportPrivateKeyIntent": { "type": "object", "properties": { - "errorName": { + "userId": { "type": "string", - "description": "The name of the custom error." + "description": "The ID of the User importing a Private Key." }, - "paramsJson": { + "privateKeyName": { "type": "string", - "description": "The decoded parameters as a JSON object." - } - } - }, - "v1DeleteApiKeysIntent": { - "type": "object", - "properties": { - "userId": { + "description": "Human-readable name for a Private Key." + }, + "encryptedBundle": { "type": "string", - "description": "Unique identifier for a given User." + "description": "Bundle containing a raw private key encrypted to the enclave's target public key." }, - "apiKeyIds": { + "curve": { + "$ref": "#/definitions/v1Curve", + "description": "Cryptographic Curve used to generate a given Private Key." + }, + "addressFormats": { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/v1AddressFormat" }, - "description": "A list of API Key IDs." + "description": "Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." } }, - "required": ["userId", "apiKeyIds"] + "required": [ + "userId", + "privateKeyName", + "encryptedBundle", + "curve", + "addressFormats" + ] }, - "v1DeleteApiKeysRequest": { + "v1ImportPrivateKeyRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_API_KEYS"] + "enum": ["ACTIVITY_TYPE_IMPORT_PRIVATE_KEY"] }, "timestampMs": { "type": "string", @@ -6746,7 +15046,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeleteApiKeysIntent" + "$ref": "#/definitions/v1ImportPrivateKeyIntent" }, "generateAppProofs": { "type": "boolean" @@ -6754,89 +15054,74 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeleteApiKeysResult": { - "type": "object", - "properties": { - "apiKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of API Key IDs." - } - }, - "required": ["apiKeyIds"] - }, - "v1DeleteAuthenticatorsIntent": { + "v1ImportPrivateKeyResult": { "type": "object", "properties": { - "userId": { + "privateKeyId": { "type": "string", - "description": "Unique identifier for a given User." + "description": "Unique identifier for a Private Key." }, - "authenticatorIds": { + "addresses": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/immutableactivityv1Address" }, - "description": "A list of Authenticator IDs." + "description": "A list of addresses." } }, - "required": ["userId", "authenticatorIds"] + "required": ["privateKeyId", "addresses"] }, - "v1DeleteAuthenticatorsRequest": { + "v1ImportSecretParams": { "type": "object", "properties": { - "type": { + "name": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_AUTHENTICATORS"] + "description": "Optional human-readable name for the secret. Names must be unique within an organization when provided." }, - "timestampMs": { + "secretPayload": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Encryption suite specific payload containing the secret ciphertext. For enclave encrypt v1 this is a JSON-encoded ClientSendMsg." }, - "organizationId": { + "targetPublicKey": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Targeted transport encryption public key, as returned by InitImportSecrets." }, - "parameters": { - "$ref": "#/definitions/v1DeleteAuthenticatorsIntent" + "encryptionSuite": { + "$ref": "#/definitions/v1TransportEncryptionSuite", + "description": "Transport encryption suite used for the ingress secret." }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1DeleteAuthenticatorsResult": { - "type": "object", - "properties": { - "authenticatorIds": { + "staticProperties": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/v1KeyValue" }, - "description": "Unique identifier for a given Authenticator." + "description": "Policy-visible, static properties to permanently bind to the secret." } }, - "required": ["authenticatorIds"] + "required": ["secretPayload", "targetPublicKey", "encryptionSuite"] }, - "v1DeleteFiatOnRampCredentialIntent": { + "v1ImportSecretsIntent": { "type": "object", "properties": { - "fiatOnrampCredentialId": { - "type": "string", - "description": "The ID of the fiat on-ramp credential to delete" + "secrets": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ImportSecretParams" + }, + "description": "A list of secrets to import." } }, - "required": ["fiatOnrampCredentialId"] + "required": ["secrets"] }, - "v1DeleteFiatOnRampCredentialRequest": { + "v1ImportSecretsRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_FIAT_ON_RAMP_CREDENTIAL"] + "enum": ["ACTIVITY_TYPE_IMPORT_SECRETS"] }, "timestampMs": { "type": "string", @@ -6847,40 +15132,56 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeleteFiatOnRampCredentialIntent" - }, - "generateAppProofs": { - "type": "boolean" + "$ref": "#/definitions/v1ImportSecretsIntent" } }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeleteFiatOnRampCredentialResult": { + "v1ImportSecretsResult": { "type": "object", "properties": { - "fiatOnRampCredentialId": { - "type": "string", - "description": "Unique identifier of the Fiat On-Ramp credential that was deleted" + "secretIds": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Unique identifier for each imported secret, in the order the params were specified." } }, - "required": ["fiatOnRampCredentialId"] + "required": ["secretIds"] }, - "v1DeleteInvitationIntent": { + "v1ImportWalletIntent": { "type": "object", "properties": { - "invitationId": { + "userId": { "type": "string", - "description": "Unique identifier for a given Invitation object." + "description": "The ID of the User importing a Wallet." + }, + "walletName": { + "type": "string", + "description": "Human-readable name for a Wallet." + }, + "encryptedBundle": { + "type": "string", + "description": "Bundle containing a wallet mnemonic encrypted to the enclave's target public key." + }, + "accounts": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1WalletAccountParams" + }, + "description": "A list of wallet Accounts." } }, - "required": ["invitationId"] + "required": ["userId", "walletName", "encryptedBundle", "accounts"] }, - "v1DeleteInvitationRequest": { + "v1ImportWalletRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_INVITATION"] + "enum": ["ACTIVITY_TYPE_IMPORT_WALLET"] }, "timestampMs": { "type": "string", @@ -6891,7 +15192,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeleteInvitationIntent" + "$ref": "#/definitions/v1ImportWalletIntent" }, "generateAppProofs": { "type": "boolean" @@ -6899,83 +15200,84 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeleteInvitationResult": { - "type": "object", - "properties": { - "invitationId": { - "type": "string", - "description": "Unique identifier for a given Invitation." - } - }, - "required": ["invitationId"] - }, - "v1DeleteOauth2CredentialIntent": { + "v1ImportWalletResult": { "type": "object", "properties": { - "oauth2CredentialId": { + "walletId": { "type": "string", - "description": "The ID of the OAuth 2.0 credential to delete" + "description": "Unique identifier for a Wallet." + }, + "addresses": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of account addresses." } }, - "required": ["oauth2CredentialId"] + "required": ["walletId", "addresses"] }, - "v1DeleteOauth2CredentialRequest": { + "v1InitFiatOnRampIntent": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_OAUTH2_CREDENTIAL"] + "onrampProvider": { + "$ref": "#/definitions/v1FiatOnRampProvider", + "description": "Enum to specify which on-ramp provider to use" }, - "timestampMs": { + "walletAddress": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Destination wallet address for the buy transaction." }, - "organizationId": { + "network": { + "$ref": "#/definitions/v1FiatOnRampBlockchainNetwork", + "description": "Blockchain network to be used for the transaction, e.g., bitcoin, ethereum. Maps to MoonPay's network or Coinbase's defaultNetwork." + }, + "cryptoCurrencyCode": { + "$ref": "#/definitions/v1FiatOnRampCryptoCurrency", + "description": "Code for the cryptocurrency to be purchased, e.g., btc, eth. Maps to MoonPay's currencyCode or Coinbase's defaultAsset." + }, + "fiatCurrencyCode": { + "$ref": "#/definitions/v1FiatOnRampCurrency", + "description": "Code for the fiat currency to be used in the transaction, e.g., USD, EUR." + }, + "fiatCurrencyAmount": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount." }, - "parameters": { - "$ref": "#/definitions/v1DeleteOauth2CredentialIntent" + "paymentMethod": { + "$ref": "#/definitions/v1FiatOnRampPaymentMethod", + "description": "Pre-selected payment method, e.g., CREDIT_DEBIT_CARD, APPLE_PAY. Validated against the chosen provider." }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1DeleteOauth2CredentialResult": { - "type": "object", - "properties": { - "oauth2CredentialId": { + "countryCode": { "type": "string", - "description": "Unique identifier of the OAuth 2.0 credential that was deleted" - } - }, - "required": ["oauth2CredentialId"] - }, - "v1DeleteOauthProvidersIntent": { - "type": "object", - "properties": { - "userId": { + "description": "ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB." + }, + "countrySubdivisionCode": { "type": "string", - "description": "The ID of the User to remove an Oauth provider from" + "description": "ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country_code=US." }, - "providerIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Unique identifier for a given Provider." + "sandboxMode": { + "type": "boolean", + "description": "Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false." + }, + "urlForSignature": { + "type": "string", + "description": "Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled." } }, - "required": ["userId", "providerIds"] + "required": [ + "onrampProvider", + "walletAddress", + "network", + "cryptoCurrencyCode" + ] }, - "v1DeleteOauthProvidersRequest": { + "v1InitFiatOnRampRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS"] + "enum": ["ACTIVITY_TYPE_INIT_FIAT_ON_RAMP"] }, "timestampMs": { "type": "string", @@ -6986,7 +15288,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeleteOauthProvidersIntent" + "$ref": "#/definitions/v1InitFiatOnRampIntent" }, "generateAppProofs": { "type": "boolean" @@ -6994,58 +15296,89 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeleteOauthProvidersResult": { + "v1InitFiatOnRampResult": { "type": "object", "properties": { - "providerIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of unique identifiers for Oauth Providers" + "onRampUrl": { + "type": "string", + "description": "Unique URL for a given fiat on-ramp flow." + }, + "onRampTransactionId": { + "type": "string", + "description": "Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow." + }, + "onRampUrlSignature": { + "type": "string", + "description": "Optional signature of the MoonPay Widget URL. The signature is generated if the Init Fiat On Ramp intent includes the urlForSignature field. The signature can be used to initialize the MoonPay SDKs when URL signing is enabled for your project." } }, - "required": ["providerIds"] + "required": ["onRampUrl", "onRampTransactionId"] }, - "v1DeleteOrganizationIntent": { + "v1InitImportPrivateKeyIntent": { "type": "object", "properties": { - "organizationId": { + "userId": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "The ID of the User importing a Private Key." } }, - "required": ["organizationId"] + "required": ["userId"] }, - "v1DeleteOrganizationResult": { + "v1InitImportPrivateKeyRequest": { "type": "object", "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1InitImportPrivateKeyIntent" + }, + "generateAppProofs": { + "type": "boolean" } }, - "required": ["organizationId"] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeletePoliciesIntent": { + "v1InitImportPrivateKeyResult": { "type": "object", "properties": { - "policyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of unique identifiers for policies within an organization" + "importBundle": { + "type": "string", + "description": "Import bundle containing a public key and signature to use for importing client data." } }, - "required": ["policyIds"] + "required": ["importBundle"] }, - "v1DeletePoliciesRequest": { + "v1InitImportSecretsIntent": { + "type": "object", + "properties": { + "encryptionSuite": { + "$ref": "#/definitions/v1TransportEncryptionSuite", + "description": "Transport encryption suite used for ingress secrets." + }, + "numSecrets": { + "type": "integer", + "format": "int32", + "description": "The number of secrets the user intends to import." + } + }, + "required": ["encryptionSuite", "numSecrets"] + }, + "v1InitImportSecretsRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_POLICIES"] + "enum": ["ACTIVITY_TYPE_INIT_IMPORT_SECRETS"] }, "timestampMs": { "type": "string", @@ -7056,43 +15389,40 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeletePoliciesIntent" - }, - "generateAppProofs": { - "type": "boolean" + "$ref": "#/definitions/v1InitImportSecretsIntent" } }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeletePoliciesResult": { + "v1InitImportSecretsResult": { "type": "object", "properties": { - "policyIds": { + "enclaveTargetMessages": { "type": "array", "items": { "type": "string" }, - "description": "A list of unique identifiers for the deleted policies." + "description": "Enclave ingress target keys along with metadata specific to the encryption suite. For enclave encrypt v1 this will be ServerTargetMsgV1." } }, - "required": ["policyIds"] + "required": ["enclaveTargetMessages"] }, - "v1DeletePolicyIntent": { + "v1InitImportWalletIntent": { "type": "object", "properties": { - "policyId": { + "userId": { "type": "string", - "description": "Unique identifier for a given Policy." + "description": "The ID of the User importing a Wallet." } }, - "required": ["policyId"] + "required": ["userId"] }, - "v1DeletePolicyRequest": { + "v1InitImportWalletRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_POLICY"] + "enum": ["ACTIVITY_TYPE_INIT_IMPORT_WALLET"] }, "timestampMs": { "type": "string", @@ -7103,7 +15433,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeletePolicyIntent" + "$ref": "#/definitions/v1InitImportWalletIntent" }, "generateAppProofs": { "type": "boolean" @@ -7111,96 +15441,162 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeletePolicyResult": { + "v1InitImportWalletResult": { "type": "object", "properties": { - "policyId": { + "importBundle": { "type": "string", - "description": "Unique identifier for a given Policy." - } - }, - "required": ["policyId"] - }, - "v1DeletePrivateKeyTagsIntent": { - "type": "object", - "properties": { - "privateKeyTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key Tag IDs." + "description": "Import bundle containing a public key and signature to use for importing client data." } }, - "required": ["privateKeyTagIds"] + "required": ["importBundle"] }, - "v1DeletePrivateKeyTagsRequest": { + "v1InitOtpAuthIntent": { "type": "object", "properties": { - "type": { + "otpType": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS"] + "description": "Enum to specify whether to send OTP via SMS, email, or WhatsApp" }, - "timestampMs": { + "contact": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Email or phone number to send the OTP code to" }, - "organizationId": { + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParams", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "smsCustomization": { + "$ref": "#/definitions/v1SmsCustomizationParams", + "description": "Optional parameters for customizing SMS message. If not provided, the default sms message will be used." + }, + "userIdentifier": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." }, - "parameters": { - "$ref": "#/definitions/v1DeletePrivateKeyTagsIntent" + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the OTP email" }, - "generateAppProofs": { - "type": "boolean" + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["otpType", "contact"] }, - "v1DeletePrivateKeyTagsResult": { + "v1InitOtpAuthIntentV2": { "type": "object", "properties": { - "privateKeyTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key Tag IDs." + "otpType": { + "type": "string", + "description": "Enum to specify whether to send OTP via SMS, email, or WhatsApp" }, - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs." + "contact": { + "type": "string", + "description": "Email or phone number to send the OTP code to" + }, + "otpLength": { + "type": "integer", + "format": "int32", + "description": "Optional length of the OTP code. Default = 9" + }, + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParams", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "smsCustomization": { + "$ref": "#/definitions/v1SmsCustomizationParams", + "description": "Optional parameters for customizing SMS message. If not provided, the default SMS message will be used." + }, + "userIdentifier": { + "type": "string", + "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + }, + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the OTP email" + }, + "alphanumeric": { + "type": "boolean", + "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["privateKeyTagIds", "privateKeyIds"] + "required": ["otpType", "contact"] }, - "v1DeletePrivateKeysIntent": { + "v1InitOtpAuthIntentV3": { "type": "object", "properties": { - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of unique identifiers for private keys within an organization" + "otpType": { + "type": "string", + "description": "Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" + }, + "contact": { + "type": "string", + "description": "Email or phone number to send the OTP code to" + }, + "otpLength": { + "type": "integer", + "format": "int32", + "description": "Optional length of the OTP code. Default = 9" + }, + "appName": { + "type": "string", + "description": "The name of the application. This field is required and will be used in email notifications if an email template is not provided." + }, + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParamsV2", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "smsCustomization": { + "$ref": "#/definitions/v1SmsCustomizationParams", + "description": "Optional parameters for customizing SMS message. If not provided, the default SMS message will be used." + }, + "userIdentifier": { + "type": "string", + "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + }, + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the OTP email" + }, + "alphanumeric": { + "type": "boolean", + "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" }, - "deleteWithoutExport": { - "type": "boolean", - "description": "Optional parameter for deleting the private keys, even if any have not been previously exported. If they have been exported, this field is ignored." + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["privateKeyIds"] + "required": ["otpType", "contact", "appName"] }, - "v1DeletePrivateKeysRequest": { + "v1InitOtpAuthRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_PRIVATE_KEYS"] + "enum": ["ACTIVITY_TYPE_INIT_OTP_AUTH_V3"] }, "timestampMs": { "type": "string", @@ -7211,7 +15607,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeletePrivateKeysIntent" + "$ref": "#/definitions/v1InitOtpAuthIntentV3" }, "generateAppProofs": { "type": "boolean" @@ -7219,78 +15615,193 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeletePrivateKeysResult": { + "v1InitOtpAuthResult": { "type": "object", "properties": { - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of private key unique identifiers that were removed" + "otpId": { + "type": "string", + "description": "Unique identifier for an OTP authentication" } }, - "required": ["privateKeyIds"] + "required": ["otpId"] }, - "v1DeleteSmartContractInterfaceIntent": { + "v1InitOtpAuthResultV2": { "type": "object", "properties": { - "smartContractInterfaceId": { + "otpId": { "type": "string", - "description": "The ID of a Smart Contract Interface intended for deletion." + "description": "Unique identifier for an OTP authentication" } }, - "required": ["smartContractInterfaceId"] + "required": ["otpId"] }, - "v1DeleteSmartContractInterfaceRequest": { + "v1InitOtpIntent": { "type": "object", "properties": { - "type": { + "otpType": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_SMART_CONTRACT_INTERFACE"] + "description": "Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" }, - "timestampMs": { + "contact": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Email or phone number to send the OTP code to" }, - "organizationId": { + "otpLength": { + "type": "integer", + "format": "int32", + "description": "Optional length of the OTP code. Default = 9" + }, + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParams", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "smsCustomization": { + "$ref": "#/definitions/v1SmsCustomizationParams", + "description": "Optional parameters for customizing SMS message. If not provided, the default sms message will be used." + }, + "userIdentifier": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." }, - "parameters": { - "$ref": "#/definitions/v1DeleteSmartContractInterfaceIntent" + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the OTP email" }, - "generateAppProofs": { - "type": "boolean" + "alphanumeric": { + "type": "boolean", + "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["otpType", "contact"] }, - "v1DeleteSmartContractInterfaceResult": { + "v1InitOtpIntentV2": { "type": "object", "properties": { - "smartContractInterfaceId": { + "otpType": { "type": "string", - "description": "The ID of the deleted Smart Contract Interface." + "description": "Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" + }, + "contact": { + "type": "string", + "description": "Email or phone number to send the OTP code to" + }, + "otpLength": { + "type": "integer", + "format": "int32", + "description": "Optional length of the OTP code. Default = 9" + }, + "appName": { + "type": "string", + "description": "The name of the application. This field is required and will be used in email notifications if an email template is not provided." + }, + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParamsV2", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "smsCustomization": { + "$ref": "#/definitions/v1SmsCustomizationParams", + "description": "Optional parameters for customizing SMS message. If not provided, the default SMS message will be used." + }, + "userIdentifier": { + "type": "string", + "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + }, + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the OTP email" + }, + "alphanumeric": { + "type": "boolean", + "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["smartContractInterfaceId"] + "required": ["otpType", "contact", "appName"] }, - "v1DeleteSubOrganizationIntent": { + "v1InitOtpIntentV3": { "type": "object", "properties": { - "deleteWithoutExport": { + "otpType": { + "type": "string", + "description": "Whether to send OTP via SMS, email, or WhatsApp. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL, OTP_TYPE_WHATSAPP" + }, + "contact": { + "type": "string", + "description": "Email or phone number to send the OTP code to" + }, + "appName": { + "type": "string", + "description": "The name of the application." + }, + "otpLength": { + "type": "integer", + "format": "int32", + "description": "Optional length of the OTP code. Default = 9" + }, + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParamsV2", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "smsCustomization": { + "$ref": "#/definitions/v1SmsCustomizationParams", + "description": "Optional parameters for customizing SMS message. If not provided, the default sms message will be used." + }, + "userIdentifier": { + "type": "string", + "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + }, + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the OTP email" + }, + "alphanumeric": { "type": "boolean", - "description": "Sub-organization deletion, by default, requires associated wallets and private keys to be exported for security reasons. Set this boolean to true to force sub-organization deletion even if some wallets or private keys within it have not been exported yet. Default: false." + "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). If set to false, OTP code will only be numeric. Default = true" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } - } + }, + "required": ["otpType", "contact", "appName"] }, - "v1DeleteSubOrganizationRequest": { + "v1InitOtpRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION"] + "enum": ["ACTIVITY_TYPE_INIT_OTP_V3"] }, "timestampMs": { "type": "string", @@ -7301,7 +15812,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeleteSubOrganizationIntent" + "$ref": "#/definitions/v1InitOtpIntentV3" }, "generateAppProofs": { "type": "boolean" @@ -7309,92 +15820,104 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeleteSubOrganizationResult": { + "v1InitOtpResult": { "type": "object", "properties": { - "subOrganizationUuid": { + "otpId": { "type": "string", - "description": "Unique identifier of the sub organization that was removed" + "description": "Unique identifier for an OTP authentication" } }, - "required": ["subOrganizationUuid"] + "required": ["otpId"] }, - "v1DeleteUserTagsIntent": { + "v1InitOtpResultV2": { "type": "object", "properties": { - "userTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User Tag IDs." + "otpId": { + "type": "string", + "description": "Unique identifier for an OTP flow" + }, + "otpEncryptionTargetBundle": { + "type": "string", + "description": "Signed bundle containing a target encryption key to use when submitting OTP codes." + } + }, + "required": ["otpId", "otpEncryptionTargetBundle"] + }, + "v1InitUserEmailRecoveryIntent": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Email of the user starting recovery" + }, + "targetPublicKey": { + "type": "string", + "description": "Client-side public key generated by the user, to which the recovery bundle will be encrypted." + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used." + }, + "emailCustomization": { + "$ref": "#/definitions/v1EmailCustomizationParams", + "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + }, + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the OTP email" + }, + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["userTagIds"] + "required": ["email", "targetPublicKey"] }, - "v1DeleteUserTagsRequest": { + "v1InitUserEmailRecoveryIntentV2": { "type": "object", "properties": { - "type": { + "email": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_USER_TAGS"] + "description": "Email of the user starting recovery" }, - "timestampMs": { + "targetPublicKey": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Client-side public key generated by the user, to which the recovery bundle will be encrypted." }, - "organizationId": { + "expirationSeconds": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used." }, - "parameters": { - "$ref": "#/definitions/v1DeleteUserTagsIntent" + "emailCustomization": { + "$ref": "#/definitions/v1EmailAuthCustomizationParams", + "description": "Parameters for customizing emails. If not provided, the default email will be used. Note that `app_name` is required." }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1DeleteUserTagsResult": { - "type": "object", - "properties": { - "userTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User Tag IDs." + "sendFromEmailAddress": { + "type": "string", + "description": "Optional custom email address from which to send the OTP email" }, - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." - } - }, - "required": ["userTagIds", "userIds"] - }, - "v1DeleteUsersIntent": { - "type": "object", - "properties": { - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." + "sendFromEmailSenderName": { + "type": "string", + "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + }, + "replyToEmailAddress": { + "type": "string", + "description": "Optional custom email address to use as reply-to" } }, - "required": ["userIds"] + "required": ["email", "targetPublicKey", "emailCustomization"] }, - "v1DeleteUsersRequest": { + "v1InitUserEmailRecoveryRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_USERS"] + "enum": ["ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2"] }, "timestampMs": { "type": "string", @@ -7405,7 +15928,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1DeleteUsersIntent" + "$ref": "#/definitions/v1InitUserEmailRecoveryIntentV2" }, "generateAppProofs": { "type": "boolean" @@ -7413,1813 +15936,1443 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1DeleteUsersResult": { + "v1InitUserEmailRecoveryResult": { "type": "object", "properties": { - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." + "userId": { + "type": "string", + "description": "Unique identifier for the user being recovered." } }, - "required": ["userIds"] + "required": ["userId"] }, - "v1DeleteWalletAccountsIntent": { + "v1Intent": { "type": "object", "properties": { - "walletAccountIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of unique identifiers for wallet accounts within an organization" + "createOrganizationIntent": { + "$ref": "#/definitions/v1CreateOrganizationIntent" + }, + "createAuthenticatorsIntent": { + "$ref": "#/definitions/v1CreateAuthenticatorsIntent" + }, + "createUsersIntent": { + "$ref": "#/definitions/v1CreateUsersIntent" + }, + "createPrivateKeysIntent": { + "$ref": "#/definitions/v1CreatePrivateKeysIntent" + }, + "signRawPayloadIntent": { + "$ref": "#/definitions/v1SignRawPayloadIntent" + }, + "createInvitationsIntent": { + "$ref": "#/definitions/v1CreateInvitationsIntent" + }, + "acceptInvitationIntent": { + "$ref": "#/definitions/v1AcceptInvitationIntent" + }, + "createPolicyIntent": { + "$ref": "#/definitions/v1CreatePolicyIntent" + }, + "disablePrivateKeyIntent": { + "$ref": "#/definitions/v1DisablePrivateKeyIntent" + }, + "deleteUsersIntent": { + "$ref": "#/definitions/v1DeleteUsersIntent" + }, + "deleteAuthenticatorsIntent": { + "$ref": "#/definitions/v1DeleteAuthenticatorsIntent" + }, + "deleteInvitationIntent": { + "$ref": "#/definitions/v1DeleteInvitationIntent" + }, + "deleteOrganizationIntent": { + "$ref": "#/definitions/v1DeleteOrganizationIntent" + }, + "deletePolicyIntent": { + "$ref": "#/definitions/v1DeletePolicyIntent" + }, + "createUserTagIntent": { + "$ref": "#/definitions/v1CreateUserTagIntent" + }, + "deleteUserTagsIntent": { + "$ref": "#/definitions/v1DeleteUserTagsIntent" + }, + "signTransactionIntent": { + "$ref": "#/definitions/v1SignTransactionIntent" + }, + "createApiKeysIntent": { + "$ref": "#/definitions/v1CreateApiKeysIntent" + }, + "deleteApiKeysIntent": { + "$ref": "#/definitions/v1DeleteApiKeysIntent" + }, + "approveActivityIntent": { + "$ref": "#/definitions/v1ApproveActivityIntent" + }, + "rejectActivityIntent": { + "$ref": "#/definitions/v1RejectActivityIntent" + }, + "createPrivateKeyTagIntent": { + "$ref": "#/definitions/v1CreatePrivateKeyTagIntent" + }, + "deletePrivateKeyTagsIntent": { + "$ref": "#/definitions/v1DeletePrivateKeyTagsIntent" + }, + "createPolicyIntentV2": { + "$ref": "#/definitions/v1CreatePolicyIntentV2" + }, + "setPaymentMethodIntent": { + "$ref": "#/definitions/billingSetPaymentMethodIntent" + }, + "activateBillingTierIntent": { + "$ref": "#/definitions/billingActivateBillingTierIntent" + }, + "deletePaymentMethodIntent": { + "$ref": "#/definitions/billingDeletePaymentMethodIntent" + }, + "createPolicyIntentV3": { + "$ref": "#/definitions/v1CreatePolicyIntentV3" + }, + "createApiOnlyUsersIntent": { + "$ref": "#/definitions/v1CreateApiOnlyUsersIntent" + }, + "updateRootQuorumIntent": { + "$ref": "#/definitions/v1UpdateRootQuorumIntent" + }, + "updateUserTagIntent": { + "$ref": "#/definitions/v1UpdateUserTagIntent" + }, + "updatePrivateKeyTagIntent": { + "$ref": "#/definitions/v1UpdatePrivateKeyTagIntent" + }, + "createAuthenticatorsIntentV2": { + "$ref": "#/definitions/v1CreateAuthenticatorsIntentV2" + }, + "acceptInvitationIntentV2": { + "$ref": "#/definitions/v1AcceptInvitationIntentV2" + }, + "createOrganizationIntentV2": { + "$ref": "#/definitions/v1CreateOrganizationIntentV2" + }, + "createUsersIntentV2": { + "$ref": "#/definitions/v1CreateUsersIntentV2" + }, + "createSubOrganizationIntent": { + "$ref": "#/definitions/v1CreateSubOrganizationIntent" + }, + "createSubOrganizationIntentV2": { + "$ref": "#/definitions/v1CreateSubOrganizationIntentV2" + }, + "updateAllowedOriginsIntent": { + "$ref": "#/definitions/v1UpdateAllowedOriginsIntent" + }, + "createPrivateKeysIntentV2": { + "$ref": "#/definitions/v1CreatePrivateKeysIntentV2" + }, + "updateUserIntent": { + "$ref": "#/definitions/v1UpdateUserIntent" + }, + "updatePolicyIntent": { + "$ref": "#/definitions/v1UpdatePolicyIntent" + }, + "setPaymentMethodIntentV2": { + "$ref": "#/definitions/billingSetPaymentMethodIntentV2" + }, + "createSubOrganizationIntentV3": { + "$ref": "#/definitions/v1CreateSubOrganizationIntentV3" + }, + "createWalletIntent": { + "$ref": "#/definitions/v1CreateWalletIntent" + }, + "createWalletAccountsIntent": { + "$ref": "#/definitions/v1CreateWalletAccountsIntent" + }, + "initUserEmailRecoveryIntent": { + "$ref": "#/definitions/v1InitUserEmailRecoveryIntent" + }, + "recoverUserIntent": { + "$ref": "#/definitions/v1RecoverUserIntent" + }, + "setOrganizationFeatureIntent": { + "$ref": "#/definitions/v1SetOrganizationFeatureIntent" + }, + "removeOrganizationFeatureIntent": { + "$ref": "#/definitions/v1RemoveOrganizationFeatureIntent" + }, + "signRawPayloadIntentV2": { + "$ref": "#/definitions/v1SignRawPayloadIntentV2" + }, + "signTransactionIntentV2": { + "$ref": "#/definitions/v1SignTransactionIntentV2" + }, + "exportPrivateKeyIntent": { + "$ref": "#/definitions/v1ExportPrivateKeyIntent" + }, + "exportWalletIntent": { + "$ref": "#/definitions/v1ExportWalletIntent" }, - "deleteWithoutExport": { - "type": "boolean", - "description": "Optional parameter for deleting the wallet accounts, even if any have not been previously exported. If they have been exported, this field is ignored." - } - }, - "required": ["walletAccountIds"] - }, - "v1DeleteWalletAccountsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_WALLET_ACCOUNTS"] + "createSubOrganizationIntentV4": { + "$ref": "#/definitions/v1CreateSubOrganizationIntentV4" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "emailAuthIntent": { + "$ref": "#/definitions/v1EmailAuthIntent" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "exportWalletAccountIntent": { + "$ref": "#/definitions/v1ExportWalletAccountIntent" }, - "parameters": { - "$ref": "#/definitions/v1DeleteWalletAccountsIntent" + "initImportWalletIntent": { + "$ref": "#/definitions/v1InitImportWalletIntent" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1DeleteWalletAccountsResult": { - "type": "object", - "properties": { - "walletAccountIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of wallet account unique identifiers that were removed" - } - }, - "required": ["walletAccountIds"] - }, - "v1DeleteWalletsIntent": { - "type": "object", - "properties": { - "walletIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of unique identifiers for wallets within an organization" + "importWalletIntent": { + "$ref": "#/definitions/v1ImportWalletIntent" }, - "deleteWithoutExport": { - "type": "boolean", - "description": "Optional parameter for deleting the wallets, even if any have not been previously exported. If they have been exported, this field is ignored." - } - }, - "required": ["walletIds"] - }, - "v1DeleteWalletsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_WALLETS"] + "initImportPrivateKeyIntent": { + "$ref": "#/definitions/v1InitImportPrivateKeyIntent" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "importPrivateKeyIntent": { + "$ref": "#/definitions/v1ImportPrivateKeyIntent" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "createPoliciesIntent": { + "$ref": "#/definitions/v1CreatePoliciesIntent" }, - "parameters": { - "$ref": "#/definitions/v1DeleteWalletsIntent" + "signRawPayloadsIntent": { + "$ref": "#/definitions/v1SignRawPayloadsIntent" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1DeleteWalletsResult": { - "type": "object", - "properties": { - "walletIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of wallet unique identifiers that were removed" - } - }, - "required": ["walletIds"] - }, - "v1DisableAuthProxyIntent": { - "type": "object" - }, - "v1DisableAuthProxyResult": { - "type": "object" - }, - "v1DisablePrivateKeyIntent": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - } - }, - "required": ["privateKeyId"] - }, - "v1DisablePrivateKeyResult": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - } - }, - "required": ["privateKeyId"] - }, - "v1Effect": { - "type": "string", - "enum": ["EFFECT_ALLOW", "EFFECT_DENY"] - }, - "v1EmailAuthCustomizationParams": { - "type": "object", - "properties": { - "appName": { - "type": "string", - "description": "The name of the application. This field is required and will be used in email notifications if an email template is not provided." + "createReadOnlySessionIntent": { + "$ref": "#/definitions/v1CreateReadOnlySessionIntent" }, - "logoUrl": { - "type": "string", - "description": "A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px." + "createOauthProvidersIntent": { + "$ref": "#/definitions/v1CreateOauthProvidersIntent" }, - "magicLinkTemplate": { - "type": "string", - "description": "A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`." + "deleteOauthProvidersIntent": { + "$ref": "#/definitions/v1DeleteOauthProvidersIntent" }, - "templateVariables": { - "type": "string", - "description": "JSON object containing key/value pairs to be used with custom templates." + "createSubOrganizationIntentV5": { + "$ref": "#/definitions/v1CreateSubOrganizationIntentV5" }, - "templateId": { - "type": "string", - "description": "Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template." - } - }, - "required": ["appName"] - }, - "v1EmailAuthIntent": { - "type": "object", - "properties": { - "email": { - "type": "string", - "description": "Email of the authenticating user." + "oauthIntent": { + "$ref": "#/definitions/v1OauthIntent" }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." + "createApiKeysIntentV2": { + "$ref": "#/definitions/v1CreateApiKeysIntentV2" }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Email Auth - \u003cTimestamp\u003e" + "createReadWriteSessionIntent": { + "$ref": "#/definitions/v1CreateReadWriteSessionIntent" }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + "emailAuthIntentV2": { + "$ref": "#/definitions/v1EmailAuthIntentV2" }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + "createSubOrganizationIntentV6": { + "$ref": "#/definitions/v1CreateSubOrganizationIntentV6" }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Email Auth API keys" + "deletePrivateKeysIntent": { + "$ref": "#/definitions/v1DeletePrivateKeysIntent" }, - "sendFromEmailAddress": { - "type": "string", - "description": "Optional custom email address from which to send the email" + "deleteWalletsIntent": { + "$ref": "#/definitions/v1DeleteWalletsIntent" }, - "sendFromEmailSenderName": { - "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "createReadWriteSessionIntentV2": { + "$ref": "#/definitions/v1CreateReadWriteSessionIntentV2" }, - "replyToEmailAddress": { - "type": "string", - "description": "Optional custom email address to use as reply-to" - } - }, - "required": ["email", "targetPublicKey"] - }, - "v1EmailAuthIntentV2": { - "type": "object", - "properties": { - "email": { - "type": "string", - "description": "Email of the authenticating user." + "deleteSubOrganizationIntent": { + "$ref": "#/definitions/v1DeleteSubOrganizationIntent" }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." + "initOtpAuthIntent": { + "$ref": "#/definitions/v1InitOtpAuthIntent" + }, + "otpAuthIntent": { + "$ref": "#/definitions/v1OtpAuthIntent" + }, + "createSubOrganizationIntentV7": { + "$ref": "#/definitions/v1CreateSubOrganizationIntentV7" + }, + "updateWalletIntent": { + "$ref": "#/definitions/v1UpdateWalletIntent" + }, + "updatePolicyIntentV2": { + "$ref": "#/definitions/v1UpdatePolicyIntentV2" + }, + "createUsersIntentV3": { + "$ref": "#/definitions/v1CreateUsersIntentV3" + }, + "initOtpAuthIntentV2": { + "$ref": "#/definitions/v1InitOtpAuthIntentV2" + }, + "initOtpIntent": { + "$ref": "#/definitions/v1InitOtpIntent" + }, + "verifyOtpIntent": { + "$ref": "#/definitions/v1VerifyOtpIntent" + }, + "otpLoginIntent": { + "$ref": "#/definitions/v1OtpLoginIntent" }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Email Auth - \u003cTimestamp\u003e" + "stampLoginIntent": { + "$ref": "#/definitions/v1StampLoginIntent" }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + "oauthLoginIntent": { + "$ref": "#/definitions/v1OauthLoginIntent" }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + "updateUserNameIntent": { + "$ref": "#/definitions/v1UpdateUserNameIntent" }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Email Auth API keys" + "updateUserEmailIntent": { + "$ref": "#/definitions/v1UpdateUserEmailIntent" }, - "sendFromEmailAddress": { - "type": "string", - "description": "Optional custom email address from which to send the email" + "updateUserPhoneNumberIntent": { + "$ref": "#/definitions/v1UpdateUserPhoneNumberIntent" }, - "sendFromEmailSenderName": { - "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "initFiatOnRampIntent": { + "$ref": "#/definitions/v1InitFiatOnRampIntent" }, - "replyToEmailAddress": { - "type": "string", - "description": "Optional custom email address to use as reply-to" - } - }, - "required": ["email", "targetPublicKey"] - }, - "v1EmailAuthIntentV3": { - "type": "object", - "properties": { - "email": { - "type": "string", - "description": "Email of the authenticating user." + "createSmartContractInterfaceIntent": { + "$ref": "#/definitions/v1CreateSmartContractInterfaceIntent" }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." + "deleteSmartContractInterfaceIntent": { + "$ref": "#/definitions/v1DeleteSmartContractInterfaceIntent" }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Email Auth - \u003cTimestamp\u003e" + "enableAuthProxyIntent": { + "$ref": "#/definitions/v1EnableAuthProxyIntent" }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + "disableAuthProxyIntent": { + "$ref": "#/definitions/v1DisableAuthProxyIntent" }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailAuthCustomizationParams", - "description": "Parameters for customizing emails. If not provided, the default email will be used. Note that app_name is required." + "updateAuthProxyConfigIntent": { + "$ref": "#/definitions/v1UpdateAuthProxyConfigIntent" }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Email Auth API keys" + "createOauth2CredentialIntent": { + "$ref": "#/definitions/v1CreateOauth2CredentialIntent" }, - "sendFromEmailAddress": { - "type": "string", - "description": "Optional custom email address from which to send the email" + "updateOauth2CredentialIntent": { + "$ref": "#/definitions/v1UpdateOauth2CredentialIntent" }, - "sendFromEmailSenderName": { - "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "deleteOauth2CredentialIntent": { + "$ref": "#/definitions/v1DeleteOauth2CredentialIntent" }, - "replyToEmailAddress": { - "type": "string", - "description": "Optional custom email address to use as reply-to" - } - }, - "required": ["email", "targetPublicKey", "emailCustomization"] - }, - "v1EmailAuthRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_EMAIL_AUTH_V3"] + "oauth2AuthenticateIntent": { + "$ref": "#/definitions/v1Oauth2AuthenticateIntent" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "deleteWalletAccountsIntent": { + "$ref": "#/definitions/v1DeleteWalletAccountsIntent" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "deletePoliciesIntent": { + "$ref": "#/definitions/v1DeletePoliciesIntent" }, - "parameters": { - "$ref": "#/definitions/v1EmailAuthIntentV3" + "ethSendRawTransactionIntent": { + "$ref": "#/definitions/v1EthSendRawTransactionIntent" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1EmailAuthResult": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for the authenticating User." + "ethSendTransactionIntent": { + "$ref": "#/definitions/v1EthSendTransactionIntent" }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." - } - }, - "required": ["userId", "apiKeyId"] - }, - "v1EmailCustomizationParams": { - "type": "object", - "properties": { - "appName": { - "type": "string", - "description": "The name of the application." + "createFiatOnRampCredentialIntent": { + "$ref": "#/definitions/v1CreateFiatOnRampCredentialIntent" }, - "logoUrl": { - "type": "string", - "description": "A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px." + "updateFiatOnRampCredentialIntent": { + "$ref": "#/definitions/v1UpdateFiatOnRampCredentialIntent" }, - "magicLinkTemplate": { - "type": "string", - "description": "A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`." + "deleteFiatOnRampCredentialIntent": { + "$ref": "#/definitions/v1DeleteFiatOnRampCredentialIntent" }, - "templateVariables": { - "type": "string", - "description": "JSON object containing key/value pairs to be used with custom templates." + "emailAuthIntentV3": { + "$ref": "#/definitions/v1EmailAuthIntentV3" }, - "templateId": { - "type": "string", - "description": "Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template." - } - } - }, - "v1EmailCustomizationParamsV2": { - "type": "object", - "properties": { - "logoUrl": { - "type": "string", - "description": "A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px." + "initUserEmailRecoveryIntentV2": { + "$ref": "#/definitions/v1InitUserEmailRecoveryIntentV2" }, - "magicLinkTemplate": { - "type": "string", - "description": "A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`." + "initOtpIntentV2": { + "$ref": "#/definitions/v1InitOtpIntentV2" }, - "templateVariables": { - "type": "string", - "description": "JSON object containing key/value pairs to be used with custom templates." + "initOtpAuthIntentV3": { + "$ref": "#/definitions/v1InitOtpAuthIntentV3" }, - "templateId": { - "type": "string", - "description": "Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template." - } - } - }, - "v1EnableAuthProxyIntent": { - "type": "object" - }, - "v1EnableAuthProxyResult": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "A User ID with permission to initiate authentication." - } - }, - "required": ["userId"] - }, - "v1EthSendRawTransactionIntent": { - "type": "object", - "properties": { - "signedTransaction": { - "type": "string", - "description": "The raw, signed transaction to be sent." + "upsertGasUsageConfigIntent": { + "$ref": "#/definitions/v1UpsertGasUsageConfigIntent" }, - "caip2": { - "type": "string", - "enum": [ - "eip155:1", - "eip155:11155111", - "eip155:8453", - "eip155:84532", - "eip155:137", - "eip155:80002" - ], - "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." - } - }, - "required": ["signedTransaction", "caip2"] - }, - "v1EthSendRawTransactionResult": { - "type": "object", - "properties": { - "transactionHash": { - "type": "string", - "description": "The transaction hash of the sent transaction" - } - }, - "required": ["transactionHash"] - }, - "v1EthSendTransactionIntent": { - "type": "object", - "properties": { - "from": { - "type": "string", - "description": "A wallet or private key address to sign with. This does not support private key IDs." + "createTvcAppIntent": { + "$ref": "#/definitions/v1CreateTvcAppIntent" }, - "sponsor": { - "type": "boolean", - "description": "Whether to sponsor this transaction via Gas Station." + "createTvcDeploymentIntent": { + "$ref": "#/definitions/v1CreateTvcDeploymentIntent" }, - "caip2": { - "type": "string", - "enum": [ - "eip155:1", - "eip155:11155111", - "eip155:8453", - "eip155:84532", - "eip155:137", - "eip155:80002" - ], - "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + "createTvcManifestApprovalsIntent": { + "$ref": "#/definitions/v1CreateTvcManifestApprovalsIntent" + }, + "solSendTransactionIntent": { + "$ref": "#/definitions/v1SolSendTransactionIntent" }, - "to": { - "type": "string", - "description": "Recipient address as a hex string with 0x prefix." + "initOtpIntentV3": { + "$ref": "#/definitions/v1InitOtpIntentV3" }, - "value": { - "type": "string", - "description": "Amount of native asset to send in wei." + "verifyOtpIntentV2": { + "$ref": "#/definitions/v1VerifyOtpIntentV2" }, - "data": { - "type": "string", - "description": "Hex-encoded call data for contract interactions." + "otpLoginIntentV2": { + "$ref": "#/definitions/v1OtpLoginIntentV2" }, - "nonce": { - "type": "string", - "description": "Transaction nonce, for EIP-1559 and Turnkey Gas Station authorizations." + "updateOrganizationNameIntent": { + "$ref": "#/definitions/v1UpdateOrganizationNameIntent" }, - "gasLimit": { - "type": "string", - "description": "Maximum amount of gas to use for this transaction, for EIP-1559 transactions." + "createSubOrganizationIntentV8": { + "$ref": "#/definitions/v1CreateSubOrganizationIntentV8" }, - "maxFeePerGas": { - "type": "string", - "description": "Maximum total fee per gas unit (base fee + priority fee) in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions." + "createOauthProvidersIntentV2": { + "$ref": "#/definitions/v1CreateOauthProvidersIntentV2" }, - "maxPriorityFeePerGas": { - "type": "string", - "description": "Maximum priority fee (tip) per gas unit in wei. Required for non-sponsored (EIP-1559) transactions. Not used for sponsored transactions." + "createUsersIntentV4": { + "$ref": "#/definitions/v1CreateUsersIntentV4" }, - "gasStationNonce": { - "type": "string", - "description": "The gas station delegate contract nonce. Only used when sponsor=true. Include this if you want maximal security posture." - } - }, - "required": ["from", "caip2", "to"] - }, - "v1EthSendTransactionRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_ETH_SEND_TRANSACTION"] + "createWebhookEndpointIntent": { + "$ref": "#/definitions/v1CreateWebhookEndpointIntent" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "updateWebhookEndpointIntent": { + "$ref": "#/definitions/v1UpdateWebhookEndpointIntent" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "deleteWebhookEndpointIntent": { + "$ref": "#/definitions/v1DeleteWebhookEndpointIntent" }, - "parameters": { - "$ref": "#/definitions/v1EthSendTransactionIntent" + "setIpAllowlistIntent": { + "$ref": "#/definitions/v1SetIpAllowlistIntent" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1EthSendTransactionResult": { - "type": "object", - "properties": { - "sendTransactionStatusId": { - "type": "string", - "description": "The send_transaction_status ID associated with the transaction submission" - } - }, - "required": ["sendTransactionStatusId"] - }, - "v1EthSendTransactionStatus": { - "type": "object", - "properties": { - "txHash": { - "type": "string", - "description": "The Ethereum transaction hash, if available." - } - } - }, - "v1ExportPrivateKeyIntent": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." + "removeIpAllowlistIntent": { + "$ref": "#/definitions/v1RemoveIpAllowlistIntent" }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." - } - }, - "required": ["privateKeyId", "targetPublicKey"] - }, - "v1ExportPrivateKeyRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_EXPORT_PRIVATE_KEY"] + "updateTvcAppLiveDeploymentIntent": { + "$ref": "#/definitions/v1UpdateTvcAppLiveDeploymentIntent" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "deleteTvcDeploymentIntent": { + "$ref": "#/definitions/v1DeleteTvcDeploymentIntent" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "deleteTvcAppAndDeploymentsIntent": { + "$ref": "#/definitions/v1DeleteTvcAppAndDeploymentsIntent" }, - "parameters": { - "$ref": "#/definitions/v1ExportPrivateKeyIntent" + "restoreTvcDeploymentIntent": { + "$ref": "#/definitions/v1RestoreTvcDeploymentIntent" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1ExportPrivateKeyResult": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." + "sparkSignFrostIntent": { + "$ref": "#/definitions/v1SparkSignFrostIntent" }, - "exportBundle": { - "type": "string", - "description": "Export bundle containing a private key encrypted to the client's target public key." - } - }, - "required": ["privateKeyId", "exportBundle"] - }, - "v1ExportWalletAccountIntent": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Address to identify Wallet Account." + "sparkPrepareTransferIntent": { + "$ref": "#/definitions/v1SparkPrepareTransferIntent" }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." - } - }, - "required": ["address", "targetPublicKey"] - }, - "v1ExportWalletAccountRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT"] + "sparkClaimTransferIntent": { + "$ref": "#/definitions/v1SparkClaimTransferIntent" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "sparkPrepareLightningReceiveIntent": { + "$ref": "#/definitions/v1SparkPrepareLightningReceiveIntent" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "postTvcQuorumKeyShareIntent": { + "$ref": "#/definitions/v1PostTvcQuorumKeyShareIntent" }, - "parameters": { - "$ref": "#/definitions/v1ExportWalletAccountIntent" + "ethSendTransactionIntentV2": { + "$ref": "#/definitions/v1EthSendTransactionIntentV2" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1ExportWalletAccountResult": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Address to identify Wallet Account." + "createMfaPolicyIntent": { + "$ref": "#/definitions/v1CreateMfaPolicyIntent" }, - "exportBundle": { - "type": "string", - "description": "Export bundle containing a private key encrypted by the client's target public key." - } - }, - "required": ["address", "exportBundle"] - }, - "v1ExportWalletIntent": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." + "updateMfaPolicyIntent": { + "$ref": "#/definitions/v1UpdateMfaPolicyIntent" }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." + "deleteMfaPolicyIntent": { + "$ref": "#/definitions/v1DeleteMfaPolicyIntent" }, - "language": { - "$ref": "#/definitions/v1MnemonicLanguage", - "description": "The language of the mnemonic to export. Defaults to English." - } - }, - "required": ["walletId", "targetPublicKey"] - }, - "v1ExportWalletRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_EXPORT_WALLET"] + "createSessionProfileIntent": { + "$ref": "#/definitions/v1CreateSessionProfileIntent" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "earnDeployWrapperIntent": { + "$ref": "#/definitions/v1EarnDeployWrapperIntent" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "earnDepositIntent": { + "$ref": "#/definitions/v1EarnDepositIntent" }, - "parameters": { - "$ref": "#/definitions/v1ExportWalletIntent" + "earnWithdrawIntent": { + "$ref": "#/definitions/v1EarnWithdrawIntent" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1ExportWalletResult": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." + "executeSwapIntent": { + "$ref": "#/definitions/v1ExecuteSwapIntent" }, - "exportBundle": { - "type": "string", - "description": "Export bundle containing a wallet mnemonic + optional newline passphrase encrypted by the client's target public key." - } - }, - "required": ["walletId", "exportBundle"] - }, - "v1Feature": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/v1FeatureName" + "upsertSwapConfigIntent": { + "$ref": "#/definitions/v1UpsertSwapConfigIntent" }, - "value": { - "type": "string" - } - } - }, - "v1FeatureName": { - "type": "string", - "enum": [ - "FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY", - "FEATURE_NAME_WEBAUTHN_ORIGINS", - "FEATURE_NAME_EMAIL_AUTH", - "FEATURE_NAME_EMAIL_RECOVERY", - "FEATURE_NAME_WEBHOOK", - "FEATURE_NAME_SMS_AUTH", - "FEATURE_NAME_OTP_EMAIL_AUTH", - "FEATURE_NAME_AUTH_PROXY" - ] - }, - "v1FiatOnRampBlockchainNetwork": { - "type": "string", - "enum": [ - "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BITCOIN", - "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM", - "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_SOLANA", - "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_BASE" - ] - }, - "v1FiatOnRampCredential": { - "type": "object", - "properties": { - "fiatOnrampCredentialId": { - "type": "string", - "description": "Unique identifier for a given Fiat On-Ramp Credential." + "createTvcOperatorIntent": { + "$ref": "#/definitions/v1CreateTvcOperatorIntent" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for an Organization." + "createTvcQuorumKeyIntent": { + "$ref": "#/definitions/v1CreateTvcQuorumKeyIntent" + }, + "reEncryptTvcQuorumKeyShareIntent": { + "$ref": "#/definitions/v1ReEncryptTvcQuorumKeyShareIntent" }, - "onrampProvider": { - "$ref": "#/definitions/v1FiatOnRampProvider", - "description": "The fiat on-ramp provider." + "initImportSecretsIntent": { + "$ref": "#/definitions/v1InitImportSecretsIntent" }, - "projectId": { - "type": "string", - "description": "Project ID for the on-ramp provider. Some providers, like Coinbase, require this additional identifier." + "solSendTransactionIntentV2": { + "$ref": "#/definitions/v1SolSendTransactionIntentV2" }, - "publishableApiKey": { - "type": "string", - "description": "Publishable API key for the on-ramp provider." + "claimSwapFeesIntent": { + "$ref": "#/definitions/v1ClaimSwapFeesIntent" }, - "encryptedSecretApiKey": { - "type": "string", - "description": "Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key." + "earnSetWrapperStateIntent": { + "$ref": "#/definitions/v1EarnSetWrapperStateIntent" }, - "encryptedPrivateApiKey": { - "type": "string", - "description": "Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key." + "claimEarnFeesIntent": { + "$ref": "#/definitions/v1ClaimEarnFeesIntent" }, - "sandboxMode": { - "type": "boolean", - "description": "If the on-ramp credential is a sandbox credential." + "updateWalletAccountNameIntent": { + "$ref": "#/definitions/v1UpdateWalletAccountNameIntent" }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "ethUndelegate7702Intent": { + "$ref": "#/definitions/v1EthUndelegate7702Intent" }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" - } - }, - "required": [ - "fiatOnrampCredentialId", - "organizationId", - "onrampProvider", - "publishableApiKey", - "encryptedSecretApiKey", - "createdAt", - "updatedAt" - ] - }, - "v1FiatOnRampCryptoCurrency": { - "type": "string", - "enum": [ - "FIAT_ON_RAMP_CRYPTO_CURRENCY_BTC", - "FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH", - "FIAT_ON_RAMP_CRYPTO_CURRENCY_SOL", - "FIAT_ON_RAMP_CRYPTO_CURRENCY_USDC" - ] - }, - "v1FiatOnRampCurrency": { - "type": "string", - "enum": [ - "FIAT_ON_RAMP_CURRENCY_AUD", - "FIAT_ON_RAMP_CURRENCY_BGN", - "FIAT_ON_RAMP_CURRENCY_BRL", - "FIAT_ON_RAMP_CURRENCY_CAD", - "FIAT_ON_RAMP_CURRENCY_CHF", - "FIAT_ON_RAMP_CURRENCY_COP", - "FIAT_ON_RAMP_CURRENCY_CZK", - "FIAT_ON_RAMP_CURRENCY_DKK", - "FIAT_ON_RAMP_CURRENCY_DOP", - "FIAT_ON_RAMP_CURRENCY_EGP", - "FIAT_ON_RAMP_CURRENCY_EUR", - "FIAT_ON_RAMP_CURRENCY_GBP", - "FIAT_ON_RAMP_CURRENCY_HKD", - "FIAT_ON_RAMP_CURRENCY_IDR", - "FIAT_ON_RAMP_CURRENCY_ILS", - "FIAT_ON_RAMP_CURRENCY_JOD", - "FIAT_ON_RAMP_CURRENCY_KES", - "FIAT_ON_RAMP_CURRENCY_KWD", - "FIAT_ON_RAMP_CURRENCY_LKR", - "FIAT_ON_RAMP_CURRENCY_MXN", - "FIAT_ON_RAMP_CURRENCY_NGN", - "FIAT_ON_RAMP_CURRENCY_NOK", - "FIAT_ON_RAMP_CURRENCY_NZD", - "FIAT_ON_RAMP_CURRENCY_OMR", - "FIAT_ON_RAMP_CURRENCY_PEN", - "FIAT_ON_RAMP_CURRENCY_PLN", - "FIAT_ON_RAMP_CURRENCY_RON", - "FIAT_ON_RAMP_CURRENCY_SEK", - "FIAT_ON_RAMP_CURRENCY_THB", - "FIAT_ON_RAMP_CURRENCY_TRY", - "FIAT_ON_RAMP_CURRENCY_TWD", - "FIAT_ON_RAMP_CURRENCY_USD", - "FIAT_ON_RAMP_CURRENCY_VND", - "FIAT_ON_RAMP_CURRENCY_ZAR" - ] - }, - "v1FiatOnRampPaymentMethod": { - "type": "string", - "enum": [ - "FIAT_ON_RAMP_PAYMENT_METHOD_CREDIT_DEBIT_CARD", - "FIAT_ON_RAMP_PAYMENT_METHOD_APPLE_PAY", - "FIAT_ON_RAMP_PAYMENT_METHOD_GBP_BANK_TRANSFER", - "FIAT_ON_RAMP_PAYMENT_METHOD_GBP_OPEN_BANKING_PAYMENT", - "FIAT_ON_RAMP_PAYMENT_METHOD_GOOGLE_PAY", - "FIAT_ON_RAMP_PAYMENT_METHOD_SEPA_BANK_TRANSFER", - "FIAT_ON_RAMP_PAYMENT_METHOD_PIX_INSTANT_PAYMENT", - "FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL", - "FIAT_ON_RAMP_PAYMENT_METHOD_VENMO", - "FIAT_ON_RAMP_PAYMENT_METHOD_MOONPAY_BALANCE", - "FIAT_ON_RAMP_PAYMENT_METHOD_CRYPTO_ACCOUNT", - "FIAT_ON_RAMP_PAYMENT_METHOD_FIAT_WALLET", - "FIAT_ON_RAMP_PAYMENT_METHOD_ACH_BANK_ACCOUNT" - ] - }, - "v1FiatOnRampProvider": { - "type": "string", - "enum": [ - "FIAT_ON_RAMP_PROVIDER_COINBASE", - "FIAT_ON_RAMP_PROVIDER_MOONPAY" - ] - }, - "v1GetActivitiesRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." + "executeSwapIntentV2": { + "$ref": "#/definitions/v1ExecuteSwapIntentV2" }, - "filterByStatus": { - "type": "array", - "items": { - "$ref": "#/definitions/v1ActivityStatus" - }, - "description": "Array of activity statuses filtering which activities will be listed in the response." + "createSwapQuoteIntent": { + "$ref": "#/definitions/v1CreateSwapQuoteIntent" }, - "paginationOptions": { - "$ref": "#/definitions/v1Pagination", - "description": "Parameters used for cursor-based pagination." + "importSecretsIntent": { + "$ref": "#/definitions/v1ImportSecretsIntent" }, - "filterByType": { - "type": "array", - "items": { - "$ref": "#/definitions/v1ActivityType" - }, - "description": "Array of activity types filtering which activities will be listed in the response." - } - }, - "required": ["organizationId"] - }, - "v1GetActivitiesResponse": { - "type": "object", - "properties": { - "activities": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1Activity" - }, - "description": "A list of activities." - } - }, - "required": ["activities"] - }, - "v1GetActivityRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." + "exportSecretsIntent": { + "$ref": "#/definitions/v1ExportSecretsIntent" }, - "activityId": { - "type": "string", - "description": "Unique identifier for a given activity object." - } - }, - "required": ["organizationId", "activityId"] - }, - "v1GetApiKeyRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." + "createVelocityControlIntent": { + "$ref": "#/definitions/v1CreateVelocityControlIntent" }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for a given API key." - } - }, - "required": ["organizationId", "apiKeyId"] - }, - "v1GetApiKeyResponse": { - "type": "object", - "properties": { - "apiKey": { - "$ref": "#/definitions/v1ApiKey", - "description": "An API key." - } - }, - "required": ["apiKey"] - }, - "v1GetApiKeysRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." + "deleteVelocityControlsIntent": { + "$ref": "#/definitions/v1DeleteVelocityControlsIntent" }, - "userId": { - "type": "string", - "description": "Unique identifier for a given user." - } - }, - "required": ["organizationId"] - }, - "v1GetApiKeysResponse": { - "type": "object", - "properties": { - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1ApiKey" - }, - "description": "A list of API keys." - } - }, - "required": ["apiKeys"] - }, - "v1GetAppProofsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "updatePaymentMethodIntent": { + "$ref": "#/definitions/billingUpdatePaymentMethodIntent" }, - "activityId": { - "type": "string", - "description": "Unique identifier for a given activity." - } - }, - "required": ["organizationId", "activityId"] - }, - "v1GetAppProofsResponse": { - "type": "object", - "properties": { - "appProofs": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1AppProof" - } - } - }, - "required": ["appProofs"] - }, - "v1GetAuthenticatorRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." + "createSwapQuoteIntentV2": { + "$ref": "#/definitions/v1CreateSwapQuoteIntentV2" }, - "authenticatorId": { - "type": "string", - "description": "Unique identifier for a given authenticator." - } - }, - "required": ["organizationId", "authenticatorId"] - }, - "v1GetAuthenticatorResponse": { - "type": "object", - "properties": { - "authenticator": { - "$ref": "#/definitions/v1Authenticator", - "description": "An authenticator." + "executeSwapIntentV3": { + "$ref": "#/definitions/v1ExecuteSwapIntentV3" + }, + "deleteSecretsIntent": { + "$ref": "#/definitions/v1DeleteSecretsIntent" + }, + "earnClaimRewardsIntent": { + "$ref": "#/definitions/v1EarnClaimRewardsIntent" + }, + "createSwapQuoteIntentV3": { + "$ref": "#/definitions/v1CreateSwapQuoteIntentV3" + }, + "upsertSwapFeeSponsorshipLimitConfigIntent": { + "$ref": "#/definitions/v1UpsertSwapFeeSponsorshipLimitConfigIntent" + }, + "upsertSwapFixedRateLimitConfigIntent": { + "$ref": "#/definitions/v1UpsertSwapFixedRateLimitConfigIntent" + }, + "createFiatOnRampSessionIntent": { + "$ref": "#/definitions/v1CreateFiatOnRampSessionIntent" } - }, - "required": ["authenticator"] + } }, - "v1GetAuthenticatorsRequest": { + "v1InvitationParams": { "type": "object", "properties": { - "organizationId": { + "receiverUserName": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "The name of the intended Invitation recipient." }, - "userId": { + "receiverUserEmail": { "type": "string", - "description": "Unique identifier for a given user." - } - }, - "required": ["organizationId", "userId"] - }, - "v1GetAuthenticatorsResponse": { - "type": "object", - "properties": { - "authenticators": { + "description": "The email address of the intended Invitation recipient." + }, + "receiverUserTags": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/v1Authenticator" + "type": "string" }, - "description": "A list of authenticators." - } - }, - "required": ["authenticators"] - }, - "v1GetBootProofRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "description": "A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body." }, - "ephemeralKey": { + "accessType": { + "$ref": "#/definitions/v1AccessType", + "description": "The User's permissible access method(s)." + }, + "senderUserId": { "type": "string", - "description": "Hex encoded ephemeral public key." + "description": "Unique identifier for the Sender of an Invitation." } }, - "required": ["organizationId", "ephemeralKey"] + "required": [ + "receiverUserName", + "receiverUserEmail", + "receiverUserTags", + "accessType", + "senderUserId" + ] }, - "v1GetGasUsageRequest": { + "v1IpAllowlist": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "v1GetGasUsageResponse": { - "type": "object", - "properties": { - "windowDurationMinutes": { - "type": "integer", - "format": "int32", - "description": "The window duration (in minutes) for the organization or sub-organization." + "description": "Unique identifier for the organization this allowlist belongs to." }, - "windowLimitUsd": { + "rules": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1IpAllowlistRule" + }, + "description": "List of IP allowlist rules with their metadata." + }, + "publicKey": { "type": "string", - "description": "The window limit (in USD) for the organization or sub-organization." + "description": "Public key of the API key this allowlist applies to. Null means the allowlist applies to the entire organization." }, - "usageUsd": { + "enabled": { + "type": "boolean", + "description": "Whether the IP allowlist is enabled. Only present for organization-level allowlists. Null for API key-level allowlists (presence of the allowlist implies enablement)." + }, + "onEvaluationError": { "type": "string", - "description": "The total gas usage (in USD) of all sponsored transactions processed over the last `window_duration_minutes`" + "description": "Behavior when an error occurs during IP allowlist evaluation. Valid values: ALLOW, DENY. Defaults to DENY." } }, - "required": ["windowDurationMinutes", "windowLimitUsd", "usageUsd"] + "required": ["organizationId", "rules"] }, - "v1GetLatestBootProofRequest": { + "v1IpAllowlistIntentRule": { "type": "object", "properties": { - "organizationId": { + "cidr": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "CIDR block (e.g., '192.168.1.0/24', '2001:db8::/32')." }, - "appName": { + "label": { "type": "string", - "description": "Name of enclave app." + "description": "Optional human-readable label for this rule (e.g., 'Office VPN')." } }, - "required": ["organizationId", "appName"] + "required": ["cidr"] }, - "v1GetNoncesRequest": { + "v1IpAllowlistRule": { "type": "object", "properties": { - "organizationId": { + "cidr": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "CIDR block (e.g., '192.168.1.0/24')." }, - "address": { + "label": { "type": "string", - "description": "The Ethereum address to query nonces for." + "description": "Optional human-readable label for this rule." }, - "caip2": { + "createdAt": { "type": "string", - "enum": [ - "eip155:1", - "eip155:11155111", - "eip155:8453", - "eip155:84532", - "eip155:137", - "eip155:80002" - ], - "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." - }, - "nonce": { - "type": "boolean", - "description": "Whether to fetch the standard on-chain nonce." - }, - "gasStationNonce": { - "type": "boolean", - "description": "Whether to fetch the gas station nonce used for sponsored transactions." + "description": "Creation timestamp as millisecond epoch string." } }, - "required": ["organizationId", "address", "caip2"] + "required": ["cidr"] }, - "v1GetNoncesResponse": { + "v1KeyValue": { "type": "object", "properties": { - "nonce": { - "type": "string", - "format": "uint64", - "description": "The standard on-chain nonce for the address, if requested." + "key": { + "type": "string" }, - "gasStationNonce": { - "type": "string", - "format": "uint64", - "description": "The gas station nonce for sponsored transactions, if requested." + "value": { + "type": "string" } } }, - "v1GetOauth2CredentialRequest": { + "v1ListEarnEnabledVaultsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", "description": "Unique identifier for a given Organization." }, - "oauth2CredentialId": { + "provider": { + "$ref": "#/definitions/v1EarnProvider", + "description": "Optional filter: only return enabled vaults from this provider. Leave EARN_PROVIDER_UNSPECIFIED to return all providers." + }, + "caip19": { "type": "string", - "description": "Unique identifier for a given OAuth 2.0 Credential." + "description": "Optional filter: only return enabled vaults whose underlying asset matches this CAIP-19 asset ID (e.g. 'eip155:8453/erc20:0x833589...'). The chain is taken from the CAIP-19 identifier." + }, + "includeExposure": { + "type": "boolean", + "description": "When true, populate each vault's exposures (the underlying markets it allocates into). This costs an extra provider query per vault, so leave it off for list views." } }, - "required": ["organizationId", "oauth2CredentialId"] + "required": ["organizationId"] }, - "v1GetOauth2CredentialResponse": { + "v1ListEarnEnabledVaultsResponse": { "type": "object", "properties": { - "oauth2Credential": { - "$ref": "#/definitions/v1Oauth2Credential" + "enabledVaults": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1EarnEnabledVault" + }, + "description": "The organization's deployed wrappers." } - }, - "required": ["oauth2Credential"] + } }, - "v1GetOauthProvidersRequest": { + "v1ListEarnPositionsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given Organization." }, - "userId": { + "walletAddress": { "type": "string", - "description": "Unique identifier for a given user." + "description": "The wallet address to return positions for." } }, - "required": ["organizationId"] + "required": ["organizationId", "walletAddress"] }, - "v1GetOauthProvidersResponse": { + "v1ListEarnPositionsResponse": { "type": "object", "properties": { - "oauthProviders": { + "positions": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1OauthProvider" + "$ref": "#/definitions/v1EarnPosition" }, - "description": "A list of Oauth providers." + "description": "The wallet's active Earn positions." } - }, - "required": ["oauthProviders"] + } }, - "v1GetOnRampTransactionStatusRequest": { + "v1ListEarnRewardsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given Organization." }, - "transactionId": { + "walletAddress": { "type": "string", - "description": "The unique identifier for the fiat on ramp transaction." + "description": "The wallet address to return rewards for." }, - "refresh": { - "type": "boolean", - "description": "Optional flag to specify if the transaction status should be refreshed from the fiat on ramp provider. Default = false." - } - }, - "required": ["organizationId", "transactionId"] - }, - "v1GetOnRampTransactionStatusResponse": { - "type": "object", - "properties": { - "transactionStatus": { - "type": "string", - "description": "The status of the fiat on ramp transaction." - } - }, - "required": ["transactionStatus"] - }, - "v1GetOrganizationConfigsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." - } - }, - "required": ["organizationId"] - }, - "v1GetOrganizationConfigsResponse": { - "type": "object", - "properties": { - "configs": { - "$ref": "#/definitions/v1Config", - "description": "Organization configs including quorum settings and organization features." - } - }, - "required": ["configs"] - }, - "v1GetPoliciesRequest": { - "type": "object", - "properties": { - "organizationId": { + "caip2": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Optional filter: only return rewards on this chain (e.g. 'eip155:8453'). When unset, every chain the organization has deployed Earn wrappers on is queried." } }, - "required": ["organizationId"] + "required": ["organizationId", "walletAddress"] }, - "v1GetPoliciesResponse": { + "v1ListEarnRewardsResponse": { "type": "object", "properties": { - "policies": { + "rewards": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1Policy" + "$ref": "#/definitions/v1EarnReward" }, - "description": "A list of policies." + "description": "The wallet's rewards, one entry per (chain, reward token), sorted by chain then token. Entries where every amount is zero are omitted." } - }, - "required": ["policies"] + } }, - "v1GetPolicyEvaluationsRequest": { + "v1ListEarnVaultsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given Organization. Annotates which vaults the organization has already enabled." }, - "activityId": { + "provider": { + "$ref": "#/definitions/v1EarnProvider", + "description": "Optional filter: only return vaults from this provider. Leave EARN_PROVIDER_UNSPECIFIED to return all providers." + }, + "caip19": { "type": "string", - "description": "Unique identifier for a given activity." + "description": "CAIP-19 asset ID (e.g. 'eip155:8453/erc20:0x833589...') to return vaults for. Only vaults whose underlying asset matches are returned; the chain is taken from the CAIP-19 identifier." + }, + "paginationOptions": { + "$ref": "#/definitions/v1Pagination", + "description": "Pagination over the TVL-sorted catalog. before/after cursors are a vault_address from a prior page." } }, - "required": ["organizationId", "activityId"] + "required": ["organizationId", "caip19"] }, - "v1GetPolicyEvaluationsResponse": { + "v1ListEarnVaultsResponse": { "type": "object", "properties": { - "policyEvaluations": { + "vaults": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/externalactivityv1PolicyEvaluation" - } + "$ref": "#/definitions/v1EarnVault" + }, + "description": "The catalog of wrappable vaults, sorted by TVL (USD) descending. To page, pass page_info.end_cursor as the pagination after cursor." + }, + "pageInfo": { + "$ref": "#/definitions/v1PageInfo", + "description": "Pagination metadata for the returned page. Pass end_cursor as the next request's after cursor (or start_cursor as the before cursor) to page through the catalog. Cursors are opaque; do not parse them." } - }, - "required": ["policyEvaluations"] + } }, - "v1GetPolicyRequest": { + "v1ListEmailEventsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given organization" }, - "policyId": { + "email": { "type": "string", - "description": "Unique identifier for a given policy." + "description": "Recipient email address to list email events for" + }, + "eventType": { + "type": "string", + "description": "Optional email event type to filter by. Examples include Send, Delivery, Bounce, and DeliveryDelay" + }, + "paginationOptions": { + "$ref": "#/definitions/v1Pagination", + "description": "Parameters used for cursor-based pagination" } }, - "required": ["organizationId", "policyId"] + "required": ["organizationId", "email"] }, - "v1GetPolicyResponse": { + "v1ListEmailEventsResponse": { "type": "object", "properties": { - "policy": { - "$ref": "#/definitions/v1Policy", - "description": "Object that codifies rules defining the actions that are permissible within an organization." + "emailEvents": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1EmailEvent" + }, + "description": "Email events matching the requested filters, ordered by most recent event first." } }, - "required": ["policy"] + "required": ["emailEvents"] }, - "v1GetPrivateKeyRequest": { + "v1ListEthTransactionHistoryRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given Organization." }, - "privateKeyId": { + "address": { "type": "string", - "description": "Unique identifier for a given private key." + "description": "Address corresponding to a wallet account. Private key addresses are not supported." + }, + "caip2": { + "type": "string", + "enum": [ + "eip155:1", + "eip155:11155111", + "eip155:8453", + "eip155:84532", + "eip155:137", + "eip155:80002", + "eip155:42161", + "eip155:4217", + "eip155:42431", + "eip155:421614", + "eip155:56", + "eip155:97", + "eip155:4663", + "eip155:46630", + "eip155:5042", + "eip155:5042002" + ], + "description": "EVM CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet)." + }, + "paginationOptions": { + "$ref": "#/definitions/v1Pagination", + "description": "Cursor-based pagination options. Cursors are opaque and valid only for the same address and CAIP-2 query." } }, - "required": ["organizationId", "privateKeyId"] + "required": ["organizationId", "address", "caip2"] }, - "v1GetPrivateKeyResponse": { + "v1ListEthTransactionHistoryResponse": { "type": "object", "properties": { - "privateKey": { - "$ref": "#/definitions/v1PrivateKey", - "description": "Cryptographic public/private key pair that can be used for cryptocurrency needs or more generalized encryption." + "transactions": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1EthTransactionHistoryItem" + }, + "description": "EVM transactions for the requested address, ordered by most recent first." + }, + "pageInfo": { + "$ref": "#/definitions/v1PageInfo" } }, - "required": ["privateKey"] + "required": ["transactions"] }, - "v1GetPrivateKeysRequest": { + "v1ListFiatOnRampCredentialsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given Organization." } }, "required": ["organizationId"] }, - "v1GetPrivateKeysResponse": { + "v1ListFiatOnRampCredentialsResponse": { "type": "object", "properties": { - "privateKeys": { + "fiatOnRampCredentials": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1PrivateKey" - }, - "description": "A list of private keys." + "$ref": "#/definitions/v1FiatOnRampCredential" + } } }, - "required": ["privateKeys"] + "required": ["fiatOnRampCredentials"] }, - "v1GetSendTransactionStatusRequest": { + "v1ListOauth2CredentialsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." - }, - "sendTransactionStatusId": { - "type": "string", - "description": "The unique identifier of a send transaction request." + "description": "Unique identifier for a given Organization." } }, - "required": ["organizationId", "sendTransactionStatusId"] + "required": ["organizationId"] }, - "v1GetSendTransactionStatusResponse": { + "v1ListOauth2CredentialsResponse": { "type": "object", "properties": { - "txStatus": { - "type": "string", - "description": "The current status of the send transaction." - }, - "eth": { - "$ref": "#/definitions/v1EthSendTransactionStatus", - "description": "Ethereum-specific transaction status." - }, - "txError": { - "type": "string", - "description": "The error encountered when broadcasting or confirming the transaction, if any." - }, - "error": { - "$ref": "#/definitions/v1TxError", - "description": "Structured error information including revert details, if available." + "oauth2Credentials": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1Oauth2Credential" + } } }, - "required": ["txStatus"] + "required": ["oauth2Credentials"] }, - "v1GetSmartContractInterfaceRequest": { + "v1ListPrivateKeyTagsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." - }, - "smartContractInterfaceId": { - "type": "string", - "description": "Unique identifier for a given smart contract interface." + "description": "Unique identifier for a given Organization." } }, - "required": ["organizationId", "smartContractInterfaceId"] + "required": ["organizationId"] }, - "v1GetSmartContractInterfaceResponse": { + "v1ListPrivateKeyTagsResponse": { "type": "object", "properties": { - "smartContractInterface": { - "$ref": "#/definitions/externaldatav1SmartContractInterface", - "description": "Object to be used in conjunction with policies to guard transaction signing." + "privateKeyTags": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/datav1Tag" + }, + "description": "A list of private key tags." } }, - "required": ["smartContractInterface"] + "required": ["privateKeyTags"] }, - "v1GetSmartContractInterfacesRequest": { + "v1ListSecretsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for the organization or sub-organization whose secrets are listed." + }, + "paginationOptions": { + "$ref": "#/definitions/v1Pagination", + "description": "Parameters used for cursor-based pagination." } }, "required": ["organizationId"] }, - "v1GetSmartContractInterfacesResponse": { + "v1ListSecretsResponse": { "type": "object", "properties": { - "smartContractInterfaces": { + "secrets": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/externaldatav1SmartContractInterface" + "$ref": "#/definitions/v1SecretMetadata" }, - "description": "A list of smart contract interfaces." + "description": "Metadata for each secret in the organization, ordered by most recently created first." } }, - "required": ["smartContractInterfaces"] + "required": ["secrets"] }, - "v1GetSubOrgIdsRequest": { + "v1ListSolTransactionHistoryRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for the parent organization. This is used to find sub-organizations within it." + "description": "Unique identifier for a given Organization." }, - "filterType": { + "address": { "type": "string", - "description": "Specifies the type of filter to apply, i.e 'CREDENTIAL_ID', 'NAME', 'USERNAME', 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN', 'WALLET_ACCOUNT_ADDRESS' or 'PUBLIC_KEY'" + "description": "Address corresponding to a wallet account. Private key addresses are not supported." }, - "filterValue": { + "caip2": { "type": "string", - "description": "The value of the filter to apply for the specified type. For example, a specific email or name string." + "enum": [ + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "solana:mainnet", + "solana:devnet" + ], + "description": "Solana CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." }, "paginationOptions": { "$ref": "#/definitions/v1Pagination", - "description": "Parameters used for cursor-based pagination." + "description": "Cursor-based pagination options. Cursors are opaque and valid only for the same address and CAIP-2 query." } }, - "required": ["organizationId"] + "required": ["organizationId", "address", "caip2"] }, - "v1GetSubOrgIdsResponse": { + "v1ListSolTransactionHistoryResponse": { "type": "object", "properties": { - "organizationIds": { + "transactions": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/v1SolTransactionHistoryItem" }, - "description": "List of unique identifiers for the matching sub-organizations." + "description": "Solana transactions for the requested address, ordered by most recent first." + }, + "pageInfo": { + "$ref": "#/definitions/v1PageInfo" } }, - "required": ["organizationIds"] + "required": ["transactions"] }, - "v1GetUserRequest": { + "v1ListSupportedAssetsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given Organization." }, - "userId": { + "caip2": { "type": "string", - "description": "Unique identifier for a given user." + "enum": [ + "eip155:1", + "eip155:11155111", + "eip155:8453", + "eip155:84532", + "eip155:137", + "eip155:80002", + "eip155:56", + "eip155:97", + "eip155:10", + "eip155:11155420", + "eip155:143", + "eip155:10143", + "eip155:42161", + "eip155:4217", + "eip155:42431", + "eip155:421614", + "eip155:4663", + "eip155:46630", + "eip155:5042", + "eip155:5042002", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" + ], + "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." } }, - "required": ["organizationId", "userId"] + "required": ["organizationId", "caip2"] }, - "v1GetUserResponse": { + "v1ListSupportedAssetsResponse": { "type": "object", "properties": { - "user": { - "$ref": "#/definitions/v1User", - "description": "Web and/or API user within your organization." + "assets": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AssetMetadata" + }, + "description": "List of asset metadata" } - }, - "required": ["user"] + } }, - "v1GetUsersRequest": { + "v1ListUserTagsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given Organization." } }, "required": ["organizationId"] }, - "v1GetUsersResponse": { + "v1ListUserTagsResponse": { "type": "object", "properties": { - "users": { + "userTags": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1User" + "$ref": "#/definitions/datav1Tag" }, - "description": "A list of users." + "description": "A list of user tags." } }, - "required": ["users"] + "required": ["userTags"] }, - "v1GetVerifiedSubOrgIdsRequest": { + "v1ListWebhookEndpointsRequest": { "type": "object", "properties": { "organizationId": { "type": "string", - "description": "Unique identifier for the parent organization. This is used to find sub-organizations within it." - }, - "filterType": { - "type": "string", - "description": "Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE_NUMBER'." - }, - "filterValue": { - "type": "string", - "description": "The value of the filter to apply for the specified type. For example, a specific email or phone number string." - }, - "paginationOptions": { - "$ref": "#/definitions/v1Pagination", - "description": "Parameters used for cursor-based pagination." + "description": "Unique identifier for a given Organization." } }, "required": ["organizationId"] }, - "v1GetVerifiedSubOrgIdsResponse": { + "v1ListWebhookEndpointsResponse": { "type": "object", "properties": { - "organizationIds": { + "webhookEndpoints": { "type": "array", "items": { - "type": "string" - }, - "description": "List of unique identifiers for the matching sub-organizations." + "type": "object", + "$ref": "#/definitions/v1WebhookEndpointData" + } } }, - "required": ["organizationIds"] + "required": ["webhookEndpoints"] }, - "v1GetWalletAccountRequest": { + "v1LogLine": { "type": "object", "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." - }, - "walletId": { - "type": "string", - "description": "Unique identifier for a given wallet." - }, - "address": { + "content": { "type": "string", - "description": "Address corresponding to a wallet account." + "description": "One log line, exactly as the application printed it (without the trailing newline)" }, - "path": { - "type": "string", - "description": "Path corresponding to a wallet account." - } - }, - "required": ["organizationId", "walletId"] - }, - "v1GetWalletAccountResponse": { - "type": "object", - "properties": { - "account": { - "$ref": "#/definitions/v1WalletAccount", - "description": "The resulting wallet account." + "ts": { + "$ref": "#/definitions/externaldatav1Timestamp", + "description": "When the line was logged. Stable across replays, so lines can be chronologically merged across pods" } }, - "required": ["account"] + "required": ["content"] }, - "v1GetWalletAccountsRequest": { + "v1LoginUsage": { "type": "object", "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." - }, - "walletId": { - "type": "string", - "description": "Unique identifier for a given wallet. If not provided, all accounts for the organization will be returned." - }, - "includeWalletDetails": { - "type": "boolean", - "description": "Optional flag to specify if the wallet details should be included in the response. Default = false." - }, - "paginationOptions": { - "$ref": "#/definitions/v1Pagination", - "description": "Parameters used for cursor-based pagination." + "publicKey": { + "type": "string", + "description": "Public key for authentication" } }, - "required": ["organizationId"] + "required": ["publicKey"] }, - "v1GetWalletAccountsResponse": { + "v1MfaPolicy": { "type": "object", "properties": { - "accounts": { + "mfaPolicyId": { + "type": "string", + "description": "Unique identifier for a given MFA Policy." + }, + "mfaPolicyName": { + "type": "string", + "description": "Human-readable name for an MFA Policy." + }, + "condition": { + "type": "string", + "description": "A condition expression that evaluates to true or false, determining when this MFA policy applies." + }, + "requiredAuthenticationMethods": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1WalletAccount" + "$ref": "#/definitions/v1RequiredAuthenticationMethod" }, - "description": "A list of accounts generated from a wallet that share a common seed." + "description": "An ordered list of authentication requirements. Each requirement must be satisfied sequentially to complete MFA." + }, + "order": { + "type": "integer", + "format": "int64", + "description": "The order in which this policy is evaluated relative to other MFA policies." + }, + "notes": { + "type": "string", + "description": "Optional human-readable notes added by a User to describe a particular MFA policy." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" } }, - "required": ["accounts"] + "required": [ + "mfaPolicyId", + "mfaPolicyName", + "condition", + "requiredAuthenticationMethods", + "order", + "createdAt", + "updatedAt" + ] }, - "v1GetWalletAddressBalancesRequest": { + "v1MfaStatus": { "type": "object", "properties": { - "organizationId": { + "mfaPolicyId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given MFA Policy." }, - "address": { + "userId": { "type": "string", - "description": "Address corresponding to a wallet account." + "description": "Unique identifier for a given User." }, - "caip2": { - "type": "string", - "enum": [ - "eip155:1", - "eip155:11155111", - "eip155:8453", - "eip155:84532", - "eip155:137", - "eip155:80002", - "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" - ], - "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." + "satisfied": { + "type": "boolean", + "description": "Whether the MFA policy requirements are currently satisfied." + }, + "satisfiedMethods": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticationMethod" + }, + "description": "A list of authentication methods already satisfied for this MFA policy." + }, + "requiredMethods": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RequiredAuthenticationMethod" + }, + "description": "An ordered list of authentication requirements needed to satisfy this MFA policy." } }, - "required": ["organizationId", "address", "caip2"] + "required": [ + "mfaPolicyId", + "userId", + "satisfied", + "satisfiedMethods", + "requiredMethods" + ] }, - "v1GetWalletAddressBalancesResponse": { + "v1MnemonicLanguage": { + "type": "string", + "enum": [ + "MNEMONIC_LANGUAGE_ENGLISH", + "MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE", + "MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE", + "MNEMONIC_LANGUAGE_CZECH", + "MNEMONIC_LANGUAGE_FRENCH", + "MNEMONIC_LANGUAGE_ITALIAN", + "MNEMONIC_LANGUAGE_JAPANESE", + "MNEMONIC_LANGUAGE_KOREAN", + "MNEMONIC_LANGUAGE_SPANISH" + ] + }, + "v1NOOPCodegenAnchorResponse": { "type": "object", "properties": { - "balances": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1AssetBalance" - }, - "description": "List of asset balances" + "stamp": { + "$ref": "#/definitions/v1WebAuthnStamp" + }, + "tokenUsage": { + "$ref": "#/definitions/v1TokenUsage" } - } + }, + "required": ["stamp"] }, - "v1GetWalletRequest": { + "v1NativeRevertError": { "type": "object", "properties": { - "organizationId": { + "nativeType": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "The type of native error: 'error_string', 'panic', or 'execution_reverted'." }, - "walletId": { + "message": { "type": "string", - "description": "Unique identifier for a given wallet." + "description": "The error message for Error(string) reverts." + }, + "panicCode": { + "type": "string", + "format": "uint64", + "description": "The panic code for Panic(uint256) reverts." } - }, - "required": ["organizationId", "walletId"] + } }, - "v1GetWalletResponse": { + "v1Oauth2AuthenticateIntent": { "type": "object", "properties": { - "wallet": { - "$ref": "#/definitions/v1Wallet", - "description": "A collection of deterministically generated cryptographic public / private key pairs that share a common seed." + "oauth2CredentialId": { + "type": "string", + "description": "The OAuth 2.0 credential id whose client_id and client_secret will be used in the OAuth 2.0 flow" + }, + "authCode": { + "type": "string", + "description": "The auth_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow" + }, + "redirectUri": { + "type": "string", + "description": "The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider" + }, + "codeVerifier": { + "type": "string", + "description": "The code verifier used by OAuth 2.0 PKCE providers" + }, + "nonce": { + "type": "string", + "description": "A nonce value set to sha256(publicKey), used to bind the OIDC token to a specific public key" + }, + "bearerTokenTargetPublicKey": { + "type": "string", + "description": "An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token" } }, - "required": ["wallet"] + "required": [ + "oauth2CredentialId", + "authCode", + "redirectUri", + "codeVerifier", + "nonce" + ] }, - "v1GetWalletsRequest": { + "v1Oauth2AuthenticateRequest": { "type": "object", "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_OAUTH2_AUTHENTICATE"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, "organizationId": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1Oauth2AuthenticateIntent" + }, + "generateAppProofs": { + "type": "boolean" } }, - "required": ["organizationId"] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1GetWalletsResponse": { + "v1Oauth2AuthenticateResult": { "type": "object", "properties": { - "wallets": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1Wallet" - }, - "description": "A list of wallets." + "oidcToken": { + "type": "string", + "description": "Base64 encoded OIDC token issued by Turnkey to be used with the LoginWithOAuth activity" } }, - "required": ["wallets"] + "required": ["oidcToken"] }, - "v1GetWhoamiRequest": { + "v1Oauth2Credential": { "type": "object", "properties": { + "oauth2CredentialId": { + "type": "string", + "description": "Unique identifier for a given OAuth 2.0 Credential." + }, "organizationId": { "type": "string", - "description": "Unique identifier for a given organization. If the request is being made by a WebAuthN user and their sub-organization ID is unknown, this can be the parent organization ID; using the sub-organization ID when possible is preferred due to performance reasons." + "description": "Unique identifier for an Organization." + }, + "provider": { + "$ref": "#/definitions/v1Oauth2Provider", + "description": "The provider for a given OAuth 2.0 Credential." + }, + "clientId": { + "type": "string", + "description": "The client id for a given OAuth 2.0 Credential." + }, + "encryptedClientSecret": { + "type": "string", + "description": "The encrypted client secret for a given OAuth 2.0 Credential encrypted to the TLS Fetcher quorum key." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" } }, - "required": ["organizationId"] + "required": [ + "oauth2CredentialId", + "organizationId", + "provider", + "clientId", + "encryptedClientSecret", + "createdAt", + "updatedAt" + ] }, - "v1GetWhoamiResponse": { + "v1Oauth2Provider": { + "type": "string", + "enum": ["OAUTH2_PROVIDER_X", "OAUTH2_PROVIDER_DISCORD"] + }, + "v1OauthIntent": { "type": "object", "properties": { - "organizationId": { + "oidcToken": { "type": "string", - "description": "Unique identifier for a given organization." + "description": "Base64 encoded OIDC token" }, - "organizationName": { + "targetPublicKey": { "type": "string", - "description": "Human-readable name for an organization." + "description": "Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted." }, - "userId": { + "apiKeyName": { "type": "string", - "description": "Unique identifier for a given user." + "description": "Optional human-readable name for an API Key. If none provided, default to Oauth - \u003cTimestamp\u003e" }, - "username": { + "expirationSeconds": { "type": "string", - "description": "Human-readable name for a user." + "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated Oauth API keys" } }, - "required": ["organizationId", "organizationName", "userId", "username"] - }, - "v1HashFunction": { - "type": "string", - "enum": [ - "HASH_FUNCTION_NO_OP", - "HASH_FUNCTION_SHA256", - "HASH_FUNCTION_KECCAK256", - "HASH_FUNCTION_NOT_APPLICABLE" - ] + "required": ["oidcToken", "targetPublicKey"] }, - "v1ImportPrivateKeyIntent": { + "v1OauthLoginIntent": { "type": "object", "properties": { - "userId": { + "oidcToken": { "type": "string", - "description": "The ID of the User importing a Private Key." + "description": "Base64 encoded OIDC token" }, - "privateKeyName": { + "publicKey": { "type": "string", - "description": "Human-readable name for a Private Key." + "description": "Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request" }, - "encryptedBundle": { + "expirationSeconds": { "type": "string", - "description": "Bundle containing a raw private key encrypted to the enclave's target public key." + "description": "Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used." }, - "curve": { - "$ref": "#/definitions/v1Curve", - "description": "Cryptographic Curve used to generate a given Private Key." + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated Login API keys" }, - "addressFormats": { - "type": "array", - "items": { - "$ref": "#/definitions/v1AddressFormat" - }, - "description": "Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." + "sessionProfileId": { + "type": "string", + "description": "Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used." } }, - "required": [ - "userId", - "privateKeyName", - "encryptedBundle", - "curve", - "addressFormats" - ] + "required": ["oidcToken", "publicKey"] }, - "v1ImportPrivateKeyRequest": { + "v1OauthLoginRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_IMPORT_PRIVATE_KEY"] + "enum": ["ACTIVITY_TYPE_OAUTH_LOGIN"] }, "timestampMs": { "type": "string", @@ -9230,7 +17383,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1ImportPrivateKeyIntent" + "$ref": "#/definitions/v1OauthLoginIntent" }, "generateAppProofs": { "type": "boolean" @@ -9238,152 +17391,94 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1ImportPrivateKeyResult": { + "v1OauthLoginResult": { "type": "object", "properties": { - "privateKeyId": { + "session": { "type": "string", - "description": "Unique identifier for a Private Key." - }, - "addresses": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/immutableactivityv1Address" - }, - "description": "A list of addresses." + "description": "Signed JWT containing an expiry, public key, session type, user id, and organization id" } }, - "required": ["privateKeyId", "addresses"] + "required": ["session"] }, - "v1ImportWalletIntent": { + "v1OauthProvider": { "type": "object", "properties": { - "userId": { - "type": "string", - "description": "The ID of the User importing a Wallet." - }, - "walletName": { + "providerId": { "type": "string", - "description": "Human-readable name for a Wallet." + "description": "Unique identifier for an OAuth Provider" }, - "encryptedBundle": { + "providerName": { "type": "string", - "description": "Bundle containing a wallet mnemonic encrypted to the enclave's target public key." + "description": "Human-readable name to identify a Provider." }, - "accounts": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1WalletAccountParams" - }, - "description": "A list of wallet Accounts." - } - }, - "required": ["userId", "walletName", "encryptedBundle", "accounts"] - }, - "v1ImportWalletRequest": { - "type": "object", - "properties": { - "type": { + "issuer": { "type": "string", - "enum": ["ACTIVITY_TYPE_IMPORT_WALLET"] + "description": "The issuer of the token, typically a URL indicating the authentication server, e.g https://accounts.google.com" }, - "timestampMs": { + "audience": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Expected audience ('aud' attribute of the signed token) which represents the app ID" }, - "organizationId": { + "subject": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Expected subject ('sub' attribute of the signed token) which represents the user ID" }, - "parameters": { - "$ref": "#/definitions/v1ImportWalletIntent" + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" }, - "generateAppProofs": { - "type": "boolean" + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": [ + "providerId", + "providerName", + "issuer", + "audience", + "subject", + "createdAt", + "updatedAt" + ] }, - "v1ImportWalletResult": { + "v1OauthProviderParams": { "type": "object", "properties": { - "walletId": { + "providerName": { "type": "string", - "description": "Unique identifier for a Wallet." + "description": "Human-readable name to identify a Provider." }, - "addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of account addresses." + "oidcToken": { + "type": "string", + "description": "Base64 encoded OIDC token" } }, - "required": ["walletId", "addresses"] + "required": ["providerName", "oidcToken"] }, - "v1InitFiatOnRampIntent": { + "v1OauthProviderParamsV2": { "type": "object", "properties": { - "onrampProvider": { - "$ref": "#/definitions/v1FiatOnRampProvider", - "description": "Enum to specifiy which on-ramp provider to use" - }, - "walletAddress": { - "type": "string", - "description": "Destination wallet address for the buy transaction." - }, - "network": { - "$ref": "#/definitions/v1FiatOnRampBlockchainNetwork", - "description": "Blockchain network to be used for the transaction, e.g., bitcoin, ethereum. Maps to MoonPay's network or Coinbase's defaultNetwork." - }, - "cryptoCurrencyCode": { - "$ref": "#/definitions/v1FiatOnRampCryptoCurrency", - "description": "Code for the cryptocurrency to be purchased, e.g., btc, eth. Maps to MoonPay's currencyCode or Coinbase's defaultAsset." - }, - "fiatCurrencyCode": { - "$ref": "#/definitions/v1FiatOnRampCurrency", - "description": "Code for the fiat currency to be used in the transaction, e.g., USD, EUR." - }, - "fiatCurrencyAmount": { - "type": "string", - "description": "Specifies a preset fiat amount for the transaction, e.g., '100'. Must be greater than '20'. If not provided, the user will be prompted to enter an amount." - }, - "paymentMethod": { - "$ref": "#/definitions/v1FiatOnRampPaymentMethod", - "description": "Pre-selected payment method, e.g., CREDIT_DEBIT_CARD, APPLE_PAY. Validated against the chosen provider." - }, - "countryCode": { + "providerName": { "type": "string", - "description": "ISO 3166-1 two-digit country code for Coinbase representing the purchasing user’s country of residence, e.g., US, GB." + "description": "Human-readable name to identify a Provider." }, - "countrySubdivisionCode": { + "oidcToken": { "type": "string", - "description": "ISO 3166-2 two-digit country subdivision code for Coinbase representing the purchasing user’s subdivision of residence within their country, e.g. NY. Required if country_code=US." - }, - "sandboxMode": { - "type": "boolean", - "description": "Optional flag to indicate whether to use the sandbox mode to simulate transactions for the on-ramp provider. Default is false." + "description": "Base64 encoded OIDC token" }, - "urlForSignature": { - "type": "string", - "description": "Optional MoonPay Widget URL to sign when using MoonPay client SDKs with URL Signing enabled." + "oidcClaims": { + "$ref": "#/definitions/v1OidcClaims", + "description": "OIDC claims (iss, sub, aud) to uniquely identify the user" } }, - "required": [ - "onrampProvider", - "walletAddress", - "network", - "cryptoCurrencyCode" - ] + "required": ["providerName"] }, - "v1InitFiatOnRampRequest": { + "v1OauthRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_FIAT_ON_RAMP"] + "enum": ["ACTIVITY_TYPE_OAUTH"] }, "timestampMs": { "type": "string", @@ -9394,7 +17489,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1InitFiatOnRampIntent" + "$ref": "#/definitions/v1OauthIntent" }, "generateAppProofs": { "type": "boolean" @@ -9402,40 +17497,94 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1InitFiatOnRampResult": { + "v1OauthResult": { "type": "object", "properties": { - "onRampUrl": { + "userId": { "type": "string", - "description": "Unique URL for a given fiat on-ramp flow." + "description": "Unique identifier for the authenticating User." }, - "onRampTransactionId": { + "apiKeyId": { "type": "string", - "description": "Unique identifier used to retrieve transaction statuses for a given fiat on-ramp flow." + "description": "Unique identifier for the created API key." }, - "onRampUrlSignature": { + "credentialBundle": { "type": "string", - "description": "Optional signature of the MoonPay Widget URL. The signature is generated if the Init Fiat On Ramp intent includes the urlForSignature field. The signature can be used to initialize the MoonPay SDKs when URL signing is enabled for your project." + "description": "HPKE encrypted credential bundle" } }, - "required": ["onRampUrl", "onRampTransactionId"] + "required": ["userId", "apiKeyId", "credentialBundle"] }, - "v1InitImportPrivateKeyIntent": { + "v1OidcClaims": { "type": "object", "properties": { - "userId": { + "iss": { "type": "string", - "description": "The ID of the User importing a Private Key." + "description": "The issuer identifier from the OIDC token (iss claim)" + }, + "sub": { + "type": "string", + "description": "The subject identifier from the OIDC token (sub claim)" + }, + "aud": { + "type": "string", + "description": "The audience from the OIDC token (aud claim)" } }, - "required": ["userId"] + "required": ["iss", "sub", "aud"] + }, + "v1Operator": { + "type": "string", + "enum": [ + "OPERATOR_EQUAL", + "OPERATOR_MORE_THAN", + "OPERATOR_MORE_THAN_OR_EQUAL", + "OPERATOR_LESS_THAN", + "OPERATOR_LESS_THAN_OR_EQUAL", + "OPERATOR_CONTAINS", + "OPERATOR_NOT_EQUAL", + "OPERATOR_IN", + "OPERATOR_NOT_IN", + "OPERATOR_CONTAINS_ONE", + "OPERATOR_CONTAINS_ALL" + ] + }, + "v1OtpAuthIntent": { + "type": "object", + "properties": { + "otpId": { + "type": "string", + "description": "ID representing the result of an init OTP activity." + }, + "otpCode": { + "type": "string", + "description": "OTP sent out to a user's contact (email or SMS)" + }, + "targetPublicKey": { + "type": "string", + "description": "Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted." + }, + "apiKeyName": { + "type": "string", + "description": "Optional human-readable name for an API Key. If none provided, default to OTP Auth - \u003cTimestamp\u003e" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated OTP Auth API keys" + } + }, + "required": ["otpId", "otpCode", "targetPublicKey"] }, - "v1InitImportPrivateKeyRequest": { + "v1OtpAuthRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY"] + "enum": ["ACTIVITY_TYPE_OTP_AUTH"] }, "timestampMs": { "type": "string", @@ -9446,7 +17595,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1InitImportPrivateKeyIntent" + "$ref": "#/definitions/v1OtpAuthIntent" }, "generateAppProofs": { "type": "boolean" @@ -9454,32 +17603,90 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1InitImportPrivateKeyResult": { + "v1OtpAuthResult": { "type": "object", "properties": { - "importBundle": { + "userId": { "type": "string", - "description": "Import bundle containing a public key and signature to use for importing client data." + "description": "Unique identifier for the authenticating User." + }, + "apiKeyId": { + "type": "string", + "description": "Unique identifier for the created API key." + }, + "credentialBundle": { + "type": "string", + "description": "HPKE encrypted credential bundle" } }, - "required": ["importBundle"] + "required": ["userId"] }, - "v1InitImportWalletIntent": { + "v1OtpLoginIntent": { "type": "object", "properties": { - "userId": { + "verificationToken": { "type": "string", - "description": "The ID of the User importing a Wallet." + "description": "Signed JWT containing a unique id, expiry, verification type, contact" + }, + "publicKey": { + "type": "string", + "description": "Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token" + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated Login API keys" + }, + "clientSignature": { + "$ref": "#/definitions/v1ClientSignature", + "description": "Optional signature proving authorization for this login. The signature is over the verification token ID and the public key. Only required if a public key was provided during the verification step." + }, + "sessionProfileId": { + "type": "string", + "description": "Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used." } }, - "required": ["userId"] + "required": ["verificationToken", "publicKey"] }, - "v1InitImportWalletRequest": { + "v1OtpLoginIntentV2": { + "type": "object", + "properties": { + "verificationToken": { + "type": "string", + "description": "Signed Verification Token containing a unique id, expiry, verification type, contact" + }, + "publicKey": { + "type": "string", + "description": "Client-side public key generated by the user, used as the session public key upon successful login" + }, + "clientSignature": { + "$ref": "#/definitions/v1ClientSignature", + "description": "Required signature proving authorization for this login. The signature is over the verification token ID and the public key. Required for secure OTP login process." + }, + "expirationSeconds": { + "type": "string", + "description": "Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated Login sessions" + }, + "sessionProfileId": { + "type": "string", + "description": "Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used." + } + }, + "required": ["verificationToken", "publicKey", "clientSignature"] + }, + "v1OtpLoginRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_IMPORT_WALLET"] + "enum": ["ACTIVITY_TYPE_OTP_LOGIN_V2"] }, "timestampMs": { "type": "string", @@ -9490,7 +17697,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1InitImportWalletIntent" + "$ref": "#/definitions/v1OtpLoginIntentV2" }, "generateAppProofs": { "type": "boolean" @@ -9498,162 +17705,153 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1InitImportWalletResult": { + "v1OtpLoginResult": { "type": "object", "properties": { - "importBundle": { + "session": { "type": "string", - "description": "Import bundle containing a public key and signature to use for importing client data." + "description": "Signed JWT containing an expiry, public key, session type, user id, and organization id" } }, - "required": ["importBundle"] + "required": ["session"] }, - "v1InitOtpAuthIntent": { + "v1Outcome": { + "type": "string", + "enum": [ + "OUTCOME_ALLOW", + "OUTCOME_DENY_EXPLICIT", + "OUTCOME_DENY_IMPLICIT", + "OUTCOME_REQUIRES_CONSENSUS", + "OUTCOME_REJECTED", + "OUTCOME_ERROR", + "OUTCOME_REQUIRES_AUTHENTICATORS", + "OUTCOME_TIME_INACTIVE" + ] + }, + "v1PageInfo": { "type": "object", "properties": { - "otpType": { - "type": "string", - "description": "Enum to specifiy whether to send OTP via SMS or email" - }, - "contact": { - "type": "string", - "description": "Email or phone number to send the OTP code to" - }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + "hasNextPage": { + "type": "boolean" }, - "smsCustomization": { - "$ref": "#/definitions/v1SmsCustomizationParams", - "description": "Optional parameters for customizing SMS message. If not provided, the default sms message will be used." + "hasPreviousPage": { + "type": "boolean" }, - "userIdentifier": { - "type": "string", - "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + "startCursor": { + "type": "string" }, - "sendFromEmailAddress": { + "endCursor": { + "type": "string" + } + } + }, + "v1Pagination": { + "type": "object", + "properties": { + "limit": { "type": "string", - "description": "Optional custom email address from which to send the OTP email" + "description": "A limit of the number of object to be returned, between 1 and 100. Defaults to 10." }, - "sendFromEmailSenderName": { + "before": { "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "description": "A pagination cursor. This is an object ID that enables you to fetch all objects before this ID." }, - "replyToEmailAddress": { + "after": { "type": "string", - "description": "Optional custom email address to use as reply-to" + "description": "A pagination cursor. This is an object ID that enables you to fetch all objects after this ID." } - }, - "required": ["otpType", "contact"] + } }, - "v1InitOtpAuthIntentV2": { + "v1PathFormat": { + "type": "string", + "enum": ["PATH_FORMAT_BIP32"] + }, + "v1PayloadEncoding": { + "type": "string", + "enum": [ + "PAYLOAD_ENCODING_HEXADECIMAL", + "PAYLOAD_ENCODING_TEXT_UTF8", + "PAYLOAD_ENCODING_EIP712", + "PAYLOAD_ENCODING_EIP7702_AUTHORIZATION" + ] + }, + "v1Policy": { "type": "object", "properties": { - "otpType": { + "policyId": { "type": "string", - "description": "Enum to specifiy whether to send OTP via SMS or email" + "description": "Unique identifier for a given Policy." }, - "contact": { + "policyName": { "type": "string", - "description": "Email or phone number to send the OTP code to" + "description": "Human-readable name for a Policy." }, - "otpLength": { - "type": "integer", - "format": "int32", - "description": "Optional length of the OTP code. Default = 9" + "effect": { + "$ref": "#/definitions/v1Effect", + "description": "The instruction to DENY or ALLOW a particular activity following policy selector(s)." }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" }, - "smsCustomization": { - "$ref": "#/definitions/v1SmsCustomizationParams", - "description": "Optional parameters for customizing SMS message. If not provided, the default SMS message will be used." + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" }, - "userIdentifier": { + "notes": { "type": "string", - "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + "description": "Human-readable notes added by a User to describe a particular policy." }, - "sendFromEmailAddress": { + "consensus": { "type": "string", - "description": "Optional custom email address from which to send the OTP email" - }, - "alphanumeric": { - "type": "boolean", - "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true" + "description": "A consensus expression that evalutes to true or false." }, - "sendFromEmailSenderName": { + "condition": { "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "description": "A condition expression that evalutes to true or false." }, - "replyToEmailAddress": { + "time": { "type": "string", - "description": "Optional custom email address to use as reply-to" + "description": "A time expression that evalutes to true or false." } }, - "required": ["otpType", "contact"] + "required": [ + "policyId", + "policyName", + "effect", + "createdAt", + "updatedAt", + "notes", + "consensus", + "condition" + ] }, - "v1InitOtpAuthIntentV3": { + "v1PostTvcQuorumKeyShareIntent": { "type": "object", "properties": { - "otpType": { - "type": "string", - "description": "Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" - }, - "contact": { - "type": "string", - "description": "Email or phone number to send the OTP code to" - }, - "otpLength": { - "type": "integer", - "format": "int32", - "description": "Optional length of the OTP code. Default = 9" - }, - "appName": { - "type": "string", - "description": "The name of the application. This field is required and will be used in email notifications if an email template is not provided." - }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParamsV2", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." - }, - "smsCustomization": { - "$ref": "#/definitions/v1SmsCustomizationParams", - "description": "Optional parameters for customizing SMS message. If not provided, the default SMS message will be used." - }, - "userIdentifier": { - "type": "string", - "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." - }, - "sendFromEmailAddress": { - "type": "string", - "description": "Optional custom email address from which to send the OTP email" - }, - "alphanumeric": { - "type": "boolean", - "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true" - }, - "sendFromEmailSenderName": { - "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" - }, - "expirationSeconds": { + "deploymentId": { "type": "string", - "description": "Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)" + "description": "Unique identifier of the TVC deployment receiving quorum key share" }, - "replyToEmailAddress": { + "ephemeralPublicKeyHex": { "type": "string", - "description": "Optional custom email address to use as reply-to" + "description": "Hex-encoded ephemeral public key used to encrypt the quorum key share" + }, + "shareApprovalBundle": { + "$ref": "#/definitions/v1QuorumKeyShareApprovalBundle", + "description": "Re-encrypted quorum key share and approval" } }, - "required": ["otpType", "contact", "appName"] + "required": [ + "deploymentId", + "ephemeralPublicKeyHex", + "shareApprovalBundle" + ] }, - "v1InitOtpAuthRequest": { + "v1PostTvcQuorumKeyShareRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_OTP_AUTH_V3"] + "enum": ["ACTIVITY_TYPE_POST_TVC_QUORUM_KEY_SHARE"] }, "timestampMs": { "type": "string", @@ -9664,201 +17862,275 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1InitOtpAuthIntentV3" - }, - "generateAppProofs": { - "type": "boolean" + "$ref": "#/definitions/v1PostTvcQuorumKeyShareIntent" } }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1InitOtpAuthResult": { + "v1PostTvcQuorumKeyShareResult": { "type": "object", "properties": { - "otpId": { + "provisioningShareId": { "type": "string", - "description": "Unique identifier for an OTP authentication" + "description": "The unique identifier for the provisioning quorum key share" } }, - "required": ["otpId"] + "required": ["provisioningShareId"] }, - "v1InitOtpAuthResultV2": { + "v1PrivateKey": { "type": "object", "properties": { - "otpId": { + "privateKeyId": { "type": "string", - "description": "Unique identifier for an OTP authentication" - } - }, - "required": ["otpId"] - }, - "v1InitOtpIntent": { - "type": "object", - "properties": { - "otpType": { + "description": "Unique identifier for a given Private Key." + }, + "publicKey": { "type": "string", - "description": "Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" + "description": "The public component of a cryptographic key pair used to sign messages and transactions." }, - "contact": { + "privateKeyName": { "type": "string", - "description": "Email or phone number to send the OTP code to" + "description": "Human-readable name for a Private Key." }, - "otpLength": { - "type": "integer", - "format": "int32", - "description": "Optional length of the OTP code. Default = 9" + "curve": { + "$ref": "#/definitions/v1Curve", + "description": "Cryptographic Curve used to generate a given Private Key." }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + "addresses": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/externaldatav1Address" + }, + "description": "Derived cryptocurrency addresses for a given Private Key." }, - "smsCustomization": { - "$ref": "#/definitions/v1SmsCustomizationParams", - "description": "Optional parameters for customizing SMS message. If not provided, the default sms message will be used." + "privateKeyTags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Private Key Tag IDs." }, - "userIdentifier": { - "type": "string", - "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" }, - "sendFromEmailAddress": { - "type": "string", - "description": "Optional custom email address from which to send the OTP email" + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" }, - "alphanumeric": { + "exported": { "type": "boolean", - "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true" - }, - "sendFromEmailSenderName": { - "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)" + "description": "True when a given Private Key is exported, false otherwise." }, - "replyToEmailAddress": { - "type": "string", - "description": "Optional custom email address to use as reply-to" + "imported": { + "type": "boolean", + "description": "True when a given Private Key is imported, false otherwise." } }, - "required": ["otpType", "contact"] + "required": [ + "privateKeyId", + "publicKey", + "privateKeyName", + "curve", + "addresses", + "privateKeyTags", + "createdAt", + "updatedAt", + "exported", + "imported" + ] }, - "v1InitOtpIntentV2": { + "v1PrivateKeyParams": { "type": "object", "properties": { - "otpType": { - "type": "string", - "description": "Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" - }, - "contact": { + "privateKeyName": { "type": "string", - "description": "Email or phone number to send the OTP code to" + "description": "Human-readable name for a Private Key." }, - "otpLength": { - "type": "integer", - "format": "int32", - "description": "Optional length of the OTP code. Default = 9" + "curve": { + "$ref": "#/definitions/v1Curve", + "description": "Cryptographic Curve used to generate a given Private Key." }, - "appName": { - "type": "string", - "description": "The name of the application. This field is required and will be used in email notifications if an email template is not provided." + "privateKeyTags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body." }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParamsV2", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + "addressFormats": { + "type": "array", + "items": { + "$ref": "#/definitions/v1AddressFormat" + }, + "description": "Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." + } + }, + "required": [ + "privateKeyName", + "curve", + "privateKeyTags", + "addressFormats" + ] + }, + "v1PrivateKeyResult": { + "type": "object", + "properties": { + "privateKeyId": { + "type": "string" }, - "smsCustomization": { - "$ref": "#/definitions/v1SmsCustomizationParams", - "description": "Optional parameters for customizing SMS message. If not provided, the default SMS message will be used." + "addresses": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/immutableactivityv1Address" + } + } + } + }, + "v1ProvisioningState": { + "type": "string", + "enum": [ + "PROVISIONING_STATE_PENDING", + "PROVISIONING_STATE_AWAITING_PROVISION", + "PROVISIONING_STATE_PROVISIONED" + ] + }, + "v1PublicKeyCredentialWithAttestation": { + "type": "object", + "properties": { + "id": { + "type": "string" }, - "userIdentifier": { + "type": { "type": "string", - "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + "enum": ["public-key"] }, - "sendFromEmailAddress": { + "rawId": { + "type": "string" + }, + "authenticatorAttachment": { "type": "string", - "description": "Optional custom email address from which to send the OTP email" + "enum": ["cross-platform", "platform"], + "x-nullable": true }, - "alphanumeric": { - "type": "boolean", - "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). Default = true" + "response": { + "$ref": "#/definitions/v1AuthenticatorAttestationResponse" }, - "sendFromEmailSenderName": { + "clientExtensionResults": { + "$ref": "#/definitions/v1SimpleClientExtensionResults" + } + }, + "required": ["id", "type", "rawId", "response", "clientExtensionResults"] + }, + "v1QuorumKeyShareApprovalBundle": { + "type": "object", + "properties": { + "operatorId": { "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "description": "Unique identifier of the operator providing this quorum key share" }, - "expirationSeconds": { + "reEncryptedShareHex": { "type": "string", - "description": "Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)" + "description": "Hex-encoded re-encrypted quorum key share" }, - "replyToEmailAddress": { + "signature": { "type": "string", - "description": "Optional custom email address to use as reply-to" + "description": "Signature from the share set operator approving the manifest" } }, - "required": ["otpType", "contact", "appName"] + "required": ["operatorId", "reEncryptedShareHex", "signature"] }, - "v1InitOtpIntentV3": { + "v1ReEncryptTvcQuorumKeyShareIntent": { "type": "object", "properties": { - "otpType": { + "attestationDocB64": { "type": "string", - "description": "Whether to send OTP via SMS or email. Possible values: OTP_TYPE_SMS, OTP_TYPE_EMAIL" + "description": "Base64-encoded attestation document for the TVC deployment provisioning enclave" }, - "contact": { + "manifestB64": { "type": "string", - "description": "Email or phone number to send the OTP code to" + "description": "Base64-encoded manifest for the TVC deployment" }, - "appName": { + "operatorEncryptKey": { "type": "string", - "description": "The name of the application." - }, - "otpLength": { - "type": "integer", - "format": "int32", - "description": "Optional length of the OTP code. Default = 9" - }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParamsV2", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + "description": "Operator encryption public key used to encrypt the hosted TVC quorum key share" }, - "smsCustomization": { - "$ref": "#/definitions/v1SmsCustomizationParams", - "description": "Optional parameters for customizing SMS message. If not provided, the default sms message will be used." + "operatorSignKey": { + "type": "string", + "description": "Operator signing public key used to approve the TVC manifest" }, - "userIdentifier": { + "deploymentId": { "type": "string", - "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." + "description": "Unique identifier of the TVC deployment receiving the re-encrypted quorum key share" }, - "sendFromEmailAddress": { + "appQuorumKey": { "type": "string", - "description": "Optional custom email address from which to send the OTP email" + "description": "Quorum key for the TVC application" + } + }, + "required": [ + "attestationDocB64", + "manifestB64", + "operatorEncryptKey", + "operatorSignKey", + "deploymentId", + "appQuorumKey" + ] + }, + "v1ReEncryptTvcQuorumKeyShareRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_RE_ENCRYPT_TVC_QUORUM_KEY_SHARE"] }, - "alphanumeric": { - "type": "boolean", - "description": "Optional flag to specify if the OTP code should be alphanumeric (Crockford’s Base32). If set to false, OTP code will only be numeric. Default = true" + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "sendFromEmailSenderName": { + "organizationId": { "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "description": "Unique identifier for a given Organization." }, - "expirationSeconds": { + "parameters": { + "$ref": "#/definitions/v1ReEncryptTvcQuorumKeyShareIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1ReEncryptTvcQuorumKeyShareResult": { + "type": "object", + "properties": { + "provisioningShareId": { "type": "string", - "description": "Expiration window (in seconds) indicating how long the OTP is valid for. If not provided, a default of 5 minutes will be used. Maximum value is 600 seconds (10 minutes)" + "description": "The unique identifier for the provisioning quorum key share" + } + }, + "required": ["provisioningShareId"] + }, + "v1RecoverUserIntent": { + "type": "object", + "properties": { + "authenticator": { + "$ref": "#/definitions/v1AuthenticatorParamsV2", + "description": "The new authenticator to register." }, - "replyToEmailAddress": { + "userId": { "type": "string", - "description": "Optional custom email address to use as reply-to" + "description": "Unique identifier for the user performing recovery." } }, - "required": ["otpType", "contact", "appName"] + "required": ["authenticator", "userId"] }, - "v1InitOtpRequest": { + "v1RecoverUserRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_OTP_V3"] + "enum": ["ACTIVITY_TYPE_RECOVER_USER"] }, "timestampMs": { "type": "string", @@ -9869,7 +18141,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1InitOtpIntentV3" + "$ref": "#/definitions/v1RecoverUserIntent" }, "generateAppProofs": { "type": "boolean" @@ -9877,104 +18149,105 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1InitOtpResult": { + "v1RecoverUserResult": { "type": "object", "properties": { - "otpId": { - "type": "string", - "description": "Unique identifier for an OTP authentication" + "authenticatorId": { + "type": "array", + "items": { + "type": "string" + }, + "description": "ID of the authenticator created." } }, - "required": ["otpId"] + "required": ["authenticatorId"] }, - "v1InitOtpResultV2": { + "v1RejectActivityIntent": { "type": "object", "properties": { - "otpId": { - "type": "string", - "description": "Unique identifier for an OTP flow" - }, - "otpEncryptionTargetBundle": { + "fingerprint": { "type": "string", - "description": "Signed bundle containing a target encryption key to use when submitting OTP codes." + "description": "An artifact verifying a User's action." } }, - "required": ["otpId", "otpEncryptionTargetBundle"] + "required": ["fingerprint"] }, - "v1InitUserEmailRecoveryIntent": { + "v1RejectActivityRequest": { "type": "object", "properties": { - "email": { - "type": "string", - "description": "Email of the user starting recovery" - }, - "targetPublicKey": { + "type": { "type": "string", - "description": "Client-side public key generated by the user, to which the recovery bundle will be encrypted." + "enum": ["ACTIVITY_TYPE_REJECT_ACTIVITY"] }, - "expirationSeconds": { + "timestampMs": { "type": "string", - "description": "Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used." - }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "sendFromEmailAddress": { + "organizationId": { "type": "string", - "description": "Optional custom email address from which to send the OTP email" + "description": "Unique identifier for a given Organization." }, - "sendFromEmailSenderName": { - "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "parameters": { + "$ref": "#/definitions/v1RejectActivityIntent" }, - "replyToEmailAddress": { - "type": "string", - "description": "Optional custom email address to use as reply-to" + "generateAppProofs": { + "type": "boolean" } }, - "required": ["email", "targetPublicKey"] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1InitUserEmailRecoveryIntentV2": { + "v1RemoveIpAllowlistIntent": { "type": "object", "properties": { - "email": { + "publicKey": { "type": "string", - "description": "Email of the user starting recovery" - }, - "targetPublicKey": { + "description": "The public component of an API key. If null, removes the organization-level IP allowlist. If set, removes the IP allowlist for this specific API key." + } + } + }, + "v1RemoveIpAllowlistRequest": { + "type": "object", + "properties": { + "type": { "type": "string", - "description": "Client-side public key generated by the user, to which the recovery bundle will be encrypted." + "enum": ["ACTIVITY_TYPE_REMOVE_IP_ALLOWLIST"] }, - "expirationSeconds": { + "timestampMs": { "type": "string", - "description": "Expiration window (in seconds) indicating how long the recovery credential is valid for. If not provided, a default of 15 minutes will be used." - }, - "emailCustomization": { - "$ref": "#/definitions/v1EmailAuthCustomizationParams", - "description": "Parameters for customizing emails. If not provided, the default email will be used. Note that `app_name` is required." + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "sendFromEmailAddress": { + "organizationId": { "type": "string", - "description": "Optional custom email address from which to send the OTP email" + "description": "Unique identifier for a given Organization." }, - "sendFromEmailSenderName": { - "type": "string", - "description": "Optional custom sender name for use with sendFromEmailAddress; if left empty, will default to 'Notifications'" + "parameters": { + "$ref": "#/definitions/v1RemoveIpAllowlistIntent" }, - "replyToEmailAddress": { - "type": "string", - "description": "Optional custom email address to use as reply-to" + "generateAppProofs": { + "type": "boolean" } }, - "required": ["email", "targetPublicKey", "emailCustomization"] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1InitUserEmailRecoveryRequest": { + "v1RemoveIpAllowlistResult": { + "type": "object" + }, + "v1RemoveOrganizationFeatureIntent": { + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/v1FeatureName", + "description": "Name of the feature to remove" + } + }, + "required": ["name"] + }, + "v1RemoveOrganizationFeatureRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY_V2"] + "enum": ["ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE"] }, "timestampMs": { "type": "string", @@ -9985,7 +18258,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1InitUserEmailRecoveryIntentV2" + "$ref": "#/definitions/v1RemoveOrganizationFeatureIntent" }, "generateAppProofs": { "type": "boolean" @@ -9993,1041 +18266,887 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1InitUserEmailRecoveryResult": { + "v1RemoveOrganizationFeatureResult": { "type": "object", "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for the user being recovered." + "features": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1Feature" + }, + "description": "Resulting list of organization features." } }, - "required": ["userId"] + "required": ["features"] }, - "v1Intent": { + "v1RequiredAuthenticationMethod": { "type": "object", "properties": { - "createOrganizationIntent": { - "$ref": "#/definitions/v1CreateOrganizationIntent" - }, - "createAuthenticatorsIntent": { - "$ref": "#/definitions/v1CreateAuthenticatorsIntent" - }, - "createUsersIntent": { - "$ref": "#/definitions/v1CreateUsersIntent" - }, - "createPrivateKeysIntent": { - "$ref": "#/definitions/v1CreatePrivateKeysIntent" - }, - "signRawPayloadIntent": { - "$ref": "#/definitions/v1SignRawPayloadIntent" - }, - "createInvitationsIntent": { - "$ref": "#/definitions/v1CreateInvitationsIntent" - }, - "acceptInvitationIntent": { - "$ref": "#/definitions/v1AcceptInvitationIntent" - }, - "createPolicyIntent": { - "$ref": "#/definitions/v1CreatePolicyIntent" - }, - "disablePrivateKeyIntent": { - "$ref": "#/definitions/v1DisablePrivateKeyIntent" - }, - "deleteUsersIntent": { - "$ref": "#/definitions/v1DeleteUsersIntent" - }, - "deleteAuthenticatorsIntent": { - "$ref": "#/definitions/v1DeleteAuthenticatorsIntent" - }, - "deleteInvitationIntent": { - "$ref": "#/definitions/v1DeleteInvitationIntent" - }, - "deleteOrganizationIntent": { - "$ref": "#/definitions/v1DeleteOrganizationIntent" - }, - "deletePolicyIntent": { - "$ref": "#/definitions/v1DeletePolicyIntent" - }, - "createUserTagIntent": { - "$ref": "#/definitions/v1CreateUserTagIntent" - }, - "deleteUserTagsIntent": { - "$ref": "#/definitions/v1DeleteUserTagsIntent" - }, - "signTransactionIntent": { - "$ref": "#/definitions/v1SignTransactionIntent" - }, - "createApiKeysIntent": { - "$ref": "#/definitions/v1CreateApiKeysIntent" - }, - "deleteApiKeysIntent": { - "$ref": "#/definitions/v1DeleteApiKeysIntent" - }, - "approveActivityIntent": { - "$ref": "#/definitions/v1ApproveActivityIntent" - }, - "rejectActivityIntent": { - "$ref": "#/definitions/v1RejectActivityIntent" - }, - "createPrivateKeyTagIntent": { - "$ref": "#/definitions/v1CreatePrivateKeyTagIntent" - }, - "deletePrivateKeyTagsIntent": { - "$ref": "#/definitions/v1DeletePrivateKeyTagsIntent" - }, - "createPolicyIntentV2": { - "$ref": "#/definitions/v1CreatePolicyIntentV2" - }, - "setPaymentMethodIntent": { - "$ref": "#/definitions/billingSetPaymentMethodIntent" - }, - "activateBillingTierIntent": { - "$ref": "#/definitions/billingActivateBillingTierIntent" - }, - "deletePaymentMethodIntent": { - "$ref": "#/definitions/billingDeletePaymentMethodIntent" - }, - "createPolicyIntentV3": { - "$ref": "#/definitions/v1CreatePolicyIntentV3" - }, - "createApiOnlyUsersIntent": { - "$ref": "#/definitions/v1CreateApiOnlyUsersIntent" - }, - "updateRootQuorumIntent": { - "$ref": "#/definitions/v1UpdateRootQuorumIntent" - }, - "updateUserTagIntent": { - "$ref": "#/definitions/v1UpdateUserTagIntent" + "any": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticationMethod" + }, + "description": "A list of authentication methods for this MFA step. If only one method is provided, it is required. If multiple are provided, the user must satisfy ANY one of them." + } + }, + "required": ["any"] + }, + "v1RequiredAuthenticationMethodParams": { + "type": "object", + "properties": { + "any": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticationMethodParams" + }, + "description": "A list of authentication methods for this MFA step. If only one method is provided, it is required. If multiple are provided, the user must satisfy ANY one of them." + } + }, + "required": ["any"] + }, + "v1RestoreTvcDeploymentIntent": { + "type": "object", + "properties": { + "deploymentId": { + "type": "string", + "description": "The unique identifier of the TVC deployment to restore." + } + }, + "required": ["deploymentId"] + }, + "v1RestoreTvcDeploymentRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_RESTORE_TVC_DEPLOYMENT"] }, - "updatePrivateKeyTagIntent": { - "$ref": "#/definitions/v1UpdatePrivateKeyTagIntent" + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "createAuthenticatorsIntentV2": { - "$ref": "#/definitions/v1CreateAuthenticatorsIntentV2" + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." }, - "acceptInvitationIntentV2": { - "$ref": "#/definitions/v1AcceptInvitationIntentV2" + "parameters": { + "$ref": "#/definitions/v1RestoreTvcDeploymentIntent" }, - "createOrganizationIntentV2": { - "$ref": "#/definitions/v1CreateOrganizationIntentV2" + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1RestoreTvcDeploymentResult": { + "type": "object", + "properties": { + "deploymentId": { + "type": "string", + "description": "The unique identifier of the restored TVC deployment." + } + }, + "required": ["deploymentId"] + }, + "v1Result": { + "type": "object", + "properties": { + "createOrganizationResult": { + "$ref": "#/definitions/v1CreateOrganizationResult" }, - "createUsersIntentV2": { - "$ref": "#/definitions/v1CreateUsersIntentV2" + "createAuthenticatorsResult": { + "$ref": "#/definitions/v1CreateAuthenticatorsResult" }, - "createSubOrganizationIntent": { - "$ref": "#/definitions/v1CreateSubOrganizationIntent" + "createUsersResult": { + "$ref": "#/definitions/v1CreateUsersResult" }, - "createSubOrganizationIntentV2": { - "$ref": "#/definitions/v1CreateSubOrganizationIntentV2" + "createPrivateKeysResult": { + "$ref": "#/definitions/v1CreatePrivateKeysResult" }, - "updateAllowedOriginsIntent": { - "$ref": "#/definitions/v1UpdateAllowedOriginsIntent" + "createInvitationsResult": { + "$ref": "#/definitions/v1CreateInvitationsResult" }, - "createPrivateKeysIntentV2": { - "$ref": "#/definitions/v1CreatePrivateKeysIntentV2" + "acceptInvitationResult": { + "$ref": "#/definitions/v1AcceptInvitationResult" }, - "updateUserIntent": { - "$ref": "#/definitions/v1UpdateUserIntent" + "signRawPayloadResult": { + "$ref": "#/definitions/v1SignRawPayloadResult" }, - "updatePolicyIntent": { - "$ref": "#/definitions/v1UpdatePolicyIntent" + "createPolicyResult": { + "$ref": "#/definitions/v1CreatePolicyResult" }, - "setPaymentMethodIntentV2": { - "$ref": "#/definitions/billingSetPaymentMethodIntentV2" + "disablePrivateKeyResult": { + "$ref": "#/definitions/v1DisablePrivateKeyResult" }, - "createSubOrganizationIntentV3": { - "$ref": "#/definitions/v1CreateSubOrganizationIntentV3" + "deleteUsersResult": { + "$ref": "#/definitions/v1DeleteUsersResult" }, - "createWalletIntent": { - "$ref": "#/definitions/v1CreateWalletIntent" + "deleteAuthenticatorsResult": { + "$ref": "#/definitions/v1DeleteAuthenticatorsResult" }, - "createWalletAccountsIntent": { - "$ref": "#/definitions/v1CreateWalletAccountsIntent" + "deleteInvitationResult": { + "$ref": "#/definitions/v1DeleteInvitationResult" }, - "initUserEmailRecoveryIntent": { - "$ref": "#/definitions/v1InitUserEmailRecoveryIntent" + "deleteOrganizationResult": { + "$ref": "#/definitions/v1DeleteOrganizationResult" }, - "recoverUserIntent": { - "$ref": "#/definitions/v1RecoverUserIntent" + "deletePolicyResult": { + "$ref": "#/definitions/v1DeletePolicyResult" }, - "setOrganizationFeatureIntent": { - "$ref": "#/definitions/v1SetOrganizationFeatureIntent" + "createUserTagResult": { + "$ref": "#/definitions/v1CreateUserTagResult" }, - "removeOrganizationFeatureIntent": { - "$ref": "#/definitions/v1RemoveOrganizationFeatureIntent" + "deleteUserTagsResult": { + "$ref": "#/definitions/v1DeleteUserTagsResult" }, - "signRawPayloadIntentV2": { - "$ref": "#/definitions/v1SignRawPayloadIntentV2" + "signTransactionResult": { + "$ref": "#/definitions/v1SignTransactionResult" }, - "signTransactionIntentV2": { - "$ref": "#/definitions/v1SignTransactionIntentV2" + "deleteApiKeysResult": { + "$ref": "#/definitions/v1DeleteApiKeysResult" }, - "exportPrivateKeyIntent": { - "$ref": "#/definitions/v1ExportPrivateKeyIntent" + "createApiKeysResult": { + "$ref": "#/definitions/v1CreateApiKeysResult" }, - "exportWalletIntent": { - "$ref": "#/definitions/v1ExportWalletIntent" + "createPrivateKeyTagResult": { + "$ref": "#/definitions/v1CreatePrivateKeyTagResult" }, - "createSubOrganizationIntentV4": { - "$ref": "#/definitions/v1CreateSubOrganizationIntentV4" + "deletePrivateKeyTagsResult": { + "$ref": "#/definitions/v1DeletePrivateKeyTagsResult" }, - "emailAuthIntent": { - "$ref": "#/definitions/v1EmailAuthIntent" + "setPaymentMethodResult": { + "$ref": "#/definitions/billingSetPaymentMethodResult" }, - "exportWalletAccountIntent": { - "$ref": "#/definitions/v1ExportWalletAccountIntent" + "activateBillingTierResult": { + "$ref": "#/definitions/billingActivateBillingTierResult" }, - "initImportWalletIntent": { - "$ref": "#/definitions/v1InitImportWalletIntent" + "deletePaymentMethodResult": { + "$ref": "#/definitions/billingDeletePaymentMethodResult" }, - "importWalletIntent": { - "$ref": "#/definitions/v1ImportWalletIntent" + "createApiOnlyUsersResult": { + "$ref": "#/definitions/v1CreateApiOnlyUsersResult" }, - "initImportPrivateKeyIntent": { - "$ref": "#/definitions/v1InitImportPrivateKeyIntent" + "updateRootQuorumResult": { + "$ref": "#/definitions/v1UpdateRootQuorumResult" }, - "importPrivateKeyIntent": { - "$ref": "#/definitions/v1ImportPrivateKeyIntent" + "updateUserTagResult": { + "$ref": "#/definitions/v1UpdateUserTagResult" }, - "createPoliciesIntent": { - "$ref": "#/definitions/v1CreatePoliciesIntent" + "updatePrivateKeyTagResult": { + "$ref": "#/definitions/v1UpdatePrivateKeyTagResult" }, - "signRawPayloadsIntent": { - "$ref": "#/definitions/v1SignRawPayloadsIntent" + "createSubOrganizationResult": { + "$ref": "#/definitions/v1CreateSubOrganizationResult" }, - "createReadOnlySessionIntent": { - "$ref": "#/definitions/v1CreateReadOnlySessionIntent" + "updateAllowedOriginsResult": { + "$ref": "#/definitions/v1UpdateAllowedOriginsResult" }, - "createOauthProvidersIntent": { - "$ref": "#/definitions/v1CreateOauthProvidersIntent" + "createPrivateKeysResultV2": { + "$ref": "#/definitions/v1CreatePrivateKeysResultV2" }, - "deleteOauthProvidersIntent": { - "$ref": "#/definitions/v1DeleteOauthProvidersIntent" + "updateUserResult": { + "$ref": "#/definitions/v1UpdateUserResult" }, - "createSubOrganizationIntentV5": { - "$ref": "#/definitions/v1CreateSubOrganizationIntentV5" + "updatePolicyResult": { + "$ref": "#/definitions/v1UpdatePolicyResult" }, - "oauthIntent": { - "$ref": "#/definitions/v1OauthIntent" + "createSubOrganizationResultV3": { + "$ref": "#/definitions/v1CreateSubOrganizationResultV3" }, - "createApiKeysIntentV2": { - "$ref": "#/definitions/v1CreateApiKeysIntentV2" + "createWalletResult": { + "$ref": "#/definitions/v1CreateWalletResult" }, - "createReadWriteSessionIntent": { - "$ref": "#/definitions/v1CreateReadWriteSessionIntent" + "createWalletAccountsResult": { + "$ref": "#/definitions/v1CreateWalletAccountsResult" }, - "emailAuthIntentV2": { - "$ref": "#/definitions/v1EmailAuthIntentV2" + "initUserEmailRecoveryResult": { + "$ref": "#/definitions/v1InitUserEmailRecoveryResult" }, - "createSubOrganizationIntentV6": { - "$ref": "#/definitions/v1CreateSubOrganizationIntentV6" + "recoverUserResult": { + "$ref": "#/definitions/v1RecoverUserResult" }, - "deletePrivateKeysIntent": { - "$ref": "#/definitions/v1DeletePrivateKeysIntent" + "setOrganizationFeatureResult": { + "$ref": "#/definitions/v1SetOrganizationFeatureResult" }, - "deleteWalletsIntent": { - "$ref": "#/definitions/v1DeleteWalletsIntent" + "removeOrganizationFeatureResult": { + "$ref": "#/definitions/v1RemoveOrganizationFeatureResult" }, - "createReadWriteSessionIntentV2": { - "$ref": "#/definitions/v1CreateReadWriteSessionIntentV2" + "exportPrivateKeyResult": { + "$ref": "#/definitions/v1ExportPrivateKeyResult" }, - "deleteSubOrganizationIntent": { - "$ref": "#/definitions/v1DeleteSubOrganizationIntent" + "exportWalletResult": { + "$ref": "#/definitions/v1ExportWalletResult" }, - "initOtpAuthIntent": { - "$ref": "#/definitions/v1InitOtpAuthIntent" + "createSubOrganizationResultV4": { + "$ref": "#/definitions/v1CreateSubOrganizationResultV4" }, - "otpAuthIntent": { - "$ref": "#/definitions/v1OtpAuthIntent" + "emailAuthResult": { + "$ref": "#/definitions/v1EmailAuthResult" }, - "createSubOrganizationIntentV7": { - "$ref": "#/definitions/v1CreateSubOrganizationIntentV7" + "exportWalletAccountResult": { + "$ref": "#/definitions/v1ExportWalletAccountResult" }, - "updateWalletIntent": { - "$ref": "#/definitions/v1UpdateWalletIntent" + "initImportWalletResult": { + "$ref": "#/definitions/v1InitImportWalletResult" }, - "updatePolicyIntentV2": { - "$ref": "#/definitions/v1UpdatePolicyIntentV2" + "importWalletResult": { + "$ref": "#/definitions/v1ImportWalletResult" }, - "createUsersIntentV3": { - "$ref": "#/definitions/v1CreateUsersIntentV3" + "initImportPrivateKeyResult": { + "$ref": "#/definitions/v1InitImportPrivateKeyResult" }, - "initOtpAuthIntentV2": { - "$ref": "#/definitions/v1InitOtpAuthIntentV2" + "importPrivateKeyResult": { + "$ref": "#/definitions/v1ImportPrivateKeyResult" }, - "initOtpIntent": { - "$ref": "#/definitions/v1InitOtpIntent" + "createPoliciesResult": { + "$ref": "#/definitions/v1CreatePoliciesResult" }, - "verifyOtpIntent": { - "$ref": "#/definitions/v1VerifyOtpIntent" + "signRawPayloadsResult": { + "$ref": "#/definitions/v1SignRawPayloadsResult" }, - "otpLoginIntent": { - "$ref": "#/definitions/v1OtpLoginIntent" + "createReadOnlySessionResult": { + "$ref": "#/definitions/v1CreateReadOnlySessionResult" }, - "stampLoginIntent": { - "$ref": "#/definitions/v1StampLoginIntent" + "createOauthProvidersResult": { + "$ref": "#/definitions/v1CreateOauthProvidersResult" }, - "oauthLoginIntent": { - "$ref": "#/definitions/v1OauthLoginIntent" + "deleteOauthProvidersResult": { + "$ref": "#/definitions/v1DeleteOauthProvidersResult" }, - "updateUserNameIntent": { - "$ref": "#/definitions/v1UpdateUserNameIntent" + "createSubOrganizationResultV5": { + "$ref": "#/definitions/v1CreateSubOrganizationResultV5" }, - "updateUserEmailIntent": { - "$ref": "#/definitions/v1UpdateUserEmailIntent" + "oauthResult": { + "$ref": "#/definitions/v1OauthResult" }, - "updateUserPhoneNumberIntent": { - "$ref": "#/definitions/v1UpdateUserPhoneNumberIntent" + "createReadWriteSessionResult": { + "$ref": "#/definitions/v1CreateReadWriteSessionResult" }, - "initFiatOnRampIntent": { - "$ref": "#/definitions/v1InitFiatOnRampIntent" + "createSubOrganizationResultV6": { + "$ref": "#/definitions/v1CreateSubOrganizationResultV6" }, - "createSmartContractInterfaceIntent": { - "$ref": "#/definitions/v1CreateSmartContractInterfaceIntent" + "deletePrivateKeysResult": { + "$ref": "#/definitions/v1DeletePrivateKeysResult" }, - "deleteSmartContractInterfaceIntent": { - "$ref": "#/definitions/v1DeleteSmartContractInterfaceIntent" + "deleteWalletsResult": { + "$ref": "#/definitions/v1DeleteWalletsResult" }, - "enableAuthProxyIntent": { - "$ref": "#/definitions/v1EnableAuthProxyIntent" + "createReadWriteSessionResultV2": { + "$ref": "#/definitions/v1CreateReadWriteSessionResultV2" }, - "disableAuthProxyIntent": { - "$ref": "#/definitions/v1DisableAuthProxyIntent" + "deleteSubOrganizationResult": { + "$ref": "#/definitions/v1DeleteSubOrganizationResult" }, - "updateAuthProxyConfigIntent": { - "$ref": "#/definitions/v1UpdateAuthProxyConfigIntent" + "initOtpAuthResult": { + "$ref": "#/definitions/v1InitOtpAuthResult" }, - "createOauth2CredentialIntent": { - "$ref": "#/definitions/v1CreateOauth2CredentialIntent" + "otpAuthResult": { + "$ref": "#/definitions/v1OtpAuthResult" }, - "updateOauth2CredentialIntent": { - "$ref": "#/definitions/v1UpdateOauth2CredentialIntent" + "createSubOrganizationResultV7": { + "$ref": "#/definitions/v1CreateSubOrganizationResultV7" }, - "deleteOauth2CredentialIntent": { - "$ref": "#/definitions/v1DeleteOauth2CredentialIntent" + "updateWalletResult": { + "$ref": "#/definitions/v1UpdateWalletResult" }, - "oauth2AuthenticateIntent": { - "$ref": "#/definitions/v1Oauth2AuthenticateIntent" + "updatePolicyResultV2": { + "$ref": "#/definitions/v1UpdatePolicyResultV2" }, - "deleteWalletAccountsIntent": { - "$ref": "#/definitions/v1DeleteWalletAccountsIntent" + "initOtpAuthResultV2": { + "$ref": "#/definitions/v1InitOtpAuthResultV2" }, - "deletePoliciesIntent": { - "$ref": "#/definitions/v1DeletePoliciesIntent" + "initOtpResult": { + "$ref": "#/definitions/v1InitOtpResult" }, - "ethSendRawTransactionIntent": { - "$ref": "#/definitions/v1EthSendRawTransactionIntent" + "verifyOtpResult": { + "$ref": "#/definitions/v1VerifyOtpResult" }, - "ethSendTransactionIntent": { - "$ref": "#/definitions/v1EthSendTransactionIntent" + "otpLoginResult": { + "$ref": "#/definitions/v1OtpLoginResult" }, - "createFiatOnRampCredentialIntent": { - "$ref": "#/definitions/v1CreateFiatOnRampCredentialIntent" + "stampLoginResult": { + "$ref": "#/definitions/v1StampLoginResult" }, - "updateFiatOnRampCredentialIntent": { - "$ref": "#/definitions/v1UpdateFiatOnRampCredentialIntent" + "oauthLoginResult": { + "$ref": "#/definitions/v1OauthLoginResult" }, - "deleteFiatOnRampCredentialIntent": { - "$ref": "#/definitions/v1DeleteFiatOnRampCredentialIntent" + "updateUserNameResult": { + "$ref": "#/definitions/v1UpdateUserNameResult" }, - "emailAuthIntentV3": { - "$ref": "#/definitions/v1EmailAuthIntentV3" + "updateUserEmailResult": { + "$ref": "#/definitions/v1UpdateUserEmailResult" }, - "initUserEmailRecoveryIntentV2": { - "$ref": "#/definitions/v1InitUserEmailRecoveryIntentV2" + "updateUserPhoneNumberResult": { + "$ref": "#/definitions/v1UpdateUserPhoneNumberResult" }, - "initOtpIntentV2": { - "$ref": "#/definitions/v1InitOtpIntentV2" + "initFiatOnRampResult": { + "$ref": "#/definitions/v1InitFiatOnRampResult" }, - "initOtpAuthIntentV3": { - "$ref": "#/definitions/v1InitOtpAuthIntentV3" + "createSmartContractInterfaceResult": { + "$ref": "#/definitions/v1CreateSmartContractInterfaceResult" }, - "upsertGasUsageConfigIntent": { - "$ref": "#/definitions/v1UpsertGasUsageConfigIntent" + "deleteSmartContractInterfaceResult": { + "$ref": "#/definitions/v1DeleteSmartContractInterfaceResult" }, - "createTvcAppIntent": { - "$ref": "#/definitions/v1CreateTvcAppIntent" + "enableAuthProxyResult": { + "$ref": "#/definitions/v1EnableAuthProxyResult" }, - "createTvcDeploymentIntent": { - "$ref": "#/definitions/v1CreateTvcDeploymentIntent" + "disableAuthProxyResult": { + "$ref": "#/definitions/v1DisableAuthProxyResult" }, - "createTvcManifestApprovalsIntent": { - "$ref": "#/definitions/v1CreateTvcManifestApprovalsIntent" + "updateAuthProxyConfigResult": { + "$ref": "#/definitions/v1UpdateAuthProxyConfigResult" }, - "solSendTransactionIntent": { - "$ref": "#/definitions/v1SolSendTransactionIntent" + "createOauth2CredentialResult": { + "$ref": "#/definitions/v1CreateOauth2CredentialResult" }, - "initOtpIntentV3": { - "$ref": "#/definitions/v1InitOtpIntentV3" + "updateOauth2CredentialResult": { + "$ref": "#/definitions/v1UpdateOauth2CredentialResult" }, - "verifyOtpIntentV2": { - "$ref": "#/definitions/v1VerifyOtpIntentV2" + "deleteOauth2CredentialResult": { + "$ref": "#/definitions/v1DeleteOauth2CredentialResult" }, - "otpLoginIntentV2": { - "$ref": "#/definitions/v1OtpLoginIntentV2" + "oauth2AuthenticateResult": { + "$ref": "#/definitions/v1Oauth2AuthenticateResult" }, - "updateOrganizationNameIntent": { - "$ref": "#/definitions/v1UpdateOrganizationNameIntent" - } - } - }, - "v1InvitationParams": { - "type": "object", - "properties": { - "receiverUserName": { - "type": "string", - "description": "The name of the intended Invitation recipient." + "deleteWalletAccountsResult": { + "$ref": "#/definitions/v1DeleteWalletAccountsResult" }, - "receiverUserEmail": { - "type": "string", - "description": "The email address of the intended Invitation recipient." + "deletePoliciesResult": { + "$ref": "#/definitions/v1DeletePoliciesResult" }, - "receiverUserTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body." + "ethSendRawTransactionResult": { + "$ref": "#/definitions/v1EthSendRawTransactionResult" }, - "accessType": { - "$ref": "#/definitions/v1AccessType", - "description": "The User's permissible access method(s)." + "createFiatOnRampCredentialResult": { + "$ref": "#/definitions/v1CreateFiatOnRampCredentialResult" }, - "senderUserId": { - "type": "string", - "description": "Unique identifier for the Sender of an Invitation." - } - }, - "required": [ - "receiverUserName", - "receiverUserEmail", - "receiverUserTags", - "accessType", - "senderUserId" - ] - }, - "v1ListFiatOnRampCredentialsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "v1ListFiatOnRampCredentialsResponse": { - "type": "object", - "properties": { - "fiatOnRampCredentials": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1FiatOnRampCredential" - } - } - }, - "required": ["fiatOnRampCredentials"] - }, - "v1ListOauth2CredentialsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "v1ListOauth2CredentialsResponse": { - "type": "object", - "properties": { - "oauth2Credentials": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1Oauth2Credential" - } - } - }, - "required": ["oauth2Credentials"] - }, - "v1ListPrivateKeyTagsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." - } - }, - "required": ["organizationId"] - }, - "v1ListPrivateKeyTagsResponse": { - "type": "object", - "properties": { - "privateKeyTags": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/datav1Tag" - }, - "description": "A list of private key tags." - } - }, - "required": ["privateKeyTags"] - }, - "v1ListSupportedAssetsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." + "updateFiatOnRampCredentialResult": { + "$ref": "#/definitions/v1UpdateFiatOnRampCredentialResult" }, - "caip2": { - "type": "string", - "enum": [ - "eip155:1", - "eip155:11155111", - "eip155:8453", - "eip155:84532", - "eip155:137", - "eip155:80002", - "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" - ], - "description": "CAIP-2 chain ID (e.g., 'eip155:1' for Ethereum mainnet or 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." - } - }, - "required": ["organizationId", "caip2"] - }, - "v1ListSupportedAssetsResponse": { - "type": "object", - "properties": { - "assets": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1AssetMetadata" - }, - "description": "List of asset metadata" - } - } - }, - "v1ListUserTagsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given organization." - } - }, - "required": ["organizationId"] - }, - "v1ListUserTagsResponse": { - "type": "object", - "properties": { - "userTags": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/datav1Tag" - }, - "description": "A list of user tags." - } - }, - "required": ["userTags"] - }, - "v1LoginUsage": { - "type": "object", - "properties": { - "publicKey": { - "type": "string", - "description": "Public key for authentication" - } - }, - "required": ["publicKey"] - }, - "v1MnemonicLanguage": { - "type": "string", - "enum": [ - "MNEMONIC_LANGUAGE_ENGLISH", - "MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE", - "MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE", - "MNEMONIC_LANGUAGE_CZECH", - "MNEMONIC_LANGUAGE_FRENCH", - "MNEMONIC_LANGUAGE_ITALIAN", - "MNEMONIC_LANGUAGE_JAPANESE", - "MNEMONIC_LANGUAGE_KOREAN", - "MNEMONIC_LANGUAGE_SPANISH" - ] - }, - "v1NOOPCodegenAnchorResponse": { - "type": "object", - "properties": { - "stamp": { - "$ref": "#/definitions/v1WebAuthnStamp" + "deleteFiatOnRampCredentialResult": { + "$ref": "#/definitions/v1DeleteFiatOnRampCredentialResult" }, - "tokenUsage": { - "$ref": "#/definitions/v1TokenUsage" - } - }, - "required": ["stamp"] - }, - "v1NativeRevertError": { - "type": "object", - "properties": { - "nativeType": { - "type": "string", - "description": "The type of native error: 'error_string', 'panic', or 'execution_reverted'." + "ethSendTransactionResult": { + "$ref": "#/definitions/v1EthSendTransactionResult" }, - "message": { - "type": "string", - "description": "The error message for Error(string) reverts." + "upsertGasUsageConfigResult": { + "$ref": "#/definitions/v1UpsertGasUsageConfigResult" }, - "panicCode": { - "type": "string", - "format": "uint64", - "description": "The panic code for Panic(uint256) reverts." - } - } - }, - "v1Oauth2AuthenticateIntent": { - "type": "object", - "properties": { - "oauth2CredentialId": { - "type": "string", - "description": "The OAuth 2.0 credential id whose client_id and client_secret will be used in the OAuth 2.0 flow" + "createTvcAppResult": { + "$ref": "#/definitions/v1CreateTvcAppResult" }, - "authCode": { - "type": "string", - "description": "The auth_code provided by the OAuth 2.0 provider to the end user to be exchanged for a Bearer token in the OAuth 2.0 flow" + "createTvcDeploymentResult": { + "$ref": "#/definitions/v1CreateTvcDeploymentResult" }, - "redirectUri": { - "type": "string", - "description": "The URI the user is redirected to after they have authenticated with the OAuth 2.0 provider" + "createTvcManifestApprovalsResult": { + "$ref": "#/definitions/v1CreateTvcManifestApprovalsResult" }, - "codeVerifier": { - "type": "string", - "description": "The code verifier used by OAuth 2.0 PKCE providers" + "solSendTransactionResult": { + "$ref": "#/definitions/v1SolSendTransactionResult" }, - "nonce": { - "type": "string", - "description": "An optional nonce used by the client to prevent replay/substitution of an ID token" + "initOtpResultV2": { + "$ref": "#/definitions/v1InitOtpResultV2" }, - "bearerTokenTargetPublicKey": { - "type": "string", - "description": "An optional P256 public key to which, if provided, the bearer token will be encrypted and returned via the `encrypted_bearer_token` claim of the OIDC Token" - } - }, - "required": [ - "oauth2CredentialId", - "authCode", - "redirectUri", - "codeVerifier" - ] - }, - "v1Oauth2AuthenticateRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_OAUTH2_AUTHENTICATE"] + "updateOrganizationNameResult": { + "$ref": "#/definitions/v1UpdateOrganizationNameResult" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "createSubOrganizationResultV8": { + "$ref": "#/definitions/v1CreateSubOrganizationResultV8" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "createOauthProvidersResultV2": { + "$ref": "#/definitions/v1CreateOauthProvidersResultV2" }, - "parameters": { - "$ref": "#/definitions/v1Oauth2AuthenticateIntent" + "createWebhookEndpointResult": { + "$ref": "#/definitions/v1CreateWebhookEndpointResult" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1Oauth2AuthenticateResult": { - "type": "object", - "properties": { - "oidcToken": { - "type": "string", - "description": "Base64 encoded OIDC token issued by Turnkey to be used with the LoginWithOAuth activity" - } - }, - "required": ["oidcToken"] - }, - "v1Oauth2Credential": { - "type": "object", - "properties": { - "oauth2CredentialId": { - "type": "string", - "description": "Unique identifier for a given OAuth 2.0 Credential." + "updateWebhookEndpointResult": { + "$ref": "#/definitions/v1UpdateWebhookEndpointResult" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for an Organization." + "deleteWebhookEndpointResult": { + "$ref": "#/definitions/v1DeleteWebhookEndpointResult" }, - "provider": { - "$ref": "#/definitions/v1Oauth2Provider", - "description": "The provider for a given OAuth 2.0 Credential." + "setIpAllowlistResult": { + "$ref": "#/definitions/v1SetIpAllowlistResult" }, - "clientId": { - "type": "string", - "description": "The client id for a given OAuth 2.0 Credential." + "removeIpAllowlistResult": { + "$ref": "#/definitions/v1RemoveIpAllowlistResult" }, - "encryptedClientSecret": { - "type": "string", - "description": "The encrypted client secret for a given OAuth 2.0 Credential encrypted to the TLS Fetcher quorum key." + "updateTvcAppLiveDeploymentResult": { + "$ref": "#/definitions/v1UpdateTvcAppLiveDeploymentResult" }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "deleteTvcDeploymentResult": { + "$ref": "#/definitions/v1DeleteTvcDeploymentResult" }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" - } - }, - "required": [ - "oauth2CredentialId", - "organizationId", - "provider", - "clientId", - "encryptedClientSecret", - "createdAt", - "updatedAt" - ] - }, - "v1Oauth2Provider": { - "type": "string", - "enum": ["OAUTH2_PROVIDER_X", "OAUTH2_PROVIDER_DISCORD"] - }, - "v1OauthIntent": { - "type": "object", - "properties": { - "oidcToken": { - "type": "string", - "description": "Base64 encoded OIDC token" + "deleteTvcAppAndDeploymentsResult": { + "$ref": "#/definitions/v1DeleteTvcAppAndDeploymentsResult" + }, + "restoreTvcDeploymentResult": { + "$ref": "#/definitions/v1RestoreTvcDeploymentResult" + }, + "sparkSignFrostResult": { + "$ref": "#/definitions/v1SparkSignFrostResult" + }, + "sparkPrepareTransferResult": { + "$ref": "#/definitions/v1SparkPrepareTransferResult" + }, + "sparkClaimTransferResult": { + "$ref": "#/definitions/v1SparkClaimTransferResult" + }, + "sparkPrepareLightningReceiveResult": { + "$ref": "#/definitions/v1SparkPrepareLightningReceiveResult" + }, + "postTvcQuorumKeyShareResult": { + "$ref": "#/definitions/v1PostTvcQuorumKeyShareResult" + }, + "ethSendTransactionResultV2": { + "$ref": "#/definitions/v1EthSendTransactionResultV2" + }, + "createMfaPolicyResult": { + "$ref": "#/definitions/v1CreateMfaPolicyResult" + }, + "updateMfaPolicyResult": { + "$ref": "#/definitions/v1UpdateMfaPolicyResult" + }, + "deleteMfaPolicyResult": { + "$ref": "#/definitions/v1DeleteMfaPolicyResult" + }, + "createSessionProfileResult": { + "$ref": "#/definitions/v1CreateSessionProfileResult" + }, + "earnDeployWrapperResult": { + "$ref": "#/definitions/v1EarnDeployWrapperResult" + }, + "earnDepositResult": { + "$ref": "#/definitions/v1EarnDepositResult" + }, + "earnWithdrawResult": { + "$ref": "#/definitions/v1EarnWithdrawResult" + }, + "executeSwapResult": { + "$ref": "#/definitions/v1ExecuteSwapResult" + }, + "upsertSwapConfigResult": { + "$ref": "#/definitions/v1UpsertSwapConfigResult" + }, + "createTvcOperatorResult": { + "$ref": "#/definitions/v1CreateTvcOperatorResult" + }, + "createTvcQuorumKeyResult": { + "$ref": "#/definitions/v1CreateTvcQuorumKeyResult" + }, + "reEncryptTvcQuorumKeyShareResult": { + "$ref": "#/definitions/v1ReEncryptTvcQuorumKeyShareResult" + }, + "initImportSecretsResult": { + "$ref": "#/definitions/v1InitImportSecretsResult" + }, + "solSendTransactionResultV2": { + "$ref": "#/definitions/v1SolSendTransactionResultV2" + }, + "claimSwapFeesResult": { + "$ref": "#/definitions/v1ClaimSwapFeesResult" + }, + "earnSetWrapperStateResult": { + "$ref": "#/definitions/v1EarnSetWrapperStateResult" + }, + "claimEarnFeesResult": { + "$ref": "#/definitions/v1ClaimEarnFeesResult" + }, + "updateWalletAccountNameResult": { + "$ref": "#/definitions/v1UpdateWalletAccountNameResult" + }, + "ethUndelegate7702Result": { + "$ref": "#/definitions/v1EthUndelegate7702Result" + }, + "createSwapQuoteResult": { + "$ref": "#/definitions/v1CreateSwapQuoteResult" + }, + "importSecretsResult": { + "$ref": "#/definitions/v1ImportSecretsResult" + }, + "exportSecretsResult": { + "$ref": "#/definitions/v1ExportSecretsResult" }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted." + "createVelocityControlResult": { + "$ref": "#/definitions/v1CreateVelocityControlResult" }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Oauth - \u003cTimestamp\u003e" + "deleteVelocityControlsResult": { + "$ref": "#/definitions/v1DeleteVelocityControlsResult" }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + "updatePaymentMethodResult": { + "$ref": "#/definitions/billingUpdatePaymentMethodResult" }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Oauth API keys" - } - }, - "required": ["oidcToken", "targetPublicKey"] - }, - "v1OauthLoginIntent": { - "type": "object", - "properties": { - "oidcToken": { - "type": "string", - "description": "Base64 encoded OIDC token" + "deleteSecretsResult": { + "$ref": "#/definitions/v1DeleteSecretsResult" }, - "publicKey": { - "type": "string", - "description": "Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the oidc token associated with this request" + "earnClaimRewardsResult": { + "$ref": "#/definitions/v1EarnClaimRewardsResult" }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used." + "createSwapQuoteResultV2": { + "$ref": "#/definitions/v1CreateSwapQuoteResultV2" }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Login API keys" + "upsertSwapFeeSponsorshipLimitConfigResult": { + "$ref": "#/definitions/v1UpsertSwapFeeSponsorshipLimitConfigResult" + }, + "upsertSwapFixedRateLimitConfigResult": { + "$ref": "#/definitions/v1UpsertSwapFixedRateLimitConfigResult" + }, + "createFiatOnRampSessionResult": { + "$ref": "#/definitions/v1CreateFiatOnRampSessionResult" } - }, - "required": ["oidcToken", "publicKey"] + } }, - "v1OauthLoginRequest": { + "v1RevertChainEntry": { "type": "object", "properties": { - "type": { + "address": { "type": "string", - "enum": ["ACTIVITY_TYPE_OAUTH_LOGIN"] + "description": "The contract address where the revert occurred." }, - "timestampMs": { + "errorType": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Type of error: 'unknown', 'native', or 'custom'." }, - "organizationId": { + "displayMessage": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Human-readable message describing this revert." }, - "parameters": { - "$ref": "#/definitions/v1OauthLoginIntent" + "unknown": { + "$ref": "#/definitions/v1UnknownRevertError", + "description": "Details for unknown error types." }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1OauthLoginResult": { - "type": "object", - "properties": { - "session": { - "type": "string", - "description": "Signed JWT containing an expiry, public key, session type, user id, and organization id" + "native": { + "$ref": "#/definitions/v1NativeRevertError", + "description": "Details for native Solidity errors (Error, Panic, execution reverted)." + }, + "custom": { + "$ref": "#/definitions/v1CustomRevertError", + "description": "Details for custom contract errors." } - }, - "required": ["session"] + } }, - "v1OauthProvider": { + "v1RootUserParams": { "type": "object", "properties": { - "providerId": { - "type": "string", - "description": "Unique identifier for an OAuth Provider" - }, - "providerName": { - "type": "string", - "description": "Human-readable name to identify a Provider." - }, - "issuer": { - "type": "string", - "description": "The issuer of the token, typically a URL indicating the authentication server, e.g https://accounts.google.com" - }, - "audience": { + "userName": { "type": "string", - "description": "Expected audience ('aud' attribute of the signed token) which represents the app ID" + "description": "Human-readable name for a User." }, - "subject": { + "userEmail": { "type": "string", - "description": "Expected subject ('sub' attribute of the signed token) which represents the user ID" + "description": "The user's email address." }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiApiKeyParams" + }, + "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + }, + "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." } }, - "required": [ - "providerId", - "providerName", - "issuer", - "audience", - "subject", - "createdAt", - "updatedAt" - ] + "required": ["userName", "apiKeys", "authenticators"] }, - "v1OauthProviderParams": { + "v1RootUserParamsV2": { "type": "object", "properties": { - "providerName": { + "userName": { "type": "string", - "description": "Human-readable name to identify a Provider." + "description": "Human-readable name for a User." }, - "oidcToken": { + "userEmail": { "type": "string", - "description": "Base64 encoded OIDC token" + "description": "The user's email address." + }, + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiApiKeyParams" + }, + "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + }, + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + }, + "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + }, + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProviderParams" + }, + "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." } }, - "required": ["providerName", "oidcToken"] + "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] }, - "v1OauthRequest": { + "v1RootUserParamsV3": { "type": "object", "properties": { - "type": { + "userName": { "type": "string", - "enum": ["ACTIVITY_TYPE_OAUTH"] + "description": "Human-readable name for a User." }, - "timestampMs": { + "userEmail": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "The user's email address." }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ApiKeyParamsV2" + }, + "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." }, - "parameters": { - "$ref": "#/definitions/v1OauthIntent" + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + }, + "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." }, - "generateAppProofs": { - "type": "boolean" + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProviderParams" + }, + "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] }, - "v1OauthResult": { + "v1RootUserParamsV4": { "type": "object", "properties": { - "userId": { + "userName": { "type": "string", - "description": "Unique identifier for the authenticating User." + "description": "Human-readable name for a User." }, - "apiKeyId": { + "userEmail": { "type": "string", - "description": "Unique identifier for the created API key." + "description": "The user's email address." }, - "credentialBundle": { + "userPhoneNumber": { "type": "string", - "description": "HPKE encrypted credential bundle" - } - }, - "required": ["userId", "apiKeyId", "credentialBundle"] - }, - "v1Operator": { - "type": "string", - "enum": [ - "OPERATOR_EQUAL", - "OPERATOR_MORE_THAN", - "OPERATOR_MORE_THAN_OR_EQUAL", - "OPERATOR_LESS_THAN", - "OPERATOR_LESS_THAN_OR_EQUAL", - "OPERATOR_CONTAINS", - "OPERATOR_NOT_EQUAL", - "OPERATOR_IN", - "OPERATOR_NOT_IN", - "OPERATOR_CONTAINS_ONE", - "OPERATOR_CONTAINS_ALL" - ] + "description": "The user's phone number in E.164 format e.g. +13214567890" + }, + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ApiKeyParamsV2" + }, + "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + }, + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + }, + "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + }, + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProviderParams" + }, + "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + } + }, + "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] }, - "v1OtpAuthIntent": { + "v1RootUserParamsV5": { "type": "object", "properties": { - "otpId": { + "userName": { "type": "string", - "description": "ID representing the result of an init OTP activity." + "description": "Human-readable name for a User." }, - "otpCode": { + "userEmail": { "type": "string", - "description": "OTP sent out to a user's contact (email or SMS)" + "description": "The user's email address." }, - "targetPublicKey": { + "userPhoneNumber": { "type": "string", - "description": "Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted." + "description": "The user's phone number in E.164 format e.g. +13214567890" }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to OTP Auth - \u003cTimestamp\u003e" + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ApiKeyParamsV2" + }, + "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid for. If not provided, a default of 15 minutes will be used." + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + }, + "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated OTP Auth API keys" + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProviderParamsV2" + }, + "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." } }, - "required": ["otpId", "otpCode", "targetPublicKey"] + "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] }, - "v1OtpAuthRequest": { + "v1SecretMetadata": { "type": "object", "properties": { - "type": { + "secretId": { "type": "string", - "enum": ["ACTIVITY_TYPE_OTP_AUTH"] + "description": "Unique identifier for the secret." }, - "timestampMs": { + "name": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Optional human-readable name for the secret." }, - "organizationId": { + "staticProperties": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1KeyValue" + }, + "description": "Policy visible static properties bound to the secret at creation time." + }, + "createdAtUnixMs": { "type": "string", - "description": "Unique identifier for a given Organization." + "format": "uint64", + "description": "Unix timestamp in milliseconds for when the secret was created." + } + }, + "required": ["secretId", "staticProperties", "createdAtUnixMs"] + }, + "v1Selector": { + "type": "object", + "properties": { + "subject": { + "type": "string" }, - "parameters": { - "$ref": "#/definitions/v1OtpAuthIntent" + "operator": { + "$ref": "#/definitions/v1Operator" }, - "generateAppProofs": { - "type": "boolean" + "target": { + "type": "string" } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + } }, - "v1OtpAuthResult": { + "v1SelectorV2": { "type": "object", "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for the authenticating User." + "subject": { + "type": "string" }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." + "operator": { + "$ref": "#/definitions/v1Operator" }, - "credentialBundle": { - "type": "string", - "description": "HPKE encrypted credential bundle" + "targets": { + "type": "array", + "items": { + "type": "string" + } } - }, - "required": ["userId"] + } }, - "v1OtpLoginIntent": { + "v1SessionProfile": { "type": "object", "properties": { - "verificationToken": { + "sessionProfileId": { "type": "string", - "description": "Signed JWT containing a unique id, expiry, verification type, contact" + "description": "Unique identifier for a given Session Profile." }, - "publicKey": { + "sessionProfileName": { "type": "string", - "description": "Client-side public key generated by the user, which will be conditionally added to org data based on the validity of the verification token" + "description": "Human-readable name for a Session Profile." + }, + "scope": { + "type": "string", + "description": "The specific scope that a session created with this profile is limited to." }, "expirationSeconds": { "type": "string", - "description": "Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used." + "description": "Optional window (in seconds) indicating how long sessions created with this profile should last." }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Login API keys" + "notes": { + "type": "string", + "description": "Optional human-readable notes added by a User to describe a particular Session Profile." }, - "clientSignature": { - "$ref": "#/definitions/v1ClientSignature", - "description": "Optional signature proving authorization for this login. The signature is over the verification token ID and the public key. Only required if a public key was provided during the verification step." + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" } }, - "required": ["verificationToken", "publicKey"] + "required": [ + "sessionProfileId", + "sessionProfileName", + "scope", + "createdAt", + "updatedAt" + ] }, - "v1OtpLoginIntentV2": { + "v1SetIpAllowlistIntent": { "type": "object", "properties": { - "verificationToken": { - "type": "string", - "description": "Signed Verification Token containing a unique id, expiry, verification type, contact" - }, "publicKey": { "type": "string", - "description": "Client-side public key generated by the user, used as the session public key upon successful login" + "description": "The public component of an API key. If null, the IP allowlist applies at the organization level. If set, it applies only to this specific API key." }, - "clientSignature": { - "$ref": "#/definitions/v1ClientSignature", - "description": "Required signature proving authorization for this login. The signature is over the verification token ID and the public key. Required for secure OTP login process." + "enabled": { + "type": "boolean", + "description": "Whether the IP allowlist is enabled. Only meaningful for organization-level allowlists. Omit for API key-level allowlists." }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used." + "rules": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1IpAllowlistIntentRule" + }, + "description": "List of IP allowlist rules with CIDR blocks and optional labels." }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Login sessions" + "onEvaluationError": { + "type": "string", + "description": "Behavior when an error occurs during IP allowlist evaluation. Valid values: ALLOW, DENY. Defaults to DENY." } - }, - "required": ["verificationToken", "publicKey", "clientSignature"] + } }, - "v1OtpLoginRequest": { + "v1SetIpAllowlistRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_OTP_LOGIN_V2"] + "enum": ["ACTIVITY_TYPE_SET_IP_ALLOWLIST"] }, "timestampMs": { "type": "string", @@ -11038,7 +19157,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1OtpLoginIntentV2" + "$ref": "#/definitions/v1SetIpAllowlistIntent" }, "generateAppProofs": { "type": "boolean" @@ -11046,259 +19165,186 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1OtpLoginResult": { - "type": "object", - "properties": { - "session": { - "type": "string", - "description": "Signed JWT containing an expiry, public key, session type, user id, and organization id" - } - }, - "required": ["session"] - }, - "v1Outcome": { - "type": "string", - "enum": [ - "OUTCOME_ALLOW", - "OUTCOME_DENY_EXPLICIT", - "OUTCOME_DENY_IMPLICIT", - "OUTCOME_REQUIRES_CONSENSUS", - "OUTCOME_REJECTED", - "OUTCOME_ERROR" - ] - }, - "v1Pagination": { - "type": "object", - "properties": { - "limit": { - "type": "string", - "description": "A limit of the number of object to be returned, between 1 and 100. Defaults to 10." - }, - "before": { - "type": "string", - "description": "A pagination cursor. This is an object ID that enables you to fetch all objects before this ID." - }, - "after": { - "type": "string", - "description": "A pagination cursor. This is an object ID that enables you to fetch all objects after this ID." - } - } - }, - "v1PathFormat": { - "type": "string", - "enum": ["PATH_FORMAT_BIP32"] - }, - "v1PayloadEncoding": { - "type": "string", - "enum": [ - "PAYLOAD_ENCODING_HEXADECIMAL", - "PAYLOAD_ENCODING_TEXT_UTF8", - "PAYLOAD_ENCODING_EIP712", - "PAYLOAD_ENCODING_EIP7702_AUTHORIZATION" - ] + "v1SetIpAllowlistResult": { + "type": "object" }, - "v1Policy": { + "v1SetOrganizationFeatureIntent": { "type": "object", "properties": { - "policyId": { - "type": "string", - "description": "Unique identifier for a given Policy." - }, - "policyName": { - "type": "string", - "description": "Human-readable name for a Policy." - }, - "effect": { - "$ref": "#/definitions/v1Effect", - "description": "The instruction to DENY or ALLOW a particular activity following policy selector(s)." - }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" - }, - "notes": { - "type": "string", - "description": "Human-readable notes added by a User to describe a particular policy." - }, - "consensus": { - "type": "string", - "description": "A consensus expression that evalutes to true or false." + "name": { + "$ref": "#/definitions/v1FeatureName", + "description": "Name of the feature to set" }, - "condition": { - "type": "string", - "description": "A condition expression that evalutes to true or false." - } - }, - "required": [ - "policyId", - "policyName", - "effect", - "createdAt", - "updatedAt", - "notes", - "consensus", - "condition" - ] + "value": { + "type": "string", + "description": "Optional value for the feature. Will override existing values if feature is already set." + } + }, + "required": ["name", "value"] }, - "v1PrivateKey": { + "v1SetOrganizationFeatureRequest": { "type": "object", "properties": { - "privateKeyId": { + "type": { "type": "string", - "description": "Unique identifier for a given Private Key." + "enum": ["ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE"] }, - "publicKey": { + "timestampMs": { "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "privateKeyName": { + "organizationId": { "type": "string", - "description": "Human-readable name for a Private Key." + "description": "Unique identifier for a given Organization." }, - "curve": { - "$ref": "#/definitions/v1Curve", - "description": "Cryptographic Curve used to generate a given Private Key." + "parameters": { + "$ref": "#/definitions/v1SetOrganizationFeatureIntent" }, - "addresses": { + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1SetOrganizationFeatureResult": { + "type": "object", + "properties": { + "features": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/externaldatav1Address" - }, - "description": "Derived cryptocurrency addresses for a given Private Key." - }, - "privateKeyTags": { - "type": "array", - "items": { - "type": "string" + "$ref": "#/definitions/v1Feature" }, - "description": "A list of Private Key Tag IDs." - }, - "createdAt": { - "$ref": "#/definitions/externaldatav1Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/externaldatav1Timestamp" - }, - "exported": { - "type": "boolean", - "description": "True when a given Private Key is exported, false otherwise." - }, - "imported": { - "type": "boolean", - "description": "True when a given Private Key is imported, false otherwise." + "description": "Resulting list of organization features." } }, - "required": [ - "privateKeyId", - "publicKey", - "privateKeyName", - "curve", - "addresses", - "privateKeyTags", - "createdAt", - "updatedAt", - "exported", - "imported" - ] + "required": ["features"] }, - "v1PrivateKeyParams": { + "v1SignRawPayloadIntent": { "type": "object", "properties": { - "privateKeyName": { + "privateKeyId": { "type": "string", - "description": "Human-readable name for a Private Key." + "description": "Unique identifier for a given Private Key." }, - "curve": { - "$ref": "#/definitions/v1Curve", - "description": "Cryptographic Curve used to generate a given Private Key." + "payload": { + "type": "string", + "description": "Raw unsigned payload to be signed." }, - "privateKeyTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body." + "encoding": { + "$ref": "#/definitions/v1PayloadEncoding", + "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." }, - "addressFormats": { - "type": "array", - "items": { - "$ref": "#/definitions/v1AddressFormat" - }, - "description": "Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." + "hashFunction": { + "$ref": "#/definitions/v1HashFunction", + "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." } }, - "required": [ - "privateKeyName", - "curve", - "privateKeyTags", - "addressFormats" - ] + "required": ["privateKeyId", "payload", "encoding", "hashFunction"] }, - "v1PrivateKeyResult": { + "v1SignRawPayloadIntentV2": { "type": "object", "properties": { - "privateKeyId": { - "type": "string" + "signWith": { + "type": "string", + "description": "A Wallet account address, Private Key address, or Private Key identifier." }, - "addresses": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/immutableactivityv1Address" - } + "payload": { + "type": "string", + "description": "Raw unsigned payload to be signed." + }, + "encoding": { + "$ref": "#/definitions/v1PayloadEncoding", + "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." + }, + "hashFunction": { + "$ref": "#/definitions/v1HashFunction", + "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + }, + "externalSignerPubkey": { + "type": "string", + "description": "The public key of the external signer to use for signing the payload." } - } + }, + "required": ["signWith", "payload", "encoding", "hashFunction"] }, - "v1PublicKeyCredentialWithAttestation": { + "v1SignRawPayloadRequest": { "type": "object", "properties": { - "id": { - "type": "string" - }, "type": { "type": "string", - "enum": ["public-key"] + "enum": ["ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2"] }, - "rawId": { - "type": "string" + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "authenticatorAttachment": { + "organizationId": { "type": "string", - "enum": ["cross-platform", "platform"], - "x-nullable": true + "description": "Unique identifier for a given Organization." }, - "response": { - "$ref": "#/definitions/v1AuthenticatorAttestationResponse" + "parameters": { + "$ref": "#/definitions/v1SignRawPayloadIntentV2" }, - "clientExtensionResults": { - "$ref": "#/definitions/v1SimpleClientExtensionResults" + "generateAppProofs": { + "type": "boolean" } }, - "required": ["id", "type", "rawId", "response", "clientExtensionResults"] + "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1RecoverUserIntent": { + "v1SignRawPayloadResult": { "type": "object", "properties": { - "authenticator": { - "$ref": "#/definitions/v1AuthenticatorParamsV2", - "description": "The new authenticator to register." + "r": { + "type": "string", + "description": "Component of a cryptographic signature, meaning varies based on signing scheme." }, - "userId": { + "s": { "type": "string", - "description": "Unique identifier for the user performing recovery." + "description": "Component of a cryptographic signature, meaning varies based on signing scheme." + }, + "v": { + "type": "string", + "description": "Recovery ID for ECDSA signatures, \"00\" otherwise." } }, - "required": ["authenticator", "userId"] + "required": ["r", "s", "v"] }, - "v1RecoverUserRequest": { + "v1SignRawPayloadsIntent": { + "type": "object", + "properties": { + "signWith": { + "type": "string", + "description": "A Wallet account address, Private Key address, or Private Key identifier." + }, + "payloads": { + "type": "array", + "items": { + "type": "string" + }, + "description": "An array of raw unsigned payloads to be signed." + }, + "encoding": { + "$ref": "#/definitions/v1PayloadEncoding", + "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." + }, + "hashFunction": { + "$ref": "#/definitions/v1HashFunction", + "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + }, + "externalSignerPubkey": { + "type": "string", + "description": "The public key of the external signer to use for signing the payloads." + } + }, + "required": ["signWith", "payloads", "encoding", "hashFunction"] + }, + "v1SignRawPayloadsRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_RECOVER_USER"] + "enum": ["ACTIVITY_TYPE_SIGN_RAW_PAYLOADS"] }, "timestampMs": { "type": "string", @@ -11309,7 +19355,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1RecoverUserIntent" + "$ref": "#/definitions/v1SignRawPayloadsIntent" }, "generateAppProofs": { "type": "boolean" @@ -11317,35 +19363,62 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1RecoverUserResult": { + "v1SignRawPayloadsResult": { "type": "object", "properties": { - "authenticatorId": { + "signatures": { "type": "array", "items": { - "type": "string" - }, - "description": "ID of the authenticator created." + "type": "object", + "$ref": "#/definitions/v1SignRawPayloadResult" + } + } + } + }, + "v1SignTransactionIntent": { + "type": "object", + "properties": { + "privateKeyId": { + "type": "string", + "description": "Unique identifier for a given Private Key." + }, + "unsignedTransaction": { + "type": "string", + "description": "Raw unsigned transaction to be signed by a particular Private Key." + }, + "type": { + "$ref": "#/definitions/v1TransactionType" } }, - "required": ["authenticatorId"] + "required": ["privateKeyId", "unsignedTransaction", "type"] }, - "v1RejectActivityIntent": { + "v1SignTransactionIntentV2": { "type": "object", "properties": { - "fingerprint": { + "signWith": { + "type": "string", + "description": "A Wallet account address, Private Key address, or Private Key identifier." + }, + "unsignedTransaction": { + "type": "string", + "description": "Raw unsigned transaction to be signed" + }, + "type": { + "$ref": "#/definitions/v1TransactionType" + }, + "externalSignerPubkey": { "type": "string", - "description": "An artifact verifying a User's action." + "description": "The public key of the external signer to use for signing this transaction." } }, - "required": ["fingerprint"] + "required": ["signWith", "unsignedTransaction", "type"] }, - "v1RejectActivityRequest": { + "v1SignTransactionRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_REJECT_ACTIVITY"] + "enum": ["ACTIVITY_TYPE_SIGN_TRANSACTION_V2"] }, "timestampMs": { "type": "string", @@ -11356,7 +19429,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1RejectActivityIntent" + "$ref": "#/definitions/v1SignTransactionIntentV2" }, "generateAppProofs": { "type": "boolean" @@ -11364,587 +19437,931 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1RemoveOrganizationFeatureIntent": { + "v1SignTransactionResult": { "type": "object", "properties": { - "name": { - "$ref": "#/definitions/v1FeatureName", - "description": "Name of the feature to remove" + "signedTransaction": { + "type": "string" } }, - "required": ["name"] + "required": ["signedTransaction"] }, - "v1RemoveOrganizationFeatureRequest": { + "v1SignupUsage": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE"] + "email": { + "type": "string" }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "phoneNumber": { + "type": "string" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ApiKeyParamsV2" + } }, - "parameters": { - "$ref": "#/definitions/v1RemoveOrganizationFeatureIntent" + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + } }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1RemoveOrganizationFeatureResult": { - "type": "object", - "properties": { - "features": { + "oauthProviders": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1Feature" - }, - "description": "Resulting list of organization features." + "$ref": "#/definitions/v1OauthProviderParams" + } } - }, - "required": ["features"] + } }, - "v1Result": { + "v1SignupUsageV2": { "type": "object", "properties": { - "createOrganizationResult": { - "$ref": "#/definitions/v1CreateOrganizationResult" - }, - "createAuthenticatorsResult": { - "$ref": "#/definitions/v1CreateAuthenticatorsResult" - }, - "createUsersResult": { - "$ref": "#/definitions/v1CreateUsersResult" - }, - "createPrivateKeysResult": { - "$ref": "#/definitions/v1CreatePrivateKeysResult" - }, - "createInvitationsResult": { - "$ref": "#/definitions/v1CreateInvitationsResult" - }, - "acceptInvitationResult": { - "$ref": "#/definitions/v1AcceptInvitationResult" - }, - "signRawPayloadResult": { - "$ref": "#/definitions/v1SignRawPayloadResult" - }, - "createPolicyResult": { - "$ref": "#/definitions/v1CreatePolicyResult" - }, - "disablePrivateKeyResult": { - "$ref": "#/definitions/v1DisablePrivateKeyResult" - }, - "deleteUsersResult": { - "$ref": "#/definitions/v1DeleteUsersResult" - }, - "deleteAuthenticatorsResult": { - "$ref": "#/definitions/v1DeleteAuthenticatorsResult" - }, - "deleteInvitationResult": { - "$ref": "#/definitions/v1DeleteInvitationResult" - }, - "deleteOrganizationResult": { - "$ref": "#/definitions/v1DeleteOrganizationResult" - }, - "deletePolicyResult": { - "$ref": "#/definitions/v1DeletePolicyResult" - }, - "createUserTagResult": { - "$ref": "#/definitions/v1CreateUserTagResult" - }, - "deleteUserTagsResult": { - "$ref": "#/definitions/v1DeleteUserTagsResult" - }, - "signTransactionResult": { - "$ref": "#/definitions/v1SignTransactionResult" - }, - "deleteApiKeysResult": { - "$ref": "#/definitions/v1DeleteApiKeysResult" - }, - "createApiKeysResult": { - "$ref": "#/definitions/v1CreateApiKeysResult" - }, - "createPrivateKeyTagResult": { - "$ref": "#/definitions/v1CreatePrivateKeyTagResult" - }, - "deletePrivateKeyTagsResult": { - "$ref": "#/definitions/v1DeletePrivateKeyTagsResult" - }, - "setPaymentMethodResult": { - "$ref": "#/definitions/billingSetPaymentMethodResult" - }, - "activateBillingTierResult": { - "$ref": "#/definitions/billingActivateBillingTierResult" - }, - "deletePaymentMethodResult": { - "$ref": "#/definitions/billingDeletePaymentMethodResult" - }, - "createApiOnlyUsersResult": { - "$ref": "#/definitions/v1CreateApiOnlyUsersResult" - }, - "updateRootQuorumResult": { - "$ref": "#/definitions/v1UpdateRootQuorumResult" - }, - "updateUserTagResult": { - "$ref": "#/definitions/v1UpdateUserTagResult" - }, - "updatePrivateKeyTagResult": { - "$ref": "#/definitions/v1UpdatePrivateKeyTagResult" - }, - "createSubOrganizationResult": { - "$ref": "#/definitions/v1CreateSubOrganizationResult" - }, - "updateAllowedOriginsResult": { - "$ref": "#/definitions/v1UpdateAllowedOriginsResult" - }, - "createPrivateKeysResultV2": { - "$ref": "#/definitions/v1CreatePrivateKeysResultV2" - }, - "updateUserResult": { - "$ref": "#/definitions/v1UpdateUserResult" - }, - "updatePolicyResult": { - "$ref": "#/definitions/v1UpdatePolicyResult" - }, - "createSubOrganizationResultV3": { - "$ref": "#/definitions/v1CreateSubOrganizationResultV3" - }, - "createWalletResult": { - "$ref": "#/definitions/v1CreateWalletResult" - }, - "createWalletAccountsResult": { - "$ref": "#/definitions/v1CreateWalletAccountsResult" - }, - "initUserEmailRecoveryResult": { - "$ref": "#/definitions/v1InitUserEmailRecoveryResult" - }, - "recoverUserResult": { - "$ref": "#/definitions/v1RecoverUserResult" - }, - "setOrganizationFeatureResult": { - "$ref": "#/definitions/v1SetOrganizationFeatureResult" - }, - "removeOrganizationFeatureResult": { - "$ref": "#/definitions/v1RemoveOrganizationFeatureResult" - }, - "exportPrivateKeyResult": { - "$ref": "#/definitions/v1ExportPrivateKeyResult" - }, - "exportWalletResult": { - "$ref": "#/definitions/v1ExportWalletResult" - }, - "createSubOrganizationResultV4": { - "$ref": "#/definitions/v1CreateSubOrganizationResultV4" - }, - "emailAuthResult": { - "$ref": "#/definitions/v1EmailAuthResult" - }, - "exportWalletAccountResult": { - "$ref": "#/definitions/v1ExportWalletAccountResult" - }, - "initImportWalletResult": { - "$ref": "#/definitions/v1InitImportWalletResult" - }, - "importWalletResult": { - "$ref": "#/definitions/v1ImportWalletResult" - }, - "initImportPrivateKeyResult": { - "$ref": "#/definitions/v1InitImportPrivateKeyResult" - }, - "importPrivateKeyResult": { - "$ref": "#/definitions/v1ImportPrivateKeyResult" - }, - "createPoliciesResult": { - "$ref": "#/definitions/v1CreatePoliciesResult" - }, - "signRawPayloadsResult": { - "$ref": "#/definitions/v1SignRawPayloadsResult" - }, - "createReadOnlySessionResult": { - "$ref": "#/definitions/v1CreateReadOnlySessionResult" - }, - "createOauthProvidersResult": { - "$ref": "#/definitions/v1CreateOauthProvidersResult" - }, - "deleteOauthProvidersResult": { - "$ref": "#/definitions/v1DeleteOauthProvidersResult" + "email": { + "type": "string" }, - "createSubOrganizationResultV5": { - "$ref": "#/definitions/v1CreateSubOrganizationResultV5" + "phoneNumber": { + "type": "string" }, - "oauthResult": { - "$ref": "#/definitions/v1OauthResult" + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ApiKeyParamsV2" + } }, - "createReadWriteSessionResult": { - "$ref": "#/definitions/v1CreateReadWriteSessionResult" + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + } }, - "createSubOrganizationResultV6": { - "$ref": "#/definitions/v1CreateSubOrganizationResultV6" + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProviderParamsV2" + } + } + } + }, + "v1SimpleClientExtensionResults": { + "type": "object", + "properties": { + "appid": { + "type": "boolean" }, - "deletePrivateKeysResult": { - "$ref": "#/definitions/v1DeletePrivateKeysResult" + "appidExclude": { + "type": "boolean" }, - "deleteWalletsResult": { - "$ref": "#/definitions/v1DeleteWalletsResult" + "credProps": { + "$ref": "#/definitions/v1CredPropsAuthenticationExtensionsClientOutputs" + } + } + }, + "v1SmartContractInterfaceType": { + "type": "string", + "enum": [ + "SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM", + "SMART_CONTRACT_INTERFACE_TYPE_SOLANA" + ] + }, + "v1SmsCustomizationParams": { + "type": "object", + "properties": { + "template": { + "type": "string", + "description": "Template containing references to .OtpCode i.e Your OTP is {{.OtpCode}}" + } + } + }, + "v1SolSendTransactionIntent": { + "type": "object", + "properties": { + "unsignedTransaction": { + "type": "string", + "description": "Hex-encoded serialized unsigned Solana transaction in full wire format. Legacy/V0 transactions allow 1232 bytes. V1 allows 4096 bytes with up to 12 trailing 64-byte signature slots, including the paymaster for sponsored transactions. Fill unsigned slots with zeroes." }, - "createReadWriteSessionResultV2": { - "$ref": "#/definitions/v1CreateReadWriteSessionResultV2" + "signWith": { + "type": "string", + "description": "A wallet or private key address to sign with. This does not support private key IDs." }, - "deleteSubOrganizationResult": { - "$ref": "#/definitions/v1DeleteSubOrganizationResult" + "sponsor": { + "type": "boolean", + "description": "Whether to sponsor this transaction via Gas Station." }, - "initOtpAuthResult": { - "$ref": "#/definitions/v1InitOtpAuthResult" + "caip2": { + "type": "string", + "enum": [ + "solana:mainnet", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d", + "solana:devnet", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG" + ], + "description": "CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." }, - "otpAuthResult": { - "$ref": "#/definitions/v1OtpAuthResult" + "recentBlockhash": { + "type": "string", + "description": "user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution" + } + }, + "required": ["unsignedTransaction", "signWith", "caip2"] + }, + "v1SolSendTransactionIntentV2": { + "type": "object", + "properties": { + "unsignedTransaction": { + "type": "string", + "description": "Hex-encoded serialized unsigned Solana transaction in full wire format. Legacy/V0 transactions allow 1232 bytes. V1 allows 4096 bytes with up to 12 trailing 64-byte signature slots, including the paymaster for sponsored transactions. Fill unsigned slots with zeroes." }, - "createSubOrganizationResultV7": { - "$ref": "#/definitions/v1CreateSubOrganizationResultV7" + "signWiths": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Ordered Solana signer addresses Turnkey signs with. Between 1 and 16 signers for legacy/V0, or up to 12 for V1 (11 when sponsored). For sponsored transactions this must list every required signer of the transaction in transaction order." }, - "updateWalletResult": { - "$ref": "#/definitions/v1UpdateWalletResult" + "sponsor": { + "type": "boolean", + "description": "Whether to sponsor this transaction via Gas Station." }, - "updatePolicyResultV2": { - "$ref": "#/definitions/v1UpdatePolicyResultV2" + "caip2": { + "type": "string", + "enum": [ + "solana:mainnet", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d", + "solana:devnet", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", + "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG" + ], + "description": "CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet). Human-readable Solana aliases ('solana:mainnet', 'solana:devnet') are also accepted and normalized to canonical CAIP-2 values." }, - "initOtpAuthResultV2": { - "$ref": "#/definitions/v1InitOtpAuthResultV2" + "recentBlockhash": { + "type": "string", + "description": "User-provided blockhash for replay protection / deadline control. If provided, it is used as-is, including for sponsored transactions (the transaction is only broadcastable while the blockhash is current). If omitted and sponsor=true, a fresh blockhash is fetched during execution." + } + }, + "required": ["unsignedTransaction", "signWiths", "caip2"] + }, + "v1SolSendTransactionRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_SOL_SEND_TRANSACTION_V2"] }, - "initOtpResult": { - "$ref": "#/definitions/v1InitOtpResult" + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "verifyOtpResult": { - "$ref": "#/definitions/v1VerifyOtpResult" + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." }, - "otpLoginResult": { - "$ref": "#/definitions/v1OtpLoginResult" + "parameters": { + "$ref": "#/definitions/v1SolSendTransactionIntentV2" }, - "stampLoginResult": { - "$ref": "#/definitions/v1StampLoginResult" + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1SolSendTransactionResult": { + "type": "object", + "properties": { + "sendTransactionStatusId": { + "type": "string", + "description": "The send_transaction_status ID associated with the transaction submission" + } + }, + "required": ["sendTransactionStatusId"] + }, + "v1SolSendTransactionResultV2": { + "type": "object", + "properties": { + "sendTransactionStatusId": { + "type": "string", + "description": "The send_transaction_status ID associated with the transaction submission" + } + }, + "required": ["sendTransactionStatusId"] + }, + "v1SolTransactionHistoryItem": { + "type": "object", + "properties": { + "signature": { + "type": "string", + "description": "Solana transaction signature." }, - "oauthLoginResult": { - "$ref": "#/definitions/v1OauthLoginResult" + "block": { + "$ref": "#/definitions/v1TransactionHistoryBlock", + "description": "Block metadata for the transaction." }, - "updateUserNameResult": { - "$ref": "#/definitions/v1UpdateUserNameResult" + "status": { + "type": "string", + "enum": ["CONFIRMED", "FINALIZED"], + "description": "Transaction confirmation status." }, - "updateUserEmailResult": { - "$ref": "#/definitions/v1UpdateUserEmailResult" + "origin": { + "type": "string", + "description": "Origin of the transaction. Examples include TURNKEY." }, - "updateUserPhoneNumberResult": { - "$ref": "#/definitions/v1UpdateUserPhoneNumberResult" + "feePayer": { + "type": "string", + "description": "Address that paid the Solana transaction fee. This is the first signer in the transaction message." }, - "initFiatOnRampResult": { - "$ref": "#/definitions/v1InitFiatOnRampResult" + "signers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SolTransactionHistorySigner" + }, + "description": "Addresses that signed the Solana transaction, in message order." }, - "createSmartContractInterfaceResult": { - "$ref": "#/definitions/v1CreateSmartContractInterfaceResult" + "fee": { + "$ref": "#/definitions/v1TransactionHistoryFee", + "description": "Transaction fee information." }, - "deleteSmartContractInterfaceResult": { - "$ref": "#/definitions/v1DeleteSmartContractInterfaceResult" + "transfers": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1TransactionHistoryTransfer" + }, + "description": "Asset transfers associated with the transaction." }, - "enableAuthProxyResult": { - "$ref": "#/definitions/v1EnableAuthProxyResult" + "turnkey": { + "$ref": "#/definitions/v1TransactionHistoryTurnkey", + "description": "Turnkey-specific metadata for transactions originated by Turnkey." }, - "disableAuthProxyResult": { - "$ref": "#/definitions/v1DisableAuthProxyResult" + "executionFailed": { + "type": "boolean", + "description": "Whether the transaction failed during on-chain execution. Omitted when execution outcome is unavailable." + } + }, + "required": [ + "signature", + "block", + "status", + "origin", + "feePayer", + "signers", + "fee", + "transfers" + ] + }, + "v1SolTransactionHistorySigner": { + "type": "object", + "properties": { + "address": { + "type": "string", + "description": "Address of the Solana transaction signer." }, - "updateAuthProxyConfigResult": { - "$ref": "#/definitions/v1UpdateAuthProxyConfigResult" + "writable": { + "type": "boolean", + "description": "Whether the signer account was writable in the Solana transaction message." + } + }, + "required": ["address", "writable"] + }, + "v1SolanaConfig": { + "type": "object", + "properties": { + "rentPrefundEnabled": { + "type": "boolean", + "description": "Whether Solana rent prefunding is enabled for the organization. When omitted, the existing rent-prefund state is left unchanged." + } + } + }, + "v1SolanaFailureDetails": { + "type": "object", + "properties": { + "source": { + "type": "string", + "description": "Where the Solana failure occurred, such as simulation or preflight." }, - "createOauth2CredentialResult": { - "$ref": "#/definitions/v1CreateOauth2CredentialResult" + "rpcCode": { + "type": "integer", + "format": "int32", + "description": "The Solana JSON-RPC error code, if available." }, - "updateOauth2CredentialResult": { - "$ref": "#/definitions/v1UpdateOauth2CredentialResult" + "rpcMessage": { + "type": "string", + "description": "The Solana JSON-RPC error message, if available." }, - "deleteOauth2CredentialResult": { - "$ref": "#/definitions/v1DeleteOauth2CredentialResult" + "transactionErrorJson": { + "type": "string", + "description": "The raw Solana transaction error object serialized as JSON, if available." }, - "oauth2AuthenticateResult": { - "$ref": "#/definitions/v1Oauth2AuthenticateResult" + "logs": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Program logs returned by Solana simulation or preflight, if available." }, - "deleteWalletAccountsResult": { - "$ref": "#/definitions/v1DeleteWalletAccountsResult" + "unitsConsumed": { + "type": "string", + "format": "uint64", + "description": "Compute units consumed during simulation or preflight, if available." }, - "deletePoliciesResult": { - "$ref": "#/definitions/v1DeletePoliciesResult" + "innerInstructionsJson": { + "type": "string", + "description": "The raw Solana inner instructions payload serialized as JSON, if available." + } + } + }, + "v1SolanaSendTransactionStatus": { + "type": "object", + "properties": { + "signature": { + "type": "string", + "description": "The Solana transaction signature, if available." + } + } + }, + "v1SparkClaimLeaf": { + "type": "object", + "properties": { + "leafId": { + "type": "string", + "description": "Leaf identifier (UUID)." }, - "ethSendRawTransactionResult": { - "$ref": "#/definitions/v1EthSendRawTransactionResult" + "ciphertext": { + "type": "string", + "description": "ECIES ciphertext (hex-encoded) containing the inbound transfer secret. Decrypted inside the enclave using the wallet's Identity key." }, - "createFiatOnRampCredentialResult": { - "$ref": "#/definitions/v1CreateFiatOnRampCredentialResult" + "senderSignature": { + "type": "string", + "description": "Hex-encoded 64-byte compact ECDSA signature binding (leaf_id, transfer_id, ciphertext) to the sender's identity key. Verified inside the enclave before decryption." + } + }, + "required": ["leafId", "ciphertext", "senderSignature"] + }, + "v1SparkClaimPackage": { + "type": "object", + "properties": { + "leaves": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SparkClaimLeaf" + }, + "description": "Leaves being claimed." }, - "updateFiatOnRampCredentialResult": { - "$ref": "#/definitions/v1UpdateFiatOnRampCredentialResult" + "threshold": { + "type": "integer", + "format": "int64", + "description": "Shamir threshold for reconstructing the per-leaf claim secret." }, - "deleteFiatOnRampCredentialResult": { - "$ref": "#/definitions/v1DeleteFiatOnRampCredentialResult" + "operatorRecipients": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SparkOperatorRecipient" + }, + "description": "Operators that will receive Shamir shares." }, - "ethSendTransactionResult": { - "$ref": "#/definitions/v1EthSendTransactionResult" + "transferId": { + "type": "string", + "description": "Spark transfer identifier (UUID). Used together with each leaf's sender_signature to verify the sender bound this ciphertext to this transfer." }, - "upsertGasUsageConfigResult": { - "$ref": "#/definitions/v1UpsertGasUsageConfigResult" + "senderIdentityPublicKey": { + "type": "string", + "description": "Sender's compressed secp256k1 identity public key (hex-encoded, 33 bytes). Used to verify the per-leaf sender_signature fields." + } + }, + "required": [ + "leaves", + "threshold", + "operatorRecipients", + "transferId", + "senderIdentityPublicKey" + ] + }, + "v1SparkClaimTransferIntent": { + "type": "object", + "properties": { + "signWith": { + "type": "string", + "description": "A Spark wallet account address identifying the wallet." }, - "createTvcAppResult": { - "$ref": "#/definitions/v1CreateTvcAppResult" + "claim": { + "$ref": "#/definitions/v1SparkClaimPackage", + "description": "Claim package parameters." + } + }, + "required": ["signWith", "claim"] + }, + "v1SparkClaimTransferRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_SPARK_CLAIM_TRANSFER"] }, - "createTvcDeploymentResult": { - "$ref": "#/definitions/v1CreateTvcDeploymentResult" + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "createTvcManifestApprovalsResult": { - "$ref": "#/definitions/v1CreateTvcManifestApprovalsResult" + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." }, - "solSendTransactionResult": { - "$ref": "#/definitions/v1SolSendTransactionResult" + "parameters": { + "$ref": "#/definitions/v1SparkClaimTransferIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1SparkClaimTransferResult": { + "type": "object", + "properties": { + "operatorPackages": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SparkEncryptedOperatorPackage" + }, + "description": "Per-operator ECIES-encrypted packages." }, - "initOtpResultV2": { - "$ref": "#/definitions/v1InitOtpResultV2" + "newLeafPublicKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SparkLeafPublicKey" + }, + "description": "Newly-derived SigningLeaf public keys, one per leaf, in input order." + } + }, + "required": ["operatorPackages", "newLeafPublicKeys"] + }, + "v1SparkDepositDerivation": { + "type": "object" + }, + "v1SparkEncryptedOperatorPackage": { + "type": "object", + "properties": { + "operatorId": { + "type": "string", + "description": "Spark operator identifier (UUID)." }, - "updateOrganizationNameResult": { - "$ref": "#/definitions/v1UpdateOrganizationNameResult" + "encryptedPackage": { + "type": "string", + "description": "ECIES ciphertext (hex-encoded) opaque to Turnkey after emission." } - } + }, + "required": ["operatorId", "encryptedPackage"] }, - "v1RevertChainEntry": { + "v1SparkFrostCommitment": { "type": "object", "properties": { - "address": { + "id": { "type": "string", - "description": "The contract address where the revert occurred." + "description": "FROST participant identifier, hex-encoded (32-byte scalar)." }, - "errorType": { + "hiding": { "type": "string", - "description": "Type of error: 'unknown', 'native', or 'custom'." + "description": "Hiding commitment D, hex-encoded compressed secp256k1 point." }, - "displayMessage": { + "binding": { "type": "string", - "description": "Human-readable message describing this revert." + "description": "Binding commitment E, hex-encoded compressed secp256k1 point." + } + }, + "required": ["id", "hiding", "binding"] + }, + "v1SparkHtlcPreimageDerivation": { + "type": "object" + }, + "v1SparkIdentityDerivation": { + "type": "object" + }, + "v1SparkKeyDerivation": { + "type": "object", + "properties": { + "identity": { + "$ref": "#/definitions/v1SparkIdentityDerivation", + "description": "Spark identity key derivation." }, - "unknown": { - "$ref": "#/definitions/v1UnknownRevertError", - "description": "Details for unknown error types." + "signingLeaf": { + "$ref": "#/definitions/v1SparkSigningLeafDerivation", + "description": "Spark signing leaf key derivation, identified by leaf ID." }, - "native": { - "$ref": "#/definitions/v1NativeRevertError", - "description": "Details for native Solidity errors (Error, Panic, execution reverted)." + "deposit": { + "$ref": "#/definitions/v1SparkDepositDerivation", + "description": "Spark deposit key derivation." }, - "custom": { - "$ref": "#/definitions/v1CustomRevertError", - "description": "Details for custom contract errors." + "staticDeposit": { + "$ref": "#/definitions/v1SparkStaticDepositDerivation", + "description": "Spark static deposit key derivation, identified by index." + }, + "htlcPreimage": { + "$ref": "#/definitions/v1SparkHtlcPreimageDerivation", + "description": "Spark HTLC preimage key derivation." } } }, - "v1RootUserParams": { + "v1SparkLeafPublicKey": { "type": "object", "properties": { - "userName": { + "leafId": { "type": "string", - "description": "Human-readable name for a User." + "description": "The Spark leaf_id this public key was derived for." }, - "userEmail": { + "publicKey": { "type": "string", - "description": "The user's email address." + "description": "Hex-encoded compressed secp256k1 point (33 bytes) for the SigningLeaf derivation at leaf_id." + } + }, + "required": ["leafId", "publicKey"] + }, + "v1SparkLightningReceivePackage": { + "type": "object", + "properties": { + "threshold": { + "type": "integer", + "format": "int64", + "description": "Feldman VSS threshold for reconstructing the preimage." }, - "apiKeys": { + "operatorRecipients": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiApiKeyParams" + "$ref": "#/definitions/v1SparkOperatorRecipient" }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + "description": "Operators that will receive Feldman shares of the preimage. Order must match the operators' numeric IDs in the Spark operator config - share index is the 1-based position in this list." + } + }, + "required": ["threshold", "operatorRecipients"] + }, + "v1SparkOperatorRecipient": { + "type": "object", + "properties": { + "operatorId": { + "type": "string", + "description": "Spark operator identifier (UUID)." }, - "authenticators": { + "encryptionPublicKey": { + "type": "string", + "description": "Operator's ECIES encryption pubkey (hex-encoded compressed secp256k1 point)." + } + }, + "required": ["operatorId", "encryptionPublicKey"] + }, + "v1SparkPartialSignature": { + "type": "object", + "properties": { + "signatureShare": { + "type": "string", + "description": "Hex-encoded FROST partial signature." + }, + "hiding": { + "type": "string", + "description": "Turnkey's hiding commitment D (hex-encoded compressed secp256k1 point). Forward to the Spark Operator." + }, + "binding": { + "type": "string", + "description": "Turnkey's binding commitment E (hex-encoded compressed secp256k1 point). Forward to the Spark Operator." + } + }, + "required": ["signatureShare", "hiding", "binding"] + }, + "v1SparkPrepareLightningReceiveIntent": { + "type": "object", + "properties": { + "signWith": { + "type": "string", + "description": "A Spark wallet account address identifying the wallet." + }, + "lightningReceive": { + "$ref": "#/definitions/v1SparkLightningReceivePackage", + "description": "Lightning receive package parameters: threshold and operator recipients." + } + }, + "required": ["signWith", "lightningReceive"] + }, + "v1SparkPrepareLightningReceiveRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_SPARK_PREPARE_LIGHTNING_RECEIVE"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1SparkPrepareLightningReceiveIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1SparkPrepareLightningReceiveResult": { + "type": "object", + "properties": { + "operatorPackages": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1AuthenticatorParamsV2" + "$ref": "#/definitions/v1SparkEncryptedOperatorPackage" }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + "description": "Per-operator ECIES-encrypted Feldman share packages." + }, + "paymentHash": { + "type": "string", + "description": "Hex-encoded SHA256(preimage). Forward to the Lightning node." } }, - "required": ["userName", "apiKeys", "authenticators"] + "required": ["operatorPackages", "paymentHash"] }, - "v1RootUserParamsV2": { + "v1SparkPrepareTransferIntent": { "type": "object", "properties": { - "userName": { + "signWith": { "type": "string", - "description": "Human-readable name for a User." + "description": "A Spark wallet account address identifying the wallet." }, - "userEmail": { + "transfer": { + "$ref": "#/definitions/v1SparkTransferPackage", + "description": "Transfer package parameters for HD key tweak splitting." + } + }, + "required": ["signWith", "transfer"] + }, + "v1SparkPrepareTransferRequest": { + "type": "object", + "properties": { + "type": { "type": "string", - "description": "The user's email address." + "enum": ["ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER"] }, - "apiKeys": { + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1SparkPrepareTransferIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1SparkPrepareTransferResult": { + "type": "object", + "properties": { + "operatorPackages": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiApiKeyParams" + "$ref": "#/definitions/v1SparkEncryptedOperatorPackage" }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + "description": "Per-operator ECIES-encrypted packages." }, - "authenticators": { + "transferUserSignature": { + "type": "string", + "description": "Hex-encoded ECDSA-DER signature of the TransferPackage signing payload, signed with the wallet's IDENTITY key." + }, + "newLeafPublicKeys": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1AuthenticatorParamsV2" + "$ref": "#/definitions/v1SparkLeafPublicKey" }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + "description": "Newly-derived SigningLeaf public keys, one per leaf, in input order." + } + }, + "required": [ + "operatorPackages", + "transferUserSignature", + "newLeafPublicKeys" + ] + }, + "v1SparkSignFrostIntent": { + "type": "object", + "properties": { + "signWith": { + "type": "string", + "description": "A Spark wallet account address identifying the wallet to sign with." }, - "oauthProviders": { + "signatures": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1OauthProviderParams" + "$ref": "#/definitions/v1SparkSignatureRequest" }, - "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + "description": "Batched sign requests. Each produces a partial signature plus Turnkey's public commitments." } }, - "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] + "required": ["signWith", "signatures"] }, - "v1RootUserParamsV3": { + "v1SparkSignFrostRequest": { "type": "object", "properties": { - "userName": { + "type": { "type": "string", - "description": "Human-readable name for a User." + "enum": ["ACTIVITY_TYPE_SPARK_SIGN_FROST"] }, - "userEmail": { + "timestampMs": { "type": "string", - "description": "The user's email address." - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1ApiKeyParamsV2" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1AuthenticatorParamsV2" - }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." }, - "oauthProviders": { + "parameters": { + "$ref": "#/definitions/v1SparkSignFrostIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1SparkSignFrostResult": { + "type": "object", + "properties": { + "signatures": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1OauthProviderParams" + "$ref": "#/definitions/v1SparkPartialSignature" }, - "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + "description": "Partial signatures plus Turnkey commitments, one per request, in order." } }, - "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] + "required": ["signatures"] }, - "v1RootUserParamsV4": { + "v1SparkSignatureRequest": { "type": "object", "properties": { - "userName": { - "type": "string", - "description": "Human-readable name for a User." + "derivation": { + "$ref": "#/definitions/v1SparkKeyDerivation", + "description": "Which key to sign with." }, - "userEmail": { + "message": { "type": "string", - "description": "The user's email address." + "description": "Hex-encoded 32-byte sighash to sign." }, - "userPhoneNumber": { + "verifyingKey": { "type": "string", - "description": "The user's phone number in E.164 format e.g. +13214567890" - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1ApiKeyParamsV2" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + "description": "Aggregate group verifying key (hex-encoded compressed secp256k1 point), computed as P_ops + P_user. Bound into the nonce HMAC." }, - "authenticators": { + "operatorCommitments": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/v1AuthenticatorParamsV2" + "$ref": "#/definitions/v1SparkFrostCommitment" }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + "description": "Commitments for every non-Turnkey participant. MUST NOT include an entry under Turnkey's identifier. Bound into the nonce HMAC." }, - "oauthProviders": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1OauthProviderParams" - }, - "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + "adaptorPublicKey": { + "type": "string", + "description": "Optional adaptor point T (hex-encoded 33-byte compressed secp256k1 pubkey). When set, Turnkey produces a Schnorr adaptor pre-signature with the FROST challenge bound to `R+T` (where `R` is the aggregate group nonce commitment from FROST). The party holding the discrete log `t` completes the pre-sig to a valid BIP-340 signature by adding `t` (or `-t`, for parity) to the signature scalar `s`. This is primarily used by Spark leaves-swap and other adaptor-bound flows; absent or empty leads to plain FROST signing (the typical case)." } }, - "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] + "required": [ + "derivation", + "message", + "verifyingKey", + "operatorCommitments" + ] }, - "v1Selector": { + "v1SparkSigningLeafDerivation": { "type": "object", "properties": { - "subject": { - "type": "string" + "leafId": { + "type": "string", + "description": "Unique identifier for the Spark signing leaf." + } + }, + "required": ["leafId"] + }, + "v1SparkStaticDepositDerivation": { + "type": "object", + "properties": { + "index": { + "type": "integer", + "format": "int64", + "description": "Index used to derive the static deposit key." + } + }, + "required": ["index"] + }, + "v1SparkTransferLeaf": { + "type": "object", + "properties": { + "leafId": { + "type": "string", + "description": "Leaf identifier (UUID)." }, - "operator": { - "$ref": "#/definitions/v1Operator" + "oldLeafDerivation": { + "$ref": "#/definitions/v1SparkKeyDerivation", + "description": "Derivation for the existing (pre-transfer) leaf key. Always a SigningLeaf derivation." }, - "target": { - "type": "string" + "newLeafDerivation": { + "$ref": "#/definitions/v1SparkKeyDerivation", + "description": "Derivation for the new (post-transfer) leaf key. Always a SigningLeaf derivation. The enclave ECIES-encrypts this private key to receiver_public_key as the per-leaf secret_cipher; HD-derived rather than random so the sender can re-derive on retry (Turnkey's enclave is stateless)." + }, + "refundSignature": { + "type": "string", + "description": "Client-produced CPFP refund signature (hex-encoded), passed through verbatim into the per-operator SendLeafKeyTweak. Empty omits the field from the operator package." + }, + "directRefundSignature": { + "type": "string", + "description": "Client-produced direct refund signature (hex-encoded). Passed through verbatim." + }, + "directFromCpfpRefundSignature": { + "type": "string", + "description": "Client-produced direct-from-CPFP refund signature (hex-encoded). Passed through verbatim." } - } + }, + "required": ["leafId", "oldLeafDerivation", "newLeafDerivation"] }, - "v1SelectorV2": { + "v1SparkTransferPackage": { "type": "object", "properties": { - "subject": { - "type": "string" + "transferId": { + "type": "string", + "description": "Spark transfer identifier (UUID)." }, - "operator": { - "$ref": "#/definitions/v1Operator" + "leaves": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1SparkTransferLeaf" + }, + "description": "Leaves being transferred." }, - "targets": { + "threshold": { + "type": "integer", + "format": "int64", + "description": "Feldman VSS threshold for reconstructing the per-leaf tweak scalar." + }, + "operatorRecipients": { "type": "array", "items": { - "type": "string" - } + "type": "object", + "$ref": "#/definitions/v1SparkOperatorRecipient" + }, + "description": "Operators that will receive Feldman shares of the per-leaf tweak. Order must match the operators' numeric IDs in the Spark operator config - share index is the 1-based position in this list." + }, + "receiverPublicKey": { + "type": "string", + "description": "Recipient's identity pubkey (hex-encoded compressed secp256k1 point). Each leaf's new_priv is ECIES-encrypted to this key and embedded in the per-operator package for claim-time delivery." } - } + }, + "required": [ + "transferId", + "leaves", + "threshold", + "operatorRecipients", + "receiverPublicKey" + ] }, - "v1SetOrganizationFeatureIntent": { + "v1StampLoginIntent": { "type": "object", "properties": { - "name": { - "$ref": "#/definitions/v1FeatureName", - "description": "Name of the feature to set" + "publicKey": { + "type": "string", + "description": "Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request" }, - "value": { + "expirationSeconds": { "type": "string", - "description": "Optional value for the feature. Will override existing values if feature is already set." + "description": "Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used." + }, + "invalidateExisting": { + "type": "boolean", + "description": "Invalidate all other previously generated Login API keys" + }, + "sessionProfileId": { + "type": "string", + "description": "Optional session profile ID to specify which Session Profile to use for this login. If not provided, the default read/write session will be used." } }, - "required": ["name", "value"] + "required": ["publicKey"] }, - "v1SetOrganizationFeatureRequest": { + "v1StampLoginRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE"] + "enum": ["ACTIVITY_TYPE_STAMP_LOGIN"] }, "timestampMs": { "type": "string", @@ -11955,7 +20372,7 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1SetOrganizationFeatureIntent" + "$ref": "#/definitions/v1StampLoginIntent" }, "generateAppProofs": { "type": "boolean" @@ -11963,474 +20380,752 @@ }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1SetOrganizationFeatureResult": { + "v1StampLoginResult": { "type": "object", "properties": { - "features": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1Feature" - }, - "description": "Resulting list of organization features." + "session": { + "type": "string", + "description": "Signed JWT containing an expiry, public key, session type, user id, and organization id" } }, - "required": ["features"] + "required": ["session"] }, - "v1SignRawPayloadIntent": { + "v1SwapError": { "type": "object", "properties": { - "privateKeyId": { + "reason": { "type": "string", - "description": "Unique identifier for a given Private Key." + "description": "Stable machine-readable failure reason. One of ORIGIN_TRANSACTION_FAILED or PROVIDER_FILL_FAILED." }, - "payload": { + "message": { "type": "string", - "description": "Raw unsigned payload to be signed." + "description": "Human-readable description of the swap failure." }, - "encoding": { - "$ref": "#/definitions/v1PayloadEncoding", - "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." + "originTxError": { + "$ref": "#/definitions/v1TxError", + "description": "Origin-chain transaction failure details, present when reason is ORIGIN_TRANSACTION_FAILED and details are available." }, - "hashFunction": { - "$ref": "#/definitions/v1HashFunction", - "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + "providerReason": { + "type": "string", + "description": "Optional detail from the swap provider about why the fill did not complete, when available." } }, - "required": ["privateKeyId", "payload", "encoding", "hashFunction"] + "required": ["reason", "message"] }, - "v1SignRawPayloadIntentV2": { + "v1SwapQuote": { "type": "object", "properties": { - "signWith": { + "quoteId": { "type": "string", - "description": "A Wallet account address, Private Key address, or Private Key identifier." + "description": "Identifier for this provider quote. Pass this value to execute_swap_v2 to bind execution to this exact quote. The signer is derived from the quote; clients do not resupply sign_with on execute." }, - "payload": { + "provider": { "type": "string", - "description": "Raw unsigned payload to be signed." + "description": "Swap provider that produced this quote." }, - "encoding": { - "$ref": "#/definitions/v1PayloadEncoding", - "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." + "outputAmount": { + "type": "string", + "description": "Estimated base-unit amount of the output asset." }, - "hashFunction": { - "$ref": "#/definitions/v1HashFunction", - "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + "minOutputAmount": { + "type": "string", + "description": "Minimum acceptable base-unit amount of the output asset after slippage." + }, + "expiresAt": { + "type": "string", + "description": "Quote expiration as a millisecond epoch string." + }, + "slippageBps": { + "type": "string", + "description": "Effective total slippage tolerance in basis points for this quote, taken from the provider response when present. When the request omits input slippage_bps, the provider may calculate this value." + }, + "clientFeeBps": { + "type": "string", + "description": "Client fee in basis points applied for this pair. Informational only; already reflected in output_amount and min_output_amount." + }, + "estimatedTimeSeconds": { + "type": "string", + "description": "Provider-estimated completion time in seconds, when available." } }, - "required": ["signWith", "payload", "encoding", "hashFunction"] + "required": [ + "quoteId", + "provider", + "outputAmount", + "minOutputAmount", + "expiresAt", + "clientFeeBps" + ] }, - "v1SignRawPayloadRequest": { + "v1SwapQuoteV2": { "type": "object", "properties": { - "type": { + "quoteId": { "type": "string", - "enum": ["ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2"] + "description": "Identifier for this provider quote. Pass this value to execute_swap_v2 to bind execution to this exact quote. The signer is derived from the quote; clients do not resupply sign_with on execute." }, - "timestampMs": { + "provider": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Swap provider that produced this quote." }, - "organizationId": { + "outputAmount": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Estimated base-unit amount of the output asset." }, - "parameters": { - "$ref": "#/definitions/v1SignRawPayloadIntentV2" + "minOutputAmount": { + "type": "string", + "description": "Minimum acceptable base-unit amount of the output asset after slippage." }, - "generateAppProofs": { - "type": "boolean" + "expiresAt": { + "type": "string", + "description": "Quote expiration as a millisecond epoch string." + }, + "slippageBps": { + "type": "string", + "description": "Effective total slippage tolerance in basis points for this quote, taken from the provider response when present. When the request omits input slippage_bps, the provider may calculate this value." + }, + "clientFeeBps": { + "type": "string", + "description": "Client fee in basis points applied for this pair. Informational only; already reflected in output_amount and min_output_amount." + }, + "estimatedTimeSeconds": { + "type": "string", + "description": "Provider-estimated completion time in seconds, when available." + }, + "feeSponsorship": { + "type": "boolean", + "description": "Whether Turnkey pays the provider fees for this quote." + }, + "fixedRate": { + "type": "boolean", + "description": "Whether this quote uses a 1:1 fixed rate." + }, + "estimatedFixedRateAdjustmentUsd": { + "type": "string", + "description": "Estimated USD adjustment for the fixed rate. Present only for fixed-rate quotes. Positive is a cost billed to you; negative is an earning credited against your transaction management charges at the end of the billing period. Informational; the final amount is settled after execution." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": [ + "quoteId", + "provider", + "outputAmount", + "minOutputAmount", + "expiresAt", + "clientFeeBps", + "feeSponsorship", + "fixedRate" + ] }, - "v1SignRawPayloadResult": { + "v1SwapRefund": { "type": "object", "properties": { - "r": { + "asset": { "type": "string", - "description": "Component of an ECSDA signature." + "description": "CAIP-19 asset returned by the swap provider after a failed cross-chain fill." }, - "s": { + "amount": { "type": "string", - "description": "Component of an ECSDA signature." + "description": "Base-unit amount returned by the swap provider." }, - "v": { + "txHash": { "type": "string", - "description": "Component of an ECSDA signature." + "description": "Transaction that delivered the provider refund, when applicable." } }, - "required": ["r", "s", "v"] + "required": ["asset", "amount"] }, - "v1SignRawPayloadsIntent": { + "v1SwapSpendingWindow": { "type": "object", "properties": { - "signWith": { + "windowDurationMinutes": { + "type": "integer", + "format": "int32", + "description": "Rolling window duration in minutes." + }, + "windowLimitUsd": { "type": "string", - "description": "A Wallet account address, Private Key address, or Private Key identifier." + "description": "The parent's window limit, or the per-child limit when queried by a sub-organization." }, - "payloads": { - "type": "array", - "items": { - "type": "string" - }, - "description": "An array of raw unsigned payloads to be signed." + "usageUsd": { + "type": "string", + "description": "Settled spending in the current window. Fixed-rate earnings offset fixed-rate costs, and usage never goes below zero. Fixed-rate usage stays zero until final fixed-rate costs are recorded." }, - "encoding": { - "$ref": "#/definitions/v1PayloadEncoding", - "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." + "remainingUsd": { + "type": "string", + "description": "Remaining spending capacity, clamped to zero. For children, also capped by remaining parent capacity. Zero when the window is disabled. This is not a reservation or a guarantee of feature eligibility." }, - "hashFunction": { - "$ref": "#/definitions/v1HashFunction", - "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." + "enabled": { + "type": "boolean", + "description": "Whether the saved spending window permits new swaps." + }, + "subOrgWindowLimitUsd": { + "type": "string", + "description": "Configured per-child limit. Returned only when querying the billing parent." } }, - "required": ["signWith", "payloads", "encoding", "hashFunction"] + "required": [ + "windowDurationMinutes", + "windowLimitUsd", + "usageUsd", + "remainingUsd", + "enabled" + ] }, - "v1SignRawPayloadsRequest": { + "v1SwapSponsorshipFeature": { + "type": "object", + "properties": { + "permitted": { + "type": "boolean", + "description": "Whether the billing parent holds this feature's signed permission. Quotes can use the feature only when it is permitted and its window is enabled." + }, + "window": { + "$ref": "#/definitions/v1SwapSpendingWindow", + "description": "Absent until the billing parent saves a spending window." + } + }, + "required": ["permitted"] + }, + "v1TagType": { + "type": "string", + "enum": ["TAG_TYPE_USER", "TAG_TYPE_PRIVATE_KEY"] + }, + "v1TokenUsage": { "type": "object", "properties": { "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_SIGN_RAW_PAYLOADS"] + "$ref": "#/definitions/v1UsageType", + "description": "Type of token usage" }, - "timestampMs": { + "tokenId": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Unique identifier for the verification token" }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." + "signup": { + "$ref": "#/definitions/v1SignupUsage" }, - "parameters": { - "$ref": "#/definitions/v1SignRawPayloadsIntent" + "login": { + "$ref": "#/definitions/v1LoginUsage" }, - "generateAppProofs": { - "type": "boolean" + "signupV2": { + "$ref": "#/definitions/v1SignupUsageV2" } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1SignRawPayloadsResult": { - "type": "object", - "properties": { - "signatures": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1SignRawPayloadResult" - } - } - } + "required": ["type", "tokenId"] }, - "v1SignTransactionIntent": { + "v1TransactionHistoryAsset": { "type": "object", "properties": { - "privateKeyId": { + "caip19": { "type": "string", - "description": "Unique identifier for a given Private Key." + "description": "The CAIP-19 asset identifier." }, - "unsignedTransaction": { + "symbol": { "type": "string", - "description": "Raw unsigned transaction to be signed by a particular Private Key." + "description": "The asset symbol." }, - "type": { - "$ref": "#/definitions/v1TransactionType" + "name": { + "type": "string", + "description": "The asset name." + }, + "decimals": { + "type": "integer", + "format": "int32", + "description": "The number of decimals this asset uses." } }, - "required": ["privateKeyId", "unsignedTransaction", "type"] + "required": ["caip19", "symbol", "name", "decimals"] }, - "v1SignTransactionIntentV2": { + "v1TransactionHistoryBlock": { "type": "object", "properties": { - "signWith": { + "number": { "type": "string", - "description": "A Wallet account address, Private Key address, or Private Key identifier." + "format": "int64", + "description": "Block number containing the transaction." }, - "unsignedTransaction": { + "hash": { "type": "string", - "description": "Raw unsigned transaction to be signed" + "description": "Block hash containing the transaction." }, - "type": { - "$ref": "#/definitions/v1TransactionType" + "timestamp": { + "type": "string", + "description": "Block timestamp in RFC 3339 format." } }, - "required": ["signWith", "unsignedTransaction", "type"] + "required": ["number", "hash", "timestamp"] }, - "v1SignTransactionRequest": { + "v1TransactionHistoryDisplay": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_SIGN_TRANSACTION_V2"] - }, - "timestampMs": { + "crypto": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Normalized crypto value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise." }, - "organizationId": { + "usd": { "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/v1SignTransactionIntentV2" - }, - "generateAppProofs": { - "type": "boolean" + "description": "USD value for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise." } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + } }, - "v1SignTransactionResult": { + "v1TransactionHistoryFee": { "type": "object", "properties": { - "signedTransaction": { - "type": "string" + "amount": { + "type": "string", + "description": "Fee amount in atomic units." + }, + "caip19": { + "type": "string", + "description": "The CAIP-19 asset identifier." } }, - "required": ["signedTransaction"] + "required": ["amount", "caip19"] }, - "v1SignupUsage": { + "v1TransactionHistoryTransfer": { "type": "object", "properties": { - "email": { - "type": "string" + "direction": { + "type": "string", + "enum": ["IN", "OUT"], + "description": "Transfer direction relative to the queried address." }, - "phoneNumber": { - "type": "string" + "asset": { + "$ref": "#/definitions/v1TransactionHistoryAsset", + "description": "Asset metadata for the transfer. Omitted when the asset cannot be determined." }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1ApiKeyParamsV2" - } + "amount": { + "type": "string", + "description": "Transfer amount in atomic units." }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1AuthenticatorParamsV2" - } + "counterparty": { + "type": "string", + "description": "Counterparty address for the transfer." }, - "oauthProviders": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1OauthProviderParams" - } + "display": { + "$ref": "#/definitions/v1TransactionHistoryDisplay", + "description": "Normalized transfer values for display purposes only. Do not do any arithmetic or calculations with these, as the results could be imprecise. Use the amount field instead." } - } + }, + "required": ["direction", "amount", "counterparty"] }, - "v1SimpleClientExtensionResults": { + "v1TransactionHistoryTurnkey": { "type": "object", "properties": { - "appid": { - "type": "boolean" + "sponsored": { + "type": "boolean", + "description": "Whether the transaction fee was sponsored by Turnkey." }, - "appidExclude": { - "type": "boolean" + "activityFingerprint": { + "type": "string", + "description": "Fingerprint of the Turnkey activity that submitted the transaction." }, - "credProps": { - "$ref": "#/definitions/v1CredPropsAuthenticationExtensionsClientOutputs" + "submittedAt": { + "type": "string", + "description": "Timestamp when Turnkey submitted the transaction, in RFC 3339 format." } - } + }, + "required": ["sponsored"] }, - "v1SmartContractInterfaceType": { + "v1TransactionType": { "type": "string", "enum": [ - "SMART_CONTRACT_INTERFACE_TYPE_ETHEREUM", - "SMART_CONTRACT_INTERFACE_TYPE_SOLANA" + "TRANSACTION_TYPE_ETHEREUM", + "TRANSACTION_TYPE_SOLANA", + "TRANSACTION_TYPE_TRON", + "TRANSACTION_TYPE_BITCOIN", + "TRANSACTION_TYPE_TEMPO" ] }, - "v1SmsCustomizationParams": { + "v1TransportEncryptionSuite": { + "type": "string", + "enum": ["TRANSPORT_ENCRYPTION_SUITE_ENCLAVE_ENCRYPT_V1"] + }, + "v1TvcApp": { "type": "object", "properties": { - "template": { + "id": { "type": "string", - "description": "Template containing references to .OtpCode i.e Your OTP is {{.OtpCode}}" + "description": "Unique Identifier for this TVC App." + }, + "organizationId": { + "type": "string", + "description": "Unique Identifier of the Organization for this TVC App" + }, + "name": { + "type": "string", + "description": "Name for this TVC App." + }, + "quorumPublicKey": { + "type": "string", + "description": "Public key for the Quorum Key associated with this TVC App" + }, + "manifestSet": { + "$ref": "#/definitions/v1TvcOperatorSet", + "description": "Manifest Set (people who can approve manifests)" + }, + "shareSet": { + "$ref": "#/definitions/v1TvcOperatorSet", + "description": "Share Set (people who have a share of the Quorum Key)" + }, + "enableEgress": { + "type": "boolean", + "description": "Whether or not this TVC App has network egress enabled." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "liveDeploymentId": { + "type": "string", + "description": "The deployment currently designated to receive traffic. Null if no deployment for this app is deployed." + }, + "publicDomain": { + "type": "string", + "description": "The public domain for ingress to this TVC App (in the format \"app-\u003cID\u003e.turnkey.cloud\")." + }, + "enableDebugModeDeployments": { + "type": "boolean", + "description": "Whether this app permits debug-mode deployments. Set at app creation via CreateTvcAppIntent.enable_debug_mode_deployments and never updated thereafter. Debug-mode deployments expose logs and emit zero'd attestation PCRs, so remote attestation cannot succeed. The app's quorum key is therefore considered permanently insecure once enabled — a new app with a fresh quorum key must be created to return to a secure posture." } - } + }, + "required": [ + "id", + "organizationId", + "name", + "quorumPublicKey", + "manifestSet", + "shareSet", + "enableEgress", + "createdAt", + "updatedAt", + "publicDomain", + "enableDebugModeDeployments" + ] }, - "v1SolSendTransactionIntent": { + "v1TvcContainerSpec": { "type": "object", "properties": { - "unsignedTransaction": { + "containerUrl": { "type": "string", - "description": "Base64-encoded serialized unsigned Solana transaction" + "description": "The URL for this container image." }, - "signWith": { + "path": { "type": "string", - "description": "A wallet or private key address to sign with. This does not support private key IDs." + "description": "The path (in-container) to the executable binary." }, - "sponsor": { + "args": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The arguments to pass to the executable." + }, + "hasPullSecret": { "type": "boolean", - "description": "Whether to sponsor this transaction via Gas Station." + "description": "Whether or not this container requires a pull secret to access." }, - "caip2": { - "type": "string", - "enum": [ - "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG", - "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY" - ], - "description": "CAIP-2 chain ID (e.g., 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' for Solana mainnet)." + "healthCheckType": { + "$ref": "#/definitions/v1TvcHealthCheckType", + "description": "The type of health check to perform against this executable." }, - "recentBlockhash": { - "type": "string", - "description": "user-provided blockhash for replay protection / deadline control. If omitted and sponsor=true, we fetch a fresh blockhash during execution" + "healthCheckPort": { + "type": "integer", + "format": "int64", + "description": "The port to use for health checks against this executable." + }, + "publicIngressPort": { + "type": "integer", + "format": "int64", + "description": "The port to use for public ingress to this executable." } }, - "required": ["unsignedTransaction", "signWith", "caip2"] + "required": [ + "containerUrl", + "path", + "args", + "hasPullSecret", + "healthCheckType", + "healthCheckPort", + "publicIngressPort" + ] }, - "v1SolSendTransactionRequest": { + "v1TvcDeployment": { "type": "object", "properties": { - "type": { + "id": { "type": "string", - "enum": ["ACTIVITY_TYPE_SOL_SEND_TRANSACTION"] + "description": "Unique Identifier for this TVC Deployment." }, - "timestampMs": { + "organizationId": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Unique Identifier of the Organization for this TVC Deployment" + }, + "appId": { + "type": "string", + "description": "Unique Identifier of the TVC App for this deployment" + }, + "manifestSet": { + "$ref": "#/definitions/v1TvcOperatorSet", + "description": "Set of TVC operators who can approve this deployment" + }, + "shareSet": { + "$ref": "#/definitions/v1TvcOperatorSet", + "description": "Set of TVC operators who have a share of the Quorum Key" + }, + "manifest": { + "$ref": "#/definitions/v1TvcManifest", + "description": "The manifest used for this deployment" + }, + "manifestApprovals": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1TvcOperatorApproval" + }, + "description": "List of operator approvals for this manifest" + }, + "qosVersion": { + "type": "string", + "description": "QOS Version used for this deployment" + }, + "pivotContainer": { + "$ref": "#/definitions/v1TvcContainerSpec", + "description": "The pivot container spec for this deployment" + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "delete": { + "type": "boolean", + "description": "Whether or not the user wants this deployment deleted from the cluster." + }, + "debugMode": { + "type": "boolean", + "description": "Whether this deployment is running in debug mode. Debug-mode deployments expose enclave logs and cannot be remotely attested." + }, + "instanceSizeCpus": { + "type": "integer", + "format": "int64", + "description": "The instance cpu count for this enclave." + }, + "instanceSizeRam": { + "type": "integer", + "format": "int64", + "description": "The instance memory size in GiB for this enclave." + } + }, + "required": [ + "id", + "organizationId", + "appId", + "manifestSet", + "shareSet", + "manifest", + "manifestApprovals", + "qosVersion", + "pivotContainer", + "createdAt", + "updatedAt", + "delete", + "debugMode" + ] + }, + "v1TvcDeploymentDebugLogEntry": { + "type": "object", + "properties": { + "line": { + "$ref": "#/definitions/v1LogLine", + "description": "Application log line with its platform timestamp." }, - "organizationId": { + "replicaLabel": { "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/v1SolSendTransactionIntent" - }, - "generateAppProofs": { - "type": "boolean" + "description": "Public replica label that produced this log line, for example 'replica 2/3'." } }, - "required": ["type", "timestampMs", "organizationId", "parameters"] + "required": ["line", "replicaLabel"] }, - "v1SolSendTransactionResult": { + "v1TvcHealthCheckType": { + "type": "string", + "enum": ["TVC_HEALTH_CHECK_TYPE_HTTP", "TVC_HEALTH_CHECK_TYPE_GRPC"] + }, + "v1TvcManifest": { "type": "object", "properties": { - "sendTransactionStatusId": { + "id": { "type": "string", - "description": "The send_transaction_status ID associated with the transaction submission" + "description": "Unique Identifier for this TVC Manifest." + }, + "manifest": { + "type": "string", + "format": "byte", + "description": "The manifest content (raw UTF-8 JSON bytes)" + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" } }, - "required": ["sendTransactionStatusId"] + "required": ["id", "manifest", "createdAt", "updatedAt"] }, - "v1StampLoginIntent": { + "v1TvcManifestApproval": { "type": "object", "properties": { - "publicKey": { + "operatorId": { "type": "string", - "description": "Client-side public key generated by the user, which will be conditionally added to org data based on the passkey stamp associated with this request" + "description": "Unique identifier of the operator providing this approval" }, - "expirationSeconds": { + "signature": { "type": "string", - "description": "Expiration window (in seconds) indicating how long the Session is valid for. If not provided, a default of 15 minutes will be used." - }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Login API keys" + "description": "Signature from the operator approving the manifest" } }, - "required": ["publicKey"] + "required": ["operatorId", "signature"] }, - "v1StampLoginRequest": { + "v1TvcOperator": { "type": "object", "properties": { - "type": { + "id": { "type": "string", - "enum": ["ACTIVITY_TYPE_STAMP_LOGIN"] + "description": "Unique Identifier for this TVC Operator." }, - "timestampMs": { + "name": { "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + "description": "Name of this TVC Operator." }, - "organizationId": { + "publicKey": { "type": "string", - "description": "Unique identifier for a given Organization." + "description": "Public key for this TVC Operator." }, - "parameters": { - "$ref": "#/definitions/v1StampLoginIntent" + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" }, - "generateAppProofs": { - "type": "boolean" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "v1StampLoginResult": { - "type": "object", - "properties": { - "session": { + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "encryptPublicKey": { "type": "string", - "description": "Signed JWT containing an expiry, public key, session type, user id, and organization id" + "description": "Encryption public key for this TVC Operator." + }, + "signPublicKey": { + "type": "string", + "description": "Signing public key for this TVC Operator." + }, + "keySource": { + "type": "string", + "description": "Source of the operator keys: EXTERNAL_KEY or ORG_WALLET_ACCOUNT. Absent for legacy operators whose source was not recorded." } }, - "required": ["session"] - }, - "v1TagType": { - "type": "string", - "enum": ["TAG_TYPE_USER", "TAG_TYPE_PRIVATE_KEY"] + "required": [ + "id", + "name", + "publicKey", + "createdAt", + "updatedAt", + "encryptPublicKey", + "signPublicKey" + ] }, - "v1TokenUsage": { + "v1TvcOperatorApproval": { "type": "object", "properties": { - "type": { - "$ref": "#/definitions/v1UsageType", - "description": "Type of token usage" + "id": { + "type": "string", + "description": "Unique ID for this approval" }, - "tokenId": { + "manifestId": { "type": "string", - "description": "Unique identifier for the verification token" + "description": "Unique Identifier of the TVC Manifest being approved" }, - "signup": { - "$ref": "#/definitions/v1SignupUsage" + "operator": { + "$ref": "#/definitions/v1TvcOperator", + "description": "The TVC Operator who made this approval" }, - "login": { - "$ref": "#/definitions/v1LoginUsage" + "approval": { + "type": "string", + "format": "byte", + "description": "Signature of the operator over the deployment manifest" + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" } }, - "required": ["type", "tokenId"] - }, - "v1TransactionType": { - "type": "string", - "enum": [ - "TRANSACTION_TYPE_ETHEREUM", - "TRANSACTION_TYPE_SOLANA", - "TRANSACTION_TYPE_TRON", - "TRANSACTION_TYPE_BITCOIN", - "TRANSACTION_TYPE_TEMPO" + "required": [ + "id", + "manifestId", + "operator", + "approval", + "createdAt", + "updatedAt" ] }, - "v1TvcManifestApproval": { + "v1TvcOperatorParams": { "type": "object", "properties": { - "operatorId": { + "name": { "type": "string", - "description": "Unique identifier of the operator providing this approval" + "description": "The name for this new operator" }, - "signature": { + "publicKey": { "type": "string", - "description": "Signature from the operator approving the manifest" + "description": "Public key for this operator" } }, - "required": ["operatorId", "signature"] + "required": ["name", "publicKey"] }, - "v1TvcOperatorParams": { + "v1TvcOperatorSet": { "type": "object", "properties": { + "id": { + "type": "string", + "description": "Unique Identifier for this TVC Operator Set." + }, "name": { "type": "string", - "description": "The name for this new operator" + "description": "Name of this TVC Operator Set." }, - "publicKey": { + "organizationId": { "type": "string", - "description": "Public key for this operator" + "description": "Unique Identifier of the Organization for this TVC Operator Set" + }, + "operators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1TvcOperator" + }, + "description": "List of TVC Operators in this set" + }, + "threshold": { + "type": "integer", + "format": "int64", + "description": "Threshold number of operators required for quorum." + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" } }, - "required": ["name", "publicKey"] + "required": [ + "id", + "name", + "organizationId", + "operators", + "threshold", + "createdAt", + "updatedAt" + ] }, "v1TvcOperatorSetParams": { "type": "object", @@ -12462,6 +21157,41 @@ }, "required": ["name", "threshold"] }, + "v1TvcQuorumKey": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "publicKey": { + "type": "string" + }, + "threshold": { + "type": "integer", + "format": "int64" + }, + "operatorIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "createdAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + }, + "updatedAt": { + "$ref": "#/definitions/externaldatav1Timestamp" + } + }, + "required": [ + "id", + "publicKey", + "threshold", + "operatorIds", + "createdAt", + "updatedAt" + ] + }, "v1TxError": { "type": "object", "properties": { @@ -12476,6 +21206,14 @@ "$ref": "#/definitions/v1RevertChainEntry" }, "description": "Chain of revert errors from nested contract calls, ordered from outermost to innermost." + }, + "solana": { + "$ref": "#/definitions/v1SolanaFailureDetails", + "description": "Solana-specific failure details for simulation or preflight errors, if available." + }, + "eth": { + "$ref": "#/definitions/v1EthFailureDetails", + "description": "Ethereum-specific failure details, if available." } } }, @@ -12591,6 +21329,10 @@ "type": "string" }, "description": "Whitelisted OAuth client IDs for social account linking. When a user authenticates via a social provider with an email matching an existing account, the accounts will be linked if the client ID is in this list and the issuer is considered a trusted provider." + }, + "captchaEnabled": { + "type": "boolean", + "description": "Whether captcha verification is required on sign up \u0026 otp init." } } }, @@ -12622,28 +21364,101 @@ "type": "string", "description": "Publishable API key for the on-ramp provider" }, - "encryptedSecretApiKey": { + "encryptedSecretApiKey": { + "type": "string", + "description": "Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key" + }, + "encryptedPrivateApiKey": { + "type": "string", + "description": "Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key." + } + }, + "required": [ + "fiatOnrampCredentialId", + "onrampProvider", + "publishableApiKey", + "encryptedSecretApiKey" + ] + }, + "v1UpdateFiatOnRampCredentialRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1UpdateFiatOnRampCredentialIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1UpdateFiatOnRampCredentialResult": { + "type": "object", + "properties": { + "fiatOnRampCredentialId": { + "type": "string", + "description": "Unique identifier of the Fiat On-Ramp credential that was updated" + } + }, + "required": ["fiatOnRampCredentialId"] + }, + "v1UpdateMfaPolicyIntent": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "The ID of the User to update the MFA Policy for." + }, + "mfaPolicyId": { + "type": "string", + "description": "Unique identifier for a given MFA Policy." + }, + "mfaPolicyName": { + "type": "string", + "description": "Human-readable name for a Policy." + }, + "condition": { "type": "string", - "description": "Secret API key for the on-ramp provider encrypted to our on-ramp encryption public key" + "description": "A condition expression that evaluates to true or false, determining when this MFA policy applies." }, - "encryptedPrivateApiKey": { + "requiredAuthenticationMethods": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1RequiredAuthenticationMethodParams" + }, + "description": "An ordered list of authentication requirements. Each requirement must be satisfied sequentially to complete MFA." + }, + "order": { + "type": "integer", + "format": "int64", + "description": "The order in which this MFA policy is evaluated, starting from 0, relative to other MFA policies. Lower order values are evaluated first." + }, + "notes": { "type": "string", - "description": "Private API key for the on-ramp provider encrypted to our on-ramp encryption public key. Some providers, like Coinbase, require this additional key." + "description": "Notes for an MFA Policy." } }, - "required": [ - "fiatOnrampCredentialId", - "onrampProvider", - "publishableApiKey", - "encryptedSecretApiKey" - ] + "required": ["userId", "mfaPolicyId"] }, - "v1UpdateFiatOnRampCredentialRequest": { + "v1UpdateMfaPolicyRequest": { "type": "object", "properties": { "type": { "type": "string", - "enum": ["ACTIVITY_TYPE_UPDATE_FIAT_ON_RAMP_CREDENTIAL"] + "enum": ["ACTIVITY_TYPE_UPDATE_MFA_POLICY"] }, "timestampMs": { "type": "string", @@ -12654,23 +21469,20 @@ "description": "Unique identifier for a given Organization." }, "parameters": { - "$ref": "#/definitions/v1UpdateFiatOnRampCredentialIntent" - }, - "generateAppProofs": { - "type": "boolean" + "$ref": "#/definitions/v1UpdateMfaPolicyIntent" } }, "required": ["type", "timestampMs", "organizationId", "parameters"] }, - "v1UpdateFiatOnRampCredentialResult": { + "v1UpdateMfaPolicyResult": { "type": "object", "properties": { - "fiatOnRampCredentialId": { + "mfaPolicyId": { "type": "string", - "description": "Unique identifier of the Fiat On-Ramp credential that was updated" + "description": "Unique identifier for a given MFA Policy." } }, - "required": ["fiatOnRampCredentialId"] + "required": ["mfaPolicyId"] }, "v1UpdateOauth2CredentialIntent": { "type": "object", @@ -12760,6 +21572,9 @@ }, "parameters": { "$ref": "#/definitions/v1UpdateOrganizationNameIntent" + }, + "generateAppProofs": { + "type": "boolean" } }, "required": ["type", "timestampMs", "organizationId", "parameters"] @@ -12834,6 +21649,10 @@ "policyNotes": { "type": "string", "description": "Accompanying notes for a Policy (optional)." + }, + "time": { + "type": "string", + "description": "The time expression that triggers the Effect (optional)." } }, "required": ["policyId"] @@ -12989,6 +21808,43 @@ "v1UpdateRootQuorumResult": { "type": "object" }, + "v1UpdateTvcAppLiveDeploymentIntent": { + "type": "object", + "properties": { + "deploymentId": { + "type": "string", + "description": "The unique identifier of the TVC deployment to set as live for the app." + } + }, + "required": ["deploymentId"] + }, + "v1UpdateTvcAppLiveDeploymentRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_UPDATE_TVC_APP_LIVE_DEPLOYMENT"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1UpdateTvcAppLiveDeploymentIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1UpdateTvcAppLiveDeploymentResult": { + "type": "object" + }, "v1UpdateUserEmailIntent": { "type": "object", "properties": { @@ -13266,6 +22122,30 @@ }, "required": ["userTagId"] }, + "v1UpdateWalletAccountNameIntent": { + "type": "object", + "properties": { + "walletAccountId": { + "type": "string", + "description": "Unique identifier for a given Wallet Account." + }, + "name": { + "type": "string", + "description": "Human-readable name for this Wallet Account." + } + }, + "required": ["walletAccountId", "name"] + }, + "v1UpdateWalletAccountNameResult": { + "type": "object", + "properties": { + "walletAccountId": { + "type": "string", + "description": "Unique identifier for a given Wallet Account." + } + }, + "required": ["walletAccountId"] + }, "v1UpdateWalletIntent": { "type": "object", "properties": { @@ -13314,6 +22194,66 @@ }, "required": ["walletId"] }, + "v1UpdateWebhookEndpointIntent": { + "type": "object", + "properties": { + "endpointId": { + "type": "string", + "description": "Unique identifier of the webhook endpoint to update." + }, + "url": { + "type": "string", + "description": "Updated destination URL for webhook delivery." + }, + "name": { + "type": "string", + "description": "Updated human-readable name for this webhook endpoint." + }, + "isActive": { + "type": "boolean", + "description": "Whether this webhook endpoint is active." + } + }, + "required": ["endpointId"] + }, + "v1UpdateWebhookEndpointRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_UPDATE_WEBHOOK_ENDPOINT"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1UpdateWebhookEndpointIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1UpdateWebhookEndpointResult": { + "type": "object", + "properties": { + "endpointId": { + "type": "string", + "description": "Unique identifier of the updated webhook endpoint." + }, + "webhookEndpoint": { + "$ref": "#/definitions/v1WebhookEndpointData", + "description": "The updated webhook endpoint data." + } + }, + "required": ["endpointId", "webhookEndpoint"] + }, "v1UpsertGasUsageConfigIntent": { "type": "object", "properties": { @@ -13327,11 +22267,15 @@ }, "windowDurationMinutes": { "type": "string", - "description": "Rolling sponsorship window duration, expressed in minutes." + "description": "Rolling sponsorship window duration, expressed in minutes. This value can't exceed 30 days (43200 minutes)." }, "enabled": { "type": "boolean", "description": "Whether gas sponsorship is enabled for the organization." + }, + "solanaConfig": { + "$ref": "#/definitions/v1SolanaConfig", + "description": "Optional Solana sponsorship settings. If omitted, the existing Solana sponsorship state is left unchanged." } }, "required": [ @@ -13340,15 +22284,186 @@ "windowDurationMinutes" ] }, - "v1UpsertGasUsageConfigResult": { + "v1UpsertGasUsageConfigResult": { + "type": "object", + "properties": { + "gasUsageConfigId": { + "type": "string", + "description": "Unique identifier for the gas usage configuration that was created or updated." + } + }, + "required": ["gasUsageConfigId"] + }, + "v1UpsertSwapConfigIntent": { + "type": "object", + "properties": { + "feeReceiverWalletAddress": { + "type": "string", + "description": "Organization-owned wallet account that receives swap fees. Required when fee_bps is set. Omit together with fee_bps to clear swap fees." + }, + "feeBps": { + "type": "string", + "description": "Client fee in basis points applied to swaps; used for all pairs unless stable_fee_bps is set." + }, + "stableFeeBps": { + "type": "string", + "description": "Optional Enterprise-only override applied when both swap assets are stablecoins; falls back to fee_bps when unset. Non-Enterprise orgs may only set fee_bps." + } + } + }, + "v1UpsertSwapConfigRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_UPSERT_SWAP_CONFIG"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1UpsertSwapConfigIntent" + }, + "generateAppProofs": { + "type": "boolean" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1UpsertSwapConfigResult": { + "type": "object", + "properties": { + "feeReceiverWalletAddress": { + "type": "string" + }, + "feeBps": { + "type": "string" + }, + "stableFeeBps": { + "type": "string" + } + } + }, + "v1UpsertSwapFeeSponsorshipLimitConfigIntent": { + "type": "object", + "properties": { + "orgWindowLimitUsd": { + "type": "string", + "description": "Positive USD limit shared by the billing parent and its sub-organizations. At most 18 integer and 12 fractional digits." + }, + "subOrgWindowLimitUsd": { + "type": "string", + "description": "Positive USD limit for each sub-organization, no greater than the parent limit." + }, + "windowDurationMinutes": { + "type": "string", + "description": "Positive rolling window duration in minutes, at most 153722867." + }, + "enabled": { + "type": "boolean", + "description": "Whether this spending window permits new swaps. Setting false only turns the saved window off and keeps its limits; it doesn't require the signed permission. This does not grant or remove the signed organization permission." + } + }, + "required": [ + "orgWindowLimitUsd", + "subOrgWindowLimitUsd", + "windowDurationMinutes", + "enabled" + ] + }, + "v1UpsertSwapFeeSponsorshipLimitConfigRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_UPSERT_SWAP_FEE_SPONSORSHIP_LIMIT_CONFIG"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1UpsertSwapFeeSponsorshipLimitConfigIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1UpsertSwapFeeSponsorshipLimitConfigResult": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier of the organization the limit config was saved for." + } + }, + "required": ["organizationId"] + }, + "v1UpsertSwapFixedRateLimitConfigIntent": { + "type": "object", + "properties": { + "orgWindowLimitUsd": { + "type": "string", + "description": "Positive USD limit shared by the billing parent and its sub-organizations. At most 18 integer and 12 fractional digits." + }, + "subOrgWindowLimitUsd": { + "type": "string", + "description": "Positive USD limit for each sub-organization, no greater than the parent limit." + }, + "windowDurationMinutes": { + "type": "string", + "description": "Positive rolling window duration in minutes, at most 153722867." + }, + "enabled": { + "type": "boolean", + "description": "Whether this spending window permits new swaps. Setting false only turns the saved window off and keeps its limits; it doesn't require the signed permission. This does not grant or remove the signed organization permission." + } + }, + "required": [ + "orgWindowLimitUsd", + "subOrgWindowLimitUsd", + "windowDurationMinutes", + "enabled" + ] + }, + "v1UpsertSwapFixedRateLimitConfigRequest": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ACTIVITY_TYPE_UPSERT_SWAP_FIXED_RATE_LIMIT_CONFIG"] + }, + "timestampMs": { + "type": "string", + "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "parameters": { + "$ref": "#/definitions/v1UpsertSwapFixedRateLimitConfigIntent" + } + }, + "required": ["type", "timestampMs", "organizationId", "parameters"] + }, + "v1UpsertSwapFixedRateLimitConfigResult": { "type": "object", "properties": { - "gasUsageConfigId": { + "organizationId": { "type": "string", - "description": "Unique identifier for the gas usage configuration that was created or updated." + "description": "Unique identifier of the organization the limit config was saved for." } }, - "required": ["gasUsageConfigId"] + "required": ["organizationId"] }, "v1UsageType": { "type": "string", @@ -13409,6 +22524,14 @@ }, "updatedAt": { "$ref": "#/definitions/externaldatav1Timestamp" + }, + "mfaPolicies": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1MfaPolicy" + }, + "description": "A list of MFA Policies that define multi-factor authentication requirements for this user." } }, "required": [ @@ -13419,7 +22542,8 @@ "userTags", "oauthProviders", "createdAt", - "updatedAt" + "updatedAt", + "mfaPolicies" ] }, "v1UserParams": { @@ -13561,6 +22685,297 @@ "userTags" ] }, + "v1UserParamsV4": { + "type": "object", + "properties": { + "userName": { + "type": "string", + "description": "Human-readable name for a User." + }, + "userEmail": { + "type": "string", + "description": "The user's email address." + }, + "userPhoneNumber": { + "type": "string", + "description": "The user's phone number in E.164 format e.g. +13214567890" + }, + "apiKeys": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1ApiKeyParamsV2" + }, + "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." + }, + "authenticators": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1AuthenticatorParamsV2" + }, + "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." + }, + "oauthProviders": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1OauthProviderParamsV2" + }, + "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." + }, + "userTags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of User Tag IDs. This field, if not needed, should be an empty array in your request body." + } + }, + "required": [ + "userName", + "apiKeys", + "authenticators", + "oauthProviders", + "userTags" + ] + }, + "v1ValidateTvcImageRequest": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "pivotContainerImageUrl": { + "type": "string", + "description": "URL of the container image." + }, + "pivotContainerEncryptedPullSecret": { + "type": "string", + "description": "HPKE-encrypted pull secret for private images." + } + }, + "required": ["organizationId", "pivotContainerImageUrl"] + }, + "v1ValidateTvcImageResponse": { + "type": "object", + "properties": { + "resolvedImageDigest": { + "type": "string" + } + } + }, + "v1VelocityControlAggregation": { + "type": "object", + "properties": { + "method": { + "$ref": "#/definitions/v1VelocityControlAggregationMethod", + "description": "Method that aggregates matching data points." + }, + "operator": { + "$ref": "#/definitions/v1VelocityControlAggregationOperator", + "description": "Comparison between the aggregate and the threshold." + }, + "threshold": { + "type": "string", + "description": "Non-negative base-10 decimal string with at most 38 total digits and 18 fractional digits." + }, + "window": { + "$ref": "#/definitions/v1VelocityControlAggregationWindow", + "description": "Time window for the aggregation." + }, + "groupBy": { + "$ref": "#/definitions/v1VelocityControlAggregationGroupBy", + "description": "Scope that partitions matching data before aggregation." + } + }, + "required": ["method", "operator", "threshold", "window", "groupBy"] + }, + "v1VelocityControlAggregationGroupBy": { + "type": "object", + "properties": { + "organization": { + "$ref": "#/definitions/v1VelocityControlAggregationGroupByOrganization", + "description": "Uses one shared bucket for the Organization." + }, + "user": { + "$ref": "#/definitions/v1VelocityControlAggregationGroupByUser", + "description": "Uses one bucket for each User." + }, + "wallet": { + "$ref": "#/definitions/v1VelocityControlAggregationGroupByWallet", + "description": "Uses one bucket for each Wallet." + } + } + }, + "v1VelocityControlAggregationGroupByOrganization": { + "type": "object" + }, + "v1VelocityControlAggregationGroupByUser": { + "type": "object" + }, + "v1VelocityControlAggregationGroupByWallet": { + "type": "object" + }, + "v1VelocityControlAggregationMethod": { + "type": "string", + "enum": [ + "VELOCITY_CONTROL_AGGREGATION_METHOD_SUM", + "VELOCITY_CONTROL_AGGREGATION_METHOD_COUNT" + ] + }, + "v1VelocityControlAggregationOperator": { + "type": "string", + "enum": [ + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_LESS_THAN", + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_LESS_THAN_OR_EQUAL", + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_EQUAL", + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_GREATER_THAN_OR_EQUAL", + "VELOCITY_CONTROL_AGGREGATION_OPERATOR_GREATER_THAN" + ] + }, + "v1VelocityControlAggregationWindow": { + "type": "object", + "properties": { + "rolling": { + "$ref": "#/definitions/v1VelocityControlAggregationWindowRolling", + "description": "Uses a rolling time window." + }, + "infinite": { + "$ref": "#/definitions/v1VelocityControlAggregationWindowInfinite", + "description": "Uses all matching data without a time limit." + } + } + }, + "v1VelocityControlAggregationWindowInfinite": { + "type": "object" + }, + "v1VelocityControlAggregationWindowRolling": { + "type": "object", + "properties": { + "duration": { + "type": "integer", + "format": "int64", + "description": "Duration of the rolling window, in seconds." + } + }, + "required": ["duration"] + }, + "v1VelocityControlDataSource": { + "type": "object", + "properties": { + "chainAssetTransfer": { + "$ref": "#/definitions/v1VelocityControlDataSourceChainAssetTransfer", + "description": "Uses transfers of the listed on-chain assets as input data." + }, + "activityExecution": { + "$ref": "#/definitions/v1VelocityControlDataSourceActivityExecution", + "description": "Uses executed Turnkey activities as input data." + } + } + }, + "v1VelocityControlDataSourceActivityExecution": { + "type": "object", + "properties": { + "filter": { + "$ref": "#/definitions/v1VelocityControlDataSourceActivityExecutionFilter", + "description": "Filters activity executions by type." + } + } + }, + "v1VelocityControlDataSourceActivityExecutionFilter": { + "type": "object", + "properties": { + "activity": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1VelocityControlDataSourceFilterActivity" + }, + "description": "Activity types whose executions are included." + } + } + }, + "v1VelocityControlDataSourceChainAssetTransfer": { + "type": "object", + "properties": { + "definition": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1VelocityControlDataSourceChainAssetTransferDefinition" + }, + "description": "Assets whose transfers are included in the data source." + }, + "filter": { + "$ref": "#/definitions/v1VelocityControlDataSourceChainAssetTransferFilter", + "description": "Filters asset transfers by activity type." + }, + "phase": { + "$ref": "#/definitions/v1VelocityControlDataSourcePhase", + "description": "Selects when to measure an asset transfer." + } + }, + "required": ["definition"] + }, + "v1VelocityControlDataSourceChainAssetTransferDefinition": { + "type": "object", + "properties": { + "caip19": { + "type": "string", + "description": "CAIP-19 identifier for the asset." + }, + "decimals": { + "type": "integer", + "format": "int64", + "description": "Integer between 0 and 255 (inclusive) that specifies the number of decimal places for the asset." + } + }, + "required": ["caip19", "decimals"] + }, + "v1VelocityControlDataSourceChainAssetTransferFilter": { + "type": "object", + "properties": { + "activity": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1VelocityControlDataSourceFilterActivity" + }, + "description": "Activity types whose asset transfers are included." + } + } + }, + "v1VelocityControlDataSourceFilterActivity": { + "type": "object", + "properties": { + "activityType": { + "type": "string", + "description": "Name of an activity type to include, such as `ACTIVITY_TYPE_SOL_SEND_TRANSACTION`." + } + }, + "required": ["activityType"] + }, + "v1VelocityControlDataSourcePhase": { + "type": "object", + "properties": { + "signature": { + "$ref": "#/definitions/v1VelocityControlDataSourcePhaseSignature", + "description": "Measures the transfer when Turnkey signs the transaction and returns it to the user." + }, + "submission": { + "$ref": "#/definitions/v1VelocityControlDataSourcePhaseSubmission", + "description": "Reserved for future use. Measures the transfer after the transaction lands on chain." + } + } + }, + "v1VelocityControlDataSourcePhaseSignature": { + "type": "object" + }, + "v1VelocityControlDataSourcePhaseSubmission": { + "type": "object" + }, "v1VerifyOtpIntent": { "type": "object", "properties": { @@ -13774,6 +23189,14 @@ "walletDetails": { "$ref": "#/definitions/v1Wallet", "description": "Wallet details for this account. This is only present when include_wallet_details=true." + }, + "name": { + "type": "string", + "description": "Human-readable name for this Wallet Account, unique within the organization." + }, + "caip2Prefix": { + "type": "string", + "description": "The CAIP-2 namespace shared by the chains supported by this account (for example, 'eip155' or 'solana')." } }, "required": [ @@ -13807,6 +23230,10 @@ "addressFormat": { "$ref": "#/definitions/v1AddressFormat", "description": "Address format used to generate a wallet Acccount." + }, + "name": { + "type": "string", + "description": "Optional human-readable name for the account." } }, "required": ["curve", "pathFormat", "path", "addressFormat"] @@ -13902,6 +23329,58 @@ "authenticatorData", "signature" ] + }, + "v1WebhookEndpointData": { + "type": "object", + "properties": { + "endpointId": { + "type": "string", + "description": "Unique identifier of the webhook endpoint." + }, + "organizationId": { + "type": "string", + "description": "Unique identifier for a given Organization." + }, + "url": { + "type": "string", + "description": "The destination URL for webhook delivery." + }, + "name": { + "type": "string", + "description": "Human-readable name for this webhook endpoint." + }, + "isActive": { + "type": "boolean", + "description": "Whether this webhook endpoint is active." + }, + "subscriptions": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1WebhookSubscriptionParams" + }, + "description": "Current subscriptions attached to this endpoint." + } + }, + "required": ["endpointId", "organizationId", "url", "name", "isActive"] + }, + "v1WebhookSubscriptionParams": { + "type": "object", + "properties": { + "eventType": { + "type": "string", + "description": "The event type to subscribe to (for example, ACTIVITY_UPDATES, BALANCE_CONFIRMED_UPDATES, or BALANCE_FINALIZED_UPDATES)." + }, + "filtersJson": { + "type": "string", + "description": "JSON-encoded filter criteria for this subscription." + }, + "isActive": { + "type": "boolean", + "description": "Whether this subscription is active." + } + }, + "required": ["eventType"] } }, "securityDefinitions": { @@ -13910,6 +23389,11 @@ "name": "X-Stamp", "in": "header" }, + "AttestedAuth": { + "type": "apiKey", + "name": "X-Stamp-Attested", + "in": "header" + }, "AuthenticatorAuth": { "type": "apiKey", "name": "X-Stamp-WebAuthn", @@ -13927,11 +23411,24 @@ "x-tagGroups": [ { "name": "ORGANIZATIONS", - "tags": ["Organizations", "Invitations", "Policies", "Features"] + "tags": [ + "Organizations", + "Webhooks", + "Invitations", + "Policies", + "Features", + "IP Allowlist" + ] }, { "name": "WALLETS AND PRIVATE KEYS", - "tags": ["Wallets", "Signing", "Private Keys", "Private Key Tags"] + "tags": [ + "Wallets", + "Signing", + "Spark", + "Private Keys", + "Private Key Tags" + ] }, { "name": "USERS", @@ -13939,7 +23436,7 @@ }, { "name": "CREDENTIALS", - "tags": ["Authenticators", "API Keys", "Sessions"] + "tags": ["Authenticators", "API keys", "Sessions"] }, { "name": "ACTIVITIES",