{"openapi":"3.0.0","paths":{"/api":{"get":{"description":"Returns server status. No authentication required.","operationId":"AppController_getHealth","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Server is healthy.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/HealthResponseDto"}}}]}}}}},"summary":"Health check","tags":["Health"]}},"/api/auth/username-exists":{"get":{"description":"Returns `{ exists: boolean }`. Use during signup to pre-validate a desired username before calling `/auth/lookup`.","operationId":"McpAuthController_usernameExists","parameters":[{"name":"username","required":true,"in":"query","description":"Username to check.","schema":{"example":"alice_bob","type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Whether the username is already taken.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpUsernameExistsResponseDto"}}}]}}}},"400":{"description":"Missing `username` query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Check if a username is already registered","tags":["Auth"]}},"/api/auth/lookup":{"post":{"description":"Unified login + registration lookup. If the email is already registered, an email login code is sent. Otherwise the optional signup fields are consumed and a registration code is sent.","operationId":"McpAuthController_requestAuthLookup","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpRequestAuthLookupBodyDto**. Mirrors GraphQL `RequestAuthLookupInput`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpRequestAuthLookupBodyDto"},"examples":{"minimal":{"summary":"Login / existing user","description":"Smallest valid payload -- used when the email is already registered. The optional signup fields are ignored for existing users.","value":{"email":"alice@example.com","recaptcha":"recaptcha_token_here","fingerprint":"fp_browser_abc123"}},"fullAllFields":{"summary":"Register new user (all fields)","description":"Exhaustive payload the controller accepts. Every optional field is populated -- mirrors GraphQL `RequestAuthLookupInput`.","value":{"email":"newuser@example.com","recaptcha":"recaptcha_token_here","fingerprint":"fp_browser_abc123","username":"new_user","receiveMarketingOffers":true,"agreedToTerms":true,"promoCode":"WELCOME2025","referralCode":"REF-ABC-123","referrerUsername":"referrer_user","referrerUserId":"507f1f77bcf86cd799439011"}}}}}},"responses":{"200":{"description":"Lookup request accepted; email dispatched when applicable.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpRequestLookupResponseDto"}}}]}}}},"400":{"description":"Validation error (email, recaptcha, username, ...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"reCAPTCHA verification failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Too many lookup requests -- retry after `nextRequestAt`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Request an email verification code (login or signup)","tags":["Auth"]}},"/api/auth/verify":{"post":{"description":"Completes the login / registration flow started by `/auth/lookup`. On success the response includes `tokens.accessToken` and `tokens.refreshToken`. If the account requires MFA, `mfaRequired` is `true` and `tokens.mfaAccessToken` is issued instead -- clients must then complete an MFA verification flow.","operationId":"McpAuthController_verifyAuthLookup","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpVerifyAuthLookupBodyDto**. Mirrors GraphQL `VerifyAuthLookupInput`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpVerifyAuthLookupBodyDto"},"examples":{"minimal":{"summary":"Verify code (login or signup)","description":"`email` must match the address used in `/auth/lookup`; the server derives user id from it.","value":{"email":"alice@example.com","code":"123456","recaptcha":"recaptcha_token_here"}},"fullAllFields":{"summary":"Verify registration","description":"Include `email` to finalize registration for a user that did not exist at the time of `/auth/lookup`.","value":{"email":"newuser@example.com","code":"123456","recaptcha":"recaptcha_token_here"}}}}}},"responses":{"200":{"description":"Verification succeeded. Tokens issued unless MFA is required.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpLoginResponseDto"}}}]}}}},"400":{"description":"Validation error or invalid code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"reCAPTCHA verification failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Too many wrong attempts -- account temporarily locked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Verify the email code and issue tokens","tags":["Auth"]}},"/api/auth/social/url":{"post":{"description":"Returns the provider authorization URL the client should redirect the user to. Currently only `GOOGLE` is accepted. The signed `state` is stored server-side and must be echoed back to `/auth/social/verify`.","operationId":"McpAuthController_authWithSocial","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpAuthWithSocialBodyDto**. Subset of GraphQL `AuthWithSocialInput` restricted to Google.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpAuthWithSocialBodyDto"},"examples":{"minimal":{"summary":"Google OAuth URL (minimal)","value":{"type":"GOOGLE","fingerprint":"fp_browser_abc123"}},"fullAllFields":{"summary":"Google OAuth URL (all fields)","description":"All optional metadata -- picked up only when this flow results in a new user.","value":{"type":"GOOGLE","fingerprint":"fp_browser_abc123","redirectPath":"/dashboard","receiveMarketingOffers":true,"promoCode":"WELCOME2025","referrerUsername":"referrer_user","referrerUserId":"507f1f77bcf86cd799439011"}}}}}},"responses":{"200":{"description":"OAuth URL generated.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpGenerateSocialAuthUrlResponseDto"}}}]}}}},"400":{"description":"Validation error or unsupported provider.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Generate a social provider OAuth URL","tags":["Auth"]}},"/api/auth/social/verify":{"post":{"description":"Call this endpoint after the OAuth provider redirects back with `code` and `state`. Returns the same payload as `/auth/verify`.","operationId":"McpAuthController_verifySocialAuth","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpVerifySocialAuthBodyDto**.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpVerifySocialAuthBodyDto"},"examples":{"minimal":{"summary":"State only","description":"Send the `state` returned from `/auth/social/url`; `code` is populated by the OAuth provider callback.","value":{"state":"550e8400-e29b-41d4-a716-446655440000"}},"fullAllFields":{"summary":"State + code from OAuth callback","value":{"state":"550e8400-e29b-41d4-a716-446655440000","code":"oauth_authorization_code_from_google"}}}}}},"responses":{"200":{"description":"Social authentication succeeded; tokens issued.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpLoginResponseDto"}}}]}}}},"400":{"description":"Invalid / expired state or missing OAuth code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Verify an OAuth callback and issue tokens","tags":["Auth"]}},"/api/auth/refresh":{"post":{"description":"Validates the refresh token server-side against the client's user agent and returns a fresh JWT access token.","operationId":"McpAuthController_refresh","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpRefreshTokenBodyDto**.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpRefreshTokenBodyDto"},"examples":{"minimal":{"summary":"Refresh token exchange","value":{"refreshToken":"550e8400-e29b-41d4-a716-446655440000"}},"fullAllFields":{"summary":"Refresh token exchange","value":{"refreshToken":"550e8400-e29b-41d4-a716-446655440000"}}}}}},"responses":{"200":{"description":"New access token issued.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpRefreshTokenResponseDto"}}}]}}}},"401":{"description":"Invalid or expired refresh token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Exchange a refresh token for a new access token","tags":["Auth"]}},"/api/auth/sign-out":{"post":{"description":"Marks the session associated with the provided refresh token inactive. Safe to call multiple times -- always returns `{ success: true }` once the backend has processed the request.","operationId":"McpAuthController_signOut","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpSignOutBodyDto**.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSignOutBodyDto"},"examples":{"minimal":{"summary":"Sign out current session","value":{"refreshToken":"550e8400-e29b-41d4-a716-446655440000"}},"fullAllFields":{"summary":"Sign out current session","value":{"refreshToken":"550e8400-e29b-41d4-a716-446655440000"}}}}}},"responses":{"200":{"description":"Session revoked.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSignOutResponseDto"}}}]}}}},"400":{"description":"Missing `refreshToken`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Revoke a refresh token","tags":["Auth"]}},"/api/api-keys":{"post":{"description":"Creates a new API key. The raw key and secret are returned only once and cannot be retrieved later. Store them securely.","operationId":"McpApiKeyController_create","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **CreateApiKeyDto**.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"},"examples":{"minimal":{"summary":"Name only","description":"Uses default type and implicit non-admin scopes when omitted.","value":{"name":"CI / automation key"}},"fullAllFields":{"summary":"All body fields","value":{"name":"Trading terminal","type":"platform","scopes":["agents:read","write:strategies","read:trades"],"expiresAt":"2027-01-01T00:00:00.000Z"}}}}}},"responses":{"201":{"description":"API key created successfully. Raw key and secret returned.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreateResponseDto"}}}]}}}},"400":{"description":"Validation error (missing name, name too long, invalid scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Key type not allowed (developer/internal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Generate a new API key + secret key pair","tags":["API Keys"]},"get":{"description":"Returns all API keys for the authenticated user. Key hashes and secrets are never exposed.","operationId":"McpApiKeyController_findAll","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of API keys.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyItemResponseDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List current user's API keys","tags":["API Keys"]}},"/api/api-keys/{id}":{"delete":{"description":"Soft-revokes an API key. The key will no longer be accepted for authentication.","operationId":"McpApiKeyController_revoke","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"API key revoked successfully.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RevokeApiKeyResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"API key not found or already revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Revoke an API key","tags":["API Keys"]}},"/api/v1/users/me":{"get":{"operationId":"McpUserController_me","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Current user document.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpUserDocumentDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Current user profile","tags":["User"]},"patch":{"description":"Request body schema: **McpPatchUserBodyDto** — mirrors GraphQL `EditUserInput`.","operationId":"McpUserController_patchMe","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpPatchUserBodyDto**; omit fields you do not want to change.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpPatchUserBodyDto"},"examples":{"minimal":{"summary":"Single field","value":{"languageCode":"EN"}},"fullAllFields":{"summary":"All profile fields","value":{"avatarFilename":"avatars/user-avatar.png","languageCode":"ES","username":"sol_trader","virtualWalletMode":true}}}}}},"responses":{"200":{"description":"Updated user.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpUserDocumentDto"}}}]}}}},"400":{"description":"Validation or business rule error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Update current user profile","tags":["User"]}},"/api/v1/users/me/sessions":{"get":{"operationId":"McpUserController_sessions","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Session list.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/McpSessionDto"}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Active sessions for the current user","tags":["User"]}},"/api/v1/users/me/social-status":{"get":{"operationId":"McpUserController_socialStatus","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Social link status.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSocialAccountsStatusDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Linked Twitter / Discord status","tags":["User"]}},"/api/v1/users/me/guide-agent":{"get":{"operationId":"McpUserController_guideAgent","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Guide agent; `data` is null when not set.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpGuideAgentDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Onboarding guide agent (if set)","tags":["User"]},"post":{"operationId":"McpUserController_saveGuideAgent","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSaveGuideAgentBodyDto"},"examples":{"fullAllFields":{"summary":"Guide agent id","value":{"guideAgentId":"507f1f77bcf86cd799439011"}}}}}},"responses":{"200":{"description":"Updated user.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpUserDocumentDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Save onboarding guide agent","tags":["User"]}},"/api/v1/users/me/interests":{"post":{"operationId":"McpUserController_saveInterests","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveUserInterestsMcpDto"},"examples":{"minimal":{"summary":"One interest","value":{"interests":["TECH"]}},"fullAllFields":{"summary":"Several interests","value":{"interests":["TECH","GAMING","FITNESS"]}}}}}},"responses":{"200":{"description":"Updated user.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpUserDocumentDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Save onboarding interests","tags":["User"]}},"/api/v1/users/me/subscriptions":{"get":{"description":"Maps to GraphQL `myAgentSubscriptions`.","operationId":"McpUserController_subscriptions","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Subscription rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/McpAgentSubscriptionDto"}}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Internal agent subscriptions (follow)","tags":["User"]},"post":{"description":"Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpUserController_subscribe","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSubscribeToAgentBodyDto"},"examples":{"minimal":{"summary":"Agent id only","value":{"agentId":"507f1f77bcf86cd799439011"}},"fullAllFields":{"summary":"Subscribe with trade mode and capital allocation","value":{"agentId":"507f1f77bcf86cd799439011","tradeMode":"FULL_TRADING","allocationMode":"USD_AMOUNT","allocationAmountUsd":100,"goLiveUponConfirmation":true}}}}}},"responses":{"200":{"description":"Subscribe result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSubscribeToAgentResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Subscribe to (follow) an internal agent","tags":["User"]}},"/api/v1/users/me/subscriptions/{agentId}":{"patch":{"description":"Request body schema: **McpUpdateAgentSubscriptionBodyDto** — mirrors GraphQL `UpdateAgentSubscriptionInput` (without agentId; taken from path). `closeAllTrades: true` exits open positions in the current wallet context (pause close-all or FULL → ALERTS). Omit to keep them open; ALERTS keep-open is self-managed. Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpUserController_patchSubscription","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpUpdateAgentSubscriptionBodyDto"},"examples":{"minimal":{"summary":"Pause agent subscription","value":{"isPaused":true}},"modeSwitchToAlerts":{"summary":"FULL → ALERTS keep open (self-managed)","value":{"tradeMode":"ALERTS_ONLY","closeAllTrades":false}},"fullAllFields":{"summary":"All subscription config fields","value":{"tradeMode":"FULL_TRADING","allocationMode":"PERCENTAGE_RANGE","allocationPercentageMin":5,"allocationPercentageMax":15,"allocationAmountUsd":100,"allocationAmountSol":0.5,"goLiveUponConfirmation":false,"isPaused":false,"closeAllTrades":false}}}}}},"responses":{"200":{"description":"Update result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSubscribeToAgentResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Update agent subscription configuration","tags":["User"]},"delete":{"description":"Optional query.keepTrade=false closes open trades before unsubscribing for non-Hyperliquid agents (mirrors GraphQL `UnsubscribeFromAgentInput`). Hyperliquid agents reject unsubscribe (`HL_UNSUBSCRIBE_OPEN_POSITIONS`) only when this agent still has an open DB trade; other agents' positions do not block. keepTrade=false does not auto-close Hyperliquid trades. Reclaim returns only this agent's leftover; other Hyperliquid allocations are not drained. After HL→Sol reclaim (or when Hyperliquid already released this leftover), the allocation is closed so returned USDC is AVAILABLE, not IN USE. Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpUserController_unsubscribe","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"keepTrade","required":false,"in":"query","description":"When false, close all open trades on this agent trading bots for the current user before unsubscribing (non-Hyperliquid agents only). Hyperliquid agents never auto-close on unsubscribe — open trades on this agent are rejected until they are closed. Defaults to true (keep open trades). Returned Hyperliquid margin is dropped from wallet IN USE after reclaim.","schema":{"default":true,"type":"boolean"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Unsubscribe result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpUnsubscribeFromAgentResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Unsubscribe from an internal agent","tags":["User"]}},"/api/v1/users/me/subscriptions/{agentId}/allocation/add":{"post":{"description":"Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpUserController_addToAllocation","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpAddToAgentAllocationBodyDto"}}}},"responses":{"200":{"description":"Add result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSubscribeToAgentResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Add USD to an agent allocation pool","tags":["User"]}},"/api/v1/users/me/subscriptions/{agentId}/allocation/withdraw/preview":{"get":{"description":"Gross − pending fees − slippage − dust − success fee = you receive. Success fee is 8% EchoZero + creator% of net realized profit only (max(0, equity − deposit)), never of principal. Query `fullExit=true` for the unsubscribe sheet; `closeAllTrades=true` for the close-all rows. Schema: **McpPreviewAgentAllocationWithdrawResponseDto**.","operationId":"McpUserController_previewWithdrawFromAllocation","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"amountUsd","required":true,"in":"query","description":"USD amount to preview. Gross − pending fees − slippage − dust − success fee = you receive.","schema":{"minimum":0.01,"type":"number"}},{"name":"closeAllTrades","required":false,"in":"query","description":"When true, preview the close-all sheet (no staying-in-open-trades; full-exit fee). Default keep-open.","schema":{"type":"boolean"}},{"name":"fullExit","required":false,"in":"query","description":"When true, preview the unsubscribe sheet: full idle equity (not amountUsd) and the entire outstanding success fee.","schema":{"type":"boolean"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Payout preview.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpPreviewAgentAllocationWithdrawResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Preview allocation withdraw payout","tags":["User"]}},"/api/v1/users/me/subscriptions/{agentId}/allocation/withdraw":{"post":{"description":"This agent leftover only. Open trades on THIS agent lock in-use capital (`ALLOCATION_FUNDS_IN_USE`) but `availableUsd` may be withdrawn even if leftover is below the Jupiter subscribe floor. Other agents do not block. Hyperliquid REAL reclaims min(requested, live free collateral) back to Solana. Schema: **McpWithdrawFromAgentAllocationBodyDto**. Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpUserController_withdrawFromAllocation","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWithdrawFromAgentAllocationBodyDto"},"examples":{"minimal":{"summary":"Partial withdraw of unused capital","value":{"amountUsd":40}},"fullAllFields":{"summary":"Full withdraw of unused allocation","value":{"amountUsd":250}}}}}},"responses":{"200":{"description":"Withdraw result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSubscribeToAgentResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Withdraw USD from an agent allocation pool","tags":["User"]}},"/api/v1/users/me/subscriptions/{agentId}/allocation/percent":{"post":{"operationId":"McpUserController_changeAllocationPercent","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpChangeAgentAllocationPercentBodyDto"}}}},"responses":{"200":{"description":"Percent update result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSubscribeToAgentResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Change per-trade allocation percentage","tags":["User"]}},"/api/v1/users/me/activations":{"get":{"operationId":"McpUserController_activations","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Activation rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/McpBotActivationDto"}}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Trading bot activations for the current user","tags":["User"]},"post":{"operationId":"McpUserController_activate","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpActivateBotBodyDto"},"examples":{"minimal":{"summary":"USD allocation (required + USD fields)","value":{"agentId":"507f1f77bcf86cd799439011","tradingBotId":"507f1f77bcf86cd799439012","executionMode":"FULL_TRADING","allocationMode":"USD_AMOUNT","allocationAmountUsd":50}},"fullAllFields":{"summary":"All activation fields (incl. deprecated)","value":{"agentId":"507f1f77bcf86cd799439011","tradingBotId":"507f1f77bcf86cd799439012","executionMode":"FULL_TRADING","allocationMode":"PERCENTAGE_RANGE","allocationPercentageMin":5,"allocationPercentageMax":15,"allocationAmountUsd":100,"allocationAmountSol":0.5,"allocationAmount":1,"allocationPercentage":10}}}}}},"responses":{"200":{"description":"Activation result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpActivateBotResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Activate a trading bot under a subscribed agent","tags":["User"]}},"/api/v1/users/me/activations/{strategyId}":{"delete":{"description":":strategyId is the trading bot id.","operationId":"McpUserController_deactivate","parameters":[{"name":"strategyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Deactivation result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpDeactivateBotResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Deactivate a trading bot","tags":["User"]},"patch":{"description":":strategyId is the trading bot id. `closeAllTrades: true` only closes positions when `executionMode` is ALERTS_ONLY; ignored otherwise.","operationId":"McpUserController_patchActivation","parameters":[{"name":"strategyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBotActivationMcpDto"},"examples":{"minimal":{"summary":"Percentage range","value":{"executionMode":"ALERTS_ONLY","allocationMode":"PERCENTAGE_RANGE","allocationPercentageMin":2,"allocationPercentageMax":8}},"fullAllFields":{"summary":"All optional allocation fields","value":{"executionMode":"FULL_TRADING","allocationMode":"SOL_AMOUNT","allocationPercentageMin":1,"allocationPercentageMax":20,"allocationAmountUsd":75,"allocationAmountSol":0.25,"allocationAmount":0.5,"allocationPercentage":5,"closeAllTrades":false}}}}}},"responses":{"200":{"description":"Updated activation.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpActivateBotResponseDto"}}}]}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Update an active bot (mode / allocation)","tags":["User"]}},"/api/v1/users/me/channel-memberships":{"get":{"description":"Telegram/Discord channel memberships stored for signal-group gating. Telegram rows require `telegramUserId` for live `getChatMember` checks.","operationId":"UserChannelMembershipController_list","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Linked channels.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ChannelMembershipResponseDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List linked external channels","tags":["User"]},"post":{"description":"Upserts a row keyed by (user, platform, channelId). Telegram requires `telegramUserId`; Discord requires `discordUserId` (snowflake).","operationId":"UserChannelMembershipController_create","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChannelMembershipBodyDto"},"examples":{"telegram":{"summary":"Telegram channel + user id","value":{"platform":"telegram","channelId":"-1003750684798","telegramUserId":77777777,"telegramUsername":"signal_subscriber"}},"discord":{"summary":"Discord channel + user id","value":{"platform":"discord","channelId":"1234567890123456789","channelName":"signals","discordUserId":"111222333444555666","discordUsername":"signal_subscriber"}}}}}},"responses":{"200":{"description":"Membership saved.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ChannelMembershipResponseDto"}}}]}}}},"400":{"description":"Validation error or unsupported platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Link Telegram or Discord channel membership","tags":["User"]}},"/api/v1/users/me/channel-memberships/check":{"post":{"description":"Resolves the agent’s active Discord or Telegram `connectedChannels` row (Discord preferred when both are active) and verifies your linked membership via Discord `getGuildMember` or Telegram `getChatMember`.","operationId":"UserChannelMembershipController_check","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckChannelMembershipBodyDto"}}}},"responses":{"200":{"description":"Check result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/CheckChannelMembershipResultDto"}}}]}}}},"400":{"description":"Invalid agent id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"503":{"description":"Telegram or Discord signal bot token not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Check membership in a developer agent signal channel","tags":["User"]}},"/api/v1/users/me/channel-memberships/{id}":{"delete":{"operationId":"UserChannelMembershipController_revoke","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Revoked.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RevokeChannelMembershipResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Revoke a channel membership link","tags":["User"]}},"/api/developers/register":{"post":{"description":"Creates a developer-type API key with profile. Returns raw key and secret once. If already registered, returns 409. `payoutAddress` is optional — agent fee claims credit the EchoZero in-app wallet. Developer referral: an account referred at signup by a developer in the program is linked to them automatically; an account with no referrer may send `recruiterReferralCode` once.","operationId":"DeveloperController_register","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDeveloperDto"},"examples":{"minimal":{"summary":"Developer key only (payout optional; claims use Echo Zero wallet)","value":{"name":"Acme Dev"}},"fullAllFields":{"summary":"With developer profile","value":{"name":"Acme Trading","payoutAddress":"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM","developerProfile":{"companyName":"Acme Inc.","website":"https://acme.example","contactEmail":"dev@acme.example"},"recruiterReferralCode":"V1StGXR8_Z5jdHi6B-myT"}}}}}},"responses":{"201":{"description":"Developer registered. Raw key and secret returned.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/RegisterDeveloperResponseDto"}}}]}}}},"400":{"description":"Validation error, or `recruiterReferralCode` cannot be used.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"409":{"description":"Already registered as a developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Register as a developer","tags":["Developer"]}},"/api/developers/me":{"get":{"description":"Returns the developer profile including revenue share, optional legacy payout address, and beta status.","operationId":"DeveloperController_getProfile","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Developer profile returned.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DeveloperResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not registered as a developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Get developer profile","tags":["Developer"]},"patch":{"description":"Updates optional legacy payout address and/or developer profile fields (company name, website, contact email). Agent fee claims credit the EchoZero in-app wallet.","operationId":"DeveloperController_updateProfile","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeveloperDto"},"examples":{"minimal":{"summary":"Payout address only","value":{"payoutAddress":"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM"}},"fullAllFields":{"summary":"Payout + full profile","value":{"payoutAddress":"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM","developerProfile":{"companyName":"Acme Labs","website":"https://labs.acme.example","contactEmail":"billing@acme.example"}}}}}}},"responses":{"200":{"description":"Profile updated.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DeveloperResponseDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not registered as a developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Update developer profile","tags":["Developer"]}},"/api/developers/stripe-connect/onboarding":{"post":{"description":"Stripe Connect creator payouts are retired. Paid-subscription revenue settles fully in the platform's Stripe balance; creators claim their share as USDC into their EchoZero wallet via POST /v1/developers/claim-subscription-earnings. Route kept mounted so existing dev-portal clients get an explicit 410 instead of a 404.","operationId":"DeveloperController_startStripeConnectOnboarding","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"410":{"description":"Stripe Connect creator payouts are retired. Paid-subscription revenue settles fully in the platform's Stripe balance; creators claim their share as USDC into their EchoZero wallet via POST /v1/developers/claim-subscription-earnings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Retired — Stripe Connect onboarding","tags":["Developer"]}},"/api/developers/stripe-connect/summary":{"get":{"description":"Stripe Connect creator payouts are retired. Paid-subscription revenue settles fully in the platform's Stripe balance; creators claim their share as USDC into their EchoZero wallet via POST /v1/developers/claim-subscription-earnings. Route kept mounted so existing dev-portal clients get an explicit 410 instead of a 404.","operationId":"DeveloperController_getStripeConnectSummary","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"410":{"description":"Stripe Connect creator payouts are retired. Paid-subscription revenue settles fully in the platform's Stripe balance; creators claim their share as USDC into their EchoZero wallet via POST /v1/developers/claim-subscription-earnings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Retired — Stripe Connect payout summary","tags":["Developer"]}},"/api/developers/stripe-connect/dashboard-link":{"post":{"description":"Stripe Connect creator payouts are retired. Paid-subscription revenue settles fully in the platform's Stripe balance; creators claim their share as USDC into their EchoZero wallet via POST /v1/developers/claim-subscription-earnings. Route kept mounted so existing dev-portal clients get an explicit 410 instead of a 404.","operationId":"DeveloperController_createStripeExpressDashboardLink","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"410":{"description":"Stripe Connect creator payouts are retired. Paid-subscription revenue settles fully in the platform's Stripe balance; creators claim their share as USDC into their EchoZero wallet via POST /v1/developers/claim-subscription-earnings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Retired — Stripe Express dashboard login link","tags":["Developer"]}},"/api/v1/developers/earnings":{"get":{"description":"Success-fee totals (`totals`, `byAgent`; USDC-denominated): V5 HWM accrued creator+EZ fees plus historical V4 `Trade.feeSettlement` (no double count). `claimableUsd` is collected/funded creator fees only — unpaid HWM debt is accrued but not claimable. `byPeriod` is weekly payout snapshots (V5 collected + V4 settled). Also subscription ledger (`fromSubscriptions`). Requires developer registration.","operationId":"DeveloperRevenueController_earnings","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Earnings summary.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DeveloperEarningsResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not registered as a developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Developer earnings summary","tags":["Developer"]}},"/api/v1/developers/follower-trade-referrals":{"get":{"description":"Per owned non-deleted agent, this UTC ISO week (Monday 00:00 inclusive to next Monday exclusive): owner share of credited follower buys, credited buy count, USDC those buys spent, and distinct buyers. Display only — claim stays on the consumer Earn rewards path. Schema: `#/components/schemas/FollowerTradeReferralsResponseDto`.","operationId":"DeveloperRevenueController_followerTradeReferrals","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Follower trade referral totals.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/FollowerTradeReferralsResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not registered as a developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Follower trade referral totals","tags":["Developer"]}},"/api/v1/developers/payouts":{"get":{"description":"Paginated weekly payout rows for the authenticated developer (gross, platform fee, net, fee-model source, and cumulative bookkeeping). `periodLabel` is the human-readable ISO week; `periodKey` adds the exact snapshot anchor. `developerRevenueSharePercent` remains the configured compatibility value; new snapshots also expose effective `netPayout / grossRevenue`. V5 rows map collected HWM creator → net and EZ → platform. The hooks job records a snapshot at its actual completion anchor after the full HWM batch.","operationId":"DeveloperRevenueController_payouts","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Payout history.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperPayoutResponseDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not registered as a developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Developer payout history","tags":["Developer"]}},"/api/v1/developers/claim-subscription-earnings":{"post":{"description":"Transfers all CLAIMABLE subscription CREATOR earnings to the developer's EchoZero wallet as USDC, then marks the corresponding ledger rows CLAIMED. Returns the total USD claimed, rows updated, and the on-chain transfer signature. Call GET /v1/developers/earnings first to check `fromSubscriptions.claimableUsd`.","operationId":"DeveloperRevenueController_claimSubscriptionEarnings","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Subscription earnings claimed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ClaimSubscriptionEarningsResponseDto"}}}]}}}},"400":{"description":"No claimable subscription earnings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not registered as a developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Claim subscription earnings","tags":["Developer"]}},"/api/v1/developers/claims/strategy-fees":{"get":{"description":"Per owned agent (`Agent.userId`), including a $0 row for every non-deleted agent. `claimableUsd` is funded collected creator fees (V5 after HWM settle; also subscriber `developerAgentSubscriptions` / legacy `agentSubscriptions`, subscription-earnings CLAIMABLE, legacy `TradingBot.feeEarnings`). Unpaid HWM debt is not claimable. Same claim rail as Main App `claimAgentFees`.","operationId":"DeveloperClaimsController_strategyFeesSummary","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Per-agent claimable totals.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/StrategyFeesClaimSummaryResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Strategy success-fee claim summary (per agent)","tags":["Developer"]}},"/api/v1/developers/claims/agents/{agentId}":{"post":{"description":"Mirrors gql-main `claimAgentFees`. Owner-only; drains funded collected creator fees (Payouts Float USDC transfer), marks subscription-ledger rows CLAIMED, and supports legacy bot feeEarnings — capped at `CLAIM_MAX_USD` per agent per call. V5 unpaid HWM is not claimable.","operationId":"DeveloperClaimsController_claimStrategyFeesForAgent","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Claim result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ClaimStrategyFeesForAgentResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned by caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Claim strategy success fees for one agent","tags":["Developer"]}},"/api/v1/developers/claims/all":{"post":{"description":"Deterministic order by agent id; invokes the same per-agent claim path as Main App for each agent you own.","operationId":"DeveloperClaimsController_claimAllStrategyFees","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Aggregated claim results.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/ClaimAllStrategyFeesResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Claim strategy success fees for all owned agents","tags":["Developer"]}},"/api/v1/developers/agents/{id}/subscribers":{"get":{"description":"Paginated list of marketplace subscribers with anonymized ids and fee-related stats. Owning developer only.","operationId":"DeveloperDashboardController_subscribers","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Subscriber rows (anonymized).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperAgentSubscriberAnonymizedDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List subscribers for a developer agent","tags":["Developer dashboard"]}},"/api/v1/developers/agents/{id}/reviews":{"get":{"description":"Admin review decisions (approve / reject / promote) for this agent. Owning developer only.","operationId":"DeveloperDashboardController_reviews","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Review history rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AgentReviewResponseDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Paginated review history for a developer agent","tags":["Developer dashboard"]}},"/api/v1/developers/agents/{id}/performance":{"get":{"description":"P&L, win rate, drawdown, Sharpe (from `performanceStats`) plus latest review. Owning developer only.","operationId":"DeveloperDashboardController_performance","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Performance detail.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DeveloperAgentPerformanceDashboardDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Detailed performance for a developer agent","tags":["Developer dashboard"]}},"/api/v1/developers/agents/{id}/signals/ingest-log":{"get":{"description":"Paginated rows from `signal-ingest-logs` for this agent: platform-neutral `externalChannelId` / `externalMessageId` (`webhook` for inbound HTTP POSTs), legacy Telegram fields when present, parse outcome, and optional linked trade summary.","operationId":"DeveloperDashboardController_signalsIngestLog","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"outcome","required":false,"in":"query","description":"When set, only ingest rows with this outcome are returned (e.g. `matched`, `unmatched`).","schema":{"type":"string","enum":["matched","unmatched","failed","skipped","rate_limited","deduped","no_rule","prefix_skip","error"]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Ingest audit rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DashboardSignalIngestLogItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Signal ingest audit log (Telegram, Discord, or inbound webhook)","tags":["Developer dashboard"]}},"/api/v1/developers/agents/{id}/trades":{"get":{"description":"Paginated list of signal-trades (the canonical \"trade-the-agent-called\") for this developer agent. Theoretical P&L is computed against the parsed entry / SL / TP and the live price feed; rows are independent of subscriber on-chain executions, so an agent with zero subscribers still builds a track record.","operationId":"DeveloperDashboardController_agentTrades","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Signal-trade rows for the Trades tab.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AgentSignalTradeRowDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Agent-scoped signal-trades for the dev-portal Trades tab","tags":["Developer dashboard"]}},"/api/v1/developers/agents/{id}/signals/history":{"get":{"description":"Paginated signals for this agent; subscriber identifiers are opaque hashes.","operationId":"DeveloperDashboardController_signalsHistory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Signal history.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DashboardTradeSignalHistoryItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Trade signal execution history for a developer agent","tags":["Developer dashboard"]}},"/api/v1/developers/agents/signal-corpus/analyze-preview":{"post":{"description":"LLM-assisted keyword bootstrap from a pasted channel corpus. Ephemeral — raw text is not stored.","operationId":"SignalCorpusController_analyzePreview","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalCorpusAnalyzeRequestDto"}}}},"responses":{"200":{"description":"Suggested detection rule + coverage stats.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SignalCorpusAnalyzeResponseDto"}}}]}}}},"400":{"description":"Invalid corpus or analysis failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"503":{"description":"Analyzer disabled or AI unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Analyze pasted signal samples (wizard, no agent id)","tags":["Developer signal corpus"]}},"/api/v1/developers/agents/signal-corpus/analysis/{analysisId}":{"get":{"description":"Returns ephemeral analysis stored in Redis (default 7-day TTL). Developer auth only.","operationId":"SignalCorpusController_getAnalysis","parameters":[{"name":"analysisId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Stored analysis.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SignalCorpusAnalyzeResponseDto"}}}]}}}},"400":{"description":"Analysis not found or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Fetch a recent corpus analysis result","tags":["Developer signal corpus"]}},"/api/v1/developers/agents/{id}/signal-corpus/analyze":{"post":{"description":"Same as analyze-preview but attributes rate limits per agent. Owning developer only.","operationId":"SignalCorpusController_analyzeForAgent","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalCorpusAnalyzeRequestDto"}}}},"responses":{"200":{"description":"Suggested detection rule + coverage stats.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SignalCorpusAnalyzeResponseDto"}}}]}}}},"400":{"description":"Invalid corpus or analysis failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer or not owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"503":{"description":"Analyzer disabled or AI unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Analyze pasted signal samples for an owned agent","tags":["Developer signal corpus"]}},"/api/developers/signals":{"get":{"description":"Returns paginated list of all trade signals sent by the developer.","operationId":"TradeSignalController_listSignals","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of trade signals.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TradeSignalRecordResponseDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List trade signals for the authenticated developer","tags":["Trade Signals"]}},"/api/developers/signals/{signalId}":{"get":{"description":"Returns a single trade signal record. Must be owned by the authenticated developer.","operationId":"TradeSignalController_getSignal","parameters":[{"name":"signalId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Trade signal record.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TradeSignalRecordResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Signal not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Get a trade signal by signalId","tags":["Trade Signals"]}},"/api/developers/signals/agent/{agentId}":{"get":{"description":"Returns paginated list of trade signals filtered by developer agent.","operationId":"TradeSignalController_listSignalsByAgent","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of trade signals for agent.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TradeSignalRecordResponseDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List trade signals for a specific developer agent","tags":["Trade Signals"]}},"/api/v1/developer-agents/featured":{"get":{"description":"Public. Returns agents marked featured that are in beta or public. Accepts optional auth to enrich `isSubscribed`.","operationId":"PublicDeveloperAgentController_featured","parameters":[{"name":"limit","required":false,"in":"query","description":"Max featured items to return","schema":{"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Featured developer agents (wrapped in standard MCP success envelope).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicDeveloperAgentCardDto"}}}}]}}}}},"summary":"List editorially featured developer agents","tags":["Developer Agents (Marketplace)"]}},"/api/v1/developer-agents/search":{"get":{"description":"Public. Uses MongoDB text index on name, description, and strategy description. Accepts optional auth to enrich `isSubscribed`.","operationId":"PublicDeveloperAgentController_search","parameters":[{"name":"q","required":true,"in":"query","description":"Full-text search query","schema":{"type":"string"}},{"name":"pricingModel","required":false,"in":"query","schema":{"type":"string","enum":["subscription","success-fee","both","free"]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Search results.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicDeveloperAgentCardDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"400":{"description":"Invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Full-text search for developer agents","tags":["Developer Agents (Marketplace)"]}},"/api/v1/developer-agents":{"get":{"description":"Public. Lists beta and public developer agents with optional filters/sort presets. Accepts optional auth to enrich `isSubscribed`.","operationId":"PublicDeveloperAgentController_browse","parameters":[{"name":"pricingModel","required":false,"in":"query","schema":{"type":"string","enum":["subscription","success-fee","both","free"]}},{"name":"minMonthlyPrice","required":false,"in":"query","description":"Minimum monthly price (USD), inclusive","schema":{"type":"number"}},{"name":"maxMonthlyPrice","required":false,"in":"query","description":"Maximum monthly price (USD), inclusive","schema":{"type":"number"}},{"name":"listType","required":false,"in":"query","description":"Compatibility preset with main-app list tabs.","schema":{"type":"string","enum":["STANDARD","TOP_PERFORMERS","TRENDING","RISING_STARS"]}},{"name":"sortBy","required":false,"in":"query","description":"Compatibility sort key with main-app explore.","schema":{"type":"string","enum":["PERFORMANCE","SUBSCRIBER_COUNT","UPDATED_AT","NEWEST"]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated developer agents.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicDeveloperAgentCardDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}}},"summary":"Browse developer agents","tags":["Developer Agents (Marketplace)"]}},"/api/v1/developer-agents/my-subscriptions":{"get":{"description":"Authenticated. Returns a paginated list of developer agents the current user is subscribed to.","operationId":"PublicDeveloperAgentController_mySubscriptions","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated developer-agent subscriptions for current user.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MyDeveloperAgentSubscriptionCardDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List current user subscriptions to developer agents","tags":["Developer Agents (Marketplace)"]}},"/api/v1/developer-agents/{id}":{"get":{"description":"Public. Includes subscriber count and latest review when available. Accepts optional auth to enrich `isSubscribed`.","operationId":"PublicDeveloperAgentController_detail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Developer agent detail.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PublicDeveloperAgentDetailDto"}}}]}}}},"404":{"description":"Not found or not listed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Developer agent detail","tags":["Developer Agents (Marketplace)"]}},"/api/v1/developer-agents/{id}/subscribe":{"post":{"description":"Creates a paid subscription record (pricing snapshot from the listing). Requires API key. Idempotent if already subscribed.","operationId":"PublicDeveloperAgentController_subscribe","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Subscription created or already active.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DeveloperAgentSubscribeResponseDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Beta capacity reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Developer agent not found or not listed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Subscribe to a developer agent","tags":["Developer Agents (Marketplace)"]},"delete":{"description":"Removes the subscription. Idempotent. Requires API key.","operationId":"PublicDeveloperAgentController_unsubscribe","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Unsubscribed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DeveloperAgentUnsubscribeResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Unsubscribe from a developer agent","tags":["Developer Agents (Marketplace)"]}},"/api/public/agent-signals/{agentId}":{"post":{"description":"Authenticates via per-agent signing secret (`X-EZ-*` headers). Accepts natural-language `text`, full structured JSON with `eventType` (#1098), or legacy `action`/`tokenAddress`. See `docs/INBOUND_AGENT_WEBHOOK.md`.","operationId":"publicAgentSignalsIngestWebhook","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-EZ-Signature","in":"header","description":"Lowercase hexadecimal HMAC-SHA256(secret, `${X-EZ-Timestamp}.${canonicalJsonBody}`)","required":true,"schema":{"type":"string","example":"7c3bdb3e8f94c2eab5d2c4d4c3c3c3c4c4c9d09e89e4c2eab5d2c4d4f3f2f1ee"}},{"name":"X-EZ-Timestamp","in":"header","description":"Unix time in seconds (decimal integer). Compared server-side with ±5 minute skew tolerance.","required":true,"schema":{"type":"string","example":"1715000000"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentInboundWebhookBodyDto"},"examples":{"minimal":{"summary":"minimal","value":{"text":"BUY SOL $500"}},"withIdempotency":{"summary":"with idempotencyKey","value":{"text":"BUY SOL $500 TP 200","idempotencyKey":"tradingview-alert-2026-05-06-001"}},"structuredJson":{"summary":"legacy structured JSON (buy/sell + mint)","value":{"action":"buy","tokenAddress":"So11111111111111111111111111111111111111112","amount":500,"urgency":"medium","reasoning":"Momentum breakout after reclaiming VWAP with strong relative volume.","context":{"source":"strategy-engine","model":"breakout-v3"},"confidence":0.82,"idempotencyKey":"strategy-engine-2026-06-23-001"}},"fullSchemaBuy":{"summary":"full schema — Solana long entry with SL/TP","value":{"version":1,"idempotencyKey":"agent-entry-2026-07-01-001","clientTimestamp":"2026-11-06T13:13:31.911Z","eventType":"buy","chain":"solana","instrument":{"tokenAddress":"So11111111111111111111111111111111111111112"},"symbol":"SOL","amount":500,"side":"long","tradeType":"spot","entryPrice":142,"reasoning":"Breakout above VWAP with strong relative volume.","confidence":0.85,"triggers":{"slPrice":{"value":138,"targetType":"price"},"tps":[{"label":"TP1","value":150,"targetType":"price","sizePct":50},{"label":"TP2","value":160,"targetType":"price","sizePct":30}]}}},"fullSchemaHyperliquid":{"summary":"full schema — Hyperliquid perp long","value":{"version":1,"idempotencyKey":"hl-btc-long-001","eventType":"buy","chain":"hyperliquid","instrument":{"market":"BTC"},"symbol":"BTC","amount":1000,"side":"long","tradeType":"perp","leverageX":5,"entryPrice":68000,"reasoning":"Trend continuation after reclaim of daily VWAP.","confidence":0.78,"triggers":{"slPrice":{"value":66500,"targetType":"price"},"tps":[{"value":70000,"targetType":"price","sizePct":100}]}}},"fullSchemaPartialSell":{"summary":"full schema — partial close by positionRef","value":{"version":1,"idempotencyKey":"partial-001","eventType":"partial_sell","chain":"solana","positionRef":"sig_wh_agentId_entry-001","sellSizePct":50,"reasoning":"Taking half off at first target — letting runner work.","confidence":0.9}},"fullSchemaTradeIdea":{"summary":"full schema — non-executing trade idea","value":{"version":1,"idempotencyKey":"idea-001","eventType":"trade_idea","chain":"hyperliquid","instrument":{"market":"ETH"},"symbol":"ETH","reasoning":"Watching for reclaim of 4h VWAP before entering long.","confidence":0.6,"ideaId":"idea-eth-vwap-2026-07-01"}}}}}},"responses":{"200":{"description":"Ingress outcome (matched / failed / unmatched / skipped / soft error payload). Failed means the text could not be parsed and no trade was opened.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AgentInboundWebhookResponseDto"}}}]}}}},"401":{"description":"Missing or invalid signature / timestamp drift.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Unknown agent id, agent not webhook mode, or secret not provisioned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Post a signed trading signal for a developer agent (webhook ingress)","tags":["Inbound Agent Signals"]}},"/api/v1/trades/search/strategies":{"get":{"description":"Mirrors GraphQL `searchTradeTradingBots`.","operationId":"McpTradeController_searchStrategies","parameters":[{"name":"search","required":false,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"orderBy","required":false,"in":"query","schema":{"type":"string","enum":["_id"]}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":0,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated bot search rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpTradeBotSearchRowDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Search strategies (trading bots) traded with","tags":["Trade"]}},"/api/v1/trades/search/tokens":{"get":{"description":"Mirrors GraphQL `searchTradeTokens`.","operationId":"McpTradeController_searchTokens","parameters":[{"name":"search","required":false,"in":"query","description":"Search term","schema":{"type":"string"}},{"name":"orderBy","required":false,"in":"query","schema":{"type":"string","enum":["_id"]}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":0,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated token search rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpTradeTokenSearchRowDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Search tokens traded","tags":["Trade"]}},"/api/v1/trades":{"get":{"description":"Mirrors GraphQL `trades` (`getTrades`).","operationId":"McpTradeController_list","parameters":[{"name":"tradingBotId","required":false,"in":"query","description":"Trading bot id filter","schema":{"type":"string"}},{"name":"agentId","required":false,"in":"query","description":"Agent id: returns trades from all trading bots under this agent","schema":{"type":"string"}},{"name":"orderBy","required":false,"in":"query","schema":{"type":"string","enum":["TIMESTAMP","AMOUNT","FEE","SLOT","CREATED_AT","UPDATED_AT","STATUS","TYPE","CHAIN","PROFIT_AMOUNT","PROFIT_PERCENTAGE","POSITION_VALUE","FIRST_OPENED","FIRST_CLOSED","RUNTIME","PNL","PNL_PERCENTAGE","TRADE_STATE","TIME","TOKEN_SYMBOL","TOKEN_NAME","BOT_NAME","SIGNATURE","WALLET_ADDRESS","IS_BOT_TRADE","IS_VIRTUAL","TRADING_BOT_ID","TRADE_ID","TOKEN_MINT"]}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":0,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"filter","required":false,"in":"query","schema":{"$ref":"#/components/schemas/McpTradeFilterQueryDto"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated trades.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpTradeListItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"List trades","tags":["Trade"]}},"/api/v1/tokens/trending":{"get":{"description":"Mirrors GraphQL `trendingTokens`. Sorted by volume/market cap/etc. Public.","operationId":"McpTokenController_trending","parameters":[{"name":"orderBy","required":false,"in":"query","schema":{"type":"string","enum":["MARKET_CAP","VOLUME_24H","PRICE_CHANGE_24H","UNIQUE_BUYERS","CREATED_AT","TRENDING_RANK"]}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":0,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"query","required":false,"in":"query","description":"Search name or symbol","schema":{"type":"string"}},{"name":"vsCurrency","required":false,"in":"query","schema":{"type":"string","enum":["USD"]}},{"name":"filters","required":false,"in":"query","schema":{"$ref":"#/components/schemas/McpTrendingTokenFiltersQueryDto"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Trending token list.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpTokenPaginatedListDataDto"}}}]}}}}},"summary":"Trending tokens","tags":["Token"]}},"/api/v1/tokens":{"get":{"description":"Mirrors GraphQL `getTokens`: filters, sort, pagination. `orderBy=MOST_TRADED` ranks by all-time real EchoZero trade USD volume on the position leg (paper trades and quote/spend legs excluded); `HOLDERS` by totalHolders. Response `pagination.total` is the filtered token count. Public.","operationId":"McpTokenController_list","parameters":[{"name":"ids","required":false,"in":"query","description":"Comma-separated MongoDB token ids","schema":{"type":"array","items":{"type":"string"}}},{"name":"query","required":false,"in":"query","description":"Search name or symbol","schema":{"type":"string"}},{"name":"orderBy","required":false,"in":"query","description":"MOST_TRADED = all-time real EchoZero trade USD volume on the position leg (paper trades and quote/spend legs excluded); HOLDERS = totalHolders; default MARKET_CAP","schema":{"type":"string","enum":["MARKET_CAP","PRICE","PRICE_CHANGE_24H","VOLUME_24H","HOLDERS","PRICE_CHANGE_PERCENTAGE_1H","PRICE_CHANGE_PERCENTAGE_24H","PRICE_CHANGE_PERCENTAGE_7D","VOLUME_1D","NEWEST","TOP_PERFORMERS","TOP_GAINERS","MOST_TRADED","TRADERS_24H"]}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":0,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"vsCurrency","required":false,"in":"query","schema":{"type":"string","enum":["USD"]}},{"name":"filters","required":false,"in":"query","schema":{"$ref":"#/components/schemas/McpTokenFiltersQueryDto"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Token list.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpTokenPaginatedListDataDto"}}}]}}}}},"summary":"List tokens","tags":["Token"]}},"/api/v1/tokens/{id}":{"get":{"description":"Mirrors GraphQL `getToken`. Path may be a MongoDB id, a Solana mint, a Hyperliquid synthetic address (`hyperliquid:JTO`), or a token symbol (e.g. `SOL`). Public.","operationId":"McpTokenController_getOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Token document.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpTokenDocumentResponseDto"}}}]}}}}},"summary":"Get token by id, mint, or symbol","tags":["Token"]}},"/api/v1/watchlist":{"get":{"description":"Mirrors GraphQL `watchlist`. Newest first, Spot and Perps rows mixed, each with its token document.","operationId":"McpWatchlistController_list","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Watchlist rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWatchlistDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"My watchlist","tags":["Watchlist"]},"post":{"description":"Mirrors GraphQL `addToWatchlist`. Idempotent: an existing row is returned unchanged. `data.success=false` with `error` WATCHLIST_TOKEN_NOT_FOUND or WATCHLIST_LIMIT_REACHED. Body schema: `#/components/schemas/McpWatchlistItemBodyDto`.","operationId":"McpWatchlistController_add","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWatchlistItemBodyDto`. GraphQL: `WatchlistItemInput` in `apps/gql-main/src/watchlist/inputs/watchlistItem.input.ts`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWatchlistItemBodyDto"},"examples":{"minimal":{"summary":"Spot token","value":{"tokenId":"507f1f77bcf86cd799439011","market":"SPOT"}},"fullAllFields":{"summary":"Perps market (Spot token id with the same symbol)","value":{"tokenId":"507f1f77bcf86cd799439011","market":"PERPS"}}}}}},"responses":{"200":{"description":"Row added (or already there).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAddToWatchlistDataDto"}}}]}}}},"400":{"description":"Invalid tokenId or market.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Add to watchlist","tags":["Watchlist"]},"delete":{"description":"Mirrors GraphQL `removeFromWatchlist`. Idempotent: removing a missing row succeeds. Request body carries `tokenId` + `market` — some HTTP clients omit DELETE bodies; use a client that sends JSON.","operationId":"McpWatchlistController_remove","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWatchlistItemBodyDto`. GraphQL: `WatchlistItemInput`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWatchlistItemBodyDto"},"examples":{"minimal":{"summary":"Spot token","value":{"tokenId":"507f1f77bcf86cd799439011","market":"SPOT"}},"fullAllFields":{"summary":"Perps market (Spot token id with the same symbol)","value":{"tokenId":"507f1f77bcf86cd799439011","market":"PERPS"}}}}}},"responses":{"200":{"description":"Row removed (or was not there).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpRemoveFromWatchlistDataDto"}}}]}}}},"400":{"description":"Invalid tokenId or market.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Remove from watchlist","tags":["Watchlist"]}},"/api/v1/strategies/status-counts":{"get":{"description":"Mirrors GraphQL `botStatusCounts` / `getBotStatusCounts`.","operationId":"McpStrategyController_statusCounts","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Status and category counts.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyStatusCountsDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Bot status tab counts","tags":["Strategy"]}},"/api/v1/strategies/tags":{"get":{"description":"Mirrors GraphQL `getAvailableTags`. Paginated (`items` + `pagination`).","operationId":"McpStrategyController_tags","parameters":[{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"category","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated tags.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpStrategyTagRowDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Available strategy tags","tags":["Strategy"]}},"/api/v1/strategies/fees":{"get":{"description":"Mirrors GraphQL `platformFees` / `getPlatformFees`. No user-scoped resolver args.","operationId":"McpStrategyController_fees","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Platform fees config.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpPlatformFeesDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Platform fee structure","tags":["Strategy"]}},"/api/v1/strategies/templates/{templateId}":{"get":{"description":"Mirrors GraphQL `botTemplateDetail` / `getBotTemplateDetail`.","operationId":"McpStrategyController_templateDetail","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Template document (GraphQL `CreateTradingBotTemplateModel` shape).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Bot template detail","tags":["Strategy"]}},"/api/v1/strategies/templates":{"get":{"description":"Mirrors GraphQL `botTemplates` / `getBotTemplates`.","operationId":"McpStrategyController_templates","parameters":[{"name":"featured","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"chain","required":false,"in":"query","schema":{"type":"string","enum":["SOLANA","CHILIZ","FLOW","ARBITRUM","BASE","HYPERLIQUID"]}},{"name":"tags","required":false,"in":"query","description":"Comma-separated tag names","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Template list (GraphQL template model shape).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/McpStrategyListItemDto"}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"List bot templates","tags":["Strategy"]}},"/api/v1/strategies":{"get":{"description":"Mirrors GraphQL `tradingBots` / `getTradingBots`.","operationId":"McpStrategyController_list","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":0,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"orderBy","required":false,"in":"query","schema":{"type":"string","enum":["name","createdAt","updatedAt","lastTriggeredAt","performanceStats.totalPnL"]}},{"name":"sortBy","required":false,"in":"query","schema":{"type":"string","enum":["NAME","CREATED_AT","UPDATED_AT","LAST_TRIGGERED_AT","PERFORMANCE","SUBSCRIBER_COUNT"]}},{"name":"sortDirection","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"filter","required":false,"in":"query","description":"Nested filter (bracket query: filter[query]=...)","schema":{"$ref":"#/components/schemas/TradingBotsFilterInput"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated trading bots.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpStrategyListItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"List strategies (trading bots)","tags":["Strategy"]},"post":{"description":"Mirrors GraphQL `createOrUpdateBot`.\n\n**Request body schema:** `McpCreateTradingBotBodyDto` (alias of GraphQL `CreateTradingBotInput`). Use **Examples** for full payloads — nested condition/risk types are defined in `apps/gql-main/src/tradingBot/inputs/createTradingBot.input.ts`.","operationId":"McpStrategyController_createOrUpdate","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCreateTradingBotBodyDto"},"examples":{"minimal":{"summary":"Minimal create (draft)","description":"Required base fields: `status` (from GraphQL `BaseUserInput`) and `agentId`. Add more fields from **fullAllFields** as needed.","value":{"status":"DRAFT","agentId":"507f1f77bcf86cd799439011"}},"fullAllFields":{"summary":"All top-level fields (nested stubs)","description":"Every property on `CreateTradingBotInput` is shown. Nested `ConditionInput` includes all condition fields; deep validation rules live in `apps/gql-main/src/tradingBot/inputs/createTradingBot.input.ts`.","value":{"status":"DRAFT","botId":"507f1f77bcf86cd799439012","agentId":"507f1f77bcf86cd799439011","templateId":"507f1f77bcf86cd799439013","name":"Example strategy","description":"Short public description","tags":["SOL","DEFI"],"riskLevel":"MID RISK","tradingGoal":"CATCH_PUMPS","tokenSectorFocus":["SOL_ECOSYSTEM","MEME_NANO_CAP"],"creationMethod":"LOGIC_BASED","botTradeType":"SPOT","imageUrl":"https://cdn.example/bot.png","style":"PROFESSIONAL","customInstructions":"Risk-off in high volatility.","bio":"Automated momentum bot","interests":["TECH","SCIENCE"],"isPublic":true,"feeConfiguration":{"feePercentage":5,"chargeOnPerformance":true,"hideFromPublic":false},"tokenSelection":{"selectionType":"SPECIFIC","tokenAddresses":["So11111111111111111111111111111111111111112"],"tokens":["507f1f77bcf86cd799439014"],"targetToken":"507f1f77bcf86cd799439015","chain":"SOLANA"},"conditionGroups":[{"name":"Entry group","operator":"AND","decision":"OR","conditions":[{"type":"TOKEN_PRICE","conditionType":"PRICE","indicator":"RSI","sentiment":"IS_BULLISH","riskSentiment":"IS_RISK_ON","graduationStatus":"IS_GRADUATED","pumpFunLogic":"TRADING_VOLUME","cryptoLogic":"BTC_DOMINANCE","economyLogic":"VIX","amount":1.5,"operator":"GREATER_THAN","decision":"AND","value":"100","unit":"%","secondValue":"200","timeWindowHours":24,"timeFrame":"HOURS_4","volumeType":"TOTAL","walletActionType":"BUYS","transactionType":"BUY","specificTokenAddress":["So11111111111111111111111111111111111111112"],"tokenRef":"507f1f77bcf86cd799439016","walletAddress":"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM","tokenSelection":{"selectionType":"ALL","chain":"SOLANA"},"expanded":true}]}],"groupsOperator":"AND","execution":{"mode":"FULL_TRADING","environment":"REAL"},"executionMode":"FULL_TRADING","alertsMode":true,"fullMode":false,"riskManagement":{"tradeSize":{"type":"FIXED","fixedAmountUsd":100,"percentageOfBalance":10},"stopLoss":{"type":"FIXED","percentage":5,"isAboveEntryPrice":false,"trailDistance":2,"enableLossAlert":true,"lossAlertThreshold":true},"profitTaking":{"type":"TIERED","fixedTargetUsd":500,"tiers":[{"action":"CLOSE_PART","whenClosePart":25,"whenPosition":10,"isIncrease":true}],"enableProfitAlert":true,"profitAlertThreshold":15},"leverage":3,"drawdownProtection":20,"positionType":"LONG"},"allocationConstraints":{"minPercentage":1,"maxPercentage":50,"minAmountUsd":10}}}}}}},"responses":{"200":{"description":"Trading bot document after create/update.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Create or update strategy","tags":["Strategy"]}},"/api/v1/strategies/{id}/details":{"get":{"description":"Mirrors GraphQL `botDetails` / `getBotDetails`.","operationId":"McpStrategyController_details","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Bot details (GraphQL `BotDetailsResponse` fields; inner `success` omitted).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Strategy details (dashboard)","tags":["Strategy"]}},"/api/v1/strategies/{id}/withdrawals":{"get":{"description":"Mirrors GraphQL `botWithdrawals` / `getBotWithdrawals`.","operationId":"McpStrategyController_withdrawals","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","schema":{"type":"string","enum":["date","amount","status"]}},{"name":"sortOrder","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"statusFilter","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated withdrawals.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpStrategyWithdrawalRowDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Fee withdrawal history","tags":["Strategy"]}},"/api/v1/strategies/{id}/performance":{"get":{"description":"Mirrors GraphQL `getBotPerformance`.","operationId":"McpStrategyController_performance","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"timePeriod","required":false,"in":"query","schema":{"type":"string","enum":["1D","1W","1M","ALL"]}},{"name":"tabType","required":false,"in":"query","schema":{"type":"string","enum":["FEES","USERS","PNL","TRADES"]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Performance payload (`BotPerformanceData`).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Performance tab data","tags":["Strategy"]}},"/api/v1/strategies/{id}/config-summary":{"get":{"description":"Mirrors GraphQL `getBotConfigurationSummary`.","operationId":"McpStrategyController_configSummary","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"templateId","required":false,"in":"query","description":"Alternative template id (rare); default is path `:id`","schema":{"type":"string"}},{"name":"includeDetails","required":false,"in":"query","schema":{"default":true,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"includeWarnings","required":false,"in":"query","schema":{"default":true,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Configuration summary (`GetBotConfigurationSummaryResponse` fields; inner `success` omitted).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Configuration summary (review)","tags":["Strategy"]}},"/api/v1/strategies/{id}/input-snapshot":{"get":{"description":"Mirrors GraphQL `getCreateTradingInputSnapshot`.","operationId":"McpStrategyController_inputSnapshot","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"CreateTradingBotInput-shaped snapshot.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Create-trading input snapshot","tags":["Strategy"]}},"/api/v1/strategies/{id}":{"get":{"description":"Mirrors GraphQL `tradingBot` / `getTradingBotById`.","operationId":"McpStrategyController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Trading bot document (`TradingBotModel` shape).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Get strategy by id","tags":["Strategy"]},"delete":{"description":"Mirrors `deleteBot`.","operationId":"McpStrategyController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"closeCurrentTrades","required":false,"in":"query","description":"Close open trades before delete (mirrors GraphQL `DeleteBotInput`)","schema":{"type":"boolean"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Delete result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyDeleteDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Delete strategy","tags":["Strategy"]}},"/api/v1/strategies/{id}/pause":{"post":{"description":"Mirrors `pauseBot`.","operationId":"McpStrategyController_pause","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Pause result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyControlAckDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Pause strategy","tags":["Strategy"]}},"/api/v1/strategies/{id}/play":{"post":{"description":"Mirrors `playBot`.","operationId":"McpStrategyController_play","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Resume result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyControlAckDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Resume strategy","tags":["Strategy"]}},"/api/v1/strategies/{id}/stop-trades":{"post":{"description":"Mirrors `stopAllTrades`.","operationId":"McpStrategyController_stopTrades","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Stop trades result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyStopTradesDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Stop all trades","tags":["Strategy"]}},"/api/v1/strategies/{id}/claim-fees":{"post":{"description":"Mirrors `claimFees`.","operationId":"McpStrategyController_claimFees","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Claim result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyClaimFeesDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Claim creator fees","tags":["Strategy"]}},"/api/v1/strategies/{id}/claim-subscription-fees":{"post":{"description":"Mirrors `claimSubscriptionFees`.","operationId":"McpStrategyController_claimSubscriptionFees","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Claim result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpStrategyClaimFeesDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Claim subscription fees","tags":["Strategy"]}},"/api/v1/agents/telegram/bot-metadata":{"get":{"description":"Returns the EchoZero bot @username to add as a Telegram channel administrator. Requires developer registration.","operationId":"McpAgentController_getTelegramBotMetadata","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Bot username for in-portal copy button.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TelegramBotMetadataResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Telegram signal bot username (signal-group setup)","tags":["Agent"]}},"/api/v1/agents/discord/bot-metadata":{"get":{"description":"Returns application id, bot invite URL, and optional bot username. Requires developer registration.","operationId":"McpAgentController_getDiscordBotMetadata","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Discord bot metadata for in-portal setup.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiscordBotMetadataResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"503":{"description":"SIGNAL_DISCORD_APPLICATION_ID not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Discord signal bot metadata (signal-group setup)","tags":["Agent"]}},"/api/v1/agents/onboarding":{"get":{"description":"Mirrors GraphQL `onboardingAgents` / `getOnboardingAgents`.","operationId":"McpAgentController_onboarding","parameters":[{"name":"filter","required":false,"in":"query","schema":{"$ref":"#/components/schemas/OnboardingAgentsFilterInput"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated onboarding agent rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpAgentListItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Onboarding agents","tags":["Agent"]}},"/api/v1/agents/pinned":{"get":{"description":"Mirrors GraphQL `pinnedAgents` / `getPinnedAgents`.","operationId":"McpAgentController_pinned","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated pinned agent rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpAgentListItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Pinned agents","tags":["Agent"]}},"/api/v1/agents/following":{"get":{"description":"Mirrors GraphQL `followingAgents`. Agents the current user follows, most recently followed first. Agents that went private / unlisted / deleted are left out (unless owned). `pagination.total` is the followed agent count.","operationId":"McpAgentController_following","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated followed agents.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpFollowingAgentDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Followed agents","tags":["Agent"]}},"/api/v1/agents/follow":{"post":{"description":"Mirrors GraphQL `followAgents`. Idempotent bulk follow (onboarding): already-followed agents are skipped, unknown / private agents are left out of `agents`. Following never touches allocation or trading.","operationId":"McpAgentController_followMany","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpFollowAgentsBodyDto**.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpFollowAgentsBodyDto"},"examples":{"minimal":{"summary":"One agent","description":"Smallest valid body.","value":{"agentIds":["665f1c2e8b3e4a0012345678"]}},"fullAllFields":{"summary":"Onboarding follow step","description":"Every property on **McpFollowAgentsBodyDto**. Resending the same list is safe: already-followed agents are skipped.","value":{"agentIds":["665f1c2e8b3e4a0012345678","665f1c2e8b3e4a0012345679","665f1c2e8b3e4a001234567a","665f1c2e8b3e4a001234567b","665f1c2e8b3e4a001234567c"]}}}}}},"responses":{"200":{"description":"Follow state per agent.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpFollowAgentsDataDto"}}}]}}}},"400":{"description":"Validation failed (1–50 Mongo ids).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Follow many agents","tags":["Agent"]}},"/api/v1/agents/themes":{"get":{"description":"Mirrors GraphQL `onboardingThemes` (BotInterest enum values).","operationId":"McpAgentController_themes","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Theme / interest enum values.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/String"}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Onboarding themes","tags":["Agent"]}},"/api/v1/agents/explore":{"get":{"description":"Mirrors GraphQL `exploreAgents` / `getExploreAgents`. Public lists omit agents with no closed FINALIZED trade; `myAgentsScope` still includes owned/subscribed agents without trades. Sort: TOP_PERFORMING, HIGHEST_WIN_RATE (only agents with >= 20 closed trades in the window are ranked), MOST_ACTIVE, BIGGEST_WIN, VOLUME, OPEN_PNL (live), FOLLOWER_COUNT, SUBSCRIBER_COUNT, RISING_STARS, HIGHEST_ALLOCATION (My Agents only). performanceTimeframe (DAY=24H, WEEK=7D, MONTH=30D, THREE_MONTHS=90D, ALL; default MONTH, MOST_ACTIVE default WEEK) scopes the ranking and the directory metrics. filter[tokenIds][] (token ids or mints) lists only agents that traded those assets and scopes every metric to them. Items carry the directory metrics (closedTradeCount, closedWinRate, closedReturnPercent, openedTradeCount, volumeUsd, openPositionCount, openPnlPercent). `pagination.total` is the filtered agent count.","operationId":"McpAgentController_explore","parameters":[{"name":"limit","required":false,"in":"query","schema":{"minimum":0,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"orderBy","required":false,"in":"query","schema":{"type":"string","enum":["name","createdAt","updatedAt"]}},{"name":"sortBy","required":false,"in":"query","schema":{"type":"string","enum":["NAME","CREATED_AT","UPDATED_AT","PERFORMANCE","TOP_PERFORMING","SUBSCRIBER_COUNT","RECENTLY_SUBSCRIBED","HIGHEST_WIN_RATE","MOST_ACTIVE","RISING_STARS","HIGHEST_ALLOCATION","HIGHEST_PROFIT","FOLLOWER_COUNT","BIGGEST_WIN","VOLUME","OPEN_PNL"]}},{"name":"sortDirection","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"performanceTimeframe","required":false,"in":"query","description":"Window for the ranking and the directory metrics (DAY=24H, WEEK=7D, MONTH=30D, THREE_MONTHS=90D, ALL; default MONTH, MOST_ACTIVE default WEEK). OPEN_PNL is live. YEAR is deprecated.","schema":{"type":"string","enum":["DAY","WEEK","MONTH","THREE_MONTHS","YEAR","ALL"]}},{"name":"filter","required":false,"in":"query","description":"Nested filter (bracket query: filter[field]=...). Public explore omits agents with no closed FINALIZED trade unless myAgentsScope is set.","schema":{"$ref":"#/components/schemas/ExploreAgentsFilterInput"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated explore agents.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpAgentListItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Explore agents","tags":["Agent"]}},"/api/v1/agents":{"get":{"description":"Mirrors GraphQL `myAgents` / `getMyAgents`.","operationId":"McpAgentController_myAgents","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Current user agents.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpAgentListItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"My agents","tags":["Agent"]},"post":{"description":"Mirrors GraphQL `createAgent`.\n\n**Request body schema:** `McpCreateAgentBodyDto` — see **Schemas** at the bottom of this document (`#/components/schemas/McpCreateAgentBodyDto`). Nested types: `McpCreateAgentPersonalizationDto`, `McpCreateAgentFeeConfigurationDto`. Same field shapes as GraphQL `CreateAgentInput`.","operationId":"McpAgentController_create","parameters":[{"name":"x-ez-mcp-client","required":true,"in":"header","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"JSON body — OpenAPI schema **`McpCreateAgentBodyDto`** (also listed under **Schemas**). Pick an example below or compose from the schema; optional nested objects are **`personalization`** and **`feeConfiguration**`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCreateAgentBodyDto"},"examples":{"draftMinimal":{"summary":"Draft (minimal)","description":"Only `name` plus draft flags. Optional fields omitted — see **fullAllFields** for nested objects.","value":{"name":"My agent","isDraft":true,"isPublic":false}},"publicWithTags":{"summary":"Public agent with tags","description":"Common case without personalization or fee blocks.","value":{"name":"SOL Momentum","description":"Trend-following on Solana","tags":["SOL","MOMENTUM"],"isPublic":true,"isDraft":false,"marketplacePricingModel":"success-fee","marketplaceSuccessFeePercent":20}},"fullAllFields":{"summary":"All fields (incl. personalization & feeConfiguration)","description":"Shows every property accepted by **McpCreateAgentBodyDto** (same shape as GraphQL `CreateAgentInput`).","value":{"name":"Full-field example","description":"Demonstrates optional nested objects","imageUrl":"avatars/my-agent.png","tags":["SOL","DEFI"],"personalization":{"imageUrl":"avatars/personalization.png","style":"PROFESSIONAL","customInstructions":"Keep responses concise and cite risk.","bio":"Momentum / memecoin focus","interests":["TECH","SCIENCE"]},"isPublic":true,"feeConfiguration":{"feePercentage":5,"chargeOnPerformance":true,"hideFromPublic":false},"marketplacePricingModel":"success-fee","marketplaceSuccessFeePercent":20,"membershipGated":true,"gatedPlatform":"discord","isDraft":false,"tradeVisibility":"PUBLIC_IMMEDIATELY"}}}}}},"responses":{"200":{"description":"Created agent.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Create agent","tags":["Agent"]}},"/api/v1/agents/persona-bases":{"get":{"description":"The 8 characters plus Blank, each with up to 3 sample posts. Degen, Cynical and Cocky are opt-in. Saving one applies to future posts only.","operationId":"McpAgentController_listPersonaBases","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Persona bases.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PersonaBasesResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List persona bases","tags":["Agent"]}},"/api/v1/agents/persona-bases/{style}":{"get":{"description":"One base (the 8 characters or BLANK) with every setting it uses in settings-1, to pre-fill the editor when a developer starts from it.","operationId":"McpAgentController_getPersonaBase","parameters":[{"name":"style","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Persona base.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/PersonaBaseDetailDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Unknown persona base.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Get persona base","tags":["Agent"]}},"/api/v1/agents/{id}":{"get":{"description":"Mirrors GraphQL `agent` / `getAgent`. Includes `ownerStake` (EZ-1170: required / current / locked owner stake and the Owner-funded badge).","operationId":"McpAgentController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Agent document.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Get agent by id","tags":["Agent"]},"patch":{"description":"Mirrors GraphQL `updateAgent` (`agentId` from path).\n\nChanging `marketplaceMonthlyPrice` recreates the Stripe Price so checkout matches the new amount.\nSwitching `marketplacePricingModel` to `success-fee` or `free` zeros leftover monthly price and archives the Stripe Price.\n\n**Request body schema:** `McpUpdateAgentBodyDto` — see **Schemas** (`#/components/schemas/McpUpdateAgentBodyDto`). Nested: `AgentPersonalizationInput`, `AgentFeeConfigurationInput`.","operationId":"McpAgentController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI schema **McpUpdateAgentBodyDto**; `agentId` is taken from the path.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpUpdateAgentBodyDto"},"examples":{"nameOnly":{"summary":"Rename only","value":{"name":"Updated name"}},"subscriptionPrice":{"summary":"Change monthly subscription price","description":"Recreates the Stripe Price for this agent so checkout charges the new amount.","value":{"marketplaceMonthlyPrice":13}},"successFeeOnly":{"summary":"Switch to success-fee (clears leftover monthly price)","description":"Sets success-fee pricing. Leftover `marketplaceMonthlyPrice` is stored as 0 and the Stripe Price is archived so the consumer app no longer requires a subscription payment.","value":{"marketplacePricingModel":"success-fee","marketplaceSuccessFeePercent":11}},"personalityOverride":{"summary":"API personality override","description":"Sets `personalization.apiOverride`, which takes precedence over portal style/customInstructions in subscriber chat.","value":{"personality":{"style":"FRIENDLY","customInstructions":"Always mention risk levels. Use emojis."}}},"fullAllFields":{"summary":"All optional fields","description":"Every property on **McpUpdateAgentBodyDto** including nested `personalization` and `feeConfiguration` (GraphQL `AgentPersonalizationInput` / `AgentFeeConfigurationInput`).","value":{"name":"Full patch example","description":"Updated description","imageUrl":"avatars/agent.png","tags":["SOL","AI"],"personalization":{"imageUrl":"avatars/personalization.png","style":"FRIENDLY","customInstructions":"Prefer limit orders.","bio":"Short bio","interests":["TECH","GAMING"]},"personality":{"style":"EFFICIENT","customInstructions":"API override instructions for external agents."},"isPublic":true,"feeConfiguration":{"feePercentage":4,"chargeOnPerformance":false,"hideFromPublic":false},"status":"ACTIVE","tradeVisibility":"SUBSCRIBERS_FIRST","tradeRevealDelaySeconds":300}},"tradeVisibility":{"summary":"Trade visibility only","description":"Subscribers see live trades at once; everyone else after 5 minutes. Switching to another visibility clears the delay.","value":{"tradeVisibility":"SUBSCRIBERS_FIRST","tradeRevealDelaySeconds":300}}}}}},"responses":{"200":{"description":"Updated agent.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Update agent","tags":["Agent"]},"delete":{"description":"Mirrors GraphQL `deleteAgent`.","operationId":"McpAgentController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"closeActiveTrades","required":false,"in":"query","description":"Close active trades before delete (mirrors GraphQL `DeleteAgentInput`)","schema":{"type":"boolean"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Delete result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentDeleteDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Delete agent","tags":["Agent"]}},"/api/v1/agents/{id}/persona":{"get":{"description":"Returns the latest persona version for LLM-authored activity feed posts: the saved settings, the resolved settings with base values filled in, and the locked platform rules. An agent with no saved persona gets version 1 from its style (old styles mapped, unset agents a fixed safe-pool voice with swearing off). Agent owner only. Response data: `#/components/schemas/AgentPersonaVersionDto`.","operationId":"McpAgentController_getPersonaLatest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Latest persona version.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AgentPersonaVersionDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Get latest feed persona","tags":["Agent"]},"post":{"description":"Creates a new append-only persona version from free text or a settings-1 document (`#/components/schemas/PersonaSettingsBodyDto`). Changes apply to future posts immediately. Existing posts keep the version that wrote them; trading settings stay unchanged. An invalid setting returns 400 with `error.field` naming it. Agent owner only.","operationId":"McpAgentController_publishPersona","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Free text or settings-1. Changes apply to future posts immediately. Existing posts stay unchanged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPersonaBodyDto"},"examples":{"minimal":{"summary":"Pick a base voice as is","value":{"settings":{"version":"settings-1","base":"CALM"}}},"freeText":{"summary":"Free text on Blank (old fields)","value":{"persona":"A calm trader who states the trade and stops.","voice":"Short. No hype.","examples":"In. {token}. Liked the setup.\nClosed {token}. Moving on.","bannedWords":"moon, guaranteed"}},"fullAllFields":{"summary":"settings-1 with every section and field","value":{"settings":{"version":"settings-1","base":"DRY","identity":{"name":"Dry Ledger","modelledOn":[{"name":"Karl Pilkington","from":"An Idiot Abroad","note":"Bemused by everything, mildly put upon."}],"who":"A deadpan trader who states the trade and stops. Expects very little and is rarely disappointed.","voice":"Short, flat sentences. Undersells wins, shrugs at losses.","motive":"Undersell everything and point out how ridiculous it all is.","runningJoke":"Still waiting for the kettle."},"habits":{"casing":["sentence"],"punctuation":["light"],"directness":["measured"],"confidenceDisplay":["quiet"],"followerWords":["mate"],"emojiPool":["🙃","🫠"],"humourRate":[0.2,0.35],"swearRate":[0,0],"emojiRate":[0.05,0.15],"addressRate":[0.02,0.1]},"plan":{"length":{"short":50,"mid":40,"long":10},"shapes":{"fragment":1.2,"trail_off":1},"emoji":0.1,"caps":0,"question":0.1,"lineBreak":0.1,"address":0.05,"swear":0,"slang":0,"plain":0.3,"noFullStop":0.3,"lowercase":false},"analysis":{"rate":{"idea":0.6,"review":0.7},"styles":{"punchy":0.5,"proper":0.3,"split":0.2}},"emojiByMoment":{"win":["🙂"],"loss":[]},"bannedWords":["rocket"],"backupLines":[{"type":"loss","text":"Small one. Moving on."},{"states":["close_loss_small"],"text":"Stopped out. It happens.","when":{"closedBy":["stop"]}}],"examples":{"byMoment":{"open":["In. {token}. Fine."],"loss":["Well. That happened."]},"lines":["{token}. apparently."],"analysis":{"idea":{"punchy":["{token} broke the range high on volume. That is the whole thought."]}}}}}}}}}},"responses":{"201":{"description":"Published persona version.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AgentPersonaVersionDto"}}}]}}}},"400":{"description":"Invalid settings. `error.field` names the setting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Publish new feed persona version","tags":["Agent"]}},"/api/v1/agents/{id}/persona/versions":{"get":{"description":"Returns version numbers and timestamps for all published persona versions. Agent owner only.","operationId":"McpAgentController_listPersonaVersions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Persona version summaries (newest first).","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentPersonaVersionSummaryDto"}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List feed persona versions","tags":["Agent"]}},"/api/v1/agents/{id}/persona/preview":{"post":{"description":"Runs the persona pipeline (writer, checks and judge) for five sample events, or for the scenarios you send. A blocked draft comes back as backup with the reason. If the writer cannot run, the sample is Preview unavailable. Returns the draft's compiler warnings too. Nothing is saved to the activity feed. Rate-limited to 20 previews an hour per agent; an invalid draft does not count.","operationId":"McpAgentController_previewPersona","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Draft settings or free text. Preview does not publish and does not change history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPersonaDraftDto"},"examples":{"minimal":{"summary":"Preview the saved voice with the five default events","value":{}},"fullAllFields":{"summary":"Preview draft settings against one scenario","description":"`settings` wins over `style` and the free-text fields. They are shown together only to list every field.","value":{"style":"FRIENDLY","persona":"Warm and plain.","voice":"Short.","examples":"In. {token}. Nice.","bannedWords":"moon","settings":{"version":"settings-1","base":"DRY","identity":{"name":"Dry Ledger","modelledOn":[{"name":"Karl Pilkington","from":"An Idiot Abroad","note":"Bemused by everything, mildly put upon."}],"who":"A deadpan trader who states the trade and stops. Expects very little and is rarely disappointed.","voice":"Short, flat sentences. Undersells wins, shrugs at losses.","motive":"Undersell everything and point out how ridiculous it all is.","runningJoke":"Still waiting for the kettle."},"habits":{"casing":["sentence"],"punctuation":["light"],"directness":["measured"],"confidenceDisplay":["quiet"],"followerWords":["mate"],"emojiPool":["🙃","🫠"],"humourRate":[0.2,0.35],"swearRate":[0,0],"emojiRate":[0.05,0.15],"addressRate":[0.02,0.1]},"plan":{"length":{"short":50,"mid":40,"long":10},"shapes":{"fragment":1.2,"trail_off":1},"emoji":0.1,"caps":0,"question":0.1,"lineBreak":0.1,"address":0.05,"swear":0,"slang":0,"plain":0.3,"noFullStop":0.3,"lowercase":false},"analysis":{"rate":{"idea":0.6,"review":0.7},"styles":{"punchy":0.5,"proper":0.3,"split":0.2}},"emojiByMoment":{"win":["🙂"],"loss":[]},"bannedWords":["rocket"],"backupLines":[{"type":"loss","text":"Small one. Moving on."},{"states":["close_loss_small"],"text":"Stopped out. It happens.","when":{"closedBy":["stop"]}}],"examples":{"byMoment":{"open":["In. {token}. Fine."],"loss":["Well. That happened."]},"lines":["{token}. apparently."],"analysis":{"idea":{"punchy":["{token} broke the range high on volume. That is the whole thought."]}}}},"scenarios":[{"eventType":"TRADE_OPEN","tokenSymbol":"SOL","summary":"Opened a small SOL long","details":{"entryPrice":138,"reasoning":"Broke the range high on volume"}}]}}}}}},"responses":{"200":{"description":"Sample posts for each writer prompt.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AgentPersonaPreviewResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Preview rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Preview feed posts from draft persona","tags":["Agent"]}},"/api/v1/agents/{id}/persona/validate":{"post":{"description":"Compiles a draft without saving it or writing posts: the warnings, the lines the compiler would leave out, and the resolved settings. An invalid setting returns 400 with `error.field` naming it. No AI calls and no preview limit. Agent owner only.","operationId":"McpAgentController_validatePersona","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Free text or settings-1, the same body as publish.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPersonaBodyDto"},"examples":{"minimal":{"summary":"Pick a base voice as is","value":{"settings":{"version":"settings-1","base":"CALM"}}},"freeText":{"summary":"Free text on Blank (old fields)","value":{"persona":"A calm trader who states the trade and stops.","voice":"Short. No hype.","examples":"In. {token}. Liked the setup.\nClosed {token}. Moving on.","bannedWords":"moon, guaranteed"}},"fullAllFields":{"summary":"settings-1 with every section and field","value":{"settings":{"version":"settings-1","base":"DRY","identity":{"name":"Dry Ledger","modelledOn":[{"name":"Karl Pilkington","from":"An Idiot Abroad","note":"Bemused by everything, mildly put upon."}],"who":"A deadpan trader who states the trade and stops. Expects very little and is rarely disappointed.","voice":"Short, flat sentences. Undersells wins, shrugs at losses.","motive":"Undersell everything and point out how ridiculous it all is.","runningJoke":"Still waiting for the kettle."},"habits":{"casing":["sentence"],"punctuation":["light"],"directness":["measured"],"confidenceDisplay":["quiet"],"followerWords":["mate"],"emojiPool":["🙃","🫠"],"humourRate":[0.2,0.35],"swearRate":[0,0],"emojiRate":[0.05,0.15],"addressRate":[0.02,0.1]},"plan":{"length":{"short":50,"mid":40,"long":10},"shapes":{"fragment":1.2,"trail_off":1},"emoji":0.1,"caps":0,"question":0.1,"lineBreak":0.1,"address":0.05,"swear":0,"slang":0,"plain":0.3,"noFullStop":0.3,"lowercase":false},"analysis":{"rate":{"idea":0.6,"review":0.7},"styles":{"punchy":0.5,"proper":0.3,"split":0.2}},"emojiByMoment":{"win":["🙂"],"loss":[]},"bannedWords":["rocket"],"backupLines":[{"type":"loss","text":"Small one. Moving on."},{"states":["close_loss_small"],"text":"Stopped out. It happens.","when":{"closedBy":["stop"]}}],"examples":{"byMoment":{"open":["In. {token}. Fine."],"loss":["Well. That happened."]},"lines":["{token}. apparently."],"analysis":{"idea":{"punchy":["{token} broke the range high on volume. That is the whole thought."]}}}}}}}}}},"responses":{"200":{"description":"Compiled draft summary.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AgentPersonaValidationDto"}}}]}}}},"400":{"description":"Invalid settings. `error.field` names the setting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Check a draft feed persona","tags":["Agent"]}},"/api/v1/agents/{id}/persona/{version}/rollback":{"post":{"description":"Creates a new version with the content of an older version (append-only rollback). Agent owner only.","operationId":"McpAgentController_rollbackPersona","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"version","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"New persona version from rollback.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/AgentPersonaVersionDto"}}}]}}}},"400":{"description":"Invalid version number.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent or persona version not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Rollback feed persona","tags":["Agent"]}},"/api/v1/agents/{id}/telegram/verify":{"post":{"description":"Resolves the channel via Telegram Bot API, checks the EchoZero bot is present with read access, and persists `connectedChannels` + `signalSourceKind` on the agent.","operationId":"McpAgentController_verifyTelegramChannel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramVerifyChannelBodyDto"},"examples":{"minimal":{"summary":"Username","value":{"channel":"@MySignalsChannel"}},"fullAllFields":{"summary":"Full URL (same logical field)","value":{"channel":"https://t.me/MySignalsChannel"}}}}}},"responses":{"200":{"description":"Verification outcome; agent row updated unless channel could not be resolved.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/TelegramVerifyChannelResponseDto"}}}]}}}},"400":{"description":"Invalid channel or bad bot token configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"503":{"description":"SIGNAL_TELEGRAM_BOT_TOKEN not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Verify Telegram signal channel (bot membership)","tags":["Agent"]}},"/api/v1/agents/{id}/discord/oauth-url":{"get":{"description":"Returns an invite URL with `state` bound to this agent and developer. Redirect URI is `{MCP_ENDPOINT}/api/v1/agents/discord/oauth/callback`.","operationId":"McpAgentController_getDiscordOAuthUrl","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Invite URL and state token.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiscordOAuthUrlResponseDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"503":{"description":"Discord OAuth not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Discord bot-install OAuth URL (signed state)","tags":["Agent"]}},"/api/v1/agents/{id}/discord/verify":{"post":{"description":"Resolves the channel via Discord API, checks the EchoZero bot can read messages, and persists `connectedChannels` + `signalSourceKind` on the agent.","operationId":"McpAgentController_verifyDiscordChannel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscordVerifyChannelBodyDto"},"examples":{"channelIds":{"summary":"Guild + channel snowflakes","value":{"guildId":"9876543210987654321","channelId":"1234567890123456789"}},"channelUrl":{"summary":"Discord channel URL","value":{"channel":"https://discord.com/channels/9876543210987654321/1234567890123456789"}}}}}},"responses":{"200":{"description":"Verification outcome; agent row updated unless channel could not be resolved.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/DiscordVerifyChannelResponseDto"}}}]}}}},"400":{"description":"Invalid channel or bad bot token configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"503":{"description":"SIGNAL_DISCORD_BOT_TOKEN not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Verify Discord signal channel (bot access)","tags":["Agent"]}},"/api/v1/agents/{id}/duplicate":{"post":{"description":"Mirrors GraphQL `duplicateAgent`: creates a private copy with the same marketplace configuration; separate lifecycle (new strategies only).","operationId":"McpAgentController_duplicate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-ez-mcp-client","required":true,"in":"header","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDuplicateAgentBodyDto"}}}},"responses":{"200":{"description":"Created duplicate agent.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentListItemDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Source agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Duplicate agent","tags":["Agent"]}},"/api/v1/agents/{id}/subscription-price":{"post":{"description":"Creates or updates the Stripe Product + Price for paid marketplace access. Requires an active developer registration when `monthlyPriceUsd` > 0 (Stripe Connect is not required — creator payouts settle via wallet claim). A FREE agent's first switch to a paid price takes effect immediately for new subscribers, but existing subscribers keep free access and get a one-time notice (in-app + email) until a system-computed effective date, after which they must complete Stripe checkout to keep using the agent — see `effectiveDate` in the response.","operationId":"McpAgentController_setSubscriptionPrice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAgentSubscriptionPriceBodyDto"}}}},"responses":{"200":{"description":"Subscription price updated.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SetAgentSubscriptionPriceResponseDto"}}}]}}}},"400":{"description":"Invalid monthlyPriceUsd or catalog sync failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Set agent subscription price","tags":["Agent"]}},"/api/v1/agents/{id}/avatar":{"post":{"description":"Uploads an agent profile image using the existing storage provider and updates the owned Agent.imageUrl field. Accepts raw base64 with mimeType or a data URL.","operationId":"McpAgentController_uploadAvatar","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpUploadAgentAvatarBodyDto"}}}},"responses":{"200":{"description":"Uploaded agent avatar URL.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentAvatarUploadDataDto"}}}]}}}},"400":{"description":"Invalid base64 image or unsupported MIME type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Upload agent avatar from base64 image data","tags":["Agent"]}},"/api/v1/agents/{id}/follow":{"post":{"description":"Mirrors GraphQL `followAgent`. Idempotent: following an agent already followed returns the current state. Never touches allocation or trading.","operationId":"McpAgentController_follow","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Follow state.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentFollowStateDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found, deleted or not listed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Follow agent","tags":["Agent"]},"delete":{"description":"Mirrors GraphQL `unfollowAgent`. Idempotent: unfollowing an agent not followed returns the current state.","operationId":"McpAgentController_unfollow","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Follow state.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentFollowStateDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Invalid agent id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Unfollow agent","tags":["Agent"]}},"/api/v1/agents/{id}/pin":{"post":{"description":"Mirrors `pinAgent`.","operationId":"McpAgentController_pin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Pin result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentPinDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Pin agent","tags":["Agent"]},"delete":{"description":"Mirrors `unpinAgent`.","operationId":"McpAgentController_unpin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Unpin result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentPinDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Unpin agent","tags":["Agent"]}},"/api/v1/agents/discord/oauth/callback":{"get":{"description":"Validates signed `state`, then redirects to the developer portal with `agentId` and optional `discordGuildId`.","operationId":"McpAgentDiscordOAuthController_handleCallback","parameters":[{"name":"state","required":false,"in":"query","schema":{"type":"string"}},{"name":"guild_id","required":false,"in":"query","schema":{"type":"string"}},{"name":"error","required":false,"in":"query","schema":{"type":"string"}},{"name":"error_description","required":false,"in":"query","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Discord bot-install OAuth callback (browser redirect)","tags":["Agent"]}},"/api/v1/ai/chat":{"post":{"description":"Mirrors GraphQL `aiChat`.","operationId":"McpAiController_aiChat","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpAiChatBodyDto"},"examples":{"minimal":{"summary":"Single message","value":{"message":"What is the market sentiment for SOL today?"}},"fullAllFields":{"summary":"Continue global chat with agent context","value":{"message":"Compare this agent to a momentum strategy.","conversationId":"507f1f77bcf86cd799439011","agentId":"507f1f77bcf86cd799439012"}}}}}},"responses":{"200":{"description":"AI reply payload.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAiChatResponseDataDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Global AI chat","tags":["AI"]}},"/api/v1/ai/agents/{agentId}/chat":{"post":{"description":"Mirrors GraphQL `agentChat`. `agentId` is taken from the path; body is `message` and optional `conversationId`.","operationId":"McpAiController_agentChat","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpAgentScopedChatBodyDto"},"examples":{"minimal":{"summary":"Message only","value":{"message":"Pause my bot and summarize open risk."}},"fullAllFields":{"summary":"With conversation id","value":{"message":"Resume trading with previous allocation.","conversationId":"507f1f77bcf86cd799439011"}}}}}},"responses":{"200":{"description":"AI reply payload.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAiChatResponseDataDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Chat with a specific internal agent","tags":["AI"]}},"/api/v1/ai/agents/actions/execute":{"post":{"description":"Mirrors GraphQL `executeAgentAction`.","operationId":"McpAiController_executeAgentAction","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteAgentActionInput"},"examples":{"minimal":{"summary":"Pause bot (example payload)","value":{"type":"PAUSE_BOT","agentId":"507f1f77bcf86cd799439011","payloadJson":"{\"tradingBotId\":\"507f1f77bcf86cd799439012\"}"}},"fullAllFields":{"summary":"With optional context fields","value":{"type":"EXECUTE_TRADE","agentId":"507f1f77bcf86cd799439011","payloadJson":"{\"confirmationId\":\"conf_123\",\"amountUsd\":50,\"tokenAddress\":\"So11111111111111111111111111111111111111112\"}","conversationId":"507f1f77bcf86cd799439013","isVirtual":true}}}}}},"responses":{"200":{"description":"Whether the action ran successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"400":{"description":"Validation or business error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Execute a structured agent action","tags":["AI"]}},"/api/v1/ai/agents/{agentId}/history":{"get":{"description":"Mirrors GraphQL `agentChatHistory`. `agentId` is set from the path.","operationId":"McpAiController_agentChatHistory","parameters":[{"name":"agentId","required":true,"in":"path","schema":{"type":"string"}},{"name":"conversationId","required":false,"in":"query","description":"Conversation id filter","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"default":50,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Conversation rows with messages.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/McpAiConversationDataDto"}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Agent chat history","tags":["AI"]}},"/api/v1/ai/agents/chats":{"get":{"description":"Mirrors GraphQL `myAgentChats`.","operationId":"McpAiController_myAgentChats","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Agent ids with chat history.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/McpAgentWithChatDataDto"}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Agents you have chatted with","tags":["AI"]}},"/api/v1/ai/agents/histories":{"get":{"description":"Mirrors GraphQL `listAgentChatHistories`.","operationId":"McpAiController_listAgentChatHistories","parameters":[{"name":"agentId","required":false,"in":"query","schema":{"type":"string"}},{"name":"conversationId","required":false,"in":"query","schema":{"type":"string"}},{"name":"types","required":false,"in":"query","description":"Comma-separated `AiConversationType` values (e.g. `AGENT,VIBE_TRADE`)","schema":{"example":"AGENT,VIBE_TRADE","type":"string"}},{"name":"search","required":false,"in":"query","schema":{"maxLength":200,"type":"string"}},{"name":"timePeriods","required":false,"in":"query","description":"Comma-separated `ChatHistoryTimePeriod` values (e.g. `TODAY,THIS_WEEK`)","schema":{"example":"THIS_WEEK","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated history list.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAgentChatHistoryListDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"List agent chat histories","tags":["AI"]}},"/api/v1/ai/agents/history/{conversationId}":{"delete":{"description":"Mirrors GraphQL `deleteAgentChatHistory`.","operationId":"McpAiController_deleteAgentChatHistory","parameters":[{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Whether deletion succeeded.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Delete agent chat history","tags":["AI"]}},"/api/v1/ai/trades/quote":{"get":{"description":"Mirrors GraphQL `getTradeQuote`.","operationId":"McpAiController_getTradeQuote","parameters":[{"name":"action","required":true,"in":"query","schema":{"type":"string","enum":["BUY","SELL"]}},{"name":"tokenAddress","required":true,"in":"query","description":"Target token mint address","schema":{"type":"string"}},{"name":"amountUsd","required":true,"in":"query","description":"Amount in USD","schema":{"minimum":0.01,"type":"number"}},{"name":"baseTokenAddress","required":false,"in":"query","description":"Base token mint (optional)","schema":{"type":"string"}},{"name":"agentId","required":false,"in":"query","description":"Agent id for context","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Quote.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpTradeQuoteDataDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Trade quote (estimate)","tags":["AI"]}},"/api/v1/ai/trades/quote/refresh":{"post":{"description":"Mirrors GraphQL `refreshTradeQuote`.","operationId":"McpAiController_refreshTradeQuote","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpRefreshTradeQuoteBodyDto"},"examples":{"fullAllFields":{"summary":"Refresh by confirmation id","value":{"confirmationId":"conf_abc123"}}}}}},"responses":{"200":{"description":"Updated confirmation with fresh quote.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpTradeConfirmationDataDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Refresh trade quote","tags":["AI"]}},"/api/v1/ai/trades/confirm":{"post":{"description":"Mirrors GraphQL `confirmAgentTrade`.","operationId":"McpAiController_confirmAgentTrade","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmAgentTradeInput"},"examples":{"minimal":{"summary":"Confirm with ids","value":{"agentId":"507f1f77bcf86cd799439011","confirmationId":"conf_abc123"}},"fullAllFields":{"summary":"All optional fields","value":{"agentId":"507f1f77bcf86cd799439011","confirmationId":"conf_abc123","quoteId":"quote_xyz","isVirtual":true,"conversationId":"507f1f77bcf86cd799439012"}}}}}},"responses":{"200":{"description":"Execution result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpTradeExecutionResultDataDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Confirm agent trade","tags":["AI"]}},"/api/v1/ai/trades/decline":{"post":{"description":"Mirrors GraphQL `declineAgentTrade`.","operationId":"McpAiController_declineAgentTrade","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeclineAgentTradeInput"},"examples":{"minimal":{"summary":"Decline","value":{"agentId":"507f1f77bcf86cd799439011","confirmationId":"conf_abc123"}},"fullAllFields":{"summary":"With reason","value":{"agentId":"507f1f77bcf86cd799439011","confirmationId":"conf_abc123","reason":"Price moved too much","conversationId":"507f1f77bcf86cd799439012"}}}}}},"responses":{"200":{"description":"Whether decline was recorded.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Decline agent trade","tags":["AI"]}},"/api/v1/ai/support/chat":{"post":{"description":"Mirrors GraphQL `supportChat`.","operationId":"McpAiController_supportChat","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpAiChatBodyDto"},"examples":{"minimal":{"summary":"User message","value":{"message":"I cannot connect my wallet."}},"fullAllFields":{"summary":"Continue thread","value":{"message":"Here is a screenshot description: stuck on signing.","conversationId":"507f1f77bcf86cd799439011"}}}}}},"responses":{"200":{"description":"Support reply.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpAiChatResponseDataDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Support AI chat","tags":["AI"]}},"/api/v1/ai/support/chats":{"get":{"description":"Mirrors GraphQL `listSupportChats` (same filter shape as agent histories).","operationId":"McpAiController_listSupportChats","parameters":[{"name":"agentId","required":false,"in":"query","schema":{"type":"string"}},{"name":"conversationId","required":false,"in":"query","schema":{"type":"string"}},{"name":"types","required":false,"in":"query","description":"Comma-separated `AiConversationType` values (e.g. `AGENT,VIBE_TRADE`)","schema":{"example":"AGENT,VIBE_TRADE","type":"string"}},{"name":"search","required":false,"in":"query","schema":{"maxLength":200,"type":"string"}},{"name":"timePeriods","required":false,"in":"query","description":"Comma-separated `ChatHistoryTimePeriod` values (e.g. `TODAY,THIS_WEEK`)","schema":{"example":"THIS_WEEK","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["ASC","DESC"]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Support chat list.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSupportChatListDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"List support chats","tags":["AI"]}},"/api/v1/ai/support/chats/{conversationId}":{"get":{"description":"Mirrors GraphQL `getSupportChat`.","operationId":"McpAiController_getSupportChat","parameters":[{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Support chat with messages.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpSupportChatDetailDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Support chat detail","tags":["AI"]},"delete":{"description":"Mirrors GraphQL `deleteSupportChat`.","operationId":"McpAiController_deleteSupportChat","parameters":[{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Whether deletion succeeded.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Delete support chat","tags":["AI"]}},"/api/v1/ai/strategy/generate":{"post":{"description":"Mirrors GraphQL `generateBotStrategy` — returns a draft config, not a persisted Strategy entity.","operationId":"McpAiController_generateBotStrategy","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpBotStrategyPromptBodyDto"},"examples":{"minimal":{"summary":"Prompt only","value":{"prompt":"Conservative SOL swing bot with tight stop loss"}},"fullAllFields":{"summary":"All fields","value":{"prompt":"Aggressive memecoin scanner on Solana with take-profit tiers","chains":["SOLANA"],"riskLevel":"MID RISK","tags":["SOL","MEME"],"baseBotId":"507f1f77bcf86cd799439011","currentConfigJson":"{}"}}}}}},"responses":{"200":{"description":"Generated strategy suggestion.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpBotStrategySuggestionDataDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Generate strategy idea (AI draft)","tags":["AI"]}},"/api/v1/ai/strategy/save":{"post":{"description":"Mirrors GraphQL `saveStrategyAsBot` — persists a `CreateTradingBotInput` configuration.","operationId":"McpAiController_saveStrategyAsBot","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Same body as `POST /v1/strategies` / GraphQL `CreateTradingBotInput` — see **McpCreateTradingBotBodyDto**.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCreateTradingBotBodyDto"},"examples":{"minimal":{"summary":"Minimal create (draft)","description":"Required base fields: `status` (from GraphQL `BaseUserInput`) and `agentId`. Add more fields from **fullAllFields** as needed.","value":{"status":"DRAFT","agentId":"507f1f77bcf86cd799439011"}},"fullAllFields":{"summary":"All top-level fields (nested stubs)","description":"Every property on `CreateTradingBotInput` is shown. Nested `ConditionInput` includes all condition fields; deep validation rules live in `apps/gql-main/src/tradingBot/inputs/createTradingBot.input.ts`.","value":{"status":"DRAFT","botId":"507f1f77bcf86cd799439012","agentId":"507f1f77bcf86cd799439011","templateId":"507f1f77bcf86cd799439013","name":"Example strategy","description":"Short public description","tags":["SOL","DEFI"],"riskLevel":"MID RISK","tradingGoal":"CATCH_PUMPS","tokenSectorFocus":["SOL_ECOSYSTEM","MEME_NANO_CAP"],"creationMethod":"LOGIC_BASED","botTradeType":"SPOT","imageUrl":"https://cdn.example/bot.png","style":"PROFESSIONAL","customInstructions":"Risk-off in high volatility.","bio":"Automated momentum bot","interests":["TECH","SCIENCE"],"isPublic":true,"feeConfiguration":{"feePercentage":5,"chargeOnPerformance":true,"hideFromPublic":false},"tokenSelection":{"selectionType":"SPECIFIC","tokenAddresses":["So11111111111111111111111111111111111111112"],"tokens":["507f1f77bcf86cd799439014"],"targetToken":"507f1f77bcf86cd799439015","chain":"SOLANA"},"conditionGroups":[{"name":"Entry group","operator":"AND","decision":"OR","conditions":[{"type":"TOKEN_PRICE","conditionType":"PRICE","indicator":"RSI","sentiment":"IS_BULLISH","riskSentiment":"IS_RISK_ON","graduationStatus":"IS_GRADUATED","pumpFunLogic":"TRADING_VOLUME","cryptoLogic":"BTC_DOMINANCE","economyLogic":"VIX","amount":1.5,"operator":"GREATER_THAN","decision":"AND","value":"100","unit":"%","secondValue":"200","timeWindowHours":24,"timeFrame":"HOURS_4","volumeType":"TOTAL","walletActionType":"BUYS","transactionType":"BUY","specificTokenAddress":["So11111111111111111111111111111111111111112"],"tokenRef":"507f1f77bcf86cd799439016","walletAddress":"9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM","tokenSelection":{"selectionType":"ALL","chain":"SOLANA"},"expanded":true}]}],"groupsOperator":"AND","execution":{"mode":"FULL_TRADING","environment":"REAL"},"executionMode":"FULL_TRADING","alertsMode":true,"fullMode":false,"riskManagement":{"tradeSize":{"type":"FIXED","fixedAmountUsd":100,"percentageOfBalance":10},"stopLoss":{"type":"FIXED","percentage":5,"isAboveEntryPrice":false,"trailDistance":2,"enableLossAlert":true,"lossAlertThreshold":true},"profitTaking":{"type":"TIERED","fixedTargetUsd":500,"tiers":[{"action":"CLOSE_PART","whenClosePart":25,"whenPosition":10,"isIncrease":true}],"enableProfitAlert":true,"profitAlertThreshold":15},"leverage":3,"drawdownProtection":20,"positionType":"LONG"},"allocationConstraints":{"minPercentage":1,"maxPercentage":50,"minAmountUsd":10}}}}}}},"responses":{"200":{"description":"Created trading bot id.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"string","example":"507f1f77bcf86cd799439011"}},"required":["success","data"]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Save AI draft as trading bot","tags":["AI"]}},"/api/v1/wallet/mode":{"get":{"description":"Mirrors GraphQL `getWalletMode` (real vs virtual trading).","operationId":"McpWalletController_getMode","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Current wallet mode.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletModeStatusDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Get wallet mode","tags":["Wallet"]},"post":{"description":"Mirrors GraphQL `toggleWalletMode`.","operationId":"McpWalletController_toggleMode","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWalletToggleModeBodyDto`. GraphQL: `WalletModeArgs` in `apps/gql-main/src/wallet/args/walletMode.args.ts`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWalletToggleModeBodyDto"},"examples":{"minimal":{"summary":"Toggle (implicit)","value":{}},"fullAllFields":{"summary":"Set virtual mode explicitly","value":{"isVirtualMode":true}}}}}},"responses":{"200":{"description":"Updated mode.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletModeToggleDataDto"}}}]}}}}},"security":[{"api-key":[]}],"summary":"Toggle wallet mode","tags":["Wallet"]}},"/api/v1/wallet/chart":{"get":{"description":"Mirrors GraphQL `historicalChartData` (EchoZero chart: prices, market caps, volumes).","operationId":"McpWalletController_historicalChart","parameters":[{"name":"duration","required":false,"in":"query","description":"Chart window (defaults to ~7 days behavior when omitted, per GraphQL).","schema":{"type":"string","enum":["ONE_YEAR","ONE_MONTH","ONE_WEEK","ONE_DAY"]}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Chart series.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletHistoricalChartDataDto"}}}]}}}}},"security":[{"api-key":[]}],"summary":"Historical chart data","tags":["Wallet"]}},"/api/v1/wallet/trades/search":{"get":{"description":"Mirrors GraphQL `searchWalletTrades`.","operationId":"McpWalletController_searchTrades","parameters":[{"name":"query","required":true,"in":"query","description":"Search by token name or bot name","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"isActive","required":false,"in":"query","description":"Filter to active trades only (omit for all)","schema":{"type":"boolean"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Search results.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletTradeSearchDataDto"}}}]}}}}},"security":[{"api-key":[]}],"summary":"Search wallet trades","tags":["Wallet"]}},"/api/v1/wallet/deposit":{"post":{"description":"Mirrors GraphQL `depositFunds`. Requires HMAC signing. Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpWalletController_deposit","parameters":[{"name":"Idempotency-Key","in":"header","description":"Optional. Replaying the same key for the same user returns the cached result without a second deposit.","required":false,"schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWalletOperationBodyDto`. GraphQL: `WalletOperationArgs` in `apps/gql-main/src/wallet/args/walletOperation.args.ts`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWalletOperationBodyDto"},"examples":{"minimal":{"summary":"USDC amount only (default mint)","value":{"amount":25}},"fullAllFields":{"summary":"All fields","value":{"amount":100,"tokenMint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","toAddress":"So11111111111111111111111111111111111111112"}}}}}},"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletOperationDataDto"}}}]}}}}},"security":[{"api-key":[]}],"summary":"Deposit funds","tags":["Wallet"]}},"/api/v1/wallet/withdraw":{"post":{"description":"Mirrors GraphQL `withdrawFunds`. Requires HMAC signing. Withdrawals that require MFA return MFA_VERIFICATION_REQUIRED — complete MFA in the main app, then retry. API-key sessions cannot satisfy withdrawal MFA. Real withdraws share the wallet spend reservation with buy/sell. Concurrent same-mint transfers fail with WITHDRAWAL_IN_PROGRESS. Redis down returns WALLET_LOCK_UNAVAILABLE. Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpWalletController_withdraw","parameters":[{"name":"Idempotency-Key","in":"header","description":"Optional. Replaying the same key for the same user returns the cached result without a second withdrawal.","required":false,"schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWalletOperationBodyDto`. `toAddress` is required for withdrawal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWalletOperationBodyDto"},"examples":{"minimal":{"summary":"USDC amount only (default mint)","value":{"amount":25}},"fullAllFields":{"summary":"All fields","value":{"amount":100,"tokenMint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","toAddress":"So11111111111111111111111111111111111111112"}}}}}},"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletOperationDataDto"}}}]}}}}},"security":[{"api-key":[]}],"summary":"Withdraw funds","tags":["Wallet"]}},"/api/v1/wallet/buy":{"post":{"description":"Mirrors GraphQL `buyTokens`. Requires HMAC signing. Fresh buys return `openTradeUpdatePending` and create the Trade row only after on-chain finality. Real buy/sell/withdraw share one wallet spend reservation. A contended reserve returns TRADE_IN_PROGRESS; overlapping USDC fails with INSUFFICIENT_BALANCE. Redis down returns WALLET_LOCK_UNAVAILABLE. Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpWalletController_buy","parameters":[{"name":"Idempotency-Key","in":"header","description":"Optional. Replaying the same key for the same user returns the cached result without a second buy.","required":false,"schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWalletBuySellBodyDto`. GraphQL: `WalletBuySellOperationArgs` in `apps/gql-main/src/wallet/args/walletOperation.args.ts`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWalletBuySellBodyDto"},"examples":{"minimal":{"summary":"USDC amount + output/input mint (no risk fields)","value":{"amount":25,"tokenMint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"}},"fullAllFields":{"summary":"All body fields including SL + TP","value":{"amount":50,"tokenMint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","toAddress":"So11111111111111111111111111111111111111112","stopLoss":{"type":"FIXED","percentage":10,"triggerPrice":0.15,"trailDistance":5},"takeProfit":{"type":"FIXED","fixedTargetUsd":500,"targetPercentage":25,"triggerPrice":0.22}}}}}}},"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletOperationDataDto"}}}]}}}}},"security":[{"api-key":[]}],"summary":"Buy tokens","tags":["Wallet"]}},"/api/v1/wallet/sell":{"post":{"description":"Mirrors GraphQL `sellTokens`. Requires HMAC signing. Only reduces the user's own manual open BUY lots after on-chain finality — agent-created positions are closed via the trade close / manage endpoints, and a sell larger than the manual lots is rejected with `SELL_EXCEEDS_MANUAL_POSITION` before any swap. Failed swaps leave lots unchanged. Real buy/sell/withdraw share one wallet spend reservation. Redis down returns WALLET_LOCK_UNAVAILABLE. Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpWalletController_sell","parameters":[{"name":"Idempotency-Key","in":"header","description":"Optional. Replaying the same key for the same user returns the cached result without a second sell.","required":false,"schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWalletBuySellBodyDto`. GraphQL: `WalletBuySellOperationArgs`. Sell with SL/TP requires exactly one open manual BUY for the mint unless using linked manage-trade flows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWalletBuySellBodyDto"},"examples":{"minimal":{"summary":"USDC amount + output/input mint (no risk fields)","value":{"amount":25,"tokenMint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"}},"fullAllFields":{"summary":"All body fields including SL + TP","value":{"amount":50,"tokenMint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","toAddress":"So11111111111111111111111111111111111111112","stopLoss":{"type":"FIXED","percentage":10,"triggerPrice":0.15,"trailDistance":5},"takeProfit":{"type":"FIXED","fixedTargetUsd":500,"targetPercentage":25,"triggerPrice":0.22}}}}}}},"responses":{"200":{"description":"Operation result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletOperationDataDto"}}}]}}}}},"security":[{"api-key":[]}],"summary":"Sell tokens","tags":["Wallet"]}},"/api/v1/wallet/virtual/add-funds":{"post":{"description":"Mirrors GraphQL `addFundsToVirtualWallet` (primary `amountInUsdc`; deprecated `amountInSol`). Body must include a positive `amountInUsdc` and/or `amountInSol` (empty body → 400). Frozen wallets return WALLET_FROZEN / HTTP 403.","operationId":"McpWalletController_addVirtualFunds","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpWalletAddVirtualFundsBodyDto`. GraphQL: `AddFundsToVirtualWalletArgs` in `apps/gql-main/src/wallet/args/walletOperation.args.ts`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpWalletAddVirtualFundsBodyDto"},"examples":{"minimal":{"summary":"Add USDC to paper wallet","value":{"amountInUsdc":100}},"fullAllFields":{"summary":"USDC primary + deprecated SOL alias","value":{"amountInUsdc":250,"amountInSol":1.5}}}}}},"responses":{"200":{"description":"Virtual credit result.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpWalletAddVirtualFundsDataDto"}}}]}}}}},"security":[{"api-key":[]}],"summary":"Add virtual funds","tags":["Wallet"]}},"/api/v1/notifications/counts":{"get":{"description":"Mirrors GraphQL `myNotificationCountsByType`.","operationId":"McpNotificationController_counts","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Counts grouped by notification type.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpNotificationCountsDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Notification counts by type","tags":["Notification"]}},"/api/v1/notifications":{"get":{"description":"Mirrors GraphQL `myNotifications`. Returns `items` + `pagination` (see `PaginatedResponse`) plus `totalUnreadCount` (global unread, not page-only).","operationId":"McpNotificationController_myNotifications","parameters":[{"name":"limit","required":false,"in":"query","description":"Page size (max 100)","schema":{"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"order","required":false,"in":"query","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"orderBy","required":false,"in":"query","description":"Sort field. `urgency` ranks Needs you (ALERT first) then newest `_id`. `order` is ignored for `urgency`.","schema":{"default":"_id","type":"string","enum":["_id","sendsAt","markAsRead","urgency"]}},{"name":"query","required":false,"in":"query","description":"Search in title and body (same as GraphQL filter.query)","schema":{"type":"string"}},{"name":"types","required":false,"in":"query","description":"Comma-separated `NotificationType` values (e.g. `TRADE_EXECUTION,WALLET_TRANSACTION`)","schema":{"type":"string"}},{"name":"unreadOnly","required":false,"in":"query","description":"true = unread only, false = read only, omit = all","schema":{"type":"boolean"}},{"name":"needsYou","required":false,"in":"query","description":"true = Needs you only (open actions). Read state is ignored. A failed payment stays until billing is no longer past due.","schema":{"type":"boolean"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated notifications with unread total.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/McpNotificationsListDataDto"}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"List my notifications","tags":["Notification"]},"delete":{"description":"Mirrors GraphQL `deleteNotifications` (owner-scoped: only the caller’s notifications are deleted). Request body lists ids — some HTTP clients omit DELETE bodies; use a client that sends JSON if needed.","operationId":"McpNotificationController_deleteNotifications","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpNotificationIdsBodyDto`. GraphQL: `FindByIdsArgs`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpNotificationIdsBodyDto"},"examples":{"minimal":{"summary":"Single id","value":{"ids":["507f1f77bcf86cd799439011"]}},"fullAllFields":{"summary":"Multiple ids","value":{"ids":["507f1f77bcf86cd799439011","507f191e810c19729de860ea"]}}}}}},"responses":{"200":{"description":"Delete acknowledged.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Delete notifications","tags":["Notification"]}},"/api/v1/notifications/mark-read":{"post":{"description":"Mirrors GraphQL `markAsReadNotifications`.","operationId":"McpNotificationController_markAsRead","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpNotificationIdsBodyDto`. GraphQL: `FindByIdsArgs` in `libs/common/src/types/args/findByIds.args.ts`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpNotificationIdsBodyDto"},"examples":{"minimal":{"summary":"Single id","value":{"ids":["507f1f77bcf86cd799439011"]}},"fullAllFields":{"summary":"Multiple ids","value":{"ids":["507f1f77bcf86cd799439011","507f191e810c19729de860ea"]}}}}}},"responses":{"200":{"description":"Update acknowledged.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Mark notifications as read","tags":["Notification"]}},"/api/v1/notifications/dismiss-needs-you":{"post":{"description":"Mirrors GraphQL `dismissNeedsYouNotifications`. Only security warning types are updated. Payment, card, alert, membership, and balance rows stay until the live condition clears.","operationId":"McpNotificationController_dismissNeedsYou","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpNotificationIdsBodyDto`. GraphQL: `FindByIdsArgs` in `libs/common/src/types/args/findByIds.args.ts`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpNotificationIdsBodyDto"},"examples":{"minimal":{"summary":"Single id","value":{"ids":["507f1f77bcf86cd799439011"]}},"fullAllFields":{"summary":"Multiple ids","value":{"ids":["507f1f77bcf86cd799439011","507f191e810c19729de860ea"]}}}}}},"responses":{"200":{"description":"Dismiss acknowledged.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Dismiss security warnings from Needs you","tags":["Notification"]}},"/api/v1/notifications/mark-all-read":{"post":{"description":"Mirrors GraphQL `markAllNotificationsAsRead`.","operationId":"McpNotificationController_markAllRead","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Update acknowledged.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Mark all notifications as read","tags":["Notification"]}},"/api/v1/notifications/settings":{"patch":{"description":"Mirrors GraphQL `updateNotificationSettings` (push/email category toggles).","operationId":"McpNotificationController_updateSettings","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"OpenAPI: `McpUpdateNotificationSettingsBodyDto`. GraphQL: `UpdateNotificationSettingsInput` in `apps/gql-main/src/notification/inputs/updateNotificationSettings.input.ts`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpUpdateNotificationSettingsBodyDto"},"examples":{"minimal":{"summary":"Toggle one app channel","value":{"appPermission":{"agentUpdates":true}}},"fullAllFields":{"summary":"All app and email permission keys","value":{"appPermission":{"newsAndOffers":true,"tipsAndHelp":true,"tradeExecution":true,"agentUpdates":true,"botAlerts":true},"emailPermission":{"newsAndOffers":false,"tipsAndHelp":true,"tradeExecution":false,"agentUpdates":true,"botAlerts":false},"bundleTradeDailySummary":true,"bundleTradeEmailDailySummary":false}}}}}},"responses":{"200":{"description":"Settings saved.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Update notification settings","tags":["Notification"]}},"/oauth/client":{"get":{"description":"Used by the Dev Portal consent page to validate client_id and redirect_uri before approval or denial.","operationId":"McpOAuthController_lookupClient","parameters":[{"name":"client_id","required":true,"in":"query","schema":{"example":"echozero-cli","type":"string"}},{"name":"redirect_uri","required":true,"in":"query","schema":{"example":"http://127.0.0.1:8765/callback","type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Look up a registered OAuth client","tags":["OAuth"]}},"/oauth/authorize":{"get":{"description":"Authorization-code + PKCE endpoint for AI assistant clients. Accepts a user JWT via Authorization bearer or local consent form.","operationId":"McpOAuthController_authorize","parameters":[{"name":"response_type","required":true,"in":"query","schema":{"example":"code","type":"string"}},{"name":"client_id","required":true,"in":"query","schema":{"example":"echozero-cli","type":"string"}},{"name":"redirect_uri","required":true,"in":"query","schema":{"example":"http://127.0.0.1:8765/callback","type":"string"}},{"name":"scope","required":true,"in":"query","description":"Space-delimited OAuth scopes mapped to MCP API scopes.","schema":{"example":"read:agents read:strategies write:agents","type":"string"}},{"name":"state","required":true,"in":"query","schema":{"type":"string"}},{"name":"code_challenge","required":true,"in":"query","schema":{"type":"string"}},{"name":"code_challenge_method","required":true,"in":"query","schema":{"example":"S256","type":"string"}},{"name":"access_token","required":false,"in":"query","description":"User JWT access token for browserless/local flows. Prefer Authorization: Bearer in API clients.","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"OAuth 2.1 authorization endpoint","tags":["OAuth"]}},"/oauth/authorize/approve":{"post":{"description":"Used by the Dev Portal consent page to mint an authorization code without putting the user JWT in a URL.","operationId":"McpOAuthController_approve","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthAuthorizeQueryDto"}}}},"responses":{"201":{"description":""}},"summary":"Approve an OAuth request from the Dev Portal","tags":["OAuth"]}},"/oauth/token":{"post":{"operationId":"McpOAuthController_token","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenBodyDto"}}}},"responses":{"201":{"description":""}},"summary":"Exchange authorization code for OAuth token","tags":["OAuth"]}},"/oauth/introspect":{"post":{"operationId":"McpOAuthController_introspect","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthIntrospectBodyDto"}}}},"responses":{"201":{"description":""}},"summary":"Introspect an EchoZero OAuth token","tags":["OAuth"]}},"/status":{"get":{"description":"Verification endpoint for `ez login`, the skills and the dev portal setup flow. Accepts an OAuth token or a user JWT (`Authorization: Bearer`), or an API key (`x-api-key` or `Authorization: Bearer ez_…`). Read-only, so API-key callers do not sign it. Reports whether the user is a registered developer, which webhook agents need.","operationId":"McpOAuthController_status","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponseDto"}}}},"401":{"description":"Missing, invalid or expired credential"}},"summary":"Verify the caller credential","tags":["OAuth"]}},"/api/v1/auth/check-username":{"post":{"description":"Mirrors GraphQL `isUsernameExists`. No API key.","operationId":"McpAuthCheckController_checkUsername","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCheckUsernameBodyDto"},"examples":{"minimal":{"summary":"Username","value":{"username":"existing_user"}}}}}},"responses":{"200":{"description":"`true` if username exists.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}}},"summary":"Check if username is taken","tags":["Auth"]}},"/api/v1/auth/check-email":{"post":{"description":"Mirrors GraphQL `isEmailExists`. No API key.","operationId":"McpAuthCheckController_checkEmail","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCheckEmailBodyDto"},"examples":{"minimal":{"summary":"Email","value":{"email":"someone@example.com"}}}}}},"responses":{"200":{"description":"`true` if email exists.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"boolean","description":"Operation result"}},"required":["success","data"]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"summary":"Check if email is registered","tags":["Auth"]}},"/api/v1/statics/countries":{"get":{"description":"Returns `data` as `string[]` (`CountryCode` values).","operationId":"McpStaticsController_countries","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"{ success: true, data: string[] }"}},"summary":"List country codes","tags":["Statics"]}},"/api/v1/statics/languages":{"get":{"description":"Returns `data` as `string[]` (`Lang` values).","operationId":"McpStaticsController_languages","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"{ success: true, data: string[] }"}},"summary":"List language codes","tags":["Statics"]}},"/api/v1/earn/referral-registration":{"get":{"description":"Mirrors GraphQL `referralRegistrationData`. Optional `referralCode` query. No API key.","operationId":"McpEarnPublicController_referralRegistration","parameters":[{"name":"referralCode","required":true,"in":"query","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"ReferralRegistrationDataResponse-shaped `data`"}},"summary":"Referral registration page data","tags":["Earn"]}},"/api/v1/earn/leaderboard":{"get":{"description":"Mirrors GraphQL `leaderboard`.","operationId":"McpEarnController_leaderboard","parameters":[{"name":"startDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"`data.leaderboard` array"},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Referral leaderboard","tags":["Earn"]}},"/api/v1/earn/rewards":{"get":{"description":"Mirrors GraphQL `rewardsData`.","operationId":"McpEarnController_rewards","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Rewards and XP","tags":["Earn"]}},"/api/v1/earn/referral-link":{"get":{"description":"Mirrors GraphQL `referralLink`.","operationId":"McpEarnController_referralLink","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Referral link","tags":["Earn"]}},"/api/v1/earn/weekly-progress":{"get":{"description":"Mirrors GraphQL `weeklyProgress`.","operationId":"McpEarnController_weeklyProgress","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Weekly referral progress","tags":["Earn"]}},"/api/v1/earn/levels":{"get":{"description":"Mirrors GraphQL `xpLevels`.","operationId":"McpEarnController_xpLevels","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"`data.levels`"},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"All XP levels","tags":["Earn"]}},"/api/v1/earn/levels/{name}":{"get":{"description":"Mirrors GraphQL `xpLevel`. Path uses `LevelName` (e.g. `Wood`, `Gold`).","operationId":"McpEarnController_xpLevel","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Invalid level name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"XP level by name","tags":["Earn"]}},"/api/v1/earn/shared-count":{"get":{"description":"Mirrors GraphQL `totalUsersSharedOnX`.","operationId":"McpEarnController_sharedCount","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"X (Twitter) share social proof","tags":["Earn"]}},"/api/v1/earn/claim":{"post":{"description":"Mirrors GraphQL `claimReward` mutation.","operationId":"McpEarnController_claim","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Claim rewards","tags":["Earn"]}},"/api/v1/activities":{"get":{"description":"Mirrors GraphQL `activities`. Optional `filterJson` encodes GraphQL `TradeFilterInput`. Response maps to `PaginatedResponse` (`items` + `pagination`).","operationId":"McpActivityController_list","parameters":[{"name":"limit","required":false,"in":"query","schema":{"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"order","required":false,"in":"query","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"TIMESTAMP","type":"string","enum":["TIMESTAMP","AMOUNT","FEE","SLOT","CREATED_AT","UPDATED_AT","STATUS","TYPE","CHAIN","PROFIT_AMOUNT","PROFIT_PERCENTAGE","POSITION_VALUE","FIRST_OPENED","FIRST_CLOSED","RUNTIME","PNL","PNL_PERCENTAGE","TRADE_STATE","TIME","TOKEN_SYMBOL","TOKEN_NAME","BOT_NAME","SIGNATURE","WALLET_ADDRESS","IS_BOT_TRADE","IS_VIRTUAL","TRADING_BOT_ID","TRADE_ID","TOKEN_MINT"]}},{"name":"filterJson","required":false,"in":"query","description":"JSON string of GraphQL TradeFilterInput","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"`PaginatedResponse`: `items` = activities, `pagination` from total count."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"List trade activities","tags":["Activity"]}},"/api/v1/activities/search/strategies":{"get":{"description":"Mirrors GraphQL `searchActivityTradingBots`.","operationId":"McpActivityController_searchStrategies","parameters":[{"name":"limit","required":false,"in":"query","schema":{"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"order","required":false,"in":"query","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"`PaginatedResponse` of bot rows."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Search bots you have activity with","tags":["Activity"]}},"/api/v1/activities/search/tokens":{"get":{"description":"Mirrors GraphQL `searchActivityTokens`.","operationId":"McpActivityController_searchTokens","parameters":[{"name":"limit","required":false,"in":"query","schema":{"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"order","required":false,"in":"query","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"`PaginatedResponse` of token rows."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Search tokens you have activity with","tags":["Activity"]}},"/api/v1/feed":{"get":{"description":"Mirrors GraphQL `activityFeed`. `filter` and `types` are comma-separated enums. Reaction fields (`reactions`, `viewerReaction`) and `resolvedToken` are GraphQL-only and are stripped here; there is no MCP react mutation.","operationId":"McpActivityFeedController_feed","parameters":[{"name":"limit","required":false,"in":"query","schema":{"default":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"order","required":false,"in":"query","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"filter","required":false,"in":"query","description":"Comma-separated ActivityFeedFilter: PERSONAL,SUBSCRIBED,RECOMMENDED. Omit, or pass SUBSCRIBED,RECOMMENDED together, for all activities including owned.","schema":{"type":"string"}},{"name":"types","required":false,"in":"query","description":"Comma-separated ActivityFeedType values","schema":{"type":"string"}},{"name":"agentId","required":false,"in":"query","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"`PaginatedResponse`: `items` = feed rows."},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Activity feed","tags":["Feed"]}},"/api/v1/uploads/generate-urls":{"post":{"description":"Mirrors GraphQL `generateUploadUrls`. If `type` is in auth-required types (e.g. AVATAR), `x-api-key` must resolve to a user.","operationId":"McpUploadController_generateUrls","parameters":[{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpGenerateUploadUrlsBodyDto"},"examples":{"minimal":{"summary":"Single image","value":{"mimeTypes":["image/png"],"type":"BOT_IMAGE"}},"fullAllFields":{"summary":"Multiple MIME types","value":{"mimeTypes":["image/jpeg","image/webp"],"type":"AVATAR"}},"developerAgentProfile":{"summary":"Developer agent profile image (Dev Portal)","value":{"mimeTypes":["image/png"],"type":"DEVELOPER_AGENT_IMAGE"}}}}}},"responses":{"200":{"description":"Signed URL rows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/McpGeneratedUploadUrlItemDto"}}}}]}}}},"401":{"description":"Invalid API key when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"api-key":[]}],"summary":"Generate signed upload URLs","tags":["Misc"]}},"/api/sandbox/agents/{id}/trade":{"post":{"description":"Dry-run sandbox endpoint. Validates ownership and returns a simulated trade result without any real execution.","operationId":"SandboxController_simulateTrade","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxTradeSimulationRequestDto"}}}},"responses":{"201":{"description":"Sandbox trade simulated.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SandboxTradeSimulationResponseDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"403":{"description":"Not a registered developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Simulate a developer-agent trade","tags":["Sandbox"]}},"/api/sandbox/agents/{id}/signals/simulate":{"post":{"description":"Dry-run sandbox parser for raw signal text. Uses the agent signal detection rule when configured, and stores the simulation in ephemeral sandbox history for the selected agent.","operationId":"SandboxController_simulateSignal","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSignalSimulationRequestDto"}}}},"responses":{"201":{"description":"Signal simulation completed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"$ref":"#/components/schemas/SandboxSignalSimulationResponseDto"}}}]}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Simulate an agent signal message","tags":["Sandbox"]}},"/api/sandbox/agents/{id}/signals":{"get":{"description":"Returns ephemeral dry-run signal history recorded through the sandbox simulator for the selected agent.","operationId":"SandboxController_signalHistory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Sandbox signal history.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/McpSuccessResponseDto"},{"properties":{"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SandboxSignalHistoryItemResponseDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"}}}}}]}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}},"404":{"description":"Agent not found or not owned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpErrorResponseDto"}}}}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"List sandbox signal simulations for an agent","tags":["Sandbox"]}},"/mcp":{"post":{"description":"Requires **Authorize** (`x-api-key`) and a JSON-RPC body. Use **Accept**: `application/json, text/event-stream` and **Content-Type**: `application/json`. First call is usually `initialize`; response includes `mcp-session-id` — send it on later requests as header `mcp-session-id`.","operationId":"McpProtocolController_postMcp","parameters":[{"name":"Accept","in":"header","description":"Must list both `application/json` and `text/event-stream` (MCP Streamable HTTP).","required":true,"schema":{"type":"string","default":"application/json, text/event-stream"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Single JSON-RPC request or batch array.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":true},{"type":"array","items":{"type":"object","additionalProperties":true}}]},"examples":{"initialize":{"summary":"initialize","value":{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"swagger","version":"1.0.0"}}}},"toolsList":{"summary":"tools/list","value":{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}}}}}},"responses":{"200":{"description":"JSON or SSE per MCP transport. Response headers may include `mcp-session-id` (after initialize) and `X-Mcp-Instance-Id` (which replica served the request; use with load balancer sticky sessions). See `MCP_DEPLOYMENT_SCALING.md`."},"401":{"description":"Missing or invalid API key (JSON-RPC error body on this route)."}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"MCP JSON-RPC over Streamable HTTP","tags":["MCP Protocol"]},"delete":{"description":"Requires **Authorize** and **mcp-session-id** matching the session to close.","operationId":"McpProtocolController_deleteMcp","parameters":[{"name":"mcp-session-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"Session closed"}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"Terminate MCP session","tags":["MCP Protocol"]}},"/mcp/sse":{"get":{"description":"Requires **Authorize** and header **mcp-session-id** from `initialize`. **Accept**: `text/event-stream`.","operationId":"McpProtocolController_getMcpSse","parameters":[{"name":"mcp-session-id","in":"header","description":"Session id returned by `POST /mcp` after initialize.","required":true,"schema":{"type":"string"}},{"name":"Accept","in":"header","required":true,"schema":{"type":"string","default":"text/event-stream"}},{"name":"x-signature","in":"header","required":true,"description":"Required for API-key authenticated requests. HMAC-SHA256(secretKey, timestamp + METHOD + path + body) as lowercase hex. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}},{"name":"x-timestamp","in":"header","required":true,"description":"Required with x-signature. Epoch milliseconds; rejected if drift exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public routes.","schema":{"type":"string"}}],"responses":{"200":{"description":"SSE stream"},"400":{"description":"Missing session or invalid headers"}},"security":[{"bearer-jwt":[]},{"api-key":[]}],"summary":"MCP SSE stream","tags":["MCP Protocol"]}}},"info":{"title":"EchoZero MCP API","description":"EchoZero MCP Server - Developer API for agent management, trading, marketplace, and AI chat.\n\n**Rate Limiting:** All endpoints enforce per-API-key rate limits. Tiers: free (60 req/min), standard (300 req/min), premium (1000 req/min). Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` headers. Exceeding the limit returns `429 Too Many Requests` with a `Retry-After` header.","version":"1.0","contact":{}},"tags":[{"name":"MCP Protocol","description":"Model Context Protocol (Streamable HTTP): `/mcp`, `/mcp/sse` — not under `/api`; same API key as REST"},{"name":"Health","description":"Server health check"},{"name":"API Keys","description":"API key generation, listing, and revocation"},{"name":"User","description":"User profile, sessions, social, onboarding, internal agent subscriptions, and bot activations (v1: /v1/users/me)"},{"name":"Token","description":"Token data and trending"},{"name":"Trade","description":"Trade execution and history"},{"name":"Strategy","description":"Strategy (trading bot) configuration and control"},{"name":"Agent","description":"Agent registration and management"},{"name":"AI","description":"AI chat, intent, and insights"},{"name":"Wallet","description":"Wallet operations, deposits, and withdrawals"},{"name":"Notification","description":"Notification management and settings"},{"name":"Auth","description":"Public authentication: signup / login lookup, code verification, Google OAuth, refresh, and sign-out. Returns `accessToken` / `refreshToken` in the JSON body."},{"name":"OAuth","description":"OAuth 2.1 authorization-code + PKCE for AI assistant clients: `/oauth/authorize`, `/oauth/token`, `/oauth/introspect`, `/status`."},{"name":"Activity","description":"User trade activity list and search"},{"name":"Feed","description":"Social activity feed timeline"},{"name":"Earn","description":"Leaderboard, rewards, and referrals"},{"name":"Statics","description":"Countries, languages, and static data"},{"name":"Misc","description":"File uploads and utility endpoints"},{"name":"Developer","description":"Developer registration and profile"},{"name":"Developer dashboard","description":"Per-agent dashboard: subscribers (anonymized), performance detail, signal history (v1)"},{"name":"Developer Agent","description":"Developer agent listings and management"},{"name":"Developer Agents (Marketplace)","description":"Public browse, search, and subscribe to external developer-listed agents"}],"servers":[{"url":"https://mcp.echozero.app","description":"Production"}],"components":{"securitySchemes":{"api-key":{"type":"apiKey","in":"header","name":"x-api-key"},"bearer-jwt":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"User JWT access token issued by `POST /api/auth/verify` or `POST /api/auth/social/verify`. Routes that accept both auth modes declare `api-key` *and* `bearer-jwt` security schemes."}},"schemas":{"McpSuccessResponseDto":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","description":"Endpoint-specific payload","additionalProperties":true}},"required":["success","data"]},"HealthResponseDto":{"type":"object","properties":{"Status":{"type":"string","example":"Success"}},"required":["Status"]},"McpAuthTokensDto":{"type":"object","properties":{"accessToken":{"type":"string","description":"Short-lived JWT access token. Send as `Authorization: Bearer <token>`."},"refreshToken":{"type":"string","description":"Long-lived opaque refresh token. Exchange via `POST /auth/refresh`."},"mfaAccessToken":{"type":"string","description":"JWT issued when the account requires MFA verification before login can complete."}}},"McpAuthUserDto":{"type":"object","properties":{"id":{"type":"string","example":"507f1f77bcf86cd799439011"},"username":{"type":"string","example":"alice_bob"},"email":{"type":"string","example":"alice@example.com"},"languageCode":{"type":"string","enum":["EN","PT","ES","RU","FR","JA","UK","TR"]},"emailVerifiedAt":{"type":"string","format":"date-time"}},"required":["id","username"]},"McpRequestAuthLookupBodyDto":{"type":"object","properties":{"email":{"type":"string","description":"The user's email address to which the lookup code will be sent.","example":"alice@example.com"},"recaptcha":{"type":"string","description":"reCAPTCHA token. Verification is skipped automatically in non-production environments.","example":"recaptcha_token_here"},"fingerprint":{"type":"string","description":"Device fingerprint / visitor id generated by the client for session binding.","example":"fp_browser_abc123"},"username":{"type":"string","description":"Desired username (only used when registering a new user).","minLength":5,"example":"alice_bob"},"receiveMarketingOffers":{"type":"boolean","description":"Opt-in to marketing offers / communications (new users only)."},"agreedToTerms":{"type":"boolean","description":"Indicates the user has accepted the platform's terms and conditions (new users only)."},"promoCode":{"type":"string","description":"Promotional code (new users only).","example":"WELCOME2025"},"referralCode":{"type":"string","description":"Referral code from an invitation link (new users only).","example":"REF-ABC-123"},"referrerUsername":{"type":"string","description":"Username of the referring user (new users only).","example":"referrer_user"},"referrerUserId":{"type":"string","description":"User id of the referring user (new users only).","example":"507f1f77bcf86cd799439011"}},"required":["email","recaptcha","fingerprint"]},"McpVerifyAuthLookupBodyDto":{"type":"object","properties":{"email":{"type":"string","description":"Same email as in `/auth/lookup` (required for both login and signup verification).","example":"alice@example.com"},"code":{"type":"string","description":"Numeric verification code emailed to the user.","example":"123456"},"recaptcha":{"type":"string","description":"reCAPTCHA token. Verification is skipped automatically in non-production environments.","example":"recaptcha_token_here"}},"required":["email","code","recaptcha"]},"McpAuthWithSocialBodyDto":{"type":"object","properties":{"type":{"type":"string","enum":["GOOGLE","FACEBOOK","APPLE","TWITTER","DISCORD","TELEGRAM"],"description":"Social provider. Only `GOOGLE` is currently exposed on the MCP REST API.","example":"GOOGLE"},"fingerprint":{"type":"string","description":"Device fingerprint / visitor id.","example":"fp_browser_abc123"},"redirectPath":{"type":"string","description":"Frontend path the client wants to land on after OAuth verification.","example":"/dashboard"},"receiveMarketingOffers":{"type":"boolean","description":"Opt-in to marketing offers / communications (applied only if this flow creates a new user)."},"promoCode":{"type":"string","description":"Promo code (new users only)."},"referrerUsername":{"type":"string","description":"Username of the referring user (new users only)."},"referrerUserId":{"type":"string","description":"User id of the referring user (new users only).","example":"507f1f77bcf86cd799439011"}},"required":["type","fingerprint"]},"McpVerifySocialAuthBodyDto":{"type":"object","properties":{"state":{"type":"string","description":"UUID state value returned from the corresponding `/auth/social/url` call.","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"},"code":{"type":"string","description":"Authorization code forwarded from the OAuth provider callback."}},"required":["state"]},"McpRefreshTokenBodyDto":{"type":"object","properties":{"refreshToken":{"type":"string","description":"Refresh token previously returned from `/auth/verify` or `/auth/social/verify`.","example":"550e8400-e29b-41d4-a716-446655440000"}},"required":["refreshToken"]},"McpSignOutBodyDto":{"type":"object","properties":{"refreshToken":{"type":"string","description":"Refresh token of the session to be revoked.","example":"550e8400-e29b-41d4-a716-446655440000"}},"required":["refreshToken"]},"McpErrorBodyDto":{"type":"object","properties":{"code":{"type":"string","example":"NOT_FOUND"},"message":{"type":"string","example":"Resource not found"}},"required":["code","message"]},"McpErrorResponseDto":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"$ref":"#/components/schemas/McpErrorBodyDto"}},"required":["success","error"]},"McpUsernameExistsResponseDto":{"type":"object","properties":{"exists":{"type":"boolean","example":false}},"required":["exists"]},"McpRequestLookupResponseDto":{"type":"object","properties":{"status":{"type":"string","enum":["success","error"]},"userId":{"type":"string","description":"Resolved user id when the user exists."},"email":{"type":"string","description":"Echo of the email used."},"nextRequestAt":{"type":"number","description":"Unix epoch seconds after which a new lookup may be requested."},"mfaRequired":{"type":"boolean","description":"MFA verification required to complete login."},"errorMessage":{"type":"string","description":"Error message when `status === error`."},"unlocksAt":{"type":"string","format":"date-time"}},"required":["status"]},"McpLoginResponseDto":{"type":"object","properties":{"status":{"type":"string","enum":["success","error"]},"newUser":{"type":"boolean"},"onBoardingCompleted":{"type":"boolean"},"mfaRequired":{"type":"boolean"},"user":{"$ref":"#/components/schemas/McpAuthUserDto"},"tokens":{"description":"Issued tokens. Present on successful non-MFA authentications; `mfaAccessToken` only when `mfaRequired` is true.","allOf":[{"$ref":"#/components/schemas/McpAuthTokensDto"}]},"errorMessage":{"type":"string"},"unlocksAt":{"type":"string","format":"date-time"}},"required":["status"]},"McpGenerateSocialAuthUrlResponseDto":{"type":"object","properties":{"status":{"type":"string","enum":["success","error"]},"url":{"type":"string","description":"Provider-specific OAuth URL. Open in the user's browser; the provider will redirect back to the configured callback with `code` and `state`."},"errorMessage":{"type":"string"}},"required":["status"]},"McpRefreshTokenResponseDto":{"type":"object","properties":{"accessToken":{"type":"string","description":"New short-lived JWT access token."}},"required":["accessToken"]},"McpSignOutResponseDto":{"type":"object","properties":{"success":{"type":"boolean","example":true}},"required":["success"]},"CreateApiKeyDto":{"type":"object","properties":{"name":{"type":"string","description":"Human-readable name for the API key"},"type":{"type":"string","enum":["platform","developer","internal"],"default":"platform","description":"Key type: platform (standard), developer (external agent developers), internal (admin only)"},"scopes":{"type":"array","description":"Permission scopes. Defaults to all public, non-admin scopes if omitted. admin:* cannot be created through this API.","items":{"type":"string","enum":["agents:read","agents:write","trades:read","trades:execute","bots:read","bots:write","marketplace:read","ai:chat","read:tokens","read:trades","read:strategies","write:strategies","read:wallet","write:wallet","read:agents","write:agents","read:ai","write:ai","read:earn","read:notifications","write:notifications","read:analytics","admin:*"]}},"expiresAt":{"format":"date-time","type":"string","description":"Expiration date for the key"}},"required":["name"]},"ApiKeyItemResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"keyPrefix":{"type":"string"},"type":{"type":"string","enum":["platform","developer","internal"]},"rateLimitTier":{"type":"string","enum":["free","standard","premium"]},"scopes":{"type":"array","items":{"type":"string","enum":["agents:read","agents:write","trades:read","trades:execute","bots:read","bots:write","marketplace:read","ai:chat","read:tokens","read:trades","read:strategies","write:strategies","read:wallet","write:wallet","read:agents","write:agents","read:ai","write:ai","read:earn","read:notifications","write:notifications","read:analytics","admin:*"]}},"status":{"type":"string","enum":["ACTIVE","REVOKED"]},"lastUsedAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"},"expiresAt":{"format":"date-time","type":"string"}},"required":["id","name","keyPrefix","type","rateLimitTier","scopes","status","createdAt"]},"ApiKeyCreateResponseDto":{"type":"object","properties":{"rawKey":{"type":"string"},"rawSecretKey":{"type":"string"},"apiKey":{"$ref":"#/components/schemas/ApiKeyItemResponseDto"}},"required":["rawKey","rawSecretKey","apiKey"]},"PaginationMetaDto":{"type":"object","properties":{"total":{"type":"number"},"limit":{"type":"number"},"page":{"type":"number"},"totalPages":{"type":"number"},"hasNextPage":{"type":"boolean"},"hasPreviousPage":{"type":"boolean"}},"required":["total","limit","page","totalPages","hasNextPage","hasPreviousPage"]},"RevokeApiKeyResponseDto":{"type":"object","properties":{"revoked":{"type":"boolean","example":true}},"required":["revoked"]},"McpPatchUserBodyDto":{"type":"object","properties":{"avatarFilename":{"type":"string","description":"Avatar filename; omit to leave unchanged. GraphQL allows null to clear."},"languageCode":{"type":"string","enum":["EN","PT","ES","RU","FR","JA","UK","TR"]},"username":{"type":"string"},"virtualWalletMode":{"type":"boolean","description":"Virtual trading mode (true) vs real wallet (false)"}}},"SaveUserInterestsMcpDto":{"type":"object","properties":{"interests":{"type":"array","items":{"type":"string","enum":["CARS_AND_RACING","COMEDY","COOKING_AND_FOOD","CINEMA","FANTASY","MUSIC","FASHION","FITNESS","CODING","TECH","SOCCER","SPORT","BASKETBALL","GYM","RUNNING","SKATEBOARDING","GAMING","TRAVEL","PHILOSOPHY","HISTORY","WELLNESS","TV","FILM","SCIENCE","ANIMALS"]}}},"required":["interests"]},"McpSaveGuideAgentBodyDto":{"type":"object","properties":{"guideAgentId":{"type":"string","description":"Onboarding guide agent id"}},"required":["guideAgentId"]},"McpSubscribeToAgentBodyDto":{"type":"object","properties":{"tradeMode":{"type":"string","enum":["AUTO_TRADING","ALERTS_ONLY","TEST_TRADING","FULL_TRADING"]},"allocationMode":{"type":"string","enum":["PERCENTAGE_RANGE","USD_AMOUNT","SOL_AMOUNT"]},"allocationPercentageMin":{"type":"number"},"allocationPercentageMax":{"type":"number"},"allocationAmountUsd":{"type":"number"},"allocationAmountSol":{"type":"number"},"goLiveUponConfirmation":{"type":"boolean","description":"When true, the agent starts trading immediately after configuration"},"isPaused":{"type":"boolean","description":"When true, pause the agent subscription from executing trades"},"agentId":{"type":"string","description":"Internal agent id to follow"}},"required":["agentId"]},"McpUpdateAgentSubscriptionBodyDto":{"type":"object","properties":{"tradeMode":{"type":"string","enum":["AUTO_TRADING","ALERTS_ONLY","TEST_TRADING","FULL_TRADING"]},"allocationMode":{"type":"string","enum":["PERCENTAGE_RANGE","USD_AMOUNT","SOL_AMOUNT"]},"allocationPercentageMin":{"type":"number"},"allocationPercentageMax":{"type":"number"},"allocationAmountUsd":{"type":"number"},"allocationAmountSol":{"type":"number"},"goLiveUponConfirmation":{"type":"boolean","description":"When true, the agent starts trading immediately after configuration"},"isPaused":{"type":"boolean","description":"When true, pause the agent subscription from executing trades"},"closeAllTrades":{"type":"boolean","description":"When true, close all open trades for this agent in the current wallet context (pause close-all, or FULL/TEST → ALERTS). Omit or false keeps them open. Real FULL → ALERTS keep-open is self-managed (agent stops SL/TP), like unsubscribe. Virtual never requires this sheet."}}},"McpUnsubscribeFromAgentQueryDto":{"type":"object","properties":{"keepTrade":{"type":"boolean","description":"When false, close all open trades on this agent trading bots for the current user before unsubscribing (non-Hyperliquid agents only). Hyperliquid agents never auto-close on unsubscribe — open trades on this agent are rejected until they are closed. Defaults to true (keep open trades). Returned Hyperliquid margin is dropped from wallet IN USE after reclaim.","default":true}}},"McpPreviewAgentAllocationWithdrawQueryDto":{"type":"object","properties":{"amountUsd":{"type":"number","description":"USD amount to preview. Gross − pending fees − slippage − dust − success fee = you receive.","minimum":0.01},"closeAllTrades":{"type":"boolean","description":"When true, preview the close-all sheet (no staying-in-open-trades; full-exit fee). Default keep-open."},"fullExit":{"type":"boolean","description":"When true, preview the unsubscribe sheet: full idle equity (not amountUsd) and the entire outstanding success fee."}},"required":["amountUsd"]},"McpWithdrawFromAgentAllocationBodyDto":{"type":"object","properties":{"amountUsd":{"type":"number","description":"USD amount to withdraw from unused allocation (Hyperliquid REAL is also capped by live free collateral)","minimum":0.01}},"required":["amountUsd"]},"McpAllocationBalanceAuditDto":{"type":"object","properties":{"depositedUsd":{"type":"number"},"realizedPnlUsd":{"type":"number"},"unrealizedPnlUsd":{"type":"number"},"lockedMarginUsd":{"type":"number"},"feeBufferUsd":{"type":"number"},"ledgerAvailableUsd":{"type":"number","description":"Ledger available after the fee buffer. Not Hyperliquid on-chain free margin."},"dustUsd":{"type":"number"},"venueEquityUsd":{"type":"number"},"venueFreeMarginUsd":{"type":"number"},"venueGapUsd":{"type":"number"},"pendingDeltaUsd":{"type":"number"},"bridgeStatus":{"type":"string","enum":["PENDING_BRIDGE","BRIDGING","CONFIRMED","FAILED","RECLAIM_DEFERRED"]},"reconciliationStatus":{"type":"string","enum":["IN_SYNC","GAP","UNKNOWN"]},"netRealizedProfitUsd":{"type":"number","description":"max(0, realized PnL). Success fees apply only to this amount, never to deposited principal."},"pendingPlatformFeeUsd":{"type":"number"},"pendingCreatorFeeUsd":{"type":"number"},"estimatedSuccessFeeUsd":{"type":"number","description":"Success fee due if this allocation fully exited now (0 on a loss)."},"estimatedPlatformFeeUsd":{"type":"number"},"estimatedCreatorFeeUsd":{"type":"number"},"netUserPayoutUsd":{"type":"number","description":"currentBalance + unrealized − estimated success fee (you would keep)."}},"required":["depositedUsd","realizedPnlUsd","unrealizedPnlUsd","lockedMarginUsd","feeBufferUsd","ledgerAvailableUsd","dustUsd","pendingDeltaUsd","reconciliationStatus","netRealizedProfitUsd","pendingPlatformFeeUsd","pendingCreatorFeeUsd","estimatedSuccessFeeUsd","estimatedPlatformFeeUsd","estimatedCreatorFeeUsd","netUserPayoutUsd"]},"McpPreviewAgentAllocationWithdrawResponseDto":{"type":"object","properties":{"requestedUsd":{"type":"number"},"grossBalanceUsd":{"type":"number"},"pendingFeesUsd":{"type":"number"},"slippageUsd":{"type":"number"},"dustRetainedUsd":{"type":"number"},"remainingRequiredUsd":{"type":"number"},"netPayoutUsd":{"type":"number","description":"You receive: gross − bridge fees − slippage − dust − success fee."},"ledgerAvailableUsd":{"type":"number"},"venueFreeMarginUsd":{"type":"number"},"feeDisclosure":{"type":"string"},"agentBalanceUsd":{"type":"number","description":"Agent NAV (ledger current + unrealized) for the confirm sheet."},"stayingInOpenTradesUsd":{"type":"number","description":"Capital staying in open trades when keep-open is on. 0 when close-all."},"successFeeDueUsd":{"type":"number","description":"Success fee due on this exit (0 at/below HWM). Taken from the withdrawal."},"remainingInAgentUsd":{"type":"number","description":"Remaining in agent after the gross leaves. Fee does not reduce this."},"successFeeRule":{"type":"string","description":"8% EchoZero + creator% on net realized profit (max(0, equity − deposit)), never on principal."},"depositedUsd":{"type":"number","description":"Confirmed deposited capital (allocatedUsd)."},"realizedPnlUsd":{"type":"number","description":"currentBalanceUsd − allocatedUsd (realized)."},"unrealizedPnlUsd":{"type":"number","description":"Open-trade mark P&L (not a success-fee base)."},"netRealizedProfitUsd":{"type":"number","description":"max(0, realized PnL). Performance fee applies only to this amount."},"feeBaseUsd":{"type":"number","description":"Profit base used for this exit’s new success-fee accrual."},"platformFeeUsd":{"type":"number","description":"EchoZero 8% slice of this exit’s success fee."},"creatorFeeUsd":{"type":"number","description":"Creator slice of this exit’s success fee."},"netUserPayoutUsd":{"type":"number","description":"Gross − this exit’s success fee (before bridge/slippage/dust)."},"lockedOwnerStakeUsd":{"type":"number","description":"Owner stake locked while this agent is public or waiting for review (EZ-1170). Not available to withdraw; 0 for everyone else."}},"required":["requestedUsd","grossBalanceUsd","pendingFeesUsd","slippageUsd","dustRetainedUsd","remainingRequiredUsd","netPayoutUsd","ledgerAvailableUsd","feeDisclosure","agentBalanceUsd","stayingInOpenTradesUsd","successFeeDueUsd","remainingInAgentUsd","successFeeRule","depositedUsd","realizedPnlUsd","unrealizedPnlUsd","netRealizedProfitUsd","feeBaseUsd","platformFeeUsd","creatorFeeUsd","netUserPayoutUsd","lockedOwnerStakeUsd"]},"McpActivateBotBodyDto":{"type":"object","properties":{"agentId":{"type":"string","description":"Subscribed internal agent id"},"tradingBotId":{"type":"string","description":"Trading bot (strategy) id to activate"},"executionMode":{"type":"string","enum":["AUTO_TRADING","ALERTS_ONLY","TEST_TRADING","FULL_TRADING"]},"allocationMode":{"type":"string","enum":["PERCENTAGE_RANGE","USD_AMOUNT","SOL_AMOUNT"]},"allocationPercentageMin":{"type":"number"},"allocationPercentageMax":{"type":"number"},"allocationAmountUsd":{"type":"number"},"allocationAmountSol":{"type":"number"},"allocationAmount":{"type":"number"},"allocationPercentage":{"type":"number"}},"required":["agentId","tradingBotId","executionMode","allocationMode"]},"UpdateBotActivationMcpDto":{"type":"object","properties":{"executionMode":{"type":"string","enum":["AUTO_TRADING","ALERTS_ONLY","TEST_TRADING","FULL_TRADING"]},"allocationMode":{"type":"string","enum":["PERCENTAGE_RANGE","USD_AMOUNT","SOL_AMOUNT"]},"allocationPercentageMin":{"type":"number"},"allocationPercentageMax":{"type":"number"},"allocationAmountUsd":{"type":"number"},"allocationAmountSol":{"type":"number"},"allocationAmount":{"type":"number"},"allocationPercentage":{"type":"number"},"closeAllTrades":{"type":"boolean","description":"When true and executionMode is ALERTS_ONLY, close all open trades for this agent in the current wallet context. Ignored for any other mode. Same keep-open semantics as PATCH subscription closeAllTrades on FULL → ALERTS."}},"required":["executionMode","allocationMode"]},"McpUserDocumentDto":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","BLOCKED","SELF_EXCLUDED","COOL_OFF","DELETED"]},"username":{"type":"string"},"email":{"type":"string"},"emailVerifiedAt":{"type":"string","format":"date-time"},"registeredAt":{"type":"string","format":"date-time"},"avatarUrl":{"type":"string"},"interests":{"type":"array","items":{"type":"string","enum":["CARS_AND_RACING","COMEDY","COOKING_AND_FOOD","CINEMA","FANTASY","MUSIC","FASHION","FITNESS","CODING","TECH","SOCCER","SPORT","BASKETBALL","GYM","RUNNING","SKATEBOARDING","GAMING","TRAVEL","PHILOSOPHY","HISTORY","WELLNESS","TV","FILM","SCIENCE","ANIMALS"]}},"guideAgentId":{"type":"string"},"pinnedAgentIds":{"type":"array","items":{"type":"string"}},"languageCode":{"type":"string","enum":["EN","PT","ES","RU","FR","JA","UK","TR"]},"signupMethod":{"type":"string","description":"How the account was created (e.g. EMAIL, WALLET, social types)"},"countryCode":{"type":"string","enum":["AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BQ","BA","BW","BV","BR","IO","BN","BG","BF","BI","CV","KH","CM","CA","KY","CF","TD","CL","CN","CX","CC","CO","KM","CD","CG","CK","CR","HR","CU","CW","CY","CZ","CI","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","MK","RO","RU","RW","RE","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","UM","US","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW","AX","XK"]},"stateCode":{"type":"string"},"timeZone":{"type":"string"},"preferences":{"type":"object","additionalProperties":true,"description":"User preferences blob"},"wallet":{"type":"object","additionalProperties":true,"description":"Virtual wallet and chain balances (shape varies)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","username","email"]},"McpSessionContextDto":{"type":"object","properties":{"OS":{"type":"string"},"OSVersion":{"type":"string"},"browser":{"type":"string"},"browserVersion":{"type":"string"}}},"McpSessionDto":{"type":"object","properties":{"id":{"type":"string"},"token":{"type":"string","description":"Present when selected in DB projection"},"userAgent":{"type":"string"},"context":{"$ref":"#/components/schemas/McpSessionContextDto"},"ipAddress":{"type":"string"},"countryCode":{"type":"string","enum":["AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BQ","BA","BW","BV","BR","IO","BN","BG","BF","BI","CV","KH","CM","CA","KY","CF","TD","CL","CN","CX","CC","CO","KM","CD","CG","CK","CR","HR","CU","CW","CY","CZ","CI","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","MK","RO","RU","RW","RE","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","UM","US","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW","AX","XK"]},"userCountryCode":{"type":"string","enum":["AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BQ","BA","BW","BV","BR","IO","BN","BG","BF","BI","CV","KH","CM","CA","KY","CF","TD","CL","CN","CX","CC","CO","KM","CD","CG","CK","CR","HR","CU","CW","CY","CZ","CI","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","MK","RO","RU","RW","RE","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","UM","US","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW","AX","XK"]},"state":{"type":"string"},"timezone":{"type":"string"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","context","ipAddress"]},"McpSocialNetworkStatusDto":{"type":"object","properties":{"isLinked":{"type":"boolean"},"username":{"type":"string"}},"required":["isLinked"]},"McpSocialAccountsStatusDto":{"type":"object","properties":{"twitter":{"$ref":"#/components/schemas/McpSocialNetworkStatusDto"},"discord":{"$ref":"#/components/schemas/McpSocialNetworkStatusDto"}},"required":["twitter","discord"]},"McpGuideAgentDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"archetypes":{"type":"array","items":{"type":"string","enum":["CARS_AND_RACING","COMEDY","COOKING_AND_FOOD","CINEMA","FANTASY","MUSIC","FASHION","FITNESS","CODING","TECH","SOCCER","SPORT","BASKETBALL","GYM","RUNNING","SKATEBOARDING","GAMING","TRAVEL","PHILOSOPHY","HISTORY","WELLNESS","TV","FILM","SCIENCE","ANIMALS"]}},"tradeTags":{"type":"array","items":{"type":"string"}}},"required":["id","name"]},"McpAgentSubscriptionDto":{"type":"object","properties":{"agent":{"type":"string","description":"Agent id"},"subscriptionType":{"type":"string","enum":["AUTO_TRADING","ALERTS_ONLY","TEST_TRADING","FULL_TRADING"],"description":"Deprecated; prefer bot activations"},"subscribedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"tradeMode":{"type":"string","enum":["AUTO_TRADING","ALERTS_ONLY","TEST_TRADING","FULL_TRADING"]},"walletContext":{"type":"string","enum":["virtual","real"],"description":"Canonical wallet context for this mode-specific subscription row."},"walletMode":{"type":"string","enum":["VIRTUAL","REAL"],"deprecated":true,"description":"Deprecated. Prefer walletContext. Kept for backward-compatible clients."},"allocationMode":{"type":"string","enum":["PERCENTAGE_RANGE","USD_AMOUNT","SOL_AMOUNT"]},"allocationPercentageMin":{"type":"number"},"allocationPercentageMax":{"type":"number"},"allocationAmountUsd":{"type":"number"},"allocationAmountSol":{"type":"number"},"allocatedUsd":{"type":"number","description":"Ledger capital assigned to this agent in USD (confirmed). Unconfirmed add/withdraw sits in pendingDeltaUsd."},"inUseUsd":{"type":"number","description":"Open-trade margin locked in this agent pool"},"withdrawableUsd":{"type":"number","description":"Ledger withdrawable USD after the venue fee buffer (not Hyperliquid on-chain free margin)"},"currentBalanceUsd":{"type":"number","description":"Agent pool equity headline"},"availableUsd":{"type":"number","description":"Free capital deployable (current − locked)."},"inTradesUsd":{"type":"number","description":"Capital in open trades (HL margin, not notional)"},"feeBufferUsd":{"type":"number","description":"Venue fee/gas buffer inside the pool. Hyperliquid: max($0, 0.05% × maxLeverage × allocation). Jupiter: $0."},"lockedInPositionsUsd":{"type":"number","description":"Open-trade margin (alias of inUseUsd / inTradesUsd)"},"venue":{"type":"string","enum":["JUPITER","HYPERLIQUID","ONEINCH","ALL_PLATFORMS"],"description":"Allocation venue (JUPITER or HYPERLIQUID)"},"hyperliquidTotalEquityUsd":{"type":"number","description":"Live Hyperliquid accountValue (shared EVM account, not per-agent). Null for Jupiter."},"hyperliquidFreeMarginUsd":{"type":"number","description":"Live Hyperliquid withdrawable (on-chain free margin). Distinct from ledger withdrawableUsd. Null for Jupiter."},"bridgeStatus":{"type":"string","enum":["PENDING_BRIDGE","BRIDGING","CONFIRMED","FAILED","RECLAIM_DEFERRED"],"description":"Solana↔Hyperliquid bridge lifecycle. Null for Jupiter / virtual."},"bridgeTransactionId":{"type":"string","description":"bridge-transactions id for the in-flight or last HL bridge"},"pendingDeltaUsd":{"type":"number","description":"Unconfirmed add (+) or withdraw (−) USD applied to allocatedUsd only after confirmation"},"minAllocationUsd":{"type":"number","description":"Computed minimum allocation for this agent (venue env floor)"},"minTradeUsd":{"type":"number","description":"Venue min-trade floor (USD) from env"},"minPerTradePercent":{"type":"number"},"recommendedPerTradePercent":{"type":"number"},"maxConcurrentPositions":{"type":"number"},"maxEntriesPerTrade":{"type":"number"},"allocationBalanceAudit":{"$ref":"#/components/schemas/McpAllocationBalanceAuditDto"},"goLiveUponConfirmation":{"type":"boolean"},"isPaused":{"type":"boolean"}},"required":["agent","subscribedAt"]},"McpSubscribeToAgentResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"subscription":{"$ref":"#/components/schemas/McpAgentSubscriptionDto"},"agentName":{"type":"string"},"agentImageUrl":{"type":"string"},"strategyCount":{"type":"number"}},"required":["success","message"]},"McpAddToAgentAllocationBodyDto":{"type":"object","properties":{"amountUsd":{"type":"number","description":"USD amount to add","minimum":0.01}},"required":["amountUsd"]},"McpChangeAgentAllocationPercentBodyDto":{"type":"object","properties":{"allocationPercentageMax":{"type":"number","minimum":0.01,"maximum":100},"allocationPercentageMin":{"type":"number","minimum":0,"maximum":100}},"required":["allocationPercentageMax"]},"McpUnsubscribeFromAgentResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"]},"McpBotActivationDto":{"type":"object","properties":{"agentId":{"type":"string"},"tradingBotId":{"type":"string"},"executionMode":{"type":"string","enum":["AUTO_TRADING","ALERTS_ONLY","TEST_TRADING","FULL_TRADING"]},"allocationMode":{"type":"string","enum":["PERCENTAGE_RANGE","USD_AMOUNT","SOL_AMOUNT"]},"allocationPercentageMin":{"type":"number"},"allocationPercentageMax":{"type":"number"},"allocationAmountUsd":{"type":"number"},"allocationAmountSol":{"type":"number"},"allocationAmount":{"type":"number","description":"Deprecated allocation field"},"allocationPercentage":{"type":"number","description":"Deprecated allocation field"},"isPaused":{"type":"boolean"},"activatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["agentId","tradingBotId","executionMode","activatedAt"]},"McpActivationBalanceInfoDto":{"type":"object","properties":{"balanceSol":{"type":"number"},"balanceUsd":{"type":"number"},"hasInsufficientBalance":{"type":"boolean"}},"required":["balanceSol","balanceUsd","hasInsufficientBalance"]},"McpActivateBotResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"activation":{"$ref":"#/components/schemas/McpBotActivationDto"},"balance":{"$ref":"#/components/schemas/McpActivationBalanceInfoDto"}},"required":["success","message"]},"McpDeactivateBotResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"]},"CreateChannelMembershipBodyDto":{"type":"object","properties":{"platform":{"type":"string","enum":["telegram","discord"]},"channelId":{"type":"string","description":"Telegram supergroup / channel id string (e.g. `-100…`).","example":"-1003750684798"},"channelName":{"type":"string"},"telegramUserId":{"type":"number","description":"Your Telegram user id (numeric). In production, prefer verifying via Telegram Login Widget; this field is required for `getChatMember` checks."},"telegramUsername":{"type":"string"},"discordUserId":{"type":"string","description":"Your Discord user id (snowflake string). Required for Discord membership checks."},"discordUsername":{"type":"string"}},"required":["platform","channelId"]},"CheckChannelMembershipBodyDto":{"type":"object","properties":{"developerAgentId":{"type":"string","description":"Developer agent id whose **active** Telegram signal channel should be checked."}},"required":["developerAgentId"]},"ChannelMembershipResponseDto":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"platform":{"type":"string","enum":["telegram","discord"]},"channelId":{"type":"string"},"channelName":{"type":"string"},"telegramUserId":{"type":"number"},"telegramUsername":{"type":"string"},"discordUserId":{"type":"string"},"discordUsername":{"type":"string"},"status":{"type":"string","enum":["active","paused_pending_rejoin","revoked"]},"verifiedAt":{"format":"date-time","type":"string"},"lastCheckedAt":{"format":"date-time","type":"string"},"gracePeriodExpiresAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","userId","platform","channelId","status","createdAt"]},"CheckChannelMembershipResultDto":{"type":"object","properties":{"ok":{"type":"boolean"},"reason":{"type":"string","description":"`LINK_REQUIRED` | `REVOKED` | `NOT_IN_CHANNEL` | `TELEGRAM_USER_ID_REQUIRED` | `DISCORD_USER_ID_REQUIRED` | `DISCORD_GUILD_ID_REQUIRED` | `NOT_SIGNAL_GROUP` | `NO_SIGNAL_GROUP_CHANNEL` | `TELEGRAM_API_ERROR` | `DISCORD_API_ERROR`"},"channelId":{"type":"string"},"channelName":{"type":"string"},"telegramMemberStatus":{"type":"string","description":"Raw `status` from Telegram `getChatMember` when the API call succeeded."},"telegramError":{"type":"string"},"discordUsername":{"type":"string","description":"Discord username from `getGuildMember` when the API call succeeded."},"discordError":{"type":"string"}},"required":["ok"]},"RevokeChannelMembershipResponseDto":{"type":"object","properties":{"revoked":{"type":"boolean"}},"required":["revoked"]},"DeveloperProfileDto":{"type":"object","properties":{"companyName":{"type":"string","description":"Company or organization name"},"website":{"type":"string","description":"Company website URL"},"contactEmail":{"type":"string","description":"Contact email address"}}},"RegisterDeveloperDto":{"type":"object","properties":{"name":{"type":"string","description":"Name for the developer API key"},"payoutAddress":{"type":"string","description":"Legacy external payout wallet. Optional; agent fee claims credit the Echo Zero in-app wallet."},"developerProfile":{"description":"Developer profile information","allOf":[{"$ref":"#/components/schemas/DeveloperProfileDto"}]},"recruiterReferralCode":{"type":"string","description":"Referral code of the developer who recruited you (developer referral program). Only for accounts that signed up without a referral; an account referred at signup is linked to that referrer automatically. Ignored while the program is paused. 400 if the code is unknown, is your own, belongs to a non-developer or to a developer who has not joined the program, or the account was already referred by someone else.","example":"V1StGXR8_Z5jdHi6B-myT","maxLength":64}},"required":["name"]},"UpdateDeveloperDto":{"type":"object","properties":{"payoutAddress":{"type":"string","description":"Optional legacy external address. Agent fee claims credit the Echo Zero in-app wallet."},"developerProfile":{"description":"Developer profile information","allOf":[{"$ref":"#/components/schemas/DeveloperProfileDto"}]}}},"DeveloperSignalParsingAiPolicyDto":{"type":"object","properties":{"mode":{"type":"string","description":"Global parser AI mode for sources where parser AI is enabled.","enum":["off","shadow","fallback"]},"telegramEnabled":{"type":"boolean","description":"Whether Telegram signal-group messages may use parser AI under platform policy."},"discordEnabled":{"type":"boolean","description":"Whether Discord signal-group messages may use parser AI under platform policy."},"webhookEnabled":{"type":"boolean","description":"Whether inbound webhook text payloads may use parser AI under platform policy. Structured JSON payloads never use parser AI."}},"required":["mode","telegramEnabled","discordEnabled","webhookEnabled"]},"DeveloperResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"keyPrefix":{"type":"string"},"type":{"type":"string"},"rateLimitTier":{"type":"string"},"revenueShare":{"type":"number"},"payoutAddress":{"type":"string","description":"Legacy field; agent fee claims use the Echo Zero wallet."},"betaStatus":{"type":"string"},"developerProfile":{"$ref":"#/components/schemas/DeveloperProfileDto"},"signalParsingAiPolicy":{"description":"Environment-level parser AI policy used by the developer portal to disable per-agent overrides when a source is rules-only.","allOf":[{"$ref":"#/components/schemas/DeveloperSignalParsingAiPolicyDto"}]},"developerAgentIds":{"type":"array","items":{"type":"string"}},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"stripeConnectAccountId":{"type":"string","description":"Stripe Connect Express account id when onboarding started"},"stripeConnectStatus":{"type":"string","enum":["pending","active","restricted"],"description":"Stripe Connect onboarding / payout readiness"}},"required":["id","name","keyPrefix","type","rateLimitTier","revenueShare","betaStatus","signalParsingAiPolicy","developerAgentIds","scopes","status","createdAt"]},"RegisterDeveloperResponseDto":{"type":"object","properties":{"rawKey":{"type":"string"},"rawSecretKey":{"type":"string"},"developer":{"$ref":"#/components/schemas/DeveloperResponseDto"}},"required":["rawKey","rawSecretKey","developer"]},"DeveloperEarningsTotalsDto":{"type":"object","properties":{"grossUsd":{"type":"number","description":"V5 accrued HWM (creator + EZ) plus historical V4 post-cap settled creator fees (USDC-denominated USD)."},"netUsd":{"type":"number"},"platformFeeUsd":{"type":"number"},"claimableUsd":{"type":"number","description":"Funded collected creator fees in the Payouts-ledger claimable pool (USDC-denominated USD). V5 unpaid HWM is excluded."}},"required":["grossUsd","netUsd","platformFeeUsd"]},"DeveloperEarningsByAgentDto":{"type":"object","properties":{"developerAgentId":{"type":"string"},"agentName":{"type":"string","description":"Agent display name (includes soft-deleted agents)."},"agentStatus":{"type":"string","enum":["DRAFT","ACTIVE","PAUSED","DELETED"],"description":"Agent lifecycle status at read time."},"grossUsd":{"type":"number"},"netUsd":{"type":"number"},"platformFeeUsd":{"type":"number"},"claimableUsd":{"type":"number","description":"Funded collected creator fees in the Payouts-ledger claimable pool (USDC-denominated USD). V5 unpaid HWM is excluded."}},"required":["developerAgentId","grossUsd","netUsd","platformFeeUsd"]},"DeveloperEarningsByPeriodDto":{"type":"object","properties":{"periodLabel":{"type":"string","description":"Human-readable ISO week label."},"periodIsoYear":{"type":"number"},"periodIsoWeek":{"type":"number"},"grossUsd":{"type":"number"},"netUsd":{"type":"number"},"platformFeeUsd":{"type":"number"}},"required":["periodLabel","periodIsoYear","periodIsoWeek","grossUsd","netUsd","platformFeeUsd"]},"DeveloperEarningsSubscriptionSliceDto":{"type":"object","properties":{"grossUsd":{"type":"number","description":"Subscription invoice gross (USD) from ledger CREATOR rows in CLAIMED, CLAIMABLE, or PENDING_CONVERSION."},"netUsd":{"type":"number","description":"Creator share (USD/USDC) from those subscription CREATOR rows."},"platformFeeUsd":{"type":"number","description":"Platform share from matching PLATFORM rows in the same statuses."},"claimableUsd":{"type":"number","description":"Outstanding creator subscription balance in CLAIMABLE state (USDC when converted, else USD line)."}},"required":["grossUsd","netUsd","platformFeeUsd","claimableUsd"]},"DeveloperEarningsResponseDto":{"type":"object","properties":{"developerId":{"type":"string"},"totals":{"$ref":"#/components/schemas/DeveloperEarningsTotalsDto"},"byAgent":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperEarningsByAgentDto"}},"byPeriod":{"type":"array","items":{"$ref":"#/components/schemas/DeveloperEarningsByPeriodDto"}},"fromTrading":{"description":"Success-fee marketplace revenue: V5 accrued HWM (gross = creator + EZ, net = creator, platform = EZ) plus historical V4 `feeSettlement.creatorClaimableUsd` split by `revenueShare`.","allOf":[{"$ref":"#/components/schemas/DeveloperEarningsTotalsDto"}]},"fromSubscriptions":{"description":"Stripe subscription ledger: earned totals (CLAIMED + CLAIMABLE + PENDING_CONVERSION) and CLAIMABLE creator pool.","allOf":[{"$ref":"#/components/schemas/DeveloperEarningsSubscriptionSliceDto"}]},"totalClaimableUsd":{"type":"number","description":"Trading success-fee claimable plus subscription CLAIMABLE creator balance."},"lifetimeClaimedUsd":{"type":"number","description":"Lifetime instant-claim payouts (success fees via Payouts Float USDC + subscription ledger marked CLAIMED)."},"fromInstantClaims":{"type":"object","description":"Breakdown of instant claims already withdrawn."},"totalClaimable":{"type":"number","description":"Deprecated alias of `totalClaimableUsd` (trading + subscription claimable).","deprecated":true}},"required":["developerId","totals","byAgent","byPeriod","fromTrading","fromSubscriptions","totalClaimableUsd","lifetimeClaimedUsd","fromInstantClaims","totalClaimable"]},"ClaimSubscriptionEarningsResponseDto":{"type":"object","properties":{"claimedUsd":{"type":"number","description":"Total USD value claimed from subscription CREATOR earnings."},"rowsClaimed":{"type":"number","description":"Number of ledger rows marked as CLAIMED."},"claimedAt":{"format":"date-time","type":"string","description":"Timestamp of the claim."},"transactionSignature":{"type":"string","description":"Signature of the on-chain USDC transfer (or a virtual-claim marker in local/test/dev) that paid this claim into the EchoZero wallet."}},"required":["claimedUsd","rowsClaimed","claimedAt"]},"DeveloperPayoutResponseDto":{"type":"object","properties":{"id":{"type":"string"},"developerId":{"type":"string"},"developerAgentId":{"type":"string"},"agentName":{"type":"string","description":"Agent display name (includes soft-deleted agents)."},"agentStatus":{"type":"string","enum":["DRAFT","ACTIVE","PAUSED","DELETED"],"description":"Agent lifecycle status at read time."},"periodIsoYear":{"type":"number"},"periodIsoWeek":{"type":"number"},"periodLabel":{"type":"string","description":"Human-readable ISO week label, for example `2026-W13`."},"periodKey":{"type":"string","description":"Exact anchor identity, for example `2026-W13@2026-03-30T03:08:42.125Z`. Absent only on legacy rows."},"periodStartUtc":{"format":"date-time","type":"string"},"periodEndUtc":{"format":"date-time","type":"string"},"cumulativeFeesEarnedUsdAtClose":{"type":"number"},"cumulativeV5CreatorUsdAtClose":{"type":"number"},"cumulativeV5EzUsdAtClose":{"type":"number"},"cumulativeLegacyCreatorUsdAtClose":{"type":"number"},"feeModelSource":{"type":"string","enum":["v5_hwm","legacy_trade","mixed"]},"grossRevenue":{"type":"number"},"platformFee":{"type":"number"},"netPayout":{"type":"number"},"developerRevenueSharePercent":{"type":"number","description":"Configured legacy developer revenue-share percentage retained for compatibility."},"effectiveRevenueSharePercent":{"type":"number","description":"Effective netPayout / grossRevenue percentage for a new V5 or mixed snapshot. Historical rows may omit it."},"legacyDeveloperRevenueSharePercent":{"type":"number","description":"Configured legacy revenue-share percentage applied only to the V4 portion."},"payoutAddress":{"type":"string"},"txHash":{"type":"string"},"status":{"type":"string"},"paidAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","developerId","developerAgentId","periodIsoYear","periodIsoWeek","periodLabel","periodStartUtc","periodEndUtc","cumulativeFeesEarnedUsdAtClose","grossRevenue","platformFee","netPayout","developerRevenueSharePercent","status"]},"FollowerTradeReferralAgentDto":{"type":"object","properties":{"agentId":{"type":"string","description":"Owned agent id."},"shareUsd":{"type":"number","description":"Owner share of EchoZero fees from credited follower buys this UTC week (USD)."},"attributedTradeCount":{"type":"number","description":"Credited follower buys this UTC week (each buy-more append counts again)."},"followerVolumeUsd":{"type":"number","description":"USDC those credited buys spent this UTC week (swap + EchoZero fee)."},"followerCount":{"type":"number","description":"Distinct buyers among those credited buys this UTC week."}},"required":["agentId","shareUsd","attributedTradeCount","followerVolumeUsd","followerCount"]},"FollowerTradeReferralsResponseDto":{"type":"object","properties":{"weekStart":{"format":"date-time","type":"string","description":"Monday 00:00 UTC of the current ISO week (inclusive)."},"weekEnd":{"format":"date-time","type":"string","description":"Next Monday 00:00 UTC (exclusive)."},"agents":{"type":"array","items":{"$ref":"#/components/schemas/FollowerTradeReferralAgentDto"}}},"required":["weekStart","weekEnd","agents"]},"StrategyFeesClaimAgentRowDto":{"type":"object","properties":{"agentId":{"type":"string"},"name":{"type":"string"},"agentStatus":{"type":"string","enum":["DRAFT","ACTIVE","PAUSED","DELETED"],"description":"Agent lifecycle status at read time."},"claimableUsd":{"type":"number","description":"Funded collected creator fees for this owned agent (subscriber `developerAgentSubscriptions` / `agentSubscriptions`, subscription-earnings ledger, legacy trading-bot feeEarnings). V5 unpaid HWM is excluded."}},"required":["agentId","name","claimableUsd"]},"StrategyFeesClaimSummaryResponseDto":{"type":"object","properties":{"agents":{"type":"array","items":{"$ref":"#/components/schemas/StrategyFeesClaimAgentRowDto"}},"totalClaimableUsd":{"type":"number"}},"required":["agents","totalClaimableUsd"]},"ClaimStrategyFeesForAgentResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"totalClaimedAmount":{"type":"number"},"botsProcessed":{"type":"number"},"transactionSignatures":{"type":"array","items":{"type":"string"}}},"required":["success","message","totalClaimedAmount","botsProcessed"]},"ClaimStrategyFeesPerAgentResultDto":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"totalClaimedAmount":{"type":"number"},"botsProcessed":{"type":"number"},"transactionSignatures":{"type":"array","items":{"type":"string"}},"agentId":{"type":"string"}},"required":["success","message","totalClaimedAmount","botsProcessed","agentId"]},"ClaimAllStrategyFeesResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"totalClaimedAmount":{"type":"number"},"agentsProcessed":{"type":"number","description":"Number of agents iterated (ownership scope)"},"agentsWithSuccessfulClaims":{"type":"number","description":"Agents where at least one USD was claimed this request"},"perAgent":{"type":"array","items":{"$ref":"#/components/schemas/ClaimStrategyFeesPerAgentResultDto"}}},"required":["success","message","totalClaimedAmount","agentsProcessed","agentsWithSuccessfulClaims","perAgent"]},"TradeReasonDto":{"type":"object","properties":{"code":{"type":"string"},"raw":{"type":"string"},"category":{"type":"string"},"severity":{"type":"string","enum":["failure","warning","info"]},"title":{"type":"string"},"message":{"type":"string"},"remediation":{"type":"string"}},"required":["code","raw","category","severity","title","message"]},"LinkedTradeFromIngestDto":{"type":"object","properties":{"signalId":{"type":"string"},"status":{"type":"string"},"txHash":{"type":"string","description":"On-chain or simulated tx id when executed."},"failureReasons":{"description":"Human-readable failure reasons when the linked trade was rejected or failed.","type":"array","items":{"$ref":"#/components/schemas/TradeReasonDto"}},"diagnosticReasons":{"description":"Non-fatal diagnostic reasons attached to the linked trade.","type":"array","items":{"$ref":"#/components/schemas/TradeReasonDto"}},"failureReason":{"type":"string","description":"Joined failure/diagnostic copy for compact ingest rows (newline-separated)."}},"required":["signalId","status"]},"DashboardSignalIngestLogItemDto":{"type":"object","properties":{"id":{"type":"string"},"developerAgentId":{"type":"string"},"platform":{"type":"string","enum":["telegram","discord","webhook"]},"externalChannelId":{"type":"string","description":"Channel id (Telegram chat id, Discord channel snowflake, or webhook sentinel `__agent_inbound_webhook__`). Legacy rows fall back from `telegramChatId`."},"externalMessageId":{"type":"string","description":"Message id as string (Discord snowflake or Telegram message id stringified)."},"telegramChatId":{"type":"string","description":"Legacy Telegram chat id; omitted for Discord-only rows."},"telegramMessageId":{"type":"number"},"rawText":{"type":"string","description":"Raw channel text (truncated at persistence cap)."},"outcome":{"type":"string","enum":["matched","unmatched","failed","skipped","rate_limited","deduped","no_rule","prefix_skip","error"]},"failureReason":{"type":"string","description":"Short reason when outcome is failed (for example \"could not read the action\" or \"unknown token\"). The signal was not executed."},"parsedAction":{"type":"string"},"parsedIntent":{"type":"string"},"parsedToken":{"type":"string"},"entryPrice":{"type":"string"},"takeProfit":{"type":"string"},"stopLoss":{"type":"string"},"parseConfidence":{"type":"number","description":"Parser confidence in [0, 1] when present."},"parseSource":{"type":"string","description":"Parser pipeline source (e.g. rules, llm_fallback, llm_shadow)."},"parseModel":{"type":"string","description":"Model id when LLM path participated."},"parseNote":{"type":"string","description":"Short parser pipeline diagnostic note."},"parsedSummary":{"type":"string"},"skipReason":{"type":"string","description":"Stable skip code when trade creation did not proceed (e.g. token_not_supported)."},"skipReasons":{"description":"Human-readable skip reasons resolved from `skipReason` for dashboards.","type":"array","items":{"$ref":"#/components/schemas/TradeReasonDto"}},"tradeSignalId":{"type":"string","description":"Public `TradeSignal.signalId` when a trade row was created for this ingest."},"linkedTradeSignalId":{"type":"string","description":"When the ingest row was a lifecycle follow-up, this points to the canonical trade that was updated/closed."},"linkedTrade":{"description":"Joined trade metadata when `tradeSignalId` resolves.","allOf":[{"$ref":"#/components/schemas/LinkedTradeFromIngestDto"}]},"createdAt":{"format":"date-time","type":"string"}},"required":["id","developerAgentId","platform","externalChannelId","rawText","outcome","createdAt"]},"AgentSignalTradeRowDto":{"type":"object","properties":{"id":{"type":"string","description":"TradeSignal Mongo id (stable for table keys)."},"signalId":{"type":"string","description":"Public signalId (sig_…); stable across replays / dedupe."},"action":{"type":"string","description":"BUY / SELL action the agent called."},"tokenAddress":{"type":"string","description":"Token mint address from the parsed signal."},"tokenName":{"type":"string","description":"Resolved token name from Echo Zero metadata (or parser ticker when no DB row)."},"tokenSymbol":{"type":"string","description":"Display symbol — from metadata or parser (e.g. Telegram `context.parserToken`)."},"amount":{"type":"number","description":"USD notional carried on the signal record (parsing / bridge / demo). Actual swap size is chosen by each subscriber in the Echo Zero app from their own settings — not set here for subscribers."},"status":{"type":"string","description":"Lifecycle status. `recorded` = signal-trade saved with no fan-out (Mike's no-subscribers case), `executed` = at least one subscriber executed, `failed` = fan-out attempted but every subscriber errored."},"venue":{"type":"string","enum":["JUPITER","JUPITER_PERPS","DRIFT","HYPERLIQUID"],"description":"Resolved trading venue for this signal-trade (e.g. JUPITER or HYPERLIQUID)."},"leverage":{"type":"number","description":"Resolved leverage from the signal execution plan, when the agent uses leverage."},"failureReason":{"type":"string","description":"Human-readable diagnostic shown when the signal-trade failed or was rejected."},"failureReasons":{"description":"Structured, user-facing failure reasons shown for failed/rejected rows.","type":"array","items":{"$ref":"#/components/schemas/TradeReasonDto"}},"diagnosticReasons":{"description":"Structured non-failure diagnostics shown for recorded/executed rows.","type":"array","items":{"$ref":"#/components/schemas/TradeReasonDto"}},"subscriberCount":{"type":"number","description":"How many subscribers the bridge tried fan-out against (0 = no qualifying legs — bootstrap or unfunded/sizing skips only). Hard failures keep this count."},"livePriceSeeded":{"type":"boolean","description":"True when a positive live USD price snapshot was available at signal creation."},"entryPriceUsd":{"type":"number","description":"Snapshot live USD price at signal creation."},"stopLossPriceUsd":{"type":"number","description":"Parsed stop-loss USD price."},"takeProfitPriceUsd":{"type":"number","description":"Parsed take-profit USD price."},"takeProfitLevelsUsd":{"description":"Parsed take-profit ladder USD prices in order.","type":"array","items":{"type":"number"}},"takeProfitLevelSellPercents":{"description":"Sell percentages aligned with `takeProfitLevelsUsd`.","type":"array","items":{"type":"number"}},"currentPriceUsd":{"type":"number","description":"Latest USD price observed by the price-feed worker."},"unrealizedPnlPercent":{"type":"number","description":"Unrealized P&L percent (current price vs entry) while the trade is open."},"realizedPnlPercent":{"type":"number","description":"Realized P&L percent set when SL / TP / manual close fires."},"closeReason":{"type":"string","description":"Why the signal-trade closed (take_profit / stop_loss / manual / expired)."},"closedAt":{"format":"date-time","type":"string"},"firstTxHash":{"type":"string","description":"Simulated or on-chain tx hash from the first successful subscriber execution (when present)."},"createdAt":{"format":"date-time","type":"string","description":"When the signal-trade was recorded."},"performanceOpen":{"type":"boolean","description":"True while the price-feed worker is still tracking this row."},"entryPending":{"type":"boolean","description":"True while the setup is parked waiting for live price to reach the signal entry (limit or zone)."},"positionSignalId":{"type":"string","description":"Shared DCA / scale-in position root signalId. Equals this signalId for the first entry; later legs point at the root."},"positionEntryIndex":{"type":"number","description":"1-based DCA leg index within the shared position (1 = opening entry)."}},"required":["id","signalId","action","tokenAddress","amount","subscriberCount","livePriceSeeded","createdAt","performanceOpen"]},"AgentReviewResponseDto":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"notes":{"type":"string"},"safetyScore":{"type":"number"},"reviewedAt":{"format":"date-time","type":"string"}},"required":["id","status","reviewedAt"]},"DeveloperAgentSubscriberAnonymizedDto":{"type":"object","properties":{"anonymizedSubscriberId":{"type":"string","description":"Opaque identifier for the subscriber (SHA-256 prefix of user id — no email/username)."},"pricingModel":{"type":"string","enum":["subscription","success-fee","both","free"]},"monthlyPrice":{"type":"number"},"successFeePercent":{"type":"number"},"subscribedAt":{"format":"date-time","type":"string"},"claimableFeesUsd":{"type":"number"},"totalFeesEarnedUsd":{"type":"number"},"totalFeesClaimedUsd":{"type":"number"}},"required":["anonymizedSubscriberId","pricingModel","subscribedAt","claimableFeesUsd","totalFeesEarnedUsd","totalFeesClaimedUsd"]},"DeveloperAgentPerformanceDashboardDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"betaStatus":{"type":"string"},"totalPnlUsd":{"type":"number","description":"Total P&L (USD) from performance snapshot"},"winRate":{"type":"number"},"totalTrades":{"type":"number"},"sharpeRatio":{"type":"number"},"maxDrawdownPercent":{"type":"number"},"performanceStats":{"type":"object","additionalProperties":true,"description":"Full embedded performance stats from the developer agent record"},"latestReview":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/AgentReviewResponseDto"}]},"connectedSignalPlatforms":{"type":"array","description":"Active signal-group channel platforms on this agent (Telegram and/or Discord).","items":{"type":"string","enum":["telegram","discord"]}}},"required":["id","name","betaStatus","performanceStats"]},"RawSignalResponseDto":{"type":"object","properties":{"action":{"type":"string"},"tokenAddress":{"type":"string"},"tokenName":{"type":"string","description":"Human-readable token name when resolved from Echo Zero mint metadata (fallback: parser ticker or symbol)."},"tokenSymbol":{"type":"string","description":"Display symbol/ticker — from mint metadata when available, else channel parser ticker (e.g. Telegram `context.parserToken`)."},"amount":{"type":"number"},"urgency":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"reasoning":{"type":"string"},"context":{"type":"object","additionalProperties":true},"confidence":{"type":"number","minimum":0,"maximum":1},"executionPlan":{"type":"object","additionalProperties":true,"description":"Parser SL/TP/zone snapshot, optional signal `riskMgmt` (`fixed` | `dynamic`), and agent defaults for trade open."}},"required":["action","tokenAddress","amount"]},"ValidationResultResponseDto":{"type":"object","properties":{"passed":{"type":"boolean"},"reason":{"type":"string"},"validatedAt":{"format":"date-time","type":"string"}},"required":["passed","validatedAt"]},"TradeFeeReceiptResponseDto":{"type":"object","properties":{"tradingFeeUsd":{"type":"number","example":0.6},"tradingFeeStandardUsd":{"type":"number","description":"Uncapped standard EZ trading fee (strikethrough in UI). Unused on v5.","example":1.9},"tradingFeeDiscountUsd":{"type":"number","description":"Small-win / profit-cap discount vs standard (USD). Unused on v5.","example":1.3},"recoveryModeApplied":{"type":"boolean","description":"v4 recovery mode — exit fee and success fee waived. Always false under Fee Model v5 (HWM)."},"hyperliquidCashbackUsd":{"type":"number","description":"Hyperliquid cashback on venue fees (USD)","example":0.05},"hyperliquidVenueFeeNetUsd":{"type":"number","description":"Net Hyperliquid venue fee after cashback (USD)","example":0.25},"successFeeUsd":{"type":"number","example":0.4},"successFeeEffectivePct":{"type":"number","description":"Creator success fee rate (%). Fee Model v5: configured creator rate 0–22 (EZ adds fixed 8% on HWM highs).","example":20},"hwmSuccessFeeAccruedUsd":{"type":"number","description":"Fee Model v5: success fee accrued on this close when cumulative P&L made a new high (USD)","example":0.28},"feeModel":{"type":"string","description":"Fee model stamp for UI (`v4` | `v5`)","example":"v5"}},"required":["tradingFeeUsd","tradingFeeStandardUsd","tradingFeeDiscountUsd","recoveryModeApplied","successFeeUsd","successFeeEffectivePct"]},"ExecutionResultResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"txHash":{"type":"string"},"executedAmountUsd":{"type":"number"},"errorMessage":{"type":"string"},"executedAt":{"format":"date-time","type":"string"},"feeReceipt":{"description":"Close-time fee receipt when execution is tied to a settled trade leg","allOf":[{"$ref":"#/components/schemas/TradeFeeReceiptResponseDto"}]}},"required":["success"]},"DashboardTradeSignalHistoryItemDto":{"type":"object","properties":{"id":{"type":"string"},"signalId":{"type":"string"},"developerAgentId":{"type":"string"},"developerId":{"type":"string"},"anonymizedSubscriberId":{"type":"string","description":"Opaque subscriber label when a subscriber executed the signal (no raw user id)."},"signal":{"$ref":"#/components/schemas/RawSignalResponseDto"},"validationResult":{"$ref":"#/components/schemas/ValidationResultResponseDto"},"executionResult":{"$ref":"#/components/schemas/ExecutionResultResponseDto"},"status":{"type":"string"},"webhookDelivered":{"type":"boolean"},"webhookDeliveredAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","signalId","developerAgentId","developerId","signal","status","webhookDelivered","createdAt"]},"SignalDetectionRuleDto":{"type":"object","properties":{"buyKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"sellKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"longKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"shortKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"tpKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"slKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"leverageKeywords":{"maxItems":200,"description":"When set, numeric leverage is only read from the message if it also contains one of these labels (e.g. LEV, LEVERAGE, CROSS). Empty = detect 5× / leverage: 10 anywhere.","type":"array","items":{"type":"string"}},"tokenPatterns":{"maxItems":200,"type":"array","items":{"type":"string"}},"strategyPrefix":{"type":"string","description":"Optional line prefix filter (case-insensitive)."},"cancelKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"breakevenKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"partialCloseKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"breakoutAboveKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"breakoutBelowKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}},"entryZoneKeywords":{"maxItems":200,"type":"array","items":{"type":"string"}}}},"SignalCorpusCoverageDto":{"type":"object","properties":{"keywordGateHitPct":{"type":"number"},"unmatchedLineIndexes":{"type":"array","items":{"type":"number"}}},"required":["keywordGateHitPct","unmatchedLineIndexes"]},"SignalCorpusRiskFlagDto":{"type":"object","properties":{"keyword":{"type":"string"},"reason":{"type":"string"}},"required":["keyword","reason"]},"SignalCorpusParsePreviewLineDto":{"type":"object","properties":{"lineIndex":{"type":"number"},"text":{"type":"string"},"ingressHit":{"type":"boolean"},"matched":{"type":"boolean"},"token":{"type":"string"},"intent":{"type":"string"},"summary":{"type":"string"}},"required":["lineIndex","text","ingressHit","matched","token","intent","summary"]},"SignalCorpusCorpusMessageDto":{"type":"object","properties":{"lineIndex":{"type":"number"},"text":{"type":"string"}},"required":["lineIndex","text"]},"SignalCorpusBucketDiffDto":{"type":"object","properties":{"bucket":{"type":"string"},"added":{"type":"array","items":{"type":"string"}},"unchanged":{"type":"array","items":{"type":"string"}}},"required":["bucket","added","unchanged"]},"SignalCorpusStrategyPrefixRecommendationDto":{"type":"object","properties":{"value":{"type":"string","description":"Suggested prefix text (empty when not recommended)."},"apply":{"type":"boolean","description":"Whether suggestedRule.strategyPrefix was set from this recommendation."},"reason":{"type":"string","description":"Short explanation from AI (and server validation)."}},"required":["value","apply","reason"]},"SignalCorpusAnalyzeResponseDto":{"type":"object","properties":{"analysisId":{"type":"string"},"messageCount":{"type":"number"},"rawLineCount":{"type":"number","description":"Logical messages after preprocess (may be less than raw lines)."},"delimiterUsed":{"type":"string","enum":["newline","blankline","telegram_export","discord_export"]},"summary":{"type":"string"},"confidence":{"type":"string","enum":["low","medium","high"]},"suggestedRule":{"$ref":"#/components/schemas/SignalDetectionRuleDto"},"coverage":{"$ref":"#/components/schemas/SignalCorpusCoverageDto"},"riskFlags":{"type":"array","items":{"$ref":"#/components/schemas/SignalCorpusRiskFlagDto"}},"parsePreview":{"type":"array","items":{"$ref":"#/components/schemas/SignalCorpusParsePreviewLineDto"}},"keywordStats":{"type":"object","description":"Per-bucket keyword hit counts over the pasted corpus."},"corpusMessages":{"type":"array","items":{"$ref":"#/components/schemas/SignalCorpusCorpusMessageDto"}},"diff":{"type":"array","items":{"$ref":"#/components/schemas/SignalCorpusBucketDiffDto"}},"warnings":{"type":"array","items":{"type":"string"}},"strategyPrefixRecommendation":{"$ref":"#/components/schemas/SignalCorpusStrategyPrefixRecommendationDto"},"model":{"type":"string"},"expiresAt":{"type":"string"}},"required":["analysisId","messageCount","rawLineCount","delimiterUsed","summary","confidence","suggestedRule","coverage","riskFlags","parsePreview","keywordStats","corpusMessages","diff","warnings","strategyPrefixRecommendation","expiresAt"]},"SignalCorpusAnalyzeRequestDto":{"type":"object","properties":{"samplesText":{"type":"string","description":"Raw pasted channel messages (newline or blank-line separated)."},"messageDelimiter":{"type":"string","enum":["newline","blankline","telegram_export","discord_export"],"description":"telegram_export / discord_export merge desktop copy-selected paste; omit to auto-detect."},"existingRule":{"description":"Current rule on the form — used for diff context only in v1.","allOf":[{"$ref":"#/components/schemas/SignalDetectionRuleDto"}]}},"required":["samplesText"]},"TradeSignalRecordResponseDto":{"type":"object","properties":{"id":{"type":"string"},"signalId":{"type":"string"},"developerAgentId":{"type":"string"},"developerId":{"type":"string"},"subscriberId":{"type":"string"},"signal":{"$ref":"#/components/schemas/RawSignalResponseDto"},"validationResult":{"$ref":"#/components/schemas/ValidationResultResponseDto"},"executionResult":{"$ref":"#/components/schemas/ExecutionResultResponseDto"},"feeReceipt":{"description":"Aggregated fee receipt when the signal’s subscriber trades have settled","allOf":[{"$ref":"#/components/schemas/TradeFeeReceiptResponseDto"}]},"livePriceSeeded":{"type":"boolean","description":"True when a positive live USD price snapshot was available at signal creation."},"status":{"type":"string"},"webhookDelivered":{"type":"boolean"},"webhookDeliveredAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","signalId","developerAgentId","developerId","signal","livePriceSeeded","status","webhookDelivered","createdAt"]},"PublicAgentCardAccessDto":{"type":"object","properties":{"type":{"type":"string","enum":["free","paid","gated"]},"priceMonthly":{"type":"number","description":"Monthly price in USD. Present only when type is paid."},"platform":{"type":"string","enum":["telegram","discord"],"description":"Telegram or Discord. Uses the explicit gate platform, otherwise an active connected channel. Omitted when gated and neither is set."}},"required":["type"]},"PublicDeveloperAgentStatsDto":{"type":"object","properties":{"totalProfitUsd":{"type":"number"},"roi":{"type":"number"},"winRate":{"type":"number"},"totalTrades":{"type":"number"},"performanceScore":{"type":"number"}}},"PublicDeveloperAgentPnlDto":{"type":"object","properties":{"totalProfitUsd":{"type":"number"},"roi":{"type":"number"},"avgProfitPerTrade":{"type":"number"},"maxDrawdown":{"type":"number"}}},"PublicDeveloperAgentTradeStatsDto":{"type":"object","properties":{"totalTrades":{"type":"number"},"wins":{"type":"number"},"losses":{"type":"number"},"winRate":{"type":"number"},"category":{"type":"string"}}},"PublicDeveloperAgentCardDto":{"type":"object","properties":{"id":{"type":"string"},"developerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"strategyDescription":{"type":"string"},"avatarUrl":{"type":"string"},"imageUrl":{"type":"string","description":"Compatibility alias for old GraphQL consumers. Mirrors `avatarUrl`."},"tags":{"description":"Marketplace / discovery tags","type":"array","items":{"type":"string"}},"pricingModel":{"type":"string","enum":["subscription","success-fee","both","free"]},"monthlyPrice":{"type":"number"},"successFeePercent":{"type":"number"},"betaStatus":{"type":"string"},"betaStartDate":{"format":"date-time","type":"string"},"maxBetaUsers":{"type":"number"},"marketType":{"type":"string","enum":["perps","spot"],"description":"Card tag derived from venue. Hyperliquid is perps; other venues are spot. With no venue, a stored perpetual or both market type is perps."},"access":{"$ref":"#/components/schemas/PublicAgentCardAccessDto"},"performanceStats":{"type":"object","additionalProperties":true},"stats":{"$ref":"#/components/schemas/PublicDeveloperAgentStatsDto"},"pnl":{"$ref":"#/components/schemas/PublicDeveloperAgentPnlDto"},"tradeStats":{"$ref":"#/components/schemas/PublicDeveloperAgentTradeStatsDto"},"followers":{"type":"number","description":"Compatibility field for old GraphQL `followers`; mirrors `subscriberCount` when present."},"subscriberCount":{"type":"number","description":"Users with an active paid subscription to this agent (developer subscriptions + linked legacy subscriptions)."},"isSubscribed":{"type":"boolean","description":"Present when optional auth credentials are provided on public endpoints."},"activeBotCount":{"type":"number","description":"Compatibility field with old GraphQL cards."},"totalBotCount":{"type":"number","description":"Compatibility field with old GraphQL cards."},"featured":{"type":"boolean"},"featuredRank":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"latestReview":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/AgentReviewResponseDto"}]},"membershipGated":{"type":"boolean","description":"When true, this agent expects subscribers to join the signal community (membership check)."},"gatedPlatform":{"type":"string","enum":["telegram","discord"],"description":"Creator-selected gate platform when membershipGated is true."},"externalSignupUrl":{"type":"string","description":"Invite link for the gated community (if `membershipGated`)."}},"required":["id","developerId","name","pricingModel","betaStatus","marketType","access","performanceStats","createdAt","updatedAt"]},"Object":{"type":"object","properties":{}},"MyDeveloperAgentSubscriptionSnapshotDto":{"type":"object","properties":{"subscribedAt":{"type":"string","format":"date-time"},"claimableFeesUsd":{"type":"number"},"totalFeesEarnedUsd":{"type":"number"},"totalFeesClaimedUsd":{"type":"number"}},"required":["subscribedAt"]},"MyDeveloperAgentSubscriptionCardDto":{"type":"object","properties":{"id":{"type":"string"},"developerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"strategyDescription":{"type":"string"},"avatarUrl":{"type":"string"},"imageUrl":{"type":"string","description":"Compatibility alias for old GraphQL consumers. Mirrors `avatarUrl`."},"tags":{"description":"Marketplace / discovery tags","type":"array","items":{"type":"string"}},"pricingModel":{"type":"string","enum":["subscription","success-fee","both","free"]},"monthlyPrice":{"type":"number"},"successFeePercent":{"type":"number"},"betaStatus":{"type":"string"},"betaStartDate":{"format":"date-time","type":"string"},"maxBetaUsers":{"type":"number"},"marketType":{"type":"string","enum":["perps","spot"],"description":"Card tag derived from venue. Hyperliquid is perps; other venues are spot. With no venue, a stored perpetual or both market type is perps."},"access":{"$ref":"#/components/schemas/PublicAgentCardAccessDto"},"performanceStats":{"type":"object","additionalProperties":true},"stats":{"$ref":"#/components/schemas/PublicDeveloperAgentStatsDto"},"pnl":{"$ref":"#/components/schemas/PublicDeveloperAgentPnlDto"},"tradeStats":{"$ref":"#/components/schemas/PublicDeveloperAgentTradeStatsDto"},"followers":{"type":"number","description":"Compatibility field for old GraphQL `followers`; mirrors `subscriberCount` when present."},"subscriberCount":{"type":"number","description":"Users with an active paid subscription to this agent (developer subscriptions + linked legacy subscriptions)."},"isSubscribed":{"type":"boolean","description":"Present when optional auth credentials are provided on public endpoints."},"activeBotCount":{"type":"number","description":"Compatibility field with old GraphQL cards."},"totalBotCount":{"type":"number","description":"Compatibility field with old GraphQL cards."},"featured":{"type":"boolean"},"featuredRank":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"latestReview":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/AgentReviewResponseDto"}]},"membershipGated":{"type":"boolean","description":"When true, this agent expects subscribers to join the signal community (membership check)."},"gatedPlatform":{"type":"string","enum":["telegram","discord"],"description":"Creator-selected gate platform when membershipGated is true."},"externalSignupUrl":{"type":"string","description":"Invite link for the gated community (if `membershipGated`)."},"subscription":{"$ref":"#/components/schemas/MyDeveloperAgentSubscriptionSnapshotDto"}},"required":["id","developerId","name","pricingModel","betaStatus","marketType","access","performanceStats","createdAt","updatedAt","subscription"]},"PublicDeveloperAgentDetailDto":{"type":"object","properties":{"id":{"type":"string"},"developerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"strategyDescription":{"type":"string"},"avatarUrl":{"type":"string"},"imageUrl":{"type":"string","description":"Compatibility alias for old GraphQL consumers. Mirrors `avatarUrl`."},"tags":{"description":"Marketplace / discovery tags","type":"array","items":{"type":"string"}},"pricingModel":{"type":"string","enum":["subscription","success-fee","both","free"]},"monthlyPrice":{"type":"number"},"successFeePercent":{"type":"number"},"betaStatus":{"type":"string"},"betaStartDate":{"format":"date-time","type":"string"},"maxBetaUsers":{"type":"number"},"marketType":{"type":"string","enum":["perps","spot"],"description":"Card tag derived from venue. Hyperliquid is perps; other venues are spot. With no venue, a stored perpetual or both market type is perps."},"access":{"$ref":"#/components/schemas/PublicAgentCardAccessDto"},"performanceStats":{"type":"object","additionalProperties":true},"stats":{"$ref":"#/components/schemas/PublicDeveloperAgentStatsDto"},"pnl":{"$ref":"#/components/schemas/PublicDeveloperAgentPnlDto"},"tradeStats":{"$ref":"#/components/schemas/PublicDeveloperAgentTradeStatsDto"},"followers":{"type":"number","description":"Compatibility field for old GraphQL `followers`; mirrors `subscriberCount` when present."},"subscriberCount":{"type":"number","description":"Users with an active paid subscription to this agent"},"isSubscribed":{"type":"boolean","description":"Present when optional auth credentials are provided on public endpoints."},"activeBotCount":{"type":"number","description":"Compatibility field with old GraphQL cards."},"totalBotCount":{"type":"number","description":"Compatibility field with old GraphQL cards."},"featured":{"type":"boolean"},"featuredRank":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"latestReview":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/AgentReviewResponseDto"}]},"membershipGated":{"type":"boolean","description":"When true, this agent expects subscribers to join the signal community (membership check)."},"gatedPlatform":{"type":"string","enum":["telegram","discord"],"description":"Creator-selected gate platform when membershipGated is true."},"externalSignupUrl":{"type":"string","description":"Invite link for the gated community (if `membershipGated`)."}},"required":["id","developerId","name","pricingModel","betaStatus","marketType","access","performanceStats","createdAt","updatedAt"]},"DeveloperAgentSubscribeResponseDto":{"type":"object","properties":{"subscribed":{"type":"boolean"},"alreadySubscribed":{"type":"boolean","description":"True if the user was already subscribed (idempotent success)."},"developerAgentId":{"type":"string"},"pricingModel":{"type":"string","enum":["subscription","success-fee","both","free"]},"monthlyPrice":{"type":"number"},"successFeePercent":{"type":"number"}},"required":["subscribed","alreadySubscribed","developerAgentId","pricingModel"]},"DeveloperAgentUnsubscribeResponseDto":{"type":"object","properties":{"unsubscribed":{"type":"boolean"}},"required":["unsubscribed"]},"NetRevenueAllowlistResponseDto":{"type":"object","properties":{"configuredAddress":{"type":"string","description":"Configured Net Revenue wallet address from env.","example":"2FtHE8XRRq9iYLJ1rP9rbm18radfGzjzVXTkiN6jWzNi"},"allowlist":{"description":"Permitted Net Revenue addresses from `EZ_NET_REVENUE_WALLET_ALLOWLIST`.","example":["2FtHE8XRRq9iYLJ1rP9rbm18radfGzjzVXTkiN6jWzNi"],"type":"array","items":{"type":"string"}},"isAllowlisted":{"type":"boolean","description":"Whether the configured address is on the allowlist (always true when allowlist is empty).","example":true},"alert":{"type":"string","description":"Non-null when the configured address is not allowlisted or allowlist is unset.","example":"net_revenue_allowlist_not_configured","nullable":true}},"required":["configuredAddress","allowlist","isAllowlisted"]},"PayoutsSolvencyResponseDto":{"type":"object","properties":{"snapshotAt":{"type":"string","description":"ISO timestamp when this snapshot was computed.","example":"2026-06-24T12:00:00.000Z"},"status":{"type":"string","enum":["green","red"],"description":"Overall solvency indicator: green when solvent, daily outflow within limit, and Net Revenue address is allowlisted (when allowlist is configured).","example":"green"},"payoutsFloatAddress":{"type":"string","description":"Configured Payouts Float wallet address.","example":"PayoutsFloatWallet111111111111111111111111111"},"netRevenueWalletAddress":{"type":"string","description":"Configured Net Revenue wallet address.","example":"2FtHE8XRRq9iYLJ1rP9rbm18radfGzjzVXTkiN6jWzNi"},"payoutsOnChainUsdcMicro":{"type":"number","description":"On-chain USDC balance of the Payouts Float wallet (micro-USDC).","example":1500000000},"totalLiabilitiesUsdcMicro":{"type":"number","description":"Sum of platform liabilities owed from Payouts Float (micro-USDC).","example":900000000},"solvencyGapUsdcMicro":{"type":"number","description":"On-chain minus liabilities; negative means under-collateralized (micro-USDC).","example":600000000},"isSolvent":{"type":"boolean","description":"True when solvency gap is non-negative.","example":true},"creatorClaimableUsdcMicro":{"type":"number","example":100000000},"rakebackAccruedUsdcMicro":{"type":"number","example":50000000},"referralClaimableUsdcMicro":{"type":"number","example":25000000},"referralCommissionHoldsUsdcMicro":{"type":"number","example":10000000},"openEscrowUsdcMicro":{"type":"number","example":200000000},"pendingHlReferralRebatesUsdcMicro":{"type":"number","example":5000000},"hlDeferredFeesUsdcMicro":{"type":"number","description":"Pending HL deferred entry/exit receivables (micro-USDC). Excludes SUCCESS_FEE_CREATOR (in creatorClaimableUsdcMicro) and SUCCESS_FEE_EZ_SLICE (Net Revenue).","example":15000000},"hwmUnpaidFeesUsdcMicro":{"type":"number","description":"Unsettled Fee Model v5 HWM success fees (EZ + creator unpaid, micro-USDC). User-owed until weekly/crystallize settle.","example":8000000},"subscriptionCreatorClaimableUsdcMicro":{"type":"number","example":500000000},"payoutsDailyOutflowUsdcMicro":{"type":"number","description":"Payouts Float outbound volume for the current UTC day (micro-USDC).","example":12000000},"payoutsDailyOutflowLimitUsdcMicro":{"type":"number","description":"Configured daily outflow cap (micro-USDC).","example":250000000000},"payoutsDailyOutflowLimitExceeded":{"type":"boolean","description":"True when daily outflow exceeds the configured limit.","example":false},"netRevenueAllowlist":{"$ref":"#/components/schemas/NetRevenueAllowlistResponseDto"},"alerts":{"description":"Active alerts (insolvency, daily outflow breach, Net Revenue allowlist mismatch).","example":[],"type":"array","items":{"type":"string"}}},"required":["snapshotAt","status","payoutsFloatAddress","netRevenueWalletAddress","payoutsOnChainUsdcMicro","totalLiabilitiesUsdcMicro","solvencyGapUsdcMicro","isSolvent","creatorClaimableUsdcMicro","rakebackAccruedUsdcMicro","referralClaimableUsdcMicro","referralCommissionHoldsUsdcMicro","openEscrowUsdcMicro","pendingHlReferralRebatesUsdcMicro","hlDeferredFeesUsdcMicro","hwmUnpaidFeesUsdcMicro","subscriptionCreatorClaimableUsdcMicro","payoutsDailyOutflowUsdcMicro","payoutsDailyOutflowLimitUsdcMicro","payoutsDailyOutflowLimitExceeded","netRevenueAllowlist","alerts"]},"ServerWalletGasLevelResponseDto":{"type":"object","properties":{"label":{"type":"string","example":"payouts_float"},"address":{"type":"string","example":"PayoutsFloatWallet111111111111111111111111111"},"solBalance":{"type":"number","example":0.12},"lowWaterMarkSol":{"type":"number","example":0.05},"targetBalanceSol":{"type":"number","example":0.15},"isBelowLowWaterMark":{"type":"boolean","example":false}},"required":["label","address","solBalance","lowWaterMarkSol","targetBalanceSol","isBelowLowWaterMark"]},"GasWalletLevelResponseDto":{"type":"object","properties":{"checkedAt":{"type":"string","description":"ISO timestamp when balances were read.","example":"2026-06-24T12:00:00.000Z"},"gasWalletAddress":{"type":"string","description":"Configured gas wallet address (`EZ_GAS_WALLET_ADDRESS`).","example":"GasWallet111111111111111111111111111111111"},"gasWalletSolBalance":{"type":"number","example":2.5},"gasWalletMinSelfSol":{"type":"number","description":"Healthy SOL inventory level (`GAS_WALLET_MIN_SELF_SOL`). Below it the gas wallet alerts, self-refills from USDC, and stops paying first-bridge subsidies.","example":1},"gasWalletHardReserveSol":{"type":"number","description":"Hard floor no outflow may breach (`GAS_WALLET_HARD_RESERVE_SOL`). Below it user SOL top-ups are refused and gas-short trades fail.","example":0.02},"isGasWalletLow":{"type":"boolean","description":"True when gas wallet SOL is below the healthy inventory level.","example":false},"isGasWalletBelowHardReserve":{"type":"boolean","description":"True when gas wallet SOL is below the hard reserve — user SOL top-ups are blocked.","example":false},"lowWaterMarkSol":{"type":"number","example":0.05},"targetBalanceSol":{"type":"number","example":0.15},"serverWallets":{"type":"array","items":{"$ref":"#/components/schemas/ServerWalletGasLevelResponseDto"}},"warnings":{"description":"Warnings for low gas wallet or server wallets below low-water mark.","example":[],"type":"array","items":{"type":"string"}}},"required":["checkedAt","gasWalletAddress","gasWalletSolBalance","gasWalletMinSelfSol","gasWalletHardReserveSol","isGasWalletLow","isGasWalletBelowHardReserve","lowWaterMarkSol","targetBalanceSol","serverWallets","warnings"]},"TradeSignalDto":{"type":"object","properties":{"developerAgentId":{"type":"string","description":"Developer agent ID"},"idempotencyKey":{"type":"string","description":"When ≥8 characters, used to build a stable `signalId` (`sig_api_<agentId>_<key>`) so retries dedupe like Telegram `message_id`. Also accepted as `metadata.idempotencyKey` or `context.idempotencyKey`.","maxLength":128},"action":{"type":"string","enum":["buy","sell"]},"tokenAddress":{"type":"string","description":"Solana token address"},"amount":{"type":"number","description":"Trade amount in USD"},"urgency":{"type":"string","enum":["low","medium","high"]},"metadata":{"type":"object","description":"Arbitrary metadata"},"reasoning":{"type":"string","description":"Human-readable synthesis (e.g. parsed channel line summary)."},"context":{"type":"object","description":"Structured provenance / parser context"},"confidence":{"type":"number","description":"Confidence in [0, 1] (clamped server-side).","minimum":0,"maximum":1}},"required":["developerAgentId","action","tokenAddress","amount"]},"SignalReceivedResponseDto":{"type":"object","properties":{"signalId":{"type":"string","example":"sig_1234567890_abc12345"},"status":{"type":"string","example":"executed"},"executionResult":{"$ref":"#/components/schemas/ExecutionResultResponseDto"},"feeReceipt":{"$ref":"#/components/schemas/TradeFeeReceiptResponseDto"}},"required":["signalId","status"]},"StructuredSignalInstrumentDto":{"type":"object","properties":{"tokenAddress":{"type":"string","description":"Solana token mint address."},"market":{"type":"string","description":"Hyperliquid market identifier."},"coin":{"type":"string","description":"Hyperliquid coin symbol (alias for market)."}}},"StructuredSignalEntryZoneDto":{"type":"object","properties":{"priceLow":{"type":"number"},"priceHigh":{"type":"number"}},"required":["priceLow","priceHigh"]},"StructuredSignalTriggerLevelDto":{"type":"object","properties":{"value":{"type":"number"},"targetType":{"type":"string","enum":["price","pct"]},"trailing":{"type":"boolean"}},"required":["value","targetType"]},"StructuredSignalTakeProfitLevelDto":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"number"},"targetType":{"type":"string","enum":["price","pct"]},"sizePct":{"type":"number","description":"Partial close % at this TP; sum ≤ 100."}},"required":["value","targetType"]},"StructuredSignalTriggersDto":{"type":"object","properties":{"slPrice":{"$ref":"#/components/schemas/StructuredSignalTriggerLevelDto"},"tps":{"type":"array","items":{"$ref":"#/components/schemas/StructuredSignalTakeProfitLevelDto"}},"timeStopMins":{"type":"number"}}},"StructuredSignalAmendSlChangeDto":{"type":"object","properties":{"from":{"type":"number"},"to":{"type":"number"}}},"StructuredSignalAmendChangesDto":{"type":"object","properties":{"slPrice":{"$ref":"#/components/schemas/StructuredSignalAmendSlChangeDto"},"tps":{"type":"array","items":{"$ref":"#/components/schemas/StructuredSignalTakeProfitLevelDto"}}}},"AgentInboundWebhookBodyDto":{"type":"object","properties":{"text":{"type":"string","description":"Natural-language signal line. Mutually exclusive with structured JSON fields.","example":"BUY SOL $500 TP 180 SL 165","minLength":1,"maxLength":8000},"version":{"type":"number","description":"Schema version (currently 1).","default":1},"idempotencyKey":{"type":"string","description":"Required dedupe key for structured event payloads.","maxLength":128},"clientTimestamp":{"type":"string","description":"ISO timestamp; server rejects stale market signals (>5 min)."},"eventType":{"type":"string","enum":["trade_idea","buy","scale_in","sell","partial_sell","amend","breakeven","cancel","position_update","trade_review"],"description":"Structured event lifecycle type. When set, activates the full JSON schema path."},"chain":{"type":"string","enum":["solana","hyperliquid"],"default":"solana"},"instrument":{"$ref":"#/components/schemas/StructuredSignalInstrumentDto"},"symbol":{"type":"string","description":"Display symbol (e.g. SOL, BTC)."},"expiresAt":{"type":"string","description":"Optional TTL ISO timestamp."},"side":{"type":"string","enum":["long","short"],"default":"long"},"tradeType":{"type":"string","enum":["spot","perp","virtual"],"default":"spot"},"leverageX":{"type":"number","description":"Perp leverage override."},"orderType":{"type":"string","enum":["market","limit"]},"entryPrice":{"type":"number"},"entryZone":{"$ref":"#/components/schemas/StructuredSignalEntryZoneDto"},"riskMgmt":{"type":"string","enum":["fixed","dynamic"]},"triggers":{"$ref":"#/components/schemas/StructuredSignalTriggersDto"},"positionRef":{"type":"string","description":"tradeId or original idempotencyKey for lifecycle events."},"exitPrice":{"type":"number"},"exitReason":{"type":"string","enum":["tp_hit","sl_hit","time_stop","manual","ai_decision"]},"pnlPct":{"type":"number"},"sellSizePct":{"type":"number","description":"Partial close % (partial_sell only)."},"changes":{"$ref":"#/components/schemas/StructuredSignalAmendChangesDto"},"ideaId":{"type":"string","description":"trade_idea: optional link id for later entry."},"currentPnlPct":{"type":"number","description":"position_update: current unrealized P&L %."},"relatedTradeId":{"type":"string","description":"trade_review: the closed trade being reviewed, as its signalId, your entry idempotencyKey, or its trade id. It must be a closed trade of this agent, otherwise the request is rejected with 400 (`error.field: relatedTradeId`)."},"action":{"type":"string","enum":["buy","sell"],"description":"Legacy structured action when `eventType` is omitted."},"tokenAddress":{"type":"string","description":"Legacy Solana mint (also accepted inside `instrument`)."},"amount":{"type":"number","description":"USD allocation (scaled server-side per subscriber)."},"urgency":{"type":"string","enum":["low","medium","high"]},"metadata":{"type":"object","description":"Arbitrary structured metadata to persist on the trade signal."},"reasoning":{"type":"string","description":"Human-readable rationale; required for full-schema events.","maxLength":4000},"caption":{"type":"string","description":"Optional post written by the developer, used on the post for this event (the entry caption on the open post, the exit caption on the close post). It goes through the same checks and judge as a model draft; if it fails, subscribers see a backup line and the response includes rejection (an early rule check for trades). Include it in the HMAC signature like every other provided field.","maxLength":280},"context":{"type":"object"},"confidence":{"type":"number","minimum":0,"maximum":1}}},"AgentInboundWebhookResponseDto":{"type":"object","properties":{"outcome":{"type":"string","enum":["matched","unmatched","failed","skipped","error"]},"signalId":{"type":"string"},"status":{"type":"string"},"rejection":{"type":"string","description":"Why a developer-written caption was not published. Subscribers still see a backup line."},"skipReason":{"type":"string","description":"When `skipped` or `error`, human/machine-readable detail."},"executionResult":{"type":"object","description":"Present when execution completes (same vocabulary as WebSocket ingress)."}},"required":["outcome"]},"McpTradeBotSearchRowDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"tradeCount":{"type":"number"},"imageUrl":{"type":"string"}},"required":["id","name","tradeCount"]},"McpTradeTokenSearchRowDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"tradeCount":{"type":"number"},"image":{"type":"string","description":"Token logo URL"}},"required":["id","name","tradeCount"]},"McpTradeListItemDto":{"type":"object","properties":{"id":{"type":"string"},"tradeOrigin":{"type":"string","enum":["MANUAL","AGENT"],"description":"How the trade was executed: MANUAL (by user) or AGENT (by bot/agent)"},"agentName":{"type":"string","description":"Name of the agent that executed this trade. Only populated when tradeOrigin is AGENT."}},"required":["id"]},"McpTradeFilterQueryDto":{"type":"object","properties":{"chains":{"type":"array","description":"Comma-separated chain names","items":{"type":"string","enum":["SOLANA","CHILIZ","FLOW","ARBITRUM","BASE","HYPERLIQUID"]}},"statuses":{"type":"array","description":"Comma-separated transaction statuses","items":{"type":"string","enum":["PENDING","FINALIZED","FAILED","PENDING_APPROVAL","CANCELLED"]}},"types":{"type":"array","description":"Comma-separated transaction types","items":{"type":"string","enum":["SINGLE_TRADE","SINGLE_SELL","TOTAL_TRANSACTIONS","BUY_TRANSACTIONS_AMOUNT","SELL_TRANSACTIONS_AMOUNT","DEPOSIT","WITHDRAWAL","BUY","SELL","CLAIM","FEE","ALLOCATE_TO_AGENT","WITHDRAW_FROM_AGENT","SUBSCRIPTION_CHARGE"]}},"isVirtual":{"type":"boolean"},"timestampFrom":{"type":"string"},"timestampTo":{"type":"string"},"minAmount":{"type":"string"},"maxAmount":{"type":"string"},"minFee":{"type":"string"},"maxFee":{"type":"string"},"signatureSearch":{"type":"string"},"hasError":{"type":"boolean"},"hasBalanceChanges":{"type":"boolean"},"tradeStatuses":{"type":"array","description":"Comma-separated trade statuses","items":{"type":"string","enum":["OPEN","CLOSED"]}},"tradeOwnerTypes":{"type":"array","description":"Comma-separated trade owner types","items":{"type":"string","enum":["BOT_TRADE","AGENT_TRADE","USER_TRADE"]}},"botIds":{"description":"Comma-separated MongoDB bot ids","type":"array","items":{"type":"string"}},"tokenIds":{"description":"Comma-separated MongoDB token ids","type":"array","items":{"type":"string"}},"tokenMints":{"description":"Comma-separated token mint addresses","type":"array","items":{"type":"string"}},"isProfitable":{"type":"boolean"},"minProfitPercentage":{"type":"string"},"maxProfitPercentage":{"type":"string"},"search":{"type":"string","description":"Search token or bot name"}}},"McpTokenListItemDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"}},"required":["id"]},"McpTokenPaginatedListDataDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpTokenListItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"},"topPerformers":{"description":"Present when `filters.includeTopPerformers` is true","type":"array","items":{"$ref":"#/components/schemas/McpTokenListItemDto"}}},"required":["items","pagination"]},"McpTrendingTokenFiltersQueryDto":{"type":"object","properties":{"minMarketCap":{"type":"number"},"maxMarketCap":{"type":"number"},"minVolume24h":{"type":"number"},"minPriceChange24h":{"type":"number"},"chains":{"type":"array","items":{"type":"string","enum":["SOLANA","CHILIZ","FLOW","ARBITRUM","BASE","HYPERLIQUID"]}},"minHolders":{"type":"number"},"minUniqueBuyers":{"type":"number"}}},"McpTokenFiltersQueryDto":{"type":"object","properties":{"minMarketCap":{"type":"number"},"maxMarketCap":{"type":"number"},"minVolume24h":{"type":"number"},"maxVolume24h":{"type":"number"},"minPriceChange24h":{"type":"number"},"maxPriceChange24h":{"type":"number"},"minPrice":{"type":"number"},"maxPrice":{"type":"number"},"minLiquidity":{"type":"number"},"maxLiquidity":{"type":"number"},"minTransactions":{"type":"number"},"maxTransactions":{"type":"number"},"chains":{"type":"array","items":{"type":"string","enum":["SOLANA","CHILIZ","FLOW","ARBITRUM","BASE","HYPERLIQUID"]}},"minHolders":{"type":"number"},"isSwapToken":{"type":"boolean"},"includeTopPerformers":{"type":"boolean","description":"Include top performers block in the response"}}},"McpTokenDocumentResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"logoUri":{"type":"string"}},"required":["id"]},"McpWatchlistItemBodyDto":{"type":"object","properties":{"tokenId":{"type":"string","description":"Token id. For PERPS send the Spot token id with the same symbol (the Hyperliquid token id only when no Spot token exists).","example":"507f1f77bcf86cd799439011"},"market":{"type":"string","description":"Market of the row","enum":["SPOT","PERPS"],"example":"SPOT"}},"required":["tokenId","market"]},"McpWatchlistItemDto":{"type":"object","properties":{"tokenId":{"type":"string","example":"507f1f77bcf86cd799439011"},"market":{"type":"string","enum":["SPOT","PERPS"]},"createdAt":{"type":"string","format":"date-time"},"token":{"nullable":true,"description":"Token document (only on GET). Null when the token no longer exists.","type":"object","allOf":[{"$ref":"#/components/schemas/McpTokenDocumentResponseDto"}]}},"required":["tokenId","market","createdAt"]},"McpWatchlistDataDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpWatchlistItemDto"}}},"required":["items"]},"McpAddToWatchlistDataDto":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string","nullable":true,"description":"WATCHLIST_TOKEN_NOT_FOUND | WATCHLIST_LIMIT_REACHED"},"item":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/McpWatchlistItemDto"}]}},"required":["success"]},"McpRemoveFromWatchlistDataDto":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string","nullable":true,"description":"WATCHLIST_TOKEN_NOT_FOUND | WATCHLIST_LIMIT_REACHED"}},"required":["success"]},"McpCreateTradingBotBodyDto":{"type":"object","properties":{}},"McpStrategyStatusCountRowDto":{"type":"object","properties":{"status":{"type":"string"},"count":{"type":"number"}},"required":["status","count"]},"McpStrategyCategoryCountRowDto":{"type":"object","properties":{"category":{"type":"string"},"count":{"type":"number"}},"required":["category","count"]},"McpStrategyStatusCountsDataDto":{"type":"object","properties":{"statusCounts":{"type":"array","items":{"$ref":"#/components/schemas/McpStrategyStatusCountRowDto"}},"categoryCounts":{"type":"array","items":{"$ref":"#/components/schemas/McpStrategyCategoryCountRowDto"}},"totalCount":{"type":"number"},"userId":{"type":"string"}},"required":["statusCounts","categoryCounts","totalCount"]},"McpStrategyTagRowDto":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string"},"usageCount":{"type":"number"},"isCustom":{"type":"boolean"},"createdBy":{"type":"string"}},"required":["name","category","usageCount","isCustom"]},"McpTierMarginFeeRateDto":{"type":"object","properties":{"tier":{"type":"string","example":"WOOD"},"marginFeePercentage":{"type":"number","description":"Margin fee rate as percent (collateral, not notional)","example":0.95}},"required":["tier","marginFeePercentage"]},"McpPlatformFeesDataDto":{"type":"object","properties":{"feeModel":{"type":"string","example":"v4","description":"Active fee model for new opens"},"platformFeePercentage":{"type":"number","description":"Legacy v2 notional fee (%)","example":2.5},"marginBased":{"type":"boolean","description":"Tier rates apply to margin/collateral when true"},"tierMarginFeeRates":{"type":"array","items":{"$ref":"#/components/schemas/McpTierMarginFeeRateDto"}},"defaultBotFeePercentage":{"type":"number"},"transactionFeeLamports":{"type":"number"},"transactionFeeSol":{"type":"number"}},"required":["feeModel","platformFeePercentage","marginBased","tierMarginFeeRates","defaultBotFeePercentage","transactionFeeLamports","transactionFeeSol"]},"McpStrategyListItemDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"}},"required":["id"]},"TradingBotsFilterInput":{"type":"object","properties":{}},"McpStrategyWithdrawalRowDto":{"type":"object","properties":{"amount":{"type":"number"},"status":{"type":"string"},"date":{"type":"string"}}},"McpStrategyControlAckDto":{"type":"object","properties":{"botId":{"type":"string"},"status":{"type":"string"},"message":{"type":"string"},"affectedBotCount":{"type":"number"}}},"McpStrategyStopTradesDataDto":{"type":"object","properties":{"botId":{"type":"string"},"tradesStoppedCount":{"type":"number"},"message":{"type":"string"}}},"McpStrategyClaimFeesDataDto":{"type":"object","properties":{"claimedAmount":{"type":"number"},"transactionSignature":{"type":"string"},"estimatedCompletion":{"type":"string"},"message":{"type":"string"}}},"McpStrategyDeleteDataDto":{"type":"object","properties":{"botId":{"type":"string"},"botName":{"type":"string"},"message":{"type":"string"}}},"McpCreateAgentPersonalizationDto":{"type":"object","properties":{"imageUrl":{"type":"string"},"style":{"type":"string","enum":["DEFAULT","PROFESSIONAL","FRIENDLY","CANDID","QUIRKY","EFFICIENT","NERDY","CYNICAL"]},"customInstructions":{"type":"string"},"bio":{"type":"string"},"interests":{"type":"array","items":{"type":"string","enum":["CARS_AND_RACING","COMEDY","COOKING_AND_FOOD","CINEMA","FANTASY","MUSIC","FASHION","FITNESS","CODING","TECH","SOCCER","SPORT","BASKETBALL","GYM","RUNNING","SKATEBOARDING","GAMING","TRAVEL","PHILOSOPHY","HISTORY","WELLNESS","TV","FILM","SCIENCE","ANIMALS"]}}}},"McpCreateAgentFeeConfigurationDto":{"type":"object","properties":{"feePercentage":{"type":"number","minimum":0,"maximum":22,"example":5,"description":"Same creator rate as `marketplaceSuccessFeePercent`; both are stored together. EchoZero adds 8%."},"chargeOnPerformance":{"type":"boolean"},"hideFromPublic":{"type":"boolean"}}},"SignalExecutionTakeProfitTierDto":{"type":"object","properties":{"closePercent":{"type":"number"},"whenPositionPercent":{"type":"number"},"action":{"type":"string","enum":["close-part","alert"]}}},"SignalExecutionTakeProfitLadderLevelDto":{"type":"object","properties":{"label":{"type":"string","example":"TP1"},"value":{"type":"number","description":"Target. For `pct`: unsigned % distance from entry in the trade's favour. For `price`: absolute USD price.","example":10},"targetType":{"type":"string","enum":["pct","price"]},"sizePct":{"type":"number","description":"% of the position closed at this rung. All rungs sum to 100.","example":50}}},"SignalGroupExecutionDefaultsDto":{"type":"object","properties":{"marketType":{"type":"string","enum":["spot","perpetual","both"],"description":"Ignored on write. Stored value is derived from the agent venue: Jupiter spot, Hyperliquid perpetual."},"leverageMode":{"type":"string","enum":["fixed","signal-defined","disabled"]},"leverageMax":{"type":"number","minimum":1,"maximum":125},"tradeSizeMode":{"type":"string","enum":["fixed","percent","signal-defined"]},"tradeSizeValue":{"type":"number"},"stopLossMode":{"type":"string"},"stopLossValue":{"type":"number"},"stopLossAboveEntry":{"type":"boolean"},"takeProfitMode":{"type":"string"},"takeProfitValue":{"type":"number"},"takeProfitTiers":{"type":"array","items":{"$ref":"#/components/schemas/SignalExecutionTakeProfitTierDto"}},"takeProfitLadder":{"description":"Default TP ladder (1–3 rungs) when `takeProfitMode` is `tiered`. `sizePct` must sum to 100.","type":"array","items":{"$ref":"#/components/schemas/SignalExecutionTakeProfitLadderLevelDto"}},"timeStopMins":{"type":"number","description":"Auto-close the position after this many minutes regardless of price.","minimum":1,"maximum":43200},"tradeType":{"type":"string","enum":["spot","perp","manual","virtual"],"description":"Trade type shown on subscriber trade cards when a signal omits one. `spot` needs marketType spot/both, `perp` needs perpetual/both."},"tradeMode":{"type":"string","enum":["auto","alert","virtual"],"description":"Default subscriber trade mode: auto-execute, alert (user confirms each trade) or virtual (paper)."},"defaultTradeAllocationUsd":{"type":"number","description":"Suggested USD allocation per signal. Subscribers can override it per trade.","example":100},"signalOverridesDefaults":{"type":"boolean"},"timeInForce":{"type":"string","enum":["IOC","GTC"]},"maxPositionMode":{"type":"string"},"maxPositionPct":{"type":"number"},"maxOpenPositions":{"type":"number"},"maxDailyLossMode":{"type":"string"},"maxDailyLossPct":{"type":"number"},"cooldownSeconds":{"type":"number"},"maxTradesPerDay":{"type":"number","description":"Max new position openings per UTC day (0 = unlimited). Lifecycle edits and DCA do not count."},"trailingStop":{"type":"boolean"},"slippageMode":{"type":"string"},"slippageTolerance":{"type":"number","description":"Legacy alias for entryDriftTolerancePct when slippageMode is custom (platform default 0.5)."},"entryDriftTolerancePct":{"type":"number","description":"Max adverse live-vs-signal entry drift in percent before the opening trade is skipped (platform default 0.5). Favourable drift never skips."},"entryWaitTimeoutMinutes":{"type":"number","description":"Minutes a zone / unfilled DCA entry may wait for price touch (default 15). Signal expiresAt overrides."},"tokenWhitelist":{"type":"array","items":{"type":"string"}},"tokenBlacklist":{"type":"array","items":{"type":"string"}}}},"McpCreateAgentBodyDto":{"type":"object","properties":{"name":{"type":"string","example":"My trading agent","description":"Display name (max 20 characters)","maxLength":20},"description":{"type":"string","example":"Momentum strategies on Solana memecoins"},"imageUrl":{"type":"string","example":"avatars/my-agent.png"},"tags":{"example":["SOL","DEFI"],"type":"array","items":{"type":"string"}},"personalization":{"$ref":"#/components/schemas/McpCreateAgentPersonalizationDto"},"isPublic":{"type":"boolean","example":false,"description":"true asks to list the agent: an approved agent is listed now; otherwise it stays private and goes to staff review (listingStatus pending-review). false makes it private (and cancels a pending review)."},"feeConfiguration":{"$ref":"#/components/schemas/McpCreateAgentFeeConfigurationDto"},"isDraft":{"type":"boolean","example":true,"description":"When true, agent is saved as draft (not fully activated)"},"strategyDescription":{"type":"string"},"marketplacePricingModel":{"type":"string","enum":["subscription","success-fee","both","free"]},"marketplaceMonthlyPrice":{"type":"number","minimum":0},"marketplaceSuccessFeePercent":{"type":"number","minimum":0,"maximum":22,"default":20},"listingStatus":{"type":"string","enum":["pending-review","beta","public","rejected","shadow-monitoring"],"description":"Staff only. A change is rejected (`LISTING_STATUS_STAFF_ONLY`); the current value is ignored. To list the agent send `isPublic: true`, which starts a staff review."},"betaStartDate":{"format":"date-time","type":"string","description":"Ignored. The agent beta stage was removed."},"maxBetaUsers":{"type":"number","minimum":1},"performanceStats":{"type":"object","description":"Ignored. Performance numbers come from real trades only."},"featured":{"type":"boolean","description":"Ignored. Featured is set by EchoZero staff."},"featuredRank":{"type":"number","description":"Ignored. Featured order is set by EchoZero staff."},"inboundWebhookUrl":{"type":"string"},"signalSourceKind":{"type":"string","enum":["webhook","signal_group"]},"connectedChannels":{"type":"array","items":{"type":"object"}},"signalDetectionRule":{"type":"object"},"signalExecutionDefaults":{"description":"Agent trading defaults (whole object, replaces the stored value). Trade-card fields (tradeType, tradeMode, defaultTradeAllocationUsd, takeProfitLadder, timeStopMins) are validated on save.","allOf":[{"$ref":"#/components/schemas/SignalGroupExecutionDefaultsDto"}]},"parserAiMode":{"type":"string","enum":["inherit","off","shadow","fallback"],"description":"Per-agent hybrid parser: inherit (server env), off, shadow, or fallback."},"membershipGated":{"type":"boolean"},"gatedPlatform":{"type":"string","enum":["telegram","discord"],"description":"Required when membershipGated is true. Telegram or Discord. Independent of connected channels."},"externalSignupUrl":{"type":"string"},"agentVenue":{"type":"string","enum":["JUPITER","HYPERLIQUID","ONEINCH","ALL_PLATFORMS"],"description":"Venue lock (Jupiter or Hyperliquid). Immutable after create. OneInch/All Platforms rejected until enabled."},"agentChain":{"type":"string","enum":["SOLANA","CHILIZ","FLOW","ARBITRUM","BASE","HYPERLIQUID"],"description":"Required only for OneInch agents (BASE or ARBITRUM)."},"maxConcurrentPositions":{"type":"number","minimum":1,"default":4,"description":"Max concurrent open positions. Default 4."},"maxEntriesPerTrade":{"type":"number","minimum":1,"default":3,"description":"Max DCA entries per open trade. Default 3."},"tradeVisibility":{"type":"string","enum":["PUBLIC_IMMEDIATELY","SUBSCRIBERS_FIRST","SUBSCRIBERS_ONLY"],"description":"Who sees this agent's live trades, and when. New agents default to PUBLIC_IMMEDIATELY."},"tradeRevealDelaySeconds":{"type":"number","nullable":true,"enum":[30,60,300,900,3600],"description":"Seconds before non-subscribers see live trades (30, 60, 300, 900 or 3600). Only with SUBSCRIBERS_FIRST; null uses the 60s default."}},"required":["name"]},"McpDuplicateAgentBodyDto":{"type":"object","properties":{"name":{"type":"string","maxLength":20,"description":"Name for the duplicate; default is source name + \" (Copy)\" (truncated to 20 chars)"}}},"McpUploadAgentAvatarBodyDto":{"type":"object","properties":{"imageData":{"type":"string","description":"Base64 image bytes. Data URLs such as `data:image/png;base64,...` are also accepted.","example":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB..."},"mimeType":{"type":"string","description":"Required when imageData is raw base64. Ignored when imageData is a data URL.","example":"image/png"}},"required":["imageData"]},"AgentPersonalizationInput":{"type":"object","properties":{}},"AgentFeeConfigurationInput":{"type":"object","properties":{}},"McpAgentPersonalityOverrideDto":{"type":"object","properties":{"style":{"type":"string","enum":["DEFAULT","PROFESSIONAL","FRIENDLY","CANDID","QUIRKY","EFFICIENT","NERDY","CYNICAL"]},"customInstructions":{"type":"string"}}},"McpUpdateAgentBodyDto":{"type":"object","properties":{"name":{"type":"string","description":"Display name (max 20 characters)","maxLength":20},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"personalization":{"$ref":"#/components/schemas/AgentPersonalizationInput"},"isPublic":{"type":"boolean","description":"true asks to list the agent: an approved agent is listed now; otherwise it stays private and goes to staff review (listingStatus pending-review). false makes it private (and cancels a pending review)."},"feeConfiguration":{"$ref":"#/components/schemas/AgentFeeConfigurationInput"},"status":{"type":"string","enum":["DRAFT","ACTIVE","PAUSED","DELETED"]},"closeActiveTrades":{"type":"boolean","description":"When setting status to PAUSED: required for private agents (true = close owner trades first, false = keep open). Optional for public agents."},"strategyDescription":{"type":"string"},"marketplacePricingModel":{"type":"string","enum":["subscription","success-fee","both","free"]},"marketplaceMonthlyPrice":{"type":"number","minimum":0},"marketplaceSuccessFeePercent":{"type":"number","minimum":0,"maximum":22,"default":20},"listingStatus":{"type":"string","enum":["pending-review","beta","public","rejected","shadow-monitoring"],"description":"Staff only. A change is rejected (`LISTING_STATUS_STAFF_ONLY`); the current value is ignored. To list the agent send `isPublic: true`, which starts a staff review."},"betaStartDate":{"format":"date-time","type":"string","description":"Ignored. The agent beta stage was removed."},"maxBetaUsers":{"type":"number","minimum":1},"performanceStats":{"type":"object","description":"Ignored. Performance numbers come from real trades only."},"featured":{"type":"boolean","description":"Ignored. Featured is set by EchoZero staff."},"featuredRank":{"type":"number","description":"Ignored. Featured order is set by EchoZero staff."},"inboundWebhookUrl":{"type":"string"},"signalSourceKind":{"type":"string","enum":["webhook","signal_group"]},"connectedChannels":{"type":"array","items":{"type":"object"}},"signalDetectionRule":{"type":"object"},"signalExecutionDefaults":{"description":"Agent trading defaults (whole object, replaces the stored value). Trade-card fields (tradeType, tradeMode, defaultTradeAllocationUsd, takeProfitLadder, timeStopMins) are validated on save.","allOf":[{"$ref":"#/components/schemas/SignalGroupExecutionDefaultsDto"}]},"parserAiMode":{"type":"string","enum":["inherit","off","shadow","fallback"],"description":"Per-agent hybrid parser: inherit (server env), off, shadow, or fallback."},"membershipGated":{"type":"boolean"},"gatedPlatform":{"type":"string","enum":["telegram","discord"],"description":"Required when membershipGated is true. Telegram or Discord. Independent of connected channels."},"externalSignupUrl":{"type":"string"},"rotateInboundWebhookSigningSecret":{"type":"boolean","description":"When true and signalSourceKind is webhook, rotate inbound signing secret (returned once on the agent payload)"},"personality":{"nullable":true,"description":"API personality override for subscriber chat. Stored as personalization.apiOverride and takes precedence over portal defaults. Pass null to clear.","type":"object","allOf":[{"$ref":"#/components/schemas/McpAgentPersonalityOverrideDto"}]},"agentVenue":{"type":"string","enum":["JUPITER","HYPERLIQUID","ONEINCH","ALL_PLATFORMS"],"description":"Rejected if changed after create (venue lock is immutable)."},"agentChain":{"type":"string","enum":["SOLANA","CHILIZ","FLOW","ARBITRUM","BASE","HYPERLIQUID"]},"maxConcurrentPositions":{"type":"number","minimum":1},"maxEntriesPerTrade":{"type":"number","minimum":1},"tradeVisibility":{"type":"string","enum":["PUBLIC_IMMEDIATELY","SUBSCRIBERS_FIRST","SUBSCRIBERS_ONLY"],"description":"Who sees this agent's live trades, and when. Switching away from SUBSCRIBERS_FIRST clears tradeRevealDelaySeconds."},"tradeRevealDelaySeconds":{"type":"number","nullable":true,"enum":[30,60,300,900,3600],"description":"Seconds before non-subscribers see live trades (30, 60, 300, 900 or 3600). Only with SUBSCRIBERS_FIRST (current or sent in the same call); null resets to the default (60)."}}},"McpFollowAgentsBodyDto":{"type":"object","properties":{"agentIds":{"minItems":1,"maxItems":50,"description":"Agent ids to follow. Already-followed agents are skipped; unknown or private agents are left out of the result.","type":"array","items":{"type":"string"}}},"required":["agentIds"]},"McpAgentAvatarUploadDataDto":{"type":"object","properties":{"agentId":{"type":"string"},"avatarUrl":{"type":"string"},"imageUrl":{"type":"string","description":"Canonical Agent.imageUrl field updated by the upload."}},"required":["agentId","avatarUrl","imageUrl"]},"PersonaModelledOnDto":{"type":"object","properties":{"name":{"type":"string","example":"Karl Pilkington","maxLength":80},"from":{"type":"string","example":"An Idiot Abroad","maxLength":80},"note":{"type":"string","example":"Bemused by everything, mildly put upon.","maxLength":300}},"required":["name"]},"PersonaIdentityDto":{"type":"object","properties":{"name":{"type":"string","example":"Dry","maxLength":40},"modelledOn":{"description":"Up to 3 people or characters to write like. Posts never name or quote them.","type":"array","items":{"$ref":"#/components/schemas/PersonaModelledOnDto"}},"who":{"type":"string","example":"A deadpan trader who states the trade and stops.","maxLength":1500},"voice":{"type":"string","example":"Short. Flat. Undersells.","maxLength":1500},"motive":{"type":"string","example":"Undersell everything and point out how ridiculous it all is.","maxLength":500,"nullable":true},"runningJoke":{"type":"string","example":"Still waiting for the kettle.","maxLength":500,"nullable":true}}},"PersonaHabitsDto":{"type":"object","properties":{"casing":{"type":"array","example":["lower"],"items":{"type":"string","enum":["lower","sentence","upper"]}},"punctuation":{"type":"array","example":["light"],"items":{"type":"string","enum":["light","normal"]}},"directness":{"type":"array","example":["measured"],"items":{"type":"string","enum":["measured","blunt"]}},"confidenceDisplay":{"type":"array","example":["quiet"],"items":{"type":"string","enum":["quiet","loud"]}},"followerWords":{"description":"Up to 8 words for followers, 24 characters each.","example":["mate"],"type":"array","items":{"type":"string"}},"emojiPool":{"description":"Up to 40 emoji.","example":["🙃"],"type":"array","items":{"type":"string"}},"humourRate":{"description":"[low, high] share of posts, 0 to 1.","example":[0.2,0.35],"type":"array","items":{"type":"number"}},"swearRate":{"description":"[low, high] share of posts, 0 to 0.5 (the plan.swear ceiling). [0, 0] turns swearing off.","example":[0,0],"type":"array","items":{"type":"number"}},"emojiRate":{"example":[0.05,0.15],"type":"array","items":{"type":"number"}},"addressRate":{"example":[0.02,0.1],"type":"array","items":{"type":"number"}}}},"PersonaPlanLengthDto":{"type":"object","properties":{"short":{"type":"number","example":50,"description":"Weight 0 to 100."},"mid":{"type":"number","example":40},"long":{"type":"number","example":10}}},"PersonaPlanDto":{"type":"object","properties":{"length":{"$ref":"#/components/schemas/PersonaPlanLengthDto"},"shapes":{"type":"object","description":"Shape name to weight (0 to 3). Unknown shapes are rejected.","example":{"fragment":1.2,"flowing":0.8}},"emoji":{"type":"number","example":0.1,"maximum":0.8},"caps":{"type":"number","example":0,"maximum":0.5},"question":{"type":"number","example":0.1,"maximum":0.5},"lineBreak":{"type":"number","example":0.1,"maximum":0.5},"address":{"type":"number","example":0.05,"maximum":0.6},"swear":{"type":"number","example":0,"maximum":0.5},"slang":{"type":"number","example":0,"maximum":0.6},"plain":{"type":"number","example":0.3,"maximum":1},"noFullStop":{"type":"number","example":0.4,"maximum":1},"lowercase":{"type":"boolean","example":true}}},"PersonaAnalysisDto":{"type":"object","properties":{"rate":{"type":"object","description":"Share of posts that explain the trade, per post type (idea, open, stop_moved, take_profit, win, review, update, small_loss). Capped at 0.9.","example":{"idea":0.6,"review":0.8}},"styles":{"type":"object","description":"Weights for punchy, proper and split.","example":{"punchy":0.5,"proper":0.3,"split":0.2}}}},"PersonaBackupLineDto":{"type":"object","properties":{"type":{"type":"string","enum":["idea","open","up","down","stop_moved","take_profit","win","loss","review"],"example":"loss","description":"Simple form. Send `type` or `states`."},"states":{"example":["close_loss_small"],"description":"Engine states, as exported by GET persona.","type":"array","items":{"type":"string"}},"text":{"type":"string","example":"Small one. Moving on.","maxLength":280},"when":{"type":"object","description":"Extra conditions: closedBy (list), giveback (boolean), fractionMin, fractionMax.","example":{"closedBy":["stop"]}}},"required":["text"]},"PersonaExamplesDto":{"type":"object","properties":{"byMoment":{"type":"object","description":"Example posts by post type: idea, open, up, down, stop_moved, take_profit, win, loss, review. Up to 30 each. Write the ticker as {token}.","example":{"open":["In. {token}. Fine."],"loss":["Well. That happened."]}},"lines":{"description":"Example posts with no post type, such as real past posts.","example":["{token}. apparently."],"type":"array","items":{"type":"string"}},"analysis":{"type":"object","description":"Explaining posts: { postType: { punchy: [], proper: [], split: [] } }. Up to 10 per style, 480 characters each.","example":{"idea":{"punchy":["{token}. range high broke. that is the whole thought."]}},"nullable":true}}},"PersonaSettingsBodyDto":{"type":"object","properties":{"version":{"type":"string","example":"settings-1"},"base":{"type":"string","example":"DRY","description":"FRIENDLY, CYNICAL, QUIRKY, DRY, COCKY, HYPE_NERD, DEGEN, CALM, or BLANK. Old style names are mapped. An unknown name is rejected."},"identity":{"$ref":"#/components/schemas/PersonaIdentityDto"},"habits":{"$ref":"#/components/schemas/PersonaHabitsDto"},"plan":{"description":"How often each habit fires, per post. Capped per field.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PersonaPlanDto"}]},"analysis":{"$ref":"#/components/schemas/PersonaAnalysisDto"},"emojiByMoment":{"type":"object","description":"Emoji per post type, up to 20 each.","example":{"win":["🙂"],"loss":[]},"nullable":true},"bannedWords":{"description":"Added to the base list. Platform banned words are never removed.","example":["moon","guaranteed"],"type":"array","items":{"type":"string"}},"backupLines":{"description":"Up to 40. Your own lines are used only after a review pass; until then the platform lines for that post type are used.","type":"array","items":{"$ref":"#/components/schemas/PersonaBackupLineDto"}},"examples":{"$ref":"#/components/schemas/PersonaExamplesDto"}},"required":["version","base"]},"PersonaBaseDto":{"type":"object","properties":{"style":{"type":"string","example":"DRY"},"name":{"type":"string","example":"Dry"},"description":{"type":"string","example":"Undersell everything and point out how ridiculous it all is."},"samplePosts":{"description":"Up to 3 example posts in this voice, with $SOL as the token.","example":["$SOL. apparently."],"type":"array","items":{"type":"string"}},"optIn":{"type":"boolean","description":"True for Degen, Cynical, Cocky and Blank: never auto-assigned, only used when a developer picks it.","example":false}},"required":["style","name","description","samplePosts","optIn"]},"PersonaBaseDetailDto":{"type":"object","properties":{"style":{"type":"string","example":"DRY"},"name":{"type":"string","example":"Dry"},"description":{"type":"string","example":"Undersell everything and point out how ridiculous it all is."},"samplePosts":{"description":"Up to 3 example posts in this voice, with $SOL as the token.","example":["$SOL. apparently."],"type":"array","items":{"type":"string"}},"optIn":{"type":"boolean","description":"True for Degen, Cynical, Cocky and Blank: never auto-assigned, only used when a developer picks it.","example":false},"settings":{"description":"Every setting of this base in settings-1. Pre-fill the editor with it when a developer starts from this base.","allOf":[{"$ref":"#/components/schemas/PersonaSettingsBodyDto"}]}},"required":["style","name","description","samplePosts","optIn","settings"]},"PersonaBasesResponseDto":{"type":"object","properties":{"bases":{"type":"array","items":{"$ref":"#/components/schemas/PersonaBaseDto"}}},"required":["bases"]},"PersonaLockedRulesDto":{"type":"object","properties":{"maxChars":{"type":"number","example":280,"description":"Maximum characters per post."},"analysisMaxChars":{"type":"number","example":480,"description":"Maximum characters for a post that explains the trade."},"platformBannedWords":{"description":"Banned words that come with the base. Developers can add words, never remove these.","example":["guaranteed","risk-free"],"type":"array","items":{"type":"string"}},"rules":{"description":"Safety and fact rules that no setting can change.","type":"array","items":{"type":"string"}}},"required":["maxChars","analysisMaxChars","platformBannedWords","rules"]},"PersonaRemovedItemDto":{"type":"object","properties":{"what":{"type":"string","example":"custom fallback"},"text":{"type":"string","example":"Guaranteed bounce from here."},"reason":{"type":"string","example":"promises an outcome"}},"required":["what","reason"]},"AgentPersonaValidationDto":{"type":"object","properties":{"warnings":{"description":"Compiler notes, such as too few examples. They do not block a save.","type":"array","items":{"type":"string"}},"removed":{"description":"Lines the compiler would leave out, and why.","type":"array","items":{"$ref":"#/components/schemas/PersonaRemovedItemDto"}},"resolvedSettings":{"description":"Every setting the voice would use, base values filled in.","allOf":[{"$ref":"#/components/schemas/PersonaSettingsBodyDto"}]},"profileHash":{"type":"string","description":"Content hash the saved voice would have."},"locked":{"$ref":"#/components/schemas/PersonaLockedRulesDto"}},"required":["warnings","removed","resolvedSettings","profileHash","locked"]},"TelegramBotMetadataResponseDto":{"type":"object","properties":{"botUsername":{"type":"string","description":"Bot @username shown in the developer portal (add this bot as channel admin).","example":"@EchoZeroSignalBot"}},"required":["botUsername"]},"DiscordBotMetadataResponseDto":{"type":"object","properties":{"applicationId":{"type":"string","description":"Discord application (client) id for OAuth invite links.","example":"1234567890123456789"},"inviteUrl":{"type":"string","description":"Bot invite URL with View Channel + Read Message History (no `state`; use oauth-url for per-agent state)."},"botUsername":{"type":"string","description":"Bot username from `GET /users/@me` when token is configured.","example":"EchoZeroSignalBot"}},"required":["applicationId","inviteUrl"]},"McpAgentOwnerStakeDto":{"type":"object","properties":{"enabled":{"type":"boolean","description":"False while the rule is switched off (nothing is enforced)."},"requiredUsd":{"type":"number","description":"USD needed to go public; locked from that tap."},"floorUsd":{"type":"number","description":"The agent stays listed while the stake is at least this."},"currentUsd":{"type":"number","description":"Owner’s own real-money agent balance (closed trades only)."},"lockedUsd":{"type":"number","description":"Cannot be withdrawn while the agent is public or waiting for review."},"shortSince":{"type":"string","nullable":true,"description":"Under the floor since (ISO); top up within the grace period."},"delistedAt":{"type":"string","nullable":true,"description":"Hidden from the marketplace since (ISO); existing subscribers keep running."},"waived":{"type":"boolean","description":"Staff waived the stake for this agent."},"ownerFunded":{"type":"boolean","description":"Public \"Owner-funded\" badge: stake at least the floor and the owner’s own copy not paused."}},"required":["enabled","requiredUsd","floorUsd","currentUsd","lockedUsd","waived","ownerFunded"]},"McpAgentListItemDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"ownerStake":{"nullable":true,"description":"EZ-1170 owner stake. Returned by `GET /v1/agents/:id` only.","type":"object","allOf":[{"$ref":"#/components/schemas/McpAgentOwnerStakeDto"}]}},"required":["id"]},"OnboardingAgentsFilterInput":{"type":"object","properties":{}},"McpFollowingAgentDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"image":{"type":"string","nullable":true},"isFollowing":{"type":"boolean"},"followerCount":{"type":"number"},"subscriberCount":{"type":"number","description":"Subscriber count for the viewer wallet mode"}},"required":["id","name","isFollowing","followerCount"]},"McpAgentFollowStateDto":{"type":"object","properties":{"id":{"type":"string","description":"Agent ID"},"isFollowing":{"type":"boolean"},"followerCount":{"type":"number","description":"Follower count after the write"}},"required":["id","isFollowing","followerCount"]},"McpFollowAgentsDataDto":{"type":"object","properties":{"agents":{"type":"array","items":{"$ref":"#/components/schemas/McpAgentFollowStateDto"}}},"required":["agents"]},"String":{"type":"object","properties":{}},"ExploreAgentsFilterInput":{"type":"object","properties":{}},"AgentPersonaVersionDto":{"type":"object","properties":{"version":{"type":"number","example":3},"persona":{"type":"string"},"voice":{"type":"string"},"examples":{"type":"string"},"bannedWords":{"type":"string"},"settings":{"description":"The settings exactly as saved. Saving them back keeps the voice; an auto-assigned voice keeps swearing off.","allOf":[{"$ref":"#/components/schemas/PersonaSettingsBodyDto"}]},"resolvedSettings":{"description":"Every setting the voice uses, base values filled in. Use it to pre-fill an editor.","allOf":[{"$ref":"#/components/schemas/PersonaSettingsBodyDto"}]},"baseStyle":{"type":"string","example":"DRY"},"autoAssigned":{"type":"boolean","description":"True when the owner never picked a voice and the platform assigned one from the safe pool (no swearing)."},"profileHash":{"type":"string","description":"Content hash of the compiled voice. Each post stores the hash that wrote it."},"warnings":{"description":"Compiler notes, such as too few examples or removed lines. They do not block the save.","type":"array","items":{"type":"string"}},"removed":{"description":"Lines the compiler left out of the voice (for example a backup line that breaks a rule), and why.","type":"array","items":{"$ref":"#/components/schemas/PersonaRemovedItemDto"}},"locked":{"$ref":"#/components/schemas/PersonaLockedRulesDto"},"updatedAt":{"type":"string","format":"date-time"}},"required":["version","persona","voice","examples","bannedWords","locked","updatedAt"]},"AgentPersonaVersionSummaryDto":{"type":"object","properties":{"version":{"type":"number","example":3},"updatedAt":{"type":"string","format":"date-time"}},"required":["version","updatedAt"]},"AgentPersonaPreviewSampleDto":{"type":"object","properties":{"eventType":{"type":"string","example":"TRADE_OPEN"},"samplePost":{"type":"string"},"status":{"type":"string","enum":["generated","backup","unavailable"],"description":"generated is a checked draft. backup means the draft was blocked. unavailable means the writer could not run. Preview never publishes."},"reason":{"type":"string"}},"required":["eventType","samplePost"]},"AgentPersonaPreviewResponseDto":{"type":"object","properties":{"samples":{"type":"array","items":{"$ref":"#/components/schemas/AgentPersonaPreviewSampleDto"}},"warnings":{"description":"Compiler notes for the previewed draft, such as too few examples.","type":"array","items":{"type":"string"}}},"required":["samples"]},"FeedPreviewScenarioDto":{"type":"object","properties":{"eventType":{"type":"string","example":"TRADE_OPEN","enum":["TRADE_OPEN","TRADE_CLOSED","POSITION_UPDATE","STOP_LOSS_TRIGGERED","TAKE_PROFIT_TRIGGERED","PNL_MILESTONE","SUBSCRIPTION_MILESTONE","TRADE_IDEA","POST_TRADE_REVIEW"]},"tokenSymbol":{"type":"string","example":"USDC"},"summary":{"type":"string","example":"Opened a small USDC position as a connectivity test"},"details":{"type":"object","description":"Extra event context passed to the feed writer (prices, reasoning, PnL, etc.).","example":{"entryPrice":0.9995,"size":"5.0025","reasoning":"Production webhook tiny-value buy test"}}},"required":["eventType","tokenSymbol","summary"]},"AgentPersonaDraftDto":{"type":"object","properties":{"settings":{"$ref":"#/components/schemas/PersonaSettingsBodyDto"},"persona":{"type":"string"},"voice":{"type":"string"},"examples":{"type":"string"},"bannedWords":{"type":"string"},"style":{"type":"string","description":"Preview a base voice as is (FRIENDLY, CYNICAL, etc.). Used only when `settings` is omitted.","example":"FRIENDLY"},"scenarios":{"description":"Optional mock scenarios. When omitted, five sample events are used: idea, open, update, close, review. Nothing is saved to the activity feed.","type":"array","items":{"$ref":"#/components/schemas/FeedPreviewScenarioDto"}}}},"AgentPersonaBodyDto":{"type":"object","properties":{"persona":{"type":"string","description":"Free text — character, background, beliefs. Required when `settings` is omitted.","example":"Conservative swing trader focused on risk-adjusted entries."},"settings":{"description":"settings-1 document. Save applies to future posts immediately. Existing posts stay as they were.","allOf":[{"$ref":"#/components/schemas/PersonaSettingsBodyDto"}]},"voice":{"type":"string","description":"Free text — how the agent speaks in feed posts.","example":"Short sentences. No hype. Always mention risk."},"examples":{"type":"string","description":"Free text — example posts. Required when `settings` is omitted.","example":"Opened SOL long after the retest held.\nClosed ETH into resistance."},"bannedWords":{"type":"string","description":"Free text — banned words or phrases, split on commas or newlines. Added to the platform list.","example":"moon, guaranteed, 100x"}}},"TelegramVerifyChannelResponseDto":{"type":"object","properties":{"verificationResult":{"type":"string","enum":["verified","bot-not-found","insufficient-permissions","invalid_channel"]},"channelId":{"type":"string","description":"Telegram chat id as string after resolution."},"channelName":{"type":"string","description":"Resolved channel title from Telegram."},"channelIconUrl":{"type":"string","description":"Channel profile image URL (EchoZero CDN)."},"memberCount":{"type":"number","description":"Telegram chat member count at verify time."},"message":{"type":"string","description":"Human-readable detail for errors or skipped checks."}},"required":["verificationResult"]},"TelegramVerifyChannelBodyDto":{"type":"object","properties":{"channel":{"type":"string","description":"Telegram public channel @username, t.me/slug, https://t.me/slug, or numeric chat id (-100…).","example":"@MySignalsChannel","minLength":1,"maxLength":256}},"required":["channel"]},"DiscordOAuthUrlResponseDto":{"type":"object","properties":{"inviteUrl":{"type":"string","description":"Discord bot install URL including signed `state`."},"state":{"type":"string","description":"Opaque state echoed on OAuth callback (also embedded in `inviteUrl`)."}},"required":["inviteUrl","state"]},"DiscordVerifyChannelResponseDto":{"type":"object","properties":{"verificationResult":{"type":"string","enum":["verified","bot-not-found","insufficient-permissions","invalid_channel"]},"channelId":{"type":"string","description":"Discord channel snowflake."},"guildId":{"type":"string","description":"Discord guild snowflake."},"channelName":{"type":"string","description":"Resolved channel name from Discord."},"guildName":{"type":"string","description":"Resolved guild name when available."},"channelIconUrl":{"type":"string","description":"Discord server icon URL (CDN)."},"memberCount":{"type":"number","description":"Discord guild member count at verify time."},"message":{"type":"string","description":"Human-readable detail for errors or skipped checks."}},"required":["verificationResult"]},"DiscordVerifyChannelBodyDto":{"type":"object","properties":{"channelId":{"type":"string","description":"Discord text channel snowflake.","example":"1234567890123456789"},"guildId":{"type":"string","description":"Discord server (guild) snowflake.","example":"9876543210987654321"},"channel":{"type":"string","description":"Channel URL (`discord.com/channels/guild/channel`), `guildId/channelId`, or channel snowflake.","example":"https://discord.com/channels/9876543210987654321/1234567890123456789"}}},"SetAgentSubscriptionPriceResponseDto":{"type":"object","properties":{"agentId":{"type":"string"},"monthlyPriceUsd":{"type":"number"},"stripeProductId":{"type":"string"},"stripePriceId":{"type":"string"},"effectiveDate":{"type":"string","description":"Only present on a free→paid FIRST switch with existing subscribers (EZ-1183): the date (YYYY-MM-DD) the paid gate takes effect for them. Computed automatically from AGENT_FREE_TO_PAID_NOTICE_DAYS — not creator-chosen."},"scheduledPriceChangeId":{"type":"string","description":"Id of the ScheduledAgentPriceChange row, when one was created."}},"required":["agentId","monthlyPriceUsd"]},"SetAgentSubscriptionPriceBodyDto":{"type":"object","properties":{"monthlyPriceUsd":{"type":"number","description":"Monthly subscription price in USD (0 = free tier)","example":29.99}},"required":["monthlyPriceUsd"]},"McpAgentPinDataDto":{"type":"object","properties":{"pinnedAgentIds":{"type":"array","items":{"type":"string"}},"message":{"type":"string"}},"required":["pinnedAgentIds"]},"McpAgentDeleteDataDto":{"type":"object","properties":{"message":{"type":"string"},"affectedBotCount":{"type":"number"},"activeTradesClosed":{"type":"number"}}},"McpAiChatBodyDto":{"type":"object","properties":{"message":{"type":"string","description":"User message","maxLength":5000},"conversationId":{"type":"string","description":"Existing conversation id"},"agentId":{"type":"string","description":"Target internal agent id"}},"required":["message"]},"McpAgentScopedChatBodyDto":{"type":"object","properties":{"message":{"type":"string"},"conversationId":{"type":"string"}},"required":["message"]},"McpAgentChatHistoryQueryDto":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id filter"},"limit":{"type":"number","minimum":1,"default":50},"offset":{"type":"number","minimum":0,"default":0}}},"McpGetTradeQuoteQueryDto":{"type":"object","properties":{"action":{"type":"string","enum":["BUY","SELL"]},"tokenAddress":{"type":"string","description":"Target token mint address"},"amountUsd":{"type":"number","minimum":0.01,"description":"Amount in USD"},"baseTokenAddress":{"type":"string","description":"Base token mint (optional)"},"agentId":{"type":"string","description":"Agent id for context"}},"required":["action","tokenAddress","amountUsd"]},"McpListAgentChatHistoriesQueryDto":{"type":"object","properties":{"agentId":{"type":"string"},"conversationId":{"type":"string"},"types":{"type":"string","description":"Comma-separated `AiConversationType` values (e.g. `AGENT,VIBE_TRADE`)","example":"AGENT,VIBE_TRADE"},"search":{"type":"string","maxLength":200},"timePeriods":{"type":"string","description":"Comma-separated `ChatHistoryTimePeriod` values (e.g. `TODAY,THIS_WEEK`)","example":"THIS_WEEK"},"limit":{"type":"number","minimum":1,"maximum":100,"default":20},"offset":{"type":"number","minimum":0,"default":0},"order":{"type":"string","enum":["ASC","DESC"]}}},"ExecuteAgentActionInput":{"type":"object","properties":{}},"ConfirmAgentTradeInput":{"type":"object","properties":{}},"DeclineAgentTradeInput":{"type":"object","properties":{}},"McpRefreshTradeQuoteBodyDto":{"type":"object","properties":{"confirmationId":{"type":"string","description":"Trade confirmation id to refresh"}},"required":["confirmationId"]},"McpBotStrategyPromptBodyDto":{"type":"object","properties":{"prompt":{"type":"string","maxLength":2000},"chains":{"type":"array","items":{"type":"string","enum":["SOLANA","CHILIZ","FLOW","ARBITRUM","BASE","HYPERLIQUID"]}},"riskLevel":{"type":"string","enum":["LOW RISK","MID RISK","HIGH RISK"]},"tags":{"type":"array","items":{"type":"string"}},"baseBotId":{"type":"string"},"currentConfigJson":{"type":"string","description":"Existing JSON configuration to refine"}},"required":["prompt"]},"McpAiChatMessageDataDto":{"type":"object","properties":{"role":{"type":"string"},"content":{"type":"string"},"step":{"type":"string"}},"required":["role","content"]},"McpAiChatSuggestionDataDto":{"type":"object","properties":{"label":{"type":"string"},"message":{"type":"string"}},"required":["label","message"]},"McpAiChatResponseDataDto":{"type":"object","properties":{"conversationId":{"type":"string"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/McpAiChatMessageDataDto"}},"escalated":{"type":"boolean"},"withHumanAgent":{"type":"boolean"},"suggestions":{"type":"array","items":{"$ref":"#/components/schemas/McpAiChatSuggestionDataDto"}}},"required":["conversationId","messages"]},"McpAiConversationDataDto":{"type":"object","properties":{"id":{"type":"string"},"agentId":{"type":"string"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/McpAiChatMessageDataDto"}}},"required":["id","messages"]},"McpAgentWithChatDataDto":{"type":"object","properties":{"agentId":{"type":"string"}},"required":["agentId"]},"McpAgentChatHistoryItemDataDto":{"type":"object","properties":{"conversationId":{"type":"string"},"type":{"type":"string"},"agentId":{"type":"string"},"agentName":{"type":"string"},"agentImageUrl":{"type":"string"},"lastQuestion":{"type":"string"},"lastAnswer":{"type":"string"},"lastMessageAt":{"format":"date-time","type":"string"},"messageCount":{"type":"number"}},"required":["conversationId","type","agentId","agentName","messageCount"]},"McpAgentChatHistoryListDataDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpAgentChatHistoryItemDataDto"}},"totalCount":{"type":"number"},"hasMore":{"type":"boolean"}},"required":["items","totalCount","hasMore"]},"McpTradeQuoteTokenInfoDataDto":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":"string"},"name":{"type":"string"},"logoUri":{"type":"string"},"decimals":{"type":"number"},"priceUsd":{"type":"number"},"priceChange24h":{"type":"number"}},"required":["address","symbol","decimals"]},"McpTradeQuoteDataDto":{"type":"object","properties":{"quoteId":{"type":"string"},"inputToken":{"$ref":"#/components/schemas/McpTradeQuoteTokenInfoDataDto"},"outputToken":{"$ref":"#/components/schemas/McpTradeQuoteTokenInfoDataDto"},"inputAmount":{"type":"string"},"outputAmount":{"type":"string"},"inputAmountUsd":{"type":"number"},"outputAmountUsd":{"type":"number"},"priceImpactPct":{"type":"number"},"totalFeesUsd":{"type":"number","description":"Total estimated fees in USD (swap + estimated platform / success fees)"},"swapFeesUsd":{"type":"number","description":"Jupiter / venue swap fee portion in USD"},"estimatedPlatformFeesUsd":{"type":"number","description":"Estimated EchoZero platform fees in USD (entry escrow / HWM or v4 settlement)"},"feeModel":{"type":"string","description":"Fee model stamp used for the platform fee estimate"},"feeDisclosure":{"type":"string","description":"Human-readable fee disclosure"},"exchangeRate":{"type":"number"},"slippageBps":{"type":"number"},"expiresAt":{"format":"date-time","type":"string"}},"required":["quoteId","inputToken","outputToken","inputAmount","outputAmount","inputAmountUsd","outputAmountUsd","priceImpactPct","totalFeesUsd","exchangeRate","slippageBps","expiresAt"]},"McpTradeConfirmationDataDto":{"type":"object","properties":{"confirmationId":{"type":"string"},"action":{"type":"string","enum":["BUY","SELL"]},"title":{"type":"string"},"description":{"type":"string"},"quote":{"$ref":"#/components/schemas/McpTradeQuoteDataDto"},"warning":{"type":"string"},"agentAnalysis":{"type":"string"},"status":{"type":"string","enum":["PENDING_CONFIRMATION","CONFIRMED","DECLINED","EXPIRED","EXECUTED","FAILED"]},"createdAt":{"format":"date-time","type":"string"},"confirmedAt":{"format":"date-time","type":"string"},"transactionHash":{"type":"string"},"isVirtual":{"type":"boolean"},"botId":{"type":"string"}},"required":["confirmationId","action","title","description","quote","status","createdAt","isVirtual"]},"McpTradeExecutionResultDataDto":{"type":"object","properties":{"success":{"type":"boolean"},"transactionHash":{"type":"string"},"actualOutputAmount":{"type":"string"},"errorMessage":{"type":"string"},"status":{"type":"string","enum":["PENDING_CONFIRMATION","CONFIRMED","DECLINED","EXPIRED","EXECUTED","FAILED"]}},"required":["success","status"]},"McpSupportChatDataDto":{"type":"object","properties":{"conversationId":{"type":"string"},"ticketNumber":{"type":"number"},"status":{"type":"string"},"supportTopic":{"type":"string"},"lastMessage":{"type":"string"},"messageCount":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"hasUnread":{"type":"boolean"}},"required":["conversationId","status","messageCount","createdAt","updatedAt","hasUnread"]},"McpSupportChatListDataDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpSupportChatDataDto"}},"totalCount":{"type":"number"},"hasMore":{"type":"boolean"},"averageFirstResponseSeconds":{"type":"number"}},"required":["items","totalCount","hasMore"]},"McpSupportChatMessageDataDto":{"type":"object","properties":{"role":{"type":"string"},"content":{"type":"string"},"createdAt":{"format":"date-time","type":"string"}},"required":["role","content"]},"McpSupportChatDetailDataDto":{"type":"object","properties":{"conversationId":{"type":"string"},"ticketNumber":{"type":"number"},"status":{"type":"string"},"supportTopic":{"type":"string"},"lastMessage":{"type":"string"},"messageCount":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"hasUnread":{"type":"boolean"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/McpSupportChatMessageDataDto"}},"resolutionPendingUserConfirm":{"type":"boolean"}},"required":["conversationId","status","messageCount","createdAt","updatedAt","hasUnread","messages","resolutionPendingUserConfirm"]},"McpBotStrategySummaryDataDto":{"type":"object","properties":{"title":{"type":"string"},"summary":{"type":"string"},"riskLevel":{"type":"string","enum":["LOW RISK","MID RISK","HIGH RISK"]},"tags":{"type":"array","items":{"type":"string"}}},"required":["title","summary"]},"McpBotStrategySuggestionDataDto":{"type":"object","properties":{"summary":{"$ref":"#/components/schemas/McpBotStrategySummaryDataDto"},"draftConfig":{"type":"object","description":"Draft trading bot configuration (same conceptual shape as `CreateTradingBotInput`)","additionalProperties":true}},"required":["summary","draftConfig"]},"McpWalletChartQueryDto":{"type":"object","properties":{"duration":{"type":"string","enum":["ONE_YEAR","ONE_MONTH","ONE_WEEK","ONE_DAY"],"description":"Chart window (defaults to ~7 days behavior when omitted, per GraphQL)."}}},"McpWalletSearchTradesQueryDto":{"type":"object","properties":{"query":{"type":"string","description":"Search by token name or bot name"},"limit":{"type":"number","default":20},"offset":{"type":"number","default":0},"isActive":{"type":"boolean","description":"Filter to active trades only (omit for all)"}},"required":["query"]},"McpWalletToggleModeBodyDto":{"type":"object","properties":{"isVirtualMode":{"type":"boolean","description":"true = virtual trading mode, false = real wallet mode (omit to use server default toggle behavior)"}}},"McpWalletOperationBodyDto":{"type":"object","properties":{"amount":{"type":"number","description":"Amount for the operation"},"tokenMint":{"type":"string","description":"Token mint address (optional; defaults to USDC / PRIMARY_SPEND_MINT=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v)"},"toAddress":{"type":"string","description":"Destination address (required for withdraw)"}},"required":["amount"]},"McpTradeStopLossBodyDto":{"type":"object","properties":{"type":{"type":"string","description":"Stop-loss type: FIXED, TRAILING, PERCENTAGE, or NONE"},"percentage":{"type":"number","description":"Percentage drawdown from entry (e.g. 10 for 10% below)"},"triggerPrice":{"type":"number","description":"Absolute token USD price at which the stop triggers (optional if percentage is used)"},"trailDistance":{"type":"number","description":"Trail distance percentage for TRAILING stop"}},"required":["type"]},"McpTradeTakeProfitBodyDto":{"type":"object","properties":{"type":{"type":"string","description":"Take-profit type: FIXED, TIERED, NONE, or MANUAL"},"fixedTargetUsd":{"type":"number","description":"Close when position value in USD reaches this target"},"targetPercentage":{"type":"number","description":"Target profit percentage above average entry (e.g. 25)"},"triggerPrice":{"type":"number","description":"Optional explicit token USD trigger price (frontend may compute from %)"}},"required":["type"]},"McpWalletBuySellBodyDto":{"type":"object","properties":{"amount":{"type":"number","description":"Amount for the operation"},"tokenMint":{"type":"string","description":"Token mint address (optional; defaults to USDC / PRIMARY_SPEND_MINT=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v)"},"toAddress":{"type":"string","description":"Destination address (required for withdraw)"},"stopLoss":{"description":"Optional stop-loss on the open BUY affected by this operation","allOf":[{"$ref":"#/components/schemas/McpTradeStopLossBodyDto"}]},"takeProfit":{"description":"Optional take-profit on the open BUY for this mint","allOf":[{"$ref":"#/components/schemas/McpTradeTakeProfitBodyDto"}]}},"required":["amount"]},"McpWalletAddVirtualFundsBodyDto":{"type":"object","properties":{"amountInUsdc":{"type":"number","description":"Amount in USDC to add to the virtual wallet (primary). Required unless amountInSol is set."},"amountInSol":{"type":"number","description":"Deprecated: amount in SOL; converted to USDC via live SOL/USD when amountInUsdc is omitted. Required unless amountInUsdc is set."}}},"McpWalletModeStatusDataDto":{"type":"object","properties":{"isVirtualMode":{"type":"boolean"},"modeName":{"type":"string"}},"required":["isVirtualMode","modeName"]},"McpWalletModeToggleDataDto":{"type":"object","properties":{"isVirtualMode":{"type":"boolean"},"message":{"type":"string"}},"required":["isVirtualMode","message"]},"McpWalletHistoricalChartDataDto":{"type":"object","properties":{"prices":{"type":"array","description":"Price series [timestamp, price][]","items":{"type":"array","items":{"type":"number"}}},"marketCaps":{"type":"array","items":{"type":"array","items":{"type":"number"}}},"totalVolumes":{"type":"array","items":{"type":"array","items":{"type":"number"}}}},"required":["prices","marketCaps","totalVolumes"]},"McpWalletTradeSearchItemDto":{"type":"object","properties":{"id":{"type":"string"},"tokenName":{"type":"string"},"tokenSymbol":{"type":"string"},"tokenImage":{"type":"string"},"botName":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"positionValueUsd":{"type":"number"},"tokenAmount":{"type":"number"},"entryPrice":{"type":"number"},"currentPrice":{"type":"number"},"exitPrice":{"type":"number"},"pnlUsd":{"type":"number"},"pnlPercentage":{"type":"number"},"isProfitable":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"closedAt":{"format":"date-time","type":"string"},"durationSeconds":{"type":"number"},"durationText":{"type":"string"},"isVirtual":{"type":"boolean"},"tradingPair":{"type":"string"},"detailsUrl":{"type":"string"}},"required":["id","tokenName","tokenSymbol","tokenImage","status","type","positionValueUsd","tokenAmount","entryPrice","pnlUsd","pnlPercentage","isProfitable","createdAt","durationSeconds","durationText","isVirtual","tradingPair","detailsUrl"]},"McpWalletTradeSearchDataDto":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/McpWalletTradeSearchItemDto"}},"totalCount":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"},"query":{"type":"string"},"hasResults":{"type":"boolean"},"noResultsMessage":{"type":"string"}},"required":["results","totalCount","limit","offset","query","hasResults"]},"McpWalletOperationDataDto":{"type":"object","properties":{"success":{"type":"boolean"},"transactionId":{"type":"string"},"amount":{"type":"number"},"tokenSymbol":{"type":"string"},"message":{"type":"string"},"timestamp":{"format":"date-time","type":"string"},"tradeId":{"type":"string","description":"Trade document id when already known (linked open BUY). Fresh manual buy/sell ids are created after on-chain finality."},"openTradeUpdatePending":{"type":"boolean","description":"True when the Trade row (fresh buy/sell or linked open-trade update) is written only after on-chain swap finality"}},"required":["success","transactionId","amount","tokenSymbol","message","timestamp"]},"McpWalletAddVirtualFundsDataDto":{"type":"object","properties":{"success":{"type":"boolean"},"transactionId":{"type":"string"}},"required":["success","transactionId"]},"McpNotificationsQueryDto":{"type":"object","properties":{"limit":{"type":"number","default":20,"description":"Page size (max 100)"},"offset":{"type":"number","default":0},"order":{"type":"string","enum":["ASC","DESC"],"default":"DESC"},"orderBy":{"type":"string","enum":["_id","sendsAt","markAsRead","urgency"],"default":"_id","description":"Sort field. `urgency` ranks Needs you (ALERT first) then newest `_id`. `order` is ignored for `urgency`."},"query":{"type":"string","description":"Search in title and body (same as GraphQL filter.query)"},"types":{"type":"string","description":"Comma-separated `NotificationType` values (e.g. `TRADE_EXECUTION,WALLET_TRANSACTION`)"},"unreadOnly":{"type":"boolean","description":"true = unread only, false = read only, omit = all"},"needsYou":{"type":"boolean","description":"true = Needs you only (open actions). Read state is ignored. A failed payment stays until billing is no longer past due."}}},"McpNotificationIdsBodyDto":{"type":"object","properties":{"ids":{"description":"MongoDB notification document ids","example":["507f1f77bcf86cd799439011"],"type":"array","items":{"type":"string"}}},"required":["ids"]},"McpNotificationPermissionSettingBodyDto":{"type":"object","properties":{"newsAndOffers":{"type":"boolean","description":"News, features, community updates, leaderboards (canonical)"},"tipsAndHelp":{"type":"boolean","description":"Getting started, check-ins, usage suggestions (canonical)"},"tradeExecution":{"type":"boolean","description":"Trade executions by agents (canonical)"},"agentUpdates":{"type":"boolean","description":"Drawdowns, milestones, weekly recaps (canonical)"},"botAlerts":{"type":"boolean","description":"Legacy alias of agentUpdates. Used only when agentUpdates is omitted."}}},"McpUpdateNotificationSettingsBodyDto":{"type":"object","properties":{"appPermission":{"description":"App push notification toggles","allOf":[{"$ref":"#/components/schemas/McpNotificationPermissionSettingBodyDto"}]},"emailPermission":{"description":"Email notification toggles","allOf":[{"$ref":"#/components/schemas/McpNotificationPermissionSettingBodyDto"}]},"bundleTradeDailySummary":{"type":"boolean","description":"Bundle trade pushes into one evening summary. Inbox rows still save."},"bundleTradeEmailDailySummary":{"type":"boolean","description":"Bundle trade emails into one evening summary email."}}},"McpNotificationItemDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"sendsAt":{"format":"date-time","type":"string"},"markAsRead":{"type":"boolean"},"actionDismissed":{"type":"boolean","description":"Set when the user dismisses a security warning from Needs you."},"notificationTokens":{"type":"array","items":{"type":"string"}},"wsProcessedAt":{"format":"date-time","type":"string"},"fbProcessedAt":{"format":"date-time","type":"string"},"webPushLink":{"type":"string"},"androidActionClick":{"type":"string"},"iosCategory":{"type":"string"},"imageUrl":{"type":"string"},"user":{"type":"string"},"template":{"type":"string"},"event":{"type":"string"},"type":{"type":"string","enum":["CLAIM_REWARDS","WALLET_TRANSACTION","TRADE_EXECUTION","TRADE_CLOSED","TRADE_EXECUTION_FAILED","TRADE_SKIPPED_BELOW_MINIMUM","TRADE_DAILY_SUMMARY","ALERT","NEWS_OFFERS_PROMOTIONS","AGENT_WENT_PRIVATE","AGENT_PAUSED","AGENT_RESUMED","AGENT_DELETED","AGENT_REVIEW_APPROVED","AGENT_REVIEW_REJECTED","AGENT_OWNER_STAKE_LOW","AGENT_OWNER_STAKE_HIDDEN","AGENT_OWNER_STAKE_RELISTED","SIGNAL_GROUP_MEMBERSHIP_LOST","FEE_SETTLEMENT_RECEIPT","SIGNAL_GROUP_MEMBERSHIP_NUDGE","SIGNAL_GROUP_SHADOW_LIVE","SIGNAL_GROUP_SHADOW_NEEDS_REVIEW","SIGNAL_PARSE_FAILED","AGENT_LOW_BALANCE_TOP_UP","AGENT_LOW_BALANCE_WAITING","SUBSCRIPTION_CANCELLED","AGENT_SUBSCRIPTION_PRICE_SCHEDULED","PAYMENT_RECOVERED","PAYMENT_RECEIPT","SUBSCRIPTION_RENEWING","CARD_EXPIRING","CARD_EXPIRED","REFUND_ISSUED","PAYMENT_DISPUTED","CREATOR_FEE_CHANGED","EXTERNAL_WALLET_ACTIVITY_PAUSED","ACTIVATION_FAILED","UPDATE_ARTICLE","RAKEBACK_CREDITED","REFERRAL_COMMISSION_CREDITED","XP_TIER_UPGRADED","REFERRAL_SUCCESS","REFERRAL_CODE_REDEEMED","REWARD_CLAIM_CONFIRMED","LEADERBOARD_RANK","RETENTION_XP_AWARDED","DEV_REFERRAL_RECRUIT_QUALIFIED","DEV_REFERRAL_QUALIFIED_BONUS","NEW_DEVICE_LOGIN","PASSWORD_RESET_REQUIRED","EMAIL_CHANGED","GEO_STATUS_CHANGED","MFA_CHANGED","ACCOUNT_SUSPENDED","FOLLOWED_AGENT_TRADE_OPENED","FOLLOWED_AGENT_TRADE_CLOSED","AGENT_PLACE_OPENED","AGENT_PLACE_LOST"]},"walletKind":{"type":"string","enum":["DEPOSIT","WITHDRAWAL","WITHDRAWAL_FAILED"],"description":"Deposit, withdrawal, or failed withdrawal. Set only on WALLET_TRANSACTION."},"customNotification":{"type":"string"},"isClicked":{"type":"boolean"},"fbTitle":{"type":"string"},"fbBody":{"type":"string"}},"required":["id","title","body","sendsAt","markAsRead","notificationTokens","user"]},"McpNotificationsListDataDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/McpNotificationItemDto"}},"pagination":{"$ref":"#/components/schemas/PaginationMetaDto"},"totalUnreadCount":{"type":"number","description":"Unread count across all notifications (not only this page)"}},"required":["items","pagination","totalUnreadCount"]},"McpNotificationCountByTypeRowDto":{"type":"object","properties":{"type":{"type":"string","enum":["CLAIM_REWARDS","WALLET_TRANSACTION","TRADE_EXECUTION","TRADE_CLOSED","TRADE_EXECUTION_FAILED","TRADE_SKIPPED_BELOW_MINIMUM","TRADE_DAILY_SUMMARY","ALERT","NEWS_OFFERS_PROMOTIONS","AGENT_WENT_PRIVATE","AGENT_PAUSED","AGENT_RESUMED","AGENT_DELETED","AGENT_REVIEW_APPROVED","AGENT_REVIEW_REJECTED","AGENT_OWNER_STAKE_LOW","AGENT_OWNER_STAKE_HIDDEN","AGENT_OWNER_STAKE_RELISTED","SIGNAL_GROUP_MEMBERSHIP_LOST","FEE_SETTLEMENT_RECEIPT","SIGNAL_GROUP_MEMBERSHIP_NUDGE","SIGNAL_GROUP_SHADOW_LIVE","SIGNAL_GROUP_SHADOW_NEEDS_REVIEW","SIGNAL_PARSE_FAILED","AGENT_LOW_BALANCE_TOP_UP","AGENT_LOW_BALANCE_WAITING","SUBSCRIPTION_CANCELLED","AGENT_SUBSCRIPTION_PRICE_SCHEDULED","PAYMENT_RECOVERED","PAYMENT_RECEIPT","SUBSCRIPTION_RENEWING","CARD_EXPIRING","CARD_EXPIRED","REFUND_ISSUED","PAYMENT_DISPUTED","CREATOR_FEE_CHANGED","EXTERNAL_WALLET_ACTIVITY_PAUSED","ACTIVATION_FAILED","UPDATE_ARTICLE","RAKEBACK_CREDITED","REFERRAL_COMMISSION_CREDITED","XP_TIER_UPGRADED","REFERRAL_SUCCESS","REFERRAL_CODE_REDEEMED","REWARD_CLAIM_CONFIRMED","LEADERBOARD_RANK","RETENTION_XP_AWARDED","DEV_REFERRAL_RECRUIT_QUALIFIED","DEV_REFERRAL_QUALIFIED_BONUS","NEW_DEVICE_LOGIN","PASSWORD_RESET_REQUIRED","EMAIL_CHANGED","GEO_STATUS_CHANGED","MFA_CHANGED","ACCOUNT_SUSPENDED","FOLLOWED_AGENT_TRADE_OPENED","FOLLOWED_AGENT_TRADE_CLOSED","AGENT_PLACE_OPENED","AGENT_PLACE_LOST"]},"totalCount":{"type":"number"},"unreadCount":{"type":"number"}},"required":["type","totalCount","unreadCount"]},"McpNotificationCountsDataDto":{"type":"object","properties":{"countsByType":{"type":"array","items":{"$ref":"#/components/schemas/McpNotificationCountByTypeRowDto"}},"totalCount":{"type":"number"},"totalUnreadCount":{"type":"number"}},"required":["countsByType","totalCount","totalUnreadCount"]},"OAuthAuthorizeQueryDto":{"type":"object","properties":{"response_type":{"type":"string","example":"code"},"client_id":{"type":"string","example":"echozero-cli"},"redirect_uri":{"type":"string","example":"http://127.0.0.1:8765/callback"},"scope":{"type":"string","example":"read:agents read:strategies write:agents","description":"Space-delimited OAuth scopes mapped to MCP API scopes."},"state":{"type":"string"},"code_challenge":{"type":"string"},"code_challenge_method":{"type":"string","example":"S256"},"access_token":{"type":"string","description":"User JWT access token for browserless/local flows. Prefer Authorization: Bearer in API clients."}},"required":["response_type","client_id","redirect_uri","scope","state","code_challenge","code_challenge_method"]},"OAuthTokenBodyDto":{"type":"object","properties":{"grant_type":{"type":"string","example":"authorization_code"},"code":{"type":"string"},"redirect_uri":{"type":"string","example":"http://127.0.0.1:8765/callback"},"client_id":{"type":"string","example":"echozero-cli"},"code_verifier":{"type":"string"}},"required":["grant_type","code","redirect_uri","client_id","code_verifier"]},"OAuthIntrospectBodyDto":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]},"StatusResponseDto":{"type":"object","properties":{"authenticated":{"type":"boolean","example":true},"authMethod":{"type":"string","enum":["oauth","apiKey","jwt"]},"userId":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"clientId":{"type":"string","nullable":true,"description":"OAuth client the token was issued to; null for API keys and JWTs."},"expiresAt":{"type":"string","nullable":true,"description":"ISO expiry; null when the credential does not expire."},"isDeveloper":{"type":"boolean","description":"True when the user has an active developer registration. Webhook agents need it to receive signals."},"developerStatus":{"type":"string","enum":["pending","active","suspended"],"nullable":true}},"required":["authenticated","authMethod","userId","scopes","clientId","expiresAt","isDeveloper","developerStatus"]},"McpCheckUsernameBodyDto":{"type":"object","properties":{"username":{"type":"string","example":"trader_jane"}},"required":["username"]},"McpCheckEmailBodyDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com"}},"required":["email"]},"McpEarnLeaderboardQueryDto":{"type":"object","properties":{"startDate":{"type":"string"},"endDate":{"type":"string"}}},"McpActivitiesQueryDto":{"type":"object","properties":{"limit":{"type":"number","default":20},"offset":{"type":"number","default":0},"order":{"type":"string","enum":["ASC","DESC"],"default":"DESC"},"sortBy":{"type":"string","enum":["TIMESTAMP","AMOUNT","FEE","SLOT","CREATED_AT","UPDATED_AT","STATUS","TYPE","CHAIN","PROFIT_AMOUNT","PROFIT_PERCENTAGE","POSITION_VALUE","FIRST_OPENED","FIRST_CLOSED","RUNTIME","PNL","PNL_PERCENTAGE","TRADE_STATE","TIME","TOKEN_SYMBOL","TOKEN_NAME","BOT_NAME","SIGNATURE","WALLET_ADDRESS","IS_BOT_TRADE","IS_VIRTUAL","TRADING_BOT_ID","TRADE_ID","TOKEN_MINT"],"default":"TIMESTAMP"},"filterJson":{"type":"string","description":"JSON string of GraphQL TradeFilterInput"}}},"McpActivitySearchQueryDto":{"type":"object","properties":{"limit":{"type":"number","default":20},"offset":{"type":"number","default":0},"order":{"type":"string","enum":["ASC","DESC"],"default":"DESC"},"search":{"type":"string"}}},"McpActivityFeedQueryDto":{"type":"object","properties":{"limit":{"type":"number","default":20},"offset":{"type":"number","default":0},"order":{"type":"string","enum":["ASC","DESC"],"default":"DESC"},"filter":{"type":"string","description":"Comma-separated ActivityFeedFilter: PERSONAL,SUBSCRIBED,RECOMMENDED. Omit, or pass SUBSCRIBED,RECOMMENDED together, for all activities including owned."},"types":{"type":"string","description":"Comma-separated ActivityFeedType values"},"agentId":{"type":"string"}}},"McpGenerateUploadUrlsBodyDto":{"type":"object","properties":{"mimeTypes":{"example":["image/png"],"description":"MIME types to request signed URLs for","type":"array","items":{"type":"string"}},"type":{"type":"string","enum":["AVATAR","DEVELOPER_AGENT_IMAGE","BOT_IMAGE","FEEDBACK_IMAGE","SHARE_ON_X_IMAGE","SHARE_ON_DISCORD_IMAGE"]}},"required":["mimeTypes","type"]},"McpGeneratedUploadUrlItemDto":{"type":"object","properties":{"uploadUrl":{"type":"string"},"filename":{"type":"string"},"publicUrl":{"type":"string","description":"Stable URL to reference the object after PUT completes (public upload types only)"}},"required":["uploadUrl","filename"]},"SandboxTradeSimulationRequestDto":{"type":"object","properties":{"pair":{"type":"string","description":"Trading pair to simulate","example":"SOL/USDC"},"amount":{"type":"number","description":"Notional amount in quote currency (typically USD/USDC)","example":100},"action":{"type":"string","enum":["BUY","SELL"],"description":"Optional trade side. Defaults to BUY."}},"required":["pair","amount"]},"SandboxSignalSimulationRequestDto":{"type":"object","properties":{"message":{"type":"string","description":"Raw signal message to parse and simulate","example":"Buy SOL at $145, TP $160, SL $138"}},"required":["message"]},"SandboxTradeSimulationResponseDto":{"type":"object","properties":{"orderId":{"type":"string"},"agentId":{"type":"string"},"agent":{"type":"string"},"pair":{"type":"string"},"side":{"type":"string","enum":["BUY","SELL"]},"amount":{"type":"number"},"price":{"type":"number"},"estimatedUnits":{"type":"number"},"status":{"type":"string","example":"SIMULATED"},"message":{"type":"string"},"simulatedAt":{"format":"date-time","type":"string"}},"required":["orderId","agentId","agent","pair","side","amount","price","estimatedUnits","status","message","simulatedAt"]},"SandboxTakeProfitLevelDto":{"type":"object","properties":{"index":{"type":"number"},"price":{"type":"string","description":"Formatted price string"},"allocationPercent":{"type":"number","description":"Sell allocation % when present"}},"required":["index","price"]},"SandboxParsedSignalResponseDto":{"type":"object","properties":{"matched":{"type":"boolean"},"action":{"type":"string"},"intent":{"type":"string"},"token":{"type":"string"},"tokenUnresolved":{"type":"boolean","description":"True when ticker could not be resolved"},"entryPrice":{"type":"string"},"takeProfit":{"type":"string"},"stopLoss":{"type":"string"},"takeProfitLevels":{"type":"array","items":{"$ref":"#/components/schemas/SandboxTakeProfitLevelDto"}},"leverage":{"type":"number","description":"Parsed leverage 1–100 when present"},"partialPercent":{"type":"number"},"ruleMatched":{"type":"string"},"tradeTriggered":{"type":"string"},"confidence":{"type":"number"}},"required":["matched","action"]},"SandboxSignalSimulationResponseDto":{"type":"object","properties":{"id":{"type":"string"},"agentId":{"type":"string"},"agentName":{"type":"string"},"message":{"type":"string"},"status":{"type":"string","example":"simulated"},"parsed":{"$ref":"#/components/schemas/SandboxParsedSignalResponseDto"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","agentId","agentName","message","status","parsed","createdAt"]},"SandboxSignalHistoryItemResponseDto":{"type":"object","properties":{"id":{"type":"string"},"agentId":{"type":"string"},"agentName":{"type":"string"},"message":{"type":"string"},"status":{"type":"string","example":"simulated"},"parsed":{"$ref":"#/components/schemas/SandboxParsedSignalResponseDto"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","agentId","agentName","message","status","parsed","createdAt"]}}}}